diff --git a/.gitignore b/.gitignore index a194283..7b569bf 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,28 @@ npm-debug.log* yarn-debug.log* yarn-error.log* .yarn/install-state.gz +/core +.cursor/plans +refs +.gitignore +hooks +HEAD +.gitignore +objects +config +.zshrc +.zprofile +.ripgreprc +.profile +.mcp.json +.gitignore +.idea +.gitmodules +.gitconfig +.bashrc +.bash_profile +.claude/agents +.claude/commands +.claude/settings.json +.claude/skills +tmp/ diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..9bb9968 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,69 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## What this repo is + +Docusaurus v3 documentation site for the [Digital Alchemy](https://docs.digital-alchemy.app) TypeScript framework — a batteries-included, low-dependency Node.js framework for type-safe Home Assistant automation and general-purpose apps. The docs cover three main areas: **Core** (framework internals), **Home Automation** (hass + synapse integrations), and **Support Libraries** (mqtt, etc.). + +## Commands + +```bash +yarn start # local dev server with hot reload +yarn build # production build to build/ +yarn typecheck # tsc type-check (tsconfig.json) +yarn clear # clear Docusaurus cache +yarn serve # serve the built site locally +``` + +No test suite — `yarn typecheck` is the main code quality check. + +**Important:** `onBrokenLinks: "throw"` in `docusaurus.config.ts` means broken internal links will fail the build. Verify all cross-doc links when moving or renaming files. + +## Docs structure + +``` +docs/ + core/ # @digital-alchemy/core framework + home-automation/ # hass/, synapse/, testing/ + support/ # mqtt/, etc. + testing/ # general testing docs +``` + +Sidebars are **fully auto-generated** from the filesystem (`autogenerated: true` in `sidebars.ts`). Page order and nesting come from directory structure and frontmatter `sidebar_position`. + +## MDX and components + +Docs are `.md` or `.mdx`. Use `.mdx` when a page needs React components (e.g. `EmbeddedEditor`). + +### EmbeddedEditor + +An interactive Monaco editor with TypeScript IntelliSense embedded in docs. It uses `@typescript/ata` to auto-acquire type definitions for `@digital-alchemy/core` from npm on first load. + +Currently the component has hardcoded example files in `src/components/EmbeddedEditor/init.ts`. The planned refactor (tracked in `.cursor/plans/core-docs-structure.plan.md`) changes the API to accept `files: Record` and `defaultFile?: string` as props, with examples moved to `src/examples/core/`. + +Usage in MDX: +```mdx +import EmbeddedEditor from '@site/src/components/EmbeddedEditor/index'; + + +``` + +### Mermaid diagrams + +Enabled via `@docusaurus/theme-mermaid`. Use fenced code blocks with ` ```mermaid `. + +## Custom plugin + +`plugins/webpack-fallback.ts` — resolves Node.js built-in `module` to `false` in the browser bundle, required for `@typescript/ata` to work in the browser. + +## Active architectural plan + +`.cursor/plans/core-docs-structure.plan.md` describes a major restructuring of `docs/core/` from feature-area folders (`configuration/`, `applications/`, `services/`, etc.) into an intent-based hierarchy: `get-started/` → `tutorials/` → `reference/` → `guides/` → `advanced/`. ~26 current pages expand to ~60. The plan also specifies an `EmbeddedEditor` refactor and a new `src/examples/core/` directory. Check this plan before making changes to `docs/core/` structure. + +## Docusaurus-specific conventions + +- Frontmatter fields in use: `title`, `id`, `sidebar_position`, `description` +- `sidebar_label` can override the display name in the sidebar independently of `title` +- The `id` field in frontmatter determines the slug used in cross-doc links (e.g. `[link](./some-doc)` resolves by `id` or filename) +- Blog lives in `blog/` and is separate from versioned docs diff --git a/blog/01-building-a-basic-automation.md b/blog/01-building-a-basic-automation.md deleted file mode 100644 index 2d49b55..0000000 --- a/blog/01-building-a-basic-automation.md +++ /dev/null @@ -1,208 +0,0 @@ ---- -slug: basic-automation -title: Building a basic Automation -authors: [zoe-codez] ---- - -> This guide is part of a series. Check out the previous steps here -> -> 1. Check out the [quickstart](/docs/home-automation/quickstart/haos/) guide to create your own project - -Now that we have a foundation on **what is a service** / **how to wire them together**, let's build on that by creating a basic automation. - -## 🌐 Connecting to Home Assistant - -For this, we'll need to import the [hass](/docs/home-automation/hass/) library. If you used the [quickstart](/docs/home-automation/quickstart/haos/) project, this should already be set up for you. - -```typescript -import { CreateApplication } from "@digital-alchemy/core"; -// Import library definition -import { LIB_HASS } from "@digital-alchemy/hass"; - -const SUPER_AWESOME_APP = CreateApplication({ - // add to libraries - libraries: [LIB_HASS], - name: "my_super_awesome_app", - // ... -}); -``` - -> 🎉 -> **What changed:** -> -> - your application will connect to home assistant during bootstrap - -## 🤖 Creating logic - -### 🌋 Responding to events - -It's finally time to the application do something productive! Let's start out with taking a look a super basic automation to get a feel for the grammar. - -```typescript -import { TServiceParams } from "@digital-alchemy/core"; - -export function BasicAutomation({ hass, logger }: TServiceParams) { - const mySensor = hass.refBy.id("binary_sensor.my_example_sensor"); - - mySensor.onUpdate(async (new_state, old_state) => { - logger.info( - `my_example_sensor updated ${old_state.state} => ${new_state.state}`, - ); - await hass.call.switch.toggle({ - entity_id: "switch.example_switch", - }); - }); -} -``` - -In this example, an entity reference was created, with an update listener attached to it. The provided `new_state` & `old_state` variables reflect the states for that particular update, and while `mySensor` can be also used to directly access current state. - -Now for more complex example, setting up a temporary schedule while a condition is true. - -```typescript -import { TServiceParams } from "@digital-alchemy/core"; - -// 5 MINUTES -const REPEAT_NOTIFICATION_INTERVAL = 1000 * 60 * 5; - -export function GaragePester({ scheduler, logger, hass, internal }: TServiceParams) { - const isHome = hass.refBy.id("binary_sensor.i_am_home"); - const garageIsOpen = hass.refBy.id("binary_sensor.garage_is_open"); - let stop: () => void; - - // UPDATE TRIGGER - isHome.onUpdate((new_state, old_state) => { - if (new_state.state === "off") { - // am home, stop notifying and clean up - if (stop) { - logger.info("welcome back home!"); - stop(); - stop = undefined; - } - return; - } - if (old_state.state !== "off" || stop) { - return; - } - - // send a notification every 5 minutes - // ex: "You left 20m ago with the garage open" - const notifyingSince = new Date(); - stop = scheduler.interval({ - async exec() { - logger.info("still a problem"); - // calculate a friendly string that describes how long - const timeAgo = internal.utils.relativeDate(notifyingSince); - - // call the `notify.notify` service - await hass.call.notify.notify({ - message: `You left ${timeAgo} with the garage open`, - title: "Come back and close the garage!", - }); - }, - interval: REPEAT_NOTIFICATION_INTERVAL, - }); - }); - - garageIsOpen.onUpdate(() => { - // stop notifying if I remotely close the garage - if (garageIsOpen.state === "off" && stop) { - logger.info("stopping garage reminders"); - stop(); - stop = undefined; - } - }); -} -``` - -In this example, the service will track a pair of `binary_sensor` entities. If the combination indicates that I am both away, and the garage door is left open, then it will set up a temporary schedule. - -If the situation changes, then the timer is stopped 🎉 - -### ⏰ Timers - -Timers don't need to just be set in response to events, they can be a central feature of the way your application works. Send morning reports, make events that happen at "2ish" - -```typescript -import { CronExpression, sleep, TServiceParams } from "@digital-alchemy/core"; - -export function WeatherReport({ scheduler, logger, hass }: TServiceParams) { - const forecast = hass.refBy.id("weather.forecast_home"); - - async function SendWeatherReport() { - const [today] = forecast.attributes.forecast; - const unit = forecast.attributes.temperature_unit; - const message = [ - `Today's weather will be ${today.condition}`, - `High: ${today.temperature}${unit} | Low: ${today.templow}${unit}`, - `Precipitation: ${today.precipitation * 100}%`, - // Hopefully with a perfect afternoon - ].join("\n"); - logger.info({ message }, "sending weather report"); - await hass.call.notify.notify({ - message, - title: `Today's weather report`, - }); - } - - scheduler.cron({ - async exec() { - await SendWeatherReport(); - }, - schedule: CronExpression.EVERY_DAY_AT_8AM, - }); - - scheduler.cron({ - async exec() { - // Generate random number 0-30 - const waitMins = Math.floor(Math.random() * 30); - logger.debug(`sleeping ${waitMins} minutes`); - await sleep(waitMins * 1000 * 60); // 😴 - - logger.info("doing the thing!"); - // maybe turn off if you need some rain? 🌧 - await hass.call.switch.turn_on({ - entity_id: "switch.perfect_weather_machine", - }); - }, - schedule: CronExpression.EVERY_DAY_AT_2PM, - }); -} -``` - -> See [Scheduler](/docs/core/services/builtin/core_scheduler) for more specific documentation. - -## 🎬 Bringing it all together - -Time to bring it all together back in your application definition. If it isn't added there, it won't run! - -```typescript -import { CreateApplication } from "@digital-alchemy/core"; -import { LIB_HASS } from "@digital-alchemy/hass"; - -const SUPER_AWESOME_APP = CreateApplication({ - libraries: [LIB_HASS], - name: "my_super_awesome_app", - services: { - BasicAutomation, - GaragePester, - WeatherReport, - } -}); - -declare module "@digital-alchemy/core" { - export interface LoadedModules { - my_super_awesome_app: typeof SUPER_AWESOME_APP; - } -} - -setImmediate( - async () => - await SUPER_AWESOME_APP.bootstrap(), -); -``` - -That's it! Run your code and enjoy your new super awesome app 😉 - ---- -- #Blog diff --git a/blog/02-project-updates-2024-04.md b/blog/02-project-updates-2024-04.md deleted file mode 100644 index 9eb4166..0000000 --- a/blog/02-project-updates-2024-04.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -slug: 2024-04-project-updates -title: Project Updates - 2024-04 -authors: [zoe-codez] ---- -## 🚀 Recent Improvements - -### 📈 Editor performance - -The `type-writer` script now provides more information about your setup in the form of pre-built string unions. Your editor needs to do much less inferring work during development, resulting in dramatically better performance around in setups with larger quantities of entities - -### 🏷 Label Support - -The project now has direct support for Home Assistant's new `label` feature, as well as bringing matching support for existing `area`, `floor`, and `device`. You are able to manage `label` & `area` for entities through convenient APIs, making for some easy migrations & writing quick batch operations for your system. Matching querying methods have also been provided: - -- `hass.id.area` -- `hass.id.floor` -- `hass.id.device` -- `hass.id.label` - -All of these methods are set up so they return string unions representing what you will receive at runtime. You are also able to filter by domain, quickly extracting a subset of entities from the existing groups. - -- Simple lookup by label: [![img](/img/label_lookup.png)](/img/label_lookup.png) - -- Looking up switches by area - -| [![lookup error](/img/area_lookup_error.png)](/img/area_lookup_error.png) | [![filter by domain](/img/filter_area_domain.png)](/img/filter_area_domain.png) | -| --- | --- | -| ⛔ Editor will let you know when you are using invalid entities | ✅ quickly filter by domain | - -### 👥 Community updates - -A few new sections in discord have been added recently better support newcomers to the project. - -- help - general q&a forum, get quick answers about the system -- code review - want a second set of eyes to make sure your new automation is going to do what you think it should? - -## 🚧 Current development - -### 🪟 [Automation Standalone](https://github.com/Digital-Alchemy-TS/automation-standalone) - -The current [Automation Quickstart](https://github.com/Digital-Alchemy-TS/automation-quickstart) is intended for HAOS based setups, providing a quick setup script to bring your setup to a running state with a single command. - -This new / second quickstart project is aimed at people invested in docker based setups. Target audiences: - -- docker based Home Assistant setups -- people who want a template tuned to building / deploying your logic to a container -- anyone looking to get the most out of their setup - -Has support for the high performance **Bun** runtime, dedicated testing workflows, and built with Windows friendly workflows. - -### 🤖 Unit testing workflows - -The unit testing tools surrounding the `hass` library are receiving active attention, with the intent of creating set of tools that can be used to unit test your automations directly. This will be taken advantage of as part of the new quickstart project so you can include test coverage on the list of things you can flex about your setup 💪 diff --git a/blog/building-a-plugin-registry.md b/blog/building-a-plugin-registry.md new file mode 100644 index 0000000..c57fa17 --- /dev/null +++ b/blog/building-a-plugin-registry.md @@ -0,0 +1,244 @@ +--- +title: Building a Plugin Registry with Digital Alchemy +date: 2026-02-24 +description: "How to build a dynamic adapter system where each backend is an independently-configured library that self-registers at boot." +--- + +There's a pattern that shows up repeatedly in production Digital Alchemy applications: a central service that manages a set of interchangeable backends, where each backend is its own library and self-registers at startup. No hardcoded coupling between the core and any specific backend. Adding a new adapter is one file and one line. + +This post walks through how it works. + + + +## The problem + +Imagine you're building a service that routes work to one of several external backends — payment processors, notification providers, data enrichment APIs. You start with one. Then you add a second. Then a third. + +The naive implementation ends up like this: + +```typescript +switch (provider) { + case "provider_a": return await providerA.fetch(request); + case "provider_b": return await providerB.fetch(request); + case "provider_c": return await providerC.fetch(request); + default: throw new Error(`Unknown provider: ${provider}`); +} +``` + +This works until it doesn't. Every new backend means editing the core service. Tests for one backend pull in all the others. Configuration for every provider lives in one place even though most environments only use one. + +There's a better shape. + +## The shape of a plugin + +Each backend becomes a `CreateLibrary` — a self-contained unit with its own config entries, its own services, and no knowledge of the other backends. + +```typescript title="src/libraries/provider-a/index.mts" +import { CreateLibrary } from "@digital-alchemy/core"; +import { ProviderAService } from "./provider-a.service.mts"; +import { LIB_REGISTRY } from "../registry/index.mts"; + +export const LIB_PROVIDER_A = CreateLibrary({ + name: "provider_a", + depends: [LIB_REGISTRY], + configuration: { + API_URL: { type: "string", required: true }, + API_KEY: { type: "string", required: true }, + IS_ACTIVE: { type: "boolean", default: true }, + }, + services: { + provider: ProviderAService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + provider_a: typeof LIB_PROVIDER_A; + } +} +``` + +The library has three things: +- Its own config namespace (`provider_a.API_URL`, `provider_a.API_KEY`) +- An `IS_ACTIVE` flag — more on that below +- A `depends` declaration on `LIB_REGISTRY`, which makes the registry available at wiring time + +## The registry service + +`LIB_REGISTRY` is a shared library that lives in its own module. It holds a `Map` of registered providers and exposes a `register()` function that adapters call at wiring time. + +```typescript title="src/libraries/registry/registry.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +type ProviderEntry = { + name: string; + isActive: boolean; + fetch: (request: FetchRequest) => Promise; +}; + +export function RegistryService({ logger }: TServiceParams) { + const registry = new Map(); + + return { + register(entry: ProviderEntry) { + if (!entry.isActive) { + logger.debug({ name: entry.name }, "provider inactive, skipping registration"); + return; + } + registry.set(entry.name, entry); + logger.info({ name: entry.name }, "provider registered"); + }, + + get(name: string) { + return registry.get(name); + }, + + all() { + return [...registry.values()]; + }, + + names() { + return [...registry.keys()]; + }, + }; +} +``` + +The registry doesn't know about any specific backend. It's just a `Map` with a typed `register()` call. + +:::note priorityInit +If other services read from the registry during wiring, declare `RegistryService` in `priorityInit` in the library definition. This ensures it wires before any adapter tries to register with it. + +```typescript +export const LIB_REGISTRY = CreateLibrary({ + name: "registry", + priorityInit: ["registry"], + services: { registry: RegistryService }, +}); +``` +::: + +## Self-registration + +Each adapter's primary service registers itself with the registry at wiring time — not in a lifecycle callback: + +```typescript title="src/libraries/provider-a/provider-a.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +export function ProviderAService({ config, registry, logger, context }: TServiceParams) { + // Register at wiring time — registry is available because we declared `depends: [LIB_REGISTRY]` + registry.registry.register({ + name: "provider_a", + isActive: config.provider_a.IS_ACTIVE, + async fetch(request) { + const response = await globalThis.fetch(config.provider_a.API_URL, { + method: "POST", + headers: { Authorization: `Bearer ${config.provider_a.API_KEY}` }, + body: JSON.stringify(request), + }); + return response.json(); + }, + }); +} +``` + +Wiring-time registration works because `depends: [LIB_REGISTRY]` ensures the registry service is wired before this service runs. The return value of `RegistryService` is already available — no lifecycle hook needed. + +## The trenchcoat + +In the application module, you collect all your adapter libraries in an array: + +```typescript title="src/app.module.mts" +import { CreateApplication } from "@digital-alchemy/core"; +import { LIB_REGISTRY } from "./libraries/registry/index.mts"; +import { LIB_PROVIDER_A } from "./libraries/provider-a/index.mts"; +import { LIB_PROVIDER_B } from "./libraries/provider-b/index.mts"; +import { LIB_PROVIDER_C } from "./libraries/provider-c/index.mts"; +import { RouterService } from "./services/router.service.mts"; + +const ADAPTERS = [LIB_PROVIDER_A, LIB_PROVIDER_B, LIB_PROVIDER_C]; + +export const MY_APP = CreateApplication({ + name: "my_app", + libraries: [LIB_REGISTRY, ...ADAPTERS], + services: { + router: RouterService, + }, +}); +``` + +Adding a new backend: create a new library, add it to `ADAPTERS`. No other file changes. + +## Dynamic routing + +Because the registry is populated at wiring time, you can derive routes (or any dynamic behavior) from `registry.names()` at boot: + +```typescript title="src/services/router.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +export function RouterService({ registry, lifecycle, logger }: TServiceParams) { + lifecycle.onReady(() => { + const active = registry.registry.names(); + logger.info({ providers: active }, `routing active for ${active.length} providers`); + }); + + return { + async route(providerName: string, request: FetchRequest) { + const provider = registry.registry.get(providerName); + if (!provider) { + throw new Error(`No provider registered: ${providerName}`); + } + return provider.fetch(request); + }, + }; +} +``` + +## Enable/disable per environment + +`IS_ACTIVE: { type: "boolean", default: true }` on each adapter means you can selectively disable backends without changing code. In an environment where only provider A should run: + +```bash +PROVIDER_B__IS_ACTIVE=false +PROVIDER_C__IS_ACTIVE=false +``` + +The adapter libraries are still wired — their config still loads — but the `register()` call is skipped. The registry has no entry for them. The router raises a clean error if they're requested. + +This gives you a single deployment image that works across every environment. + +## Testing in isolation + +`TestRunner.replaceLibrary()` replaces an entire library with a mock. To test the router with only a fake provider: + +```typescript +await TestRunner(MY_APP) + .replaceLibrary(LIB_PROVIDER_A, { + services: { + provider: () => { + // Register a mock that always returns a fixed result + registry.registry.register({ + name: "provider_a", + isActive: true, + async fetch() { + return { price: 42 }; + }, + }); + }, + }, + }) + .run(async ({ my_app }) => { + const result = await my_app.router.route("provider_a", { id: "test" }); + expect(result.price).toBe(42); + }); +``` + +Other adapters can be disabled in the test environment entirely: `IS_ACTIVE: false` in the test runner's `configure()`. + +## What you get + +- **Isolated adapters** — each library owns its config namespace, its services, and its tests +- **Zero coupling** — the registry and router have no imports from any specific adapter +- **Dynamic everything** — routes, active providers, feature gating all derive from the registry at boot +- **Clean tests** — test one adapter without touching the others +- **One-line additions** — new adapter = new library + one line in the `ADAPTERS` array diff --git a/docs/core/.archive/01-getting-started/_category_.json b/docs/core/.archive/01-getting-started/_category_.json new file mode 100644 index 0000000..32192f4 --- /dev/null +++ b/docs/core/.archive/01-getting-started/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Getting Started", + "position": 1, + "collapsible": true, + "collapsed": false, + "link": { + "type": "doc", + "id": "core/01-getting-started/index" + } +} diff --git a/docs/core/.archive/01-getting-started/index.md b/docs/core/.archive/01-getting-started/index.md new file mode 100644 index 0000000..a1ecbd6 --- /dev/null +++ b/docs/core/.archive/01-getting-started/index.md @@ -0,0 +1,16 @@ +--- +title: Getting Started +sidebar_label: Overview +sidebar_position: 1 +description: "Introduction to the Getting Started section of Digital Alchemy Core." +--- + +This section takes you from zero to a running Digital Alchemy application. + +| | | +|---|---| +| [Installation](./install.md) | Add the package, configure TypeScript, runtime notes | +| [Quickstart](./quickstart.mdx) | Build and run your first application step by step | +| [Next Steps](./next-steps.md) | Where to go after the quickstart | + +If you want the fastest possible path, jump straight to [Quickstart](./quickstart.mdx). Installation is covered there too. diff --git a/docs/core/.archive/01-getting-started/install.md b/docs/core/.archive/01-getting-started/install.md new file mode 100644 index 0000000..8959062 --- /dev/null +++ b/docs/core/.archive/01-getting-started/install.md @@ -0,0 +1,80 @@ +--- +title: Installation +sidebar_position: 2 +description: "How to install Digital Alchemy Core and configure your project." +--- + +## Requirements + +- **Node.js** ≥ 18 (or Bun / Deno — see [Runtimes](#runtimes) below) +- **TypeScript** — the framework is ESM-first and written entirely in TypeScript + +## Install + +```bash +# yarn +yarn add @digital-alchemy/core + +# npm +npm install @digital-alchemy/core + +# bun +bun add @digital-alchemy/core +``` + +## TypeScript configuration + +Digital Alchemy uses `.mts` file extensions and ES modules throughout. Your `tsconfig.json` should target at least ES2022 and use `NodeNext` or `Bundler` module resolution: + +```json +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true, + "esModuleInterop": true + } +} +``` + +:::tip +If you use Bun or a bundler, `"module": "ESNext"` and `"moduleResolution": "Bundler"` also work. +::: + +## Runtimes + +Digital Alchemy is runtime-agnostic. Your entrypoint file (`main.mts`) runs the same regardless of how you execute it: + +```bash +# tsx (TypeScript execute — fast local dev) +npx tsx src/main.mts + +# ts-node +npx ts-node --esm src/main.mts + +# Bun +bun run src/main.mts + +# Compiled Node.js +tsc && node dist/main.js +``` + +For production, building with `tsc` and running with plain `node` is the most portable option. For development, [`tsx`](https://github.com/esbuild-kit/tsx) reloads quickly with no build step. + +## Day.js plugins + +Digital Alchemy uses [Day.js](https://day.js.org/) for date/time utilities and requires a few non-default plugins. If your editor shows missing types for Day.js methods, add this somewhere in your project (e.g. a `dayjs-setup.mts` imported by your entrypoint): + +```typescript +import dayjs from "dayjs"; +import duration from "dayjs/plugin/duration.js"; +import isBetween from "dayjs/plugin/isBetween.js"; +import weekOfYear from "dayjs/plugin/weekOfYear.js"; + +dayjs.extend(duration); +dayjs.extend(isBetween); +dayjs.extend(weekOfYear); +``` + +This is a one-time setup. After it runs, `dayjs.duration(...)`, `dayjs().isBetween(...)`, and `dayjs().week()` will all type-check correctly. diff --git a/docs/core/.archive/01-getting-started/next-steps.md b/docs/core/.archive/01-getting-started/next-steps.md new file mode 100644 index 0000000..a553f55 --- /dev/null +++ b/docs/core/.archive/01-getting-started/next-steps.md @@ -0,0 +1,26 @@ +--- +title: Next Steps +sidebar_position: 4 +description: "Where to go after the Digital Alchemy Core quickstart." +--- + +Once you have the quickstart running, here's a recommended reading order depending on what you want to do next. + +## Understand the fundamentals + +These two pages explain *why* Digital Alchemy works the way it does. Read them before diving into the API reference — they'll make everything else click faster. + +- **[Bootstrapping](../02-core-concepts/bootstrapping.md)** — what happens between `bootstrap()` and your first `onReady` callback; the full wiring sequence with a diagram +- **[Dependency Injection](../02-core-concepts/dependency-injection.md)** — why plain function injection instead of decorators or globals; how `TServiceParams` gets its types + +## Build something real + +- **[Services](../03-module-system/services.md)** — service function pattern, return shapes, and how services access each other +- **[Applications & Libraries](../03-module-system/applications.md)** — structuring larger projects with reusable library modules +- **[Configuration](../05-configuration/index.md)** — define typed config, source from env/files/CLI, validate at boot + +## Go deeper + +- **[Lifecycle](../04-lifecycle/index.md)** — all seven stages, hook registration, priority execution +- **[Built-in Services](../06-builtins/index.md)** — logger, scheduler (cron, interval, sliding), event emitter, utilities +- **[Testing](../07-testing/index.md)** — `TestRunner`, module manipulation, fake timers, lifecycle testing diff --git a/docs/core/.archive/01-getting-started/quickstart.mdx b/docs/core/.archive/01-getting-started/quickstart.mdx new file mode 100644 index 0000000..6f4b4d7 --- /dev/null +++ b/docs/core/.archive/01-getting-started/quickstart.mdx @@ -0,0 +1,107 @@ +--- +title: Quickstart +sidebar_position: 3 +description: "Build and run your first Digital Alchemy application." +--- + +import EmbeddedEditor from '@site/src/components/EmbeddedEditor'; +import { files, defaultFile } from '@site/src/examples/core/01-getting-started/first-app'; + +This guide walks you through building a minimal Digital Alchemy application from scratch. By the end you'll have a running app and understand the three core building blocks: **services**, **modules**, and **bootstrap**. + +## Install + +```bash +yarn add @digital-alchemy/core +``` + +## Step 1 — Write a service + +A service is a plain TypeScript function that receives a single parameter: `TServiceParams`. This object contains everything your service needs — the logger, lifecycle hooks, config, other services, and more. + +```typescript title="src/hello.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +export function HelloService({ logger, lifecycle }: TServiceParams) { + lifecycle.onReady(() => { + logger.info("Hello, Digital Alchemy!"); + }); +} +``` + +A few things to notice: +- The function signature always receives a single destructured `TServiceParams`. +- **No code runs at function call time** — you register callbacks for lifecycle stages (here, `onReady`). This is how you control *when* things happen. +- The logger is pre-configured with your service's context (`my_app:hello`), so every log line is automatically tagged. + +## Step 2 — Create an application module + +An application module wires services together and gives the app a name. + +```typescript title="src/application.mts" +import { CreateApplication } from "@digital-alchemy/core"; +import { HelloService } from "./hello.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + services: { + hello: HelloService, + }, +}); + +// Extend LoadedModules so TypeScript knows what's on TServiceParams +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +``` + +The `declare module` block is how Digital Alchemy makes cross-service types work. After this declaration, any service in `my_app` can access `my_app.hello` from `TServiceParams` and TypeScript will know its full type. + +## Step 3 — Bootstrap + +Create an entrypoint that starts the application. + +```typescript title="src/main.mts" +import { MY_APP } from "./application.mts"; + +await MY_APP.bootstrap(); +``` + +Then run it: + +```bash +npx tsx src/main.mts +``` + +You should see output like: + +``` +[Mon 09:00:00.000] [INFO][my_app:hello]: Hello, Digital Alchemy! +``` + +## Try it live + +The editor below shows the same three files. Click between them, read the types, and try making changes. + + + +## What just happened? + +When `bootstrap()` is called, the framework: + +1. Creates the lifecycle manager +2. Wires boilerplate services (logger, config, scheduler) +3. Calls `HelloService` — building its `TServiceParams` from the wired context +4. Runs lifecycle stages in order: `PreInit` → `PostConfig` → `Bootstrap` → `Ready` + +Your `onReady` callback fires at step 4. By that point, all services are initialized and config is validated. + +For the full picture of what happens during bootstrap, see [Bootstrapping](../02-core-concepts/bootstrapping.md). + +## Next steps + +- Add a second service and have them talk to each other → [Services](../03-module-system/services.md) +- Add typed configuration → [Configuration](../05-configuration/index.md) +- Understand the lifecycle → [Lifecycle](../04-lifecycle/index.md) diff --git a/docs/core/.archive/02-core-concepts/_category_.json b/docs/core/.archive/02-core-concepts/_category_.json new file mode 100644 index 0000000..49ac699 --- /dev/null +++ b/docs/core/.archive/02-core-concepts/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Core Concepts", + "position": 2, + "collapsible": true, + "collapsed": true, + "link": { + "type": "doc", + "id": "core/02-core-concepts/index" + } +} diff --git a/docs/core/.archive/02-core-concepts/bootstrapping.md b/docs/core/.archive/02-core-concepts/bootstrapping.md new file mode 100644 index 0000000..bad7849 --- /dev/null +++ b/docs/core/.archive/02-core-concepts/bootstrapping.md @@ -0,0 +1,156 @@ +--- +title: Bootstrapping +sidebar_position: 2 +description: "How Digital Alchemy boots: the full wiring and lifecycle sequence." +--- + +## What is bootstrapping? + +Bootstrapping is the process that starts when you call `MY_APP.bootstrap()` and ends when your `onReady` callbacks finish. During this window, the framework wires every service, loads configuration, and runs the lifecycle stages in order. + +Understanding this sequence tells you **exactly when your code runs** and **why certain things must happen in lifecycle callbacks** rather than at function call time. + +## The boot sequence + +```mermaid +sequenceDiagram + participant U as Your Code + participant B as bootstrap() + participant W as Wiring + participant L as Lifecycle + + U->>B: MY_APP.bootstrap() + B->>W: Wire boilerplate services + Note over W: logger, config, scheduler, als + W->>W: LOAD_PROJECT — register config definitions + W->>W: buildSortOrder(libraries) + Note over W: Topological sort; throws BAD_SORT on cycles + loop Each library (dependency order) + W->>W: Wire library services + end + W->>W: Wire application services + B->>L: exec("PreInit") + B->>L: exec("PostConfig") + Note over L: Required config validated here + B->>L: exec("Bootstrap") + B->>L: exec("Ready") + L-->>U: onReady callbacks fire +``` + +### Phase 1 — Wire boilerplate + +Before any user code runs, four boilerplate services are wired in: `logger`, `configuration`, `scheduler`, and `als` (AsyncLocalStorage). These form the foundation of `TServiceParams` — every service gets access to them. + +Config definitions from all modules are also collected here (`LOAD_PROJECT`), so the configuration system knows what to expect before it tries to load values. + +### Phase 2 — Resolve the dependency graph + +Libraries declared in `libraries: [...]` are sorted using `buildSortOrder()`, a topological sort that ensures a library is always wired before any library that depends on it. + +**If there is a circular dependency, `buildSortOrder` throws a `BootstrapException` with cause `BAD_SORT` immediately.** There is no runtime proxy or lazy resolution — cycles are a hard error. + +If a required dependency is missing from the `libraries` array, the error is `MISSING_DEPENDENCY`. + +### Phase 3 — Wire services + +Each module (libraries first, then the application) is wired by calling its service functions in order. The service function receives a fully typed `TServiceParams` built from whatever has been wired so far. + +:::note When does my service function run? +Your service function is called exactly once — during wiring. Any code at the top level of your function runs at that moment. Code you want to run *after* everything is wired should be placed in a lifecycle callback: + +```typescript +export function MyService({ logger }: TServiceParams) { + // ✅ This runs during wiring — fine for setup that doesn't need other services + const registry = new Map(); + + // ✅ This runs after ALL services are wired and config is validated + lifecycle.onReady(() => { + logger.info("everything is ready"); + }); +} +``` +::: + +### Phase 4 — Lifecycle stages + +After all services are wired, the lifecycle runs through four stages in sequence: + +| Stage | When to use | +|---|---| +| `PreInit` | Early setup that must happen before config is applied | +| `PostConfig` | Config is now validated and available — safe to read `config.*` values | +| `Bootstrap` | Main initialization work; all services and config are available | +| `Ready` | Application is fully started; safe to begin serving traffic, starting jobs, etc. | + +See [Lifecycle](../04-lifecycle/index.md) for the full details including shutdown stages and priority ordering. + +## Bootstrap options + +The `bootstrap()` method accepts an optional options object: + +```typescript +await MY_APP.bootstrap({ + // Override config values at boot time (highest priority) + configuration: { + boilerplate: { LOG_LEVEL: "debug" }, + my_app: { DATABASE_URL: "postgres://localhost/mydb" }, + }, + + // Logger options — merge static data into every log line + loggerOptions: { + als: true, + mergeData: { + env: process.env.NODE_ENV, + host: hostname(), + }, + }, + + // Force libraries to fully initialize (Bootstrap stage) before + // application services are wired — useful for scripts and job runners + bootLibrariesFirst: true, +}); +``` + +### `bootLibrariesFirst` + +By default, all services (library and application) are wired first, then lifecycle stages run for everything together. With `bootLibrariesFirst: true`, the sequence changes: + +1. Wire library services → run `Bootstrap` for libraries +2. Wire application services +3. Run `Ready` for everything + +This is useful when application services need library resources (e.g. a database connection) to be fully established before their own wiring code runs. + +## Multiple entrypoints + +It is good practice to keep your module definition separate from the bootstrap call, so different entrypoints can bootstrap with different options: + +```typescript title="src/application.mts" +export const MY_APP = CreateApplication({ ... }); +``` + +```typescript title="src/main.mts" (development) +import { MY_APP } from "./application.mts"; +await MY_APP.bootstrap({ configuration: { boilerplate: { LOG_LEVEL: "debug" } } }); +``` + +```typescript title="src/prod.main.mts" (production) +import { MY_APP } from "./application.mts"; +await MY_APP.bootstrap({ configuration: { boilerplate: { LOG_LEVEL: "warn" } } }); +``` + +## Shutdown + +Shutdown is the mirror of boot, triggered by `SIGTERM` or `SIGINT` (or by calling `app.teardown()` directly). The shutdown stages are: + +`PreShutdown` → `ShutdownStart` → `ShutdownComplete` + +Any cleanup work (closing connections, flushing buffers) should be registered with `lifecycle.onPreShutdown()` or `lifecycle.onShutdownStart()`. + +## Common boot errors + +| Error cause | What it means | +|---|---| +| `BAD_SORT` | Circular dependency between libraries — check `depends` arrays | +| `MISSING_DEPENDENCY` | A library's required dependency is not in the application's `libraries` array | +| `REQUIRED_CONFIGURATION_MISSING` | A config entry marked `required: true` has no value — checked at `PostConfig` | diff --git a/docs/core/.archive/02-core-concepts/dependency-injection.md b/docs/core/.archive/02-core-concepts/dependency-injection.md new file mode 100644 index 0000000..6bb395b --- /dev/null +++ b/docs/core/.archive/02-core-concepts/dependency-injection.md @@ -0,0 +1,98 @@ +--- +title: Dependency Injection +sidebar_position: 3 +description: "Why Digital Alchemy uses dependency injection and how TServiceParams works." +--- + +## The problem with global state + +In a standard Node.js script, sharing things between modules means either globals or passing arguments everywhere: + +```typescript +// ❌ Global state — hard to test, hidden dependencies +let db: Database; +export function getDb() { return db; } + +// ❌ Passing everything manually — verbose, inflexible +export function doThing(db: Database, logger: Logger, config: Config) { ... } +``` + +Both approaches break down as applications grow. Global state makes testing painful (you can't swap the real database for a mock without modifying source files). Passing arguments manually means every function signature grows as requirements change. + +## The Digital Alchemy approach + +Digital Alchemy gives every service exactly what it needs through a single parameter: `TServiceParams`. The framework builds this object for you at boot time from the module graph — you don't pass it manually, and there are no globals. + +```typescript +export function MyService({ logger, config, lifecycle, my_lib }: TServiceParams) { + // logger — pre-configured with this service's context + // config — typed access to configuration values + // lifecycle — register callbacks for lifecycle stages + // my_lib — the full API of another module, typed +} +``` + +The key property: **`TServiceParams` is statically typed based on what your application declares.** If `my_lib` is in your `libraries` array and has a `LoadedModules` declaration, TypeScript knows its full shape — including every service it exposes. + +## How types flow: `LoadedModules` + +The bridge between your module definition and TypeScript's type system is the `LoadedModules` interface. You extend it once per module: + +```typescript +export const MY_LIB = CreateLibrary({ + name: "my_lib", + services: { api: ApiService, cache: CacheService }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_lib: typeof MY_LIB; // key must match the `name` field + } +} +``` + +After this declaration, any service in any application that loads `MY_LIB` gets `my_lib.api` and `my_lib.cache` on `TServiceParams` with full type information: + +```typescript +export function ConsumerService({ my_lib }: TServiceParams) { + // TypeScript knows the return type of ApiService and CacheService + my_lib.api.get("/endpoint"); // ✅ typed + my_lib.cache.set("key", val); // ✅ typed +} +``` + +## Context strings + +Each service is automatically assigned a **context** — a string in the format `module_name:service_name`. This is available as `context` in `TServiceParams` and is automatically attached to log messages: + +```typescript +// In an application with name "home_auto", service key "climate" +export function ClimateService({ context, logger }: TServiceParams) { + logger.info("ready"); + // Prints: [INFO][home_auto:climate]: ready +} +``` + +Context is also used by downstream libraries (like `synapse`) to attribute logs and errors to specific services. + +## What's in TServiceParams + +Every service receives all of the following: + +| Property | Type | Description | +|---|---|---| +| `als` | `AlsExtension` | AsyncLocalStorage — request-scoped data | +| `config` | typed | All config values, keyed by module name | +| `context` | `TContext` | This service's context string | +| `event` | `EventEmitter` | Application-wide event bus | +| `internal` | `InternalDefinition` | Framework internals and utilities | +| `lifecycle` | `TLifecycleBase` | Register hooks for all lifecycle stages | +| `logger` | `ILogger` | Context-aware logger instance | +| `scheduler` | `DigitalAlchemyScheduler` | Cron, interval, sliding, sleep | +| *(loaded modules)* | typed | Every module with a `LoadedModules` declaration | + +Plus any additional services registered from your own modules. + +## Testing benefit + +Because all dependencies flow through `TServiceParams`, testing is straightforward. The `TestRunner` lets you replace any library with a mock, append extra services, or restrict which services load — all without touching production code. See [Testing](../07-testing/index.md). diff --git a/docs/core/.archive/02-core-concepts/index.md b/docs/core/.archive/02-core-concepts/index.md new file mode 100644 index 0000000..56177fa --- /dev/null +++ b/docs/core/.archive/02-core-concepts/index.md @@ -0,0 +1,19 @@ +--- +title: Core Concepts +sidebar_label: Overview +sidebar_position: 1 +description: "The foundational concepts behind Digital Alchemy Core." +--- + +These pages explain how Digital Alchemy works under the hood. You don't need to read them before you can build things, but understanding them will make you significantly more effective — especially when something goes wrong at boot. + +| | | +|---|---| +| [Bootstrapping](./bootstrapping.md) | The full boot sequence from `bootstrap()` to `onReady`, with a diagram | +| [Dependency Injection](./dependency-injection.md) | How `TServiceParams` is built and why types flow automatically | + +## The mental model in one paragraph + +When you call `MY_APP.bootstrap()`, Digital Alchemy walks the module graph in dependency order, calling each service function once to build its return value. Each function receives a `TServiceParams` object whose shape is assembled from the modules already wired. Services register callbacks for lifecycle stages instead of running code immediately. Once all services are wired, the lifecycle stages run in sequence. Your application is "ready" only after all of that completes. + +Everything else in the framework — config, logging, testing, the scheduler — is built on top of this foundation. diff --git a/docs/core/.archive/03-module-system/_category_.json b/docs/core/.archive/03-module-system/_category_.json new file mode 100644 index 0000000..019c335 --- /dev/null +++ b/docs/core/.archive/03-module-system/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Module System", + "position": 3, + "collapsible": true, + "collapsed": true, + "link": { + "type": "doc", + "id": "core/03-module-system/index" + } +} diff --git a/docs/core/.archive/03-module-system/applications.md b/docs/core/.archive/03-module-system/applications.md new file mode 100644 index 0000000..93d4119 --- /dev/null +++ b/docs/core/.archive/03-module-system/applications.md @@ -0,0 +1,71 @@ +--- +title: Applications +sidebar_position: 2 +description: "CreateApplication — defining and bootstrapping a Digital Alchemy application." +--- + +An application module is the root of every Digital Alchemy program. It owns the service wiring, declares library dependencies, and exposes the `bootstrap()` and `teardown()` methods. + +## CreateApplication + +```typescript +import { CreateApplication } from "@digital-alchemy/core"; + +export const MY_APP = CreateApplication({ + name: "my_app", // Must be unique; becomes the key in TServiceParams and config + services: { + hello: HelloService, + data: DataService, + }, + libraries: [LIB_HTTP, LIB_DB], // Optional; loaded in dependency order + configuration: { // Optional; config values owned by this module + DATABASE_URL: { type: "string", required: true }, + }, + priorityInit: ["data"], // Optional; force specific services to wire first +}); + +// Required for TypeScript to know about this module in TServiceParams +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +``` + +## Properties + +| Property | Required | Description | +|---|---|---| +| `name` | ✅ | Module name — must match the key in `LoadedModules` | +| `services` | ✅ | Object of service functions to register | +| `libraries` | | Array of library modules to load (in dependency order) | +| `configuration` | | Config definitions owned by this module | +| `priorityInit` | | Service keys that must wire before others in the same module | + +## Library versions + +If multiple libraries declare the same dependency, the version provided by the **application's** `libraries` array is the one used at runtime. Libraries cannot override each other — the application has final say. + +This means if `LIB_A` depends on `LIB_UTILS@1` and `LIB_B` depends on `LIB_UTILS@2`, you must include exactly one version of `LIB_UTILS` in your application's `libraries` array. + +## bootstrap() + +See [Bootstrapping](../02-core-concepts/bootstrapping.md) for full details on bootstrap options and the boot sequence. + +```typescript +await MY_APP.bootstrap(); + +// With options: +await MY_APP.bootstrap({ + configuration: { my_app: { DATABASE_URL: "postgres://localhost/dev" } }, + bootLibrariesFirst: true, +}); +``` + +## teardown() + +Runs the shutdown lifecycle (`PreShutdown` → `ShutdownStart` → `ShutdownComplete`) and cleans up the event emitter. Called automatically on `SIGTERM` and `SIGINT`. + +```typescript +await MY_APP.teardown(); +``` diff --git a/docs/core/.archive/03-module-system/index.md b/docs/core/.archive/03-module-system/index.md new file mode 100644 index 0000000..72dd75f --- /dev/null +++ b/docs/core/.archive/03-module-system/index.md @@ -0,0 +1,16 @@ +--- +title: Module System +sidebar_label: Overview +sidebar_position: 1 +description: "Applications, libraries, services, and how they wire together." +--- + +The module system is how Digital Alchemy structures code and manages dependencies. Everything runs inside a module — either an application or a library. + +| | | +|---|---| +| [Applications](./applications.md) | `CreateApplication` — the entry point for every DA app | +| [Libraries](./libraries.md) | `CreateLibrary` — reusable, composable units of functionality | +| [Services](./services.md) | Service function pattern, return shapes, `priorityInit` | +| [Service Params](./service-params.md) | Everything available on `TServiceParams`, in detail | +| [Wiring](./wiring.md) | How services are wired, dependency ordering, error causes | diff --git a/docs/core/.archive/03-module-system/libraries.md b/docs/core/.archive/03-module-system/libraries.md new file mode 100644 index 0000000..5b3b349 --- /dev/null +++ b/docs/core/.archive/03-module-system/libraries.md @@ -0,0 +1,55 @@ +--- +title: Libraries +sidebar_position: 3 +description: "CreateLibrary — building reusable, composable Digital Alchemy modules." +--- + +A library is a reusable module that can be shared across multiple applications. It looks almost identical to an application, but uses `depends` instead of `libraries` and cannot be bootstrapped directly. + +## CreateLibrary + +```typescript +import { CreateLibrary } from "@digital-alchemy/core"; + +export const MY_LIB = CreateLibrary({ + name: "my_lib", + services: { + api: ApiService, + cache: CacheService, + }, + depends: [LIB_HTTP], // Libraries this library requires + optionalDepends: [LIB_REDIS], // Loaded only if the application also includes them + configuration: { + API_BASE_URL: { type: "string", default: "http://localhost:8080" }, + CACHE_TTL: { type: "number", default: 60 }, + }, + priorityInit: ["cache"], // Cache wires before api within this library +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_lib: typeof MY_LIB; + } +} +``` + +## Properties + +| Property | Description | +|---|---| +| `name` | Module name — must match `LoadedModules` key | +| `services` | Service functions to register | +| `depends` | Required library dependencies | +| `optionalDepends` | Dependencies to load only if the consuming application includes them | +| `configuration` | Config definitions owned by this library | +| `priorityInit` | Service keys that wire before others within this library | + +## depends vs optionalDepends + +`depends` are **required**: if a library declares `depends: [LIB_DB]` and the consuming application does not include `LIB_DB` in its `libraries` array, bootstrap throws `MISSING_DEPENDENCY`. + +`optionalDepends` are loaded only if the application includes them. This allows a library to integrate with other libraries when available, without making those integrations mandatory. + +## Distributing libraries + +Libraries are just npm packages that export a `LibraryDefinition`. Consumers install the package and add it to their application's `libraries` array. The `LoadedModules` declaration travels with the package (typically in its `index.mts`), so TypeScript picks it up automatically on install. diff --git a/docs/core/.archive/03-module-system/service-params.md b/docs/core/.archive/03-module-system/service-params.md new file mode 100644 index 0000000..ed65588 --- /dev/null +++ b/docs/core/.archive/03-module-system/service-params.md @@ -0,0 +1,109 @@ +--- +title: TServiceParams +sidebar_position: 5 +description: "Complete reference for the TServiceParams object received by every service." +--- + +Every service function receives a single `TServiceParams` argument. This object is assembled by the framework from whatever has been wired at the time the service is called. Its shape is fully typed and varies based on which modules are loaded. + +## Built-in properties + +These are always available regardless of which libraries are loaded: + +### `context` + +A string in the format `module_name:service_key`. Automatically attached to log messages. Pass it to downstream libraries (like `synapse`) so they can attribute their logs to your service. + +```typescript +export function MyService({ context }: TServiceParams) { + // context === "my_app:my_service" +} +``` + +### `logger` + +A context-aware `ILogger` instance. All methods (`debug`, `info`, `warn`, `error`, `fatal`, `trace`) automatically include the service context in output. + +```typescript +logger.info("started"); +// [INFO][my_app:my_service]: started + +logger.info({ count: 42 }, "found %s items", 42); +// structured + formatted +``` + +See [Logger](../06-builtins/logger.md) for full API. + +### `lifecycle` + +Register callbacks for any lifecycle stage. See [Lifecycle Hooks](../04-lifecycle/hooks.md). + +```typescript +lifecycle.onReady(() => { /* runs when fully booted */ }); +lifecycle.onPreShutdown(() => { /* cleanup before shutdown */ }); +``` + +### `scheduler` + +Schedule recurring work. Takes a `context` parameter for logging. See [Scheduler](../06-builtins/scheduler.md). + +```typescript +const job = scheduler(context).cron({ + schedule: CronExpression.EVERY_MINUTE, + exec: async () => { /* ... */ }, +}); +``` + +### `config` + +Typed access to all configuration values, keyed by module name: + +```typescript +const url = config.my_lib.API_BASE_URL; // string +const ttl = config.my_lib.CACHE_TTL; // number +const lvl = config.boilerplate.LOG_LEVEL; // "silent" | "trace" | ... +``` + +Values are available after `PostConfig`. Reading config at the top level of your service function (before `onPostConfig`) returns the default, not the sourced value. + +### `event` + +Application-wide Node.js `EventEmitter`. Shared across all services. Recreated at bootstrap and cleaned up at teardown. + +```typescript +event.emit("my_app:thing_happened", { id: "123" }); +event.on("my_app:thing_happened", handler); +``` + +See [Event Emitter](../06-builtins/event-emitter.md). + +### `als` + +AsyncLocalStorage wrapper. Used for request-scoped data and log correlation. See [Async Local Storage](../08-advanced/async-local-storage.md). + +### `internal` + +Framework internals. Mostly for framework authors and advanced use cases, but a few utilities are useful in application code: + +```typescript +internal.utils.is // Type guards (is.string, is.array, is.empty, ...) +internal.utils.relativeDate(date) // Human-readable relative time +internal.utils.object.get(obj, "nested.path") // Deep get +internal.utils.object.set(obj, "nested.path", val) +internal.safeExec(fn) // Call fn, log any error instead of throwing +internal.removeFn(fn) // Make a fn callable as both fn() and fn.remove() +``` + +## Module service properties + +Any module with a `LoadedModules` declaration contributes its services to `TServiceParams`. The key is the module's `name`: + +```typescript +// MY_LIB has name: "my_lib" with services: { api, cache } +export function ConsumerService({ my_lib }: TServiceParams) { + my_lib.api.get(...) // typed as the return value of ApiService + my_lib.cache.set(...) // typed as the return value of CacheService +} +``` + +TypeScript enforces this entirely at compile time — if `MY_LIB` is not in your application's `libraries` array and doesn't have a `LoadedModules` declaration, accessing `my_lib` will be a type error. diff --git a/docs/core/.archive/03-module-system/services.md b/docs/core/.archive/03-module-system/services.md new file mode 100644 index 0000000..4e035c0 --- /dev/null +++ b/docs/core/.archive/03-module-system/services.md @@ -0,0 +1,105 @@ +--- +title: Services +sidebar_position: 4 +description: "The service function pattern, return types, and initialization order." +--- + +A service is a plain TypeScript function registered in a module. The framework calls it once during wiring, passes it `TServiceParams`, and uses its return value as the module's API. + +## The function pattern + +```typescript +import type { TServiceParams } from "@digital-alchemy/core"; + +export function MyService({ logger, lifecycle, config }: TServiceParams) { + // Code here runs during wiring + const state = new Map(); + + lifecycle.onReady(() => { + logger.info("MyService ready"); + }); + + // Return value becomes the service's API + return { + get: (key: string) => state.get(key), + set: (key: string, value: unknown) => state.set(key, value), + state, + }; +} +``` + +## Return shapes + +Services can return an **object** or a **function**. Both patterns are supported; choose based on what you're exposing. + +### Object return + +Best when a service exposes multiple methods or properties: + +```typescript +export function RegistryService({ }: TServiceParams) { + const items = new Map(); + + return { + add: (id: string, item: unknown) => items.set(id, item), + remove: (id: string) => items.delete(id), + get: (id: string) => items.get(id), + list: () => [...items.values()], + }; +} +``` + +Other services call it as `my_app.registry.add(...)`, `my_app.registry.list()`, etc. + +### Function return + +Best when the service's primary interface is a single callable — often a factory or builder: + +```typescript +export function LoggerService({ }: TServiceParams) { + return (namespace: string) => { + return { + log: (message: string) => console.log(`[${namespace}] ${message}`), + }; + }; +} +``` + +Other services call it as `my_app.log_svc("payments").log("...")`. + +## Accessing other services + +Services reference other services through `TServiceParams`. The key is the module name, not the service name: + +```typescript +export function ConsumerService({ my_lib, my_app }: TServiceParams) { + // my_lib is the full API of MY_LIB + const data = my_lib.api.get("/items"); + + // my_app is the app's own services (other than the current one) + my_app.registry.add("item", data); +} +``` + +:::caution Wiring order matters +If you access another service's return value at the top level of your function (not inside a lifecycle callback), that service must already be wired. Use `priorityInit` to force a specific service to wire first, or move the call into `lifecycle.onPreInit()` or later. +::: + +## priorityInit + +By default, services within a module wire in the order they appear in the `services` object. If service A needs service B's return value during wiring, declare B in `priorityInit`: + +```typescript +CreateApplication({ + name: "my_app", + priorityInit: ["registry", "cache"], // These wire first, in this order + services: { + cache: CacheService, + registry: RegistryService, + api: ApiService, // Wires after registry and cache + worker: WorkerService, // Wires after api + }, +}); +``` + +`priorityInit` only controls ordering *within* a module. Cross-module ordering is handled by `depends`/`libraries`. diff --git a/docs/core/.archive/03-module-system/wiring.md b/docs/core/.archive/03-module-system/wiring.md new file mode 100644 index 0000000..effdc9d --- /dev/null +++ b/docs/core/.archive/03-module-system/wiring.md @@ -0,0 +1,58 @@ +--- +title: Wiring +sidebar_position: 6 +description: "How modules and services are wired, dependency ordering, and boot errors." +--- + +"Wiring" refers to the process of calling each service function and assembling the `TServiceParams` it receives. This happens during bootstrap, before any lifecycle callbacks run. + +## Dependency ordering + +Libraries are wired in topological order determined by their `depends` arrays. Given: + +``` +MY_APP + libraries: [LIB_A, LIB_B] + +LIB_B + depends: [LIB_A] +``` + +The wire order is: `boilerplate` → `LIB_A` → `LIB_B` → `MY_APP`. `LIB_A` is always wired before `LIB_B` because `LIB_B` depends on it. + +```mermaid +graph LR + BP[boilerplate] --> A[LIB_A] + A --> B[LIB_B] + B --> APP[MY_APP] +``` + +## Circular dependencies + +Circular dependencies are **not allowed and not recoverable**. If `LIB_A` depends on `LIB_B` and `LIB_B` depends on `LIB_A`, bootstrap throws: + +``` +BootstrapException: Cannot find a next lib to load + cause: BAD_SORT +``` + +The fix is to extract the shared logic into a third library that both can depend on without forming a cycle. + +## Missing dependencies + +If a library declares `depends: [LIB_X]` but the application's `libraries` array does not include `LIB_X`, bootstrap throws: + +``` +BootstrapException + cause: MISSING_DEPENDENCY +``` + +Add `LIB_X` (or an equivalent replacement) to your application's `libraries` array. + +## Service wiring order within a module + +Services within a module are wired in the order they appear in the `services` object, with `priorityInit` services wired first. See [Services — priorityInit](./services.md#priorityinit) for details and examples. + +## loadedModules + +After bootstrap completes, `internal.boot.loadedModules` is a `Map>` mapping module names to their wired service return values. `internal.boot.moduleMappings` maps module names to service constructor functions. These are primarily useful for debugging and framework-level tooling — application code should use `TServiceParams` directly. diff --git a/docs/core/.archive/04-lifecycle/_category_.json b/docs/core/.archive/04-lifecycle/_category_.json new file mode 100644 index 0000000..b5b7eba --- /dev/null +++ b/docs/core/.archive/04-lifecycle/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Lifecycle", + "position": 4, + "collapsible": true, + "collapsed": true, + "link": { + "type": "doc", + "id": "core/04-lifecycle/index" + } +} diff --git a/docs/core/.archive/04-lifecycle/execution-order.md b/docs/core/.archive/04-lifecycle/execution-order.md new file mode 100644 index 0000000..b09f8b7 --- /dev/null +++ b/docs/core/.archive/04-lifecycle/execution-order.md @@ -0,0 +1,65 @@ +--- +title: Execution Order +sidebar_position: 4 +description: "How priority controls callback order within a lifecycle stage." +--- + +Within a single stage, callbacks execute in three groups, in this order: + +1. **Positive priority** — `priority > 0`, run sequentially from highest to lowest +2. **No priority** — `priority === undefined`, run in parallel +3. **Negative priority** — `priority < 0`, run sequentially from highest to lowest (i.e. `-1` before `-100`) + +```mermaid +flowchart TD + A[Stage begins] --> B[Priority > 0\nsequential, high → low] + B --> C[No priority\nall in parallel] + C --> D[Priority < 0\nsequential, high → low] + D --> E[Stage complete] +``` + +## Examples + +```typescript +// Runs first in Bootstrap, before everything else in this stage +lifecycle.onBootstrap(connectDatabase, 1000); + +// Runs with other unprioritized Bootstrap callbacks, in parallel +lifecycle.onBootstrap(loadInitialData); +lifecycle.onBootstrap(startMetrics); +lifecycle.onBootstrap(warmCaches); + +// Runs last in Bootstrap, after all others +lifecycle.onBootstrap(logBootComplete, -1); +``` + +## Why sequential for prioritized callbacks? + +Unprioritized callbacks are assumed to be independent and are awaited with `Promise.all`. Prioritized callbacks are assumed to have explicit ordering requirements — so they run with `await` in sequence to guarantee A completes before B starts. + +## Practical patterns + +**Ensure a connection is ready before dependent services initialize:** + +```typescript +// In DatabaseService +lifecycle.onBootstrap(async () => { + await pool.connect(); +}, 100); // high positive priority — runs before lower-priority Bootstrap callbacks + +// In CacheService (which needs the db connection) +lifecycle.onBootstrap(async () => { + const warmData = await db.query("SELECT ..."); + cache.set("initial", warmData); +}); +// No priority — safe to run after db has connected (assuming both are in same module +// and db has priority) +``` + +**Ensure something runs absolutely last in a stage:** + +```typescript +lifecycle.onReady(() => { + logger.info("all ready callbacks have run"); +}, -1000); +``` diff --git a/docs/core/.archive/04-lifecycle/hooks.md b/docs/core/.archive/04-lifecycle/hooks.md new file mode 100644 index 0000000..8141b9c --- /dev/null +++ b/docs/core/.archive/04-lifecycle/hooks.md @@ -0,0 +1,90 @@ +--- +title: Hooks +sidebar_position: 3 +description: "All seven lifecycle hook methods and how to use them." +--- + +Every service receives `lifecycle` on `TServiceParams`. It exposes seven registration methods — one per stage. All methods accept an optional `priority` number. + +```typescript +type TLifeCycleRegister = (callback: () => void | Promise, priority?: number) => void; +``` + +## onPreInit + +```typescript +lifecycle.onPreInit(() => { + // Runs at PreInit stage — before config is sourced +}); +``` + +## onPostConfig + +```typescript +lifecycle.onPostConfig(() => { + // Config is validated and available + logger.info({ url: config.my_app.BASE_URL }, "loaded config"); +}); +``` + +## onBootstrap + +```typescript +lifecycle.onBootstrap(async () => { + // Main initialization — establish connections, load data + await db.connect(); +}); +``` + +## onReady + +```typescript +lifecycle.onReady(() => { + // Application is fully started + server.listen(config.my_app.PORT); +}); +``` + +## onPreShutdown + +```typescript +lifecycle.onPreShutdown(() => { + // Stop accepting new work + server.close(); +}); +``` + +## onShutdownStart + +```typescript +lifecycle.onShutdownStart(async () => { + // Flush and close + await db.end(); + await queue.drain(); +}); +``` + +## onShutdownComplete + +```typescript +lifecycle.onShutdownComplete(() => { + // Final cleanup — best effort + logger.info("shutdown complete"); +}); +``` + +## Priority + +All hook methods accept an optional second argument: a priority number. This controls the execution order *within* the stage. See [Execution Order](./execution-order.md) for the full rules. + +```typescript +// This callback runs before unprioritized ones in the same stage +lifecycle.onBootstrap(connectToDatabase, 100); + +// This callback runs after unprioritized ones +lifecycle.onBootstrap(optionalMetrics, -10); +``` + +## Late registration + +If you register a callback for a stage that has **already completed**, the callback is called immediately (except for shutdown stages, which are silently dropped). This handles scenarios where services are added dynamically after boot. diff --git a/docs/core/.archive/04-lifecycle/index.md b/docs/core/.archive/04-lifecycle/index.md new file mode 100644 index 0000000..3266a89 --- /dev/null +++ b/docs/core/.archive/04-lifecycle/index.md @@ -0,0 +1,30 @@ +--- +title: Lifecycle +sidebar_label: Overview +sidebar_position: 1 +description: "Lifecycle stages, hooks, and execution order in Digital Alchemy Core." +--- + +The lifecycle is a sequence of named stages that run after all services are wired. Services register callbacks for stages they care about; the framework executes them in order. + +| | | +|---|---| +| [Stages](./stages.md) | The seven stages: what each one means and when it runs | +| [Hooks](./hooks.md) | How to register callbacks; all seven hook methods on `TLifecycleBase` | +| [Execution Order](./execution-order.md) | Priority-based ordering within a stage; sequential vs parallel | + +## Quick reference + +**Boot stages** (run once, in order): + +``` +PreInit → PostConfig → Bootstrap → Ready +``` + +**Shutdown stages** (run once, in order, on SIGTERM/SIGINT or teardown()): + +``` +PreShutdown → ShutdownStart → ShutdownComplete +``` + +Within each stage, callbacks are sorted by **priority**: positive values first (highest to lowest, sequential), then unprioritized callbacks (parallel), then negative values (highest to lowest, sequential). diff --git a/docs/core/.archive/04-lifecycle/stages.md b/docs/core/.archive/04-lifecycle/stages.md new file mode 100644 index 0000000..995c6a0 --- /dev/null +++ b/docs/core/.archive/04-lifecycle/stages.md @@ -0,0 +1,73 @@ +--- +title: Stages +sidebar_position: 2 +description: "The seven lifecycle stages in Digital Alchemy Core and what they mean." +--- + +The lifecycle stages are defined in `LIFECYCLE_STAGES` (from `@digital-alchemy/core`). They run in a fixed order — you cannot change the sequence, only the priority of callbacks *within* a stage. + +## Boot stages + +### PreInit + +The first stage. Runs before config is applied. Use for initialization that must happen before any configuration values are processed — for example, setting up log transports or registering external systems that the config system will query. + +Config values read here may not yet reflect sourced values (only defaults). + +### PostConfig + +Configuration is now validated and fully sourced. Required config entries are checked here — if any are missing, bootstrap throws `REQUIRED_CONFIGURATION_MISSING` and halts. + +This is the first stage where it's safe to read `config.*` values and make decisions based on them. + +```typescript +lifecycle.onPostConfig(() => { + if (!config.my_app.DATABASE_URL) { + // won't reach here — required config is already checked before PostConfig callbacks + } + logger.info({ url: config.my_app.DATABASE_URL }, "config loaded"); +}); +``` + +### Bootstrap + +Main initialization. All services are wired, config is validated, and all lifecycle tools are available. This is the right place for: + +- Establishing external connections (database, HTTP clients) +- Loading initial data +- Starting internal state machines + +### Ready + +The application is fully started. Use this for: + +- Opening listening sockets / starting HTTP servers +- Beginning job processing +- Emitting an event to signal that the app is available + +Everything registered with `onReady` runs after `onBootstrap` has completed for all services. + +## Shutdown stages + +Shutdown is triggered automatically on `SIGTERM` or `SIGINT`, or manually via `app.teardown()`. + +### PreShutdown + +First signal that shutdown is coming. Use for stopping incoming work (pausing queues, closing ingress, signaling readiness probes). The app is still fully functional at this point. + +### ShutdownStart + +Begin active shutdown. Close connections, flush buffers, cancel scheduled jobs. The scheduler automatically cancels all active cron/interval jobs here. + +### ShutdownComplete + +Final cleanup. The lifecycle manager removes its event listeners after this stage. Any logging here is best-effort — output channels may already be closing. + +## The `LIFECYCLE_STAGES` constant + +If you need to iterate over stages programmatically: + +```typescript +import { LIFECYCLE_STAGES } from "@digital-alchemy/core"; +// ["PreInit", "PostConfig", "Bootstrap", "Ready", "PreShutdown", "ShutdownStart", "ShutdownComplete"] +``` diff --git a/docs/core/.archive/05-configuration/_category_.json b/docs/core/.archive/05-configuration/_category_.json new file mode 100644 index 0000000..7efad71 --- /dev/null +++ b/docs/core/.archive/05-configuration/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Configuration", + "position": 5, + "collapsible": true, + "collapsed": true, + "link": { + "type": "doc", + "id": "core/05-configuration/index" + } +} diff --git a/docs/core/.archive/05-configuration/defining.md b/docs/core/.archive/05-configuration/defining.md new file mode 100644 index 0000000..4fa80db --- /dev/null +++ b/docs/core/.archive/05-configuration/defining.md @@ -0,0 +1,65 @@ +--- +title: Defining Configuration +sidebar_position: 2 +description: "How to declare configuration entries in a Digital Alchemy module." +--- + +Configuration entries are declared as part of `CreateApplication` or `CreateLibrary`, inside the `configuration` property. Each entry has a `type` and optional metadata. + +## Basic example + +```typescript +import { CreateLibrary } from "@digital-alchemy/core"; + +export const MY_LIB = CreateLibrary({ + name: "my_lib", + configuration: { + API_URL: { + type: "string", + description: "Base URL for the API", + required: true, // Boot fails with REQUIRED_CONFIGURATION_MISSING if unset + }, + TIMEOUT_MS: { + type: "number", + description: "Request timeout in milliseconds", + default: 5000, + }, + DEBUG_MODE: { + type: "boolean", + default: false, + }, + }, + services: { ... }, +}); +``` + +## Common properties + +| Property | Description | +|---|---| +| `type` | Required. One of `"string"`, `"number"`, `"boolean"`, `"string[]"`, `"record"` | +| `default` | Value used if no source provides one | +| `required` | If `true`, bootstrap throws `REQUIRED_CONFIGURATION_MISSING` when no value is found | +| `description` | Human-readable description; useful for auto-generated config docs | +| `enum` | (string only) Array of allowed values; TypeScript narrows the type to a union | + +## required vs default + +A `required: true` entry with no value causes bootstrap to halt at `PostConfig`. A `default` value prevents this by ensuring there is always a value. You can use both — the default is used when no external source provides a value, and `required` is satisfied as long as *any* source (including the default) provides one. + +:::tip +Use `required: true` without a `default` for secrets (API keys, database URLs) that must be explicitly provided at runtime. This gives a clear boot failure rather than a confusing runtime error. +::: + +## Boilerplate configuration + +Every application automatically gets these configuration entries from the boilerplate: + +| Key | Type | Default | Source | +|---|---|---|---| +| `boilerplate.LOG_LEVEL` | enum | `"info"` | env, argv | +| `boilerplate.NODE_ENV` | string | `process.env.NODE_ENV \|\| "local"` | env | +| `boilerplate.IS_TEST` | boolean | auto-detected | env | +| `boilerplate.CONFIG` | string | — | argv only | + +`boilerplate.CONFIG` lets you specify a config file path via `--config ./my.config.yaml` on the command line. diff --git a/docs/core/.archive/05-configuration/index.md b/docs/core/.archive/05-configuration/index.md new file mode 100644 index 0000000..c489725 --- /dev/null +++ b/docs/core/.archive/05-configuration/index.md @@ -0,0 +1,38 @@ +--- +title: Configuration +sidebar_label: Overview +sidebar_position: 1 +description: "Type-safe configuration in Digital Alchemy Core." +--- + +The configuration system turns external values (environment variables, config files, CLI flags) into typed, validated objects available on `TServiceParams` as `config.module_name.KEY`. + +| | | +|---|---| +| [Defining](./defining.md) | Declare config entries as part of a module | +| [Types](./types.md) | All supported config types: string, number, boolean, enum, string[], record | +| [Sources](./sources.md) | Where values come from: env, argv, files, bootstrap overrides | +| [Using](./using.md) | Accessing config in services; when values are available | + +## How it works + +Config definitions live in the module that owns them. At boot, the framework collects all definitions, loads values from available sources, and validates required entries. After `PostConfig`, `config.*` is fully typed and safe to read. + +```typescript +// Define +CreateLibrary({ + name: "my_lib", + configuration: { + API_URL: { type: "string", required: true }, + TIMEOUT: { type: "number", default: 30 }, + VERBOSE: { type: "boolean", default: false }, + }, +}); + +// Use +export function MyService({ config }: TServiceParams) { + lifecycle.onPostConfig(() => { + fetch(config.my_lib.API_URL, { signal: AbortSignal.timeout(config.my_lib.TIMEOUT * 1000) }); + }); +} +``` diff --git a/docs/core/.archive/05-configuration/sources.md b/docs/core/.archive/05-configuration/sources.md new file mode 100644 index 0000000..61c9671 --- /dev/null +++ b/docs/core/.archive/05-configuration/sources.md @@ -0,0 +1,91 @@ +--- +title: Sources +sidebar_position: 4 +description: "Where configuration values come from and the merge order." +--- + +Configuration values can come from multiple sources. The priority order, from lowest to highest: + +1. **Definition defaults** — `default:` in the module's config definition +2. **Bootstrap overrides** — values passed directly to `bootstrap({ configuration: { ... } })` +3. **Environment variables** — from the process environment or `.env` files +4. **CLI arguments** — `--KEY value` or `--KEY=value` +5. **Config files** — `.json`, `.yaml`, or `.ini` files + +Later sources win. A CLI argument overrides an env var; an env var overrides a bootstrap override; a bootstrap override overrides the default. + +## Environment variables + +Case-insensitive; `-` and `_` are interchangeable. The following are all equivalent for a config key `CACHE_PROVIDER`: + +```bash +CACHE_PROVIDER=redis tsx main.mts +cache-provider=redis tsx main.mts +CACHE_PROVIDER=redis tsx main.mts +``` + +### .env files + +The framework automatically loads `.env` files using [@dotenvx/dotenvx](https://www.npmjs.com/package/@dotenvx/dotenvx), which supports encrypted secrets. Load order: + +1. `--env-file ./path` from CLI +2. `envFile` option in bootstrap +3. `.env` in the current working directory + +```bash +tsx main.mts --env-file ./production.env +``` + +## CLI arguments + +```bash +tsx main.mts --PORT=4000 +tsx main.mts --PORT 4000 +tsx main.mts --FEATURE_FLAG # boolean true +``` + +Use `--config ./path` to point to a config file: + +```bash +tsx main.mts --config ./config/dev.yaml +``` + +## Config files + +Supported formats: `json`, `yaml`, `ini`. The file loader searches these paths (in order): + +- `/etc/{app_name}` (Linux/macOS only) +- `.{app_name}` in the current directory +- `.{app_name}` recursively up the directory tree +- `~/.config/{app_name}` + +Extensions checked per path: auto-detect → `.json` → `.ini` → `.yaml` → `.yml` + +Auto-detect attempts JSON first, then YAML, then falls back to INI. + +## Bootstrap overrides + +Values passed to `bootstrap()` have higher priority than defaults but lower priority than env/CLI/files. Use them for environment-specific values set at the entrypoint level: + +```typescript +await MY_APP.bootstrap({ + configuration: { + boilerplate: { LOG_LEVEL: "debug" }, + my_app: { API_URL: "https://staging.example.com" }, + }, +}); +``` + +## Disabling sources + +For testing or constrained environments, you can disable specific loaders: + +```typescript +await MY_APP.bootstrap({ + configSources: { + env: false, + file: false, + // argv: true (default) + }, +}); +``` diff --git a/docs/core/.archive/05-configuration/types.md b/docs/core/.archive/05-configuration/types.md new file mode 100644 index 0000000..209cf6c --- /dev/null +++ b/docs/core/.archive/05-configuration/types.md @@ -0,0 +1,68 @@ +--- +title: Config Types +sidebar_position: 3 +description: "All supported configuration types in Digital Alchemy Core." +--- + +## string + +Plain string value. Optionally restricted to a set of allowed values with `enum`. + +```typescript +CACHE_PROVIDER: { type: "string", default: "memory" } + +// With enum — TypeScript narrows to a union +LOG_FORMAT: { + type: "string", + enum: ["json", "pretty"], + default: "pretty", +} as StringConfig<"json" | "pretty"> +``` + +The `as StringConfig<"json" | "pretty">` cast is needed to propagate the union type to `config.my_lib.LOG_FORMAT`. Without it, the type is inferred as `string`. + +## number + +Numeric value. Accepts integers and floats. + +```typescript +PORT: { type: "number", default: 3000 } +BATCH_SIZE: { type: "number", default: 100, required: true } +``` + +When sourced from environment variables or CLI, the string is cast to a number. Non-numeric values are treated as `NaN`. + +## boolean + +```typescript +FEATURE_FLAG: { type: "boolean", default: false } +``` + +From environment variables: `"true"`, `"1"`, `"yes"` → `true`; anything else → `false`. + +From CLI: passing `--FEATURE_FLAG` (no value) is treated as `true`. + +## string[] + +Array of strings. When sourced from environment variables, the value is split on commas. + +```typescript +ALLOWED_ORIGINS: { + type: "string[]", + default: ["http://localhost:3000"], +} +// ALLOWED_ORIGINS=http://a.com,http://b.com → ["http://a.com", "http://b.com"] +``` + +## record + +A `Record` — key/value pairs of strings. Useful for arbitrary maps like HTTP headers or tag sets. + +```typescript +DEFAULT_HEADERS: { + type: "record", + default: { "X-Source": "my-app" }, +} +``` + +From environment variables or CLI, format is `key=value,key2=value2`. diff --git a/docs/core/.archive/05-configuration/using.md b/docs/core/.archive/05-configuration/using.md new file mode 100644 index 0000000..6651d4c --- /dev/null +++ b/docs/core/.archive/05-configuration/using.md @@ -0,0 +1,70 @@ +--- +title: Using Config in Services +sidebar_position: 5 +description: "How to access configuration values in services." +--- + +Config is available on `TServiceParams` as `config`, a typed proxy keyed by module name. + +## When config is safe to read + +Config values are available immediately on `TServiceParams`, but **sourced values aren't applied until after `PostConfig`**. Reading config at the top level of your service function (during wiring) returns the definition's default. + +```typescript +export function ApiService({ config, lifecycle }: TServiceParams) { + // ⚠️ During wiring: returns default, not the sourced value + console.log(config.my_lib.API_URL); + + // ✅ After PostConfig: returns the fully sourced, validated value + lifecycle.onPostConfig(() => { + console.log(config.my_lib.API_URL); + }); + + // ✅ onBootstrap and onReady also happen after PostConfig + lifecycle.onBootstrap(async () => { + await connectTo(config.my_lib.API_URL); + }); +} +``` + +## Typed access + +Config types flow through automatically via the module's `configuration` definition: + +```typescript +config.my_lib.API_URL // string +config.my_lib.TIMEOUT_MS // number +config.my_lib.DEBUG_MODE // boolean +config.my_lib.ALLOWED_ORIGINS // string[] +config.boilerplate.LOG_LEVEL // "silent" | "trace" | "debug" | "info" | "warn" | "error" | "fatal" +``` + +## Watching for changes + +Config can be updated at runtime (via `config.set()` or the `merge()` method). To react to changes: + +```typescript +export function DynamicService({ config, internal }: TServiceParams) { + lifecycle.onBootstrap(() => { + internal.boilerplate.configuration.onUpdate((project, property) => { + if (project === "my_lib" && property === "FEATURE_FLAG") { + logger.info("FEATURE_FLAG changed to", config.my_lib.FEATURE_FLAG); + } + }); + }); +} +``` + +## Testing with config overrides + +The `TestRunner` makes it easy to test with specific config values: + +```typescript +await TestRunner({ target: MY_APP }) + .configure({ my_lib: { API_URL: "http://test-server" } }) + .run(({ config }) => { + expect(config.my_lib.API_URL).toBe("http://test-server"); + }); +``` + +See [Testing — Configuration Overrides](../07-testing/test-runner.md#configuration-overrides) for more detail. diff --git a/docs/core/.archive/06-builtins/_category_.json b/docs/core/.archive/06-builtins/_category_.json new file mode 100644 index 0000000..48bc707 --- /dev/null +++ b/docs/core/.archive/06-builtins/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Built-in Services", + "position": 6, + "collapsible": true, + "collapsed": true, + "link": { + "type": "doc", + "id": "core/06-builtins/index" + } +} diff --git a/docs/core/.archive/06-builtins/event-emitter.md b/docs/core/.archive/06-builtins/event-emitter.md new file mode 100644 index 0000000..689ea90 --- /dev/null +++ b/docs/core/.archive/06-builtins/event-emitter.md @@ -0,0 +1,61 @@ +--- +title: Event Emitter +sidebar_position: 4 +description: "Application-wide EventEmitter for cross-service pub/sub in Digital Alchemy Core." +--- + +`event` on `TServiceParams` is a Node.js `EventEmitter` shared across every service in the application. It provides a decoupled pub/sub channel for cross-service communication. + +## Usage + +```typescript +export function PublisherService({ event }: TServiceParams) { + lifecycle.onReady(() => { + event.emit("my_app:data_loaded", { count: 42 }); + }); +} + +export function SubscriberService({ event, lifecycle }: TServiceParams) { + lifecycle.onBootstrap(() => { + event.on("my_app:data_loaded", ({ count }) => { + logger.info({ count }, "data loaded"); + }); + }); +} +``` + +Register listeners in a lifecycle callback (not at the top level of your service function) so cleanup at teardown works correctly. + +## Lifecycle + +- The event emitter is **created fresh** at each bootstrap +- `setMaxListeners(0)` is called automatically — no listener count warnings +- The emitter is **cleaned up** at teardown — any listeners registered outside a lifecycle callback may behave unexpectedly on re-bootstrap (in tests) + +## Framework error events + +The framework emits specific events for unhandled errors: + +| Event | When | +|---|---| +| `DIGITAL_ALCHEMY_NODE_GLOBAL_ERROR` | Unhandled promise rejection or uncaught exception | +| `DIGITAL_ALCHEMY_APPLICATION_ERROR` | Error thrown by the application module | +| `DIGITAL_ALCHEMY_LIBRARY_ERROR` | Error thrown by a specific library (event name includes `:libraryName`) | + +```typescript +import { DIGITAL_ALCHEMY_NODE_GLOBAL_ERROR } from "@digital-alchemy/core"; + +event.on(DIGITAL_ALCHEMY_NODE_GLOBAL_ERROR, (error) => { + externalMonitoring.capture(error); +}); +``` + +## Naming conventions + +Use namespaced event names to avoid collisions between modules: `module_name:event_name`. For example: + +```typescript +event.emit("hass:state_changed", { entity_id, new_state }); +event.emit("synapse:entity_registered", { id, domain }); +event.emit("my_app:job_complete", { jobId, result }); +``` diff --git a/docs/core/.archive/06-builtins/index.md b/docs/core/.archive/06-builtins/index.md new file mode 100644 index 0000000..4b138df --- /dev/null +++ b/docs/core/.archive/06-builtins/index.md @@ -0,0 +1,15 @@ +--- +title: Built-in Services +sidebar_label: Overview +sidebar_position: 1 +description: "The built-in services available on TServiceParams in every Digital Alchemy app." +--- + +These services are wired by the boilerplate before any user code runs, making them available on `TServiceParams` in every service function. + +| | | +|---|---| +| [Logger](./logger.md) | Context-aware structured logging with levels and stream targets | +| [Scheduler](./scheduler.md) | Cron, interval, sliding window, and one-shot timers | +| [Event Emitter](./event-emitter.md) | Application-wide `EventEmitter` for cross-service pub/sub | +| [Utilities](./utilities.md) | `is` type guards, `sleep`, `debounce`, time constants | diff --git a/docs/core/.archive/06-builtins/logger.md b/docs/core/.archive/06-builtins/logger.md new file mode 100644 index 0000000..4407a02 --- /dev/null +++ b/docs/core/.archive/06-builtins/logger.md @@ -0,0 +1,98 @@ +--- +title: Logger +sidebar_position: 2 +description: "The built-in context-aware logger in Digital Alchemy Core." +--- + +Every service receives a `logger` instance on `TServiceParams`. It is pre-configured with the service's context string (`module_name:service_key`) so every log line is automatically tagged. + +## Log levels + +In order from most verbose to least: `trace` → `debug` → `info` → `warn` → `error` → `fatal`. Setting `LOG_LEVEL` to a value hides all levels below it. `silent` suppresses all output. + +Control the level via config: + +```bash +LOG_LEVEL=debug tsx main.mts +``` + +Or at bootstrap: + +```typescript +await MY_APP.bootstrap({ + configuration: { boilerplate: { LOG_LEVEL: "warn" } }, +}); +``` + +## Usage + +All methods accept either a message string or an object + message: + +```typescript +logger.info("application started"); +logger.info({ port: 3000 }, "listening on port %s", 3000); +logger.warn({ attempt: retries }, "retrying request"); +logger.error({ error }, "request failed"); +logger.debug("cache miss for key %s", key); +logger.trace({ payload }, "raw payload received"); +``` + +The object argument is included as structured data in JSON output and displayed inline in pretty format. + +## Pretty vs JSON output + +By default, the logger emits human-readable output in development: + +``` +[Mon 09:00:00.000] [INFO][my_app:my_service]: application started +``` + +In production, switch to JSON for log aggregation pipelines. The format is controlled by the `DigitalAlchemyLogger.setPrettyFormat(false)` API or by the deployment environment. + +## Adding log targets + +The logger supports multiple output streams. Add targets with `logger.addTarget()` on `DigitalAlchemyLogger` (accessible via `internal.boilerplate.logger`): + +```typescript +lifecycle.onBootstrap(() => { + internal.boilerplate.logger.addTarget((message, data) => { + datadogLogger.log(message, data); + }); +}); +``` + +## Merging static data into every line + +Pass `loggerOptions.mergeData` at bootstrap to include static fields in every log line: + +```typescript +await MY_APP.bootstrap({ + loggerOptions: { + mergeData: { + service: "payments-api", + env: process.env.NODE_ENV, + host: hostname(), + }, + }, +}); +``` + +## ALS integration + +With `loggerOptions: { als: true }`, the logger automatically pulls request-scoped data (correlation IDs, request IDs, timing) from AsyncLocalStorage and includes it in every log line emitted within that async context. See [Async Local Storage](../08-advanced/async-local-storage.md). + +## Replacing the logger + +Declare merge on `ReplacementLogger` to swap the underlying logger implementation (e.g. Pino, Winston): + +```typescript +import type { PinoLogger } from "./my-pino-setup.mts"; + +declare module "@digital-alchemy/core" { + export interface ReplacementLogger { + logger: PinoLogger; + } +} +``` + +Then call `internal.boilerplate.logger.setBaseLogger(myPinoInstance)` at boot. diff --git a/docs/core/.archive/06-builtins/scheduler.md b/docs/core/.archive/06-builtins/scheduler.md new file mode 100644 index 0000000..4254c50 --- /dev/null +++ b/docs/core/.archive/06-builtins/scheduler.md @@ -0,0 +1,128 @@ +--- +title: Scheduler +sidebar_position: 3 +description: "Cron, interval, sliding, and one-shot timers in Digital Alchemy Core." +--- + +The `scheduler` on `TServiceParams` is a function that accepts a context string and returns a `DigitalAlchemyScheduler`. All scheduled work is automatically cancelled at `ShutdownStart`. + +```typescript +export function WorkerService({ scheduler, context }: TServiceParams) { + const schedule = scheduler(context); + // Now use schedule.cron / schedule.interval / schedule.sliding / etc. +} +``` + +All schedule methods return a `RemoveCallback` — call it (or its `.remove()` property) to cancel the schedule before shutdown. + +## cron + +Schedule work on a cron expression. Accepts a single schedule or an array of schedules: + +```typescript +import { CronExpression } from "@digital-alchemy/core"; + +const stop = schedule.cron({ + schedule: CronExpression.EVERY_MINUTE, + exec: async () => { + await processQueue(); + }, +}); + +// Cancel early +stop(); +// or: stop.remove() +``` + +### CronExpression + +`CronExpression` is an enum with ~70 presets: `EVERY_SECOND`, `EVERY_5_MINUTES`, `EVERY_HOUR`, `EVERY_DAY_AT_MIDNIGHT`, `EVERY_WEEK`, `MONDAY_TO_FRIDAY_AT_9AM`, and many more. Use it instead of raw cron strings. + +```typescript +CronExpression.EVERY_30_MINUTES +CronExpression.EVERY_DAY_AT_NOON +CronExpression.MONDAY_TO_FRIDAY_AT_9AM +``` + +Raw cron strings also work: + +```typescript +schedule.cron({ schedule: "0 */2 * * *", exec: doThing }); + +// Multiple schedules, same callback +schedule.cron({ schedule: ["0 9 * * 1-5", "0 17 * * 1-5"], exec: doThing }); +``` + +## interval + +Repeat on a fixed millisecond interval. Starts at `onReady`: + +```typescript +const stop = schedule.interval({ + interval: 5000, // ms + exec: async () => { + await checkHealth(); + }, +}); +``` + +## sliding + +Schedule using a dynamic "next execution time" — recalculated on each trigger. Useful for backing off, rate limiting, or anything where the interval varies: + +```typescript +schedule.sliding({ + reset: CronExpression.EVERY_MINUTE, // How often to recalculate next time + next: () => { + const next = getNextProcessingTime(); // Return a Date, Dayjs, timestamp, or undefined + return next; // undefined = skip + }, + exec: async () => { + await processNextBatch(); + }, +}); +``` + +## setTimeout / setInterval + +One-shot and repeating timers that start after `onReady`, automatically cleaned up at shutdown: + +```typescript +// Fire once after 10 seconds +schedule.setTimeout(doThing, 10_000); + +// Or with duration-style offset +schedule.setTimeout(doThing, "10s"); +schedule.setTimeout(doThing, [10, "second"]); + +// Repeat every 5 seconds +const stop = schedule.setInterval(doThing, 5_000); +``` + +## sleep + +Awaitable sleep that can be cancelled early. Available both from `scheduler(context).sleep` and as a standalone import: + +```typescript +import { sleep } from "@digital-alchemy/core"; + +await sleep(5000); // Wait 5 seconds +await sleep("30s"); // Wait 30 seconds +await sleep([1, "minute"]); // Wait 1 minute + +// Cancellable sleep +const timer = sleep(60_000); +setTimeout(() => timer.kill("continue"), 1000); // Wake up early, continue execution +await timer; +``` + +`timer.kill("stop")` cancels and rejects. `timer.kill("continue")` cancels and resolves. + +## TOffset + +All time-accepting methods use `TOffset`, which accepts: +- **number** — milliseconds +- **string** — partial ISO 8601 duration: `"5s"`, `"30m"`, `"2h"`, `"1h30m"` +- **tuple** — `[quantity, unit]`: `[5, "second"]`, `[1, "hour"]` +- **Duration** — a Day.js duration object +- **function** — any of the above, wrapped in `() => ...` for dynamic calculation diff --git a/docs/core/.archive/06-builtins/utilities.md b/docs/core/.archive/06-builtins/utilities.md new file mode 100644 index 0000000..ac8964a --- /dev/null +++ b/docs/core/.archive/06-builtins/utilities.md @@ -0,0 +1,121 @@ +--- +title: Utilities +sidebar_position: 5 +description: "Built-in utility functions and type guards available in Digital Alchemy Core." +--- + +Digital Alchemy exports several utility functions and constants that are used throughout the framework and useful in application code. + +## is — type guards + +`is` is an instance of `IsIt`, a collection of type guard methods. Import it directly or access it via `internal.utils.is`. + +```typescript +import { is } from "@digital-alchemy/core"; + +is.string(value) // value is string +is.number(value) // value is number (NaN returns false) +is.boolean(value) // value is boolean +is.array(value) // value is Array +is.object(value) // value is object (not null, not array) +is.function(value) // value is function +is.undefined(value) // value is undefined +is.symbol(value) // value is symbol +is.date(value) // value is valid Date +is.dayjs(value) // value is valid Dayjs instance + +is.empty(value) // true for empty string, array, Map, Set, object, or undefined +is.equal(a, b) // deep equality (uses Node's isDeepStrictEqual) +is.even(n) // n % 2 === 0 +is.unique(array) // returns [...new Set(array)] +is.random(array) // returns a random element +``` + +`is.empty` works across types: +```typescript +is.empty(undefined) // true +is.empty("") // true +is.empty([]) // true +is.empty(new Map()) // true +is.empty({}) // true +is.empty("hello") // false +is.empty([1, 2]) // false +``` + +## sleep + +Awaitable, cancellable sleep. See [Scheduler — sleep](./scheduler.md#sleep) for full docs. + +```typescript +import { sleep } from "@digital-alchemy/core"; + +await sleep(1000); // 1 second +await sleep("30s"); +await sleep([5, "minute"]); +``` + +## debounce + +Wait for a quiet period before proceeding. Extends the wait if called again within the window. + +```typescript +import { debounce } from "@digital-alchemy/core"; + +async function onChange() { + await debounce("state-update", 500); // wait 500ms of quiet + processChanges(); +} +``` + +The first argument is an identifier string — multiple callers with the same identifier share the debounce window. A new call before the window expires resets the timer. + +## Time constants + +Millisecond constants for readable durations: + +```typescript +import { SECOND, MINUTE, HOUR, DAY, WEEK, YEAR } from "@digital-alchemy/core"; + +SECOND // 1_000 +MINUTE // 60_000 +HOUR // 3_600_000 +DAY // 86_400_000 +WEEK // 604_800_000 +YEAR // 31_536_000_000 +``` + +Example: + +```typescript +schedule.setTimeout(doThing, 5 * MINUTE); +const isStale = Date.now() - lastSeen > 2 * HOUR; +``` + +## each / eachSeries / eachLimit + +Async iteration utilities: + +```typescript +import { each, eachSeries, eachLimit } from "@digital-alchemy/core"; + +// Parallel (Promise.all) +await each(items, async item => { await process(item); }); + +// Sequential +await eachSeries(items, async item => { await process(item); }); + +// Concurrency-limited +await eachLimit(items, 5, async item => { await process(item); }); +``` + +## relativeDate + +Human-readable relative time: + +```typescript +internal.utils.relativeDate("2024-01-01T00:00:00Z"); +// "1 yr. ago" + +internal.utils.relativeDate(Date.now() - 30_000); +// "30 sec. ago" +``` diff --git a/docs/core/.archive/07-testing/_category_.json b/docs/core/.archive/07-testing/_category_.json new file mode 100644 index 0000000..ff0cf01 --- /dev/null +++ b/docs/core/.archive/07-testing/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Testing", + "position": 7, + "collapsible": true, + "collapsed": true, + "link": { + "type": "doc", + "id": "core/07-testing/index" + } +} diff --git a/docs/core/.archive/07-testing/create-module.md b/docs/core/.archive/07-testing/create-module.md new file mode 100644 index 0000000..f33e8a2 --- /dev/null +++ b/docs/core/.archive/07-testing/create-module.md @@ -0,0 +1,116 @@ +--- +title: createModule +sidebar_position: 3 +description: "Using createModule to build, extend, and transform modules for testing." +--- + +`createModule` is a builder utility that wraps an existing application or library, letting you modify it before use. It is especially useful in testing scenarios where you need a variation of a module. + +## Creating from an existing module + +```typescript +import { createModule } from "@digital-alchemy/core"; + +const base = createModule.fromApplication(MY_APPLICATION); +// or +const base = createModule.fromLibrary(MY_LIB); +``` + +## Extension API + +Call `.extend()` to get a `ModuleExtension` builder. Methods can be chained: + +```typescript +const runner = createModule + .fromApplication(MY_APPLICATION) + .extend() + .replaceLibrary(LIB_MOCK_HTTP) // swap a library + .appendService(DebugService) // add an extra service + .omitService("analytics") // exclude a service + .toTest(); // → TestRunner +``` + +### appendLibrary(library) + +Add a library not in the original module: + +```typescript +.appendLibrary(LIB_EXTRA_TOOLS) +``` + +### appendService(name, service) + +Add an extra service to the module: + +```typescript +.appendService("debug", function DebugService({ logger }) { + logger.info("debug service attached"); +}) +``` + +### replaceLibrary(library) + +Swap a library by name. The replacement must have the same `name` as the one it replaces: + +```typescript +.replaceLibrary(LIB_MOCK_HTTP) // replaces whichever library has name "http" +``` + +### replaceService(name, service) + +Replace a specific service within the module: + +```typescript +.replaceService("api", MockApiService) +``` + +### pickService(...names) + +Keep only the listed services; discard all others: + +```typescript +.pickService("registry", "cache") +``` + +### omitService(...names) + +Exclude the listed services; keep all others: + +```typescript +.omitService("analytics", "telemetry") +``` + +### rebuild(services) + +Replace the entire service map: + +```typescript +.rebuild({ api: MockApiService, worker: MockWorkerService }) +``` + +## Exporting the result + +After chaining `.extend()` methods, convert to the target type: + +```typescript +.toApplication() // → ApplicationDefinition +.toLibrary() // → LibraryDefinition +.toTest() // → TestRunner (shorthand for TestRunner({ target: .toApplication() })) +``` + +## Example: integration test with selective mocking + +```typescript +const runner = createModule + .fromApplication(MY_APP) + .extend() + .replaceLibrary(LIB_MOCK_DB) + .omitService("metrics") + .toTest() + .configure({ my_app: { BATCH_SIZE: 10 } }); + +const app = await runner.run(({ my_app }) => { + expect(my_app.processor.processedCount).toBe(10); +}); +await app.teardown(); +``` diff --git a/docs/core/.archive/07-testing/index.md b/docs/core/.archive/07-testing/index.md new file mode 100644 index 0000000..f7e0ded --- /dev/null +++ b/docs/core/.archive/07-testing/index.md @@ -0,0 +1,36 @@ +--- +title: Testing +sidebar_label: Overview +sidebar_position: 1 +description: "Testing Digital Alchemy applications and libraries with TestRunner." +--- + +Digital Alchemy has first-class testing support built into the core package. The `TestRunner` constructs a minimal wrapper application around your module, runs it, and gives you access to `TServiceParams` inside your test function — no mocking frameworks required for the framework itself. + +| | | +|---|---| +| [TestRunner](./test-runner.md) | Builder API: configure, run, teardown, emitLogs | +| [createModule](./create-module.md) | Extend or transform a module for testing | +| [Test Lifecycle](./test-lifecycle.md) | setup, run, teardown; working with fake timers | +| [Module Replacements](./module-replacements.md) | appendLibrary, appendService, replaceLibrary, pick/omit services | + +## Quick example + +```typescript +import { TestRunner } from "@digital-alchemy/core"; +import { MY_APP } from "./application.mts"; + +describe("MyService", () => { + it("does the thing", async () => { + const app = await TestRunner({ target: MY_APP }) + .configure({ my_app: { FEATURE_FLAG: true } }) + .run(({ my_app }) => { + expect(my_app.my_service.result).toBe("expected"); + }); + + await app.teardown(); + }); +}); +``` + +Tests run real boot and teardown cycles. By default, logging is suppressed (`customLogger: noop`). Call `.emitLogs()` on the runner to see output while debugging. diff --git a/docs/core/.archive/07-testing/module-replacements.md b/docs/core/.archive/07-testing/module-replacements.md new file mode 100644 index 0000000..7200f53 --- /dev/null +++ b/docs/core/.archive/07-testing/module-replacements.md @@ -0,0 +1,89 @@ +--- +title: Module Replacements +sidebar_position: 5 +description: "Append, replace, pick, and omit services and libraries in tests." +--- + +`TestRunner` provides several methods to manipulate which services and libraries load in a test. These let you isolate the code under test from external resources. + +## appendLibrary + +Add an extra library beyond what the target module declares. The library is included in the overall dependency graph: + +```typescript +TestRunner({ target: MY_APP }) + .appendLibrary(LIB_MOCK_ASSISTANT) +``` + +## appendService + +Add an extra service to the target module. Context defaults to the function name or a UUID: + +```typescript +// Uses function name "SpyService" as context +TestRunner({ target: MY_APP }) + .appendService(function SpyService({ event }) { + event.on("my_app:thing", handler); + }); + +// Explicit context name +TestRunner({ target: MY_APP }) + .appendService(({ event }) => { ... }, "spy"); +``` + +## replaceLibrary + +Swap a library in the dependency tree. The replacement must have the same `name` as the original: + +```typescript +TestRunner({ target: MY_APP }) + .replaceLibrary("hass", LIB_MOCK_HASS) +``` + +:::caution Compatibility is not enforced +The type system won't catch a replacement that doesn't implement the same API. Ensure the mock provides all methods that the code under test calls. +::: + +## replaceService + +Replace a service within the target module: + +```typescript +TestRunner({ target: MY_APP }) + .replaceService("http_client", MockHttpClient) +``` + +## pickService + +Load only the listed services from the target module; all others are excluded: + +```typescript +TestRunner({ target: MY_APP }) + .pick("registry", "cache") +// Only RegistryService and CacheService will be wired +``` + +## omitService + +Exclude listed services; all others load normally: + +```typescript +TestRunner({ target: MY_APP }) + .omit("analytics", "telemetry") +// All services except AnalyticsService and TelemetryService will wire +``` + +`pickService` and `omitService` cannot be combined. + +## Combining replacements + +All replacement methods can be chained. They're applied in declaration order: + +```typescript +TestRunner({ target: MY_APP }) + .replaceLibrary("hass", LIB_MOCK_HASS) + .appendService(SeedService) + .omit("metrics") + .configure({ my_app: { BATCH_SIZE: 5 } }) + .emitLogs("debug") +``` diff --git a/docs/core/.archive/07-testing/test-lifecycle.md b/docs/core/.archive/07-testing/test-lifecycle.md new file mode 100644 index 0000000..e28fe05 --- /dev/null +++ b/docs/core/.archive/07-testing/test-lifecycle.md @@ -0,0 +1,90 @@ +--- +title: Test Lifecycle +sidebar_position: 4 +description: "Setup, run, and teardown in Digital Alchemy tests; working with fake timers." +--- + +## Setup + +`.setup()` registers a service that runs after all libraries are ready but before the test function. Use it to seed state, configure mocks, or wire up spy functions: + +```typescript +const runner = TestRunner({ target: MY_APP }) + .setup(({ my_app }) => { + my_app.registry.add("test-item", { id: 1, value: "test" }); + }); +``` + +Setup services run in their own library with all other modules as dependencies, ensuring they run after everything else is initialized but before the test callback. + +## Run + +`.run()` boots the application and calls your test function inside the `onReady` phase. The app remains alive until you call `teardown()`: + +```typescript +const app = await runner.run(({ my_app }) => { + expect(my_app.registry.get("test-item")).toBeDefined(); +}); +await app.teardown(); +``` + +## Teardown + +Tests do not tear down automatically. Call `app.teardown()` explicitly (or `runner.teardown()` after `.serviceParams()`). If you don't, scheduled jobs and event listeners will linger between tests. + +In Jest/Vitest, put teardown in `afterEach`: + +```typescript +let app: ApplicationDefinition; + +afterEach(async () => { + await app?.teardown(); +}); + +it("does the thing", async () => { + app = await TestRunner({ target: MY_APP }).run(({ my_app }) => { + expect(my_app.processor.count).toBe(0); + }); +}); +``` + +## Fake timers with the scheduler + +The scheduler uses `setInterval`, `setTimeout`, and `CronJob` internally. Jest/Vitest fake timers intercept these, letting you advance time in tests: + +```typescript +it("fires scheduled job", async () => { + const spy = jest.fn(); + jest.useFakeTimers(); + + const app = await TestRunner({ target: MY_APP }).run(({ scheduler, context }) => { + scheduler(context).cron({ + schedule: CronExpression.EVERY_MINUTE, + exec: spy, + }); + }); + + jest.advanceTimersByTime(60 * 60 * 1000); // advance 1 hour + expect(spy).toHaveBeenCalledTimes(60); + + jest.useRealTimers(); + await app.teardown(); +}); +``` + +:::caution +Always call `jest.useRealTimers()` and `app.teardown()` after tests that use fake timers, or subsequent tests may behave unexpectedly. +::: + +## createMockLogger + +For tests that verify log output, import `createMockLogger` to get a spy-ready logger: + +```typescript +import { createMockLogger } from "@digital-alchemy/core"; + +const mockLogger = createMockLogger(); +// mockLogger.info, .warn, .error, etc. are all no-ops by default +// Replace with jest.fn() to assert on calls: +mockLogger.info = jest.fn(); +``` diff --git a/docs/core/.archive/07-testing/test-runner.md b/docs/core/.archive/07-testing/test-runner.md new file mode 100644 index 0000000..8cd2ebf --- /dev/null +++ b/docs/core/.archive/07-testing/test-runner.md @@ -0,0 +1,114 @@ +--- +title: TestRunner +sidebar_position: 2 +description: "The TestRunner builder API for Digital Alchemy." +--- + +`TestRunner` follows a builder pattern — chain configuration methods before calling `.run()`. All builder methods can be called in any order. + +## Construction + +```typescript +import { TestRunner } from "@digital-alchemy/core"; + +TestRunner() // bare runner, no target module +TestRunner({ target: MY_APPLICATION }) // test an application +TestRunner({ target: LIB_MY_LIB }) // test a library +TestRunner({ name: "my_test" }) // custom name (default: "testing") +``` + +## Builder methods + +### .configure(configuration) + +Override config values for the test. Chained calls deep-merge: + +```typescript +TestRunner({ target: MY_APP }) + .configure({ my_app: { API_URL: "http://test-server" } }) + .configure({ boilerplate: { LOG_LEVEL: "debug" } }) +``` + +### .setOptions(options) + +Set testing bootstrap options. Chained calls deep-merge: + +```typescript +runner.setOptions({ + loadConfigs: false, // Don't load from env/files (default: false) + emitLogs: false, // Suppress logger output (default: false) +}) +``` + +### .emitLogs(level?) + +Enable log output for this test — useful when debugging a failing test: + +```typescript +runner.emitLogs() // use default log level +runner.emitLogs("debug") // enable at a specific level +``` + +### .bootLibrariesFirst() + +Same semantics as the bootstrap option — ensures library `Bootstrap` hooks complete before application services are wired: + +```typescript +runner.bootLibrariesFirst() +``` + +### .setup(serviceFunction) + +Add a service that runs *before* the test function, after all other services are ready. Useful for seeding state: + +```typescript +runner.setup(({ my_app }) => { + my_app.registry.add("seed-item", { id: 1, name: "test" }); +}) +``` + +Multiple `.setup()` calls chain — all setup services run in order. + +## Running + +### .run(testFunction) + +Boot the application and call `testFunction` with `TServiceParams`. Returns the bootstrapped application (use it to call `teardown()`): + +```typescript +const app = await runner.run(({ my_app, config }) => { + expect(config.my_app.API_URL).toBe("http://test-server"); + expect(my_app.my_service.count).toBe(0); +}); +await app.teardown(); +``` + +### .serviceParams() + +Instead of running an inline function, get `TServiceParams` directly for more complex test setups: + +```typescript +const params = await runner.serviceParams(); +// Use params.my_app.my_service, params.config, etc. +await runner.teardown(); +``` + +### .teardown() + +Tear down the application after `.serviceParams()`: + +```typescript +const params = await runner.serviceParams(); +doTests(params); +await runner.teardown(); +``` + +## Configuration overrides + +Config passed via `.configure()` takes priority over defaults but behaves the same as bootstrap overrides. Environment variables and config files are **not loaded** by default in tests (`loadConfigs: false`). This ensures tests are isolated from the local environment. + +To test with real config sources: + +```typescript +runner.setOptions({ loadConfigs: true }) +``` diff --git a/docs/core/.archive/08-advanced/_category_.json b/docs/core/.archive/08-advanced/_category_.json new file mode 100644 index 0000000..9d9cce6 --- /dev/null +++ b/docs/core/.archive/08-advanced/_category_.json @@ -0,0 +1,10 @@ +{ + "label": "Advanced", + "position": 8, + "collapsible": true, + "collapsed": true, + "link": { + "type": "doc", + "id": "core/08-advanced/index" + } +} diff --git a/docs/core/.archive/08-advanced/async-local-storage.md b/docs/core/.archive/08-advanced/async-local-storage.md new file mode 100644 index 0000000..a5c258a --- /dev/null +++ b/docs/core/.archive/08-advanced/async-local-storage.md @@ -0,0 +1,103 @@ +--- +title: Async Local Storage +sidebar_position: 3 +description: "Using AsyncLocalStorage for request-scoped data and log correlation." +--- + +AsyncLocalStorage (ALS) is a Node.js built-in that stores data accessible throughout an entire async call chain — without passing it explicitly through every function. Digital Alchemy wraps it as the `als` service on `TServiceParams`. + +Think of it as "thread-local storage" for async operations: data stored in ALS is automatically available to all code that runs within the same async context, no matter how deep the call stack. + +## The als service + +```typescript +type AlsExtension = { + asyncStorage: () => AsyncLocalStorage; + getStore: () => AsyncLocalData | undefined; + getLogData: () => AsyncLogData; + run: (data: AsyncLocalData, callback: () => void) => void; + enterWith: (data: AsyncLocalData) => void; +}; +``` + +## ALS data structure + +```typescript +interface AsyncLocalData { + logs: AsyncLogData; + http?: RequestLocals; // optional — for HTTP request tracking +} + +interface AsyncLogData { + reqId?: string; + correlationId?: string; + startTime?: number; + [key: string]: unknown; +} +``` + +## Usage + +### Running code within an ALS context + +```typescript +export function HttpMiddleware({ als }: TServiceParams) { + return (req, res, next) => { + als.run({ + logs: { + reqId: crypto.randomUUID(), + correlationId: req.headers["x-correlation-id"], + startTime: Date.now(), + }, + }, next); + }; +} +``` + +Any code that runs within the `als.run(...)` callback — including deeply nested async operations — can read this data: + +```typescript +export function DatabaseService({ als, logger }: TServiceParams) { + return { + query: async (sql: string) => { + const { reqId } = als.getLogData(); + logger.debug({ reqId, sql }, "executing query"); + // ... + }, + }; +} +``` + +### Enabling ALS in the logger + +With `loggerOptions: { als: true }` at bootstrap, the logger automatically includes ALS data (`reqId`, `correlationId`, timing) in every log line emitted within the ALS context: + +```typescript +await MY_APP.bootstrap({ + loggerOptions: { als: true }, +}); +``` + +### Reading current context + +```typescript +const store = als.getStore(); // full AsyncLocalData or undefined +const logData = als.getLogData(); // AsyncLogData (empty object if no context) +``` + +### enterWith + +Sets the current context without wrapping in a callback. Useful for top-level scripts or one-time setup, but generally `run()` is preferred for request handling: + +```typescript +als.enterWith({ logs: { jobId: "batch-001" } }); +``` + +## When to use ALS + +ALS is most valuable for: +- HTTP servers — correlate all logs for a single request with a shared `reqId` +- Batch jobs — tag all logs for a job run with a `jobId` +- Distributed tracing — propagate a `traceId` through a service call chain + +For applications that don't handle concurrent requests (scripts, automations), ALS adds complexity without much benefit and can be ignored entirely. diff --git a/docs/core/.archive/08-advanced/boot-metrics.md b/docs/core/.archive/08-advanced/boot-metrics.md new file mode 100644 index 0000000..31bf29e --- /dev/null +++ b/docs/core/.archive/08-advanced/boot-metrics.md @@ -0,0 +1,74 @@ +--- +title: Boot Metrics +sidebar_position: 5 +description: "Reading service construction times and lifecycle phase timings after bootstrap." +--- + +After bootstrap completes, `internal.boot` contains timing information for every phase of startup. This is useful for identifying slow services or lifecycle hooks. + +## Service construction times + +`internal.boot.serviceConstructionTimes` is an array of timing records in construction order: + +```typescript +// Available after bootstrap +internal.boot.serviceConstructionTimes.forEach(({ module, service, duration }) => { + logger.debug({ module, service, duration }, "service construction"); +}); + +// Example output: +// { module: "boilerplate", service: "logger", duration: "0.12ms" } +// { module: "boilerplate", service: "configuration", duration: "1.45ms" } +// { module: "my_lib", service: "cache", duration: "3.21ms" } +// { module: "my_app", service: "api", duration: "0.89ms" } +``` + +## Config loader timings + +`internal.boot.configTimings` records how long each config source took to load: + +```typescript +logger.debug(internal.boot.configTimings, "config load times"); +// { env: "0.5ms", file: "2.1ms", argv: "0.1ms" } +``` + +## Startup timestamp + +```typescript +const bootTime = Date.now() - internal.boot.startup.getTime(); +logger.info({ bootTimeMs: bootTime }, "app started"); +``` + +## Completed lifecycle events + +```typescript +// Set of stages that have completed — useful for conditional logic +internal.boot.completedLifecycleEvents.has("Ready") // true after full boot +``` + +## Boot phase + +```typescript +internal.boot.phase +// "bootstrap" during wiring +// "running" after onReady completes +// "teardown" during shutdown +``` + +## Logging metrics at startup + +A common pattern is to log boot metrics in an `onReady` callback: + +```typescript +export function MetricsService({ internal, logger, lifecycle }: TServiceParams) { + lifecycle.onReady(() => { + const slowServices = internal.boot.serviceConstructionTimes + .filter(({ duration }) => parseFloat(duration) > 100) + .map(({ module, service, duration }) => `${module}:${service} (${duration})`); + + if (slowServices.length > 0) { + logger.warn({ slowServices }, "slow service construction detected"); + } + }); +} +``` diff --git a/docs/core/.archive/08-advanced/index.md b/docs/core/.archive/08-advanced/index.md new file mode 100644 index 0000000..8d8533f --- /dev/null +++ b/docs/core/.archive/08-advanced/index.md @@ -0,0 +1,13 @@ +--- +title: Advanced +sidebar_label: Overview +sidebar_position: 1 +description: "Advanced topics in Digital Alchemy Core." +--- + +| | | +|---|---| +| [ServiceRunner](./service-runner.md) | Lightweight wrapper for scripts and one-off tasks | +| [Async Local Storage](./async-local-storage.md) | Request-scoped data and log correlation | +| [Project Tuning](./project-tuning.md) | Bootstrap performance, boot metrics, tuning options | +| [Boot Metrics](./boot-metrics.md) | Reading service construction times and phase timings | diff --git a/docs/core/.archive/08-advanced/project-tuning.md b/docs/core/.archive/08-advanced/project-tuning.md new file mode 100644 index 0000000..1339319 --- /dev/null +++ b/docs/core/.archive/08-advanced/project-tuning.md @@ -0,0 +1,72 @@ +--- +title: Project Tuning +sidebar_position: 4 +description: "Bootstrap options for tuning Digital Alchemy application behavior." +--- + +Most applications work well with defaults. This page covers bootstrap options that affect startup behavior and performance. + +## bootLibrariesFirst + +Changes the startup sequence so library `Bootstrap` hooks complete before application services are wired. See [Bootstrapping — bootLibrariesFirst](../02-core-concepts/bootstrapping.md#bootlibrariesfirst). + +```typescript +await MY_APP.bootstrap({ bootLibrariesFirst: true }); +``` + +Use this when application services need library resources to be fully available during their own wiring phase (not just in lifecycle callbacks). + +## configSources + +Disable specific configuration loaders. All are enabled by default: + +```typescript +await MY_APP.bootstrap({ + configSources: { + env: false, // Don't load from environment variables + file: false, // Don't load from config files + argv: true, // Still load from CLI arguments + }, +}); +``` + +Useful in CI/CD environments where you want to provide all config via bootstrap overrides and avoid reading from the environment. + +## appendLibrary / appendService + +Add libraries or services to the bootstrap without modifying the module definition. Primarily useful in tests (via `TestRunner`), but available at bootstrap too: + +```typescript +await MY_APP.bootstrap({ + appendLibrary: [LIB_EXTRA], + appendService: { + debug: DebugService, + }, +}); +``` + +## loggerOptions + +Control logging behavior at boot: + +```typescript +await MY_APP.bootstrap({ + loggerOptions: { + als: true, // Enable ALS data in log output + mergeData: { // Static fields included in every log line + env: process.env.NODE_ENV, + version: process.env.APP_VERSION, + }, + }, +}); +``` + +## customLogger + +Replace the logger implementation used during bootstrap. Primarily for testing (suppressing output), but also useful for custom log sinks: + +```typescript +await MY_APP.bootstrap({ + customLogger: pinoInstance, // must implement ILogger +}); +``` diff --git a/docs/core/.archive/08-advanced/service-runner.md b/docs/core/.archive/08-advanced/service-runner.md new file mode 100644 index 0000000..90e7245 --- /dev/null +++ b/docs/core/.archive/08-advanced/service-runner.md @@ -0,0 +1,91 @@ +--- +title: ServiceRunner +sidebar_position: 2 +description: "Lightweight application wrapper for scripts and one-off tasks." +--- + +`ServiceRunner` is a convenience wrapper for writing lightweight scripts that need Digital Alchemy's config system, logger, and lifecycle but don't warrant a full application module. + +It creates a single-service application under the hood, named `"dynamic"` by default. + +## Basic usage + +```typescript +import { ServiceRunner } from "@digital-alchemy/core"; + +await ServiceRunner({}, async ({ logger }) => { + logger.info("script started"); + // ... do work +}); +``` + +## With configuration + +```typescript +import { ServiceRunner } from "@digital-alchemy/core"; + +await ServiceRunner( + { + configuration: { + ENTITY_ID: { type: "string", required: true }, + DRY_RUN: { type: "boolean", default: false }, + }, + }, + async ({ logger, config }) => { + if (config.dynamic.DRY_RUN) { + logger.info("dry run — no changes made"); + return; + } + logger.info({ entity: config.dynamic.ENTITY_ID }, "processing entity"); + }, +); +``` + +Pass values via CLI: + +```bash +npx tsx src/script.mts --entity_id="switch.example" --dry_run +``` + +## With libraries + +```typescript +import { ServiceRunner } from "@digital-alchemy/core"; +import { LIB_HASS } from "@digital-alchemy/hass"; + +await ServiceRunner( + { + libraries: [LIB_HASS], + bootstrap: { bootLibrariesFirst: true }, + }, + async ({ hass, logger }) => { + const states = await hass.fetch.getAllEntities(); + logger.info({ count: states.length }, "found entities"); + }, +); +``` + +## Custom name + +To get a named config namespace instead of `"dynamic"`: + +```typescript +await ServiceRunner( + { name: "my_script" }, + async ({ config }) => { + config.my_script.SOME_VALUE; // typed + }, +); +``` + +## When to use ServiceRunner vs CreateApplication + +Use `ServiceRunner` for: +- One-off scripts and migration tasks +- CLI utilities +- Simple jobs that don't need to be tested as a module + +Use `CreateApplication` when: +- You need to reuse the module in tests +- You have multiple entrypoints +- The application has significant structure (multiple services, libraries) diff --git a/docs/core/advanced/async-local-storage.md b/docs/core/advanced/async-local-storage.md index ed3297e..4fadfdf 100644 --- a/docs/core/advanced/async-local-storage.md +++ b/docs/core/advanced/async-local-storage.md @@ -1,59 +1,174 @@ --- -title: AsyncLocalStorage (ALS) +title: Async Local Storage +sidebar_position: 2 +description: "AlsExtension, AsyncLocalData, and the HTTP middleware correlation pattern." --- -AsyncLocalStorage (ALS) is a Node.js feature that allows you to store data that is accessible throughout an entire async operation chain, without explicitly passing it through every function call. The Digital Alchemy framework provides special support for ALS to enable request-level context tracking and correlation. +`als` on `TServiceParams` wraps Node.js's [`AsyncLocalStorage`](https://nodejs.org/api/async_context.html). It provides a way to attach contextual data that propagates automatically through the entire async call stack without passing it explicitly as a parameter. -Think of it as a "thread-local storage" for async operations - data stored in ALS is automatically available to all code that runs within the same async context, regardless of how deep the call stack goes. - -## How ALS Works in the Framework - -### 1. ALS Service - -The framework provides an ALS service that manages the storage context: +## AlsExtension API ```typescript type AlsExtension = { - asyncStorage: () => AsyncLocalStorage; - getStore: () => AsyncLocalData; - run(data: AsyncLocalData, callback: () => TBlackHole): void; + run(data: AsyncLocalData, callback: () => void): void; + getStore(): AsyncLocalData | undefined; + getLogData(): AsyncLogData; enterWith(data: AsyncLocalData): void; - getLogData: () => AsyncLogData; + asyncStorage(): AsyncLocalStorage; }; ``` -### 2. Logger Integration - -When ALS is enabled in logger configuration, the framework automatically: +### `als.run(data, callback)` -- Extracts ALS data from the current context -- Merges it into log messages -- Provides timing information if available +Creates a new async context with the given data. All async operations initiated within `callback` will have access to `data` via `als.getStore()`. ```typescript -MY_APP.bootstrap({ - loggerOptions: { - als: true // Enable ALS integration - } +als.run({ logs: { correlationId: "abc-123" } }, () => { + // Every async call chain that starts here can access correlationId + doAsyncWork(); }); ``` -## +### `als.getStore()` + +Returns the current `AsyncLocalData` for the active async context, or `undefined` if not in a context. + +```typescript +const store = als.getStore(); +const correlationId = store?.logs?.correlationId; +``` + +### `als.getLogData()` -## ALS Data Structure +Shortcut for `als.getStore()?.logs ?? {}`. Returns the `AsyncLogData` — the data that the logger uses for automatic context merging. -The framework expects ALS data to follow this structure: +### `als.enterWith(data)` + +Sets the ALS data for the current context without creating a new scope. Mutates the current context rather than creating a child. Use with care — unlike `run()`, this isn't scoped. + +## AsyncLocalData and AsyncLogData ```typescript +interface AsyncLogData { + duration?: () => number; // returns ms since entry — appended to log lines + logger?: GetLogger; // thread-local child logger override +} + interface AsyncLocalData { logs: AsyncLogData; - http?: RequestLocals; } +``` -interface AsyncLogData { - reqId?: string; - correlationId?: string; - startTime?: number; - [key: string]: unknown; +The `logs` property is special: when `loggerOptions.als: true` is set, the logger automatically merges `als.getLogData()` into every log line. This is how log data flows from ALS into your structured logs without any explicit passing. + +To extend `AsyncLocalData` with your own fields, use declaration merging: + +```typescript +declare module "@digital-alchemy/core" { + export interface AsyncLocalData { + logs: AsyncLogData; // keep the existing field + requestId?: string; // add your own + userId?: string; + } } ``` + +## The HTTP middleware pattern + +The primary use case for ALS is attaching request-scoped context in HTTP servers. When a request arrives, you start an ALS context with the request's metadata (correlation ID, request ID, user ID, trace ID). Every service called during that request's handling can access that context — and the logger includes it in every log line automatically. + +This gives you structured logs with zero-effort correlation across the entire request call chain. + +Here's a sketch using Express (the real code works similarly with Fastify, Koa, etc.): + +```typescript title="src/middleware.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; +import type { Request, Response, NextFunction } from "express"; +import { randomUUID } from "node:crypto"; + +export function MiddlewareService({ als }: TServiceParams) { + return function correlationMiddleware(req: Request, res: Response, next: NextFunction) { + const correlationId = req.headers["x-correlation-id"] ?? randomUUID(); + const requestId = randomUUID(); + + // Start an ALS context for this request + // Every async call that originates from next() inherits this context + als.run( + { + logs: { + // These fields automatically appear in every log line + // (when loggerOptions.als: true is set in bootstrap) + }, + correlationId, + requestId, + }, + () => { + // Attach to response for end-to-end tracing + res.setHeader("x-correlation-id", correlationId); + res.setHeader("x-request-id", requestId); + next(); + } + ); + }; +} +``` + +```typescript title="src/users.service.mts" +export function UsersService({ logger, als }: TServiceParams) { + return { + getUser: async (id: string) => { + // No need to pass correlationId — it's in the ALS context + // If loggerOptions.als: true, this log line automatically includes + // the correlationId and requestId from the middleware above + logger.info({ userId: id }, "fetching user"); + + // Alternatively, read it explicitly: + const store = als.getStore(); + const correlationId = store?.correlationId; + + return fetchUser(id); + }, + }; +} +``` + +```typescript title="src/main.mts" +await MY_APP.bootstrap({ + loggerOptions: { + als: true, // merge ALS log data into every log line + mergeData: { + env: "production", + service: "my-api", + }, + }, +}); +``` + +With this setup, every log line emitted within a request handler automatically includes the correlation ID and request ID — without any service needing to thread them through as parameters. + +## Declare your ALS fields + +To get TypeScript types on your custom ALS data, extend `AsyncLocalData`: + +```typescript +declare module "@digital-alchemy/core" { + export interface AsyncLocalData { + logs: AsyncLogData; + correlationId?: string; + requestId?: string; + userId?: string; + } +} +``` + +After this, `als.getStore()?.correlationId` is typed as `string | undefined`. + +## AlsHook + +For libraries that want to contribute data to the ALS context without requiring the application to set it up manually, declare an `AlsHook`: + +```typescript +type AlsHook = () => object; +``` + +This is an extension point for framework-level libraries. Application code generally doesn't need it. diff --git a/docs/core/advanced/boot-metrics.md b/docs/core/advanced/boot-metrics.md new file mode 100644 index 0000000..5580b17 --- /dev/null +++ b/docs/core/advanced/boot-metrics.md @@ -0,0 +1,50 @@ +--- +title: Boot Metrics +sidebar_position: 3 +description: "showExtraBootStats and how to read boot timing output." +--- + +Digital Alchemy tracks the time each service takes to wire and each lifecycle stage takes to complete. You can expose this data for performance investigations via `showExtraBootStats`. + +## Enabling boot stats + +```typescript +await MY_APP.bootstrap({ + showExtraBootStats: true, +}); +``` + +After the `Ready` stage completes, the framework logs a structured summary with timing for: + +- Each module's wiring time (how long all services in that module took to wire) +- Each lifecycle stage duration (how long PreInit, PostConfig, Bootstrap, Ready took) +- Per-service wiring times (if individual service times are above threshold) +- Config loader timing + +## What to look for + +**Slow service wiring:** If a service function performs async work at the top level (not in a lifecycle callback), it blocks the wiring of subsequent services. If construction time is high, move the async work into `onBootstrap`. + +**Slow PostConfig:** The config loader runs at PostConfig. If `PostConfig` is slow, a custom config loader may be making network calls. Cache the result or move the fetch earlier. + +**Slow Bootstrap:** Most connection setup happens here. If it's slow, check whether database connection pools are larger than necessary, or whether `warmUp` calls are doing more work than needed. + +**Slow Ready:** If your `onReady` callbacks are slow, you may be doing initialization work there that belongs in `onBootstrap`. + +## Internal access + +The timing data is also accessible programmatically after bootstrap: + +```typescript +const params = await MY_APP.bootstrap(); + +// Service construction times (order of wiring) +params.internal.boot.serviceConstructionTimes.forEach(({ module, service, duration }) => { + console.log(`${module}:${service} — ${duration}`); +}); + +// Config loader timings +const configTimings = params.internal.boot.configTimings; +``` + +This is useful for CI performance gates or dashboards that track startup time trends. diff --git a/docs/core/advanced/boot-perf-metrics.md b/docs/core/advanced/boot-perf-metrics.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/core/advanced/bootstrap.md b/docs/core/advanced/bootstrap.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/core/advanced/breaking-out.md b/docs/core/advanced/breaking-out.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/core/advanced/index.md b/docs/core/advanced/index.md index 6645c58..73ece85 100644 --- a/docs/core/advanced/index.md +++ b/docs/core/advanced/index.md @@ -1,6 +1,29 @@ --- title: Advanced -id: core_advanced -sidebar_position: 5 -description: "" +sidebar_position: 1 +description: "Advanced topics for power users: ALS, boot metrics, project tuning, and ServiceRunner." --- + +These pages cover topics that go beyond the standard API surface — either because they're rarely needed, require understanding of framework internals, or solve problems specific to production deployments and unusual architectures. + +## Pages in this section + +| Page | What it covers | +|---|---| +| [Async Local Storage](./async-local-storage.md) | `AlsExtension`, `AsyncLocalData`, automatic log correlation for HTTP servers | +| [Boot Metrics](./boot-metrics.md) | `showExtraBootStats`, reading timing output, CI performance gates | +| [Project Tuning](./project-tuning.md) | `LoggerOptions`, `configSources`, `customLogger`, `handleGlobalErrors` | +| [Service Runner](./service-runner.md) | One-off scripts and automation without a full application module | +| [Platform Entrypoints](./platform-entrypoints.md) | Shared bootstrap for multiple entrypoints, env-specific files, bootstrap wrappers | + +## Who these pages are for + +Most applications never need any of this. If you're still setting up your app, start with [Get Started](../get-started/index.md) or work through the [Tutorials](../tutorials/index.md) first. + +Come back to these pages when you're: +- Investigating slow startup times +- Deploying to production and tuning log output for an aggregator +- Writing a CLI tool or migration script +- Building an HTTP server that needs per-request log correlation +- Setting up multiple entrypoints (serverless functions, worker + API) that share one bootstrap +- Building a bootstrap wrapper for a multi-service platform diff --git a/docs/core/advanced/lifecycle.md b/docs/core/advanced/lifecycle.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/core/advanced/loaded-modules.md b/docs/core/advanced/loaded-modules.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/core/advanced/platform-entrypoints.md b/docs/core/advanced/platform-entrypoints.md new file mode 100644 index 0000000..d93aa2a --- /dev/null +++ b/docs/core/advanced/platform-entrypoints.md @@ -0,0 +1,262 @@ +--- +title: Platform Entrypoints +sidebar_position: 5 +description: "Multiple entrypoints sharing one bootstrap, environment-specific entrypoint files, and bootstrap wrappers for platform defaults." +--- + +Real deployments rarely have a single entrypoint that runs forever. This page covers three patterns that address how production applications boot: sharing a single bootstrap across multiple process entrypoints, using separate files per deployment context, and centralizing deployment defaults in a wrapper function. + +## Part 1 — Multiple entrypoints + +Some deployments need multiple process entrypoints that share the same services, configuration, and libraries. Examples: three serverless functions sharing a backend; a web server and a background worker; a cron job and an HTTP API. + +The naive approach — bootstrapping separately in each entrypoint — wastes resources and risks configuration drift. The correct approach bootstraps once and exports the result. + +### The breakout pattern + +Create a `bootstrap.mts` that bootstraps your application and exports the services each entrypoint needs: + +```typescript title="src/bootstrap.mts" +import { MY_APP } from "./app.module.mts"; + +export const { my_app, http, config } = await MY_APP.bootstrap({ + configSources: { argv: false, file: false }, +}); +``` + +Each entrypoint imports only what it needs: + +```typescript title="src/entrypoints/worker.mts" +import { my_app } from "../bootstrap.mts"; + +export async function handleJob(event: JobEvent) { + return my_app.jobs.process(event); +} +``` + +```typescript title="src/entrypoints/health.mts" +import { http } from "../bootstrap.mts"; + +export const handler = http.createHandler(); +``` + +### Why this works + +Top-level `await` at module level means `bootstrap.mts` runs exactly once per process. When `worker.mts` and `health.mts` both import from `bootstrap.mts`, Node/Bun resolves the module from cache — the bootstrap call doesn't run again. Each entrypoint file gets the same already-initialized services. + +Each **process** (each Lambda invocation context, each worker process) has its own module graph. Bootstrap runs once per process, not once globally. + +### What each entrypoint imports + +Entrypoints destructure only the services they need from the bootstrap export — not the full `TServiceParams`. This keeps entrypoint files small and makes the dependency boundary explicit: + +```typescript +// Good: import only what the entrypoint uses +import { http, my_app } from "../bootstrap.mts"; + +// Not needed: the full bootstrap options or internal services +``` + +This pattern works for any multi-function deployment: serverless functions, job runners, CLI commands, cron workers, multi-protocol servers (HTTP + gRPC). + +--- + +## Part 2 — Environment-specific entrypoints + +Instead of a single `main.mts` that detects the environment at runtime and branches on `process.env.NODE_ENV`, use separate entrypoint files. Each is a plain bootstrap call hardcoded for its context. + +```typescript title="src/environments/local.mts" +import { MY_APP } from "../app.module.mts"; + +await MY_APP.bootstrap({ + configSources: { argv: false, env: true, file: false }, + loggerOptions: { + als: true, + }, + showExtraBootStats: true, + configuration: { + boilerplate: { LOG_LEVEL: "debug" }, + my_app: { PORT: 3000 }, + }, +}); +``` + +```typescript title="src/environments/prod.mts" +import { hostname } from "node:os"; +import { MY_APP } from "../app.module.mts"; + +await MY_APP.bootstrap({ + configSources: { argv: false, env: true, file: false }, + loggerOptions: { + als: true, + counter: false, + pretty: false, + mergeData: { + NODE_ENV: process.env.NODE_ENV, + host: hostname(), + service: "my-api", + }, + }, + showExtraBootStats: true, +}); +``` + +The prod entrypoint sets `pretty: false` for JSON output, `mergeData` to tag every log line with deployment context, and `als: true` for per-request log correlation. Values like `DATABASE_URL` come from environment variables — not from `configuration` in the entrypoint. + +### The validate entrypoint + +A dedicated entrypoint for configuration validation is useful in CI/CD pipelines. It boots the application, confirms all required config entries can be resolved, then exits cleanly — without starting any servers or background workers. + +```typescript title="src/environments/validate.mts" +import { MY_APP } from "../app.module.mts"; + +await MY_APP.bootstrap({ + configuration: { + boilerplate: { LOG_LEVEL: "fatal" }, // suppress all output + my_app: { VALIDATE_CONFIG: true }, + }, + loggerOptions: { als: true }, +}); +``` + +The application itself handles the exit: + +```typescript title="src/services/lifecycle.service.mts" +export function LifecycleService({ config, lifecycle, logger }: TServiceParams) { + lifecycle.onPostConfig(() => { + if (config.my_app.VALIDATE_CONFIG) { + logger.info("configuration is valid"); + process.exit(0); + } + }); +} +``` + +`onPostConfig` is the right lifecycle stage for this: all config has been loaded and validated, but the HTTP server and background workers haven't started yet. The process exits cleanly after confirming the full config pipeline ran. + +```typescript +// In config definition: +VALIDATE_CONFIG: { + type: "boolean", + default: false, +}, +``` + +Run it in CI: + +```bash +MY_APP__VALIDATE_CONFIG=true node dist/environments/validate.js +``` + +Or use the dedicated validate entrypoint where `VALIDATE_CONFIG: true` is hardcoded — no environment variable needed. + +### Why separate files beat runtime branching + +Runtime branching (`if (process.env.NODE_ENV === "production") { ... }`) means every environment's boot path is in every deployment artifact. It accumulates conditional logic as the application grows, and it's easy to accidentally enable a dev-only option in prod or vice versa. + +Separate entrypoint files are static: each file contains exactly the options for that context, no conditionals. The prod file has never had `LOG_LEVEL: "debug"` in it. The local file has never accidentally set `pretty: false`. The deployment toolchain points to the right file for each context. + +--- + +## Part 3 — Bootstrap wrappers + +When many applications share the same deployment platform — a monorepo deploying dozens of services to the same infrastructure — duplicating the prod entrypoint for each app creates drift. A wrapper function centralizes the platform defaults: + +```typescript title="src/platform/bootstrap.mts" +import { hostname } from "node:os"; +import { existsSync } from "node:fs"; +import type { ApplicationDefinition, BootstrapOptions } from "@digital-alchemy/core"; + +const MANIFEST_FILE = ".manifest.yaml"; + +export async function bootstrapForPlatform( + app: ApplicationDefinition, + options: BootstrapOptions = {}, +) { + const isDeployed = process.env.NODE_ENV === "production"; + + // Apply platform defaults without overriding what the caller already set + options.configSources ??= {}; + options.configSources.argv ??= false; + options.configSources.file ??= !isDeployed; + + options.loggerOptions ??= {}; + options.loggerOptions.als ??= true; + options.loggerOptions.pretty ??= !isDeployed; + options.loggerOptions.stdOut ??= true; + + if (isDeployed) { + options.loggerOptions.mergeData ??= { + NODE_ENV: process.env.NODE_ENV, + host: hostname(), + }; + } + + options.configuration ??= {}; + options.configuration.boilerplate ??= {}; + options.configuration.boilerplate.LOG_LEVEL ??= isDeployed ? "info" : "debug"; + + // Auto-detect infrastructure-managed manifest + if (existsSync(MANIFEST_FILE)) { + options.configuration.boilerplate.CONFIG = MANIFEST_FILE; + } + + return app.bootstrap(options); +} +``` + +Applications use the wrapper in place of calling `bootstrap()` directly: + +```typescript title="src/apps/my-service/main.mts" +import { MY_SERVICE } from "./app.module.mts"; +import { bootstrapForPlatform } from "../../platform/bootstrap.mts"; + +await bootstrapForPlatform(MY_SERVICE, { + // Override only what's specific to this app + configuration: { + my_service: { PORT: 3001 }, + }, +}); +``` + +### The `??=` pattern + +`??=` (nullish assignment) applies a default only if the value is `null` or `undefined`. This is the correct operator for wrapper defaults: it applies the platform's opinion without stomping on overrides the caller already provided. + +```typescript +options.loggerOptions.pretty ??= !isDeployed; +// If the caller passed `loggerOptions: { pretty: true }`, that value is kept. +// If the caller passed nothing, the platform default is applied. +``` + +Using `=` instead would override caller values. Using `||=` would override falsy values (like `pretty: false` in a test scenario). `??=` is the right tool. + +### The manifest file + +`boilerplate.CONFIG` is an `internal` config type — when set, it overrides the framework's default config file discovery. Infrastructure tooling (CI/CD, IaC) can push a `.manifest.yaml` to the working directory containing non-secret deployment metadata: + +```yaml title=".manifest.yaml" +boilerplate: + LOG_LEVEL: info +my_service: + ENVIRONMENT: production + REGION: us-east-1 +``` + +The wrapper auto-detects and loads it if present. In environments without a manifest (local dev), the file doesn't exist and nothing changes. + +Rule of thumb for config sources: +- Infrastructure generates it → manifest file +- Ops/security manages it → environment variable +- Changes at runtime → custom remote loader (see [Custom Config Loaders](../tutorials/09-custom-config-loader.md)) + +### Deciding between entrypoints and a wrapper + +| Situation | Use | +|---|---| +| Small number of apps, each with their own deployment | Separate entrypoint files per app | +| Monorepo with many services on the same platform | Shared wrapper function in a platform library | +| One app, multiple contexts (local / prod / validate) | Separate entrypoint files per context | +| The same defaults apply to 10+ apps | Wrapper | + +The two approaches aren't mutually exclusive. A monorepo can have a shared wrapper while each app still has a `validate.mts` that calls `bootstrapForPlatform` with `VALIDATE_CONFIG: true`. diff --git a/docs/core/advanced/project-tuning.md b/docs/core/advanced/project-tuning.md index 2860583..aa2f09a 100644 --- a/docs/core/advanced/project-tuning.md +++ b/docs/core/advanced/project-tuning.md @@ -1 +1,173 @@ - +--- +title: Project Tuning +sidebar_position: 4 +description: "LoggerOptions, configSources, customLogger, and handleGlobalErrors for fine-grained bootstrap control." +--- + +The `BootstrapOptions` object passed to `bootstrap()` has several fields that control logging behavior, configuration source selection, and global error handling. These are rarely needed in basic apps but matter for production deployments, log aggregators, and scripting use cases. + +## LoggerOptions + +`loggerOptions` fine-tunes the built-in logger without replacing it. All fields are optional. + +```typescript +await MY_APP.bootstrap({ + loggerOptions: { + pretty: true, + mergeData: { env: "production", service: "my-api" }, + als: true, + levelOverrides: { + "my_app:database": "warn", + }, + }, +}); +``` + +### Field reference + +| Field | Type | Default | Description | +|---|---|---|---| +| `mergeData` | `object` | — | Data merged into every log line. Use for application tags in log aggregators. | +| `timestampFormat` | `string` | `"ddd HH:mm:ss.SSS"` | dayjs format string for the timestamp prefix. | +| `pretty` | `boolean` | `true` | Pretty-print logs with color and alignment. Set `false` for JSON output in production. | +| `ms` | `boolean` | `false` | Prefix each line with milliseconds elapsed since the previous log. | +| `counter` | `boolean` | `false` | Add an incrementing counter to every log line, starting at 0. | +| `als` | `boolean` | `false` | Extract data from `AsyncLocalStorage` and merge it into every log line. Requires ALS setup — see [Async Local Storage](./async-local-storage.md). | +| `levelOverrides` | `Record` | — | Override the log level for a specific service or module. Keys are `"module:service"` or `"module"`. | +| `stdOut` | `boolean` | `true` | Emit logs to stdout. Set to `false` if you're using a `customLogger` and don't want double output. | + +### Pretty vs JSON + +In development, `pretty: true` produces human-readable colored output. In production behind a log aggregator (Datadog, Loki, CloudWatch), you typically want `pretty: false` to get structured JSON: + +```typescript +// production +await MY_APP.bootstrap({ + loggerOptions: { + pretty: false, + mergeData: { + env: process.env.ENVIRONMENT, + version: process.env.APP_VERSION, + }, + }, +}); +``` + +Every log line becomes a JSON object that the aggregator can index. + +### levelOverrides + +Use `levelOverrides` to suppress noisy services without raising the global log level: + +```typescript +loggerOptions: { + levelOverrides: { + "my_app": "warn", // entire module: suppress info/debug + "my_lib:scheduler": "error", // one service: only errors + "boilerplate": "silent", // suppress boilerplate completely + }, +}, +``` + +Keys are `"module"` or `"module:service"`. Values are any `LOG_LEVEL` string: `"silent"`, `"error"`, `"warn"`, `"info"`, `"debug"`, `"trace"`. + +## configSources + +By default, DA reads configuration from three sources: environment variables (`env`), CLI arguments (`argv`), and a `.env` file (`file`). Use `configSources` to disable specific loaders: + +```typescript +await MY_APP.bootstrap({ + configSources: { + argv: false, // don't read from CLI arguments + file: false, // don't read from .env file + env: true, // still read from environment variables (default: true) + }, +}); +``` + +All three keys default to `true` if not specified. Setting a key to `false` removes that source from the merge. + +### When to disable sources + +**`file: false`** — In containerized deployments where secrets come only from environment variables, disabling file loading prevents accidentally picking up a stray `.env` file. + +**`argv: false`** — In scripts or background workers where you don't control the process arguments and don't want arbitrary argv to affect configuration. + +**`env: false`** — Rarely useful in production. Primarily for isolated test environments where you want complete determinism from `bootstrap.configuration` alone. + +:::note +In tests, `TestRunner` defaults `file: false` automatically. `env` and `argv` are also disabled unless you call `runner.setOptions({ loadConfigs: true })`. +::: + +## customLogger + +Replace the built-in logger entirely. This is useful when you need custom log transports, a specific log format not supported by `loggerOptions`, or integration with an external logging library. + +```typescript +import pino from "pino"; + +const logger = pino({ level: "info" }); + +await MY_APP.bootstrap({ + customLogger: (context) => ({ + debug: (data, message) => logger.debug(data, message), + error: (data, message) => logger.error(data, message), + fatal: (data, message) => logger.fatal(data, message), + info: (data, message) => logger.info(data, message), + trace: (data, message) => logger.trace(data, message), + warn: (data, message) => logger.warn(data, message), + }), +}); +``` + +`customLogger` is typed as `GetLogger` — a function that receives a `context` string (`"module:service"`) and returns an object with the six log-level methods. + +When `customLogger` is provided, the built-in logger is not created. `loggerOptions` fields that control formatting (`pretty`, `ms`, `counter`, etc.) are ignored — your custom logger is responsible for formatting. `levelOverrides` is still applied before routing calls to the custom logger. + +If you're also emitting logs through the built-in path via a wrapper, set `loggerOptions.stdOut: false` to avoid duplicate output. + +## handleGlobalErrors + +Controls whether DA installs a handler for uncaught exceptions and unhandled promise rejections. + +```typescript +await MY_APP.bootstrap({ + handleGlobalErrors: false, // default: true +}); +``` + +When `true` (the default), DA registers listeners on `process.on("uncaughtException")` and `process.on("unhandledRejection")`. These log the error and trigger the shutdown sequence. + +Disable this if: +- Your host environment (Lambda, a test framework, a supervisor process) already handles these signals +- You want full control over crash behavior +- You're running multiple DA applications in the same process (only one should own global error handling) + +:::caution +With `handleGlobalErrors: false`, an unhandled rejection will not trigger graceful shutdown. Make sure your host environment handles teardown. +::: + +## Combining options + +A typical production entrypoint with all three areas configured: + +```typescript title="src/main.mts" +await MY_APP.bootstrap({ + loggerOptions: { + pretty: false, + mergeData: { + env: "production", + service: "my-api", + version: process.env.APP_VERSION, + }, + als: true, // correlate logs by request ID + levelOverrides: { + "boilerplate": "warn", + }, + }, + configSources: { + file: false, // no .env files in prod + }, + handleGlobalErrors: true, // explicit, for documentation clarity +}); +``` diff --git a/docs/core/advanced/service-runner.md b/docs/core/advanced/service-runner.md index 6900aad..0ba6c54 100644 --- a/docs/core/advanced/service-runner.md +++ b/docs/core/advanced/service-runner.md @@ -1,34 +1,126 @@ --- title: Service Runner +sidebar_position: 5 +description: "ServiceRunner for one-off scripts and lightweight automation without a full application." --- -`ServiceRunner` is a specialized wrapper for light weight script based on the existing techniques. +`ServiceRunner` is a convenience wrapper around `CreateApplication` for running a single service function. It's designed for scripts, CLI tools, migration runners, and other short-lived processes where you want access to DA's DI, lifecycle, and config system without the ceremony of declaring a full application module. -It operates as a single application module, without requiring integration with `LoadedModules`. -The module will identify itself as `dynamic` by default. - -## Example Code +## Basic usage ```typescript import { ServiceRunner } from "@digital-alchemy/core"; -import { LIB_API } from "@cool-org/logic"; -await ServiceRunner({ - configuration: { - ENTITY_ID: { - type: "string" +await ServiceRunner( + { + libraries: [MY_LIB], + configuration: { + my_script: { + TARGET_ID: { type: "string", required: true }, + }, + }, + }, + async ({ logger, config, my_lib }) => { + const id = config.my_script.TARGET_ID; + logger.info({ id }, "starting script"); + await my_lib.doWork(id); + logger.info("done"); + }, +); +``` + +The second argument is a service function that receives `TServiceParams`, including any libraries you declare. The application bootstraps, runs your function, and then tears down. + +## Signature + +```typescript +async function ServiceRunner( + options: ServiceRunnerConfiguration & { bootstrap?: BootstrapOptions }, + service: (params: LocalServiceParams) => void | Promise, +): Promise +``` + +`ServiceRunnerConfiguration` accepts the same options as `CreateApplication` **except** `name`, `services`, and `priorityInit` (which are managed internally). You can optionally set a `name` for the module (defaults to `"dynamic"`), which determines the config namespace: + +```typescript +await ServiceRunner( + { + name: "migrate", // config lives at config.migrate.* + configuration: { + migrate: { + DB_URL: { type: "string", required: true }, + }, + }, + bootstrap: { + configSources: { file: false }, + }, + }, + async ({ config, logger }) => { + logger.info({ url: config.migrate.DB_URL }, "running migrations"); + // ... + }, +); +``` + +## When to use ServiceRunner vs CreateApplication + +| Scenario | Use | +|---|---| +| Full application with multiple services, long-running process | `CreateApplication` | +| One-off script, migration, seed, health check | `ServiceRunner` | +| CLI tool that does a single operation and exits | `ServiceRunner` | +| Application with complex inter-service wiring | `CreateApplication` | +| Quick utility that needs libraries and config | `ServiceRunner` | + +`ServiceRunner` internally calls `CreateApplication` with a single service named `"service"`. It has the same lifecycle (PreInit → PostConfig → Bootstrap → Ready → shutdown), the same config system, and the same library wiring. The only difference is that you don't declare a module definition file — you just pass the function. + +## Libraries and config + +`ServiceRunner` supports `libraries`, `configuration`, and a nested `bootstrap` object for `BootstrapOptions`: + +```typescript +await ServiceRunner( + { + libraries: [DATABASE_LIB, HTTP_LIB], + configuration: { + my_script: { + DRY_RUN: { type: "boolean", default: false }, + BATCH_SIZE: { type: "number", default: 100 }, + }, + }, + bootstrap: { + loggerOptions: { pretty: true }, + configuration: { + my_script: { DRY_RUN: true }, // override for this run + }, + }, + }, + async ({ config, database, http, logger }) => { + if (config.my_script.DRY_RUN) { + logger.warn("dry run — no writes"); } + // use database and http normally }, - libraries: [LIB_API] - bootstrap: { bootLibrariesFirst: true }, - name: "dynamic", // default value -},async function ({ logger, config, api }) { - logger.info(config.dynamic.EXAMPLE); -}); +); ``` -With the help of the built in config loader, this can be run as a script +## Lifecycle in scripts + +Because `ServiceRunner` boots a full DA application, lifecycle hooks work normally. If a library registers `onBootstrap` callbacks (database connections, HTTP clients), those run before your service function executes. Teardown also runs automatically after your function returns. -```bash -npx tsx src/main.ts --entity_id="switch.example" +If you need to do work at a specific lifecycle stage, use `lifecycle` from params: + +```typescript +await ServiceRunner({}, async ({ lifecycle, logger }) => { + lifecycle.onPreShutdown(() => { + logger.info("cleaning up before shutdown"); + }); + + // main work here — runs at Ready + await doWork(); +}); ``` + +:::note +`ServiceRunner` always runs the full lifecycle including teardown. If your script throws, teardown still runs (same as a production application receiving SIGTERM). +::: diff --git a/docs/core/applications/bootstrap.md b/docs/core/applications/bootstrap.md deleted file mode 100644 index b049ea2..0000000 --- a/docs/core/applications/bootstrap.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -title: Bootstrap -id: core-app-bootstrap -sidebar_position: 2 -description: "" ---- - -Once defined, an application module can be bootstrapped with optional configuration overrides: - -```ts -await MY_APPLICATION.bootstrap(); -``` - -### Multiple entrypoints - -Separating `dev.main.mts` and `prod.main.mts` simplifies local development and production deployments: - -- **Local dev (`dev.main.mts`)** can use more development friendly options and verbose logging configurations -- **Production (`prod.main.mts`)** can use more secure settings and provide additional context to logging systems - -This split allows each environment to operate with different assumptions while sharing the same application definition. - -### Extended example - -In this setup, the `utils` module forwards logs to an external logging service like Datadog. Configuration passed into `bootstrap` includes: - -- `CLOUD_LOGGER_API_KEY`: Enables the cloud logger at runtime. -- `loggerOptions.mergeData`: Tags each log line with static metadata (like environment, hostname, or service name), making it easier to filter and group logs in a dashboard. - -```ts -await MY_APPLICATION.bootstrap({ - configuration: { - boilerplate: { LOG_LEVEL: "info" }, - utils: { - CLOUD_LOGGER_API_KEY: process.env.CLOUD_LOGGER_API_KEY, - }, - }, - loggerOptions: { - als: true, - mergeData: { - NODE_ENV: process.env.NODE_ENV, - host: hostname(), - service: "special-microservice", - }, - }, -}); -``` - - -### `bootLibrariesFirst` - -In typical usage, `bootstrap()` constructs all libraries and application services first, then runs lifecycle hooks (`onBootstrap`, then `onReady`) for everything in sync. This works well for most full-featured applications. - -However, if you’re writing a **script, job runner, or anything lightweight**, it can be cumbersome to wait on external resources manually using lifecycle hooks. - -To solve this, you can pass: - -```ts -await MY_APPLICATION.bootstrap({ bootLibrariesFirst: true }); -``` - -This changes the startup sequence: - -1. **All libraries** are constructed first. -2. The `lifecycle.onBootstrap()` hook is awaited for each library. -3. **Then** application services are constructed. -4. Finally, `lifecycle.onReady()` is called across all modules. - -This allows libraries (e.g., a database client, external API client, or telemetry pipeline) to be **fully initialized before your code runs**. That means you can safely start work in your own service logic without waiting or checking readiness. diff --git a/docs/core/applications/index.md b/docs/core/applications/index.md deleted file mode 100644 index 3ab1560..0000000 --- a/docs/core/applications/index.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Applications -id: core-application -sidebar_position: 2 -description: "" ---- - -Application modules initialize your app. They behave like libraries but support the following additional properties: - -| name | description | -| --------------- | ------------------------------------------------------------------ | -| `configuration` | A mapping of configuration options this module declares | -| `name` | Application name — influences **configuration** & `TServiceParams` | -| `libraries` | An array of dependency libraries your application should load | -| `services` | Object of service classes to register in the application | -| `priorityInit` | Optional array to control service initialization order | - -### Libraries - -If a library in the `libraries` array declares dependencies, those must also be included in the `libraries` array of the application module. - -The version of the dependency defined by the **application** module is the one used at runtime, overriding versions defined in libraries. - -## Example Code - -### Minimum - -Only the application name and at least one service are required: - -```typescript -import { CreateApplication } from "@digital-alchemy/core"; - -import { SpecialLogicService } from "./services/index.mts"; - -export const MY_APPLICATION = CreateApplication({ - name: "my_app", - services: { - logic: SpecialLogicService, - }, -}); - -declare module "@digital-alchemy/core" { - export interface LoadedModules { - // key must match name - my_app: typeof MY_APPLICATION; - } -} -``` - -### Full - -More advanced setup with libraries, configuration, and prioritized services: - -```typescript -import { CreateApplication } from "@digital-alchemy/core"; -import { LIB_HTTP, LIB_UTILS } from "@cool-org/logic"; - -import { - DatabaseService, - LoaderService, - SpecialLogicService, -} from "./services/index.mts"; -import { ApplicationController } from "./controllers/index.mts"; - -export const MY_APPLICATION = CreateApplication({ - // Optional: declare configuration values used by services - configuration: { - DATABASE_URL: { - type: "string", - required: true, - }, - }, - libraries: [LIB_HTTP, LIB_UTILS], - name: "my_app", - // Ensures database loads before loader - priorityInit: ["database", "loader"], - services: { - ApplicationController, - database: DatabaseService, - loader: LoaderService, - logic: SpecialLogicService, - }, -}); - -declare module "@digital-alchemy/core" { - export interface LoadedModules { - my_app: typeof MY_APPLICATION; - } -} -``` diff --git a/docs/core/configuration/index.md b/docs/core/configuration/index.md deleted file mode 100644 index ce9108f..0000000 --- a/docs/core/configuration/index.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -title: Configuration -id: core-configuration -sidebar_position: 4 -description: "" ---- - -The configuration system is designed to provide a managed experience for applications. Definitions are built into modules, and the system sources values from both files and environment sources. - -## Defining Configurations - -> Definitions are provided as part of the library/application creation - -```typescript -const MY_LIB = CreateLibrary({ - configuration: { - STRING_CONFIG: { - type: "string", - description: "An example string configuration", - default: "foo" - }, - ENUM_CONFIG: { - type: "string", - description: "Another example string configuration", - default: "foo", - enum: ["foo","bar"] - } as StringConfig<"foo" | "bar">, - NUMBER_CONFIG: { - type: "number", - description: "A numeric configuration", - default: 8080 - }, - BOOLEAN_CONFIG: { - type: "boolean", - description: "A boolean configuration", - default: false - } - }, - name: "my_lib" -}); -``` - -This creates the following configuration variables: - -- `config.my_lib.STRING_CONFIG` (generic `string`) -- `config.my_lib.ENUM_CONFIG` (string union) -- `config.my_lib.NUMBER_CONFIG` (`number`) -- `config.my_lib.BOOLEAN_CONFIG` (`boolean`) - -### Supported Types - -| Type | Notes | Extras | -| ---------- | ---------------------------------------------------------------- | ---------------------------------------------------------------------------------- | -| `string` | Strings and things that extend them | `enum: string[]` property may also be supplied | -| `string[]` | An array of strings | | -| `boolean` | Simple boolean configurations | Using CLI switches, just passing `--CONFIG_NAME` can be used for passing true | -| `number` | Simple number configurations | | -| `record` | `Record` for defining key/value pairs of strings | | - -For more details on configuration sourcing and advanced usage, see [Configuration Sourcing](/docs/core/configuration/core-configuration-sourcing). - -## Using configs - -> Values are provided via service params and are accessible in `.project.value` format. - -```typescript -export function MyService({ logger, config, lifecycle }: TServiceParams) { - lifecycle.onPostConfig(() => { - // Properly cast to the string union - logger.info(`value for ENUM_CONFIG is`, config.my_lib.ENUM_CONFIG); - }); -} -``` diff --git a/docs/core/configuration/sourcing.md b/docs/core/configuration/sourcing.md deleted file mode 100644 index 3d04a3b..0000000 --- a/docs/core/configuration/sourcing.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -title: Sourcing -id: core-configuration-sourcing -sidebar_position: 4 -description: "" ---- - -The configuration system uses a set of priorities to determine the value of a given configuration variable. -By default, values are loaded in the following order: - -1. Hard-coded defaults in the library/application. -2. Values provided to the bootstrap function for the application. -3. User data (determined after `onPreInit`, and before `onPostConfig`): - 1. Environment variables (including .env files) - 2. Command line switches - 3. Configuration files - 4. Custom loaders - -## Module definitions - -Configuration can be provided directly during bootstrap, which takes priority over module defaults: - -```typescript -export const MY_APPLICATION = CreateApplication({ - configuration: { - BASE_URL: { - type: "string", - default: "http://localhost:3032" // absolute default for this property - }, - FEATURE_ENABLED: { - type: "boolean", - default: false - } - }, - name: "example_application", -}); -``` - -## Application bootstrap - -Individual application entrypoints are able to override the module level configurations specific functionality. -This might - -```typescript -MY_APPLICATION.bootstrap({ - configuration: { - example_application: { - BASE_URL: "https://dev-api.some-domain.com", - FEATURE_ENABLED: true - } - } -}) -``` - -## Built-in loader notes - -### Environment Variables - -Environment variables are **case insensitive**, and `-` & `_` may be swapped. For the configuration example `CACHE_PROVIDER`, these are allowed variations: - -- `CACHE_PROVIDER` -- `cache-provider` -- `caChE-PrOvIDERE` - -#### Built-in .env Support - -The system automatically loads environment variables from `.env` files using [@dotenvx/dotenvx](https://www.npmjs.com/package/@dotenvx/dotenvx). The loading priority is: - -1. `--env-file` CLI switch -2. `envFile` option in bootstrap configuration -3. Default `.env` file in current working directory - -```bash -# Use a specific .env file -tsx main.ts --env-file ./production.env -``` - -```typescript -// Or set in bootstrap options -const app = CreateApplication({ - // ... other options - bootstrap: { - envFile: "./production.env" - } -}); -``` - -> **Note**: The system uses [@dotenvx/dotenvx](https://www.npmjs.com/package/@dotenvx/dotenvx) which supports encrypted environment variables, allowing you to securely store sensitive configuration values in your `.env` files. - -#### via environment variables - -```bash -# source from the environment variables in your session -export CACHE_PROVIDER=redis -tsx main.ts - -# define inline -CACHE_PROVIDER=REDIS tsx main.ts -``` - -### Command line switches - -```bash -tsx main.ts --CACHE_PROVIDER=redis -# or -tsx main.ts --CACHE_PROVIDER redis -``` - -## Config files - -The file loader supports `ini`, `yaml`, and `json` formats. It searches for files in the following order: - -> Set of extensions checked for each file: - -- **auto** > `.json` > `.ini` > `.yaml` > `.yml` - -Omitting the extension (**auto**) causes the loader to attempt to guess the file format: - -1. Attempt `json` -2. Attempt `yaml` -3. Fallback to `ini` - -> Search paths: - -- `/etc/{app_name}` (Linux/macOS only) -- `cwd()`/`.app_name` -- `cwd()`/`..` (recursively to root)/`.app_name` -- `~/.config/{app_name}` - -> The loader checks the `--config` switch as part of determining which file to load. If passed, the provided file will be the only one used. - -```bash -tsx main.ts --config ./development_configuration -``` diff --git a/docs/core/get-started/index.md b/docs/core/get-started/index.md new file mode 100644 index 0000000..8a19391 --- /dev/null +++ b/docs/core/get-started/index.md @@ -0,0 +1,53 @@ +--- +title: What is Digital Alchemy Core? +sidebar_position: 1 +description: "What DA Core is, why it exists, and when to use it." +--- + +Digital Alchemy Core is a TypeScript application framework built around three ideas: dependency injection through plain functions, explicit lifecycle stages, and type-safe configuration. It runs anywhere Node.js runs — scripts, long-lived daemons, serverless, job queues — without requiring a specific runtime or build tool. + +## What it is + +The framework gives every service a single parameter, `TServiceParams`, which is built from the dependency graph at boot time. That parameter carries everything the service needs: a scoped logger, lifecycle hooks, config values, references to other services, and a handful of utility primitives. There are no global singletons, no decorator magic, no reflection. You write a plain function, return its public API, and the framework assembles the pieces. + +```typescript +import type { TServiceParams } from "@digital-alchemy/core"; + +export function MyService({ logger, lifecycle, config }: TServiceParams) { + lifecycle.onReady(() => { + logger.info({ url: config.my_app.API_URL }, "service ready"); + }); + + return { + greet: (name: string) => `Hello, ${name}`, + }; +} +``` + +## Key properties + +- **No decorators, no reflection.** Services are plain functions. TypeScript does all type inference from return types — no metadata, no `reflect-metadata`, no experimental flags. +- **Explicit lifecycle.** Code runs when you say it runs: `PreInit`, `PostConfig`, `Bootstrap`, `Ready` on the way up; `PreShutdown`, `ShutdownStart`, `ShutdownComplete` on the way down. No implicit initialization order surprises. +- **Type-safe configuration.** Configuration entries are declared as part of the module definition. The framework produces a fully typed `config` object with correct TypeScript types for every entry. Accessing an undeclared key is a type error. +- **Runtime-agnostic.** Node 20+, Bun, tsx, Deno with Node compat — all work. +- **First-class testability.** Every service receives its dependencies through `TServiceParams`. Swapping an implementation for tests is a one-liner. + +## What it is not + +Digital Alchemy Core is not an HTTP framework. It has no router, no middleware chain, no request/response abstractions. It is the host layer that sits underneath whatever transport you use — Express, Fastify, WebSockets, raw TCP, or no network at all. + +## When to use it + +If you're writing a TypeScript application that: + +- Has multiple services that need to talk to each other +- Needs deterministic startup and shutdown ordering +- Has environment-specific configuration that must be validated at boot +- Will be tested extensively with mocked dependencies + +...then DA Core provides structure that scales from a two-service script to a 40-service daemon without changing how individual services are written. + +## Jump in + +- [Install →](./install.md) +- [Quickstart — build a running app in minutes →](./quickstart.mdx) diff --git a/docs/core/get-started/install.md b/docs/core/get-started/install.md new file mode 100644 index 0000000..8138c6c --- /dev/null +++ b/docs/core/get-started/install.md @@ -0,0 +1,67 @@ +--- +title: Installation +sidebar_position: 2 +description: "Install DA Core, runtime requirements, and tsconfig setup." +--- + +## Install + +```bash +npm install @digital-alchemy/core +# or +yarn add @digital-alchemy/core +# or +bun add @digital-alchemy/core +``` + +No additional peer dependencies are required for the core package alone. + +## Runtime requirements + +| Runtime | Minimum version | +|---|---| +| Node.js | 20 | +| Bun | 1.0 | +| Deno | 1.40 (with Node compat mode) | +| tsx | any current | + +The framework uses `AsyncLocalStorage` and `EventEmitter` from Node's standard library. Both are available in all supported runtimes. + +## TypeScript configuration + +DA Core relies on module resolution features available in TypeScript 5+ with `NodeNext` (or `Bundler`) module settings. Your `tsconfig.json` must include: + +```json +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "strict": true + } +} +``` + +If you use `.mts` files (recommended for ESM projects), also ensure your `package.json` has: + +```json +{ + "type": "module" +} +``` + +:::tip +Using `.mts` extensions for source files and `.mjs` for outputs is the most reliable path for ESM in Node 20+. The framework itself is published as ESM, so a CommonJS-only project will require a bundler or interop shim. +::: + +## Common setup errors + +**`ERR_REQUIRE_ESM`** — You're importing an ESM package from a CJS module. Set `"type": "module"` in `package.json` and use `.mts` extensions. + +**`Cannot find module '@digital-alchemy/core'`** — TypeScript cannot resolve the package. Check that `moduleResolution` is `NodeNext` or `Bundler`, not `Node` (legacy). + +**`Type 'X' is not assignable to type 'Y'`** on `TServiceParams` — Usually means `target` is set below `ES2022`. Async iterators, `Object.hasOwn`, and other features used internally require ES2022 output. + +## Next step + +[Quickstart →](./quickstart.mdx) diff --git a/docs/core/get-started/next-steps.md b/docs/core/get-started/next-steps.md new file mode 100644 index 0000000..6add548 --- /dev/null +++ b/docs/core/get-started/next-steps.md @@ -0,0 +1,36 @@ +--- +title: Next Steps +sidebar_position: 4 +description: "Where to go after the quickstart." +--- + +You've got a running Digital Alchemy application. Here's how to go deeper. + +## Learning path + +| I want to... | Go to | +|---|---| +| Understand services and how they communicate | [Adding Services](../tutorials/02-adding-services.md) | +| Control when my code runs | [Lifecycle Hooks](../tutorials/03-lifecycle-hooks.md) | +| Add typed, validated configuration | [Typed Configuration](../tutorials/04-typed-configuration.mdx) | +| Package code as a reusable library | [Building a Library](../tutorials/06-building-a-library.md) | +| Write tests for my services | [Testing Basics](../tutorials/07-testing-basics.mdx) | + +## Reference — look things up + +| I need the full API for... | Go to | +|---|---| +| `CreateApplication` options | [CreateApplication](../reference/application/create-application.md) | +| `TServiceParams` properties | [TServiceParams](../reference/services/service-params.mdx) | +| All lifecycle hooks | [Hooks](../reference/lifecycle/hooks.md) | +| Config types and sourcing | [Configuration Overview](../reference/config/overview.md) | +| Logger, scheduler, event bus | [Builtins](../reference/builtins/index.md) | + +## Guides — understand the model + +| I want to understand... | Go to | +|---|---| +| The exact boot sequence, step by step | [Bootstrap Internals](../guides/bootstrap-internals.md) | +| Why DI and what it buys you | [Dependency Injection](../guides/dependency-injection.md) | +| How to structure a real app | [Application Structure](../guides/application-structure.md) | +| How config flows from env to your code | [Config and Environments](../guides/config-and-environment.md) | diff --git a/docs/core/get-started/quickstart.mdx b/docs/core/get-started/quickstart.mdx new file mode 100644 index 0000000..e6f304c --- /dev/null +++ b/docs/core/get-started/quickstart.mdx @@ -0,0 +1,103 @@ +--- +title: Quickstart +sidebar_position: 3 +description: "Build and run your first Digital Alchemy application." +--- + +import EmbeddedEditor from '@site/src/components/EmbeddedEditor'; +import { files, defaultFile } from '@site/src/examples/core/get-started/first-app'; + +This guide walks you through building a minimal Digital Alchemy application from scratch. By the end you'll have a running app and understand the three core building blocks: **services**, **modules**, and **bootstrap**. + +## Step 1 — Write a service + +A service is a plain TypeScript function that receives one parameter: `TServiceParams`. This object contains everything your service needs — the logger, lifecycle hooks, config, references to other services, and more. + +```typescript title="src/hello.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +export function HelloService({ logger, lifecycle }: TServiceParams) { + lifecycle.onReady(() => { + logger.info("Hello, Digital Alchemy!"); + }); +} +``` + +Three things to notice: + +- The function always receives a single destructured `TServiceParams`. That's the contract. +- **No code runs at function call time.** You register callbacks for lifecycle stages. Here, `onReady` fires after everything is initialized. This is how you control *when* things happen. +- The logger is pre-bound to your service's context (`my_app:hello`), so every log line is automatically tagged with the module and service name. + +## Step 2 — Create an application module + +An application module wires services together and gives the app a name. + +```typescript title="src/application.mts" +import { CreateApplication } from "@digital-alchemy/core"; +import { HelloService } from "./hello.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + services: { + hello: HelloService, + }, +}); + +// Extend LoadedModules so TypeScript knows what's on TServiceParams +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +``` + +The `declare module` block is how Digital Alchemy's type system works. After this declaration, any service in `my_app` can access `my_app.hello` from `TServiceParams` and TypeScript knows its exact type — inferred from `HelloService`'s return value. + +## Step 3 — Bootstrap + +Create an entrypoint that starts the application. + +```typescript title="src/main.mts" +import { MY_APP } from "./application.mts"; + +await MY_APP.bootstrap(); +``` + +Then run it: + +```bash +npx tsx src/main.mts +``` + +Expected output: + +``` +[Mon 09:00:00.000] [INFO][my_app:hello]: Hello, Digital Alchemy! +``` + +## Try it live + +The editor below contains the same three files. Click between them, read the types, and try making changes. + + + +## What just happened? + +When `bootstrap()` is called: + +1. Boilerplate services are wired first — logger, config, scheduler, and async local storage +2. `HelloService` is called once — receiving a `TServiceParams` built from everything wired so far +3. Lifecycle stages run in order: `PreInit` → `PostConfig` → `Bootstrap` → `Ready` +4. Your `onReady` callback fires at step 3 — all services are wired, config is validated + +The service function itself runs during wiring (step 2). The `onReady` callback runs later (step 3). This separation is why you can safely access other services and config values inside lifecycle callbacks without worrying about initialization order. + +For the full picture of what happens during bootstrap, see [Bootstrap Internals](../guides/bootstrap-internals.md). + +## Next steps + +- [Next Steps →](./next-steps.md) +- Add a second service → [Adding Services](../tutorials/02-adding-services.md) +- Add typed configuration → [Typed Configuration](../tutorials/04-typed-configuration.mdx) +- Understand the lifecycle → [Lifecycle Overview](../reference/lifecycle/overview.md) diff --git a/docs/core/guides/application-structure.md b/docs/core/guides/application-structure.md new file mode 100644 index 0000000..549468a --- /dev/null +++ b/docs/core/guides/application-structure.md @@ -0,0 +1,162 @@ +--- +title: Application Structure +sidebar_position: 4 +description: "Organizing a real multi-service, multi-library application." +--- + +A small Digital Alchemy app fits in three files. A larger one needs a structure that's easy to navigate and scale. This guide covers patterns for organizing real applications. + +## The basic shape + +At minimum, every application has: + +- A definition file: `CreateApplication`, `LoadedModules` declaration, exports +- Service files: one service per file, named after what it does +- An entrypoint: imports the definition file, calls `bootstrap()` + +``` +src/ +├── app.mts # CreateApplication + LoadedModules +├── main.mts # bootstrap() call +├── services/ +│ ├── api.service.mts +│ ├── database.service.mts +│ └── cache.service.mts +└── types/ + └── index.mts # shared TypeScript types +``` + +## Service naming + +Name service files after what they do, not what they are. `users.service.mts` is better than `user-manager.service.mts`. The service key in `CreateApplication` should match the filename: + +```typescript +export const MY_APP = CreateApplication({ + name: "my_app", + services: { + users: UsersService, // src/services/users.service.mts + orders: OrdersService, // src/services/orders.service.mts + database: DatabaseService, // src/services/database.service.mts + cache: CacheService, // src/services/cache.service.mts + }, +}); +``` + +The service key is what other services use to access it: `my_app.users.create(...)`. Keep keys short and noun-like. + +## When to extract a library + +A library is warranted when: + +- Multiple applications need the same code +- A set of services forms a cohesive, independently-testable unit +- You want to publish the services as a package + +A library is not warranted when the code is only used by one application. Premature extraction adds ceremony without benefit. + +## Module dependency graph + +A real application typically looks like: + +```mermaid +graph TD + App["my_app (application)"] + HTTP["http_client (library)"] + DB["database (library)"] + AUTH["auth (library)"] + CACHE["cache (library)"] + + App --> HTTP + App --> DB + App --> AUTH + App --> CACHE + AUTH --> DB + AUTH --> CACHE +``` + +Libraries with `depends` declare their dependencies explicitly. The framework resolves the load order: `database` and `cache` first (no dependencies), then `auth` (depends on both), then `http_client`, then the application. + +## Multiple entrypoints + +Keep the application definition separate from bootstrap calls: + +``` +src/ +├── app.mts # definition +├── main.mts # production bootstrap +├── dev.mts # dev bootstrap (debug logging, verbose config) +└── scripts/ + ├── migrate.mts # database migration bootstrap + └── seed.mts # test data seed bootstrap +``` + +Each entrypoint imports `MY_APP` and calls `bootstrap()` with different options: + +```typescript title="src/dev.mts" +import { MY_APP } from "./app.mts"; +await MY_APP.bootstrap({ + configuration: { + boilerplate: { LOG_LEVEL: "debug" }, + my_app: { DATABASE_URL: "postgres://localhost/dev" }, + }, +}); +``` + +```typescript title="src/scripts/migrate.mts" +import { MY_APP } from "./app.mts"; +await MY_APP.bootstrap({ + bootLibrariesFirst: true, // ensure DB is ready before app services wire + configuration: { + my_app: { DATABASE_URL: process.env.MIGRATE_DB_URL }, + }, +}); +// post-bootstrap: run migrations +await MY_APP.teardown(); +``` + +## Configuration organization + +For larger apps, consider a configuration module that provides a typed interface over the raw config: + +```typescript +export function ConfigService({ config }: TServiceParams) { + return { + get database() { + return { + url: config.my_app.DATABASE_URL, + poolSize: config.my_app.DB_POOL_SIZE, + ssl: config.my_app.DB_SSL, + }; + }, + get server() { + return { + port: config.my_app.PORT, + host: config.my_app.HOST, + }; + }, + }; +} +``` + +Other services destructure `my_app.config.database.url` instead of reading raw config. This centralizes config key names and makes refactoring config entries easier. + +## Test structure + +Mirror the source structure: + +``` +src/ +└── services/ + ├── users.service.mts + └── orders.service.mts + +test/ +├── services/ +│ ├── users.test.mts +│ └── orders.test.mts +└── mocks/ + ├── database.mock.mts + └── cache.mock.mts +``` + +Mocks live in `test/mocks/` as `CreateLibrary` instances with the same name as the real library. Tests import the mock and pass it to `TestRunner.replaceLibrary()`. diff --git a/docs/core/guides/bootstrap-internals.md b/docs/core/guides/bootstrap-internals.md new file mode 100644 index 0000000..eebd4ac --- /dev/null +++ b/docs/core/guides/bootstrap-internals.md @@ -0,0 +1,129 @@ +--- +title: Bootstrap Internals +sidebar_position: 2 +description: "The full boot sequence — wiring phases, lifecycle stages, and shutdown — explained in depth." +--- + +When you call `MY_APP.bootstrap()`, a lot happens before your first `onReady` callback fires. This guide walks through every phase. + +## The full sequence + +```mermaid +sequenceDiagram + participant U as Your Code + participant B as bootstrap() + participant WS as Wiring + participant L as Lifecycle + participant P as Process + + U->>B: MY_APP.bootstrap(options) + B->>WS: Create InternalDefinition + B->>WS: Create EventEmitter + B->>WS: Wire boilerplate (als, config, logger, scheduler) + Note over WS: LOAD_PROJECT for boilerplate config + B->>WS: Merge bootstrap.configuration overrides + B->>WS: Apply appendLibrary options + + B->>WS: buildSortOrder(libraries) + Note over WS: Throws BAD_SORT on cycles + + loop Each library (topological order) + WS->>WS: LOAD_PROJECT (register config defs) + WS->>WS: wireOrder(priorityInit, services) + WS->>WS: Call each service function (serial) + end + + alt bootLibrariesFirst: false (default) + WS->>WS: Wire application services + B->>L: exec("PreInit") + B->>L: exec("PostConfig") + Note over L: Config sourced & validated here + B->>L: exec("Bootstrap") + B->>L: exec("Ready") + else bootLibrariesFirst: true + B->>L: exec("PreInit") for libraries + B->>L: exec("PostConfig") for libraries + B->>L: exec("Bootstrap") for libraries + WS->>WS: Wire application services + B->>L: exec("Ready") for everything + end + + B-->>U: TServiceParams (Ready complete) + + P->>B: SIGTERM / SIGINT + B->>L: exec("PreShutdown") + B->>L: exec("ShutdownStart") + B->>L: exec("ShutdownComplete") + B->>P: process.exit(130/143) +``` + +## Phase 1 — Boilerplate + +Before any user code runs, four boilerplate services are wired: `als` (AsyncLocalStorage), `configuration`, `logger`, and `scheduler`. These form the basis of `TServiceParams` — every subsequent service gets access to them. + +The boilerplate module's config definitions are also registered via `LOAD_PROJECT`. This happens before any library code runs, so boilerplate config keys like `LOG_LEVEL` and `NODE_ENV` are always available. + +After boilerplate wiring, any overrides from `bootstrap.configuration` are merged in. These have the highest priority — they override everything, including env vars and config files. + +## Phase 2 — Dependency sorting + +`buildSortOrder()` runs a topological sort on `app.libraries`. It repeatedly selects the next library whose dependencies are all already in the output list. The result is a deterministic load order. + +This runs before any library services are wired. A `BAD_SORT` error here means circular dependencies — fix the structure, not the code. + +If `appendLibrary` was passed in `BootstrapOptions`, those libraries are merged into `app.libraries` before sorting. + +## Phase 3 — Library wiring + +Libraries wire in topological order. For each library: +1. `LOAD_PROJECT` registers its config definitions (defaults applied immediately) +2. `wireOrder(priorityInit, services)` determines the service wiring sequence +3. Each service function is called once, serially, receiving a `TServiceParams` built from everything wired so far + +**What's in `TServiceParams` during library wiring:** +- All boilerplate services (`logger`, `config`, `scheduler`, `als`) +- All services from previously-wired libraries +- `config.*` with defaults (not yet env/argv/file values) + +## Phase 4 — Application wiring (default mode) + +The application's services wire the same way as library services. By this point, all library services are available in `TServiceParams`. + +`priorityInit` controls the order within the application module — same algorithm as libraries. + +## Phase 5 — Lifecycle stages + +After all services are wired, the lifecycle runs four stages in sequence. The framework awaits each stage before starting the next. + +**PreInit:** Runs before config is sourced from external sources. Only defaults are available in `config.*`. Use for registering custom config loaders or very early setup. + +**PostConfig:** Config is sourced and validated here. The `initialize()` function in the configuration service runs the env/argv loader and file loader, then calls `validateConfig()`. If any `required: true` entry has no value, `REQUIRED_CONFIGURATION_MISSING` is thrown. All `onPostConfig` callbacks run after validation. + +**Bootstrap:** All services are wired and config is validated. This is the main initialization stage — open connections, load data, start background processes. + +**Ready:** Application is fully started. Safe to serve traffic, accept connections, and start scheduled jobs. The `scheduler` service activates at this stage — jobs registered before `Ready` didn't fire, and now start on their first scheduled time. + +## What's in RAM at Ready + +At `Ready`, every service's return value is accessible. The `internal.boot.loadedModules` map contains all modules, each with all their service return values. `internal.boot.completedLifecycleEvents` contains `["PreInit", "PostConfig", "Bootstrap", "Ready"]`. + +No service function will ever be called again. The service return values are immutable (though the objects they point to can change state). The dependency graph is fixed. + +## Shutdown + +Shutdown is triggered by `SIGTERM`, `SIGINT`, or `app.teardown()` directly. The process: + +1. All active `sleep()` calls are killed (`ACTIVE_SLEEPS` set is drained) +2. `PreShutdown`, `ShutdownStart`, `ShutdownComplete` run in that order +3. The event emitter's listeners are removed +4. If triggered by signal, `process.exit()` is called with the appropriate exit code + +On `SIGTERM` → exit 143. On `SIGINT` → exit 130. On bootstrap failure → exit 1. On clean teardown without signal → process exits naturally. + +## Why wiring is separate from lifecycle + +This is the central design decision. During wiring, service functions run and return their APIs. At that moment, `TServiceParams` is built incrementally as each service completes. The return values of not-yet-wired services are `undefined`. + +By keeping wiring and lifecycle separate, `priorityInit` can control the dependency order within a module, and `depends`/`libraries` can control it between modules. By the time lifecycle stages run, every service's API is fully available. + +If wiring and `onBootstrap` were the same thing, you'd need a way to declare "my bootstrap callback depends on service X's bootstrap callback completing first" — a much harder problem. The current model eliminates that entire class of initialization ordering bugs. diff --git a/docs/core/guides/config-and-environment.md b/docs/core/guides/config-and-environment.md new file mode 100644 index 0000000..82705f6 --- /dev/null +++ b/docs/core/guides/config-and-environment.md @@ -0,0 +1,155 @@ +--- +title: Config and Environments +sidebar_position: 5 +description: "Configuration flow from definition to validated values; multi-environment patterns." +--- + +## The full config flow + +```mermaid +flowchart TD + A["Config entry declared\nin CreateApplication/Library"] --> B["LOAD_PROJECT runs\n(during wiring)"] + B --> C["default values applied"] + C --> D["env + argv loader runs\n(at PostConfig)"] + D --> E["file loader runs\n(at PostConfig)"] + E --> F["bootstrap.configuration\nmerge (highest priority)"] + F --> G["validateConfig()\n— required check"] + G --> H{"Missing required?"} + H -->|yes| I["REQUIRED_CONFIGURATION_MISSING\n→ bootstrap halts"] + H -->|no| J["TInjectedConfig ready\n— onPostConfig callbacks fire"] +``` + +## Source priority + +Later sources in the merge order override earlier ones: + +1. **`default`** — declared in the config entry +2. **env / argv** — environment variables and CLI flags (merged together in one pass) +3. **file** — `.env` file or the file specified by `--config` +4. **`bootstrap.configuration`** — highest priority; overrides everything + +This means you can always override any config value at bootstrap time, regardless of what env says. + +## Environment variable format + +``` +MODULE_NAME__KEY_NAME=value +``` + +Both the module name and key name are all uppercase, separated by a double underscore (`__`). + +| Config entry | Env var | +|---|---| +| `my_app.DATABASE_URL` | `MY_APP__DATABASE_URL` | +| `my_lib.BASE_URL` | `MY_LIB__BASE_URL` | +| `boilerplate.LOG_LEVEL` | `BOILERPLATE__LOG_LEVEL` | + +## Multi-environment patterns + +The most reliable pattern: use `bootstrap.configuration` to inject environment-specific defaults, and rely on environment variables for per-deployment values. + +```typescript title="src/main.mts (production)" +await MY_APP.bootstrap({ + configuration: { + boilerplate: { LOG_LEVEL: "warn" }, + my_app: { ENVIRONMENT: "production" }, + }, +}); +``` + +```typescript title="src/dev.mts (development)" +await MY_APP.bootstrap({ + configuration: { + boilerplate: { LOG_LEVEL: "debug" }, + my_app: { ENVIRONMENT: "local", PORT: 3001 }, + }, +}); +``` + +```bash +# In production, real values come from environment: +MY_APP__DATABASE_URL=postgres://prod-db/myapp +MY_APP__API_KEY=real-key +``` + +```bash +# In development, .env file provides local values: +MY_APP__DATABASE_URL=postgres://localhost/dev +MY_APP__API_KEY=dev-test-key +``` + +## Secret management + +Use `required: true` without a `default` for secrets. This gives a clear boot failure if the secret is missing: + +```typescript +DATABASE_URL: { + type: "string", + required: true, + // no default +}, +API_KEY: { + type: "string", + required: true, +}, +``` + +In production: inject secrets via environment variables (`MY_APP__DATABASE_URL=...`). Don't hardcode secrets in config files or `bootstrap.configuration`. + +In tests: provide test values via `.configure()`: + +```typescript +runner.configure({ + my_app: { + DATABASE_URL: "postgres://localhost/test", + API_KEY: "test-key", + }, +}); +``` + +## Restricting config sources + +Use `source: ["env"]` on sensitive entries to ensure they can only come from environment variables — not accidentally set via a config file committed to version control: + +```typescript +SECRET_KEY: { + type: "string", + required: true, + source: ["env"], // only settable via environment, never from file or argv +} +``` + +## Config in tests + +Tests don't load env vars or config files by default. All config values come from `default` declarations or `.configure()`: + +```typescript +// In test: required entries must be provided explicitly +await TestRunner(MY_APP) + .configure({ + my_app: { DATABASE_URL: "postgres://test", API_KEY: "test" }, + }) + .run(async ({ config }) => { + // config.my_app.DATABASE_URL === "postgres://test" + }); +``` + +This makes tests deterministic regardless of the environment. + +## Reacting to runtime config changes + +If you use programmatic config updates (e.g., feature flags from a config service), subscribe to changes: + +```typescript +export function FeatureService({ internal, lifecycle }: TServiceParams) { + lifecycle.onBootstrap(() => { + internal.boilerplate.configuration.onUpdate((project, property) => { + if (project === "my_app" && property === "FEATURE_FLAGS") { + updateFeatureFlags(config.my_app.FEATURE_FLAGS); + } + }); + }); +} +``` + +Updates emit `"event_configuration_updated"` on the event bus and trigger `onUpdate` callbacks. diff --git a/docs/core/guides/config-in-production.md b/docs/core/guides/config-in-production.md new file mode 100644 index 0000000..3c3d6c2 --- /dev/null +++ b/docs/core/guides/config-in-production.md @@ -0,0 +1,211 @@ +--- +title: Config in Production +sidebar_position: 7 +description: "Practical patterns for production config: per-type best practices, manifest files, process interrupts, and adapter toggles." +--- + +DA's config system is flexible, but that flexibility means there's always a question of which type to use and how to structure entries. This guide covers patterns that emerge from real production applications. + +For the full type reference, see [Config Types](../reference/config/types.mdx). For source priority and the env variable format, see [Config and Environments](./config-and-environment.md). + +## Per-type use cases + +### string — URLs, names, connection strings + +Most config entries are `string`. Use it for anything that's a URL, a connection string, a service name, or a path. + +```typescript +DATABASE_URL: { type: "string", required: true }, +SERVICE_NAME: { type: "string", default: "my-service" }, +CACHE_URL: { type: "string" }, +``` + +### string + required, no default — secrets that must exist + +A `required: true` entry with no `default` forces the value to come from the environment. The application won't boot if it's missing: + +```typescript +API_KEY: { type: "string", required: true }, +JWT_SECRET: { type: "string", required: true }, +``` + +The boot failure is clear: `REQUIRED_CONFIGURATION_MISSING` with the module and key name. This is better than a runtime `undefined` deep inside a service. + +### string + source: ["env"] — secrets that must never be in a file + +`source` restricts which loaders can provide a value. Use `["env"]` for secrets that should never appear in a config file committed to version control: + +```typescript +SECRET_KEY: { + type: "string", + required: true, + source: ["env"], // env variable only; ignored if set via file or argv +}, +``` + +Combine with `required: true` to get an error if the env variable is missing rather than silently running without the secret. + +### number — limits, timeouts, ports + +Use `number` for tunable values that operations teams might want to adjust without a code change: + +```typescript +PORT: { type: "number", default: 3000 }, +CONNECTION_POOL_SIZE: { type: "number", default: 10 }, +REQUEST_TIMEOUT_MS: { type: "number", default: 5000 }, +MAX_RETRY_ATTEMPTS: { type: "number", default: 3 }, +``` + +### boolean — feature flags and capability toggles + +Use `boolean` for things that are on or off. Default to `true` or `false` depending on whether the feature should be on by default. + +```typescript +ENABLE_METRICS: { type: "boolean", default: true }, +CACHE_ENABLED: { type: "boolean", default: true }, +DEBUG_RESPONSES: { type: "boolean", default: false }, +``` + +Environment variable format: `MY_APP__ENABLE_METRICS=false` (the string `"false"` is coerced to the boolean `false`). + +### boolean for process interrupts + +A `boolean` with no `default` works well for one-off process modes — flags you set explicitly to trigger a specific behavior: + +```typescript +VALIDATE_CONFIG: { type: "boolean" }, // default undefined → falsy +DRY_RUN: { type: "boolean" }, +``` + +These are never `true` in normal operation. Set them via environment variable or `bootstrap.configuration` to activate the behavior. + +For the full validate-config pattern, see [Platform Entrypoints](../advanced/platform-entrypoints.md). + +### string[] — lists of values + +Use `string[]` for lists of identifiers, origins, or names: + +```typescript +ENABLED_BACKENDS: { + type: "string[]", + default: ["backend_a"], +}, +ALLOWED_ORIGINS: { + type: "string[]", + default: [], +}, +``` + +Environment variable format: comma-separated string — `MY_APP__ENABLED_BACKENDS=backend_a,backend_b`. + +### record — key-value maps + +`record` stores a `Record` — free-form key-value data. Use it for label sets, metadata maps, or feature flag dictionaries that you don't want to declare as individual entries: + +```typescript +FEATURE_FLAGS: { + type: "record", + default: {}, +}, +DEPLOYMENT_LABELS: { + type: "record", + default: {}, +}, +``` + +### internal — framework-managed values + +The `internal` type is for values managed by the framework itself, not user configuration. You won't use this type in application code. The canonical example is `boilerplate.CONFIG`, which points to the config file path and can only be set via `source: ["argv"]`. + +--- + +## The manifest file pattern + +In containerized or CI/CD deployments, it's useful to separate secrets (which ops/security controls) from deployment metadata (which infrastructure tooling generates). The manifest file pattern handles this split cleanly. + +Infrastructure tooling — a CI pipeline, an IaC tool, a deployment system — writes a `.manifest.yaml` to the application's working directory at deploy time. It contains non-secret metadata: + +```yaml title=".manifest.yaml" +boilerplate: + LOG_LEVEL: info +my_app: + ENVIRONMENT: production + SERVICE_NAME: my-api + REGION: us-east-1 + FEATURE_FLAGS: + new_checkout_flow: "true" +``` + +The application auto-detects and loads it by setting `boilerplate.CONFIG`: + +```typescript +import { existsSync } from "node:fs"; + +if (existsSync(".manifest.yaml")) { + options.configuration ??= {}; + options.configuration.boilerplate ??= {}; + options.configuration.boilerplate.CONFIG = ".manifest.yaml"; +} +``` + +`boilerplate.CONFIG` is the path to the config file. When set, it overrides the framework's default file discovery (which looks for `.env`). The file can be YAML, JSON, or `.env` format. + +Secrets never go in the manifest. They live in environment variables (or a remote secrets loader — see [Custom Config Loaders](../tutorials/09-custom-config-loader.md)). + +**Rule of thumb:** +- Infrastructure generates it → manifest file +- Ops/security controls it → environment variable +- Changes at runtime without a redeploy → remote loader + +This pattern is most useful when many services share the same deployment toolchain. Each service gets its own manifest generated at deploy time; the bootstrap wrapper auto-loads it. + +--- + +## The adapter enable/disable pattern + +When an application bundles multiple optional backends, use a `boolean` config entry per adapter to control which ones are active in a given environment: + +```typescript title="src/libraries/provider-a/index.mts" +export const LIB_PROVIDER_A = CreateLibrary({ + name: "provider_a", + configuration: { + IS_ACTIVE: { type: "boolean", default: true }, + API_URL: { type: "string", required: true }, + API_KEY: { type: "string", required: true, source: ["env"] }, + }, + // ... +}); +``` + +The adapter's service checks `IS_ACTIVE` before doing anything: + +```typescript +export function ProviderAService({ config, registry }: TServiceParams) { + if (!config.provider_a.IS_ACTIVE) return; // skip registration in this environment + + registry.registry.register({ + name: "provider_a", + // ... + }); +} +``` + +In a dev environment where only one backend is needed: + +```bash +PROVIDER_B__IS_ACTIVE=false +PROVIDER_C__IS_ACTIVE=false +``` + +The libraries are still wired and their config still loads — which means `required: true` entries for inactive adapters will still fail at boot if not provided. Handle this by not marking API keys as `required` when the adapter might be inactive, or by guarding: + +```typescript +API_KEY: { + type: "string", + // Don't use required: true here — the adapter might be IS_ACTIVE: false +}, +``` + +This gives you a single deployment image that runs correctly in any environment, selectively enabling backends via configuration alone. + +For the full plugin/adapter registry pattern, see the [Building a Plugin Registry](/blog/building-a-plugin-registry) blog post. diff --git a/docs/core/guides/dependency-injection.md b/docs/core/guides/dependency-injection.md new file mode 100644 index 0000000..f13fd9b --- /dev/null +++ b/docs/core/guides/dependency-injection.md @@ -0,0 +1,138 @@ +--- +title: Dependency Injection +sidebar_position: 3 +description: "Why DI, how DA's model works, and what LoadedModules actually does." +--- + +Dependency injection is a way of providing a function its collaborators rather than having the function find or create them itself. This guide explains why it matters, how Digital Alchemy implements it, and what the TypeScript trick with `LoadedModules` is actually doing. + +## The problem with global state + +The simplest way to share code between files in Node.js is to put it at module scope: + +```typescript +// db.mts +export const db = new DatabaseClient(); + +// users.service.mts +import { db } from "./db.mts"; + +export async function getUsers() { + return db.query("SELECT * FROM users"); +} +``` + +This works until you try to test it. The `db` instance is created when the module is first imported. By the time your test runs, `db` is already connected to a real database. To test `getUsers`, you need to either mock Node's module system or spin up a real database. + +The alternative — manual prop passing — fixes testability but gets tedious: + +```typescript +export async function getUsers(db: DatabaseClient) { ... } +export async function getOrders(db: DatabaseClient, cache: CacheClient) { ... } +``` + +Every function needs to receive every dependency. Calling `getOrders(db, cache)` requires the caller to have both. As the graph grows, this becomes unmanageable. + +## DA's approach + +Digital Alchemy's DI model is: each service function receives all its dependencies through a single parameter (`TServiceParams`), which is built by the framework from the dependency graph. + +```typescript +export function UserService({ logger, config, my_lib }: TServiceParams) { + // logger: scoped, pre-created + // config: validated at boot + // my_lib: all of MY_LIB's service return values +} +``` + +The function doesn't know where `logger` comes from. It doesn't import it. It doesn't create it. The framework assembles `TServiceParams` and passes it in. + +For testing, you inject a different `TServiceParams`. Replacing `my_lib.database` with a mock is a one-liner in `TestRunner`. + +## How TServiceParams is built + +During wiring, the framework maintains a `loadedModules` map. As each service function returns its value, that value is set in the map under `module.service`. + +When the next service function is called, `TServiceParams` is built by spreading the entire `loadedModules` map: + +```typescript +const serviceParams = { + ...inject, // all loaded module APIs spread by module name + als, // boilerplate + config, // boilerplate + context, // "my_app:service_name" + event, // boilerplate + internal, // boilerplate + lifecycle, // boilerplate + logger, // boilerplate (scoped to this service) + scheduler, // boilerplate (scoped to this service) + params: undefined, // set to self after creation +}; +``` + +When `my_lib` is in `inject`, it carries all of `MY_LIB`'s service return values. TypeScript knows this through the `LoadedModules` declaration. + +## What LoadedModules actually does + +`LoadedModules` is an interface in `@digital-alchemy/core` that starts with only one entry: + +```typescript +export interface LoadedModules { + boilerplate: typeof LIB_BOILERPLATE; +} +``` + +It's designed for TypeScript interface augmentation. When you write: + +```typescript +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +``` + +TypeScript merges your declaration into the existing interface. The result is: + +```typescript +interface LoadedModules { + boilerplate: typeof LIB_BOILERPLATE; + my_app: typeof MY_APP; +} +``` + +`TServiceParams` is defined as: + +```typescript +type TServiceParams = { + als: ...; lifecycle: ...; logger: ...; /* etc */ +} & { + [K in ExternalLoadedModules]: GetApis; +}; +``` + +Where `GetApis` extracts the return types of all services in `MY_APP`. So `my_app.registry` on `TServiceParams` is typed as `ReturnType` — inferred automatically from your service function's return type. + +**The key insight:** TypeScript infers the entire API surface of `my_app` from the shape of the `CreateApplication` call, through `typeof MY_APP`, through `GetApis<>`. No annotations. No type parameters to maintain. Add a service, the type updates. + +## Why this matters for testing + +When `TestRunner` calls `replaceLibrary("database", MOCK_DB)`, it swaps the library at the `loadedModules` level. The `TServiceParams` passed to every test service contains `MOCK_DB`'s service APIs instead of the real ones. The service being tested never knows the difference — it just destructures `{ my_lib }` and calls methods. + +This is only possible because services don't import their dependencies directly. They receive them as parameters, which means any implementation of the same interface can be substituted. + +## Context strings + +Every service gets a `context` property: `"module_name:service_name"`. This is a branded string type (`TContext`) used by the logger and for introspection. + +The logger you receive is pre-bound to this context: + +```typescript +// In my_app:users service: +logger.info("user created"); +// → [INFO][my_app:users]: user created +``` + +The context is set at wiring time and never changes. It identifies exactly where in the dependency graph a log line came from. + +`levelOverrides` in `LoggerOptions` accepts these context strings as keys, letting you raise or lower the log level for specific services without modifying their code. diff --git a/docs/core/guides/index.md b/docs/core/guides/index.md new file mode 100644 index 0000000..7a368bf --- /dev/null +++ b/docs/core/guides/index.md @@ -0,0 +1,17 @@ +--- +title: Guides +sidebar_position: 1 +description: "Deep dives into how Digital Alchemy Core works." +--- + +Guides are narrative explanations with diagrams. Where the reference answers "what does this do?", guides answer "why does it work this way?" and "what's actually happening inside?". + +| Guide | What it covers | +|---|---| +| [Bootstrap Internals](./bootstrap-internals.md) | The exact boot sequence — wiring phases, lifecycle stages, shutdown | +| [Dependency Injection](./dependency-injection.md) | Why DI, how DA's model works, what LoadedModules actually does | +| [Application Structure](./application-structure.md) | Organizing a real multi-service, multi-library application | +| [Config and Environments](./config-and-environment.md) | Config flow from definition to validated values; multi-environment patterns | +| [Testing Strategies](./testing-strategies.md) | Philosophy, unit vs integration, mocking approaches | +| [Log Streaming](./log-streaming.md) | `addTarget`, fire-and-forget delivery, `mergeData`, and ALS tagging | +| [Config in Production](./config-in-production.md) | Per-type patterns, manifest files, adapter toggles | diff --git a/docs/core/guides/log-streaming.md b/docs/core/guides/log-streaming.md new file mode 100644 index 0000000..2f80506 --- /dev/null +++ b/docs/core/guides/log-streaming.md @@ -0,0 +1,236 @@ +--- +title: Log Streaming +sidebar_position: 6 +description: "Stream logs to an external aggregator using addTarget, while keeping stdout intact for local development." +--- + +In production, you need logs in a centralized place: a log aggregator, an observability platform, or a monitoring service. DA's `addTarget` API makes this a service-level concern — an additional sink that runs alongside the built-in logger, not instead of it. + +## What addTarget does + +`internal.boilerplate.logger.addTarget` registers a function that receives every log line emitted by the application. It does not replace stdout or any other registered target — all registered sinks receive every log line. + +```typescript +internal.boilerplate.logger.addTarget((message: string, data: object) => { + // message: the formatted log string + // data: structured log data (level, context, timestamp, etc.) +}); +``` + +Call `addTarget` once during bootstrap (e.g., in a service's top-level body or `onBootstrap` callback). The target is active for the entire lifetime of the process. + +## The fire-and-forget pattern + +Log delivery should never block the calling code or throw an error that crashes your application. Wrap the delivery call in `setImmediate` so the log method returns immediately: + +```typescript +internal.boilerplate.logger.addTarget((message, data) => { + setImmediate(async () => { + await deliverToAggregator(message, data); + }); +}); +``` + +`setImmediate` defers execution to the next iteration of the event loop. The log call returns synchronously; delivery happens asynchronously in the background. + +## Retry logic + +Networks fail. Wrap delivery in a retry loop, but never throw on final failure — a failed log delivery should not crash your application: + +```typescript +const MAX_ATTEMPTS = 3; + +internal.boilerplate.logger.addTarget((message, data) => { + setImmediate(async () => { + for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) { + try { + const response = await globalThis.fetch(AGGREGATOR_URL, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${API_KEY}`, + }, + body: JSON.stringify({ message, ...data }), + }); + + if (response.ok) break; + + if (attempt === MAX_ATTEMPTS) { + console.warn(`Log delivery failed after ${attempt} attempts: ${response.status}`); + } + } catch (error) { + if (attempt === MAX_ATTEMPTS) { + console.warn({ error }, `Log delivery failed after ${attempt} attempts`); + } + } + } + }); +}); +``` + +`console.warn` is used for delivery failures — not the DA logger — to avoid infinite recursion. + +## Conditional registration + +Only register the target if the aggregator is configured. This keeps stdout-only behavior as the fallback for environments where the aggregator isn't set up: + +```typescript +export function LogStreamService({ config, internal }: TServiceParams) { + const endpoint = config.my_app.LOG_AGGREGATOR_URL; + const apiKey = config.my_app.LOG_AGGREGATOR_KEY; + + if (!endpoint || !apiKey) { + // No aggregator configured — stdout only + return; + } + + internal.boilerplate.logger.addTarget((message, data) => { + setImmediate(async () => { + // ... delivery logic + }); + }); +} +``` + +## JSON output and suppressing stdout + +`loggerOptions.pretty: false` switches the built-in logger to structured JSON output. This is what aggregators expect to index. + +If you're shipping all logs via `addTarget` and don't want them also printed to stdout in the deployed environment, set `loggerOptions.stdOut: false`: + +```typescript title="src/environments/prod.mts" +await MY_APP.bootstrap({ + loggerOptions: { + pretty: false, // JSON output + stdOut: false, // don't also print to terminal — aggregator has everything + }, +}); +``` + +In local development, keep both at their defaults (`pretty: true`, `stdOut: true`) — you want readable terminal output. Because the configuration lives in the entrypoint file, not in the service code, there are no conditional checks in `LogStreamService`. + +## Tagging every log with mergeData + +`loggerOptions.mergeData` merges a static object into every log line. This is how you tag logs with deployment-level metadata: environment name, service name, git commit, instance identifier. + +In containerized or orchestrated deployments, `hostname()` from `node:os` gives you the pod/container name, making it easy to correlate log lines with a specific instance: + +```typescript title="src/environments/prod.mts" +import { hostname } from "node:os"; + +await MY_APP.bootstrap({ + loggerOptions: { + als: true, + pretty: false, + mergeData: { + NODE_ENV: process.env.NODE_ENV, + host: hostname(), // container/pod name in orchestrated deployments + service: "my-api", + version: process.env.APP_VERSION, + }, + }, +}); +``` + +Every log line emitted by the application — whether from your services, the framework, or libraries — will include these fields. + +In local development, `mergeData` is usually not needed. The terminal output is already namespaced by service context. Save it for environments where logs from many instances land in the same aggregator and you need to filter by `host` or `service`. + +## ALS: per-request context in every log line + +`loggerOptions.als: true` integrates with DA's Async Local Storage extension. When you set context data on an incoming HTTP request (request ID, user ID, trace ID), that data is automatically merged into every log line emitted within that request's async execution context — including calls to services you didn't write. + +```typescript title="src/services/http.service.mts" +export function HttpService({ hass, internal, lifecycle }: TServiceParams) { + lifecycle.onReady(() => { + server.addHook("onRequest", (request, reply, done) => { + internal.boilerplate.als.set({ + requestId: request.headers["x-request-id"], + userId: request.headers["x-user-id"], + }); + done(); + }); + }); +} +``` + +With `als: true`, every log emitted during that request's lifecycle includes `requestId` and `userId` — no manual passing of context objects. See [Async Local Storage](../advanced/async-local-storage.md) for the full setup. + +## Full example + +```typescript title="src/services/log-stream.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +const MAX_ATTEMPTS = 3; + +export function LogStreamService({ config, context, internal, logger }: TServiceParams) { + const endpoint = config.my_app.LOG_AGGREGATOR_URL; + const apiKey = config.my_app.LOG_AGGREGATOR_KEY; + + if (!endpoint || !apiKey) { + logger.debug("no log aggregator configured, using stdout only"); + return; + } + + internal.boilerplate.logger.addTarget((message, data) => { + setImmediate(async () => { + for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) { + try { + const response = await globalThis.fetch(endpoint, { + method: "POST", + headers: { + "Content-Type": "application/json", + Authorization: `Bearer ${apiKey}`, + }, + body: JSON.stringify({ message, ...data }), + }); + + if (response.ok) break; + + if (attempt === MAX_ATTEMPTS) { + console.warn( + `[${context}] log delivery failed after ${attempt} attempts: HTTP ${response.status}`, + ); + } + } catch (error) { + if (attempt === MAX_ATTEMPTS) { + console.warn( + `[${context}] log delivery failed after ${attempt} attempts`, + error, + ); + } + } + } + }); + }); + + logger.info("log streaming active"); +} +``` + +Config entries for this service: + +```typescript +LOG_AGGREGATOR_URL: { + type: "string", + description: "HTTP log ingest endpoint. If unset, logs go to stdout only.", +}, +LOG_AGGREGATOR_KEY: { + type: "string", + source: ["env"], // never from a config file +}, +``` + +## Summary + +| Goal | How | +|---|---| +| Add a log sink without replacing stdout | `addTarget` | +| Never block on log delivery | Wrap in `setImmediate` | +| Handle transient failures | Retry loop; `console.warn` on final failure | +| JSON output for aggregators | `loggerOptions.pretty: false` | +| Skip stdout in deployed environments | `loggerOptions.stdOut: false` | +| Tag every log with deployment metadata | `loggerOptions.mergeData` | +| Per-request context in logs | `loggerOptions.als: true` + ALS setup | + +For the full `loggerOptions` field reference, see [Project Tuning](../advanced/project-tuning.md). diff --git a/docs/core/guides/testing-strategies.md b/docs/core/guides/testing-strategies.md new file mode 100644 index 0000000..aea81ed --- /dev/null +++ b/docs/core/guides/testing-strategies.md @@ -0,0 +1,179 @@ +--- +title: Testing Strategies +sidebar_position: 6 +description: "Testing philosophy for DA Core — unit vs integration, mocking, lifecycle testing." +--- + +## Philosophy + +Digital Alchemy is designed to be tested through its own API. The `TestRunner` boots your real application (or a modified version of it) in an isolated environment. You test the same code that runs in production, with the same lifecycle, the same config system, and the same service wiring. + +The goal is not to mock everything — it's to replace only what you need to replace. + +## Unit testing individual service logic + +For pure logic that doesn't depend on other services, you don't need TestRunner at all. Extract the logic into regular functions and test them directly: + +```typescript +// users.logic.mts — pure logic +export function validateEmail(email: string): boolean { + return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email); +} + +// users.logic.test.mts — no TestRunner needed +it("validates email format", () => { + expect(validateEmail("user@example.com")).toBe(true); + expect(validateEmail("not-an-email")).toBe(false); +}); +``` + +Services that have testable business logic benefit from this extraction. The service function handles wiring and lifecycle; pure functions handle computation. + +## Integration testing with TestRunner + +For testing that involves service interactions, lifecycle callbacks, config, or scheduler behavior — use `TestRunner`: + +```typescript +it("creates a user and emits an event", async () => { + const events: unknown[] = []; + + await TestRunner(MY_APP) + .appendService(function capture({ event }: TServiceParams) { + event.on("user:created", e => events.push(e)); + }) + .run(async ({ my_app }) => { + await my_app.users.create({ name: "Alice", email: "alice@example.com" }); + }); + + expect(events).toHaveLength(1); + expect(events[0]).toMatchObject({ name: "Alice" }); +}); +``` + +This test: +- Boots the real application +- Injects a capture service to observe events +- Calls a real service method +- Verifies behavior through the observable side effect + +## Mocking with replaceLibrary + +When a service depends on a library that makes real network calls or writes to a real database, replace it for tests: + +```typescript title="test/mocks/database.mock.mts" +export const MOCK_DB = CreateLibrary({ + name: "database", // must match real library name + services: { + query: MockQueryService, + connection: MockConnectionService, + }, +}); +``` + +```typescript title="test/orders.test.mts" +it("places an order", async () => { + await TestRunner(MY_APP) + .replaceLibrary("database", MOCK_DB) + .configure({ my_app: { API_KEY: "test" } }) + .run(async ({ my_app, database }) => { + const order = await my_app.orders.place({ userId: "1", items: ["a"] }); + expect(order.id).toBeDefined(); + expect(database.query.calls).toContain("INSERT INTO orders"); + }); +}); +``` + +The application code (`OrdersService`) is completely unmodified — it still calls `database.query(...)`. The mock library intercepts those calls. + +## Testing lifecycle callbacks + +Lifecycle callbacks run during `TestRunner` boot, just like production. You can verify them directly: + +```typescript +it("warms up cache on bootstrap", async () => { + await TestRunner(MY_APP) + .replaceLibrary("cache", MOCK_CACHE) + .run(async ({ cache }) => { + // onBootstrap in CacheService called cache.warmUp() — verify it ran + expect(cache.warmUpCalled).toBe(true); + }); +}); +``` + +For testing that shutdown cleanup runs correctly: + +```typescript +it("closes connections on teardown", async () => { + let closeCalled = false; + const runner = TestRunner(MY_APP); + await runner.run(async ({ my_app }) => { + my_app.database.onClose(() => { closeCalled = true; }); + }); + // teardown runs automatically at end of .run() + expect(closeCalled).toBe(true); +}); +``` + +## Shared state with beforeAll + +For tests that simulate a sequence of operations on a running application, use `serviceParams()` with `beforeAll`/`afterAll`: + +```typescript +describe("order workflow", () => { + const runner = TestRunner(MY_APP).replaceLibrary("database", MOCK_DB); + let params: TServiceParams; + + beforeAll(async () => { + params = await runner.serviceParams(); + }); + + afterAll(() => runner.teardown()); + + it("creates user", async () => { + await params.my_app.users.create({ name: "Alice" }); + }); + + it("places order for user", async () => { + const user = await params.my_app.users.find({ name: "Alice" }); + await params.my_app.orders.place({ userId: user.id, items: ["a"] }); + }); + + it("confirms order", async () => { + const orders = await params.my_app.orders.list(); + expect(orders).toHaveLength(1); + }); +}); +``` + +State persists across `it` blocks because they share the same running application instance. This is intentional — it simulates a real workflow. + +## Configuration in tests + +Avoid relying on real environment variables in tests. Use `.configure()` to provide deterministic values: + +```typescript +runner.configure({ + my_app: { + DATABASE_URL: "postgres://localhost/test", + PORT: 9999, + LOG_LEVEL: "error", + }, +}); +``` + +For integration tests that need real environment values, opt in explicitly: + +```typescript +runner.setOptions({ loadConfigs: true }); +``` + +## When to use plain function tests vs TestRunner + +| Scenario | Approach | +|---|---| +| Pure business logic (validation, transformation) | Plain function tests | +| Service with lifecycle callbacks | TestRunner | +| Service that calls other services | TestRunner with mocks | +| Full integration with real dependencies | TestRunner, `loadConfigs: true` | +| Testing shutdown cleanup | TestRunner | +| Testing config validation | TestRunner with `.configure()` | diff --git a/docs/core/index.md b/docs/core/index.md deleted file mode 100644 index 6019a97..0000000 --- a/docs/core/index.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: 🧩 Core Framework -id: core_index -sidebar_position: 1 -description: "Hub page for core library tools" ---- - -[![codecov](https://codecov.io/github/Digital-Alchemy-TS/core/graph/badge.svg?token=IBGLY3RY68)](https://codecov.io/github/Digital-Alchemy-TS/core) -[![version](https://img.shields.io/github/package-json/version/Digital-Alchemy-TS/core)](https://www.npmjs.com/package/@digital-alchemy/core) -[![stars](https://img.shields.io/github/stars/Digital-Alchemy-TS/core)](https://github.com/Digital-Alchemy-TS/core) - -Digital Alchemy is a batteries included general purpose framework for building NodeJS applications within Typescript. -It is agnostic to use cases and runtimes, having no issus powering Home Automation apps, production web servers, small scripts and more! - -The core framework provides all the basic tools needed to get a production grade application started including: -- configuration -- logging -- service wiring -- lifecycle & testing hooks - -The project places a strong focus on code ergonomics and type safety within applications. -Services and modules are automatically assembled into a convenient api, making feature discovery within your modules a breeze! - -Tools are built on top of a minimal ESModule based stack for minimal overhead and easy prortability to your favorite runtime. diff --git a/docs/core/index.mdx b/docs/core/index.mdx new file mode 100644 index 0000000..c73d1f3 --- /dev/null +++ b/docs/core/index.mdx @@ -0,0 +1,32 @@ +--- +title: 🧩 Core Framework +sidebar_label: Core Framework +sidebar_position: 0 +description: "Digital Alchemy Core — ergonomic, type-safe Node.js application framework" +--- + +import EmbeddedEditor from '@site/src/components/EmbeddedEditor'; +import { files, defaultFile } from '@site/src/examples/core/get-started/first-app'; + +[![codecov](https://codecov.io/github/Digital-Alchemy-TS/core/graph/badge.svg?token=IBGLY3RY68)](https://codecov.io/github/Digital-Alchemy-TS/core) +[![version](https://img.shields.io/github/package-json/version/Digital-Alchemy-TS/core)](https://www.npmjs.com/package/@digital-alchemy/core) + +Digital Alchemy Core is a batteries-included, low-dependency TypeScript framework for building Node.js applications. It provides dependency injection, a structured lifecycle, type-safe configuration, and testing utilities — with no magic, no decorators, and no reflection. Just plain functions. + +The framework is runtime-agnostic (Node, Bun, Deno, tsx) and places a strong emphasis on **ergonomics**: your editor knows exactly what services are available in every function, without any extra tooling. + +## Interactive example + +The three files below form a complete Digital Alchemy application. Edit them — IntelliSense is live. + + + +## What's in this section + +| | | +|---|---| +| [Get Started](./get-started/index.md) | Install, first app, next steps | +| [Tutorials](./tutorials/index.md) | Step-by-step learning path | +| [Reference](./reference/index.md) | Complete API reference | +| [Guides](./guides/index.md) | Deep dives into how things work | +| [Advanced](./advanced/index.md) | ALS, boot metrics, project tuning | diff --git a/docs/core/install/index.md b/docs/core/install/index.md deleted file mode 100644 index 9907fe4..0000000 --- a/docs/core/install/index.md +++ /dev/null @@ -1,103 +0,0 @@ ---- -title: Installation -id: install -sidebar_position: 0 -description: "" ---- - -Digital Alchemy installs as a basic npm package, which contains all of the basic application wiring and testing utilities. - -```bash -yarn add @digital-alchemy/core -``` - -After installation, you are able to open a file and dive right in with creating your application. - -## Building Applications - -#### Services - -```typescript -import { TServiceParams } from "@digital-alchemy/core"; - -export function MyFirstService({ logger, example_app }: TServiceParams) { - logger.info("hello world"); -} -``` - -#### Modules - -```typescript -import { CreateAppplication } from "@digital-alchemy/core"; -import { MyFirstService } from "./my.service.mts"; - -// Define the structure of your application -export const MY_APPLICATION = CreateApplication({ - name: "example_app", - services: { - my_service: MyFirstService - } -}); - -// Enable type support for services -declare module "@digital-alchemy/core" { - export interface LoadedModules { - example_app: typeof MY_APPLICATION - } -} -``` - -## Running your application - -Digital-Alchemy is runtime agnostic, so specific instructions vary on your use situations. - -- [deno](https://deno.land/manual) / [bun](https://bun.sh/docs) supported -- building with Typescript & running with node supported -- [tsx](https://github.com/esbuild-kit/tsx) based servers supported - -All approachs will need an entrypoint file. It is best practice to keep this file separate from your module definitions, allowing for different entrypoints depending on your needs. - -``` -src/environments/main.mts -src/environments/production-main.mts -``` - -```typescript -import { MY_APPLICATION } from "../application.module.mts"; - -await MY_APPLICATION.bootstrap({ - configuration: { - // entrypoint specific overrides - } -}); -``` - -```bash -npx tsx src/environments/main.mts -``` - -## Dependency Notes - -### Day.JS - -[dayjs](https://day.js.org/) is the preferred utility for date/time logic. -Digital Alchemy utilizes a few non-default plugins, which may not properly reflect by default in your editor. - -Including this code somewhere in your project will resolve any missing types - -```typescript -import dayjs from "dayjs"; -import duration from "dayjs/plugin/duration.js"; -import isBetween from "dayjs/plugin/isBetween.js"; -import weekOfYear from "dayjs/plugin/weekOfYear.js"; - -dayjs.extend(isBetween); -dayjs.extend(weekOfYear); -dayjs.extend(duration); -``` - -#### Docs - -- [Duration](https://day.js.org/docs/en/plugin/duration) -- [isBetween](https://day.js.org/docs/en/plugin/is-between) -- [duration](https://day.js.org/docs/en/plugin/duration) diff --git a/docs/core/libraries/index.md b/docs/core/libraries/index.md deleted file mode 100644 index 37cfea4..0000000 --- a/docs/core/libraries/index.md +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: Libraries -id: libraries -sidebar_position: 3 -description: "" ---- - -Library modules are intended to help organize and contain groupings of logic. - -| name | description | -| --------------- | ------------------------------------------------------------------ | -| `configuration` | A mapping of configuration options this module declares | -| `name` | Application name — influences **configuration** & `TServiceParams` | -| `depends` | An array of dependency libraries that must be loaded first | -| `optionalDepends` | An array of dependency libraries that must be loaded first (if provided by application module) | -| `services` | Object of service classes to register in the application | -| `priorityInit` | Optional array to control service initialization order | - -## Example Code - -### Minimum - -```typescript -import { CreateLibrary } from "@digital-alchemy/core"; - -import { APIService } from "./services/index.mts"; - -export const MY_LIB = CreateLibrary({ - name: "my_app", - services: { - api: APIService, - }, -}); - -declare module "@digital-alchemy/core" { - export interface LoadedModules { - // key must match name - my_app: typeof MY_APPLICATION; - } -} -``` - -### Full - -More advanced setup with libraries, configuration, and prioritized services: - -```typescript -import { CreateLibrary } from "@digital-alchemy/core"; -import { LIB_UTILS } from "@cool-org/logic"; - -import { - DatabaseService, - LoaderService, - SpecialLogicService, -} from "./services/index.mts"; - -export const MY_APPLICATION = CreateLibrary({ - // Optional: declare configuration values used by services - configuration: { - DATABASE_URL: { - type: "string", - required: true, - }, - }, - depends: [LIB_UTILS], - name: "my_app", - // Ensures database loads before loader - priorityInit: ["database", "loader"], - services: { - database: DatabaseService, - loader: LoaderService, - logic: SpecialLogicService, - }, -}); - -declare module "@digital-alchemy/core" { - export interface LoadedModules { - my_app: typeof MY_APPLICATION; - } -} -``` diff --git a/docs/core/reference/application/bootstrap.md b/docs/core/reference/application/bootstrap.md new file mode 100644 index 0000000..b4f6bc3 --- /dev/null +++ b/docs/core/reference/application/bootstrap.md @@ -0,0 +1,120 @@ +--- +title: Bootstrap Options +sidebar_position: 2 +description: "All BootstrapOptions fields, process exit codes, and signal handling." +--- + +`bootstrap()` accepts an optional `BootstrapOptions` object. All fields are optional. + +```typescript +await MY_APP.bootstrap({ + configuration: { boilerplate: { LOG_LEVEL: "debug" } }, + bootLibrariesFirst: true, + loggerOptions: { mergeData: { env: "production" } }, +}); +``` + +## Options reference + +| Field | Type | Default | Description | +|---|---|---|---| +| `configuration` | `PartialConfiguration` | — | Override config values at highest priority | +| `bootLibrariesFirst` | `boolean` | `false` | Boot libraries through Bootstrap before wiring app services | +| `appendLibrary` | `TLibrary \| TLibrary[]` | — | Add extra libraries after construction | +| `appendService` | `ServiceMap` | — | Add extra services to the application | +| `loggerOptions` | `LoggerOptions` | — | Fine-tune the built-in logger | +| `customLogger` | `GetLogger` | — | Replace the built-in logger entirely | +| `handleGlobalErrors` | `boolean` | `true` | Catch uncaught exceptions and unhandled rejections | +| `showExtraBootStats` | `boolean` | `false` | Print per-service construction times after boot | +| `envFile` | `string` | `".env"` | Path to `.env` file for config sourcing | +| `configSources` | `Partial>` | all `true` | Enable/disable specific config loaders | + +### `configuration` + +Provides config values at the highest priority — overrides env, argv, and file sources. Uses the same `PartialConfiguration` type as `.configure()` in `TestRunner`. + +```typescript +await MY_APP.bootstrap({ + configuration: { + boilerplate: { LOG_LEVEL: "warn" }, + my_app: { DATABASE_URL: "postgres://localhost/mydb", PORT: 5432 }, + }, +}); +``` + +### `bootLibrariesFirst` + +By default, all services (library and application) are wired first, then lifecycle stages run for everything together. With `bootLibrariesFirst: true`, the sequence changes: + +```mermaid +sequenceDiagram + participant L as Libraries + participant A as Application + participant LC as Lifecycle + + Note over L,LC: Default (bootLibrariesFirst: false) + L->>L: wire library services + A->>A: wire application services + LC->>LC: PreInit → PostConfig → Bootstrap → Ready (all together) + + Note over L,LC: bootLibrariesFirst: true + L->>L: wire library services + LC->>LC: PreInit → PostConfig → Bootstrap (libraries only) + A->>A: wire application services + LC->>LC: Ready (everything) +``` + +Use `bootLibrariesFirst: true` when application services need library resources (a database connection, a cache client) to be fully established before their own service function body runs — not just before a lifecycle callback. + +### `appendLibrary` / `appendService` + +Adds libraries or services that weren't declared in the original `CreateApplication` call. Useful for test helpers, plugins, or runtime-determined extensions. If a name collides with an existing library or service, the appended version takes priority. + +### `loggerOptions` + +Fine-tune the built-in logger without replacing it. See [Project Tuning](../../advanced/project-tuning.md) for all `LoggerOptions` fields. + +```typescript +loggerOptions: { + mergeData: { env: process.env.NODE_ENV, host: hostname() }, + ms: true, + counter: false, +} +``` + +### `customLogger` + +Replace the built-in logger with your own implementation. Must implement the `GetLogger` interface. Useful for integrating with external logging systems (Datadog, OpenTelemetry). + +### `configSources` + +Disable specific config loaders. By default all sources are enabled. Setting a source to `false` prevents that loader from running. + +```typescript +configSources: { + env: false, // ignore environment variables + argv: false, // ignore command-line arguments +} +``` + +## Process exit codes + +The framework registers `SIGTERM` and `SIGINT` handlers automatically. On signal receipt, it runs the full shutdown sequence then exits with the appropriate code: + +| Event | Exit code | +|---|---| +| Bootstrap error | `1` (`EXIT_ERROR`) | +| `SIGINT` (Ctrl+C) | `130` | +| `SIGTERM` | `143` | + +Normal application exit (all lifecycle callbacks complete without error) does not call `process.exit()` — the Node.js process exits naturally. + +## Common errors + +| Error cause | What it means | +|---|---| +| `DOUBLE_BOOT` | `bootstrap()` called on an already-running application | +| `BAD_SORT` | Circular dependency between libraries | +| `MISSING_DEPENDENCY` | A library's `depends` entry is not in the app's `libraries` array | +| `REQUIRED_CONFIGURATION_MISSING` | A `required: true` config entry has no value at `PostConfig` | +| `MISSING_PRIORITY_SERVICE` | A name in `priorityInit` doesn't exist in `services` | diff --git a/docs/core/reference/application/create-application.md b/docs/core/reference/application/create-application.md new file mode 100644 index 0000000..9df74be --- /dev/null +++ b/docs/core/reference/application/create-application.md @@ -0,0 +1,131 @@ +--- +title: CreateApplication +sidebar_position: 1 +description: "All options for CreateApplication and the ApplicationDefinition API." +--- + +`CreateApplication` creates the top-level module that owns bootstrap. You call it once per entrypoint. The returned `ApplicationDefinition` has `bootstrap()` and `teardown()` methods. + +```typescript +import { CreateApplication } from "@digital-alchemy/core"; + +export const MY_APP = CreateApplication({ + name: "my_app", + services: { ... }, + libraries: [...], + configuration: { ... }, + priorityInit: [...], +}); +``` + +## Options + +| Property | Type | Required | Description | +|---|---|---|---| +| `name` | `keyof LoadedModules` | ✅ | Module name — must match the key in `LoadedModules` | +| `services` | `ServiceMap` | ✅ | Object mapping service names to service functions | +| `libraries` | `LibraryDefinition[]` | — | Libraries to load before application services | +| `configuration` | `ModuleConfiguration` | — | Config entry declarations for this module | +| `priorityInit` | `string[]` | — | Services to wire first, in listed order | + +### `name` + +The `name` must exactly match the key you declare in `LoadedModules`: + +```typescript +export const MY_APP = CreateApplication({ name: "my_app", ... }); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; // ← key must match name + } +} +``` + +If they don't match, `TServiceParams` won't have a typed entry for your app's services. + +### `services` + +An object mapping string keys to service functions. Each service function must match the `ServiceFunction` signature — a function that receives `TServiceParams` and returns any value or a Promise. + +```typescript +services: { + auth: AuthService, + database: DatabaseService, + api: ApiService, +} +``` + +### `libraries` + +An array of `LibraryDefinition` objects (created by `CreateLibrary`). Libraries in this array are wired before application services. The order is determined by the dependency graph, not by array position — but listing them in dependency order is good practice. + +```typescript +libraries: [MY_LIB, OTHER_LIB] +``` + +If a library has `depends: [X]` and `X` is not in this array, bootstrap throws `MISSING_DEPENDENCY`. + +### `configuration` + +Config entry declarations for this module. See [Configuration Overview](../config/overview.md) for the full type reference. + +### `priorityInit` + +Names of services to wire first, in the listed order. Useful when a service needs another service's return value at wiring time (not just inside a lifecycle callback). + +```typescript +priorityInit: ["database", "cache"] // database wires first, then cache, then everything else +``` + +If a name in `priorityInit` doesn't exist in `services`, bootstrap throws `MISSING_PRIORITY_SERVICE`. + +## Methods + +### `bootstrap(options?)` + +Starts the application. Returns a `Promise` that resolves when `Ready` completes. + +```typescript +await MY_APP.bootstrap({ + configuration: { my_app: { PORT: 8080 } }, +}); +``` + +See [Bootstrap Options](./bootstrap.md) for all available options. + +Throws `DOUBLE_BOOT` if called on an application that's already running. + +### `teardown()` + +Runs shutdown stages (`PreShutdown` → `ShutdownStart` → `ShutdownComplete`) and cleans up all resources. Called automatically on `SIGTERM` and `SIGINT`. + +```typescript +await MY_APP.teardown(); +``` + +Safe to call if the application is not booted — it's a no-op in that case. + +## Type pattern + +The standard pattern is to export the application from a definition file and import it in entrypoints and tests: + +```typescript title="src/app.mts" +export const MY_APP = CreateApplication({ ... }); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { my_app: typeof MY_APP; } +} +``` + +```typescript title="src/main.mts" +import { MY_APP } from "./app.mts"; +await MY_APP.bootstrap(); +``` + +```typescript title="src/main.dev.mts" +import { MY_APP } from "./app.mts"; +await MY_APP.bootstrap({ configuration: { boilerplate: { LOG_LEVEL: "debug" } } }); +``` + +This keeps the module definition separate from bootstrap options, making it easy to have multiple entrypoints with different configurations. diff --git a/docs/core/reference/builtins/event.md b/docs/core/reference/builtins/event.md new file mode 100644 index 0000000..74c5bd0 --- /dev/null +++ b/docs/core/reference/builtins/event.md @@ -0,0 +1,95 @@ +--- +title: Event Bus +sidebar_position: 4 +description: "App-wide EventEmitter, typed events, and error event constants." +--- + +`event` on `TServiceParams` is a Node.js `EventEmitter` shared across all services in the application. It's the same instance in every service — emitting in one service is received in all others. + +## Basics + +```typescript +export function UserService({ event, lifecycle }: TServiceParams) { + // Register a listener + event.on("user:created", (user: { id: string; name: string }) => { + logger.info({ user }, "user created"); + }); + + // Emit an event + const createUser = (name: string) => { + const user = { id: crypto.randomUUID(), name }; + event.emit("user:created", user); + return user; + }; + + return { createUser }; +} +``` + +The `EventEmitter` API is Node's standard `node:events` interface. All methods work as documented in the Node.js docs. + +## Lifecycle + +The event emitter is created fresh at each `bootstrap()` call and destroyed (`.removeAllListeners()`) at `teardown()`. This ensures test isolation — no listeners leak between test runs. + +## Typed events + +TypeScript doesn't know the type of event payloads by default. The idiomatic pattern is to define event type maps and cast when emitting/receiving: + +```typescript +// Define types in a shared types file +type AppEvents = { + "user:created": { id: string; name: string }; + "order:placed": { orderId: string; total: number }; +}; + +// Emit with type assertion +event.emit("user:created", { id: "123", name: "Alice" } satisfies AppEvents["user:created"]); + +// Receive with cast +event.on("user:created", (payload: AppEvents["user:created"]) => { + // payload is typed +}); +``` + +For more thorough typing, you can use declaration merging (similar to `LoadedModules`) to extend a custom interface, or use a typed EventEmitter wrapper library. + +## Error events + +The framework defines three error event constants for framework-level error signaling: + +| Constant | Value | When emitted | +|---|---|---| +| `DIGITAL_ALCHEMY_NODE_GLOBAL_ERROR` | `"DIGITAL_ALCHEMY_NODE_GLOBAL_ERROR"` | Uncaught exceptions (when `handleGlobalErrors: true`) | +| `DIGITAL_ALCHEMY_APPLICATION_ERROR` | `"DIGITAL_ALCHEMY_APPLICATION_ERROR"` | Application-level errors | +| `DIGITAL_ALCHEMY_LIBRARY_ERROR(lib?)` | `"DIGITAL_ALCHEMY_LIBRARY_ERROR"` or `"DIGITAL_ALCHEMY_LIBRARY_ERROR:libname"` | Library-level errors | + +```typescript +import { + DIGITAL_ALCHEMY_NODE_GLOBAL_ERROR, + DIGITAL_ALCHEMY_LIBRARY_ERROR, +} from "@digital-alchemy/core"; + +event.on(DIGITAL_ALCHEMY_NODE_GLOBAL_ERROR, (error: Error) => { + // Log to external system before shutdown + errorTracker.capture(error); +}); + +event.on(DIGITAL_ALCHEMY_LIBRARY_ERROR("my_lib"), (error: Error) => { + // Handle library-specific errors +}); +``` + +## Best practices + +Register listeners in the service function body, not inside lifecycle callbacks. The event emitter is available during wiring, and you want listeners registered before the `Ready` stage in case events fire during `Bootstrap`. + +```typescript +export function ListenerService({ event }: TServiceParams) { + // ✅ Register at wiring time — listeners are in place for all lifecycle stages + event.on("important:event", handleEvent); + + // ❌ Don't register in lifecycle callbacks unless you have a specific reason + // lifecycle.onReady(() => { event.on("event", handler); }); // too late +} +``` diff --git a/docs/core/reference/builtins/index.md b/docs/core/reference/builtins/index.md new file mode 100644 index 0000000..576d887 --- /dev/null +++ b/docs/core/reference/builtins/index.md @@ -0,0 +1,48 @@ +--- +title: Builtins +sidebar_position: 1 +description: "Built-in services always available on TServiceParams, and standalone utility exports." +--- + +Digital Alchemy Core provides several built-in services that are wired automatically before any library or application services run. They're always available on `TServiceParams` — no `depends` declaration needed. + +## Built-in services (on TServiceParams) + +| Service | Type | Description | +|---|---|---| +| `logger` | `GetLogger` | Context-scoped logger | +| `lifecycle` | `TLifecycleBase` | Lifecycle hook registration | +| `config` | `TInjectedConfig` | Typed configuration object | +| `scheduler` | `TScheduler` | Cron, interval, and timeout scheduling | +| `event` | `EventEmitter` | App-wide event bus | +| `als` | `AlsExtension` | Async Local Storage | +| `internal` | `InternalDefinition` | Utilities and boot metadata | + +These are part of the `boilerplate` module, which always wires first. They live at `config.boilerplate.*` for configuration and are wired in this order: `als` → `configuration` → `logger` → `scheduler`. + +## Standalone exports + +These utilities are exported directly from `@digital-alchemy/core` and imported at the module level — they don't appear on `TServiceParams`. + +| Export | Description | +|---|---| +| `is` | Type guard singleton | +| `sleep` | Async sleep with cancel support | +| `debounce` | Identifier-keyed debounce | +| `each` | Parallel `Promise.all` over array/Set | +| `eachSeries` | Sequential iteration | +| `eachLimit` | Bounded-concurrency iteration | +| `SECOND`, `MINUTE`, `HOUR`, `DAY`, `WEEK` | Millisecond constants | + +```typescript +import { is, sleep, each, SECOND } from "@digital-alchemy/core"; +``` + +See [Utilities](./utilities.md) for detailed documentation on each. + +## See also + +- [Logger](./logger.md) +- [Scheduler](./scheduler.md) +- [Event Bus](./event.md) +- [Utilities](./utilities.md) diff --git a/docs/core/reference/builtins/logger.md b/docs/core/reference/builtins/logger.md new file mode 100644 index 0000000..d084ff6 --- /dev/null +++ b/docs/core/reference/builtins/logger.md @@ -0,0 +1,128 @@ +--- +title: Logger +sidebar_position: 2 +description: "GetLogger API, log levels, targets, overrides, and custom loggers." +--- + +The logger is a context-scoped `GetLogger` instance injected into every service. It's pre-bound to the service's context string (`module:service`), so every log line is automatically tagged. + +## ILogger methods + +Six methods, two call signatures each: + +```typescript +logger.trace("message"); +logger.trace({ key: "value" }, "message"); + +logger.debug("message"); +logger.debug({ key: "value" }, "message with data"); + +logger.info("application started"); +logger.info({ port: 3000 }, "listening"); + +logger.warn("something unexpected happened"); +logger.warn({ error }, "non-fatal error"); + +logger.error("operation failed"); +logger.error({ error, input }, "failed to process"); + +logger.fatal("unrecoverable error"); +``` + +## Log levels + +Levels in order from most verbose to least: + +| Level | When to use | +|---|---| +| `trace` | Framework internals; very noisy | +| `debug` | Diagnostic information, per-operation details | +| `info` | High-level events; normal operation | +| `warn` | Non-critical issues; unexpected but recoverable | +| `error` | Operation failures; external API errors | +| `fatal` | Unrecoverable situations | +| `silent` | Suppress all logs | + +Set the minimum level via `boilerplate.LOG_LEVEL` config (default: `"trace"`). + +## Log level overrides + +Override the log level for specific services or modules via `loggerOptions.levelOverrides` in `BootstrapOptions`: + +```typescript +await MY_APP.bootstrap({ + loggerOptions: { + levelOverrides: { + "my_app": "warn", // module-level: suppress debug/info for whole module + "my_app:database": "debug", // service-level: verbose for one service + }, + }, +}); +``` + +Keys can be either a module name (`"my_app"`) or a dotted service path (`"my_app:database"`). + +## Output format + +By default, logs are pretty-printed to stdout with a timestamp prefix: + +``` +[Mon 09:00:00.000] [INFO][my_app:api]: server started +[Mon 09:00:00.000] [INFO][my_app:api]: { port: 3000 } server started +``` + +Set `loggerOptions.pretty: false` for JSON output (useful in production log aggregators). + +## Adding log targets + +Pipe logs to additional destinations using `internal.boilerplate.logger.addTarget()`: + +```typescript +export function LoggingService({ internal, lifecycle }: TServiceParams) { + lifecycle.onBootstrap(() => { + internal.boilerplate.logger.addTarget((message, data) => { + // Send to Datadog, Loki, custom sink, etc. + myLogSink.write({ message, ...data }); + }); + }); +} +``` + +The target receives the formatted message string and the data object. + +## Replacing the logger + +To use a completely different logger implementation, pass `customLogger` in `BootstrapOptions`: + +```typescript +await MY_APP.bootstrap({ + customLogger: myCustomLogger, // must implement GetLogger +}); +``` + +For compile-time type replacement (custom logger methods beyond the default ILogger), use declaration merging on `ReplacementLogger`: + +```typescript +declare module "@digital-alchemy/core" { + export interface ReplacementLogger { + logger: MyCustomLogger; + } +} +``` + +After this, `GetLogger` resolves to `MyCustomLogger` throughout the codebase. + +## LoggerOptions + +Configure the built-in logger via `loggerOptions` in `BootstrapOptions`: + +| Option | Type | Default | Description | +|---|---|---|---| +| `mergeData` | `object` | — | Static data merged into every log line | +| `timestampFormat` | `string` | `"ddd HH:mm:ss.SSS"` | dayjs format string | +| `pretty` | `boolean` | `true` | Pretty format vs JSON | +| `ms` | `boolean` | `false` | Prefix each line with ms since last log | +| `counter` | `boolean` | `false` | Add an incrementing counter per line | +| `als` | `boolean` | `false` | Include ALS context data in every log | +| `levelOverrides` | `Record` | — | Per-module/service level overrides | +| `stdOut` | `boolean` | `true` | Emit to stdout | diff --git a/docs/core/reference/builtins/scheduler.md b/docs/core/reference/builtins/scheduler.md new file mode 100644 index 0000000..1390fa3 --- /dev/null +++ b/docs/core/reference/builtins/scheduler.md @@ -0,0 +1,128 @@ +--- +title: Scheduler +sidebar_position: 3 +description: "TScheduler: all five methods, cleanup semantics, TOffset format, and activation timing." +--- + +The `scheduler` on `TServiceParams` provides cron, interval, and timeout scheduling with proper lifecycle integration. All methods return a `RemoveCallback` for manual cleanup. + +## Activation timing + +The scheduler does **not** fire jobs until the `Ready` lifecycle stage. Jobs registered in `onBootstrap` or earlier are queued until `Ready` fires. This prevents accidental execution of scheduled work during initialization. + +## RemoveCallback + +All scheduler methods return a `RemoveCallback`. It's a dual-callable: you can call it as a function or use `.remove()`: + +```typescript +const stop = scheduler.setInterval(() => doWork(), "30s"); +stop(); // cancel +stop.remove(); // also cancel +``` + +All registered jobs are automatically stopped at `PreShutdown`. + +## TOffset + +`TOffset` is a flexible duration type accepted by `setInterval`, `setTimeout`, and `sliding`. It can be: + +- A `number` in milliseconds: `30_000`, `5 * MINUTE`, `HOUR` +- A human-readable string: `"5s"`, `"30m"`, `"2h"`, `"1d"` +- A dayjs `DurationUnitsObjectType`: `{ minutes: 5, seconds: 30 }` +- An ISO 8601 partial duration string: `"PT5M30S"` +- A `[quantity, unit]` tuple: `[5, "minutes"]` +- A function returning any of the above (for dynamic durations) + +```typescript +import { MINUTE, HOUR } from "@digital-alchemy/core"; + +scheduler.setInterval(() => cleanup(), 30 * MINUTE); // number +scheduler.setInterval(() => cleanup(), "30m"); // string +scheduler.setInterval(() => cleanup(), [30, "minutes"]); // tuple +scheduler.setInterval(() => cleanup(), { minutes: 30 }); // object +``` + +To convert a `TOffset` to milliseconds or a `Dayjs` target outside of a scheduler call, use [`internal.utils.getIntervalMs` and `internal.utils.getIntervalTarget`](../services/service-params.mdx#internalutils). + +## Methods + +### `setInterval(callback, target)` + +Like `setInterval`, but lifecycle-aware and crash-safe. If the callback throws, the error is logged and the interval continues. + +```typescript +const stop = scheduler.setInterval(() => { + collectMetrics(); +}, "30s"); +``` + +### `setTimeout(callback, target)` + +Like `setTimeout`, but lifecycle-aware and crash-safe. The callback fires once after the specified delay. + +```typescript +const cancel = scheduler.setTimeout(() => { + logger.warn("operation timed out"); +}, "10s"); +``` + +### `cron(options)` + +Run a callback on a cron schedule. Accepts a `schedule` string (cron expression) or an array of schedules. + +```typescript +const stop = scheduler.cron({ + schedule: "0 * * * *", // every hour + exec: () => hourlyReport(), +}); + +// Multiple schedules on one handler: +const stop2 = scheduler.cron({ + schedule: ["0 9 * * 1-5", "0 17 * * 1-5"], // 9am and 5pm weekdays + exec: () => workdayNotification(), +}); +``` + +### `sliding(options)` + +Run a callback at a time determined by a `next()` function, resetting on a `reset` schedule. Useful for scheduling work at irregular intervals that depend on external state. + +```typescript +const stop = scheduler.sliding({ + reset: "1m", // re-evaluate next execution time every minute + next: () => dayjs(nextEventTime), // returns the Dayjs for next execution + exec: () => processNextEvent(), +}); +``` + +`next` is called at registration and then after every `reset` interval. The callback fires when `now()` passes the returned Dayjs value. + +### `interval(callback, target)` + +Alias for `setInterval`. Identical behavior. + +```typescript +const stop = scheduler.interval(() => cleanup(), "5m"); +``` + +## Example: cleanup job + +```typescript +export function CacheService({ scheduler, lifecycle, logger }: TServiceParams) { + let cacheSize = 0; + const cache = new Map(); + + // setInterval returns RemoveCallback; auto-stopped at PreShutdown + scheduler.setInterval(() => { + const before = cache.size; + // evict stale entries... + logger.debug({ removed: before - cache.size }, "cache pruned"); + }, "5m"); + + return { + set: (k: string, v: unknown) => { cache.set(k, v); cacheSize = cache.size; }, + get: (k: string) => cache.get(k), + get size() { return cacheSize; }, + }; +} +``` diff --git a/docs/core/reference/builtins/utilities.md b/docs/core/reference/builtins/utilities.md new file mode 100644 index 0000000..81489b0 --- /dev/null +++ b/docs/core/reference/builtins/utilities.md @@ -0,0 +1,153 @@ +--- +title: Utilities +sidebar_position: 5 +description: "sleep, debounce, is, each/eachSeries/eachLimit, and timing constants." +--- + +These utilities are exported directly from `@digital-alchemy/core` and imported at the module level. They don't appear on `TServiceParams` — import them alongside your type imports. + +```typescript +import { is, sleep, each, SECOND } from "@digital-alchemy/core"; +``` + +## sleep + +```typescript +function sleep(target: TOffset | Date | Dayjs): SleepReturn +``` + +Async sleep. Returns a `SleepReturn` which is a `Promise` with a `.kill()` method for early termination. + +```typescript +await sleep("5s"); // sleep 5 seconds +await sleep("30m"); // sleep 30 minutes +await sleep(new Date(ts)); // sleep until absolute time +await sleep(dayjs().add(1, "hour")); // sleep until dayjs target +``` + +### Early termination + +`.kill("stop")` cancels the sleep without resolving the Promise. `.kill("continue")` cancels but resolves the Promise immediately (letting execution continue): + +```typescript +const timer = sleep("30s"); + +// From elsewhere — cancel and continue immediately +timer.kill("continue"); + +await timer; // resolves immediately after kill("continue") +``` + +All active sleeps are tracked in `ACTIVE_SLEEPS` and killed at shutdown. + +## debounce + +```typescript +async function debounce(identifier: string, timeout: TOffset): Promise +``` + +Identifier-keyed debounce. If called with the same `identifier` within `timeout`, the previous sleep is cancelled and a new one starts. The Promise resolves after the full `timeout` has elapsed without another call for the same identifier. + +```typescript +// Only runs after 500ms of silence per key +async function handleInput(userId: string) { + await debounce(`user-input:${userId}`, "500ms"); + await processInput(userId); +} +``` + +Calls with different identifiers are independent. + +## is + +The `is` singleton provides type guards and utility checks. + +| Method | Description | +|---|---| +| `is.array(x)` | TypeScript type guard: `x is Array` | +| `is.boolean(x)` | TypeScript type guard: `x is boolean` | +| `is.string(x)` | TypeScript type guard: `x is string` | +| `is.number(x)` | TypeScript type guard: `x is number` | +| `is.function(x)` | TypeScript type guard: `x is function` | +| `is.object(x)` | TypeScript type guard: `x is object` | +| `is.undefined(x)` | TypeScript type guard: `x is undefined` | +| `is.date(x)` | TypeScript type guard: `x is Date` (valid date) | +| `is.dayjs(x)` | TypeScript type guard: `x is Dayjs` (valid dayjs) | +| `is.empty(x)` | Returns `true` for empty string, array, Map, Set, object, undefined, or NaN | +| `is.equal(a, b)` | Deep equality using `isDeepStrictEqual` | +| `is.unique(arr)` | Returns the array with duplicates removed | +| `is.random(size?)` | Returns `size` (default 8) random bytes as a hex string (crypto) | + +```typescript +if (is.array(value)) { + value.forEach(...); // TypeScript knows value is array here +} + +if (!is.empty(name)) { + // name is not undefined, not empty string, etc. +} + +const id = is.random(16); // 32-char hex string +``` + +## each + +```typescript +async function each(item: T[] | Set, callback: (item: T) => Promise): Promise +``` + +Parallel iteration. Equivalent to `Promise.all(items.map(callback))`. Accepts arrays and Sets. + +```typescript +await each(userIds, async id => { + await processUser(id); // all run concurrently +}); +``` + +## eachSeries + +```typescript +async function eachSeries(item: T[] | Set, callback: (item: T) => Promise): Promise +``` + +Sequential iteration. Each callback awaits before the next starts. Accepts arrays and Sets. + +```typescript +await eachSeries(items, async item => { + await processItem(item); // runs one at a time, in order +}); +``` + +## eachLimit + +```typescript +async function eachLimit(items: T[], limit: number, callback: (item: T) => Promise): Promise +``` + +Bounded concurrency. At most `limit` callbacks run simultaneously. Only accepts arrays. + +```typescript +await eachLimit(urls, 5, async url => { + await fetchAndProcess(url); // max 5 concurrent +}); +``` + +## Timing constants + +Millisecond values for common time units: + +```typescript +import { SECOND, MINUTE, HOUR, DAY, WEEK } from "@digital-alchemy/core"; + +SECOND // 1_000 +MINUTE // 60_000 +HOUR // 3_600_000 +DAY // 86_400_000 +WEEK // 604_800_000 +``` + +```typescript +await sleep(5 * MINUTE); // sleep 5 minutes + +scheduler.setInterval(() => cleanup(), 30 * SECOND); +``` diff --git a/docs/core/reference/index.md b/docs/core/reference/index.md new file mode 100644 index 0000000..d6e553e --- /dev/null +++ b/docs/core/reference/index.md @@ -0,0 +1,68 @@ +--- +title: Reference +sidebar_position: 1 +description: "Complete API reference for Digital Alchemy Core." +--- + +The reference section is a complete lookup guide for every API in `@digital-alchemy/core`. Pages are organized by concern. + +## Application + +| Page | Description | +|---|---| +| [CreateApplication](./application/create-application.md) | All `CreateApplication` options and the `ApplicationDefinition` API | +| [Bootstrap Options](./application/bootstrap.md) | All `BootstrapOptions` fields, process exit codes, signal handling | + +## Libraries + +| Page | Description | +|---|---| +| [CreateLibrary](./libraries/create-library.md) | `CreateLibrary` options, `depends` vs `optionalDepends` | +| [Dependency Graph](./libraries/dependency-graph.md) | `buildSortOrder`, `BAD_SORT`, `MISSING_DEPENDENCY` | +| [Module Extension](./libraries/module-extension.md) | `createModule` and `ModuleExtension` chainable API | + +## Services + +| Page | Description | +|---|---| +| [Service Functions](./services/service-function.md) | `ServiceFunction` signature, wiring semantics | +| [TServiceParams](./services/service-params.mdx) | All `TServiceParams` properties, `internal` utilities | +| [Object Return](./services/returns-object.md) | Methods, getters, live state | +| [Function Return](./services/returns-function.md) | Factory and callable patterns | +| [priorityInit](./services/priority-init.md) | Wiring order within a module | + +## Lifecycle + +| Page | Description | +|---|---| +| [Overview](./lifecycle/overview.md) | `LIFECYCLE_STAGES`, stage reference, full sequence diagram | +| [Hooks](./lifecycle/hooks.md) | All 7 hook methods | +| [Execution Order](./lifecycle/execution-order.md) | Priority tiers, parallel vs serial, late registration | + +## Configuration + +| Page | Description | +|---|---| +| [Overview](./config/overview.md) | `LOAD_PROJECT`, `TInjectedConfig`, module scoping | +| [Types](./config/types.mdx) | All 6 config types with TypeScript mappings | +| [Sourcing](./config/sourcing.md) | Env, argv, file loaders; merge order; custom loaders | +| [Accessing Config](./config/access.md) | Timing, required entries, source restriction | + +## Builtins + +| Page | Description | +|---|---| +| [Overview](./builtins/index.md) | What builtins are; standalone exports | +| [Logger](./builtins/logger.md) | `GetLogger`, levels, targets, overrides | +| [Scheduler](./builtins/scheduler.md) | `TScheduler` — all 5 methods | +| [Event Bus](./builtins/event.md) | `EventEmitter`, typed events, error constants | +| [Utilities](./builtins/utilities.md) | `sleep`, `debounce`, `is`, `each`, timing constants | + +## Testing + +| Page | Description | +|---|---| +| [TestRunner](./testing/test-runner.md) | Constructor, all fluent builder methods | +| [Module Replacements](./testing/module-replacements.md) | `appendLibrary`, `appendService`, `replaceLibrary` | +| [Test Lifecycle](./testing/test-lifecycle.md) | Lifecycle stages in tests, setup, teardown | +| [Configuration Overrides](./testing/configuration-overrides.md) | `.configure()`, `PartialConfiguration`, isolation | diff --git a/docs/core/reference/libraries/create-library.md b/docs/core/reference/libraries/create-library.md new file mode 100644 index 0000000..6c40f42 --- /dev/null +++ b/docs/core/reference/libraries/create-library.md @@ -0,0 +1,89 @@ +--- +title: CreateLibrary +sidebar_position: 1 +description: "Options for CreateLibrary and the LibraryDefinition type." +--- + +`CreateLibrary` creates a reusable module that can be consumed by applications or other libraries. Libraries cannot be bootstrapped directly — they must be included in an application's `libraries` array. + +```typescript +import { CreateLibrary } from "@digital-alchemy/core"; + +export const MY_LIB = CreateLibrary({ + name: "my_lib", + services: { ... }, + configuration: { ... }, + depends: [...], + optionalDepends: [...], + priorityInit: [...], +}); +``` + +## Options + +| Property | Type | Required | Description | +|---|---|---|---| +| `name` | `keyof LoadedModules` | ✅ | Library name — must match the key in `LoadedModules` | +| `services` | `ServiceMap` | ✅ | Service functions exposed by this library | +| `configuration` | `ModuleConfiguration` | — | Config entry declarations for this library | +| `depends` | `LibraryDefinition[]` | — | Hard dependencies — must also be in the app's `libraries` array | +| `optionalDepends` | `LibraryDefinition[]` | — | Soft dependencies — wired first if present, no error if absent | +| `priorityInit` | `string[]` | — | Services to wire first within this library | + +### `depends` vs `optionalDepends` + +**`depends`** — Hard dependency. The framework will: +1. Ensure this dependency wires before the current library +2. Throw `MISSING_DEPENDENCY` at boot if the application hasn't included it in `libraries` + +Use for services your library actively calls. If the dependency is missing, your library can't work. + +**`optionalDepends`** — Soft dependency. The framework will: +1. Ensure this dependency wires first *if it's present* +2. Not throw an error if it's absent + +Use for optional integrations. Your service code must handle the case where the dependency's services are `undefined`. + +```typescript +export const MY_LIB = CreateLibrary({ + name: "my_lib", + depends: [DATABASE_LIB], // always required + optionalDepends: [CACHE_LIB], // nice to have + services: { + repo: RepositoryService, + }, +}); +``` + +### `priorityInit` + +Same as in `CreateApplication` — names services within this library that must wire first. Order matters. All named services wire before any unnamed ones. + +Throws `MISSING_PRIORITY_SERVICE` if a named service isn't in `services`. + +## LoadedModules declaration + +Always include a `LoadedModules` augmentation in the library's index file. This is what gives consuming applications typed access to the library's services and config: + +```typescript title="src/index.mts" +export const MY_LIB = CreateLibrary({ name: "my_lib", services: { ... } }); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_lib: typeof MY_LIB; + } +} +``` + +Any application that imports this file gets the type augmentation for free. No re-declaration needed in the application. + +## Validation errors + +| Error cause | What it means | +|---|---| +| `MISSING_DEPENDENCY` | This library's `depends` entry is not in the app's `libraries` array | +| `MISSING_PRIORITY_SERVICE` | A name in `priorityInit` doesn't exist in `services` | + +## Version mismatch + +If an application includes two versions of the same library (e.g., direct dependency and transitive dependency resolve to different versions), the framework emits a warning and uses whichever version the application declared directly. No error is thrown. diff --git a/docs/core/reference/libraries/dependency-graph.md b/docs/core/reference/libraries/dependency-graph.md new file mode 100644 index 0000000..acc79a2 --- /dev/null +++ b/docs/core/reference/libraries/dependency-graph.md @@ -0,0 +1,99 @@ +--- +title: Dependency Graph +sidebar_position: 2 +description: "How buildSortOrder works, BAD_SORT, and MISSING_DEPENDENCY errors." +--- + +When an application has multiple libraries, the framework must wire them in dependency order — a library must be ready before any library that depends on it is wired. This is handled by `buildSortOrder()`. + +## How it works + +`buildSortOrder()` runs a topological sort on the libraries in `app.libraries`. It works by repeatedly finding the next library whose dependencies are all already in the output list: + +``` +Given: [A depends on C, B depends on C, C has no deps] +Step 1 → C has no deps, output it first: [C] +Step 2 → A and B both satisfied, output next available: [C, B] +Step 3 → A satisfied: [C, B, A] +``` + +The sort runs at boot, before any services are wired. Errors here are fatal and immediate. + +## BAD_SORT — circular dependency + +`BAD_SORT` is thrown when the sort cannot find a next library to load — which only happens when there's a cycle: + +``` +A depends on B +B depends on A +→ neither can be loaded first → BAD_SORT +``` + +**How to diagnose:** Look at which libraries are in the error's `current` list (already sorted) and which ones remain. The cycle is between the remaining libraries. + +**How to fix:** Break the cycle. If A and B genuinely depend on each other, extract the shared functionality into a third library C that neither A nor B imports. + +:::caution There is no lazy resolution +`BAD_SORT` is a hard error. The framework does not use proxies or deferred imports. Circular dependencies are detected immediately at boot and must be resolved structurally. +::: + +## MISSING_DEPENDENCY — hard dep not in libraries + +`MISSING_DEPENDENCY` is thrown when a library has `depends: [X]` but `X` is not in the application's `libraries` array: + +```typescript +// MY_LIB requires DATABASE_LIB +export const MY_LIB = CreateLibrary({ + name: "my_lib", + depends: [DATABASE_LIB], // hard dependency + services: { ... }, +}); + +// APPLICATION doesn't include DATABASE_LIB → MISSING_DEPENDENCY at boot +export const MY_APP = CreateApplication({ + libraries: [MY_LIB], // ← DATABASE_LIB missing! + services: { ... }, +}); +``` + +**Fix:** Add the missing library to `libraries`: + +```typescript +export const MY_APP = CreateApplication({ + libraries: [DATABASE_LIB, MY_LIB], + services: { ... }, +}); +``` + +`optionalDepends` entries are exempt — they log a message and continue if absent. + +## Version mismatch + +If the application includes the same library twice (directly and transitively), the framework emits a `warn` log and uses the version declared directly in the application's `libraries` array. No error is thrown. + +```mermaid +graph LR + App --> MY_LIB + App --> DATABASE_LIB_v2 + MY_LIB --> DATABASE_LIB_v1 + Note["Database lib version mismatch: warn emitted, v2 used"] +``` + +## Example dependency graph + +```mermaid +graph TD + App["Application"] + A["library-a (depends: b, c)"] + B["library-b (depends: c)"] + C["library-c (no deps)"] + + App --> A + App --> B + App --> C + A --> B + A --> C + B --> C +``` + +Load order: `C` → `B` → `A` → Application services. diff --git a/docs/core/reference/libraries/module-extension.md b/docs/core/reference/libraries/module-extension.md new file mode 100644 index 0000000..7db8f6a --- /dev/null +++ b/docs/core/reference/libraries/module-extension.md @@ -0,0 +1,173 @@ +--- +title: Module Extension +sidebar_position: 3 +description: "createModule and ModuleExtension — the chainable API for composing and extending modules." +--- + +`createModule` is a builder that wraps an existing application or library definition and provides a chainable API for modifying it before finalizing. It's primarily used for creating test variants, composing shared service sets, or overriding specific services for a particular entrypoint. + +## Creating a module + +You can start from scratch or wrap an existing application or library: + +```typescript +import { createModule } from "@digital-alchemy/core"; + +// From an existing application +const module = createModule.fromApplication(MY_APP); + +// From an existing library +const module = createModule.fromLibrary(MY_LIB); + +// From scratch (less common) +const module = createModule({ + name: "my_module", + services: { ... }, + configuration: { ... }, + depends: [], + optionalDepends: [], + priorityInit: [], +}); +``` + +## ModuleExtension — chainable operations + +Call `.extend()` on a `DigitalAlchemyModule` to get a `ModuleExtension` builder. All methods return the same builder for chaining. Mutations are applied immediately — all methods throw on invalid operations. + +```typescript +const extended = createModule.fromApplication(MY_APP).extend(); +``` + +### `appendLibrary(library)` + +Add a library that isn't in the base module's `depends`. Throws if the library is already present (use `replaceLibrary` instead). + +```typescript +extended.appendLibrary(EXTRA_LIB); +``` + +### `appendService(name, fn)` + +Add a service not in the base module. Throws if a service with that name already exists. + +```typescript +extended.appendService("metrics", MetricsService); +``` + +### `replaceLibrary(library)` + +Swap an existing library for a different implementation. The library's `name` must match an existing dependency. Use for mocking an entire library in tests. + +```typescript +extended.replaceLibrary(MOCK_DATABASE_LIB); +``` + +### `replaceService(name, fn)` + +Swap a specific service for a different implementation. The `name` must match an existing service. TypeScript updates the return type to match the new function. + +```typescript +extended.replaceService("database", MockDatabaseService); +``` + +Throws if `name` doesn't exist in services. + +### `pickService(...names)` + +Keep only the named services, drop everything else. Useful for creating a minimal test module. + +```typescript +extended.pickService("auth", "users"); +``` + +Throws if any name doesn't exist. + +### `omitService(...names)` + +Remove specific services from the module. + +```typescript +extended.omitService("metrics", "scheduler"); +``` + +Throws if any name doesn't exist. + +### `rebuild(services)` + +Replace the entire service map with a new one. Useful when you want to construct the service set from scratch while keeping the module's configuration and dependencies. + +```typescript +extended.rebuild({ + api: MockApiService, + cache: MockCacheService, +}); +``` + +## Terminal methods + +Terminal methods finalize the builder and return a usable module. + +### `toApplication()` + +Returns an `ApplicationDefinition` with all accumulated changes. Can be bootstrapped directly. + +```typescript +const testApp = createModule.fromApplication(MY_APP) + .extend() + .replaceLibrary(MOCK_DATABASE_LIB) + .appendService("testHelper", TestHelperService) + .toApplication(); + +await testApp.bootstrap(); +``` + +### `toLibrary()` + +Returns a `LibraryDefinition` with all accumulated changes. + +```typescript +const extendedLib = createModule.fromLibrary(MY_LIB) + .extend() + .appendService("extra", ExtraService) + .toLibrary(); +``` + +### `toTest()` + +Returns an `iTestRunner` (a configured `TestRunner` instance) targeting the built application. Shortcut for `TestRunner({ target: extend.toApplication() })`. + +```typescript +const runner = createModule.fromApplication(MY_APP) + .extend() + .replaceLibrary(MOCK_DATABASE_LIB) + .toTest(); + +await runner.run(async ({ my_app }) => { + // test code +}); +``` + +## Typical patterns + +**Create a test variant of an app:** + +```typescript +// test-app.mts +export const TEST_APP = createModule.fromApplication(MY_APP) + .extend() + .replaceLibrary(MockDatabaseLib) + .replaceLibrary(MockCacheLib) + .toApplication(); +``` + +**Create a minimal integration test module:** + +```typescript +createModule.fromApplication(MY_APP) + .extend() + .pickService("auth", "users") + .toTest() + .run(async ({ my_app }) => { + // only auth and users services are present + }); +``` diff --git a/docs/core/reference/lifecycle/execution-order.md b/docs/core/reference/lifecycle/execution-order.md new file mode 100644 index 0000000..389af60 --- /dev/null +++ b/docs/core/reference/lifecycle/execution-order.md @@ -0,0 +1,94 @@ +--- +title: Execution Order +sidebar_position: 3 +description: "Priority semantics, parallel vs serial execution, and late registration behavior." +--- + +Within each lifecycle stage, callbacks are sorted by their optional `priority` argument before execution. The framework processes them in three passes: + +## Priority tiers + +``` +positive priorities → unprioritized → negative priorities +``` + +1. **Positive priorities** (`priority >= 0`): Run serially, highest first (1000 → 100 → 1 → 0) +2. **Unprioritized** (no `priority` argument): Run in **parallel** (`Promise.all`) +3. **Negative priorities** (`priority < 0`): Run serially, highest first (-1 → -10 → -1000) + +This is the exact algorithm from the source: + +```typescript +// positive: serial, high to low +await eachSeries( + positive.toSorted((a, b) => (a.priority < b.priority ? UP : DOWN)), + async ({ callback }) => await callback(), +); + +// unprioritized: parallel +await each(quick, async ({ callback }) => await callback()); + +// negative: serial, high to low +await eachSeries( + negative.toSorted((a, b) => (a.priority < b.priority ? UP : DOWN)), + async ({ callback }) => await callback(), +); +``` + +## Implications + +**Unprioritized callbacks run concurrently.** If you register three `onBootstrap` callbacks without a priority, they all start at the same time with `Promise.all`. This is usually fine and faster than serial execution. + +**If ordering matters, use priority.** To guarantee that callback A runs before callback B in the same stage: + +```typescript +lifecycle.onBootstrap(connectDatabase, 100); // runs first +lifecycle.onBootstrap(warmUpCache, 50); // runs second +lifecycle.onBootstrap(loadInitialData); // runs concurrently with other unprioritized +``` + +**Negative priorities run after everything else.** Use negative priorities for optional, non-critical work that should not delay the main initialization: + +```typescript +lifecycle.onBootstrap(criticalSetup, 100); +lifecycle.onBootstrap(connectToDb); // parallel with other unprioritized +lifecycle.onBootstrap(optionalMetrics, -10); // runs last +``` + +## Example ordering + +Given these registrations for `Bootstrap`: + +```typescript +lifecycle.onBootstrap(A); // unprioritized +lifecycle.onBootstrap(B, 50); // positive +lifecycle.onBootstrap(C, -10); // negative +lifecycle.onBootstrap(D, 100); // positive +lifecycle.onBootstrap(E); // unprioritized +``` + +Execution order: +1. `D` (priority 100) — serial +2. `B` (priority 50) — serial +3. `A`, `E` — parallel (Promise.all) +4. `C` (priority -10) — serial + +## Late registration + +A callback registered for a stage that has already completed behaves differently depending on the stage type: + +**Startup stages (PreInit, PostConfig, Bootstrap, Ready):** +The callback fires immediately when registered. The stage's event list has been deleted, so the check for "has this stage run" is `!is.array(stageList)`. + +```typescript +// If Bootstrap has already completed: +lifecycle.onBootstrap(() => { + // Fires immediately, right here + setup(); +}); +``` + +**Shutdown stages (PreShutdown, ShutdownStart, ShutdownComplete):** +The callback is silently dropped. There's no way to retroactively run cleanup. + +This asymmetry exists because late-registered startup callbacks are often needed for dynamically-created sub-systems, while late-registered shutdown callbacks can't meaningfully undo work that's already being torn down. diff --git a/docs/core/reference/lifecycle/hooks.md b/docs/core/reference/lifecycle/hooks.md new file mode 100644 index 0000000..e5bcbe0 --- /dev/null +++ b/docs/core/reference/lifecycle/hooks.md @@ -0,0 +1,119 @@ +--- +title: Hooks +sidebar_position: 2 +description: "All seven lifecycle hook methods and how to use them." +--- + +Every service receives `lifecycle` on `TServiceParams`. It exposes seven registration methods — one per stage. All accept an optional `priority` number. + +```typescript +type TLifeCycleRegister = (callback: () => void | Promise, priority?: number) => void; +``` + +## onPreInit + +Runs at `PreInit` — after all services are wired, before configuration is sourced from external sources. + +```typescript +lifecycle.onPreInit(() => { + // Config defaults are available; env/file values are not yet applied + // Use to: adjust config sources, register custom config loaders +}); +``` + +## onPostConfig + +Runs at `PostConfig` — configuration is validated and fully applied. This is the first stage where reading `config.*` values is meaningful. + +```typescript +lifecycle.onPostConfig(() => { + const url = config.my_app.DATABASE_URL; + logger.info({ url }, "config loaded"); +}); +``` + +If a `required: true` config entry has no value, bootstrap halts with `REQUIRED_CONFIGURATION_MISSING` before this stage runs. + +## onBootstrap + +Runs at `Bootstrap` — main initialization. Safe to open connections, load data, start background work. Supports async. + +```typescript +lifecycle.onBootstrap(async () => { + await db.connect(); + await cache.warmUp(); + logger.info("connections established"); +}); +``` + +## onReady + +Runs at `Ready` — application is fully started. Safe to start serving traffic, start cron jobs, emit "application ready" notifications. + +```typescript +lifecycle.onReady(() => { + server.listen(config.my_app.PORT); + logger.info({ port: config.my_app.PORT }, "server listening"); +}); +``` + +Note: the `scheduler` service only activates at `Ready` — scheduled jobs registered before this stage fire from `Ready` onward. + +## onPreShutdown + +Runs at `PreShutdown` — first shutdown signal. Stop accepting new work. + +```typescript +lifecycle.onPreShutdown(() => { + server.close(); // stop accepting new connections + queue.pause(); // pause intake +}); +``` + +## onShutdownStart + +Runs at `ShutdownStart` — flush and close resources. Supports async. + +```typescript +lifecycle.onShutdownStart(async () => { + await db.end(); // close connection pool + await queue.drain(); // finish pending work + await cache.flush(); // flush writes +}); +``` + +## onShutdownComplete + +Runs at `ShutdownComplete` — final best-effort cleanup. Errors here are logged but don't affect the shutdown sequence. + +```typescript +lifecycle.onShutdownComplete(() => { + logger.info("shutdown complete"); +}); +``` + +## Priority + +All hook methods accept an optional second argument: a priority number. See [Execution Order](./execution-order.md) for the full priority semantics. + +```typescript +// Runs before unprioritized callbacks in the same stage +lifecycle.onBootstrap(connectDatabase, 100); + +// Runs after unprioritized callbacks +lifecycle.onBootstrap(optionalMetrics, -10); +``` + +## Late registration + +If you register a callback for a startup stage that has already completed, the callback fires immediately. If you register for a shutdown stage that has already completed, the callback is silently dropped. + +## TParentLifecycle.child() + +Advanced use: `lifecycle.child()` creates a scoped child lifecycle. The child's callbacks are wired into the parent's stages but can be independently managed. Useful for sub-systems that need to run lifecycle hooks within a larger service. + +```typescript +const childLifecycle = lifecycle.child(); +childLifecycle.onBootstrap(() => { /* scoped setup */ }); +childLifecycle.onShutdownStart(() => { /* scoped teardown */ }); +``` diff --git a/docs/core/reference/lifecycle/overview.md b/docs/core/reference/lifecycle/overview.md new file mode 100644 index 0000000..667e7dd --- /dev/null +++ b/docs/core/reference/lifecycle/overview.md @@ -0,0 +1,81 @@ +--- +title: Lifecycle Overview +sidebar_position: 1 +description: "LIFECYCLE_STAGES, what each stage is for, and the full sequence diagram." +--- + +The lifecycle is a strictly ordered sequence of stages that runs during bootstrap and shutdown. Every service registers callbacks into these stages; the framework runs them in order, awaiting each stage before proceeding. + +## LIFECYCLE_STAGES + +```typescript +export const LIFECYCLE_STAGES = [ + "PreInit", + "PostConfig", + "Bootstrap", + "Ready", + "PreShutdown", + "ShutdownStart", + "ShutdownComplete", +] as const; +``` + +This is the canonical order. Shutdown stages run in the same array order as startup — `PreShutdown` before `ShutdownStart` before `ShutdownComplete`. + +## Stage reference + +| Stage | When | What's available | Typical use | +|---|---|---|---| +| `PreInit` | After wiring, before config | Logger, basic utils | Override config sources, very early setup | +| `PostConfig` | After config validated | All config values | Read config, initialize config-dependent state | +| `Bootstrap` | After PostConfig | Everything | Open connections, load data, start timers | +| `Ready` | After all Bootstrap callbacks | Everything | Start serving traffic, start scheduled jobs | +| `PreShutdown` | On SIGTERM/SIGINT | Everything | Stop accepting new work (close listeners) | +| `ShutdownStart` | After PreShutdown | Everything | Flush and close resources | +| `ShutdownComplete` | After ShutdownStart | Everything | Final best-effort cleanup | + +## Full sequence + +```mermaid +sequenceDiagram + participant U as Your Code + participant W as Wiring + participant LC as Lifecycle + + U->>W: bootstrap() + W->>W: wire boilerplate + W->>W: wire libraries (topological order) + W->>W: wire application services + W->>LC: exec("PreInit") + W->>LC: exec("PostConfig") + Note over LC: config validated here + W->>LC: exec("Bootstrap") + W->>LC: exec("Ready") + Note over LC: application fully started + + Note over U,LC: (on SIGTERM/SIGINT or teardown()) + W->>LC: exec("PreShutdown") + W->>LC: exec("ShutdownStart") + W->>LC: exec("ShutdownComplete") + W-->>U: teardown complete +``` + +## What happens if a callback throws? + +During startup stages (`PreInit` through `Ready`): the error is treated as fatal. Bootstrap halts and `process.exit(1)` is called. + +During shutdown stages: the framework attempts to continue running remaining callbacks in the stage. Errors in shutdown are logged but do not halt the shutdown sequence. + +## Late registration + +If you register a callback for a stage that has **already completed**, the behavior depends on the stage: + +- **Startup stages (PreInit → Ready):** Callback is called immediately. +- **Shutdown stages (PreShutdown → ShutdownComplete):** Callback is silently dropped. + +This handles cases where services are created dynamically after initial boot. + +## See also + +- [Hooks](./hooks.md) — registration API for all seven stages +- [Execution Order](./execution-order.md) — priority semantics and parallel execution diff --git a/docs/core/reference/services/priority-init.md b/docs/core/reference/services/priority-init.md new file mode 100644 index 0000000..7119318 --- /dev/null +++ b/docs/core/reference/services/priority-init.md @@ -0,0 +1,79 @@ +--- +title: priorityInit +sidebar_position: 5 +description: "Controlling wiring order within a module — priorityInit and the wireOrder algorithm." +--- + +By default, services within a module wire in the order they appear in the `services` object. If a service's top-level code (outside any lifecycle callback) needs another service's return value, the dependency must be wired first. `priorityInit` declares that order explicitly. + +## Usage + +```typescript +CreateApplication({ + name: "my_app", + priorityInit: ["database", "cache"], // wire these first, in this order + services: { + cache: CacheService, // ← wires second + database: DatabaseService, // ← wires first + api: ApiService, // ← wires after database and cache + worker: WorkerService, // ← wires after api + }, +}); +``` + +Services named in `priorityInit` wire first, in listed order. All remaining services wire after, in their declaration order. + +## The wireOrder algorithm + +`wireOrder(priority, allServices)` produces the final wiring sequence: + +1. Start with `priority` (in order) +2. Append any service in `allServices` not already in `priority` +3. Wire the combined list serially (one at a time, awaiting each) + +This means `priorityInit` is purely additive — it doesn't remove any services, it just puts specific ones first. + +## When to use it + +`priorityInit` is needed when a service accesses another service's return value at the **top level** of its function (during wiring), not inside a lifecycle callback: + +```typescript +// ❌ Can break if cache isn't wired yet +export function ApiService({ my_app }: TServiceParams) { + const pool = my_app.database.createPool(); // top-level — runs during wiring +} + +// ✅ Fix: declare database in priorityInit +CreateApplication({ + priorityInit: ["database"], + services: { database: DatabaseService, api: ApiService }, +}); + +// ✅ Alternative fix: move the call inside a lifecycle callback +export function ApiService({ my_app, lifecycle }: TServiceParams) { + lifecycle.onBootstrap(() => { + const pool = my_app.database.createPool(); // safe — all services wired + }); +} +``` + +## Limitations + +`priorityInit` only controls order *within* a module. It cannot make a library service wire before your application service. For cross-module ordering, use `depends` / `libraries` in `CreateLibrary`. + +## Error: DOUBLE_PRIORITY + +If `priorityInit` contains the same service name more than once, `wireOrder` throws `DOUBLE_PRIORITY` immediately: + +```typescript +priorityInit: ["database", "cache", "database"] // ← DOUBLE_PRIORITY +``` + +## Error: MISSING_PRIORITY_SERVICE + +If a name in `priorityInit` doesn't exist in `services`, `CreateApplication` throws `MISSING_PRIORITY_SERVICE` at construction time (before bootstrap): + +```typescript +priorityInit: ["database"], +services: { db: DatabaseService } // ← "database" not in services → MISSING_PRIORITY_SERVICE +``` diff --git a/docs/core/reference/services/returns-function.md b/docs/core/reference/services/returns-function.md new file mode 100644 index 0000000..e3994b2 --- /dev/null +++ b/docs/core/reference/services/returns-function.md @@ -0,0 +1,82 @@ +--- +title: Function Return +sidebar_position: 4 +description: "Returning a function from a service: factories and single-callable services." +--- + +Returning a function from a service makes the service itself callable. Other services invoke it as `my_app.service(arg)` rather than `my_app.service.method(arg)`. + +## When to use + +Use a function return when the service's primary interface is a single callable — typically a factory, builder, or context-scoped utility. If you find yourself returning an object with only one meaningful method, a function return is usually cleaner. + +## Basic example + +```typescript +export function LoggerFactoryService({ }: TServiceParams) { + return (namespace: string) => ({ + info: (msg: string) => console.log(`[${namespace}] INFO ${msg}`), + error: (msg: string) => console.error(`[${namespace}] ERROR ${msg}`), + }); +} +``` + +Other services use it as: + +```typescript +export function PaymentsService({ my_app }: TServiceParams) { + const log = my_app.loggerFactory("payments"); + log.info("processing payment"); +} +``` + +## Factory pattern + +Function returns are natural for factories that produce configured instances: + +```typescript +export function HttpClientService({ config, lifecycle }: TServiceParams) { + const baseUrl = config.my_lib.BASE_URL; + + return (path: string) => ({ + get: async () => fetch(`${baseUrl}${path}`).then(r => r.json()), + post: async (body: unknown) => fetch(`${baseUrl}${path}`, { + method: "POST", + body: JSON.stringify(body), + }).then(r => r.json()), + }); +} + +// Usage: my_lib.http("/users").get() +``` + +## Returning a class-like callable + +You can return an arrow function that also carries properties, though this is less common: + +```typescript +export function BuilderService({ }: TServiceParams) { + const build = (name: string) => new Widget(name); + build.count = () => Widget.count; + return build; +} + +// my_app.builder("foo") +// my_app.builder.count() +``` + +TypeScript infers the full type of whatever the function returns. + +## Void-returning callable + +A service can return a function that returns `void` — useful for callbacks: + +```typescript +export function NotifierService({ event }: TServiceParams) { + return (message: string) => { + event.emit("notification", message); + }; +} + +// my_app.notify("hello!") +``` diff --git a/docs/core/reference/services/returns-object.md b/docs/core/reference/services/returns-object.md new file mode 100644 index 0000000..283b6af --- /dev/null +++ b/docs/core/reference/services/returns-object.md @@ -0,0 +1,105 @@ +--- +title: Object Return +sidebar_position: 3 +description: "Returning an object from a service: methods, state, and the getter pattern." +--- + +Returning an object from a service exposes multiple methods or properties as the service's public API. It's the most common return pattern. + +## Basic example + +```typescript +export function RegistryService({ }: TServiceParams) { + const items = new Map(); + + return { + add: (id: string, item: unknown) => items.set(id, item), + remove: (id: string) => items.delete(id), + get: (id: string) => items.get(id), + list: () => [...items.values()], + get size() { return items.size; }, + }; +} +``` + +Other services access it as `my_app.registry.add(...)`, `my_app.registry.size`, etc. + +## Type inference + +TypeScript infers the return type automatically from the returned object literal. No explicit annotation is needed: + +```typescript +// TypeScript infers ReturnType as: +// { add: (id: string, item: unknown) => void; remove: ...; get: ...; list: ...; size: number } +``` + +## The getter pattern + +Properties on a plain return object are evaluated once when the object is created. If you expose internal state directly: + +```typescript +return { count: internalCount }; // snapshot — won't update +``` + +The value is captured at wiring time. If `internalCount` changes later, callers still see the original value. + +Use a **getter** to expose live state: + +```typescript +export function CounterService({ }: TServiceParams) { + let count = 0; + + return { + increment: () => { count++; }, + decrement: () => { count--; }, + get value() { return count; }, // live — evaluated on every access + }; +} +``` + +`my_app.counter.value` always reflects the current internal count. TypeScript infers the getter's return type as `number` automatically. + +**Use getters for:** +- Connection state (`get connected() { return !!socket; }`) +- Counters and accumulators +- Feature flags that can change at runtime +- Any property that changes after wiring + +## Methods that return internal state + +Alternatively, expose a method: + +```typescript +return { + getCount: () => count, // same effect as a getter +}; +``` + +Methods are slightly more explicit but syntactically heavier at call sites (`my_app.counter.getCount()` vs `my_app.counter.count`). Use whichever reads more naturally for the consumer. + +## Mixing methods and getters + +Both can coexist freely: + +```typescript +export function ConnectionService({ lifecycle }: TServiceParams) { + let connected = false; + let socket: Socket | undefined; + + lifecycle.onBootstrap(async () => { + socket = await connect(); + connected = true; + }); + + lifecycle.onShutdownStart(async () => { + await socket?.close(); + connected = false; + }); + + return { + get connected() { return connected; }, + send: (data: Buffer) => socket?.write(data), + query: async (req: Request) => socket?.request(req), + }; +} +``` diff --git a/docs/core/reference/services/service-function.md b/docs/core/reference/services/service-function.md new file mode 100644 index 0000000..733f9b0 --- /dev/null +++ b/docs/core/reference/services/service-function.md @@ -0,0 +1,77 @@ +--- +title: Service Functions +sidebar_position: 1 +description: "ServiceFunction signature, wiring semantics, and return behavior." +--- + +A service function is a plain TypeScript function that receives `TServiceParams` and returns the service's public API. It is the core unit of composition in Digital Alchemy. + +## Signature + +```typescript +type ServiceFunction = (params: TServiceParams) => R | Promise; +``` + +Any function matching this shape can be registered as a service. The return type `R` becomes the service's typed API — what other services see when they access it through `TServiceParams`. + +## When it runs + +Your service function is called exactly once during wiring — after boilerplate services are ready but before lifecycle stages begin. Any code at the top level of your function runs at that moment: + +```typescript +export function MyService({ logger }: TServiceParams) { + // ← This runs during wiring (top-level code) + const registry = new Map(); + logger.trace("wiring MyService"); + + lifecycle.onReady(() => { + // ← This runs at Ready stage — after all services wired and config validated + logger.info("MyService ready"); + }); +} +``` + +**At wiring time:** +- Boilerplate services (`logger`, `config`, `scheduler`, `als`) are available +- Other services in the same module may or may not be wired yet (depends on service order / `priorityInit`) +- Config values from external sources (env, file) are **not yet applied** — only defaults are available + +**In lifecycle callbacks:** +- All services are wired +- Config is validated (from `PostConfig` onward) +- Safe to call other services, open connections, start work + +## Async service functions + +Service functions can be async. The framework awaits the returned Promise before continuing to wire the next service: + +```typescript +export async function DatabaseService({ config }: TServiceParams) { + // async wiring code (unusual — prefer onBootstrap) + const schema = await loadSchema(); + + return { + query: async (sql: string) => ..., + schema, + }; +} +``` + +:::tip +Reserve async wiring for cases where the service's return value genuinely depends on async work. For most connection setup, use `lifecycle.onBootstrap()` — it's explicitly tied to the right lifecycle stage. +::: + +## Return types + +| Return | Behavior | +|---|---| +| Object | Becomes the service API — `my_app.service.method()` | +| Function | Becomes the service API — `my_app.service(arg)` | +| `void` / no return | Service has no public API; side-effect-only | +| `Promise` | Awaited; resolved value becomes the API | + +See [Object Return](./returns-object.md) and [Function Return](./returns-function.md) for detailed patterns. + +## Wiring errors + +If a service function throws at the top level (during wiring), the error is treated as fatal. The framework logs it and calls `process.exit(1)`. Use `try/catch` inside the function if you need to handle initialization errors gracefully, or move the risky code into a lifecycle callback where errors can be surfaced with better context. diff --git a/docs/core/reference/services/service-params.mdx b/docs/core/reference/services/service-params.mdx new file mode 100644 index 0000000..9410fc5 --- /dev/null +++ b/docs/core/reference/services/service-params.mdx @@ -0,0 +1,233 @@ +--- +title: TServiceParams +sidebar_position: 2 +description: "Complete reference for all TServiceParams properties." +--- + +import EmbeddedEditor from '@site/src/components/EmbeddedEditor'; +import { files, defaultFile } from '@site/src/examples/core/reference/service-params'; + +`TServiceParams` is the single parameter every service function receives. It is built from the dependency graph at wiring time and carries everything the service needs. + +```typescript +export function MyService({ logger, lifecycle, config, scheduler }: TServiceParams) { + // ... +} +``` + +## Properties + +| Property | Type | Description | +|---|---|---| +| `logger` | `GetLogger` | Scoped logger, pre-bound to `module:service` context | +| `lifecycle` | `TLifecycleBase` | Register startup and shutdown callbacks | +| `config` | `TInjectedConfig` | Typed config object, one namespace per module | +| `scheduler` | `TScheduler` | Schedule cron jobs, intervals, and timeouts | +| `event` | `EventEmitter` | App-wide shared event bus | +| `als` | `AlsExtension` | Async Local Storage — context propagation | +| `context` | `TContext` | String identifier for this service: `"my_app:service_name"` | +| `internal` | `InternalDefinition` | Utilities, boot metadata, and internal hooks | +| `params` | `TServiceParams` | Self-reference — useful when passing params into a sub-system | +| `my_app` | `GetApis` | Other services in your app (after `LoadedModules` declaration) | + +## `logger` + +A `GetLogger` instance pre-bound to this service's context string (`my_app:service_name`). Every log line is automatically tagged. + +```typescript +logger.info("message"); +logger.debug({ key: "value" }, "structured log"); +logger.warn({ error }, "something went wrong"); +``` + +Levels: `trace`, `debug`, `info`, `warn`, `error`, `fatal`, `silent`. + +See [Logger](../builtins/logger.md) for the full API. + +## `lifecycle` + +Registers callbacks for lifecycle stages. All methods accept an optional priority number. + +```typescript +lifecycle.onPostConfig(() => { /* config available */ }); +lifecycle.onBootstrap(async () => { /* open connections */ }); +lifecycle.onReady(() => { /* start serving */ }); +lifecycle.onPreShutdown(() => { /* stop accepting work */ }); +lifecycle.onShutdownStart(async () => { /* flush and close */ }); +lifecycle.onShutdownComplete(() => { /* final cleanup */ }); +``` + +See [Hooks](../lifecycle/hooks.md) for details on all seven hooks. + +## `config` + +The typed config object. Each module's config lives under its own namespace: + +```typescript +config.my_app.PORT // number +config.my_lib.BASE_URL // string +config.boilerplate.LOG_LEVEL // "trace" | "debug" | "info" | ... +``` + +Only safe to read after `PostConfig`. At wiring time, only `default` values are available. + +See [Accessing Config](../config/access.md). + +## `scheduler` + +Schedules work on intervals, cron schedules, or timeouts. All methods return a `RemoveCallback`. + +```typescript +const stop = scheduler.setInterval(() => doWork(), "30s"); +const stopCron = scheduler.cron({ schedule: "0 * * * *", exec: () => hourlyTask() }); +// stop() / stop.remove() to cancel +``` + +Scheduler jobs do not fire until `Ready` stage. All registered jobs are automatically stopped at `PreShutdown`. + +See [Scheduler](../builtins/scheduler.md). + +## `event` + +The app-wide Node.js `EventEmitter`. The same instance is shared across all services. + +```typescript +event.on("user:created", (user: User) => { ... }); +event.emit("user:created", newUser); +``` + +The emitter is created fresh at each bootstrap and destroyed at teardown. See [Event Bus](../builtins/event.md). + +## `als` + +`AlsExtension` wraps Node.js `AsyncLocalStorage`. Use it to attach contextual data that propagates through async call chains without passing it explicitly. + +```typescript +als.run({ logs: { correlationId: "abc-123" } }, () => { + // every log emitted from this callback chain includes correlationId automatically + doAsyncWork(); +}); + +// Elsewhere in the call chain: +const store = als.getStore(); +const correlationId = store?.logs?.correlationId; +``` + +See [Async Local Storage](../../advanced/async-local-storage.md). + +## `context` + +A branded string identifying this service: `"my_app:service_name"`. Used internally for log tagging and introspection. Can be passed to `internal.safeExec` to tag error logs. + +```typescript +logger.debug({ context }, "current context"); +// context === "my_app:service_name" +``` + +## `internal` + +`InternalDefinition` provides utilities and boot metadata. Mostly useful for framework-level code and advanced service patterns. + +### `internal.utils` + +#### `getIntervalMs(offset)` + +Converts any [`TOffset`](../builtins/scheduler.md#toffset) value to a number of milliseconds. Useful when you need the raw ms value for a native API or your own timer logic. + +```typescript +import { MINUTE } from "@digital-alchemy/core"; + +internal.utils.getIntervalMs("30m") // 1_800_000 +internal.utils.getIntervalMs(5 * MINUTE) // 300_000 +internal.utils.getIntervalMs([2, "hours"]) // 7_200_000 +internal.utils.getIntervalMs({ seconds: 90 }) // 90_000 +``` + +#### `getIntervalTarget(offset)` + +Converts any `TOffset` to a `Dayjs` representing `now + duration`. Useful when you need an absolute target time rather than a relative duration. + +```typescript +const target = internal.utils.getIntervalTarget("5m"); +// target is a Dayjs 5 minutes from now + +// Example: sleep until a dynamic future time +const next = internal.utils.getIntervalTarget(someOffset); +await sleep(next); +``` + +#### `relativeDate(past, future?)` + +Human-readable relative time string. + +```typescript +internal.utils.relativeDate(Date.now() - 3 * MINUTE) // "3 minutes ago" +internal.utils.relativeDate(someDate, futureDate) // "in 2 hours" +``` + +#### Other utilities + +| Method/Property | Description | +|---|---| +| `titleCase(str)` | Convert snake_case or camelCase to Title Case | +| `object.get(obj, path)` | Dot-notation read from nested object | +| `object.set(obj, path, value)` | Dot-notation write into nested object | +| `object.del(obj, path)` | Dot-notation delete from nested object | +| `object.deepExtend(target, ...src)` | Deep merge objects | +| `is` | Reference to the `is` singleton (type guards) | + +### `internal.boot` + +Introspection into the running application: + +```typescript +internal.boot.loadedModules // Map +internal.boot.moduleMappings // Map +internal.boot.serviceConstructionTimes // [{module, service, duration}] +internal.boot.completedLifecycleEvents // Set +internal.boot.phase // "bootstrap" | "running" | "teardown" +internal.boot.startup // Date when bootstrap began +internal.boot.options // BootstrapOptions passed to bootstrap() +internal.boot.application // ApplicationDefinition +``` + +### `internal.safeExec` + +Runs a callback, catches any thrown error, and logs it instead of propagating. Returns `undefined` on error. + +```typescript +await internal.safeExec({ + context, + exec: async () => { + await riskyOperation(); + }, +}); +``` + +### `internal.removeFn` + +Creates a `RemoveCallback` — a function that is both directly callable and has a `.remove()` method. Useful for cleanup patterns where you want to support both `callback()` and `callback.remove()` call styles: + +```typescript +const cleanup = internal.removeFn(() => { closeConnection(); }); + +cleanup(); // works +cleanup.remove(); // also works +``` + +## Module services + +After declaring `LoadedModules`, your application and library services appear on `TServiceParams` under their module names: + +```typescript +export function MyService({ my_app, my_lib }: TServiceParams) { + my_app.otherService.doThing(); + my_lib.httpClient.get("/items"); +} +``` + +TypeScript infers the type of each key from the corresponding module's service return types. + +## Interactive reference + + diff --git a/docs/core/reference/testing/configuration-overrides.md b/docs/core/reference/testing/configuration-overrides.md new file mode 100644 index 0000000..0f766b5 --- /dev/null +++ b/docs/core/reference/testing/configuration-overrides.md @@ -0,0 +1,108 @@ +--- +title: Configuration Overrides +sidebar_position: 4 +description: ".configure(), PartialConfiguration, and environment isolation in tests." +--- + +## Environment isolation + +By default, `TestRunner` does **not** load environment variables or config files. This prevents your local `.env` or system environment from affecting test behavior. + +- `loadConfigs: false` (default) — no env vars, no file reads +- Only `default` values from config declarations are applied +- Values you set via `.configure()` are applied on top of defaults + +This means tests are deterministic regardless of the environment they run in. + +## .configure() + +Set config values for the test. Deep merges with any previous `.configure()` calls on the same runner. + +```typescript +await TestRunner(MY_APP) + .configure({ + my_app: { + DATABASE_URL: "postgres://localhost/test_db", + PORT: 9999, + DEBUG: true, + }, + boilerplate: { + LOG_LEVEL: "error", + }, + }) + .run(async ({ config }) => { + expect(config.my_app.PORT).toBe(9999); + expect(config.my_app.DEBUG).toBe(true); + }); +``` + +## PartialConfiguration type + +`PartialConfiguration` is a deep partial of the full config shape: + +```typescript +type PartialConfiguration = Partial<{ + [ModuleName in keyof ModuleConfigs]: Partial>; +}>; +``` + +You only need to provide the keys you care about. Missing keys fall back to their `default` values. + +## Chaining .configure() calls + +Multiple `.configure()` calls deep merge: + +```typescript +const runner = TestRunner(MY_APP) + .configure({ my_app: { PORT: 9999 } }); + +// Later, add more config without overwriting PORT +runner.configure({ my_app: { DEBUG: true } }); + +// Result: { my_app: { PORT: 9999, DEBUG: true } } +``` + +## Overriding boilerplate config + +Common boilerplate overrides for tests: + +```typescript +runner + .configure({ + boilerplate: { + LOG_LEVEL: "error", // suppress logs + IS_TEST: true, // usually auto-detected, but explicit here + NODE_ENV: "test", + }, + }) +``` + +## Required config entries in tests + +If your app has `required: true` config entries with no `default`, tests will fail with `REQUIRED_CONFIGURATION_MISSING` unless you provide a value via `.configure()`: + +```typescript +// Config declaration: +API_KEY: { type: "string", required: true } // no default + +// In test — must provide a value: +runner.configure({ my_app: { API_KEY: "test-key-123" } }); +``` + +## Loading real config for integration tests + +For integration tests that need real environment variables: + +```typescript +runner.setOptions({ loadConfigs: true }); +``` + +Or equivalently: + +```typescript +runner.setOptions({ + configSources: { env: true, argv: false, file: false }, +}); +``` + +Use this sparingly — integration tests with real env vars can be fragile in CI. diff --git a/docs/core/reference/testing/module-replacements.md b/docs/core/reference/testing/module-replacements.md new file mode 100644 index 0000000..4833bf7 --- /dev/null +++ b/docs/core/reference/testing/module-replacements.md @@ -0,0 +1,108 @@ +--- +title: Module Replacements +sidebar_position: 2 +description: "appendLibrary, appendService, replaceLibrary — injecting test doubles." +--- + +`TestRunner`'s fluent API provides three methods for injecting test doubles and extending the module configuration. + +## appendLibrary + +Add a library to the test run that wasn't in the original app's `libraries` array. Useful for injecting test-specific libraries (mock transports, fake data sources). + +```typescript +await TestRunner(MY_APP) + .appendLibrary(MOCK_EMAIL_LIB) + .run(async ({ my_app, mock_email }) => { + await my_app.orders.placeOrder({ userId: "123" }); + expect(mock_email.sent).toHaveLength(1); + }); +``` + +The appended library is wired in dependency order. If it has `depends`, those must also be present. + +## appendService + +Inject an extra service directly into the application for the test run. The service is wired as if it were declared in the app. By default, the function's `.name` property is used as the service key. + +```typescript +await TestRunner(MY_APP) + .appendService(function captureEvents({ event }: TServiceParams) { + const captured: unknown[] = []; + event.on("user:created", e => captured.push(e)); + return { captured }; + }) + .run(async ({ my_app, captureEvents }) => { + await my_app.users.create({ name: "Alice" }); + expect(captureEvents.captured).toHaveLength(1); + }); +``` + +Pass a name explicitly if the function is anonymous or you want a different key: + +```typescript +runner.appendService(fn, "testCapture"); +``` + +## replaceLibrary + +Substitute one library for another by name. The replacement library must have the same `name`. Used for swapping a real library for a mock implementation. + +```typescript +const MOCK_DB_LIB = CreateLibrary({ + name: "database", // ← must match the original library's name + services: { + connection: MockConnectionService, + query: MockQueryService, + }, +}); + +await TestRunner(MY_APP) + .replaceLibrary("database", MOCK_DB_LIB) + .run(async ({ my_app }) => { + // my_app.database.connection is now MockConnectionService's return value + const result = await my_app.api.getUsers(); + expect(result).toEqual(MOCK_USERS); + }); +``` + +The replacement completely substitutes the original library. The original library's services are not wired. + +## Combining replacements + +All three methods can be combined: + +```typescript +await TestRunner(MY_APP) + .replaceLibrary("database", MOCK_DB_LIB) + .appendLibrary(TEST_FIXTURES_LIB) + .appendService(CaptureService, "capture") + .configure({ my_app: { DEBUG: true } }) + .run(async ({ my_app, capture }) => { + // ... + }); +``` + +## Creating a reusable mock library + +For frequently mocked libraries, create a shared mock module: + +```typescript title="test/mocks/database.mts" +import { CreateLibrary } from "@digital-alchemy/core"; + +export const MOCK_DATABASE = CreateLibrary({ + name: "database", + services: { + connection: MockConnection, + query: MockQuery, + }, +}); +``` + +```typescript title="test/my-service.test.mts" +import { MOCK_DATABASE } from "./mocks/database.mts"; + +await TestRunner(MY_APP) + .replaceLibrary("database", MOCK_DATABASE) + .run(async ({ my_app }) => { /* ... */ }); +``` diff --git a/docs/core/reference/testing/test-lifecycle.md b/docs/core/reference/testing/test-lifecycle.md new file mode 100644 index 0000000..bcf01d0 --- /dev/null +++ b/docs/core/reference/testing/test-lifecycle.md @@ -0,0 +1,137 @@ +--- +title: Test Lifecycle +sidebar_position: 3 +description: "Lifecycle stages in tests, setup functions, and teardown." +--- + +Tests run the full lifecycle — `PreInit` → `PostConfig` → `Bootstrap` → `Ready` — and then the shutdown sequence on teardown. This means any service using `onBootstrap` or `onReady` will run those callbacks during a test, just like in production. + +## Lifecycle is real + +```typescript +export function CounterService({ lifecycle }: TServiceParams) { + let count = 0; + + lifecycle.onBootstrap(() => { + count = 10; // runs in tests + }); + + return { + get value() { return count; }, + }; +} +``` + +```typescript +it("initializes via onBootstrap", async () => { + await TestRunner(MY_APP).run(async ({ my_app }) => { + // onBootstrap has already run — count is 10 + expect(my_app.counter.value).toBe(10); + }); +}); +``` + +By the time the test callback in `.run()` receives `TServiceParams`, all lifecycle stages through `Ready` have completed. + +## Setup hooks + +`.setup(serviceFn)` registers a service that wires into a `run_first` library — a library that loads before the main target. Use it to insert test-specific state before the target module's own `onBootstrap` runs. + +```typescript +await TestRunner(MY_APP) + .setup(async ({ my_lib }: TServiceParams) => { + // Runs at wiring time for the "run_first" library + // which wires before MY_APP + await my_lib.database.seed([ + { id: "1", name: "Alice" }, + { id: "2", name: "Bob" }, + ]); + }) + .run(async ({ my_app }) => { + const users = await my_app.users.list(); + expect(users).toHaveLength(2); + }); +``` + +Multiple `.setup()` calls are additive — all setup services run. + +## Shutdown in tests + +`.run()` calls `app.teardown()` when the test callback completes (or throws). All `PreShutdown`, `ShutdownStart`, and `ShutdownComplete` callbacks fire. + +This ensures that test-registered cleanup code (closing connections, clearing state) runs correctly. Use it to verify that your cleanup logic works: + +```typescript +it("calls onShutdownStart", async () => { + let shutdownCalled = false; + + await TestRunner(MY_APP) + .setup(({ lifecycle }: TServiceParams) => { + lifecycle.onShutdownStart(() => { + shutdownCalled = true; + }); + }) + .run(async () => { /* nothing */ }); + + expect(shutdownCalled).toBe(true); +}); +``` + +## Testing async lifecycle callbacks + +Async `onBootstrap` and `onShutdownStart` callbacks are fully awaited in tests: + +```typescript +export function AsyncService({ lifecycle }: TServiceParams) { + let data: string[] = []; + + lifecycle.onBootstrap(async () => { + data = await fetchData(); + }); + + return { + get data() { return data; }, + }; +} + +it("awaits onBootstrap", async () => { + await TestRunner(MY_APP).run(async ({ my_app }) => { + // fetchData() has completed — data is populated + expect(my_app.async.data).not.toHaveLength(0); + }); +}); +``` + +## Isolation + +Each `.run()` or `.serviceParams()` call boots a fresh application instance. State from one test does not leak into the next, as long as teardown is called. + +For shared state between tests in a single `describe` block, use `.serviceParams()` once in `beforeAll` and call `.teardown()` in `afterAll`: + +```typescript +describe("shared state tests", () => { + let params: TServiceParams; + const runner = TestRunner(MY_APP); + + beforeAll(async () => { + params = await runner.serviceParams(); + }); + + afterAll(async () => { + await runner.teardown(); + }); + + it("test 1", () => { + expect(params.my_app.service.value).toBe(0); + }); + + it("test 2", () => { + params.my_app.service.increment(); + expect(params.my_app.service.value).toBe(1); + }); +}); +``` + +:::caution +Test state persists across `it` blocks in the same `beforeAll` instance. This is intentional when you need it (simulating a sequence of operations) but can cause issues if tests aren't written to be order-independent. +::: diff --git a/docs/core/reference/testing/test-runner.md b/docs/core/reference/testing/test-runner.md new file mode 100644 index 0000000..858a086 --- /dev/null +++ b/docs/core/reference/testing/test-runner.md @@ -0,0 +1,186 @@ +--- +title: TestRunner +sidebar_position: 1 +description: "TestRunner constructor, all fluent builder methods, run vs serviceParams." +--- + +`TestRunner` is the primary testing API. It boots your application (or library) in an isolated test environment and gives you typed access to all services. + +```typescript +import { TestRunner } from "@digital-alchemy/core"; +import { MY_APP } from "./application.mts"; + +const runner = TestRunner(MY_APP); +``` + +## Constructor + +```typescript +function TestRunner(options?: CreateTestingLibraryOptions): iTestRunner +``` + +`options` can be omitted (creates an empty test app) or can specify a `target` (library or application to test). When passing the application directly: `TestRunner(MY_APP)` is shorthand for `TestRunner({ target: MY_APP })`. + +By default: +- Logs are suppressed (noop logger) — use `.emitLogs()` to enable +- Environment variables and config files are not loaded — use `.configure()` to provide config +- Process max listeners is set to unlimited to avoid EventEmitter warnings in test suites + +## Fluent builder methods + +All methods return `this` for chaining. Multiple calls to methods that accept objects are deep-merged. + +### `.configure(config)` + +Set config values for this test run. Deep merges with any previous `.configure()` calls. + +```typescript +runner.configure({ my_app: { PORT: 9999, DEBUG: true } }); +``` + +### `.setOptions(options)` + +Set `TestingBootstrapOptions` directly. Deep merges. + +| Option | Default | Description | +|---|---|---| +| `emitLogs` | `false` | Enable log output for this test | +| `loggerOptions` | — | Fine-tune logger output | +| `loadConfigs` | `false` | Load env vars and config files | +| `customLogger` | noop | Custom logger implementation | +| `bootLibrariesFirst` | `false` | Boot libraries before wiring app | +| `configuration` | — | Same as `.configure()` | +| `configSources` | — | Enable/disable specific loaders | + +### `.emitLogs(level?)` + +Enable log output for this test. Optionally set the log level: + +```typescript +runner.emitLogs("debug"); +``` + +Useful when debugging a failing test — add it temporarily to see what's happening. + +### `.bootLibrariesFirst()` + +Sets `bootLibrariesFirst: true` for this test. + +### `.configure(config)` + +Config override. Deep merges with previous calls. + +### `.appendLibrary(library)` + +Add a library that wasn't in the original app's `libraries` array. The added library is available to all services. + +```typescript +runner.appendLibrary(MOCK_HTTP_LIB); +``` + +### `.appendService(service, name?)` + +Add an extra service to the app. By default uses `service.name` as the service key; provide `name` to override. + +```typescript +runner.appendService(TestHelperService); +runner.appendService(AnonHelper, "helper"); +``` + +### `.replaceLibrary(name, library)` + +Swap a library (by name string) for a different implementation. The replacement must have the same name. + +```typescript +runner.replaceLibrary("database", MOCK_DATABASE_LIB); +``` + +### `.setup(serviceFn)` + +Register a service function to wire into a `run_first` library that wires before the target module. Multiple calls add multiple services; all run before the main target. + +```typescript +runner.setup(async ({ my_app }) => { + // pre-populate data before the test + my_app.registry.add("test-item", { id: 1 }); +}); +``` + +## Terminal methods + +### `.run(testFn)` + +Boots the application, runs `testFn` with `TServiceParams`, then tears down. Returns the bootstrapped application. + +```typescript +await TestRunner(MY_APP).run(async ({ my_app }) => { + expect(my_app.counter.value).toBe(0); + my_app.counter.increment(); + expect(my_app.counter.value).toBe(1); +}); +// Teardown happens automatically +``` + +### `.serviceParams()` + +Boots the application and returns `TServiceParams` without tearing down. You must call `.teardown()` manually. + +```typescript +const params = await TestRunner(MY_APP).serviceParams(); +expect(params.my_app.counter.value).toBe(0); +await params.teardown(); // required +``` + +Wait — `serviceParams()` returns `TServiceParams`, which does not have a `teardown` property. The teardown comes from the runner: + +```typescript +const runner = TestRunner(MY_APP); +const params = await runner.serviceParams(); +// use params... +await runner.teardown(); +``` + +### `.teardown()` + +Runs the full shutdown sequence. Safe to call if the app is not booted (no-op). Always call this in `afterEach` when using `.serviceParams()`. + +## Typical patterns + +**Simple test with .run():** + +```typescript +it("does the thing", async () => { + await TestRunner(MY_APP).run(async ({ my_app }) => { + expect(my_app.service.doThing()).toBe("expected"); + }); +}); +``` + +**Manual teardown for shared setup:** + +```typescript +describe("MyService", () => { + let teardown: () => Promise; + + beforeAll(async () => { + const runner = TestRunner(MY_APP); + const params = await runner.serviceParams(); + // store params for tests... + teardown = () => runner.teardown(); + }); + + afterAll(() => teardown?.()); +}); +``` + +**Chained with mocking:** + +```typescript +await TestRunner(MY_APP) + .replaceLibrary("database", MOCK_DB_LIB) + .configure({ my_app: { PORT: 9999 } }) + .emitLogs("debug") + .run(async ({ my_app }) => { + // ... + }); +``` diff --git a/docs/core/services/advanced.md b/docs/core/services/advanced.md deleted file mode 100644 index e5e18b3..0000000 --- a/docs/core/services/advanced.md +++ /dev/null @@ -1,179 +0,0 @@ ---- -title: Advanced -id: services_advanced -sidebar_position: 5 -description: "" ---- - -## Service Returns In-Depth - -The Digital Alchemy framework has support for 3 different return types from services. - -```typescript -CreateLibrary({ - configuration: { - ADAPTER_URL: { type: "string", required: true }, - }, - name: "example_library", - services: { - none: NoneService, - function: FunctionService, - object: ObjectService, - custom: CustomReturnService, - adapter: AdapterService, - }, -}); -``` - -### None - -```typescript -export function NoneService({ - lifecycle, - logger, - example_library, -}: TServiceParams) { - lifecycle.onReady(() => { - logger.info("doing stuff onReady"); - }); - - example_library.none; - // ^^^^ not a useful thing -} -``` - -Service functions are not forced into returning anything if the particular situation has nothing to return. - -### Function Services - -```typescript -export function FunctionService({ - example_library, - logger, - lifecycle, -}: TServiceParams) { - lifecycle.onReady(() => { - // service return can be invoked directly - example_library.function(); - }); - - return function () { - logger.info("I was run"); - }; -} -``` - -### Object Services - -```typescript -export function ObjectService({ example_library, logger }: TServiceParams) { - function methodA() { - logger.info("methodA method run"); - // runnable via the publicly accessible path - example_library.object.methodB(); - } - - function methodB() { - logger.info("methodB method run"); - // run any method in scope - privateMethod(); - } - - // don't need to export if you don't want to - function privateMethod() { - logger.info("private method run"); - } - - return { - methodA, - methodB, - inlineReturn: () => logger.info("this works too"), - }; -} -``` - -Utilizing object returns can be an effective way of exposing more functionality than a single function can provide. - -## Service Definitions - -The type that your service publicly provides depends on the return type of your service. -This is usually able to to be inferred by Typescript, but you are also able to manually define your own to be explicit. - -```typescript -interface CustomReturnServiceReturn { - /** - * tsdoc wll be included in editors - */ - name: string -} - -// explicit return defintions -export function CustomReturnService(): () => CustomReturnServiceReturn { - return async function () { - return { - ... - } - }; -} -``` - -## Delayed Initialization - -Sometimes libraries have internal workflows that require that public properties be created at a time later than initial construction. -Configuration dependant adapters are one example - -### Manipulate public properties - -Services are only invoked once during application creation, with the resulting return being common to all other services. - -This allows for direct manipulation of properties provided via params. (do this with care) - -```typescript -import { create, InstanceType } from "some-library"; - -// Explicit return for service, ensuring instance has the correct type everywhere -interface AdapterServiceReturn { - /** - * tsdoc wll be included in editors - */ - instance: InstanceType; -} - -export function AdapterService({ - example_library, - config, - lifecycle, -}: TServiceParams): AdapterServiceReturn { - // wait for all config sources to finish loading - lifecycle.onPostConfig(() => { - // replace the previously provided undefined value - example_library.adapter.instance = create( - config.example_library.ADAPTER_URL - ); - }); - - return { - // has a type because of the explicit return on the service - instance: undefined, - }; -} -``` - -### Getters - -Using a function to return an internal can be a simple way to quickly expose an otherwise internal variable that may mutate and difficult to reference. - -```typescript -export function GetterService({ - config, - scheduler, -}: TServiceParams): AdapterServiceReturn { - let lastValue: number; - - scheduler.setInterval(() => (lastValue = Math.random()), { second: 5 }); - - return { - getLastValue: () => lastValue, - }; -} -``` diff --git a/docs/core/services/builtin/event.md b/docs/core/services/builtin/event.md deleted file mode 100644 index 7a9a5ac..0000000 --- a/docs/core/services/builtin/event.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -title: Event -id: event -sidebar_position: 3 -description: "" ---- - -The `event` param is an application scoped instance of `EventEmitter`, intended to make cross-service evented patterns easily accessible. - -```typescript -import { TServiceParams } from "@digital-alchemy/core"; - -export function MyService({ event }: TServiceParams) { - // standard EventEmitter interface - event.on("event", callback); -} -``` - -Everything registered on the global `event` object will be cleaned up when the application shuts down diff --git a/docs/core/services/builtin/index.md b/docs/core/services/builtin/index.md deleted file mode 100644 index 39e4f93..0000000 --- a/docs/core/services/builtin/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Built-In Utilities -id: service_builtin_index -sidebar_position: 3 -description: "" ---- diff --git a/docs/core/services/builtin/logger/api.md b/docs/core/services/builtin/logger/api.md deleted file mode 100644 index 157e08f..0000000 --- a/docs/core/services/builtin/logger/api.md +++ /dev/null @@ -1,264 +0,0 @@ ---- -title: API ---- - -The Digital Alchemy logger is automatically injected into every service, providing a powerful and flexible logging interface with built-in context awareness and formatting capabilities. - -## Getting the Logger - -The logger is automatically available in every service through dependency injection: - -```typescript -export function MyService({ logger }: TServiceParams) { - // Your logger is ready to use! - logger.info("Service started successfully"); -} -``` - -## Automatic Context - -Every logger instance automatically includes context information about your service: - -- **Service Context**: Automatically set to `{project}:{service}` (e.g., `my_app:user_service`) -- **Color Coding**: Context is color-coded based on the log level for easy visual identification -- **Structured Data**: Context is included in all log messages for filtering and analysis - -```typescript -export function UserService({ logger }: TServiceParams) { - // This log will automatically include context: "my_app:user_service" - logger.info("Processing user request"); - - // Output: [INFO] [my_app:user_service] Processing user request -} -``` - -## Logging Interface - -The logger supports flexible parameter combinations for different logging needs: - -```typescript -export function MyService({ logger }: TServiceParams) { - - // Simple string message - logger.info("User logged in successfully"); - - // Object data only - logger.debug({ userId: 123, action: "login" }); - - // String message with object data - logger.info({ userId: 123 }, "User %s logged in", "john.doe"); - - // Object data with formatted message - logger.error( - { error: "Database connection failed" }, - "Failed to process request: %s", - methodName - ); -} -``` - -### Parameter Order - -The logger follows this parameter order: -1. **Data object** (optional) - Structured data to include -2. **Message string** (optional) - Human-readable message -3. **Format arguments** (optional) - Values for string formatting - -## String Formatting - -When you provide a message string, you can use format specifiers that work with Node.js `util.format`: - -```typescript -logger.info("User %s logged in from %s", username, ipAddress); -logger.debug("Processing %d items, %s remaining", processed, remaining); -logger.error("API call failed with status %d: %s", statusCode, errorMessage); -``` - -| Format Specifier | Description | Example | -|------------------|-------------|---------| -| `%s` | String | `"hello"` | -| `%d` | Number | `42` | -| `%i` | Integer | `42` | -| `%f` | Float | `3.14` | -| `%j` | JSON | `{"key": "value"}` | -| `%o` | Object (detailed) | `{key: "value"}` | -| `%O` | Object (simple) | `{key: "value"}` | -| `%%` | Literal `%` | `%` | - -## Log Levels - -The logger provides six log levels, each with specific use cases and visual styling: - -| Level | Color | Priority | Use Case | Example | -|-------|-------|----------|----------|---------| -| `fatal` | 🟣 Magenta | Highest | Application crashes, unrecoverable errors | Database corruption, system shutdown | -| `error` | 🔴 Red | High | Recoverable errors, failed operations | API failures, validation errors | -| `warn` | 🟡 Yellow | Medium | Potential issues, deprecation warnings | Rate limiting, deprecated API usage | -| `info` | 🟢 Green | Normal | General application flow | User actions, service startup | -| `debug` | 🔵 Blue | Low | Detailed debugging information | Function entry/exit, data transformations | -| `trace` | ⚪ Gray | Lowest | Very detailed debugging | Internal state, performance metrics | - -### When to Use Each Level - -```typescript -export function UserService({ logger }: TServiceParams) { - - // trace: Very detailed debugging - logger.trace({ userId: 123, step: "validation" }, "Validating user input"); - - // debug: Detailed debugging - logger.debug({ userId: 123 }, "Processing user request"); - - // info: General application flow - logger.info({ userId: 123 }, "User %s logged in successfully", username); - - // warn: Potential issues - logger.warn({ userId: 123 }, "User attempted to access restricted resource"); - - // error: Recoverable errors - logger.error({ userId: 123, error: "Invalid credentials" }, "Login failed"); - - // fatal: Unrecoverable errors - logger.fatal({ error: "Database corruption detected" }, "Application must shutdown"); -} -``` - -## Bootstrap Configuration Options - -You can customize logger behavior through bootstrap options: - -```typescript -MY_APP.bootstrap({ - loggerOptions: { - // Enable ALS integration for request context tracking - als: true, - - // Add global data to all logs - mergeData: { - service: "my-app", - version: "1.0.0", - environment: process.env.NODE_ENV - }, - - // Custom timestamp format - timestampFormat: "YYYY-MM-DD HH:mm:ss.SSS", - - // Disable pretty formatting (useful for machine parsing) - pretty: false, - - // Show milliseconds since last log - ms: true, - - // Add incrementing counter to each log - counter: true, - - // Disable stdout output (useful when using external log targets) - stdOut: false, - - // Override log levels for specific services/modules - levelOverrides: { - "boilerplate": "silent", // Silence framework logs - "my_app": "info", // Set app default - "my_app:debug_service": "trace" // Enable trace for specific service - } - } -}); -``` - -### Configuration Options Reference - -| Option | Type | Default | Description | -|--------|------|---------|-------------| -| `als` | `boolean` | `false` | Enable AsyncLocalStorage integration for request context | -| `mergeData` | `object` | `{}` | Global data to include in all log messages | -| `timestampFormat` | `string` | `"ddd HH:mm:ss.SSS"` | Timestamp format using dayjs syntax | -| `pretty` | `boolean` | `true` | Enable pretty formatting with colors and symbols | -| `ms` | `boolean` | `false` | Show milliseconds since last log message | -| `counter` | `boolean` | `false` | Add incrementing counter to each log | -| `stdOut` | `boolean` | `true` | Output logs to console/stdout | -| `levelOverrides` | `object` | `{}` | Per-service/module log level overrides | - -### Environment-Based Configuration - -You can also control logging through environment variables: - -```bash -# Set global log level -LOG_LEVEL=info - -# Disable pretty formatting in production -NODE_ENV=production -``` - -## Pretty Formatting Features - -When `pretty: true` (default), the logger provides enhanced visual formatting: - -- **Color-coded contexts** for easy service identification -- **Highlighted symbols** like `[INFO]`, `[ERROR]` -- **Formatted timestamps** with consistent styling -- **Structured data** with proper indentation -- **Performance timing** when `ms: true` is enabled - -### Example Output - -``` -+12.34ms [Mon 14:30:45.123] [INFO] [my_app:user_service] User john.doe logged in successfully -+1.23ms [Mon 14:30:45.124] [DEBUG] [my_app:user_service] Session created: abc123 -+0.45ms [Mon 14:30:45.125] [ERROR] [my_app:auth_service] Invalid token provided -``` - -## Best Practices - -### 1. Use Appropriate Log Levels - -```typescript -// Good: Clear level progression -logger.trace("Entering function"); -logger.debug("Processing data"); -logger.info("Operation completed"); -logger.warn("Deprecated method called"); -logger.error("Operation failed"); - -// Bad: Inconsistent levels -logger.info("Debug information"); // Should be debug -logger.error("Minor warning"); // Should be warn -``` - -### 2. Include Relevant Context - -```typescript -// Good: Rich context -logger.info({ userId: 123, action: "login", ip: "192.168.1.1" }, "User logged in"); - -// Bad: Minimal context -logger.info("User logged in"); -``` - -### 3. Use Structured Data - -```typescript -// Good: Structured for analysis -logger.error({ - error: "Database connection failed", - retryCount: 3, - lastAttempt: new Date().toISOString() -}, "Failed to connect to database"); - -// Bad: String concatenation -logger.error("Failed to connect to database after 3 attempts"); -``` - -### 4. Leverage Format Specifiers - -```typescript -// Good: Clean formatting -logger.info("Processing %d items for user %s", itemCount, username); - -// Bad: String concatenation -logger.info("Processing " + itemCount + " items for user " + username); -``` - -## Integration with External Services - -The logger integrates seamlessly with external logging services. See the [Log Streams](./streams.md) documentation for examples with Datadog, Graylog, and other services. diff --git a/docs/core/services/builtin/logger/custom.md b/docs/core/services/builtin/logger/custom.md deleted file mode 100644 index b7d44ce..0000000 --- a/docs/core/services/builtin/logger/custom.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: Custom Loggers ---- - -Digital Alchemy supports complete logger replacement through the bootstrap options. This allows you to integrate third-party logging libraries or create custom formatting while maintaining the framework's logging infrastructure. - -## Overview - -You can replace the built-in logger by providing a `customLogger` in your bootstrap options. Your custom logger must implement the `ILogger` interface and will receive the same context and data as the built-in logger. - -## Interface Requirements - -Your custom logger must implement these methods: - -```typescript -interface ILogger { - debug(context: TContext, ...params: Parameters): void; - error(context: TContext, ...params: Parameters): void; - fatal(context: TContext, ...params: Parameters): void; - info(context: TContext, ...params: Parameters): void; - trace(context: TContext, ...params: Parameters): void; - warn(context: TContext, ...params: Parameters): void; -} -``` - -Each method receives: -1. **Context**: The service context (e.g., `"my_app:user_service"`) -2. **Parameters**: Either a data object, message string, or both - -## JSON Formatter Example - -Create a simple JSON formatter that outputs all data in JSON format: - -```typescript -import { ILogger } from "@digital-alchemy/core"; - -const jsonLogger: ILogger = { - debug: (context, ...params) => formatAndLog("debug", context, ...params), - error: (context, ...params) => formatAndLog("error", context, ...params), - fatal: (context, ...params) => formatAndLog("fatal", context, ...params), - info: (context, ...params) => formatAndLog("info", context, ...params), - trace: (context, ...params) => formatAndLog("trace", context, ...params), - warn: (context, ...params) => formatAndLog("warn", context, ...params), -}; - -function formatAndLog(level: string, context: string, ...params: unknown[]) { - const [data, message, ...args] = params; - - const logEntry = { - level, - context, - timestamp: new Date().toISOString(), - message: typeof data === "object" ? message : data, - data: typeof data === "object" ? data : undefined, - args: args.length > 0 ? args : undefined, - }; - - // Remove undefined fields for cleaner output - const cleanEntry = Object.fromEntries( - Object.entries(logEntry).filter(([_, value]) => value !== undefined) - ); - - console.log(JSON.stringify(cleanEntry)); -} - -await app.bootstrap({ - customLogger: jsonLogger, -}); -``` - -## Pino Integration - -**Reference Implementation**: [pino-binding.ts](https://gist.githubusercontent.com/zoe-codez/33daa39b90f42aa5d3e97d6b9e5f7cc2/raw/81781eb7be1ba54cd386c3c5c69ec5ff933cb65f/pino-binding.ts) - -This gist contains a complete Pino logger integration with proper parameter handling and bootstrap configuration. - -## Usage - -With your custom logger, your services work exactly the same: - -```typescript -export function UserService({ logger }: TServiceParams) { - logger.info("User service started"); - logger.debug({ userId: 123 }, "User logged in"); - logger.error({ error: new Error("DB failed") }, "Failed to process request"); -} -``` - -## Benefits - -- **Performance**: Use high-performance logging libraries like Pino -- **Integration**: Connect to external logging services (Datadog, Graylog, etc.) -- **Formatting**: Custom output formats for different environments -- **Structured Data**: Enhanced structured logging capabilities -- **Compatibility**: Maintain framework logging patterns while using your preferred logger - -## Important Notes - -- The framework still handles log level filtering based on `LOG_LEVEL` configuration -- Your custom logger receives the context as the first parameter -- You can access the base logger via `internal.boilerplate.logger.getBaseLogger()` -- You can modify the logger at runtime using `internal.boilerplate.logger.setBaseLogger()` diff --git a/docs/core/services/builtin/logger/index.md b/docs/core/services/builtin/logger/index.md deleted file mode 100644 index 7f1794d..0000000 --- a/docs/core/services/builtin/logger/index.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -title: Logger -id: core_logging -sidebar_position: 0 -description: "" ---- - -The provided logger is a standardized interface that wraps the Node.js console object. -By default it tries to emit pretty logs for human readability, but it can be augmented in a number of ways to alter behavior. - -## Features - -- **Pretty formatting** with color-coded output -- **Structured logging** with object support -- **Log level management** with per-service overrides -- **AsyncLocalStorage (ALS) integration** for request context tracking -- **Multiple output targets** for external logging services -- **Performance timing** integration -- **Context management** for service identification - -## Quick Start - -```typescript -export function MyService({ logger }: TServiceParams) { - logger.info("Service started"); - logger.debug({ userId: 123 }, "Processing user request"); - logger.error("Something went wrong"); -} -``` - -## Documentation Sections - -- **[API Reference](./api.md)** - Complete logger interface and usage -- **[Log Streams](./streams.md)** - External logging targets (Datadog, Graylog, etc.) diff --git a/docs/core/services/builtin/logger/streams.md b/docs/core/services/builtin/logger/streams.md deleted file mode 100644 index 724081f..0000000 --- a/docs/core/services/builtin/logger/streams.md +++ /dev/null @@ -1,372 +0,0 @@ ---- -title: Log Streams ---- - -The Digital Alchemy logger supports multiple output targets, allowing you to send logs to external services while maintaining all the framework's features like ALS integration, pretty formatting, and structured data. - -## Adding Log Targets - -You can add additional log targets using the `addTarget` method on the logger service. This allows you to send logs to external services like Datadog, Graylog, or custom HTTP endpoints. - -### Basic Usage - -```typescript -export function MyService({ logger }: TServiceParams) { - // Add a custom log target - logger.addTarget((message: string, data: object) => { - // Send to your custom endpoint - fetch('https://api.example.com/logs', { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ message, ...data }) - }); - }); -} -``` - -## Datadog Integration Example - -Here's a complete example of how to send logs to Datadog with automatic ALS data integration: - -```typescript -/** - * This service should be the very first to execute - * - all modules depend on this one - * - declared 1st in priorityInit list - */ -export function LoggerService({ config, logger, internal }: TServiceParams) { - // This should be explicitly declared as part of the bootstrap configuration - // Force the var to be loaded asap for early logs - if (is.empty(config.utils.DATADOG_API_KEY)) { - logger.debug(`no [DATADOG_API_KEY], stdout logs only`); - return; - } - - logger.info(`setting http logs`); - - // https://docs.datadoghq.com/api/latest/logs/#send-logs - const logIntake = `https://http-intake.logs.datadoghq.com/v1/input/${config.utils.DATADOG_API_KEY}`; - - internal.boilerplate.logger.addTarget((message: string, data: object) => { - setImmediate(async () => { - const context = "context" in data ? data.context : undefined; - - await globalThis.fetch(logIntake, { - body: JSON.stringify({ - logger: { name: context }, - message, - ...data, // This includes all ALS data automatically! - }), - headers: { - "Content-Type": "application/json", - }, - method: "POST", - }); - }); - }); -} -``` - -### Key Features of the Datadog Integration - -1. **Automatic ALS Data**: The `...data` spread includes all ALS context (request IDs, correlation IDs, timing, etc.) -2. **Async Processing**: Uses `setImmediate` to avoid blocking the main thread -3. **Context Preservation**: Maintains logger context in the Datadog payload -4. **Error Handling**: Gracefully handles missing API keys - -## HTTP Request Context with ALS - -When combined with the HTTP hooks service, the Datadog integration automatically includes request context: - -```typescript -export function HttpHooksService({ logger, als, metrics, context, http, internal: { boot } }: TServiceParams) { - - // ... existing HTTP hooks code ... - - async function setup(fastify: FastifyInstance) { - fastify.addHook("onRequest", async (req, res) => { - // Merge request data into storage - const http = await gatherLocals(req); - const storage = als.getStore(); - - if (storage) { - res.header(ResponseHeaders.requestId, storage.logs.reqId); - storage.http = http; - - // Extract keys that are supposed to be in logs and append there also - const keys: string[] = []; - is.keys(http.trace).forEach(i => { - const key = ALS_HEADER_LOGS.get(i); - if (key && key !== "logger") { - storage.logs[key] = http.trace[i]; - keys.push(key); - } - }); - - logger.debug({ keys }, "onRequest"); - } - }); - } -} -``` - -### Resulting Datadog Payload - -With both services configured, your Datadog logs will include: - -```json -{ - "logger": { "name": "my_app:http_hooks" }, - "message": "Processing request", - "level": "info", - "timestamp": 1703123456789, - "context": "my_app:http_hooks", - "reqId": "req-12345", - "correlationId": "corr-67890", - "startTime": 1703123456000, - "elapsed": 789, - "http": { - "trace": { - "x-request-id": "req-12345", - "x-correlation-id": "corr-67890" - } - } -} -``` - -## Custom Log Target Examples - -### Graylog Integration - -```typescript -export function GraylogService({ logger, config }: TServiceParams) { - const graylogUrl = config.external.GRAYLOG_URL; - - logger.addTarget((message: string, data: object) => { - setImmediate(async () => { - await fetch(graylogUrl, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ - version: '1.1', - host: process.env.HOSTNAME, - short_message: message, - full_message: JSON.stringify(data), - timestamp: Date.now() / 1000, - level: data.level || 1, - _reqId: data.reqId, - _correlationId: data.correlationId, - ...data - }) - }); - }); - }); -} -``` - -### Custom HTTP Endpoint - -```typescript -export function CustomLogService({ logger, config }: TServiceParams) { - const endpoint = config.external.LOG_ENDPOINT; - - logger.addTarget((message: string, data: object) => { - setImmediate(async () => { - try { - await fetch(endpoint, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${config.external.LOG_API_KEY}` - }, - body: JSON.stringify({ - timestamp: new Date().toISOString(), - message, - metadata: data - }) - }); - } catch (error) { - // Log to console if external logging fails - console.error('Failed to send log to external service:', error); - } - }); - }); -} -``` - -### File-based Logging - -```typescript -export function FileLogService({ logger, config }: TServiceParams) { - const fs = require('fs').promises; - const logFile = config.logging.FILE_PATH; - - logger.addTarget(async (message: string, data: object) => { - const logEntry = { - timestamp: new Date().toISOString(), - message, - ...data - }; - - await fs.appendFile(logFile, JSON.stringify(logEntry) + '\n'); - }); -} -``` - -## Configuration - -### Bootstrap Configuration - -```typescript -MY_APP.bootstrap({ - configuration: { - utils: { - DATADOG_API_KEY: process.env.DATADOG_API_KEY - }, - external: { - GRAYLOG_URL: process.env.GRAYLOG_URL, - LOG_ENDPOINT: process.env.LOG_ENDPOINT, - LOG_API_KEY: process.env.LOG_API_KEY - }, - logging: { - FILE_PATH: '/var/log/myapp/application.log' - } - } -}); -``` - -### Environment Variables - -```bash -# Datadog -DATADOG_API_KEY=your_datadog_api_key - -# Graylog -GRAYLOG_URL=http://graylog:12201/gelf - -# Custom endpoint -LOG_ENDPOINT=https://api.example.com/logs -LOG_API_KEY=your_api_key - -# File logging -LOG_FILE_PATH=/var/log/myapp/application.log -``` - -## Best Practices - -### 1. Use setImmediate for Async Operations - -```typescript -// Good: Non-blocking -logger.addTarget((message: string, data: object) => { - setImmediate(async () => { - await sendToExternalService(message, data); - }); -}); - -// Bad: Blocking -logger.addTarget(async (message: string, data: object) => { - await sendToExternalService(message, data); -}); -``` - -### 2. Handle Errors Gracefully - -```typescript -logger.addTarget((message: string, data: object) => { - setImmediate(async () => { - try { - await sendToExternalService(message, data); - } catch (error) { - // Don't let external logging failures break your app - console.error('External logging failed:', error); - } - }); -}); -``` - -### 3. Preserve ALS Data - -```typescript -// Good: Include all data (including ALS) -logger.addTarget((message: string, data: object) => { - sendToExternalService(message, data); // data includes ALS context -}); - -// Bad: Only send message -logger.addTarget((message: string, data: object) => { - sendToExternalService(message); // Lost ALS context -}); -``` - -### 4. Consider Performance - -```typescript -// For high-throughput applications, consider batching -let logBuffer: Array<{message: string, data: object}> = []; - -logger.addTarget((message: string, data: object) => { - logBuffer.push({ message, data }); - - if (logBuffer.length >= 100) { - setImmediate(async () => { - await sendBatchToExternalService(logBuffer); - logBuffer = []; - }); - } -}); -``` - -## Testing Log Targets - -```typescript -it("sends logs to external service", async () => { - await testRunner.run(async ({ logger }) => { - const mockFetch = vi.fn().mockResolvedValue({ ok: true }); - global.fetch = mockFetch; - - // Add your log target - logger.addTarget((message: string, data: object) => { - fetch('https://api.example.com/logs', { - method: 'POST', - body: JSON.stringify({ message, ...data }) - }); - }); - - // Trigger a log - logger.info("Test message"); - - // Verify the external call was made - expect(mockFetch).toHaveBeenCalledWith( - 'https://api.example.com/logs', - expect.objectContaining({ - method: 'POST', - body: expect.stringContaining('Test message') - }) - ); - }); -}); -``` - -## Troubleshooting - -### Logs Not Appearing in External Service - -1. **Check API keys and endpoints** -2. **Verify network connectivity** -3. **Check for error handling that might be swallowing errors** -4. **Ensure ALS is enabled if you're expecting ALS data** - -### Performance Issues - -1. **Use `setImmediate` for async operations** -2. **Consider batching for high-volume logging** -3. **Monitor external service response times** -4. **Implement circuit breakers for unreliable external services** - -### Missing ALS Data - -1. **Ensure ALS is enabled in bootstrap configuration** -2. **Verify ALS context is properly set up** -3. **Check that the log target includes the full data object** -4. **Test with a simple console.log to verify ALS data is present** diff --git a/docs/core/services/builtin/scheduler.md b/docs/core/services/builtin/scheduler.md deleted file mode 100644 index a6b2777..0000000 --- a/docs/core/services/builtin/scheduler.md +++ /dev/null @@ -1,272 +0,0 @@ ---- -title: Scheduler -id: core_scheduler -sidebar_position: 1 -description: "" ---- - -The Digital Alchemy scheduler service is a collection of tools for interacting with timers in a variety of situations. -Scheduler operations are lifecycle-aware to add predictability to unit testing. - -Scheduler operations automatically: -- **Start only when the application is fully ready** (after the `Ready` lifecycle event) -- **Stop automatically when the application tears down** -- **Include performance metrics** for monitoring and debugging - - -## Getting access - -```typescript -import { TServiceParams } from "@digital-alchemy/core"; - -export function ServiceWithScheduler({ scheduler, logger }: TServiceParams) { - const CALLBACK = () => logger.info("I ran!"); - scheduler.cron({ ... }); -} -``` - -## Supported syntax - -In addition to the traditional numeric milliseconds to represent dureations, `scheduler` methods are also able to to work with other formats: - - - -These are all the same operation - -```typescript -// number - milliseconds -scheduler.setTimeout(NOOP, 5000); -// string - ISO 8601 Partial -scheduler.setTimeout(NOOP, "5s"); -// array - [qty, unit] -scheduler.setTimeout(NOOP, [5, "second"]); -// object - DurationUnitsObjectType -scheduler.setTimeout(NOOP, { second: 5 }); -``` - -### number - millisecond - -```typescript -// number - milliseconds -scheduler.setTimeout(NOOP, 5 * 1000); -``` - -The `number` / millisecond input input is the traditional javascript approach to providing duration. - -> `1000 ms` = `1 second` - -### ISO 8601 Partial - -```typescript -// string - ISO 8601 Partial -scheduler.setTimeout(NOOP, "5s"); -``` - -The string format allows time to be entered as a HMS format - `[{qty}H][{qty}M][{qty}S]` - -Any combination of at least 1 unit is usable. - -| Value | Description | -| ----- | ----------- | -| `5h` | 5 hours | -| `3H2M`| 3 hours 2 minutes | -| `0.5H`| Half hour | -| `0.5s`| 500ms | - -Units are case insenstive bt must be provided in order, and numbers may come with decimal points. - -### Quantity + Unit - -```typescript -// array - [qty, unit] -scheduler.setTimeout(NOOP, [5, "second"]); -``` -#### Available Units - -| Type | Valid Units | -| ---- | ----------- | -| Week | `week`, `weeks`, `w` | -| Millisecond | `ms`, `millisecond`, `milliseconds` | -| Second | `s`, `second`, `seconds` | -| Minute | `m`, `minute`, `minutes` | -| Hour | `h`, `hour`, `hours` | -| Day | `d`, `D`, `day`, `days` | -| Month | `M`, `month`, `months` | -| Year | `y`, `year`, `years` | - -### DurationUnitsObject - -```typescript -// object - DurationUnitsObjectType -scheduler.setTimeout(NOOP, { second: 5 }); -``` - -#### Possible Units -- `milliseconds` -- `seconds` -- `minutes` -- `hours` -- `days` -- `months` -- `years` - -### Day.js Duration - -```typescript -// dayjs duration -scheduler.setTimeout(NOOP, dayjs.duration({ hours: 2, minutes: 30 })); -``` - -Duration objects can be created as part of library workflows, and are used as an intermediate step in other units. -Other formats are typically more useful to end users. - -### Function - -```typescript -// function returning -> valid unit -scheduler.setTimeout(NOOP, () => 5000); -``` - -A sync function returning a valid unit (above) may also be used. This can be used by libraries to easily create logic that decides on the correct duration at the time it's needed. - -## Methods - -### ⏰ cron - -Schedule operations using cron expressions. You can use predefined expressions from the `CronExpression` enum or provide custom expressions. - -```typescript -import { CronExpression } from "@digital-alchemy/core"; - -// ... -scheduler.cron({ - schedule: CronExpression.MONDAY_TO_FRIDAY_AT_09_30AM, - exec: () => logger.info("running on a cron"), -}); - -scheduler.cron({ - schedule: "0 1-23/2 * * *", - exec: () => logger.info("complex schedules"), -}); -``` - -### 🕺 sliding - -Sliding schedules use a two-part time calculation system: -1. A function to calculate the next run time -2. A schedule to re-calculate the next run time - -This is useful for dynamic scheduling, such as random times within a day. - -```typescript -scheduler.sliding({ - reset: CronExpression.MONDAY_TO_FRIDAY_AT_8AM, - next: () => dayjs().add(Math.floor(Math.random() * 8 * 60), "minute"), - exec: () => logger.info("random time during the workday"), -}); -``` - -**Note**: The `next` and `exec` functions are validated and must be provided. - -### ⏱️ setInterval / setTimeout - -These methods work like their Node.js counterparts but with lifecycle awareness. They're most useful for unit tests where timers need automatic cleanup. - -```typescript -scheduler.setInterval(() => { - logger.info("hello world"); -}, 1000); - -scheduler.setTimeout(() => { - logger.info("hello world"); -}, 1000); -``` - -## Stopping Schedules - -All schedules can be stopped manually using the return value from each method: - -```typescript -// const { remove } = scheduler... also works -const remove = scheduler.setTimeout(() => { - logger.info("delayed operation"); -}, 5000); - -function onSpecialEvent() { - // Stop the timer early - remove(); -} -``` - -Schedules are also automatically stopped when the application tears down. - - -## 💤 sleep - -> **Note**: this is also importable as a standalone function - -```typescript -import { sleep } from "@digital-alchemy/core"; - -// sleep() is same as scheduler.sleep() -``` - -When awaited, the function will pause for the defined time then return `void` - -```typescript -async function DoSomeLogic() { - // logic - await sleep({ second: 5 }); - // more logic -} -``` - -### Cancelling - -Sleeps can be cancelled with different possible effects. For basic usage - -```typescript -import { SleepReturn } from "@digital-alchemy/core"; - -// reference accessible between runs -let timer: SleepReturn; - -function runAfter5() { - // if timer currently exists, stop it - if (timer) { - timer.kill(); - } - - // create new timer in accessible possition - timer = sleep({ second: 5 }) - - // wait for it to complete - await timer; - - // this will not happen if something else kills timer - logger.info("timer completed"); - timer = undefined; -} -``` - -#### params - -```typescript -timer.kill("stop"); // default value -timer.kill("continue"); -``` - -#### Stop vs Continue - -Using the `stop` workflow causes the timer to be discarded, letting node clean up from there. - -Using the `continue` workflow causes the related timer to immediately complete regardless of time left. - -## Performance Metrics - -All scheduler operations automatically include performance metrics: -- **Execution timing** for each scheduled operation -- **Context information** for debugging -- **Error tracking** for failed executions - -These metrics are available through the framework's metrics system for monitoring and alerting. diff --git a/docs/core/services/context.md b/docs/core/services/context.md deleted file mode 100644 index 99ee9db..0000000 --- a/docs/core/services/context.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -title: Context -id: context -sidebar_position: 1 -description: "" ---- - -Service context is defined as a combination of the module name + service name. - -In the following example, `ExampleService` would be assigned a context name of `demo_app:example`. - -```typescript -CreateApplication({ - name: "demo_app", - services: { - example: ExampleService, - } -}); -``` - -Context is passed in via `TServiceParams`, and is automatically attached to log messages. - -```typescript -import { TServiceParams } from "@digital-alchemy/core"; - -export function ExampleService({ context, logger }: TServiceParams) { - logger.info(`hello world`); -} -``` - -which prints out a message like this - -``` -[Wed 07:09:15.383] [INFO][demo_app:example]: hello world -``` - -## Usage - -`context` is primarily intended to aid debugging, and downstream libraries such as `synapse` may request it in order to aid debug logging. - -```typescript -import { TServiceParams } from "@digital-alchemy/core"; - -export function ExampleService({ context, synapse }: TServiceParams) { - synapse.number({ - context, - name: "example number entity" - }); -} -``` - -Providing `context` allows the library to emit logs attributed to your service. diff --git a/docs/core/services/index.md b/docs/core/services/index.md deleted file mode 100644 index db4589c..0000000 --- a/docs/core/services/index.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Services -id: services_index -sidebar_position: 1 -description: "" ---- - -Services with Digital Alchemy follow a function pattern, taking in a standard single param containing the rest of your application resources. - -## Service Returns - -The return reponse of your service is provided back to other services in your application as a callable interface. -There are 2 supported styles of service returns - `object` & `function` - -### Object Returns - -Objects are the perfect choice for services to return when there is more than 1 item that you want to provide access to - - -```typescript -import { TServiceParams } from "@digital-alchemy/core"; - -export function MyService({ logger, ... }: TServiceParams) { - const registry = new Map(); - - function methodA() { - // logic - } - function methodB() { - // logic - } - - return { - registry, - methodA, - methodB, - } -} -``` - -The contents of the object can be anything you want - - -### Function Returns diff --git a/docs/core/services/priority-init.md b/docs/core/services/priority-init.md deleted file mode 100644 index 4e7a1e3..0000000 --- a/docs/core/services/priority-init.md +++ /dev/null @@ -1,90 +0,0 @@ ---- -title: Initialization Order -id: services_init -sidebar_position: 2 -description: "" ---- - -Digital Alchemy has a defined order for loading services that ensures that dependencies are loaded first prior to loading services from within your modules. - -Once it comes time to load your module's services, there is a variety of situations that can influence modules are initialized - -## Basic Rules - -The initialization order for services is controlled via the module that they are being registered into: - -```typescript -CreateApplication({ - name: "home_automation", - services: { - climate: ClimateService, - locks: LocksService, - registry: RegistryService, - sensors: SensorsService, - switches: SwitchesService, - thermostats: ThermostatService, - } -}); -``` - -By default, services are initilialized in order provided to services. -In this example, alphabetical order. - -## Service level dependencies - -Service level dependencies can be created by trying to execute methods provided by your own code prior to the relevant service being created. -Sticking with the above module, a breaking situation might look like this - - -```typescript -import { TServiceParams } from "@digital-alchemy/core"; - -export function ClimateService({ home_automation }: TServiceParams) { - // registry is not defined yet! - home_automation.registry.add(...); - // ^^^^^^ is undefined -} -``` - -The code for these situations will build properly, but at runtime this does not work since `RegistryService` has not been executed yet. - -### The fix - -There is 2 potential paths to resolving this issue. - -1) Using the `registry` logic later in the application lifecycle -2) Force the `RegistryService` to load first - -#### With lifecycle hooks - -Wrapping logic in a lifecycle event will allow it to run after all services have been created, ensuring all methods are available to call. - -```typescript -export function ClimateService({ home_automation, lifecycle }: TServiceParams) { - lifecycle.onPreInit(() => { - home_automation.registry.add(...); - }); -} -``` - -#### Priority Initialization - -You can force certain services to build first by using the `priorityInit` array in your module definition. - -```typescript -CreateApplication({ - name: "home_automation", - priorityInit: ["registry"], - services: { - climate: ClimateService, - locks: LocksService, - registry: RegistryService, - sensors: SensorsService, - switches: SwitchesService, - thermostats: ThermostatService, - } -}); -``` - -**NOTE**: You do not need to place all services in the priority array, only those with construction time dependicies for other services with the same module. - -Once this list is processed, the remaining services will be constructed in normal order. diff --git a/docs/core/testing/configuration.md b/docs/core/testing/configuration.md deleted file mode 100644 index dcd7f9e..0000000 --- a/docs/core/testing/configuration.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -title: Configuration ---- - -By default, the test runner **WILL NOT** utilize **ANY** config loader - -It will not know or care about: -- your `.env` file -- the current state of `process.env` -- that ini file -- any value outside of module declared default - -## Overriding module configs - -`@digital-alchemy` utilizes the `config` object for both key storage, as well as logic gates. - -You can override these in 2 primary ways: - -### .configure - -Hard coded overrides to module values. -This is equivalent to providing values at `.bootstrap` in priority - -```typescript -testRunner.configure({ - synapse: { - // don't touch my real database! - SQLITE_DB: join(cwd(), "jest_sqlite.db") - } -}) -``` - -### config loader - -You can also utilize a custom config loader as past of the test runner extended bootstrap options. - -## Logging - -By default, the test runner will use a `NOOP` logger that will black hole basically all messages. -Once your test is running as expected, this cuts down on general log spam. - -If you are debugging and want access to logs, that can be accomplished with the `.emitLogs()` command. - -```typescript -// emits trace by default -testRunner.emitLogs(); - -// custom level -testRunner.emitLogs("warn"); -``` - -## Extended Options - -The full suite of options are exposed - -| Type | Key | Default | Description | -| --- | --- | --- | --- | -| **Logging** | `emitLogs` | `false` | If true, default logger is left in place | -| **Logging** | `customLogger` | `NOOP` / `default` | Provide alternate logger (`createMockLogger`) | -| **Logging** | `loggerOptions` | `{}` | [Docs](/docs/core/services/builtin/logger) | -| **Lifecycle** | `bootLibrariesFirst` | `false` | Set to `true` if testing an application with that requirement | -| **Lifecycle** | `forceTeardown` | `false` | Set to `true` if your app requires running teardown hooks | -| **Configuration** | `configuration` | `{}` | passed through to `.bootstrap` call | -| **Configuration** | `loadConfigs` | `false` | Aka do not consider configuration not provided in test / module explicitly | -| **Configuration** | `configLoader` | `undefined` | Invoked during the config loading step to provide data | - -> 🗒️ **Logging note:** -> -> Errors that result in application termination (like test failures) are logged directly to `console.error`. -> They always appear in the output. diff --git a/docs/core/testing/index.md b/docs/core/testing/index.md deleted file mode 100644 index 402089d..0000000 --- a/docs/core/testing/index.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: ⁉️ Testing -id: testing -sidebar_position: 4 -description: "" ---- - -The `TestRunner` follows a builder pattern that allows you to test either an application or a library. -It allows you to construct and execute a purpose built wrapper application intended to make it east to test your code. - -## 🏗️ Construction - -> Options can be called in any order at any time prior to `.run` - -#### Basic Setup - -You can create a test runner in isolation directly. - -```typescript -import { TestRunner } from "@digital-alchemy/core"; - -const runner = TestRunner(); // minimum setup -TestRunner({ target: MY_APPLICATION }); -TestRunner({ target: LIB_SPECIAL_SAUCE }); -``` - -Or get one via the module builder - -```typescript -import { createModule } from "@digital-alchemy/core"; - -const myModule = createModule() - .fromApplication(MY_APPLICATION); - -const runner = myModule.extend().toTest(); -``` - -> In this minimal example, both arrive at the same runner diff --git a/docs/core/testing/module-replacements.md b/docs/core/testing/module-replacements.md deleted file mode 100644 index 1e4c1aa..0000000 --- a/docs/core/testing/module-replacements.md +++ /dev/null @@ -1,80 +0,0 @@ ---- -title: Module Replacements ---- -The test runner allows for a variety of ways of manipulating the tests in interesting ways. -All of it with the goal of detaching your code from external resources, and making it easier to provide the code coverage you're looking for. - -By default, the test runner will take in the same list of library dependencies as the target being tested. - -### 📌 Append Library - -Add an extra library to this test. - -This code is added to the overall mix of libraries at the beginning of bootstrap, and it's execution order depends on it's own dependencies. - -```typescript -const runner = TestRunner().appendLibrary(LIB_MOCK_ASSISTANT); -``` - -### 📍 Append Service - -Add an extra service to the target module being tested. - -> context will be matched function name if available - -```typescript -const runner = TestRunner({ application: THING }) - // service uses `{THING}:SpecialTestingService` for context by default - .appendService(function SpecialTestingService({ logger, ...etc }) { - // some logic -}); -``` -It can also be provided explicitly - -```typescript -const runner = TestRunner({ application: THING }) - .appendService(({ logger, ...etc }) => {}, "SpecialTestingService"); -``` - -or default to `uuid` - -```typescript -const runner = TestRunner({ application: THING }) - .appendService(({ logger }) => { logger.info("yolo"); }); -``` - -### ♻️ Replace Library - -`.replaceLibrary` allows you to substitute a library in the dependency tree for another. - -> ⚠️ Compatibility is not enforced, careful with replacements - -```typescript -const runner = TestRunner({ application: THING }) - .replaceLibrary("hass", LIB_SPECIAL_HASS_REPLACEMENT); -``` - -### 🩻 Replace Service - -`.replaceService` operates similarly to replacing libraries, but it iss intended to replace a single service in the module being tested instead. - -> ⚠️ Compatibility is not enforced, careful with replacements - -```typescript -const runner = TestRunner({ application: THING }) - .replaceLibrary("hass", LIB_SPECIAL_HASS_REPLACEMENT); -``` - -### 👉 Pick Service - -Pick a list of services to load from the target module, all others will not load as part of the test. - -> - Follow up calls replace list -> - Cannot be combined with `.omitService` - -### 🔇 Omit Service - -Exclude a list of services from your target module, all others will load - -> - Follow up calls replace list -> - Cannot be combined with `.pickService` diff --git a/docs/core/testing/test-lifecycle.md b/docs/core/testing/test-lifecycle.md deleted file mode 100644 index 486fece..0000000 --- a/docs/core/testing/test-lifecycle.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Test Lifecycle ---- - -### 🛠️ Setup - -Add a service that gets run before the test. - -```typescript -const runner = TestRunner({ application: THING }) - .setup(( logger, hass ) => { - // test setup logic - }); -``` - -Internally, this service is wired into it's own library with dependencies all other modules. -This forces the `setup` to run after all other libraries have initialized, but before your test runs. - -### 🚀 Run - -It's time to actually run a test! - -`.run` will build a new application using - -```typescript -await runner.run(({ hass }) => { - // your test logic here - expect(hass).toBeDefined(); -}); -``` - -### 🧹 Teardown - -By default, tests do not tear themselves down. -For many minimal situations this is fine, other times you may need to gain direct control of when your app stops. - -Dealing with the scheduler is one situation where this is required - -```typescript -const spy = jest.fn(); - -// disconnect the clock from reality -jest.useFakeTimers(); - -// start the app -const app = await runner.run(({ scheduler }) => { - scheduler.cron({ - exec: spy, - schedule: CronExpression.EVERY_MINUTE, - }); -}); - -// fast forward an hour -jest.advanceTimersByTime(60 * 60 * 1000); -expect(spy).toHaveBeenCalledTimes(60); - -// return to reality -jest.useRealTimers(); - -// teardown -await app.teardown(); -``` diff --git a/docs/core/tutorials/01-first-application.mdx b/docs/core/tutorials/01-first-application.mdx new file mode 100644 index 0000000..61032e0 --- /dev/null +++ b/docs/core/tutorials/01-first-application.mdx @@ -0,0 +1,126 @@ +--- +title: First Application +sidebar_position: 2 +description: "Build a full first app — two services talking to each other." +--- + +import EmbeddedEditor from '@site/src/components/EmbeddedEditor'; +import { files, defaultFile } from '@site/src/examples/core/tutorials/first-application'; + +This tutorial builds a small application with two services. The goal is to see how services reference each other through `TServiceParams` and why the `declare module` block is the type system's load-bearing piece. + +If you completed the [Quickstart](../get-started/quickstart.mdx), most of this will be review. Slow down at the sections marked with a callout. + +## What we're building + +Two services: + +- **NameService** — holds a set of names, exposes `add` and `list` +- **GreeterService** — reads from `NameService` and logs a greeting for each name on startup + +Neither service imports the other directly. They communicate through `TServiceParams`. + +## Step 1 — NameService + +```typescript title="src/name.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +export function NameService({ logger }: TServiceParams) { + const names = new Set(["world"]); + + return { + add: (name: string) => { + names.add(name); + logger.debug({ name }, "added name"); + }, + list: () => [...names], + }; +} +``` + +`NameService` returns an object. That object becomes the service's public API — what other services see when they access `my_app.names`. + +## Step 2 — GreeterService + +```typescript title="src/greeter.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +export function GreeterService({ logger, lifecycle, my_app }: TServiceParams) { + lifecycle.onReady(() => { + for (const name of my_app.names.list()) { + logger.info(`Hello, ${name}!`); + } + }); +} +``` + +`GreeterService` destructures `my_app` from `TServiceParams`. This is how services access each other — not by importing directly, but by pulling from the injected params object. + +The `my_app.names.list()` call is inside `lifecycle.onReady()`. That's intentional — by the time `onReady` fires, all services are wired and their return values are available. + +:::caution Wiring order +If you call `my_app.names.list()` at the **top level** of the service function (outside any lifecycle callback), it runs during wiring. At that moment, `NameService` may not have wired yet, and `my_app.names` would be `undefined`. Always put cross-service calls inside lifecycle callbacks, or declare the other service in `priorityInit`. See [priorityInit](../reference/services/priority-init.md). +::: + +## Step 3 — Application module + +```typescript title="src/application.mts" +import { CreateApplication } from "@digital-alchemy/core"; +import { GreeterService } from "./greeter.service.mts"; +import { NameService } from "./name.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + services: { + greeter: GreeterService, + names: NameService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +``` + +:::note Why the declare module block? +`LoadedModules` is an interface in `@digital-alchemy/core` that starts empty. By augmenting it here, you're telling TypeScript: "when any service destructures `my_app` from `TServiceParams`, the type of `my_app` is `typeof MY_APP`." + +TypeScript infers `typeof MY_APP` from the `services` object — including the return types of each service function. So `my_app.names.list()` is typed as `string[]` without any explicit annotation anywhere. + +This module augmentation lives in the application definition file, not in each service file, so it only needs to be declared once. +::: + +## Step 4 — Bootstrap + +```typescript title="src/main.mts" +import { MY_APP } from "./application.mts"; + +await MY_APP.bootstrap(); +``` + +Run it: + +```bash +npx tsx src/main.mts +``` + +Output: + +``` +[INFO][my_app:greeter]: Hello, world! +``` + +## Try it live + + + +## What you've seen + +- Services are plain functions. Their return values become the module's API. +- Services reference each other via `TServiceParams` — not direct imports. +- The `declare module` augmentation is what makes TypeScript know the shape of `my_app`. +- Cross-service calls belong inside lifecycle callbacks, not at the top level of the function. + +Next: [Adding Services →](./02-adding-services.md) diff --git a/docs/core/tutorials/02-adding-services.md b/docs/core/tutorials/02-adding-services.md new file mode 100644 index 0000000..0d6f527 --- /dev/null +++ b/docs/core/tutorials/02-adding-services.md @@ -0,0 +1,126 @@ +--- +title: Adding Services +sidebar_position: 3 +description: "Inter-service communication — how services reference each other through TServiceParams." +--- + +This tutorial goes deeper on how services talk to each other: through `TServiceParams`, via the module name key, with TypeScript inferring all types automatically. + +## The communication model + +Services don't import each other. A service in `my_app` never has `import { OtherService } from "./other.service.mts"`. Instead, it receives a reference through `TServiceParams`: + +```typescript +export function ConsumerService({ my_app }: TServiceParams) { + // my_app.producer is the return value of ProducerService + const result = my_app.producer.doSomething(); +} +``` + +The key `my_app` matches the `name` field in `CreateApplication`. If your app is named `"inventory"`, the key is `inventory`. + +## Types flow automatically + +When you declare: + +```typescript +export const MY_APP = CreateApplication({ + name: "my_app", + services: { producer: ProducerService }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +``` + +TypeScript sees that `my_app` on `TServiceParams` is `typeof MY_APP`. It then infers `my_app.producer` as the return type of `ProducerService`. No explicit type annotations required anywhere in the chain. + +## A real example: counter + reporter + +```typescript title="src/counter.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +export function CounterService({ }: TServiceParams) { + let count = 0; + + return { + increment: () => { count++; }, + decrement: () => { count--; }, + get value() { return count; }, + }; +} +``` + +```typescript title="src/reporter.service.mts" +import type { TServiceParams } from "@digital-alchemy/core"; + +export function ReporterService({ logger, lifecycle, my_app }: TServiceParams) { + lifecycle.onReady(() => { + // Increment via the counter service + my_app.counter.increment(); + my_app.counter.increment(); + my_app.counter.increment(); + + // TypeScript knows .value is number — inferred from the getter + logger.info({ count: my_app.counter.value }, "final count"); + }); +} +``` + +```typescript title="src/application.mts" +import { CreateApplication } from "@digital-alchemy/core"; +import { CounterService } from "./counter.service.mts"; +import { ReporterService } from "./reporter.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + services: { + counter: CounterService, + reporter: ReporterService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +``` + +Notice the `get value()` getter in `CounterService`. Getters on the return object expose internal state that can change after wiring — callers see the live value, not a snapshot. This is the idiomatic way to expose readable state that updates over time. + +## Accessing services from a library + +If your application depends on a library, the pattern is identical. The key is the library's `name` field: + +```typescript +export const MY_LIB = CreateLibrary({ name: "my_lib", services: { ... } }); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_lib: typeof MY_LIB; + } +} +``` + +```typescript +export function AppService({ my_lib }: TServiceParams) { + // my_lib is the full typed API of MY_LIB + my_lib.someService.doThing(); +} +``` + +## What `my_app` is not + +`my_app` on `TServiceParams` is not a proxy or a registry — it's just an object. Its shape is assembled during wiring: as each service function returns its value, the framework sets that value on the module's API object. By the time `onBootstrap` fires, every service's return value is in place. + +This means `my_app.counter` in an `onReady` callback is always available and always the real return value — not a promise, not a lazy proxy. + +:::tip +A service can omit its module key from destructuring if it doesn't need to call other services. That's fine. Only destructure what you need. +::: + +Next: [Lifecycle Hooks →](./03-lifecycle-hooks.md) diff --git a/docs/core/tutorials/03-lifecycle-hooks.md b/docs/core/tutorials/03-lifecycle-hooks.md new file mode 100644 index 0000000..133a300 --- /dev/null +++ b/docs/core/tutorials/03-lifecycle-hooks.md @@ -0,0 +1,140 @@ +--- +title: Lifecycle Hooks +sidebar_position: 4 +description: "Why lifecycle callbacks exist, the four startup stages, and when to use each." +--- + +Every service function runs during wiring — once, early in bootstrap. But most real work can't happen at wiring time: config isn't validated yet, other services may not be wired yet, and you certainly can't open a database connection while the dependency graph is still being assembled. + +Lifecycle hooks are how you say "run this code at this specific point in the boot sequence." + +## The four startup stages + +```mermaid +sequenceDiagram + participant W as Wiring + participant P as PreInit + participant C as PostConfig + participant B as Bootstrap + participant R as Ready + + W->>P: all services wired + P->>C: early setup complete + Note over C: config validated here + C->>B: config available + B->>R: connections open + Note over R: app is serving +``` + +| Stage | When | What's available | Typical use | +|---|---|---|---| +| `PreInit` | After wiring, before config | Logger, basic utils | Override config sources, very early setup | +| `PostConfig` | After config is validated | Config values | Read config, initialize config-dependent state | +| `Bootstrap` | After PostConfig | Everything | Open connections, load data, set up resources | +| `Ready` | After all Bootstrap callbacks | Everything | Start serving traffic, start scheduled jobs | + +## Using the hooks + +```typescript +import type { TServiceParams } from "@digital-alchemy/core"; + +export function DatabaseService({ logger, lifecycle, config }: TServiceParams) { + let client: DatabaseClient; + + lifecycle.onPostConfig(() => { + // config.my_app.DATABASE_URL is available here + logger.info({ url: config.my_app.DATABASE_URL }, "config loaded"); + }); + + lifecycle.onBootstrap(async () => { + // Open the connection + client = await DatabaseClient.connect(config.my_app.DATABASE_URL); + logger.info("database connected"); + }); + + lifecycle.onReady(() => { + // Everything is up — safe to start accepting work + logger.info("database service ready"); + }); + + return { + query: async (sql: string) => client.query(sql), + }; +} +``` + +## Why the separation matters + +Consider what happens if you try to read config at the top level of the service function: + +```typescript +export function BadService({ config }: TServiceParams) { + // ❌ Config is NOT validated yet at wiring time + // This may return a default or be undefined + const url = config.my_app.DATABASE_URL; + + return { url }; +} +``` + +Config is collected and validated at `PostConfig`. At wiring time — when your service function body runs — config definitions have been registered but values from environment variables and config files haven't been applied yet. Only defaults are available. + +The fix is simple: move the read into an `onPostConfig` or later callback. + +```typescript +export function GoodService({ config, lifecycle }: TServiceParams) { + let url: string; + + lifecycle.onPostConfig(() => { + // ✅ Config is validated, all sources have been merged + url = config.my_app.DATABASE_URL; + }); + + return { getUrl: () => url }; +} +``` + +## Async bootstrap work + +`onBootstrap` callbacks can be async. The framework awaits each callback before moving to the next stage: + +```typescript +lifecycle.onBootstrap(async () => { + await db.connect(); // framework waits for this + await cache.warmUp(); // then this + logger.info("ready to serve"); +}); +``` + +If a callback throws, bootstrap halts and the application exits with an error. + +## Shutdown stages + +Bootstrap has three startup stages and three matching shutdown stages. They run in reverse order when `SIGTERM`, `SIGINT`, or `app.teardown()` is called. + +| Stage | Typical use | +|---|---| +| `PreShutdown` | Stop accepting new work (close server listeners) | +| `ShutdownStart` | Flush and close resources (db connections, queues) | +| `ShutdownComplete` | Final best-effort cleanup, log shutdown complete | + +```typescript +lifecycle.onPreShutdown(() => { + server.close(); // stop accepting new connections +}); + +lifecycle.onShutdownStart(async () => { + await db.end(); // flush and close + await queue.drain(); // drain pending work +}); + +lifecycle.onShutdownComplete(() => { + logger.info("shutdown complete"); +}); +``` + +## Full hook reference + +For all seven hooks with detailed descriptions, see [Hooks](../reference/lifecycle/hooks.md). For execution order within a stage (priority numbers, parallel vs serial), see [Execution Order](../reference/lifecycle/execution-order.md). + +Next: [Typed Configuration →](./04-typed-configuration.mdx) diff --git a/docs/core/tutorials/04-typed-configuration.mdx b/docs/core/tutorials/04-typed-configuration.mdx new file mode 100644 index 0000000..78dde84 --- /dev/null +++ b/docs/core/tutorials/04-typed-configuration.mdx @@ -0,0 +1,115 @@ +--- +title: Typed Configuration +sidebar_position: 5 +description: "Declare config entries in your module and get a fully typed config object." +--- + +import EmbeddedEditor from '@site/src/components/EmbeddedEditor'; +import { files, defaultFile } from '@site/src/examples/core/tutorials/typed-configuration'; + +Configuration in Digital Alchemy is declared as part of your module definition. The framework collects those declarations at boot, merges values from environment variables, config files, and argv, validates that required entries are present, and hands you a typed `config` object where every key has the right TypeScript type. + +## Declaring configuration + +Configuration entries go in the `configuration` property of `CreateApplication` or `CreateLibrary`: + +```typescript +export const MY_APP = CreateApplication({ + name: "my_app", + configuration: { + API_URL: { + type: "string", + description: "Base URL for the upstream API", + required: true, + }, + PORT: { + type: "number", + default: 3000, + }, + DEBUG: { + type: "boolean", + default: false, + }, + ALLOWED_ORIGINS: { + type: "string[]", + default: ["http://localhost:3000"], + }, + ENVIRONMENT: { + type: "string", + enum: ["local", "staging", "production"] as const, + default: "local", + }, + }, + services: { ... }, +}); +``` + +## Using configuration in a service + +Once declared, `config.my_app` is fully typed. TypeScript infers the type of each key from the `type` and `enum` fields: + +```typescript +export function ApiService({ config }: TServiceParams) { + lifecycle.onPostConfig(() => { + const port: number = config.my_app.PORT; + const env: "local" | "staging" | "production" = config.my_app.ENVIRONMENT; + const debug: boolean = config.my_app.DEBUG; + const origins: string[] = config.my_app.ALLOWED_ORIGINS; + }); +} +``` + +Config values are only guaranteed to be their final values after `PostConfig`. Read them in `onPostConfig` or any later callback. + +## required vs default + +| Pattern | Behavior | +|---|---| +| `required: true`, no `default` | Bootstrap halts with `REQUIRED_CONFIGURATION_MISSING` if unset — use for secrets | +| `default: value` | Value used when no external source provides one | +| Both | Default satisfies `required`; external source overrides the default | +| Neither | Config entry is optional; value is `undefined` when not set | + +:::tip +Use `required: true` without a `default` for secrets (API keys, database URLs). This gives a clear boot failure rather than a confusing runtime error when the secret is missing. +::: + +## Setting values at runtime + +Values come from three sources, merged in this order (later sources win): + +1. `default` in the declaration +2. Environment variables and argv +3. `configuration` in `bootstrap()` options — **highest priority** + +```typescript +await MY_APP.bootstrap({ + configuration: { + my_app: { API_URL: "https://api.example.com", PORT: 8080 }, + boilerplate: { LOG_LEVEL: "debug" }, + }, +}); +``` + +From environment variables, the key format is `MY_APP__PORT=8080` (module name doubled underscore key, all caps). + +## Try it live + +The editor below has an app with five config entries — string, number, boolean, string[], and enum. Open `api.service.mts` and hover over `config.my_app` to see the types. + + + +## Config types + +| `type` value | TypeScript type | Notes | +|---|---|---| +| `"string"` | `string` | With `enum`, narrows to a union literal type | +| `"number"` | `number` | Parsed from string in env (e.g. `"3000"` → `3000`) | +| `"boolean"` | `boolean` | `"true"`, `"1"`, `"yes"` → `true`; `"false"`, `"0"`, `"no"` → `false` | +| `"string[]"` | `string[]` | Comma-separated in env: `"a,b,c"` → `["a","b","c"]` | +| `"record"` | `Record` | JSON string in env | +| `"internal"` | any | Used by built-in services; not for user config | + +For the full type reference with examples, see [Configuration Types](../reference/config/types.mdx). + +Next: [Service Returns →](./05-service-returns.md) diff --git a/docs/core/tutorials/05-service-returns.md b/docs/core/tutorials/05-service-returns.md new file mode 100644 index 0000000..0ab2208 --- /dev/null +++ b/docs/core/tutorials/05-service-returns.md @@ -0,0 +1,102 @@ +--- +title: Service Returns +sidebar_position: 6 +description: "Object vs function return patterns, the getter pattern, and void services." +--- + +A service function can return three things: an object, a function, or nothing. The choice determines how other services call it. + +## Object return + +Return an object when the service exposes multiple methods or properties. This is the most common pattern. + +```typescript +export function RegistryService({ }: TServiceParams) { + const items = new Map(); + + return { + add: (id: string, item: unknown) => items.set(id, item), + remove: (id: string) => items.delete(id), + get: (id: string) => items.get(id), + list: () => [...items.values()], + }; +} +``` + +Other services call it as `my_app.registry.add(...)`, `my_app.registry.list()`, etc. + +### The getter pattern + +Properties on the return object are evaluated once at wiring time. If you expose a property directly: + +```typescript +return { count: internalCount }; // snapshot — won't update +``` + +The value is captured at the moment the object is created. If `internalCount` changes later, callers still see the original value. + +Use a **getter** instead to expose live state: + +```typescript +export function CounterService({ }: TServiceParams) { + let count = 0; + + return { + increment: () => { count++; }, + decrement: () => { count--; }, + get value() { return count; }, // ← live, always current + }; +} +``` + +The getter is evaluated on every access, so `my_app.counter.value` always reflects the current internal state. TypeScript infers the getter's return type automatically — no annotation needed. + +Use getters for: connection state, current counts, feature flags, any value that changes after wiring. + +## Function return + +Return a function when the service's primary interface is a single callable — typically a factory, builder, or context-scoped helper. + +```typescript +export function LoggerFactoryService({ }: TServiceParams) { + return (namespace: string) => ({ + info: (msg: string) => console.log(`[${namespace}] ${msg}`), + error: (msg: string) => console.error(`[${namespace}] ${msg}`), + }); +} +``` + +Other services call it as `my_app.loggerFactory("payments").info("...")`. + +This pattern works well for anything that takes a configuration argument and returns a specialized tool — entity builders, client factories, context-scoped loggers. + +## Void return (side-effect-only) + +A service doesn't have to return anything. If the service's job is to register listeners, set up timers, or perform one-time side effects, a void return is fine. + +```typescript +export function MetricsCollectorService({ lifecycle, scheduler }: TServiceParams) { + lifecycle.onBootstrap(() => { + // Register event listeners, set up instrumentation + }); + + scheduler.setInterval(() => { + // Collect and flush metrics every 30 seconds + }, "30s"); + + // No return — other services don't call this one +} +``` + +There's no type error for omitting a return. TypeScript treats void services correctly; `my_app.metricsCollector` will have type `void`, which is just not callable. + +## Choosing a pattern + +| Pattern | Use when | +|---|---| +| Object return | Multiple methods or readable state | +| Getter on object return | Exposing internal state that changes over time | +| Function return | Single callable; factory or builder | +| Void return | Side effects only; no public API needed | + +Next: [Building a Library →](./06-building-a-library.md) diff --git a/docs/core/tutorials/06-building-a-library.md b/docs/core/tutorials/06-building-a-library.md new file mode 100644 index 0000000..8c8b56b --- /dev/null +++ b/docs/core/tutorials/06-building-a-library.md @@ -0,0 +1,132 @@ +--- +title: Building a Library +sidebar_position: 7 +description: "CreateLibrary, depends, optionalDepends, and sharing code between apps." +--- + +A library is a reusable set of services that can be shared across multiple applications. It's created with `CreateLibrary` instead of `CreateApplication`. The API is almost identical — the main differences are how dependencies are declared and how the framework loads it. + +## CreateLibrary vs CreateApplication + +| | `CreateApplication` | `CreateLibrary` | +|---|---|---| +| Has `bootstrap()` | ✅ | ❌ | +| Has `configuration` | ✅ | ✅ | +| Has `services` | ✅ | ✅ | +| Has `depends` | ❌ | ✅ | +| Can be in `libraries` array | ❌ | ✅ | + +## Writing a library + +```typescript title="src/my-lib/index.mts" +import { CreateLibrary } from "@digital-alchemy/core"; +import { CacheService } from "./cache.service.mts"; +import { HttpService } from "./http.service.mts"; + +export const MY_LIB = CreateLibrary({ + name: "my_lib", + configuration: { + BASE_URL: { + type: "string", + required: true, + }, + CACHE_TTL_MS: { + type: "number", + default: 5000, + }, + }, + services: { + cache: CacheService, + http: HttpService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_lib: typeof MY_LIB; + } +} +``` + +The `declare module` augmentation lives in the library's own index file. Any application that imports this library gets the type for free. + +## Using a library in an application + +Add the library to the application's `libraries` array: + +```typescript title="src/application.mts" +import { CreateApplication } from "@digital-alchemy/core"; +import { MY_LIB } from "./my-lib/index.mts"; +import { AppService } from "./app.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + libraries: [MY_LIB], + services: { + app: AppService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +``` + +The `libraries` array tells the framework which libraries to load and establishes the load order. Libraries are always wired before the application's services. + +## Accessing library services + +Library services are available on `TServiceParams` under the library's name: + +```typescript +export function AppService({ my_lib }: TServiceParams) { + lifecycle.onBootstrap(async () => { + const data = await my_lib.http.get("/items"); + // my_lib.cache, my_lib.http — fully typed + }); +} +``` + +## Library dependencies + +If your library depends on another library, declare it in `depends`: + +```typescript +export const MY_LIB = CreateLibrary({ + name: "my_lib", + depends: [OTHER_LIB], // OTHER_LIB must also be in the app's libraries array + services: { ... }, +}); +``` + +`depends` does two things: +1. Tells the framework to wire `OTHER_LIB` before `MY_LIB` +2. Causes a `MISSING_DEPENDENCY` error at boot if the application hasn't included `OTHER_LIB` in its `libraries` array + +Use `optionalDepends` for soft dependencies — the library won't fail if the dependency is absent, but it will be wired first if it is present: + +```typescript +export const MY_LIB = CreateLibrary({ + name: "my_lib", + optionalDepends: [OPTIONAL_LIB], + services: { ... }, +}); +``` + +:::caution Library names must match LoadedModules keys +The `name` in `CreateLibrary` must exactly match the key you use in `LoadedModules`. If `name: "my_lib"` but `LoadedModules` has `myLib`, TypeScript won't connect them — `my_lib` on `TServiceParams` will be `unknown`. +::: + +## Configuration scoping + +Config is module-scoped. A library's config entries live under `config.my_lib.*`, completely separate from `config.my_app.*`. Applications can't accidentally override a library's config with a same-named key. + +Environment variables follow the same pattern: `MY_LIB__BASE_URL=https://api.example.com`. + +## Full dependency graph reference + +For the topological sort algorithm, cycle detection (`BAD_SORT`), and missing dependency errors, see [Dependency Graph](../reference/libraries/dependency-graph.md). + +Next: [Testing Basics →](./07-testing-basics.mdx) diff --git a/docs/core/tutorials/07-testing-basics.mdx b/docs/core/tutorials/07-testing-basics.mdx new file mode 100644 index 0000000..10366e6 --- /dev/null +++ b/docs/core/tutorials/07-testing-basics.mdx @@ -0,0 +1,123 @@ +--- +title: Testing Basics +sidebar_position: 8 +description: "TestRunner, the fluent builder, run vs serviceParams, and teardown." +--- + +import EmbeddedEditor from '@site/src/components/EmbeddedEditor'; +import { files, defaultFile } from '@site/src/examples/core/tutorials/testing-basics'; + +Digital Alchemy has a first-class testing API built into `@digital-alchemy/core`. It boots your real application in a test environment, gives you access to every service, and tears everything down cleanly between tests. + +## TestRunner + +`TestRunner` takes your application (or library) and returns a fluent builder: + +```typescript +import { TestRunner } from "@digital-alchemy/core"; +import { MY_APP } from "./application.mts"; + +const runner = TestRunner(MY_APP); +``` + +## .run() + +`.run()` boots the application, runs your test callback with `TServiceParams`, then tears down: + +```typescript +it("increments the count", async () => { + await TestRunner(MY_APP) + .run(async ({ my_app }) => { + expect(my_app.counter.value).toBe(0); + my_app.counter.increment(); + expect(my_app.counter.value).toBe(1); + }); +}); +``` + +The callback receives the same `TServiceParams` your service functions receive — including `my_app`, `config`, `logger`, and all other service APIs. + +## Teardown + +When `.run()` completes (or throws), it automatically tears down the application. All lifecycle shutdown hooks fire, and the application is ready for the next test. + +If you need manual control — for example, to keep the app running across multiple `it` blocks — get the teardown function directly: + +```typescript +describe("CounterService", () => { + let teardown: () => Promise; + + afterEach(async () => { + await teardown?.(); + }); + + it("increments", async () => { + await TestRunner(MY_APP) + .run(async ({ my_app, teardown: td }) => { + teardown = td; + my_app.counter.increment(); + expect(my_app.counter.value).toBe(1); + }); + }); +}); +``` + +:::caution Always call teardown +If teardown doesn't run, the next test will share state with the previous one. Always call teardown in `afterEach` when using manual control, or let `.run()` handle it automatically. +::: + +## Configuration in tests + +By default, no config files or environment variables are loaded in tests — the environment is isolated. Override config values using `.configure()`: + +```typescript +await TestRunner(MY_APP) + .configure({ + my_app: { PORT: 9999, DEBUG: true }, + }) + .run(async ({ config }) => { + expect(config.my_app.PORT).toBe(9999); + }); +``` + +## Replacing services for mocking + +`.appendLibrary()` and `.replaceLibrary()` let you inject test doubles. See [Module Replacements](../reference/testing/module-replacements.md) for the full API. + +## Try it live + + + +## .serviceParams() + +`.run()` boots, runs your callback, and tears down. If you need access to `TServiceParams` outside of a single function — for example, to set up state before tests and then inspect services in multiple `it` blocks — use `.serviceParams()` instead: + +```typescript +describe("CounterService", () => { + let params: TServiceParams; + let teardown: () => Promise; + + beforeAll(async () => { + const result = await TestRunner(MY_APP).serviceParams(); + params = result; + teardown = result.teardown; + }); + + afterAll(async () => { + await teardown(); + }); + + it("starts at zero", () => { + expect(params.my_app.counter.value).toBe(0); + }); + + it("increments", () => { + params.my_app.counter.increment(); + expect(params.my_app.counter.value).toBe(1); + }); +}); +``` + +For the full `TestRunner` API reference, see [TestRunner](../reference/testing/test-runner.md). + +Next: [What Next? →](./08-what-next.md) diff --git a/docs/core/tutorials/08-what-next.md b/docs/core/tutorials/08-what-next.md new file mode 100644 index 0000000..e02186d --- /dev/null +++ b/docs/core/tutorials/08-what-next.md @@ -0,0 +1,45 @@ +--- +title: What Next? +sidebar_position: 9 +description: "You've learned the core model — here's where to go from here." +--- + +You now understand the essential building blocks of Digital Alchemy Core: + +- Services are plain functions that receive `TServiceParams` and return their public API +- Modules wire services together; `LoadedModules` connects the type system +- Lifecycle hooks control when code runs — `PostConfig`, `Bootstrap`, `Ready` +- Configuration is declared per-module and validated at boot +- Libraries package services for reuse across applications +- `TestRunner` boots your real application in an isolated test environment + +## Reference — when you need the details + +| Topic | Reference page | +|---|---| +| All `CreateApplication` options | [CreateApplication](../reference/application/create-application.md) | +| All `BootstrapOptions` fields | [Bootstrap Options](../reference/application/bootstrap.md) | +| `TServiceParams` full property list | [TServiceParams](../reference/services/service-params.mdx) | +| All 7 lifecycle hooks | [Hooks](../reference/lifecycle/hooks.md) | +| Lifecycle execution order and priorities | [Execution Order](../reference/lifecycle/execution-order.md) | +| Config types, sourcing, and access | [Config Overview](../reference/config/overview.md) | +| Logger, scheduler, event bus | [Builtins](../reference/builtins/index.md) | +| `TestRunner` full API | [TestRunner](../reference/testing/test-runner.md) | + +## Guides — mental models + +| Question | Guide | +|---|---| +| What exactly happens when I call `bootstrap()`? | [Bootstrap Internals](../guides/bootstrap-internals.md) | +| Why DI? Why not just import everything? | [Dependency Injection](../guides/dependency-injection.md) | +| How do I organize a real multi-service app? | [Application Structure](../guides/application-structure.md) | +| How does config flow from env to my code? | [Config and Environments](../guides/config-and-environment.md) | +| How should I approach testing? | [Testing Strategies](../guides/testing-strategies.md) | + +## Advanced + +| Topic | Page | +|---|---| +| Async Local Storage and structured logging | [Async Local Storage](../advanced/async-local-storage.md) | +| Boot timing and performance metrics | [Boot Metrics](../advanced/boot-metrics.md) | +| Logger options, config sources, custom logger | [Project Tuning](../advanced/project-tuning.md) | diff --git a/docs/core/tutorials/09-custom-config-loader.md b/docs/core/tutorials/09-custom-config-loader.md new file mode 100644 index 0000000..50dff48 --- /dev/null +++ b/docs/core/tutorials/09-custom-config-loader.md @@ -0,0 +1,327 @@ +--- +title: Custom Config Loaders +sidebar_position: 10 +description: "Build a config loader that reads values from any external source and integrates natively with DA's configuration system." +--- + +The built-in sources — environment variables, CLI flags, and config files — cover most use cases. But any external store (a secrets manager, a remote key-value API, a database) requires a custom loader. This tutorial shows the complete shape. + +## What a config loader is + +A config loader is a function that runs during the `PostConfig` lifecycle phase, after defaults are applied but before `onPostConfig` callbacks fire. It receives the full config definition — all declared entries for every module in the application — and returns a partial config object to merge into the running config. + +```typescript +type ConfigLoader = (params: ConfigLoaderParams) => Promise>; +``` + +The return type `Partial` mirrors the `bootstrap.configuration` shape: + +```typescript +// Return values are merged like this: +{ + my_app: { DATABASE_URL: "postgres://remote-host/mydb" }, + my_lib: { API_KEY: "secret-from-vault" }, +} +``` + +## Registering a loader + +Loaders are registered from a service using `internal.boilerplate.configuration.registerLoader`: + +```typescript +import type { TServiceParams } from "@digital-alchemy/core"; + +export function RemoteConfigService({ internal, lifecycle }: TServiceParams) { + lifecycle.onBootstrap(() => { + internal.boilerplate.configuration.registerLoader( + async (params) => { + // fetch and return config values + return {}; + }, + "remote", // loader name — must match a key in ConfigLoaderSource + ); + }); +} +``` + +The second argument is the loader name. It must be a key in `ConfigLoaderSource` — which means you need to declare it before you can register it. + +## Extending ConfigLoaderSource + +`ConfigLoaderSource` is an extensible interface. The built-in keys are `env`, `argv`, and `file`. Add your own key to make it a valid loader name and a valid `configSources` toggle: + +```typescript title="src/config-loader.mts" +declare module "@digital-alchemy/core" { + export interface ConfigLoaderSource { + remote: true; + } +} +``` + +Once declared, `"remote"` is a valid name for `registerLoader` and can be toggled in `configSources`: + +```typescript +await MY_APP.bootstrap({ + configSources: { + remote: false, // skip remote loader in dev + }, +}); +``` + +## Adding per-entry metadata with BaseConfig + +The real power of a custom loader is the ability to annotate config entries with metadata that tells the loader which entries it should fetch. Do this by extending `BaseConfig`: + +```typescript title="src/config-loader.mts" +declare module "@digital-alchemy/core" { + export interface ConfigLoaderSource { + remote: true; + } + + export interface BaseConfig { + remote?: { key: string; namespace?: string }; + } +} +``` + +Now any config entry can declare `remote: { key: "..." }`: + +```typescript +export const MY_APP = CreateApplication({ + name: "my_app", + configuration: { + DATABASE_URL: { + type: "string", + required: true, + remote: { key: "db-connection-string", namespace: "shared" }, + }, + API_KEY: { + type: "string", + required: true, + remote: { key: "api-key" }, + source: ["remote"], // restrict to remote only — never from env or file + }, + }, + // ... +}); +``` + +## Scanning config entries + +`params.configs` is a `Map>` — a map from module name to its config definitions. Iterate it to find entries with your metadata: + +```typescript +async (params) => { + const result: Partial = {}; + + for (const [moduleName, moduleConfigs] of params.configs.entries()) { + for (const [key, entry] of Object.entries(moduleConfigs)) { + if (!entry.remote) continue; // skip entries without our metadata + + const value = await fetchFromRemote(entry.remote.key, entry.remote.namespace); + + result[moduleName] ??= {}; + result[moduleName][key] = value; + } + } + + return result; +} +``` + +`entry.remote` is typed because we merged into `BaseConfig` — TypeScript knows the shape. + +## Parallel loading + +For many entries, sequential fetches are slow. Build a list of promises and await them together: + +```typescript +async (params) => { + const result: Partial = {}; + const waiting: Promise[] = []; + + for (const [moduleName, moduleConfigs] of params.configs.entries()) { + for (const [key, entry] of Object.entries(moduleConfigs)) { + if (!entry.remote) continue; + + waiting.push( + (async () => { + const value = await fetchFromRemote(entry.remote!.key, entry.remote!.namespace); + result[moduleName] ??= {}; + result[moduleName][key] = value; + })(), + ); + } + } + + await Promise.all(waiting); + return result; +} +``` + +All fetch calls run concurrently. The result map is built up safely because each promise writes to a different key. + +## Error handling + +Use `BootstrapException` for fatal failures — errors that should halt the application rather than boot with a missing value: + +```typescript +import { BootstrapException } from "@digital-alchemy/core"; + +// ... +const value = await fetchFromRemote(entry.remote.key).catch((error) => { + throw new BootstrapException( + context, + "REMOTE_CONFIG_FETCH_FAILED", + `Failed to load config key "${entry.remote.key}": ${error.message}`, + ); +}); +``` + +`BootstrapException` triggers a clean shutdown with a logged error. The process exits before `onPostConfig` runs — so `required: true` entries that weren't populated never trigger the generic "missing required config" error; they get your specific error instead. + +## Full example + +A `RemoteConfigService` that fetches from a generic HTTP config endpoint: + +```typescript title="src/services/remote-config.service.mts" +import { BootstrapException } from "@digital-alchemy/core"; +import type { TServiceParams } from "@digital-alchemy/core"; + +export function RemoteConfigService({ + config, + context, + internal, + lifecycle, + logger, +}: TServiceParams) { + lifecycle.onBootstrap(() => { + internal.boilerplate.configuration.registerLoader(async (params) => { + const endpoint = config.my_app.CONFIG_SERVICE_URL; + const token = config.my_app.CONFIG_SERVICE_TOKEN; + + if (!endpoint) { + logger.debug("no config service URL set, skipping remote loader"); + return {}; + } + + const result: Record> = {}; + const waiting: Promise[] = []; + + for (const [moduleName, moduleConfigs] of params.configs.entries()) { + for (const [key, entry] of Object.entries(moduleConfigs)) { + if (!entry.remote) continue; + + waiting.push( + (async () => { + const url = `${endpoint}/config/${entry.remote!.namespace ?? "default"}/${entry.remote!.key}`; + const response = await globalThis.fetch(url, { + headers: { Authorization: `Bearer ${token}` }, + }).catch((error) => { + throw new BootstrapException( + context, + "CONFIG_FETCH_FAILED", + `Could not reach config service for "${entry.remote!.key}": ${error.message}`, + ); + }); + + if (!response.ok) { + throw new BootstrapException( + context, + "CONFIG_FETCH_HTTP_ERROR", + `Config service returned ${response.status} for key "${entry.remote!.key}"`, + ); + } + + const { value } = await response.json(); + result[moduleName] ??= {}; + result[moduleName][key] = value; + logger.trace({ key: entry.remote!.key, moduleName }, "loaded remote config"); + })(), + ); + } + } + + await Promise.all(waiting); + logger.debug({ count: waiting.length }, "remote config loaded"); + return result; + }, "remote"); + }); +} +``` + +## Using the loader in config entries + +Config entries that should come from the remote loader declare the `remote` property: + +```typescript +export const MY_APP = CreateApplication({ + name: "my_app", + configuration: { + // Values from the config service + DATABASE_URL: { + type: "string", + required: true, + remote: { key: "database-url" }, + }, + THIRD_PARTY_API_KEY: { + type: "string", + required: true, + remote: { key: "third-party-api-key", namespace: "shared-secrets" }, + source: ["remote"], // can't be overridden by env or file + }, + + // Non-remote values (normal env/file sources) + CONFIG_SERVICE_URL: { + type: "string", + }, + CONFIG_SERVICE_TOKEN: { + type: "string", + required: true, + source: ["env"], + }, + }, + // ... +}); +``` + +## Dev vs prod + +In development, skip the remote loader entirely using `configSources`: + +```typescript title="src/main.mts (local development)" +await MY_APP.bootstrap({ + configSources: { + remote: false, // use env/file in dev + }, + configuration: { + my_app: { + DATABASE_URL: "postgres://localhost/myapp_dev", + THIRD_PARTY_API_KEY: "dev-test-key", + }, + }, +}); +``` + +```typescript title="src/main.mts (production)" +await MY_APP.bootstrap({ + configSources: { + file: false, // no config files in prod + argv: false, // no CLI flags + remote: true, // remote loader active (this is also the default if not specified) + }, +}); +``` + +The loader code itself doesn't need to change between environments — the `configSources` toggle handles it. + +## Summary + +- Extend `ConfigLoaderSource` to register your loader name as a valid key +- Extend `BaseConfig` to add per-entry metadata that config authors use to annotate which entries your loader handles +- In your loader, iterate `params.configs.entries()` to find annotated entries +- Use `Promise.all()` for parallel fetches +- Throw `BootstrapException` for fatal failures +- Toggle the loader with `configSources` so it only runs in deployed environments + +For existing config source patterns and merge order, see [Config Sourcing](../reference/config/sourcing.md). diff --git a/docs/core/tutorials/index.md b/docs/core/tutorials/index.md new file mode 100644 index 0000000..4f4a84a --- /dev/null +++ b/docs/core/tutorials/index.md @@ -0,0 +1,25 @@ +--- +title: Tutorials +sidebar_position: 1 +description: "Step-by-step learning path for Digital Alchemy Core." +--- + +These tutorials walk you through the framework in progressive steps. Each tutorial builds on the previous one and introduces exactly one new concept. + +Work through them in order on your first pass. If you're returning for a specific topic, the table below will get you there directly. + +## Learning path + +| Tutorial | What you learn | +|---|---| +| [First Application](./01-first-application.mdx) | The three-file app pattern — service, module, bootstrap | +| [Adding Services](./02-adding-services.md) | How services reference each other through `TServiceParams` | +| [Lifecycle Hooks](./03-lifecycle-hooks.md) | Why lifecycle callbacks exist and when to use each stage | +| [Typed Configuration](./04-typed-configuration.mdx) | Declaring config entries and using typed values | +| [Service Returns](./05-service-returns.md) | Object vs function return; getter pattern | +| [Building a Library](./06-building-a-library.md) | `CreateLibrary`, `depends`, and sharing code between apps | +| [Testing Basics](./07-testing-basics.mdx) | `TestRunner`, the fluent builder, and teardown | +| [What Next?](./08-what-next.md) | Summary and where to go from here | +| [Custom Config Loaders](./09-custom-config-loader.md) | Write a loader that reads config from any external source | + +If you've already read the [Quickstart](../get-started/quickstart.mdx), the first tutorial covers the same material with more depth and a second service added. You can skip to [Adding Services](./02-adding-services.md) if you're comfortable with the basics. diff --git a/docs/home-automation/automation/solar.md b/docs/home-automation/automation/solar.md index 5392cd4..20410a5 100644 --- a/docs/home-automation/automation/solar.md +++ b/docs/home-automation/automation/solar.md @@ -4,7 +4,7 @@ sidebar_position: 3 --- The solar extension exists to make it easy to perform time math with reference points for the sun. -It uses `lat/long` provided by Home Assistant, updating reference points nightly with the [Scheduler](/docs/core/services/builtin/core_scheduler). +It uses `lat/long` provided by Home Assistant, updating reference points nightly with the [Scheduler](/docs/core/reference/builtins/scheduler). ## 🌅 Reference Points diff --git a/docs/home-automation/hass/api/websocket.md b/docs/home-automation/hass/api/websocket.md index 8d4a4a6..0db7057 100644 --- a/docs/home-automation/hass/api/websocket.md +++ b/docs/home-automation/hass/api/websocket.md @@ -8,7 +8,7 @@ The Websocket API is a self-managed method of communicating with Home Assistant. ## Connection Management -The websocket connection is not available until the [onReady](/docs/core/advanced/lifecycle) lifecycle event. +The websocket connection is not available until the [onReady](/docs/core/reference/lifecycle/hooks) lifecycle event. It operates completely on it's own to manage it's own state, periodically sending pings and re-establishing the connection if it ever drops. It will even proactively disconnect the socket as part of the shutdown process. diff --git a/docs/home-automation/quickstart/haos/index.md b/docs/home-automation/quickstart/haos/index.md index 73c0404..247ac10 100644 --- a/docs/home-automation/quickstart/haos/index.md +++ b/docs/home-automation/quickstart/haos/index.md @@ -6,8 +6,6 @@ aliases: - blog/00 - blog/Quickstart --- -import ReactPlayer from 'react-player' - Welcome to the **Digital Alchemy** Home Automation quickstart project! This guide is built for [HAOS](https://developers.home-assistant.io/docs/operating-system/) & setups where the [Supervisor](https://developers.home-assistant.io/docs/supervisor/) is available. @@ -33,8 +31,6 @@ This command will: - Set up type definitions - Provide next steps - - ## ⚒️ Workspace Management diff --git a/docusaurus.config.ts b/docusaurus.config.ts index 810b0c0..72801e2 100644 --- a/docusaurus.config.ts +++ b/docusaurus.config.ts @@ -35,7 +35,7 @@ const config: Config = { defaultLocale: "en", locales: ["en"], }, - plugins: [], + plugins: ["./plugins/webpack-fallback.ts"], presets: [ [ diff --git a/draft/side-projects/backup-coordinator/index.md b/draft/side-projects/backup-coordinator/index.md deleted file mode 100644 index dd10c37..0000000 --- a/draft/side-projects/backup-coordinator/index.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -title: Backup Coordinator -authors: [zoe-codez] -sidebar_position: 1 ---- - -> ⚠️ Experimental project - -## Overview - -The backup coordinator project is a `digital-alchemy` based wrapper for [BorgBackup](https://borgbackup.readthedocs.io/en/stable), allowing for easy scheduled deduplicated backups of devices across your network. -This project brings convenient bindings to Home Assistant via a `synapse` backed application - -## Basic Usage - -This project ships with 2 major components: - -1. `drone`: a wrapper for `borg` deployed to each target machine -2. `backup_coordinator`: a coordinator service for drone when to backup / offsite - -Both portions of the project can be ran as either a standalone application or as an imported library/module for a larger app - -### Backup Drones - -Backup drones are the portion of the project that handles interactions with `borg` itself. It exposes entities for: - -> See [install](/docs/side-projects/backup-coordinator/install.md) guide for configuration details - -| Entity Type | Name | Description | -| --- | --- | --- | -| `number` | Backup Frequency | (minutes) Used by coordinator to schedule backups | -| `button` | Create Backup | Create a new backup | -| `button` | Prune Backups | Prune old archives according to rules | -| `button` | Update Stats | Update archive stats sensors | -| `button` | Scheduled Backup | Run a scheduled backup, includes `create`, `prune`, `stats` | -| `sensor` | Application State | The current operation being performed. `idle` by default | -| `select` | Application Mode | Should this app be considered by the coordinator app | -| `sensor` | Last Prune | Timestamp of the last completed prune | -| `sensor` | Last Backup | Timestamp of the last completed backup | -| `sensor` | Archive Total Size | Total size of data in archive | -| `sensor` | Archive Compressed Size | Archive size after compression | -| `sensor` | Archive Deduplicated Size | Archive size after deduplication | -| `number` | Keep Monthly | Refer to [borg docs](https://borgbackup.readthedocs.io/en/stable/usage/prune.html) | -| `number` | Keep Yearly | Refer to [borg docs](https://borgbackup.readthedocs.io/en/stable/usage/prune.html) | -| `number` | Keep Weekly | Refer to [borg docs](https://borgbackup.readthedocs.io/en/stable/usage/prune.html) | -| `text` | Keep Within | Keep all backups inside this time range | - -| ![on a dashboard](/img/backup_drone.png) | Multiple Backup Devices on Dashboard | -| --- | --- | - -While performing create operations, process updates will be emitted via Home Assistant events. -The coordinator app is set up to receive this and centrally present information about the in-progress update. - -This app is intended to run on the target machine needing backups - -### Coordinator - -The coordinator app exists to coordinate the various - -- failure detection -- round robin scheduler -- progress watcher entities diff --git a/draft/side-projects/backup-coordinator/install.md b/draft/side-projects/backup-coordinator/install.md deleted file mode 100644 index 68a52ac..0000000 --- a/draft/side-projects/backup-coordinator/install.md +++ /dev/null @@ -1,76 +0,0 @@ ---- -title: Installation -authors: [zoe-codez] -sidebar_position: 2 ---- - -## Borg Install - -Install the correct version of borg for your system, and ensure that it's on `$PATH` for your user - -- [Borg Releases](https://github.com/borgbackup/borg/releases) - -```bash -> borg --version -borg 1.4.0 -``` - -You will need to initialize a new repo by hand, below is an example command for setting creating on a remote machine. - -```bash -BORG_PASSPHRASE="super_secret_password" borg init --encryption=repokey-blake2 user@hostname:/path/to/repo -``` - -The `BORG_PASSPHRASE` will need to be matched in the configuration for your app in order to create backups properly - -## Config Files - -> See [configuration](/docs/core/techniques/configuration) docs for more options for providing keys to app - -Create the file `~/.config/drone_app` (or match to your application's name). - -```ini -; credentials to home assistant install -[hass] - TOKEN=long lived access token - BASE_URL=http://homeassistant.local - -; minimal configuration for module -[drone] - BORG_PASSPHRASE=super_secret_password - REPOSITORY=user@hostname:/path/to/repo - ; ; example patterns to ignore - ; EXCLUDE_PATTERNS[]=*/node_modules - ; EXCLUDE_PATTERNS[]=*/.cache - - ; ; source paths to include (default is /home) - ; TARGETS[]=/home - -; provide an absolute path to where entity data can be kept -; 👍 same folder as this file -[synapse] - SQLITE_DB=/path/to/sqlite.db -``` - -Individual folders can be ignored by creating a `.nobackup` file - -```bash -cd /omit/this/path -touch .nobackup -``` - -## Manual Testing - -Once the configuration file is created, the app can be easily run from inside the repo to see how things work - -```bash -yarn start:drone -``` - -Each drone integrates with Home Assistant through the synapse integration. - -## Real world usage - -### As applications - -### As modules diff --git a/draft/side-projects/backup-coordinator/offsite.md b/draft/side-projects/backup-coordinator/offsite.md deleted file mode 100644 index a8f2743..0000000 --- a/draft/side-projects/backup-coordinator/offsite.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Offsite -authors: [zoe-codez] -sidebar_position: 3 ---- - -## Backblaze B2 - -## NAS mode diff --git a/draft/side-projects/backup-coordinator/recovery.md b/draft/side-projects/backup-coordinator/recovery.md deleted file mode 100644 index 3e42ff2..0000000 --- a/draft/side-projects/backup-coordinator/recovery.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Recovery -authors: [zoe-codez] -sidebar_position: 2 ---- - -## Offsite Restoration - -## Device Recovery diff --git a/draft/side-projects/index.md b/draft/side-projects/index.md deleted file mode 100644 index af8447a..0000000 --- a/draft/side-projects/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: 🏗️ Side Projects -authors: [zoe-codez] -sidebar_position: 5 ---- - -Other projects published under the org that aren't related to other sections. diff --git a/draft/side-projects/matrix-rendering/build-guide.md b/draft/side-projects/matrix-rendering/build-guide.md deleted file mode 100644 index 34cbc41..0000000 --- a/draft/side-projects/matrix-rendering/build-guide.md +++ /dev/null @@ -1,159 +0,0 @@ ---- -title: Hardware Build ---- - -This project details the construction of Pi Matrix compatible hardware, and provides the software to do the rendering (coming soon) - -> Links provided for easy to find product reference, project can be made much more cost efficiently -> -> Items marked as optional if they can be easily worked around with -> -> **Warning**: -> This build requires some hand wiring and interacting with wires that contains high voltage. This is **not** an introductory guide, - -## Hardware - -### Controller (v3) - -#### Completed build pics - -| Front | Side | -| ------------- | -------------- | -| ![side](/img/side.jpg) | ![front](/img/front.jpg) | - -#### Parts list - -| Name | Purchase Link | Required | Notes | Image | -| -------------- | ------------------------------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | --------------------- | -| Raspberry Pi 4 | n/a | Y | | **----** | -| Cooling / case | [Amazon](https://www.amazon.com/dp/B07VD568FB) | N | This one is very solid, and is great for keeping things contained. Version 1 uses a different cooler (see magnetic mounting section) | ![case](/img/case.jpg) | -| USB Speaker | [Amazon](https://www.amazon.com/gp/product/B075M7FHM1) | N | Used for audio alerts | ![speaker](/img/speaker.jpg) | -| Ribbon Cable | [Amazon](https://www.amazon.com/dp/B07D991KMR) | N | For orgnization. Can use jumpers to go from device directly to 16 pin cable if desired | ![ribbon_cable](/img/ribbon_cable.jpg) | - -#### 💅 Look good - -> -> Highly recommended step: break out the metallic markers! 🎨 - -![willow](/img/willow.jpg) - -### 🧺 Odds and ends - -Random odds and ends used in the build. - -| Name | Purchase Link | Required | Notes | Image | -| ------------ | ---------------------------------------------- | -------- | ----------------------------------------------------------- | --------------------- | -| Power Supply | [Amazon](https://www.amazon.com/dp/B06XK2DDW4) | Y | Any 5V power source should be fine with sufficient amperage | ![power_supply](/img/power_supply.jpg) | -| SD Card | -- | | You need some boot device | | - -- Power cord -- Hot glue -- Zip ties -- Velcro ties -- Wire nuts / wago connectors -- Network cable -- Independent power supply for Raspberry Pi -- Extra wire -- Hacksaw - -## 🚦 Display Construction - -The matrix is made up of 2 layers: the aluminum frame, and the rgb matrix display. Magnets on standoffs are used to provide a hot swap friendly connection - -### 🏗️ Frame - -The frame is a fairly straightforward build. The dual channel aluminum isn't technically needed, but I personally enjoy the aesthetics with the slot clovers in the final build - -| Corner bracket joins | Dry fitting | -| ---------------------- | --------------------- | -| ![aluminum_join](/img/aluminum_join.jpg) | ![construction](/img/construction.jpg) | - -#### Frame parts list - -| Name | Purchase Link | Required | Notes | Image | -| -------------- | ------------------------------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | --------------------- | -| Dual extruded aluminum | [Amazon](https://www.amazon.com/gp/product/B08X4PB5GC) | Y | Structural | ![dual_aluminum](/img/dual_aluminum.jpg) | -| Single extruded aluminum | [Amazon](https://www.amazon.com/gp/product/B087PVD55Y) | Y | Structural | ![single_aluminum](/img/single_aluminum.jpg) | -| Corner bracket | [Amazon](https://www.amazon.com/gp/product/B0855V2JV3) | Y | Structural | ![corner_bracket](/img/corner_bracket.jpg) | -| End Cap | [Amazon](https://www.amazon.com/gp/product/B09JS8L4XT) | N | Aesthetics | ![end_cap](/img/end_cap.jpg) | -| Slot cover | [Amazon](https://www.amazon.com/gp/product/B09KPZBTB9) | N | Aesthetics | ![slot_cover](/img/slot_cover.jpg) | - -It's dimensions are going to be determined by the positions of the mounts on your panels. It's recommended to get at least 4 points of contact on each panel for proper stability. It's not required to get all points, and may make final assembly more difficult. - -This part is a time consuming process, tweaking the individual pieces into position and locking them down. -Cutting to final dimensions should be saved for the very end of this. Once dimensions are determined, mark everything with a silver sharpie and cut to size. 🪚 - -### 🧲 Magnetic mounts - -The panels are intended to be hot swappable, and use a mounting system intended for tool free maintenance. No fussing with screwdrivers and small parts on a ladder! 🪜 - -> **Warning**: Keep an eye on the polarity & orientation of the magnets! -> -> Not all magnets are polarized the same in cheap magnet sets. It is easy to get combinations where a single pair repel each other 😡 -> -> --- -> -> **Washer will bend if over tightened**: Just enough to be secure is perfect - -| Magnet interface | Frame side mount | -| -------------------- | -------------------- | -| ![frame_mount](/img/frame_mount.jpg) | ![panel_mount](/img/panel_mount.jpg) | - -#### Parts list - -| Name | Purchase Link | Required | Notes | Image | -| ------------------- | ------------------------------------------------------ | -------- | ------------------------------------------------- | --------------------------- | -| Countersunk Magnets | [Amazon](https://www.amazon.com/gp/product/B0816HQ5RD) | Y | The countersink is nice for getting a flush mount | ![countersunk_magnet](/img/countersunk_magnet.jpg) | -| M3 screw | [Amazon](https://www.amazon.com/gp/product/B018RSXQ02) | Y | Attaching magnets to standoffs and panels | ![m3_screw](/img/m3_screw.jpg) | -| M3 washers | [Amazon](https://www.amazon.com/gp/product/B07WST3YJJ) | Y | For clamping to frame | ![m3_washer](/img/m3_washer.jpg) | -| M3 T-nut | [Amazon](https://www.amazon.com/gp/product/B08NZMD2BJ) | Y | Add to extruded aluminum to create sliding mounts | ![m3_t_nut](/img/m3_t_nut.jpg) | -| M3 standoff | [Amazon](https://www.amazon.com/dp/B07WR5Q2SY) | Y | Attach to t-nuts to create mount points | ![m3_standoff](/img/m3_standoff.jpg) | - -#### 🧷 Attached controller mod - -The controller can also be attached to the frame via a similar magnetic mount to the panels - -| Name | Purchase Link | Notes | Image | -| ---------- | ------------------------------------------------------ | --------------------------------------------------- | ---------------------- | -| Heat sink | [Amazon](https://www.amazon.com/gp/product/B07PCMTZHF) | Removed fan, passive cooling is enough for use case | ![fan_heat_sync](/img/fan_heat_sync.jpg) | -| Power Cord | [Amazon](https://www.amazon.com/gp/product/B07V2CKPLG) | For a clean look | ![180_cable](/img/180_cable.jpg) | - -![magnetic_pi_mount](/img/magnetic_pi_mount.jpg) - -### 📱 Final Assembly - -Time to finally put the display on the frame and wire it together! - -The first part of this is finding a wide flat surface for the frame to lay down on when you get to the wiring phase - -| Partial assembly | Assembled Display | -| ---------------------- | -------------------------- | -| ![display_parts](/img/display_parts.jpg) | ![display_assembled](/img/display_assembled.jpg) | - -Assuming everything went to plan, then you should have a flat display with none of the panels having an obvious visual gap. Adding a bit of hot glue can help everything stay together - -> Says "**hot swappable**", adds glue - -| ![secured](/img/secured.jpg) | Adding extra security to the joints | -| ----------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Power wiring | ![power_wiring](/img/power_wiring.jpg) | -| ![data_wiring](/img/data_wiring.jpg) | Data wiring. Gray ribbons (shipped with panels) used to join left/right sides, rainbow ribbons used to join rows -- You can see the data input for the pi in the bottom/right | -| The sacraficial power supply | ![with_supply](/img/with_supply.jpg) | - -- Left and right joined together -- 5x`5v` out -- 5x`gnd` out - -#### Parts list - -| Name | Purchase Link | Required | Notes | Image | -| -------------- | ------------------------------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------ | --------------------- | -| Cable connector | [Amazon](https://www.amazon.com/gp/product/B07WHFWMYQ) | N | Extra cable needed for laying out matrix in grid | ![cable_connector](/img/cable_connector.jpg) | -| Extra ribbon cable | [Amazon](https://www.amazon.com/gp/product/B07PBGVCNL) | N | Extra cable needed for laying out matrix in grid | ![ribbon_cable_long](/img/ribbon_cable_long.jpg) | -| Ribbon connectors | [Amazon](https://www.amazon.com/gp/product/B00E57QQVG) | N | Extra cable needed for laying out matrix in grid | ![ribbon_connector](/img/ribbon_connector.jpg) | -| RGB matrix | [Adafruit](https://www.adafruit.com/product/2278) | Y | Anything compatible with [hzeller/rpi-rgb-led-matrix](https://github.com/hzeller/rpi-rgb-led-matrix) | ![rgb_matrix](/img/rgb_matrix.jpg) | -| Matrix bonnet | [Adafruit](https://www.adafruit.com/product/3211) | N | Can adapt from 40 pin cable to the 16 + additional uses | ![matrix_bonnet](/img/matrix_bonnet.jpg) | - -> 🎉 🧟‍♀️ It's Alive!!! -> -![party_parrot](/img/party_parrot.gif) diff --git a/draft/side-projects/matrix-rendering/hardware-setup.md b/draft/side-projects/matrix-rendering/hardware-setup.md deleted file mode 100644 index 09a04e0..0000000 --- a/draft/side-projects/matrix-rendering/hardware-setup.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -title: Device Setup ---- - -> [!wip] - -## Commands - -```bash -sudo su -apt-get update -apt-get upgrade -apt-get install mplayer - -# * Install node + yarn -curl -fsSL https://fnm.vercel.app/install | bash -source /root/.bashrc -fnm install 18 -source "$HOME/.bashrc" -curl -o- -L https://yarnpkg.com/install.sh | bash -export PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH" - -# * Install yarn dependencies -yarn global add @digital-alchemy/log-formatter pm2 -``` - -## Tuning - -- https://github.com/hzeller/rpi-rgb-led-matrix#use-minimal-raspbian-distribution diff --git a/draft/side-projects/matrix-rendering/index.md b/draft/side-projects/matrix-rendering/index.md deleted file mode 100644 index 09ec2c6..0000000 --- a/draft/side-projects/matrix-rendering/index.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -title: Matrix Rendering -aliases: - - Matrix-Rendering ---- diff --git a/draft/side-projects/terminal/ansi-functions.md b/draft/side-projects/terminal/ansi-functions.md deleted file mode 100644 index e69de29..0000000 diff --git a/draft/side-projects/terminal/application-manager.md b/draft/side-projects/terminal/application-manager.md deleted file mode 100644 index b279787..0000000 --- a/draft/side-projects/terminal/application-manager.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Application Manager ---- diff --git a/draft/side-projects/terminal/colors.md b/draft/side-projects/terminal/colors.md deleted file mode 100644 index e69de29..0000000 diff --git a/draft/side-projects/terminal/comparison-tools.md b/draft/side-projects/terminal/comparison-tools.md deleted file mode 100644 index e69de29..0000000 diff --git a/draft/side-projects/terminal/components/acknowledge.md b/draft/side-projects/terminal/components/acknowledge.md deleted file mode 100644 index e89b215..0000000 --- a/draft/side-projects/terminal/components/acknowledge.md +++ /dev/null @@ -1,3 +0,0 @@ -- DEFAULT_ACKNOWLEDGE_MESSAGE - -![acknowledge](/img/acknowledge.png) diff --git a/draft/side-projects/terminal/components/array-builder.md b/draft/side-projects/terminal/components/array-builder.md deleted file mode 100644 index 9507b3a..0000000 --- a/draft/side-projects/terminal/components/array-builder.md +++ /dev/null @@ -1,3 +0,0 @@ -![array_builder_base](/img/array_builder_base.png) - -![array_builder_edit](/img/array_builder_edit.png) diff --git a/draft/side-projects/terminal/components/confirm.md b/draft/side-projects/terminal/components/confirm.md deleted file mode 100644 index ee1a521..0000000 --- a/draft/side-projects/terminal/components/confirm.md +++ /dev/null @@ -1 +0,0 @@ -![confirm](/img/confirm.png) diff --git a/draft/side-projects/terminal/components/menu.md b/draft/side-projects/terminal/components/menu.md deleted file mode 100644 index d7bdd8d..0000000 --- a/draft/side-projects/terminal/components/menu.md +++ /dev/null @@ -1,11 +0,0 @@ -- MENU_SEARCHBOX_NORMAL -- MENU_SEARCHBOX_EMPTY -- MENU_SEARCHBOX_CONTENT -- HELP_DIVIDER -- MENU_ENTRY_SELECTED -- MENU_ENTRY_NORMAL -- MENU_ENTRY_TYPE -- MENU_ENTRY_TYPE_OTHER -- MENU_ENTRY_OTHER - -![menu](/img/menu.png) diff --git a/draft/side-projects/terminal/components/object-builder.md b/draft/side-projects/terminal/components/object-builder.md deleted file mode 100644 index 88eed2d..0000000 --- a/draft/side-projects/terminal/components/object-builder.md +++ /dev/null @@ -1,3 +0,0 @@ -![object_builder_base](/img/object_builder_base.png) - -![object_builder_editor](/img/object_builder_editor.png) diff --git a/draft/side-projects/terminal/components/pick-many.md b/draft/side-projects/terminal/components/pick-many.md deleted file mode 100644 index a565c07..0000000 --- a/draft/side-projects/terminal/components/pick-many.md +++ /dev/null @@ -1,8 +0,0 @@ -- PAGE_SIZE -- MENU_ENTRY_TYPE -- MENU_ENTRY_TYPE_OTHER -- MENU_ENTRY_SELECTED -- MENU_ENTRY_NORMAL -- MENU_ENTRY_OTHER - -![pick_many](/img/pick_many.png) diff --git a/draft/side-projects/terminal/editors/date.md b/draft/side-projects/terminal/editors/date.md deleted file mode 100644 index f908e21..0000000 --- a/draft/side-projects/terminal/editors/date.md +++ /dev/null @@ -1,7 +0,0 @@ -- PROMPT_QUESTION - -![date_fuzzy](/img/date_fuzzy.png) - -![date_fuzzy](/img/date_fuzzy.gif) - -![date_granular](/img/date_granular.png)![date_granular](/img/date_granular.gif) diff --git a/draft/side-projects/terminal/editors/number.md b/draft/side-projects/terminal/editors/number.md deleted file mode 100644 index 868b9a1..0000000 --- a/draft/side-projects/terminal/editors/number.md +++ /dev/null @@ -1,3 +0,0 @@ -- PROMPT_QUESTION -- STRING_EDITOR_EMPTY -- STRING_EDITOR_CONTENT diff --git a/draft/side-projects/terminal/editors/string.md b/draft/side-projects/terminal/editors/string.md deleted file mode 100644 index c6496f5..0000000 --- a/draft/side-projects/terminal/editors/string.md +++ /dev/null @@ -1,10 +0,0 @@ -- PROMPT_QUESTION -- DEFAULT_PROMPT_WIDTH -- STRING_EDITOR_EMPTY -- STRING_EDITOR_CONTENT - -![string](/img/string.gif) - -![string_content](/img/string_content.png) - -![string_empty](/img/string_empty.png) diff --git a/draft/side-projects/terminal/environment.md b/draft/side-projects/terminal/environment.md deleted file mode 100644 index e69de29..0000000 diff --git a/draft/side-projects/terminal/form.md b/draft/side-projects/terminal/form.md deleted file mode 100644 index e69de29..0000000 diff --git a/draft/side-projects/terminal/icons.md b/draft/side-projects/terminal/icons.md deleted file mode 100644 index 671f20a..0000000 --- a/draft/side-projects/terminal/icons.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Icons ---- diff --git a/draft/side-projects/terminal/index.md b/draft/side-projects/terminal/index.md deleted file mode 100644 index 27600bc..0000000 --- a/draft/side-projects/terminal/index.md +++ /dev/null @@ -1,79 +0,0 @@ ---- -title: Terminal ---- -## Description - -Welcome to `@digital-alchemy/terminal`! - -> **Warning**: -> These docs are very WIP, and will be improved over time - -## 💾 Install - -Add as a dependency, and add to your imports. Nice and easy - -```bash -npm i @digital-alchemy/terminal -``` - -> **Add to code** - -```typescript -import { LIB_TERMINAL } from "@digital-alchemy/terminal"; - -// application -const MY_APP = CreateApplication({ - libraries: [LIB_TERMINAL], - name: "home_automation", -}) - -// library -export const MY_LIBRARY = CreateLibrary({ - depends: [LIB_TERMINAL], - name: "special_logic", -}) -``` - -> 🎉 -> Listing as an import will automatically load into `LoadedModules` and make the library features available as `terminal` on `TServiceParams`. - -## Exports - -### Components - -| Name | Description | -| ----------------------------------------------------- | ----------- | -| [Acknowledge](/docs/side-projects/terminal/components/acknowledge) | | -| [Array Builder](/docs/side-projects/terminal/components/array-builder) | | -| [Confirm](/docs/side-projects/terminal/components/confirm) | | -| [Menu](/docs/side-projects/terminal/components/menu) | | -| [Object Builder](/docs/side-projects/terminal/components/object-builder) | | -| [Pick Many](/docs/side-projects/terminal/components/pick-many) | | - -### Editors - -| Name | Description | -| ---------------------------------- | ----------- | -| [Date](/docs/side-projects/terminal/editors/date) | | -| [Number](/docs/side-projects/terminal/editors/number) | | -| [String](/docs/side-projects/terminal/editors/string) | | - -### Support Code - -| Name | Description | -| ---------------------------------------------------- | ----------- | -| [Ansi Functions](/docs/side-projects/terminal/ansi-functions) | | -| [Application Manager](/docs/side-projects/terminal/application-manager) | | -| [Colors](/docs/side-projects/terminal/colors) | | -| [Comparison Tools](/docs/side-projects/terminal/comparison-tools) | | -| [Environment](/docs/side-projects/terminal/environment) | | -| [Form](/docs/side-projects/terminal/form) | | -| [Icons](/docs/side-projects/terminal/icons) | | -| [Internals](/docs/side-projects/terminal/internals) | | -| [Keyboard Manager](/docs/side-projects/terminal/keyboard-manager) | | -| [Keymap](/docs/side-projects/terminal/keymap) | | -| [Prompts](/docs/side-projects/terminal/prompts) | | -| [Registry](/docs/side-projects/terminal/registry) | | -| [Screen](/docs/side-projects/terminal/screen) | | -| [Table](/docs/side-projects/terminal/table) | | -| [Text Rendering](/docs/side-projects/terminal/text-rendering) | | diff --git a/draft/side-projects/terminal/internals.md b/draft/side-projects/terminal/internals.md deleted file mode 100644 index e69de29..0000000 diff --git a/draft/side-projects/terminal/keyboard-manager.md b/draft/side-projects/terminal/keyboard-manager.md deleted file mode 100644 index e69de29..0000000 diff --git a/draft/side-projects/terminal/keymap.md b/draft/side-projects/terminal/keymap.md deleted file mode 100644 index afb7039..0000000 --- a/draft/side-projects/terminal/keymap.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Keymap ---- diff --git a/draft/side-projects/terminal/prompts.md b/draft/side-projects/terminal/prompts.md deleted file mode 100644 index dedda73..0000000 --- a/draft/side-projects/terminal/prompts.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Prompts ---- diff --git a/draft/side-projects/terminal/registry.md b/draft/side-projects/terminal/registry.md deleted file mode 100644 index e69de29..0000000 diff --git a/draft/side-projects/terminal/screen.md b/draft/side-projects/terminal/screen.md deleted file mode 100644 index dbab70c..0000000 --- a/draft/side-projects/terminal/screen.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Screen ---- diff --git a/draft/side-projects/terminal/table.md b/draft/side-projects/terminal/table.md deleted file mode 100644 index 56702fd..0000000 --- a/draft/side-projects/terminal/table.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Table ---- diff --git a/draft/side-projects/terminal/text-rendering.md b/draft/side-projects/terminal/text-rendering.md deleted file mode 100644 index 624b216..0000000 --- a/draft/side-projects/terminal/text-rendering.md +++ /dev/null @@ -1,3 +0,0 @@ ---- -title: Text Rendering ---- diff --git a/draft/support/fastify/index.md b/draft/support/fastify/index.md deleted file mode 100644 index 63ef6a9..0000000 --- a/draft/support/fastify/index.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: 🌐 Fastify ---- - -## 🥡 Import Code - -Add as a dependency, and add to your imports. Nice and easy - -```bash -npm i @digital-alchemy/fastify-extension -``` - -> **Add to code** - -```typescript -import { LIB_FASTIFY } from "@digital-alchemy/fastify-extension"; - -// application -const MY_APP = CreateApplication({ - libraries: [LIB_FASTIFY], - name: "home_automation", -}) - -// library -export const MY_LIBRARY = CreateLibrary({ - depends: [LIB_FASTIFY], - name: "special_logic", -}) -``` - -## 🧲 Usage - -```typescript -export function Example({ fastify }: TServiceParams) { - fastify.routes((fastify: FastifyInstance) => { - fastify.post("/some/route", () => { /*...*/ }); - fastify.get("/another/thing", () => { /*...*/ }); - }); -} -``` diff --git a/package.json b/package.json index 6b51362..a792eb9 100644 --- a/package.json +++ b/package.json @@ -19,11 +19,13 @@ "@docusaurus/preset-classic": "^3.9.2", "@docusaurus/theme-mermaid": "^3.9.2", "@mdx-js/react": "^3.1.1", + "@monaco-editor/react": "4.7.0", + "@typescript/ata": "^0.9.8", "clsx": "^2.1.1", + "monaco-editor": "^0.55.1", "prism-react-renderer": "^2.4.1", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "react-player": "^3.3.3" + "react": "^19.2.4", + "react-dom": "^19.2.4" }, "devDependencies": { "@docusaurus/module-type-aliases": "^3.9.2", @@ -46,5 +48,5 @@ "engines": { "node": ">=18.0" }, - "packageManager": "yarn@4.10.3" + "packageManager": "yarn@4.12.0" } diff --git a/plugins/webpack-fallback.ts b/plugins/webpack-fallback.ts new file mode 100644 index 0000000..9cd192b --- /dev/null +++ b/plugins/webpack-fallback.ts @@ -0,0 +1,21 @@ +import type { Plugin } from "@docusaurus/types" + +/** + * Webpack resolve fallbacks for packages that require Node builtins (e.g. typescript via @typescript/ata). + */ +const webpackFallbackPlugin: Plugin = function () { + return { + name: "webpack-fallback", + configureWebpack() { + return { + resolve: { + fallback: { + module: false, + }, + }, + } + }, + } +} + +export default webpackFallbackPlugin diff --git a/src/components/EmbeddedEditor/index.tsx b/src/components/EmbeddedEditor/index.tsx new file mode 100644 index 0000000..55ea361 --- /dev/null +++ b/src/components/EmbeddedEditor/index.tsx @@ -0,0 +1,140 @@ +import { Editor } from "@monaco-editor/react" +import React from "react" + +import { + configureMonacoForEmbeddedEditor, + registerExampleFiles, +} from "./init" + +const EDITOR_HEIGHT_PX = 400 +const FILE_PICKER_WIDTH_PX = 160 +const FILE_BUTTON_PADDING_TOP_BOTTOM_REM = 0.5 +const FILE_BUTTON_PADDING_LEFT_RIGHT_REM = 0.75 +const FILE_BUTTON_FONT_SIZE_REM = 0.875 + +// Monotonically incrementing counter for stable per-instance virtual roots +// when no exampleId is provided. useRef ensures stability across re-renders. +let instanceCounter = 0 + +export type EmbeddedEditorProps = { + /** Source files to show in the editor. Keys are filenames, values are source. */ + files: Record + /** Which file to show first. Defaults to the first key in files. */ + defaultFile?: string + /** + * Stable identifier for this editor instance. Used to build the virtual + * filesystem root so multiple editors on the same page don't collide. + * Recommended for any page with more than one editor. + */ + exampleId?: string + /** Editor height in pixels. Defaults to 400. */ + height?: number +} + +const EmbeddedEditor: React.FC = ({ + files, + defaultFile, + exampleId, + height = EDITOR_HEIGHT_PX, +}) => { + const fileNames = Object.keys(files) + const initialFile = defaultFile ?? fileNames[0] ?? "" + const [selectedFile, setSelectedFile] = React.useState(initialFile) + + // Stable virtual root per instance — computed once on mount + const virtualRoot = React.useRef( + exampleId + ? `file:///example-${exampleId}` + : `file:///example-${++instanceCounter}`, + ).current + + // Track disposables so we can clean up extra libs on unmount, preventing + // declare module augmentations from leaking into other editor instances. + const extraLibsRef = React.useRef([]) + + React.useEffect(() => { + return () => { + for (const d of extraLibsRef.current) d.dispose() + extraLibsRef.current = [] + } + }, []) + + const handleBeforeMount = React.useCallback( + (monaco: { languages: typeof import("monaco-editor").languages }) => { + configureMonacoForEmbeddedEditor(monaco) + extraLibsRef.current = registerExampleFiles(monaco, virtualRoot, files) + }, + // virtualRoot is stable; files reference may change but content rarely does + [virtualRoot, files], + ) + + if (fileNames.length === 0) return null + + return ( +
+
+ +
+ + {fileNames.length > 1 && ( +
+ {fileNames.map(name => ( + + ))} +
+ )} +
+ ) +} + +export default EmbeddedEditor diff --git a/src/components/EmbeddedEditor/init.ts b/src/components/EmbeddedEditor/init.ts new file mode 100644 index 0000000..45a9034 --- /dev/null +++ b/src/components/EmbeddedEditor/init.ts @@ -0,0 +1,89 @@ +import { setupTypeAcquisition } from "@typescript/ata" +import * as ts from "typescript" +import type * as Monaco from "monaco-editor" + +let initDone = false +let ataInstance: ((source: string) => void) | undefined + +/** + * One-time setup: Monaco compiler options + ATA with core types pre-fetched. + * Safe to call from multiple editor instances — guarded by initDone. + */ +export function configureMonacoForEmbeddedEditor( + monacoInstance: typeof Monaco, +): void { + if (initDone) return + initDone = true + + monacoInstance.languages.typescript.typescriptDefaults.setCompilerOptions({ + target: monacoInstance.languages.typescript.ScriptTarget.ES2020, + module: monacoInstance.languages.typescript.ModuleKind.ESNext, + moduleResolution: + monacoInstance.languages.typescript.ModuleResolutionKind.NodeJs, + allowImportingTsExtensions: true, + allowNonTsExtensions: true, + allowSyntheticDefaultImports: true, + esModuleInterop: true, + skipLibCheck: true, + moduleDetection: 3, + }) + + ataInstance = setupTypeAcquisition({ + projectName: "EmbeddedEditor", + typescript: ts, + logger: { log: () => {} }, + delegate: { + receivedFile: (code: string, path: string) => { + monacoInstance.languages.typescript.typescriptDefaults.addExtraLib( + code, + path.startsWith("file://") ? path : `file://${path}`, + ) + }, + }, + fetcher: async url => fetch(url), + }) + + // Pre-fetch core types so IntelliSense is ready on first load + ataInstance( + `import { CreateApplication, type TServiceParams } from "@digital-alchemy/core"`, + ) +} + +/** + * Register an example's virtual files in Monaco and trigger ATA for any + * packages they import. Each editor instance gets its own virtualRoot so + * multiple editors on the same page don't share a virtual filesystem. + * + * Returns an array of disposables — call .dispose() on each when the editor + * unmounts to remove the extra libs and prevent declare module augmentations + * from one example contaminating the TypeScript context of another. + * + * @param monacoInstance - The Monaco instance from beforeMount + * @param virtualRoot - Unique base path, e.g. "file:///example-quickstart" + * @param files - Map of filename → source content + */ +export function registerExampleFiles( + monacoInstance: typeof Monaco, + virtualRoot: string, + files: Record, +): Monaco.IDisposable[] { + const disposables: Monaco.IDisposable[] = [] + + for (const [name, content] of Object.entries(files)) { + disposables.push( + monacoInstance.languages.typescript.typescriptDefaults.addExtraLib( + content, + `${virtualRoot}/${name}`, + ), + ) + } + + // Trigger ATA for any packages imported by this example's files + if (ataInstance) { + for (const content of Object.values(files)) { + ataInstance(content) + } + } + + return disposables +} diff --git a/src/examples/core/.archive/01-getting-started/first-app.ts b/src/examples/core/.archive/01-getting-started/first-app.ts new file mode 100644 index 0000000..7247f73 --- /dev/null +++ b/src/examples/core/.archive/01-getting-started/first-app.ts @@ -0,0 +1,38 @@ +/** + * Example: First Digital Alchemy application + * Used on: docs/core/01-getting-started/quickstart.mdx + */ +export const files: Record = { + "application.mts": `import { CreateApplication } from "@digital-alchemy/core"; +import { HelloService } from "./hello.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + services: { + hello: HelloService, + }, +}); + +// Extend the LoadedModules interface so TypeScript knows +// what's available on TServiceParams +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +`, + "hello.service.mts": `import type { TServiceParams } from "@digital-alchemy/core"; + +export function HelloService({ logger, lifecycle }: TServiceParams) { + lifecycle.onReady(() => { + logger.info("Hello, Digital Alchemy!"); + }); +} +`, + "main.mts": `import { MY_APP } from "./application.mts"; + +await MY_APP.bootstrap(); +`, +} + +export const defaultFile = "application.mts" diff --git a/src/examples/core/get-started/first-app.ts b/src/examples/core/get-started/first-app.ts new file mode 100644 index 0000000..2a218ae --- /dev/null +++ b/src/examples/core/get-started/first-app.ts @@ -0,0 +1,38 @@ +/** + * Example: First Digital Alchemy application + * Used on: docs/core/get-started/quickstart.mdx + */ +export const files: Record = { + "application.mts": `import { CreateApplication } from "@digital-alchemy/core"; +import { HelloService } from "./hello.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + services: { + hello: HelloService, + }, +}); + +// Extend the LoadedModules interface so TypeScript knows +// what's available on TServiceParams +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +`, + "hello.service.mts": `import type { TServiceParams } from "@digital-alchemy/core"; + +export function HelloService({ logger, lifecycle }: TServiceParams) { + lifecycle.onReady(() => { + logger.info("Hello, Digital Alchemy!"); + }); +} +`, + "main.mts": `import { MY_APP } from "./application.mts"; + +await MY_APP.bootstrap(); +`, +} + +export const defaultFile = "application.mts" diff --git a/src/examples/core/reference/config-types.ts b/src/examples/core/reference/config-types.ts new file mode 100644 index 0000000..dc63fe3 --- /dev/null +++ b/src/examples/core/reference/config-types.ts @@ -0,0 +1,99 @@ +/** + * Example: All configuration types + * Used on: docs/core/reference/config/types.mdx + */ +export const files: Record = { + "application.mts": `import { CreateApplication } from "@digital-alchemy/core"; +import { AppService } from "./app.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + configuration: { + // string — plain string value + API_URL: { + type: "string", + description: "Base URL for the upstream API", + required: true, + }, + + // string with enum — TypeScript narrows to a union literal type + ENVIRONMENT: { + type: "string", + enum: ["local", "staging", "production"] as const, + default: "local", + }, + + // number — parsed from string in env ("3000" → 3000) + PORT: { + type: "number", + default: 3000, + }, + + // boolean — "true"/"1"/"y" → true; "false"/"0"/"n" → false + DEBUG_MODE: { + type: "boolean", + default: false, + }, + + // string[] — comma-separated in env: "a,b,c" → ["a","b","c"] + ALLOWED_ORIGINS: { + type: "string[]", + default: ["http://localhost:3000"], + }, + + // record — arbitrary key/value pairs; JSON string in env + FEATURE_FLAGS: { + type: "record", + default: {}, + }, + }, + services: { + app: AppService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +`, + "app.service.mts": `import type { TServiceParams } from "@digital-alchemy/core"; + +export function AppService({ config, lifecycle, logger }: TServiceParams) { + lifecycle.onPostConfig(() => { + // Hover over each config value to see its TypeScript type + + const apiUrl: string = config.my_app.API_URL; + + // enum narrows to "local" | "staging" | "production" + const env: "local" | "staging" | "production" = config.my_app.ENVIRONMENT; + + const port: number = config.my_app.PORT; + + const debug: boolean = config.my_app.DEBUG_MODE; + + const origins: string[] = config.my_app.ALLOWED_ORIGINS; + + const flags: Record = config.my_app.FEATURE_FLAGS; + + logger.info({ apiUrl, env, port, debug, origins, flags }, "config loaded"); + }); +} +`, + "main.mts": `import { MY_APP } from "./application.mts"; + +await MY_APP.bootstrap({ + configuration: { + my_app: { + API_URL: "https://api.example.com", + ENVIRONMENT: "staging", + DEBUG_MODE: true, + ALLOWED_ORIGINS: ["https://app.example.com"], + }, + }, +}); +`, +} + +export const defaultFile = "application.mts" diff --git a/src/examples/core/reference/service-params.ts b/src/examples/core/reference/service-params.ts new file mode 100644 index 0000000..f05eba9 --- /dev/null +++ b/src/examples/core/reference/service-params.ts @@ -0,0 +1,107 @@ +/** + * Example: TServiceParams full reference + * Used on: docs/core/reference/services/service-params.mdx + */ +export const files: Record = { + "application.mts": `import { CreateApplication } from "@digital-alchemy/core"; +import { ExplorerService } from "./explorer.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + configuration: { + API_URL: { type: "string", default: "https://api.example.com" }, + }, + services: { + explorer: ExplorerService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +`, + "explorer.service.mts": `import type { TServiceParams } from "@digital-alchemy/core"; + +export function ExplorerService({ + // --- Core params --- + logger, // GetLogger — scoped to "my_app:explorer" + lifecycle, // TLifecycleBase — register stage callbacks + config, // TInjectedConfig — typed config per module + scheduler, // TScheduler — cron, interval, timeout + event, // EventEmitter — app-wide event bus + als, // AlsExtension — async local storage + context, // TContext — "my_app:explorer" (string brand) + internal, // InternalDefinition — utils, boot info + params, // TServiceParams — reference to self + + // --- Module services (available after LoadedModules declaration) --- + my_app, // your own app's other services +}: TServiceParams) { + + // logger: scoped, pre-bound to context + logger.info("wiring explorer"); + logger.debug({ context }, "context string"); + + // config: typed, available after onPostConfig + lifecycle.onPostConfig(() => { + const url: string = config.my_app.API_URL; + logger.info({ url }, "config ready"); + }); + + // scheduler: returns RemoveCallback; auto-stopped at PreShutdown + const stopTimer = scheduler.setTimeout(() => { + logger.info("5 seconds elapsed"); + }, "5s"); + + // event: Node.js EventEmitter, shared across all services + event.on("my-event", (data: unknown) => { + logger.info({ data }, "received event"); + }); + + // als: async local storage + lifecycle.onBootstrap(() => { + als.run({ logs: {} }, () => { + logger.info("inside ALS context"); + }); + }); + + // internal.utils: utility methods + const title = internal.utils.titleCase("my_service_name"); // "My Service Name" + const ms = internal.utils.getIntervalMs("5m"); // 300000 + + // internal.boot: introspect the running application + lifecycle.onReady(() => { + const modules = [...internal.boot.loadedModules.keys()]; + logger.info({ modules }, "loaded modules"); + }); + + // internal.removeFn: create a dual-callable RemoveCallback + const cleanup = internal.removeFn(() => { + logger.info("cleanup called"); + }); + // cleanup() and cleanup.remove() both work + + // internal.safeExec: run a callback, catch and log any errors + lifecycle.onBootstrap(async () => { + await internal.safeExec({ + context, + exec: async () => { + // errors here are logged, not thrown + }, + }); + }); + + // params: self-reference (useful for passing the full params object deeper) + // params === the entire TServiceParams object + + lifecycle.onShutdownStart(() => { + stopTimer(); // or stopTimer.remove() + logger.info("shutting down"); + }); +} +`, +} + +export const defaultFile = "explorer.service.mts" diff --git a/src/examples/core/tutorials/first-application.ts b/src/examples/core/tutorials/first-application.ts new file mode 100644 index 0000000..dbab104 --- /dev/null +++ b/src/examples/core/tutorials/first-application.ts @@ -0,0 +1,58 @@ +/** + * Example: First application with two services + * Used on: docs/core/tutorials/01-first-application.mdx + */ +export const files: Record = { + "application.mts": `import { CreateApplication } from "@digital-alchemy/core"; +import { GreeterService } from "./greeter.service.mts"; +import { NameService } from "./name.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + services: { + greeter: GreeterService, + names: NameService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +`, + "name.service.mts": `import type { TServiceParams } from "@digital-alchemy/core"; + +export function NameService({ logger }: TServiceParams) { + const names = new Set(["world"]); + + return { + add: (name: string) => { + names.add(name); + logger.debug({ name }, "added name"); + }, + list: () => [...names], + }; +} +`, + "greeter.service.mts": `import type { TServiceParams } from "@digital-alchemy/core"; + +export function GreeterService({ logger, lifecycle, my_app }: TServiceParams) { + lifecycle.onReady(() => { + // my_app.names is fully typed — TypeScript infers NameService's return type + for (const name of my_app.names.list()) { + logger.info(\`Hello, \${name}!\`); + } + }); +} +`, + "main.mts": `import { MY_APP } from "./application.mts"; + +// Add a name before bootstrap so it's in the set when onReady fires +MY_APP.bootstrap({ + configuration: { boilerplate: { LOG_LEVEL: "debug" } }, +}); +`, +} + +export const defaultFile = "application.mts" diff --git a/src/examples/core/tutorials/testing-basics.ts b/src/examples/core/tutorials/testing-basics.ts new file mode 100644 index 0000000..39a82a0 --- /dev/null +++ b/src/examples/core/tutorials/testing-basics.ts @@ -0,0 +1,70 @@ +/** + * Example: Testing basics with TestRunner + * Used on: docs/core/tutorials/07-testing-basics.mdx + */ +export const files: Record = { + "counter.service.mts": `import type { TServiceParams } from "@digital-alchemy/core"; + +export function CounterService({ }: TServiceParams) { + let count = 0; + + return { + increment: () => { count++; }, + reset: () => { count = 0; }, + get value() { return count; }, + }; +} +`, + "application.mts": `import { CreateApplication } from "@digital-alchemy/core"; +import { CounterService } from "./counter.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + services: { + counter: CounterService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +`, + "counter.test.mts": `import { TestRunner } from "@digital-alchemy/core"; +import { MY_APP } from "./application.mts"; + +describe("CounterService", () => { + let teardown: () => Promise; + + afterEach(async () => { + await teardown?.(); + }); + + it("increments the count", async () => { + await TestRunner(MY_APP) + .run(async ({ my_app, teardown: td }) => { + teardown = td; + + expect(my_app.counter.value).toBe(0); + my_app.counter.increment(); + my_app.counter.increment(); + expect(my_app.counter.value).toBe(2); + }); + }); + + it("resets the count", async () => { + await TestRunner(MY_APP) + .run(async ({ my_app, teardown: td }) => { + teardown = td; + + my_app.counter.increment(); + my_app.counter.reset(); + expect(my_app.counter.value).toBe(0); + }); + }); +}); +`, +} + +export const defaultFile = "counter.test.mts" diff --git a/src/examples/core/tutorials/typed-configuration.ts b/src/examples/core/tutorials/typed-configuration.ts new file mode 100644 index 0000000..31fe15c --- /dev/null +++ b/src/examples/core/tutorials/typed-configuration.ts @@ -0,0 +1,82 @@ +/** + * Example: Typed configuration + * Used on: docs/core/tutorials/04-typed-configuration.mdx + */ +export const files: Record = { + "application.mts": `import { CreateApplication } from "@digital-alchemy/core"; +import { ApiService } from "./api.service.mts"; + +export const MY_APP = CreateApplication({ + name: "my_app", + configuration: { + API_URL: { + type: "string", + description: "Base URL for the upstream API", + required: true, + }, + PORT: { + type: "number", + description: "HTTP port to listen on", + default: 3000, + }, + DEBUG: { + type: "boolean", + default: false, + }, + ALLOWED_ORIGINS: { + type: "string[]", + default: ["http://localhost:3000"], + }, + ENVIRONMENT: { + type: "string", + enum: ["local", "staging", "production"] as const, + default: "local", + }, + }, + services: { + api: ApiService, + }, +}); + +declare module "@digital-alchemy/core" { + export interface LoadedModules { + my_app: typeof MY_APP; + } +} +`, + "api.service.mts": `import type { TServiceParams } from "@digital-alchemy/core"; + +export function ApiService({ logger, lifecycle, config }: TServiceParams) { + lifecycle.onPostConfig(() => { + // Hover over config.my_app to see the fully typed config object + // config.my_app.PORT → number + // config.my_app.DEBUG → boolean + // config.my_app.ENVIRONMENT → "local" | "staging" | "production" + logger.info({ + port: config.my_app.PORT, + env: config.my_app.ENVIRONMENT, + debug: config.my_app.DEBUG, + }, "config loaded"); + }); + + lifecycle.onBootstrap(async () => { + // API_URL is required — bootstrap would have failed if it wasn't set + logger.info({ url: config.my_app.API_URL }, "connecting to upstream"); + }); +} +`, + "main.mts": `import { MY_APP } from "./application.mts"; + +await MY_APP.bootstrap({ + configuration: { + my_app: { + API_URL: "https://api.example.com", + PORT: 8080, + ENVIRONMENT: "staging", + }, + }, +}); +`, +} + +export const defaultFile = "application.mts" diff --git a/src/pages/index.md b/src/pages/index.md index 6153318..3de88d6 100644 --- a/src/pages/index.md +++ b/src/pages/index.md @@ -13,7 +13,7 @@ The project prioritizes modern ESModule based code, minimal dependencies, and su ## 🧩 [Core Framework](/docs/core) The base tooling used to power the everything else. -Build and wire [testable](/docs/core/testing/) services using a flexible module loader and included configuration, logging, and lifecycle management tools. +Build and wire [testable](/docs/core/reference/testing/test-runner) services using a flexible module loader and included configuration, logging, and lifecycle management tools. > [![version](https://img.shields.io/github/package-json/version/Digital-Alchemy-TS/core)](https://www.npmjs.com/package/@digital-alchemy/core) > [![lastupdate](https://img.shields.io/github/last-commit/Digital-Alchemy-TS/core)](https://github.com/Digital-Alchemy-TS/core) diff --git a/static/img/180_cable.jpg b/static/img/180_cable.jpg deleted file mode 100644 index 3b1186c..0000000 Binary files a/static/img/180_cable.jpg and /dev/null differ diff --git a/static/img/acknowledge.png b/static/img/acknowledge.png deleted file mode 100644 index 6e2f925..0000000 Binary files a/static/img/acknowledge.png and /dev/null differ diff --git a/static/img/aluminum_join.jpg b/static/img/aluminum_join.jpg deleted file mode 100644 index f3335b3..0000000 Binary files a/static/img/aluminum_join.jpg and /dev/null differ diff --git a/static/img/array_builder_base.png b/static/img/array_builder_base.png deleted file mode 100644 index ad25011..0000000 Binary files a/static/img/array_builder_base.png and /dev/null differ diff --git a/static/img/array_builder_edit.png b/static/img/array_builder_edit.png deleted file mode 100644 index a7f830c..0000000 Binary files a/static/img/array_builder_edit.png and /dev/null differ diff --git a/static/img/backup_drone.png b/static/img/backup_drone.png deleted file mode 100644 index 9612634..0000000 Binary files a/static/img/backup_drone.png and /dev/null differ diff --git a/static/img/cable_connector.jpg b/static/img/cable_connector.jpg deleted file mode 100644 index 59a5d77..0000000 Binary files a/static/img/cable_connector.jpg and /dev/null differ diff --git a/static/img/case.jpg b/static/img/case.jpg deleted file mode 100644 index 8fc2f95..0000000 Binary files a/static/img/case.jpg and /dev/null differ diff --git a/static/img/confirm.png b/static/img/confirm.png deleted file mode 100644 index 8d0336f..0000000 Binary files a/static/img/confirm.png and /dev/null differ diff --git a/static/img/construction.jpg b/static/img/construction.jpg deleted file mode 100644 index a650c33..0000000 Binary files a/static/img/construction.jpg and /dev/null differ diff --git a/static/img/corner_bracket.jpg b/static/img/corner_bracket.jpg deleted file mode 100644 index 66e4711..0000000 Binary files a/static/img/corner_bracket.jpg and /dev/null differ diff --git a/static/img/countersunk_magnet.jpg b/static/img/countersunk_magnet.jpg deleted file mode 100644 index dc7d3b2..0000000 Binary files a/static/img/countersunk_magnet.jpg and /dev/null differ diff --git a/static/img/data_wiring.jpg b/static/img/data_wiring.jpg deleted file mode 100644 index b3df65a..0000000 Binary files a/static/img/data_wiring.jpg and /dev/null differ diff --git a/static/img/date_fuzzy.gif b/static/img/date_fuzzy.gif deleted file mode 100644 index 74337ac..0000000 Binary files a/static/img/date_fuzzy.gif and /dev/null differ diff --git a/static/img/date_fuzzy.png b/static/img/date_fuzzy.png deleted file mode 100644 index 066514f..0000000 Binary files a/static/img/date_fuzzy.png and /dev/null differ diff --git a/static/img/date_granular.gif b/static/img/date_granular.gif deleted file mode 100644 index 5c1d05e..0000000 Binary files a/static/img/date_granular.gif and /dev/null differ diff --git a/static/img/date_granular.png b/static/img/date_granular.png deleted file mode 100644 index bf030b3..0000000 Binary files a/static/img/date_granular.png and /dev/null differ diff --git a/static/img/display_assembled.jpg b/static/img/display_assembled.jpg deleted file mode 100644 index f427cf0..0000000 Binary files a/static/img/display_assembled.jpg and /dev/null differ diff --git a/static/img/display_parts.jpg b/static/img/display_parts.jpg deleted file mode 100644 index 65819e7..0000000 Binary files a/static/img/display_parts.jpg and /dev/null differ diff --git a/static/img/dual_aluminum.jpg b/static/img/dual_aluminum.jpg deleted file mode 100644 index 0cb19fb..0000000 Binary files a/static/img/dual_aluminum.jpg and /dev/null differ diff --git a/static/img/end_cap.jpg b/static/img/end_cap.jpg deleted file mode 100644 index 5568542..0000000 Binary files a/static/img/end_cap.jpg and /dev/null differ diff --git a/static/img/fan_heat_sync.jpg b/static/img/fan_heat_sync.jpg deleted file mode 100644 index d9a067a..0000000 Binary files a/static/img/fan_heat_sync.jpg and /dev/null differ diff --git a/static/img/frame_mount.jpg b/static/img/frame_mount.jpg deleted file mode 100644 index 65012f0..0000000 Binary files a/static/img/frame_mount.jpg and /dev/null differ diff --git a/static/img/front.jpg b/static/img/front.jpg deleted file mode 100644 index 7466ee9..0000000 Binary files a/static/img/front.jpg and /dev/null differ diff --git a/static/img/hacs_add.png b/static/img/hacs_add.png deleted file mode 100644 index e4e3192..0000000 Binary files a/static/img/hacs_add.png and /dev/null differ diff --git a/static/img/m3_screw.jpg b/static/img/m3_screw.jpg deleted file mode 100644 index 9873f64..0000000 Binary files a/static/img/m3_screw.jpg and /dev/null differ diff --git a/static/img/m3_standoff.jpg b/static/img/m3_standoff.jpg deleted file mode 100644 index 5e61481..0000000 Binary files a/static/img/m3_standoff.jpg and /dev/null differ diff --git a/static/img/m3_t_nut.jpg b/static/img/m3_t_nut.jpg deleted file mode 100644 index 3fc6552..0000000 Binary files a/static/img/m3_t_nut.jpg and /dev/null differ diff --git a/static/img/m3_washer.jpg b/static/img/m3_washer.jpg deleted file mode 100644 index 379603c..0000000 Binary files a/static/img/m3_washer.jpg and /dev/null differ diff --git a/static/img/magnetic_pi_mount.jpg b/static/img/magnetic_pi_mount.jpg deleted file mode 100644 index 130f32a..0000000 Binary files a/static/img/magnetic_pi_mount.jpg and /dev/null differ diff --git a/static/img/matrix_bonnet.jpg b/static/img/matrix_bonnet.jpg deleted file mode 100644 index f376c3b..0000000 Binary files a/static/img/matrix_bonnet.jpg and /dev/null differ diff --git a/static/img/menu.png b/static/img/menu.png deleted file mode 100644 index b0f9df9..0000000 Binary files a/static/img/menu.png and /dev/null differ diff --git a/static/img/npm_scripts.png b/static/img/npm_scripts.png deleted file mode 100644 index c3a8092..0000000 Binary files a/static/img/npm_scripts.png and /dev/null differ diff --git a/static/img/object_builder_base.png b/static/img/object_builder_base.png deleted file mode 100644 index 841e097..0000000 Binary files a/static/img/object_builder_base.png and /dev/null differ diff --git a/static/img/object_builder_editor.png b/static/img/object_builder_editor.png deleted file mode 100644 index ab38768..0000000 Binary files a/static/img/object_builder_editor.png and /dev/null differ diff --git a/static/img/panel_mount.jpg b/static/img/panel_mount.jpg deleted file mode 100644 index 1f575c5..0000000 Binary files a/static/img/panel_mount.jpg and /dev/null differ diff --git a/static/img/party_parrot.gif b/static/img/party_parrot.gif deleted file mode 100644 index ef11092..0000000 Binary files a/static/img/party_parrot.gif and /dev/null differ diff --git a/static/img/pick_many.png b/static/img/pick_many.png deleted file mode 100644 index 3f3285a..0000000 Binary files a/static/img/pick_many.png and /dev/null differ diff --git a/static/img/power_supply.jpg b/static/img/power_supply.jpg deleted file mode 100644 index 563ac0b..0000000 Binary files a/static/img/power_supply.jpg and /dev/null differ diff --git a/static/img/power_wiring.jpg b/static/img/power_wiring.jpg deleted file mode 100644 index ee11490..0000000 Binary files a/static/img/power_wiring.jpg and /dev/null differ diff --git a/static/img/prototype.jpg b/static/img/prototype.jpg deleted file mode 100644 index dcd0c16..0000000 Binary files a/static/img/prototype.jpg and /dev/null differ diff --git a/static/img/rgb_matrix.jpg b/static/img/rgb_matrix.jpg deleted file mode 100644 index a7d32ba..0000000 Binary files a/static/img/rgb_matrix.jpg and /dev/null differ diff --git a/static/img/ribbon_cable.jpg b/static/img/ribbon_cable.jpg deleted file mode 100644 index 35fa06c..0000000 Binary files a/static/img/ribbon_cable.jpg and /dev/null differ diff --git a/static/img/ribbon_cable_long.jpg b/static/img/ribbon_cable_long.jpg deleted file mode 100644 index eb12937..0000000 Binary files a/static/img/ribbon_cable_long.jpg and /dev/null differ diff --git a/static/img/ribbon_connector.jpg b/static/img/ribbon_connector.jpg deleted file mode 100644 index 7879991..0000000 Binary files a/static/img/ribbon_connector.jpg and /dev/null differ diff --git a/static/img/secured.jpg b/static/img/secured.jpg deleted file mode 100644 index e4cecad..0000000 Binary files a/static/img/secured.jpg and /dev/null differ diff --git a/static/img/side.jpg b/static/img/side.jpg deleted file mode 100644 index f3a3913..0000000 Binary files a/static/img/side.jpg and /dev/null differ diff --git a/static/img/single_aluminum.jpg b/static/img/single_aluminum.jpg deleted file mode 100644 index 4e3e151..0000000 Binary files a/static/img/single_aluminum.jpg and /dev/null differ diff --git a/static/img/slot_cover.jpg b/static/img/slot_cover.jpg deleted file mode 100644 index 3e4371c..0000000 Binary files a/static/img/slot_cover.jpg and /dev/null differ diff --git a/static/img/speaker.jpg b/static/img/speaker.jpg deleted file mode 100644 index fbcd977..0000000 Binary files a/static/img/speaker.jpg and /dev/null differ diff --git a/static/img/string.gif b/static/img/string.gif deleted file mode 100644 index ffd7316..0000000 Binary files a/static/img/string.gif and /dev/null differ diff --git a/static/img/string_content.png b/static/img/string_content.png deleted file mode 100644 index ad3ef5a..0000000 Binary files a/static/img/string_content.png and /dev/null differ diff --git a/static/img/string_empty.png b/static/img/string_empty.png deleted file mode 100644 index a68c22a..0000000 Binary files a/static/img/string_empty.png and /dev/null differ diff --git a/static/img/willow.jpg b/static/img/willow.jpg deleted file mode 100644 index 9b4a7f8..0000000 Binary files a/static/img/willow.jpg and /dev/null differ diff --git a/static/img/with_supply.jpg b/static/img/with_supply.jpg deleted file mode 100644 index 3b04706..0000000 Binary files a/static/img/with_supply.jpg and /dev/null differ diff --git a/yarn.lock b/yarn.lock index e64248f..64b8117 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,3004 +5,1523 @@ __metadata: version: 8 cacheKey: 10 -"@ai-sdk/gateway@npm:2.0.0": - version: 2.0.0 - resolution: "@ai-sdk/gateway@npm:2.0.0" - dependencies: - "@ai-sdk/provider": "npm:2.0.0" - "@ai-sdk/provider-utils": "npm:3.0.12" - "@vercel/oidc": "npm:3.0.3" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10/ff20ec2e075f5c29d3325c45b64e66b811c54a06f99d91e2112fe05ed9ab5cb1f8e760d9bc672734399d8bce0792d8425f284a24b7e3f311008f978e182fe97f - languageName: node - linkType: hard - -"@ai-sdk/provider-utils@npm:3.0.12": - version: 3.0.12 - resolution: "@ai-sdk/provider-utils@npm:3.0.12" - dependencies: - "@ai-sdk/provider": "npm:2.0.0" - "@standard-schema/spec": "npm:^1.0.0" - eventsource-parser: "npm:^3.0.5" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10/d637641b5d7724baf17105c25b4c091d8f0fae73b760d64a73c210bdc0b3fb87c237087237ad873beba5ca787d19ddc338622724d1ef9f6366ab55feece25da7 - languageName: node - linkType: hard - -"@ai-sdk/provider@npm:2.0.0": - version: 2.0.0 - resolution: "@ai-sdk/provider@npm:2.0.0" - dependencies: - json-schema: "npm:^0.4.0" - checksum: 10/e6d5460f0c52e64033ccc5d20787ab9ff5251646e6263daa76a006367fda8ad527dadc959110113c42796d293d4e669c3ae911062086574cd46f0707357dedb5 - languageName: node - linkType: hard - -"@ai-sdk/react@npm:^2.0.30": - version: 2.0.76 - resolution: "@ai-sdk/react@npm:2.0.76" - dependencies: - "@ai-sdk/provider-utils": "npm:3.0.12" - ai: "npm:5.0.76" - swr: "npm:^2.2.5" - throttleit: "npm:2.1.0" - peerDependencies: - react: ^18 || ^19 || ^19.0.0-rc - zod: ^3.25.76 || ^4.1.8 - peerDependenciesMeta: - zod: - optional: true - checksum: 10/82e5c74ce619d53e050886402e8880a38f8d51760d271a54ed7e0f275779e57f9642a6d56122c05c5690862e8f2774a75a63f8060f4b2bbc9dd1faedb3a24f82 - languageName: node - linkType: hard - -"@algolia/abtesting@npm:1.6.1": - version: 1.6.1 - resolution: "@algolia/abtesting@npm:1.6.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/9aa4351996722785db61c747cecf2a9539c2d5d9b69b194e954cc5b88363e2a589b8a7b303b66dffb2100f9211559f07c61c9fcb1662e6c87ddd947d287e816b - languageName: node - linkType: hard - -"@algolia/autocomplete-core@npm:1.19.2": - version: 1.19.2 - resolution: "@algolia/autocomplete-core@npm:1.19.2" - dependencies: - "@algolia/autocomplete-plugin-algolia-insights": "npm:1.19.2" - "@algolia/autocomplete-shared": "npm:1.19.2" - checksum: 10/afe9a1686313e8c1f26fccc88a32fce84d43ae3c42c64e02fb25661a91e2af443a1720cc24970ed66df56c742fd83cfcee2ac8690e8f77bb670edee35a99e84b - languageName: node - linkType: hard - -"@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2": - version: 1.19.2 - resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2" - dependencies: - "@algolia/autocomplete-shared": "npm:1.19.2" - peerDependencies: - search-insights: ">= 1 < 3" - checksum: 10/b9135d0be51b9f9c5370c9df7567c0adb34ffe1cffa9c73d847d191b2bafee010a005edf4a7105391852151bdf8dbda010a8b6bd66cea61a0a2e29366dc1b3d2 - languageName: node - linkType: hard - -"@algolia/autocomplete-shared@npm:1.19.2": - version: 1.19.2 - resolution: "@algolia/autocomplete-shared@npm:1.19.2" - peerDependencies: - "@algolia/client-search": ">= 4.9.1 < 6" - algoliasearch: ">= 4.9.1 < 6" - checksum: 10/442223a1e09d75f103441469c7174e09c4c129b4005b6492771c6145b8bcc9a1df4d590acfdd8af009b802cb3be0aade9fabbaa4b21e9ec3753947ad17b988aa - languageName: node - linkType: hard - -"@algolia/client-abtesting@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/client-abtesting@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/cb0e04108a093e8f70f88c644719083801889fd26cbbfd2067eb5318130c193588730708d1f5d55c4d5111d3ecd742884fa5559f80bfe025fc52088aebf1476d - languageName: node - linkType: hard - -"@algolia/client-analytics@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/client-analytics@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/53a7b81f245d9c1151156648699ee0d6d6fcde2f3b2afd79ef3928dcee38179c0ed204a842b982c217afdadccff3d7a9f979b725270c78c0d2a04a1ff33b8862 - languageName: node - linkType: hard - -"@algolia/client-common@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/client-common@npm:5.40.1" - checksum: 10/e101021b3da9decfbd29c3eada853c590ba798b8867a13d1fcf49ae9ef139f14c4b74cf67252356d660beac4a23faeba4bd0fd471b9d05b461c1cef8ef8e6349 - languageName: node - linkType: hard - -"@algolia/client-insights@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/client-insights@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/0235c56d1ec14bc69146b563dc20e6c461eb0219debbd17270c5fd30d167246a721278e07d091cf18c741abafbde82b0fb6dae46a21bf3212cccdac6c2f446e0 - languageName: node - linkType: hard - -"@algolia/client-personalization@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/client-personalization@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/2e32b89044f13acbd8042cadbc0a67ab441b8c69abe38541ce7ec8842ce43f67e464a1b896604ae34591459f873f192f5816bb943cd8dc7d6bca288983002eb3 - languageName: node - linkType: hard - -"@algolia/client-query-suggestions@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/client-query-suggestions@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/309126bdcc17bb998bc8b0122a485a6e4e0a71c9bad1416828c0545959357bd593e2dad9beb941e802509b93d3d5fc7a6d75168383de9efbb7920a4918837a2d - languageName: node - linkType: hard - -"@algolia/client-search@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/client-search@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/05373a6c98c7ba096b9e743953e222e5b829fd271ee6cc430d1ea3bf4153f04895c895533e7281e666a60756411306ec177e91e031dc581a6daed2d984e87d5d - languageName: node - linkType: hard - -"@algolia/events@npm:^4.0.1": - version: 4.0.1 - resolution: "@algolia/events@npm:4.0.1" - checksum: 10/98d239899a9dac9398f751221369523f2d7706fc4b3bc3167b66a101773d57380fc52733467c0a12be36bce969577fd4010d6ccbd08c410f9c7adc088dadf4c6 - languageName: node - linkType: hard - -"@algolia/ingestion@npm:1.40.1": - version: 1.40.1 - resolution: "@algolia/ingestion@npm:1.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/f10d35041019399903d0cda402e5acd10f01add7af9e77653cf80f01670c10d7413df6e886298b8c66ca886a4a3d38ba38c02bf5dfc8a13296e0be6f1ec5b7f6 - languageName: node - linkType: hard - -"@algolia/monitoring@npm:1.40.1": - version: 1.40.1 - resolution: "@algolia/monitoring@npm:1.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/71c94942c29dce38f12a8ecd0a180936f011bfac9b770150c04ba9429b2601f65374394d203d012e5a8a2cc034ac827bca008127a653534084753194e08a551b - languageName: node - linkType: hard - -"@algolia/recommend@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/recommend@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/fcb5e0a5de81f18e6ed02abb708f5b432ab3595e0ffb07b7b8e5bd6bdcf6f7bd5e187dc8f966a153f8bb19fdd09410d99d3c1a5e903ba905b8e3c23e607d60bb - languageName: node - linkType: hard - -"@algolia/requester-browser-xhr@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/requester-browser-xhr@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - checksum: 10/dac2e0cf0cbedf2d5a196dc592c2de5779f015d486a60b81e3bffc1534fed273da30a89bcbab6e5951f1514103b35b4e0c3633c11e23c5fa9daf27f4511bd033 - languageName: node - linkType: hard - -"@algolia/requester-fetch@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/requester-fetch@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - checksum: 10/7884ee79a8583021b3c79655bad5a2770cf5e46803eac367efd1c856a3c2c045b3d826129c62d4499f341ceafb402f910b8065df054570b1b52af7f1a3854a21 - languageName: node - linkType: hard - -"@algolia/requester-node-http@npm:5.40.1": - version: 5.40.1 - resolution: "@algolia/requester-node-http@npm:5.40.1" - dependencies: - "@algolia/client-common": "npm:5.40.1" - checksum: 10/7bc88e087c6a2a0681749d251cd0b80e8545fcd8b41dae7477eb6b9f1f6af83d79427435c4985feae55a03c1c4da99333b3c185f87c7f7b80dd7b23262c568d1 - languageName: node - linkType: hard - -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/f3451525379c68a73eb0a1e65247fbf28c0cccd126d93af21c75fceff77773d43c0d4a2d51978fb131aff25b5f2cb41a9fe48cc296e61ae65e679c4f6918b0ab - languageName: node - linkType: hard - -"@antfu/install-pkg@npm:^1.0.0": - version: 1.0.0 - resolution: "@antfu/install-pkg@npm:1.0.0" - dependencies: - package-manager-detector: "npm:^0.2.8" - tinyexec: "npm:^0.3.2" - checksum: 10/0fdae280f5185d7225e41ed8f19aa14f96716043366d7aeec5e6bea4f995a826bb250dd01d6e2d9886bbd2c023435ad624096bad9e4c8d6cc3d025b6b9ca32a9 - languageName: node - linkType: hard - -"@antfu/utils@npm:^8.1.0": - version: 8.1.1 - resolution: "@antfu/utils@npm:8.1.1" - checksum: 10/2a9cc7877c1e39a1ce8b76a566b8e731a1b55ce895708365536e1939821ddcadbb7e2f4f130855747b474b1de1c078ffc20aaf9810ffe762db017f4731ace9fb - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" - dependencies: - "@babel/highlight": "npm:^7.24.7" - picocolors: "npm:^1.0.0" - checksum: 10/4812e94885ba7e3213d49583a155fdffb05292330f0a9b2c41b49288da70cf3c746a3fda0bf1074041a6d741c33f8d7be24be5e96f41ef77395eeddc5c9ff624 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.26.2": - version: 7.26.2 - resolution: "@babel/code-frame@npm:7.26.2" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/db2c2122af79d31ca916755331bb4bac96feb2b334cdaca5097a6b467fdd41963b89b14b6836a14f083de7ff887fc78fa1b3c10b14e743d33e12dbfe5ee3d223 - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/code-frame@npm:7.27.1" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.27.1" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.1.1" - checksum: 10/721b8a6e360a1fa0f1c9fe7351ae6c874828e119183688b533c477aa378f1010f37cc9afbfc4722c686d1f5cdd00da02eab4ba7278a0c504fa0d7a321dcd4fdf - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/compat-data@npm:7.24.7" - checksum: 10/6edc09152ca51a22c33741c441f33f9475598fa59edc53369edb74b49f4ea4bef1281f5b0ed2b9b67fb66faef2da2069e21c4eef83405d8326e524b301f4e7e2 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.26.5, @babel/compat-data@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/compat-data@npm:7.26.8" - checksum: 10/bdddf577f670e0e12996ef37e134856c8061032edb71a13418c3d4dae8135da28910b7cd6dec6e668ab3a41e42089ef7ee9c54ef52fe0860b54cb420b0d14948 - languageName: node - linkType: hard - -"@babel/core@npm:^7.21.3": - version: 7.24.7 - resolution: "@babel/core@npm:7.24.7" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helpers": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/template": "npm:^7.24.7" - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10/ef8cc1afa3ccecee6d1f5660c487ccc2a3f25106830ea9040e80ef4b2092e053607ee4ddd03493e4f7ef2f9967a956ca53b830d54c5bee738eeb58cce679dd4a - languageName: node - linkType: hard - -"@babel/core@npm:^7.25.9": - version: 7.26.9 - resolution: "@babel/core@npm:7.26.9" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.9" - "@babel/helper-compilation-targets": "npm:^7.26.5" - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.9" - "@babel/parser": "npm:^7.26.9" - "@babel/template": "npm:^7.26.9" - "@babel/traverse": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10/ceed199dbe25f286a0a59a2ea7879aed37c1f3bb289375d061eda4752cab2ba365e7f9e969c7fd3b9b95c930493db6eeb5a6d6f017dd135fb5a4503449aad753 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/generator@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: 10/c71d24a4b41b19c10d2f2eb819f27d4cf94220e2322f7c8fed8bfbbb115b2bebbdd6dc1f27dac78a175e90604def58d763af87e0fa81ce4ab1582858162cf768 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/generator@npm:7.26.9" - dependencies: - "@babel/parser": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^3.0.2" - checksum: 10/95075dd6158a49efcc71d7f2c5d20194fcf245348de7723ca35e37cd5800587f1d4de2be6c4ba87b5f5fbb967c052543c109eaab14b43f6a73eb05ccd9a5bb44 - languageName: node - linkType: hard - -"@babel/helper-annotate-as-pure@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-annotate-as-pure@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10/a9017bfc1c4e9f2225b967fbf818004703de7cf29686468b54002ffe8d6b56e0808afa20d636819fcf3a34b89ba72f52c11bdf1d69f303928ee10d92752cad95 - languageName: node - linkType: hard - -"@babel/helper-annotate-as-pure@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" - dependencies: - "@babel/types": "npm:^7.25.9" - checksum: 10/41edda10df1ae106a9b4fe617bf7c6df77db992992afd46192534f5cff29f9e49a303231733782dd65c5f9409714a529f215325569f14282046e9d3b7a1ffb6c - languageName: node - linkType: hard - -"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/3ddff45d1e086c9c6dcef53ef46521a0c11ddb09fe3ab42dca5af6bb1b1703895a9f4f8056f49fdf53c2dbf6e5cf1ddb4baf17d7e3766c63f051ab8d60a919ee - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-compilation-targets@npm:7.24.7" - dependencies: - "@babel/compat-data": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - browserslist: "npm:^4.22.2" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10/8f8bc89af70a606ccb208513aa25d83e19b88f91b64a33174f7701a9479e67ddbb0a9c89033265070375cd24e690b93380b3a3ea11e4b3a711d742f0f4699ee7 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.25.9, @babel/helper-compilation-targets@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/helper-compilation-targets@npm:7.26.5" - dependencies: - "@babel/compat-data": "npm:^7.26.5" - "@babel/helper-validator-option": "npm:^7.25.9" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10/f3b5f0bfcd7b6adf03be1a494b269782531c6e415afab2b958c077d570371cf1bfe001c442508092c50ed3711475f244c05b8f04457d8dea9c34df2b741522bf - languageName: node - linkType: hard - -"@babel/helper-create-class-features-plugin@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-create-class-features-plugin@npm:7.24.7" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-member-expression-to-functions": "npm:^7.24.7" - "@babel/helper-optimise-call-expression": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/8ecb1c2acc808e1e0c21dccc7ea6899de9a140cb1856946800176b4784de6fccd575661fbff7744bb895d01aa6956ce963446b8577c4c2334293ba5579d5cdb9 - languageName: node - linkType: hard - -"@babel/helper-create-class-features-plugin@npm:^7.25.9": - version: 7.26.9 - resolution: "@babel/helper-create-class-features-plugin@npm:7.26.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-member-expression-to-functions": "npm:^7.25.9" - "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/traverse": "npm:^7.26.9" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/28bca407847563cabcafcbd84a06c8b3d53d36d2e113cc7b7c15e3377fbfdb4b6b7c73ef76a7c4c9908cc71ee3f350c4bb16a86a4380c6812e17690f792264fe - languageName: node - linkType: hard - -"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.24.7" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - regexpu-core: "npm:^5.3.1" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/dd7238af30ea6b26a627192422822ae810873fd899150dd8d4348eb107045721a849abcfa2bd04f917493784a93724b8caf6994c31afd16f9347a8a9b9862425 - languageName: node - linkType: hard - -"@babel/helper-create-regexp-features-plugin@npm:^7.25.9": - version: 7.26.3 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.26.3" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - regexpu-core: "npm:^6.2.0" - semver: "npm:^6.3.1" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/4c44122ea11c4253ee78a9c083b7fbce96c725e2cb43cc864f0e8ea2749f7b6658617239c6278df9f132d09a7545c8fe0336ed2895ad7c80c71507828a7bc8ba - languageName: node - linkType: hard - -"@babel/helper-define-polyfill-provider@npm:^0.6.1, @babel/helper-define-polyfill-provider@npm:^0.6.2": - version: 0.6.2 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.2" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" - lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/bb32ec12024d3f16e70641bc125d2534a97edbfdabbc9f69001ec9c4ce46f877c7a224c566aa6c8c510c3b0def2e43dc4433bf6a40896ba5ce0cef4ea5ccbcff - languageName: node - linkType: hard - -"@babel/helper-define-polyfill-provider@npm:^0.6.3": - version: 0.6.3 - resolution: "@babel/helper-define-polyfill-provider@npm:0.6.3" - dependencies: - "@babel/helper-compilation-targets": "npm:^7.22.6" - "@babel/helper-plugin-utils": "npm:^7.22.5" - debug: "npm:^4.1.1" - lodash.debounce: "npm:^4.0.8" - resolve: "npm:^1.14.2" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/b79a77ac8fbf1aaf6c7f99191871760508e87d75a374ff3c39c6599a17d9bb82284797cd451769305764e504546caf22ae63367b22d6e45e32d0a8f4a34aab53 - languageName: node - linkType: hard - -"@babel/helper-environment-visitor@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-environment-visitor@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10/079d86e65701b29ebc10baf6ed548d17c19b808a07aa6885cc141b690a78581b180ee92b580d755361dc3b16adf975b2d2058b8ce6c86675fcaf43cf22f2f7c6 - languageName: node - linkType: hard - -"@babel/helper-function-name@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-function-name@npm:7.24.7" - dependencies: - "@babel/template": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/2ceb3d9b2b35a0fc4100fc06ed7be3bc38f03ff0bf128ff0edbc0cc7dd842967b1496fc70b5c616c747d7711c2b87e7d025c8888f48740631d6148a9d3614f85 - languageName: node - linkType: hard - -"@babel/helper-hoist-variables@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-hoist-variables@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10/6cfdcf2289cd12185dcdbdf2435fa8d3447b797ac75851166de9fc8503e2fd0021db6baf8dfbecad3753e582c08e6a3f805c8d00cbed756060a877d705bd8d8d - languageName: node - linkType: hard - -"@babel/helper-member-expression-to-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-member-expression-to-functions@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/d990752aaff311aba0ca61539e1776c5ba2818836403f9bafac849deb4cd24c082cbde5f23e490b7f3614c95ff67f8d75fa5e2f14cb00586a72c96c158e1127b - languageName: node - linkType: hard - -"@babel/helper-member-expression-to-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-member-expression-to-functions@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/ef8cc1c1e600b012b312315f843226545a1a89f25d2f474ce2503fd939ca3f8585180f291a3a13efc56cf13eddc1d41a3a040eae9a521838fd59a6d04cc82490 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-imports@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/df8bfb2bb18413aa151ecd63b7d5deb0eec102f924f9de6bc08022ced7ed8ca7fed914562d2f6fa5b59b74a5d6e255dc35612b2bc3b8abf361e13f61b3704770 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-imports@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/e090be5dee94dda6cd769972231b21ddfae988acd76b703a480ac0c96f3334557d70a965bf41245d6ee43891e7571a8b400ccf2b2be5803351375d0f4e5bcf08 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-transforms@npm:7.24.7" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-simple-access": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/4f2b232bf6d1be8d3a72b084a2a7ac1b0b93ea85717411a11ae1fb6375d4392019e781d8cc155789e649a2caa7eec378dd1404210603d6d4230f042c5feacffb - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.25.9, @babel/helper-module-transforms@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helper-module-transforms@npm:7.26.0" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/9841d2a62f61ad52b66a72d08264f23052d533afc4ce07aec2a6202adac0bfe43014c312f94feacb3291f4c5aafe681955610041ece2c276271adce3f570f2f5 - languageName: node - linkType: hard - -"@babel/helper-optimise-call-expression@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-optimise-call-expression@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10/da7a7f2d1bb1be4cffd5fa820bd605bc075c7dd014e0458f608bb6f34f450fe9412c8cea93e788227ab396e0e02c162d7b1db3fbcb755a6360e354c485d61df0 - languageName: node - linkType: hard - -"@babel/helper-optimise-call-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-optimise-call-expression@npm:7.25.9" - dependencies: - "@babel/types": "npm:^7.25.9" - checksum: 10/f09d0ad60c0715b9a60c31841b3246b47d67650c512ce85bbe24a3124f1a4d66377df793af393273bc6e1015b0a9c799626c48e53747581c1582b99167cc65dc - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.24.7 - resolution: "@babel/helper-plugin-utils@npm:7.24.7" - checksum: 10/dad51622f0123fdba4e2d40a81a6b7d6ef4b1491b2f92fd9749447a36bde809106cf117358705057a2adc8fd73d5dc090222e0561b1213dae8601c8367f5aac8 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/helper-plugin-utils@npm:7.26.5" - checksum: 10/1cc0fd8514da3bb249bed6c27227696ab5e84289749d7258098701cffc0c599b7f61ec40dd332f8613030564b79899d9826813c96f966330bcfc7145a8377857 - languageName: node - linkType: hard - -"@babel/helper-remap-async-to-generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-remap-async-to-generator@npm:7.24.7" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-wrap-function": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/4b7c925e71811902c8aa57904044921027eae10ac9b5b029df491ed4abc1ea18b450a7923fd0feb1248ae37703889e72b6c27f2a0e2d5811103c7655c49ad355 - languageName: node - linkType: hard - -"@babel/helper-remap-async-to-generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-remap-async-to-generator@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-wrap-function": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/ea37ad9f8f7bcc27c109963b8ebb9d22bac7a5db2a51de199cb560e251d5593fe721e46aab2ca7d3e7a24b0aa4aff0eaf9c7307af9c2fd3a1d84268579073052 - languageName: node - linkType: hard - -"@babel/helper-replace-supers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-replace-supers@npm:7.24.7" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-member-expression-to-functions": "npm:^7.24.7" - "@babel/helper-optimise-call-expression": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/18b7c3709819d008a14953e885748f3e197537f131d8f7ae095fec245506d854ff40b236edb1754afb6467f795aa90ae42a1d961a89557702249bacfc3fdad19 - languageName: node - linkType: hard - -"@babel/helper-replace-supers@npm:^7.25.9, @babel/helper-replace-supers@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/helper-replace-supers@npm:7.26.5" - dependencies: - "@babel/helper-member-expression-to-functions": "npm:^7.25.9" - "@babel/helper-optimise-call-expression": "npm:^7.25.9" - "@babel/traverse": "npm:^7.26.5" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/cfb911d001a8c3d2675077dbb74ee8d7d5533b22d74f8d775cefabf19c604f6cbc22cfeb94544fe8efa626710d920f04acb22923017e68f46f5fdb1cb08b32ad - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-simple-access@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/5083e190186028e48fc358a192e4b93ab320bd016103caffcfda81302a13300ccce46c9cd255ae520c25d2a6a9b47671f93e5fe5678954a2329dc0a685465c49 - languageName: node - linkType: hard - -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/784a6fdd251a9a7e42ccd04aca087ecdab83eddc60fda76a2950e00eb239cc937d3c914266f0cc476298b52ac3f44ffd04c358e808bd17552a7e008d75494a77 - languageName: node - linkType: hard - -"@babel/helper-skip-transparent-expression-wrappers@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/fdbb5248932198bc26daa6abf0d2ac42cab9c2dbb75b7e9f40d425c8f28f09620b886d40e7f9e4e08ffc7aaa2cefe6fc2c44be7c20e81f7526634702fb615bdc - languageName: node - linkType: hard - -"@babel/helper-split-export-declaration@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-split-export-declaration@npm:7.24.7" - dependencies: - "@babel/types": "npm:^7.24.7" - checksum: 10/ff04a3071603c87de0d6ee2540b7291ab36305b329bd047cdbb6cbd7db335a12f9a77af1cf708779f75f13c4d9af46093c00b34432e50b2411872c658d1a2e5e - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-string-parser@npm:7.24.7" - checksum: 10/603d8d962bbe89907aa99a8f19a006759ab7b2464615f20a6a22e3e2e8375af37ddd0e5175c9e622e1c4b2d83607ffb41055a59d0ce34404502af30fde573a5c - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-string-parser@npm:7.25.9" - checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-string-parser@npm:7.27.1" - checksum: 10/0ae29cc2005084abdae2966afdb86ed14d41c9c37db02c3693d5022fba9f5d59b011d039380b8e537c34daf117c549f52b452398f576e908fb9db3c7abbb3a00 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 10/86875063f57361471b531dbc2ea10bbf5406e12b06d249b03827d361db4cad2388c6f00936bcd9dc86479f7e2c69ea21412c2228d4b3672588b754b70a449d4b - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.27.1": - version: 7.27.1 - resolution: "@babel/helper-validator-identifier@npm:7.27.1" - checksum: 10/75041904d21bdc0cd3b07a8ac90b11d64cd3c881e89cb936fa80edd734bf23c35e6bd1312611e8574c4eab1f3af0f63e8a5894f4699e9cfdf70c06fcf4252320 - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-option@npm:7.24.7" - checksum: 10/9689166bf3f777dd424c026841c8cd651e41b21242dbfd4569a53086179a3e744c8eddd56e9d10b54142270141c91581b53af0d7c00c82d552d2540e2a919f7e - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-option@npm:7.25.9" - checksum: 10/9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d - languageName: node - linkType: hard - -"@babel/helper-wrap-function@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-wrap-function@npm:7.24.7" - dependencies: - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/template": "npm:^7.24.7" - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/1c248accfbb09a891293840506e3fbfc807b524abf16fc32115a6e73f760387d2dc7935282b48caa281c8033bf93dc80eca7649250524cfb95da8643771bca02 - languageName: node - linkType: hard - -"@babel/helper-wrap-function@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-wrap-function@npm:7.25.9" - dependencies: - "@babel/template": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10/988dcf49159f1c920d6b9486762a93767a6e84b5e593a6342bc235f3e47cc1cb0c048d8fca531a48143e6b7fce1ff12ddbf735cf5f62cb2f07192cf7c27b89cf - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.24.7, @babel/helpers@npm:^7.26.9": - version: 7.27.4 - resolution: "@babel/helpers@npm:7.27.4" - dependencies: - "@babel/template": "npm:^7.27.2" - "@babel/types": "npm:^7.27.3" - checksum: 10/a697280575d338afd69461a07edb6db5b8623ca66528a9d2522e7b01476f42561b9563ab688b3ebe9e6afd4d25c6e66cc29a4466c424ab0d6573180c2bfdec0f - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/69b73f38cdd4f881b09b939a711e76646da34f4834f4ce141d7a49a6bb1926eab1c594148970a8aa9360398dff800f63aade4e81fafdd7c8d8a8489ea93bfec1 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/parser@npm:7.24.7" - bin: - parser: ./bin/babel-parser.js - checksum: 10/ef9ebce60e13db560ccc7af9235d460f6726bb7e23ae2d675098c1fc43d5249067be60d4118889dad33b1d4f85162cf66baf554719e1669f29bb20e71322568e - languageName: node - linkType: hard - -"@babel/parser@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/parser@npm:7.26.9" - dependencies: - "@babel/types": "npm:^7.26.9" - bin: - parser: ./bin/babel-parser.js - checksum: 10/cb84fe3ba556d6a4360f3373cf7eb0901c46608c8d77330cc1ca021d60f5d6ebb4056a8e7f9dd0ef231923ef1fe69c87b11ce9e160d2252e089a20232a2b942b - languageName: node - linkType: hard - -"@babel/parser@npm:^7.27.2": - version: 7.27.5 - resolution: "@babel/parser@npm:7.27.5" - dependencies: - "@babel/types": "npm:^7.27.3" - bin: - parser: ./bin/babel-parser.js - checksum: 10/0ad671be7994dba7d31ec771bd70ea5090aa34faf73e93b1b072e3c0a704ab69f4a7a68ebfb9d6a7fa455e0aa03dfa65619c4df6bae1cf327cba925b1d233fc4 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.24.7" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/d5091ca6b58c54316c4d3b6e8120a1bb70cfe2e61cb7ec11f5fdc8ba3ff5124de21e527fabc28f239bf6efc0660046aa416e8fc1e3d920d0e57b78edb507ec3f - languageName: node - linkType: hard - -"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/3c23ef34e3fd7da3578428cb488180ab6b7b96c9c141438374b6d87fa814d87de099f28098e5fc64726c19193a1da397e4d2351d40b459bcd2489993557e2c74 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/d3e14ab1cb9cb50246d20cab9539f2fbd1e7ef1ded73980c8ad7c0561b4d5e0b144d362225f0976d47898e04cbd40f2000e208b0913bd788346cf7791b96af91 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/f0e0e9bdcf5479f8c5b4494353dc64dee37205e5ffd30920e649e75537a8f795cdcf32dfb40a00e908469a5d61cf62806bc359294cb2a6f2e604bf4efe086301 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/a9d1ee3fd100d3eb6799a2f2bbd785296f356c531d75c9369f71541811fa324270258a374db103ce159156d006da2f33370330558d0133e6f7584152c34997ca - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.13.0 - checksum: 10/887f1b8bd0ef61206ece47919fda78a32eef35da31c0d95ab8d7adc8b4722534dc5177c86c8d6d81bcf4343f3c08c6adab2b46cfd2bea8e33c6c04e51306f9cc - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.13.0 - checksum: 10/5b298b28e156f64de51cdb03a2c5b80c7f978815ef1026f3ae8b9fc48d28bf0a83817d8fbecb61ef8fb94a7201f62cca5103cc6e7b9e8f28e38f766d7905b378 - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.24.7" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/ad63317eb72ca7e160394e9223768b1f826287eaf65297f2794d0203510225f20dd9858bce217af4a050754abf94565841617b45b35a2de355c4e2bba546b39c - languageName: node - linkType: hard - -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/cb893e5deb9312a0120a399835b6614a016c036714de7123c8edabccc56a09c4455016e083c5c4dd485248546d4e5e55fc0e9132b3c3a9bd16abf534138fe3f2 - languageName: node - linkType: hard - -"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": - version: 7.21.0-placeholder-for-preset-env.2 - resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/fab70f399aa869275690ec6c7cedb4ef361d4e8b6f55c3d7b04bfee61d52fb93c87cec2c65d73cddbaca89fb8ef5ec0921fce675c9169d9d51f18305ab34e78a - languageName: node - linkType: hard - -"@babel/plugin-syntax-async-generators@npm:^7.8.4": - version: 7.8.4 - resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/7ed1c1d9b9e5b64ef028ea5e755c0be2d4e5e4e3d6cf7df757b9a8c4cfa4193d268176d0f1f7fbecdda6fe722885c7fda681f480f3741d8a2d26854736f05367 - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-properties@npm:^7.12.13": - version: 7.12.13 - resolution: "@babel/plugin-syntax-class-properties@npm:7.12.13" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.12.13" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/24f34b196d6342f28d4bad303612d7ff566ab0a013ce89e775d98d6f832969462e7235f3e7eaf17678a533d4be0ba45d3ae34ab4e5a9dcbda5d98d49e5efa2fc - languageName: node - linkType: hard - -"@babel/plugin-syntax-class-static-block@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-class-static-block@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/3e80814b5b6d4fe17826093918680a351c2d34398a914ce6e55d8083d72a9bdde4fbaf6a2dcea0e23a03de26dc2917ae3efd603d27099e2b98380345703bf948 - languageName: node - linkType: hard - -"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/ce307af83cf433d4ec42932329fad25fa73138ab39c7436882ea28742e1c0066626d224e0ad2988724c82644e41601cef607b36194f695cb78a1fcdc959637bd - languageName: node - linkType: hard - -"@babel/plugin-syntax-export-namespace-from@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-export-namespace-from@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/85740478be5b0de185228e7814451d74ab8ce0a26fcca7613955262a26e99e8e15e9da58f60c754b84515d4c679b590dbd3f2148f0f58025f4ae706f1c5a5d4a - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-assertions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/bd065cd73ae3dbe69e6f9167aa605da3df77d69bbad2ede95e4aa9e7af7744d5bc1838b928c77338ca62df7691a7adf6e608279be50c18e4b3c70cf77e3013d7 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-assertions@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-syntax-import-assertions@npm:7.26.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b58f2306df4a690ca90b763d832ec05202c50af787158ff8b50cdf3354359710bce2e1eb2b5135fcabf284756ac8eadf09ca74764aa7e76d12a5cac5f6b21e67 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-attributes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/22fc50bd85a491bb8d22065f330a41f60d66f2f2d7a1deb73e80c8a4b5d7a42a092a03f8da18800650eca0fc14585167cc4e5c9fab351f0d390d1592347162ae - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-attributes@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/c122aa577166c80ee67f75aebebeef4150a132c4d3109d25d7fc058bf802946f883e330f20b78c1d3e3a5ada631c8780c263d2d01b5dbaecc69efefeedd42916 - languageName: node - linkType: hard - -"@babel/plugin-syntax-import-meta@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-import-meta@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/166ac1125d10b9c0c430e4156249a13858c0366d38844883d75d27389621ebe651115cb2ceb6dc011534d5055719fa1727b59f39e1ab3ca97820eef3dcab5b9b - languageName: node - linkType: hard - -"@babel/plugin-syntax-json-strings@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-json-strings@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/bf5aea1f3188c9a507e16efe030efb996853ca3cadd6512c51db7233cc58f3ac89ff8c6bdfb01d30843b161cfe7d321e1bf28da82f7ab8d7e6bc5464666f354a - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/a93516ae5b34868ab892a95315027d4e5e38e8bd1cfca6158f2974b0901cbb32bbe64ea10ad5b25f919ddc40c6d8113c4823372909c9c9922170c12b0b1acecb - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/bb609d1ffb50b58f0c1bac8810d0e46a4f6c922aa171c458f3a19d66ee545d36e782d3bffbbc1fed0dc65a558bdce1caf5279316583c0fff5a2c1658982a8563 - languageName: node - linkType: hard - -"@babel/plugin-syntax-logical-assignment-operators@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-logical-assignment-operators@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/aff33577037e34e515911255cdbb1fd39efee33658aa00b8a5fd3a4b903585112d037cce1cc9e4632f0487dc554486106b79ccd5ea63a2e00df4363f6d4ff886 - languageName: node - linkType: hard - -"@babel/plugin-syntax-nullish-coalescing-operator@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-nullish-coalescing-operator@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/87aca4918916020d1fedba54c0e232de408df2644a425d153be368313fdde40d96088feed6c4e5ab72aac89be5d07fef2ddf329a15109c5eb65df006bf2580d1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-numeric-separator@npm:^7.10.4": - version: 7.10.4 - resolution: "@babel/plugin-syntax-numeric-separator@npm:7.10.4" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.10.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/01ec5547bd0497f76cc903ff4d6b02abc8c05f301c88d2622b6d834e33a5651aa7c7a3d80d8d57656a4588f7276eba357f6b7e006482f5b564b7a6488de493a1 - languageName: node - linkType: hard - -"@babel/plugin-syntax-object-rest-spread@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-object-rest-spread@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/fddcf581a57f77e80eb6b981b10658421bc321ba5f0a5b754118c6a92a5448f12a0c336f77b8abf734841e102e5126d69110a306eadb03ca3e1547cab31f5cbf - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-catch-binding@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-catch-binding@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/910d90e72bc90ea1ce698e89c1027fed8845212d5ab588e35ef91f13b93143845f94e2539d831dc8d8ededc14ec02f04f7bd6a8179edd43a326c784e7ed7f0b9 - languageName: node - linkType: hard - -"@babel/plugin-syntax-optional-chaining@npm:^7.8.3": - version: 7.8.3 - resolution: "@babel/plugin-syntax-optional-chaining@npm:7.8.3" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.8.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/eef94d53a1453361553c1f98b68d17782861a04a392840341bc91780838dd4e695209c783631cf0de14c635758beafb6a3a65399846ffa4386bff90639347f30 - languageName: node - linkType: hard - -"@babel/plugin-syntax-private-property-in-object@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-private-property-in-object@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b317174783e6e96029b743ccff2a67d63d38756876e7e5d0ba53a322e38d9ca452c13354a57de1ad476b4c066dbae699e0ca157441da611117a47af88985ecda - languageName: node - linkType: hard - -"@babel/plugin-syntax-top-level-await@npm:^7.14.5": - version: 7.14.5 - resolution: "@babel/plugin-syntax-top-level-await@npm:7.14.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/bbd1a56b095be7820029b209677b194db9b1d26691fe999856462e66b25b281f031f3dfd91b1619e9dcf95bebe336211833b854d0fb8780d618e35667c2d0d7e - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-syntax-typescript@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/2518cc06323f5673c93142935879c112fea0ee836dfa9a9ec744fc972fdeaf22a06fe631c23817562aaaddadf64626a4fbba98c300b3e2c828f48f0f1cca0ce0 - languageName: node - linkType: hard - -"@babel/plugin-syntax-typescript@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0e9821e8ba7d660c36c919654e4144a70546942ae184e85b8102f2322451eae102cbfadbcadd52ce077a2b44b400ee52394c616feab7b5b9f791b910e933fd33 - languageName: node - linkType: hard - -"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.18.6" - "@babel/helper-plugin-utils": "npm:^7.18.6" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/a651d700fe63ff0ddfd7186f4ebc24447ca734f114433139e3c027bc94a900d013cf1ef2e2db8430425ba542e39ae160c3b05f06b59fd4656273a3df97679e9c - languageName: node - linkType: hard - -"@babel/plugin-transform-arrow-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/6720173645826046878015c579c2ca9d93cdba79a2832f0180f5cf147d9817c85bf9c8338b16d6bdaa71f87809b7a194a6902e6c82ec00b6354aca6b40abe5e6 - languageName: node - linkType: hard - -"@babel/plugin-transform-arrow-functions@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-arrow-functions@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/c29f081224859483accf55fb4d091db2aac0dcd0d7954bac5ca889030cc498d3f771aa20eb2e9cd8310084ec394d85fa084b97faf09298b6bc9541182b3eb5bb - languageName: node - linkType: hard - -"@babel/plugin-transform-async-generator-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.24.7" - dependencies: - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-remap-async-to-generator": "npm:^7.24.7" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/cf0a4b5ffc6d7f3f3bf12d4792535e8a46332714211326fd5058a6e45988891ee402b26cb9cc6c7121b2c8283ebd160e431827f885bdfa51d6127f934bd9ba7f - languageName: node - linkType: hard - -"@babel/plugin-transform-async-generator-functions@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.26.8" +"@algolia/abtesting@npm:1.15.0": + version: 1.15.0 + resolution: "@algolia/abtesting@npm:1.15.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/helper-remap-async-to-generator": "npm:^7.25.9" - "@babel/traverse": "npm:^7.26.8" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/8fb43823f56281b041dbd358de4f59fccb3e20aac133a439caaeb5aaa30671b3482da9a8515b169fef108148e937c1248b7d6383979c3b30f9348e3fabd29b8e - languageName: node - linkType: hard - -"@babel/plugin-transform-async-to-generator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.24.7" - dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-remap-async-to-generator": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b2041d9d50b09afef983c4f1dece63fdfc5a8e4646e42591db398bc4322958434d60b3cb0f5d0f9f9dbdad8577e8a1a33ba9859aacc3004bf6d25d094d20193f + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/9167d869e3c25e77365131927afd6633d96d2f445ce8766430d4c011d277b40aa163aa37b400fffaf877b9bc714f3355718a33afa8e87b51427efc94a7c75aff languageName: node linkType: hard -"@babel/plugin-transform-async-to-generator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-async-to-generator@npm:7.25.9" +"@algolia/autocomplete-core@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-core@npm:1.19.2" dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-remap-async-to-generator": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/b3ad50fb93c171644d501864620ed23952a46648c4df10dc9c62cc9ad08031b66bd272cfdd708faeee07c23b6251b16f29ce0350473e4c79f0c32178d38ce3a6 + "@algolia/autocomplete-plugin-algolia-insights": "npm:1.19.2" + "@algolia/autocomplete-shared": "npm:1.19.2" + checksum: 10/afe9a1686313e8c1f26fccc88a32fce84d43ae3c42c64e02fb25661a91e2af443a1720cc24970ed66df56c742fd83cfcee2ac8690e8f77bb670edee35a99e84b languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.24.7" +"@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-plugin-algolia-insights@npm:1.19.2" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@algolia/autocomplete-shared": "npm:1.19.2" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/33e2fb9f24c11889b2bacbe9c3625f738edafc2136c8206598e0422664267ec5ca9422cb4563cc42039ccfc333fb42ce5f8513382e56c5b02f934005d0d6e8ff + search-insights: ">= 1 < 3" + checksum: 10/b9135d0be51b9f9c5370c9df7567c0adb34ffe1cffa9c73d847d191b2bafee010a005edf4a7105391852151bdf8dbda010a8b6bd66cea61a0a2e29366dc1b3d2 languageName: node linkType: hard -"@babel/plugin-transform-block-scoped-functions@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.26.5" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" +"@algolia/autocomplete-shared@npm:1.19.2": + version: 1.19.2 + resolution: "@algolia/autocomplete-shared@npm:1.19.2" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/f2046c09bf8e588bfb1a6342d0eee733189102cf663ade27adb0130f3865123af5816b40a55ec8d8fa09271b54dfdaf977cd2f8e0b3dc97f18e690188d5a2174 + "@algolia/client-search": ">= 4.9.1 < 6" + algoliasearch: ">= 4.9.1 < 6" + checksum: 10/442223a1e09d75f103441469c7174e09c4c129b4005b6492771c6145b8bcc9a1df4d590acfdd8af009b802cb3be0aade9fabbaa4b21e9ec3753947ad17b988aa languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-block-scoping@npm:7.24.7" +"@algolia/client-abtesting@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/client-abtesting@npm:5.49.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/9656e7bb0673279e18d9f9408027786f1b20d657e2cc106456e0bd7826bd12d81813299adbef2b2a5837b05740f2295fe8fb62389122d38c9e961b3005270777 + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/2c91b0d4cb38c808a82f783f48da410eadbc50e7eca4d770f8a794862ddde6356805cf279c839a041035756794566bb5fbaf739d466009700cbfc4fa39fc34a6 languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-block-scoping@npm:7.25.9" +"@algolia/client-analytics@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/client-analytics@npm:5.49.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/89dcdd7edb1e0c2f44e3c568a8ad8202e2574a8a8308248550a9391540bc3f5c9fbd8352c60ae90769d46f58d3ab36f2c3a0fbc1c3620813d92ff6fccdfa79c8 + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/9e42b856e7b0c19b38cdddeb4eb4396b64c3df476248c6da2263186121fe125e657c46c8d345138394781558767542cbc99ba20fe116a49e2c6294ebf55ce081 languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-class-properties@npm:7.24.7" - dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/1c6f645dd3889257028f27bfbb04526ac7676763a923fc8203aa79aa5232820e0201cb858c73b684b1922327af10304121ac013c7b756876d54560a9c1a7bc79 +"@algolia/client-common@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/client-common@npm:5.49.0" + checksum: 10/a573a3a2a6b4a641a7222a3d9ae87ebed4dd626b40d98725fecc5c65463a63ccad0dae2ddf6e59be9a24be239d929651d31cd0d4bed5549937a4e83687983121 languageName: node linkType: hard -"@babel/plugin-transform-class-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-class-properties@npm:7.25.9" +"@algolia/client-insights@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/client-insights@npm:5.49.0" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/a8d69e2c285486b63f49193cbcf7a15e1d3a5f632c1c07d7a97f65306df7f554b30270b7378dde143f8b557d1f8f6336c643377943dec8ec405e4cd11e90b9ea + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/26d1f0b27271e0ef7c28f8679de8b0cfcf9b2f75804550d58efeb45423d093cb039ae70925a105e4b22d3720eea20fd4d67d977cabb57dcb5c1119bed3aabf5a languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-class-static-block@npm:7.24.7" +"@algolia/client-personalization@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/client-personalization@npm:5.49.0" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 10/00b4d35788bcfefb56b6a1d3506ca23f11dd55d4bb5a34eb70397c06283dc7f596cd9d40995c4a6cb897b45ad220de211f854e7a030a05e26a307c8f56b6ba4b + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/ca9fe3562d7be26f4a5b479dd60e65664ec5f90883851ff8ff66b1f6fb229ec2b19f124b0938226299c69b7b70d55c0201092cbaedac69910d0435f0ee8d10fa languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-transform-class-static-block@npm:7.26.0" +"@algolia/client-query-suggestions@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/client-query-suggestions@npm:5.49.0" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.12.0 - checksum: 10/60cba3f125a7bc4f90706af0a011697c7ffd2eddfba336ed6f84c5f358c44c3161af18b0202475241a96dee7964d96dd3a342f46dbf85b75b38bb789326e1766 + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/8df2e0429c7b5a6e615f5ef490bc70500aa7276f9a67650ba8fab1f75e99589e1c6ed4892078930d06dcebda78c396d591fedd04e46ffb7b62e429c7d17f0c11 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-classes@npm:7.24.7" +"@algolia/client-search@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/client-search@npm:5.49.0" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" - globals: "npm:^11.1.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/5d5577fcb0ec9ef33d889358c54720abe462325bed5483d71f9aa0a704f491520777be5411d6fd8a08a8ebe352e2445d46d1e6577a5a2c9333bc37b9ff8b9a74 + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/b208a9d61713411f7eef98ad0a176b81678787487cd44c195198f570787e5884ad5e9b8f7ec324a0e982acc3f8c9e1b1bc3f0b06401a3e9f8239442c6fc5c503 languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-classes@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - globals: "npm:^11.1.0" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/1914ebe152f35c667fba7bf17ce0d9d0f33df2fb4491990ce9bb1f9ec5ae8cbd11d95b0dc371f7a4cc5e7ce4cf89467c3e34857302911fc6bfb6494a77f7b37e +"@algolia/events@npm:^4.0.1": + version: 4.0.1 + resolution: "@algolia/events@npm:4.0.1" + checksum: 10/98d239899a9dac9398f751221369523f2d7706fc4b3bc3167b66a101773d57380fc52733467c0a12be36bce969577fd4010d6ccbd08c410f9c7adc088dadf4c6 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-computed-properties@npm:7.24.7" +"@algolia/ingestion@npm:1.49.0": + version: 1.49.0 + resolution: "@algolia/ingestion@npm:1.49.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/template": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/fecf3c770b2dd8e70be6da12d4dd0273de9d8ef4d0f46be98d56fddb3a451932cdc9bb81de3057c9acb903e05ece657886cc31886d5762afa7b0a256db0f791e + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/9201a0dedf675e3cbec33344d2d27d053e949185cc1a450c00f31243fd5dd4ce4cdb6ad6c2352f8bc4fba1720d97024034d18417ed6347e4165b51e2b00f4707 languageName: node linkType: hard -"@babel/plugin-transform-computed-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-computed-properties@npm:7.25.9" +"@algolia/monitoring@npm:1.49.0": + version: 1.49.0 + resolution: "@algolia/monitoring@npm:1.49.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/template": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/aa1a9064d6a9d3b569b8cae6972437315a38a8f6553ee618406da5122500a06c2f20b9fa93aeed04dd895923bf6f529c09fc79d4be987ec41785ceb7d2203122 + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/531ed7a8ff95cedb14a6c89931088277860fee3612ef39e59bb77f184a556b5e91ab3315e93d9547ae677e11f57514505f993bf5496237cdb0aff97b6bb4e4bf languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-destructuring@npm:7.24.7" +"@algolia/recommend@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/recommend@npm:5.49.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/eec43df24a07b3c61f335883e50c6642762fdd3cc5c5f95532cebeb51ea9bf77ca9a38011b678d91549dd75e29e1c58bd6e0ebc34bb763c300bc2cc65801e663 + "@algolia/client-common": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/410084cc5f5d5599e54a4e740ed791fabc2b6f51c04131903866aefde175332a968f004cd611bba0fdc0bcd48ca9c2121184b53fbf962969774c6ff119ba0587 languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-destructuring@npm:7.25.9" +"@algolia/requester-browser-xhr@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/requester-browser-xhr@npm:5.49.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/51b24fbead910ad0547463b2d214dd08076b22a66234b9f878b8bac117603dd23e05090ff86e9ffc373214de23d3e5bf1b095fe54cce2ca16b010264d90cf4f5 + "@algolia/client-common": "npm:5.49.0" + checksum: 10/4042875ff86a92b7c4fd6b7057bc2cecdb37705894e7a0864ec5d76e399c27645647a5f43783dd7102c18e3a0dbc1808785133c8d1f31ebc7dcd4866f8f0564f languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.24.7" +"@algolia/requester-fetch@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/requester-fetch@npm:5.49.0" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/51b75638748f6e5adab95b711d3365b8d7757f881c178946618a43b15063ec1160b07f4aa3b116bf3f1e097a88226a01db4cae2c5c4aad4c71fe5568828a03f5 + "@algolia/client-common": "npm:5.49.0" + checksum: 10/eefae2418973c54f946347cceb6edb3497f1ed875ba964b8cdc4ff8a4d46ecf66c5ed863c0168a32fd0bd70c34f0cbeafa4b33ab38f3caa05c7244c98421580e languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dotall-regex@npm:7.25.9" +"@algolia/requester-node-http@npm:5.49.0": + version: 5.49.0 + resolution: "@algolia/requester-node-http@npm:5.49.0" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/8bdf1bb9e6e3a2cc8154ae88a3872faa6dc346d6901994505fb43ac85f858728781f1219f40b67f7bb0687c507450236cb7838ac68d457e65637f98500aa161b + "@algolia/client-common": "npm:5.49.0" + checksum: 10/95512ba668aee06860f04b46de6b5de35fb0480f65fec349122d4a56e25b401686dc556e33e4a1eb397e72d9747574416e8647466613c7db9e8c1c19c8c3785e languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.24.7" +"@antfu/install-pkg@npm:^1.1.0": + version: 1.1.0 + resolution: "@antfu/install-pkg@npm:1.1.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/4284d8fe058c838f80d594bace1380ce02995fa9a271decbece59c40815bc2f7e715807dcbe4d5da8b444716e6d05cc6d79771f500fb044cd0dd00ce4324b619 + package-manager-detector: "npm:^1.3.0" + tinyexec: "npm:^1.0.1" + checksum: 10/e20b7cd1c37eff832cc878cddd794f8c3779175681cf6d75c4cc1ae1475526126a4c1f71fa027161aa1ee35a8850782be9ca0ec01b621893defebe97ba9dc70e languageName: node linkType: hard -"@babel/plugin-transform-duplicate-keys@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-keys@npm:7.25.9" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.28.6, @babel/code-frame@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/code-frame@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/10dbb87bc09582416f9f97ca6c40563655abf33e3fd0fee25eeaeff28e946a06651192112a2bc2b18c314a638fa15c55b8365a677ef67aa490848cefdc57e1d8 + "@babel/helper-validator-identifier": "npm:^7.28.5" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10/199e15ff89007dd30675655eec52481cb245c9fdf4f81e4dc1f866603b0217b57aff25f5ffa0a95bbc8e31eb861695330cd7869ad52cc211aa63016320ef72c5 languageName: node linkType: hard -"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/f7233cf596be8c6843d31951afaf2464a62a610cb89c72c818c044765827fab78403ab8a7d3a6386f838c8df574668e2a48f6c206b1d7da965aff9c6886cb8e6 +"@babel/compat-data@npm:^7.28.6, @babel/compat-data@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/compat-data@npm:7.29.0" + checksum: 10/7f21beedb930ed8fbf7eabafc60e6e6521c1d905646bf1317a61b2163339157fe797efeb85962bf55136e166b01fd1a6b526a15974b92a8b877d564dcb6c9580 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.24.7" +"@babel/core@npm:^7.21.3, @babel/core@npm:^7.25.9": + version: 7.29.0 + resolution: "@babel/core@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/e949c02aa57098d916eb6edcbef0f3f7d62640f37e1a061b0692523964e081f8182f2c4292173b4dbea4edb8d146e65d6a20ce4b6b5f8c33be34bd846ae114ea + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helpers": "npm:^7.28.6" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + "@jridgewell/remapping": "npm:^2.3.5" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10/25f4e91688cdfbaf1365831f4f245b436cdaabe63d59389b75752013b8d61819ee4257101b52fc328b0546159fd7d0e74457ed7cf12c365fea54be4fb0a40229 languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.25.9" +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.29.0": + version: 7.29.1 + resolution: "@babel/generator@npm:7.29.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/aaca1ccda819be9b2b85af47ba08ddd2210ff2dbea222f26e4cd33f97ab020884bf81a66197e50872721e9daf36ceb5659502c82199884ea74d5d75ecda5c58b + "@babel/parser": "npm:^7.29.0" + "@babel/types": "npm:^7.29.0" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10/61fe4ddd6e817aa312a14963ccdbb5c9a8c57e8b97b98d19a8a99ccab2215fda1a5f52bc8dd8d2e3c064497ddeb3ab8ceb55c76fa0f58f8169c34679d2256fe0 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.24.7" +"@babel/helper-annotate-as-pure@npm:^7.27.1, @babel/helper-annotate-as-pure@npm:^7.27.3": + version: 7.27.3 + resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/014b211f73a524ee98441541ddc4f6b067eefcf94d509e99074a45ea8c3f3ad0e36cab6f5f96666ac05b747a21fa6fda949aa25153656bb2821545a4b302e0d4 + "@babel/types": "npm:^7.27.3" + checksum: 10/63863a5c936ef82b546ca289c9d1b18fabfc24da5c4ee382830b124e2e79b68d626207febc8d4bffc720f50b2ee65691d7d12cc0308679dee2cd6bdc926b7190 languageName: node linkType: hard -"@babel/plugin-transform-exponentiation-operator@npm:^7.26.3": - version: 7.26.3 - resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.26.3" +"@babel/helper-compilation-targets@npm:^7.27.1, @babel/helper-compilation-targets@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-compilation-targets@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0d8da2e552a50a775fe8e6e3c32621d20d3c5d1af7ab40ca2f5c7603de057b57b1b5850f74040e4ecbe36c09ac86d92173ad1e223a2a3b3df3cc359ca4349738 + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-validator-option": "npm:^7.27.1" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10/f512a5aeee4dfc6ea8807f521d085fdca8d66a7d068a6dd5e5b37da10a6081d648c0bbf66791a081e4e8e6556758da44831b331540965dfbf4f5275f3d0a8788 languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.24.7" +"@babel/helper-create-class-features-plugin@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-create-class-features-plugin@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-member-expression-to-functions": "npm:^7.28.5" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.6" + semver: "npm:^6.3.1" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/d59d21945d2fd1ead914bb21f909f75b70ebe0e7627c2b1326ce500babca4c8e4a2513af6899d92e06e87186c61ee5087209345f5102fb4ff5a0e47e7b159a2c + "@babel/core": ^7.0.0 + checksum: 10/11f55607fcf66827ade745c0616aa3c6086aa655c0fab665dd3c4961829752e4c94c942262db30c4831ef9bce37ad444722e85ef1b7136587e28c6b1ef8ad43c languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.25.9" +"@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.27.1, @babel/helper-create-regexp-features-plugin@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.28.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + regexpu-core: "npm:^6.3.1" + semver: "npm:^6.3.1" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/4dfe8df86c5b1d085d591290874bb2d78a9063090d71567ed657a418010ad333c3f48af2c974b865f53bbb718987a065f89828d43279a7751db1a56c9229078d + "@babel/core": ^7.0.0 + checksum: 10/d8791350fe0479af0909aa5efb6dfd3bacda743c7c3f8fa1b0bb18fe014c206505834102ee24382df1cfe5a83b4e4083220e97f420a48b2cec15bb1ad6c7c9d3 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-for-of@npm:7.24.7" +"@babel/helper-define-polyfill-provider@npm:^0.6.5, @babel/helper-define-polyfill-provider@npm:^0.6.6": + version: 0.6.6 + resolution: "@babel/helper-define-polyfill-provider@npm:0.6.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + debug: "npm:^4.4.3" + lodash.debounce: "npm:^4.0.8" + resolve: "npm:^1.22.11" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/ea471ad1345f1153f7f72f1f084e74f48dc349272ca1b2d8710b841b015c9861d673e12c3c98d42ab3c640cb6ab88bb9a8da1f4ca9c57a8f71f00815fa23ecef + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 10/1c725c47bafb10ae4527aff6741b44ca49b18bf7005ae4583b15f992783e7c1d7687eab1a5583a373b5494160d46e91e29145280bd850e97d36b8b01bc5fef99 languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/plugin-transform-for-of@npm:7.26.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/25df1ea3bcecc1bcef99f273fbd8f4a73a509ab7ef3db93629817cb02f9d24868ca3760347f864c8fa4ab79ffa86fb09b2f2de1f2ba1f73f27dbe0c3973c6868 +"@babel/helper-globals@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/helper-globals@npm:7.28.0" + checksum: 10/91445f7edfde9b65dcac47f4f858f68dc1661bf73332060ab67ad7cc7b313421099a2bfc4bda30c3db3842cfa1e86fffbb0d7b2c5205a177d91b22c8d7d9cb47 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-function-name@npm:7.24.7" +"@babel/helper-member-expression-to-functions@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/9d4dcffea45acd255fed4a97e372ada234579f9bae01a4d0ced657091f159edf1635ff2a666508a08f8e59390def09ae6ce8372679faad894aa6f3247728ebe1 + "@babel/traverse": "npm:^7.28.5" + "@babel/types": "npm:^7.28.5" + checksum: 10/05e0857cf7913f03d88ca62952d3888693c21a4f4d7cfc141c630983f71fc0a64393e05cecceb7701dfe98298f7cc38fcb735d892e3c8c6f56f112c85ee1b154 languageName: node linkType: hard -"@babel/plugin-transform-function-name@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-function-name@npm:7.25.9" +"@babel/helper-module-imports@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-imports@npm:7.28.6" dependencies: - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/a8d7c8d019a6eb57eab5ca1be3e3236f175557d55b1f3b11f8ad7999e3fbb1cf37905fd8cb3a349bffb4163a558e9f33b63f631597fdc97c858757deac1b2fd7 + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/64b1380d74425566a3c288074d7ce4dea56d775d2d3325a3d4a6df1dca702916c1d268133b6f385de9ba5b822b3c6e2af5d3b11ac88e5453d5698d77264f0ec0 languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-json-strings@npm:7.24.7" +"@babel/helper-module-transforms@npm:^7.27.1, @babel/helper-module-transforms@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-module-transforms@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@babel/traverse": "npm:^7.28.6" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/5549dc97fc2d429a089d14ccfd51d8b3ba23c39b79edfe6d754e804fb1d50e6a4c070e73550be514a919c4db1553d8e6f7406178d68756b5959afe025a602cb2 + "@babel/core": ^7.0.0 + checksum: 10/2e421c7db743249819ee51e83054952709dc2e197c7d5d415b4bdddc718580195704bfcdf38544b3f674efc2eccd4d29a65d38678fc827ed3934a7690984cd8b languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-json-strings@npm:7.25.9" +"@babel/helper-optimise-call-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/e2498d84761cfd05aaea53799933d55af309c9d6204e66b38778792d171e4d1311ad34f334259a3aa3407dd0446f6bd3e390a1fcb8ce2e42fe5aabed0e41bee1 + "@babel/types": "npm:^7.27.1" + checksum: 10/0fb7ee824a384529d6b74f8a58279f9b56bfe3cce332168067dddeab2552d8eeb56dc8eaf86c04a3a09166a316cb92dfc79c4c623cd034ad4c563952c98b464f languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/bf341a5a0ffb5129670ac9a14ea53b67bd1d3d0e13173ce7ac2d4184c4b405d33f67df68c59a2e94a895bf80269ec1df82c011d9ddb686f9f08a40c37b881177 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.27.1, @babel/helper-plugin-utils@npm:^7.28.6, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.28.6 + resolution: "@babel/helper-plugin-utils@npm:7.28.6" + checksum: 10/21c853bbc13dbdddf03309c9a0477270124ad48989e1ad6524b83e83a77524b333f92edd2caae645c5a7ecf264ec6d04a9ebe15aeb54c7f33c037b71ec521e4a languageName: node linkType: hard -"@babel/plugin-transform-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-literals@npm:7.25.9" +"@babel/helper-remap-async-to-generator@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-remap-async-to-generator@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-wrap-function": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/3cca75823a38aab599bc151b0fa4d816b5e1b62d6e49c156aa90436deb6e13649f5505973151a10418b64f3f9d1c3da53e38a186402e0ed7ad98e482e70c0c14 + "@babel/core": ^7.0.0 + checksum: 10/0747397ba013f87dbf575454a76c18210d61c7c9af0f697546b4bcac670b54ddc156330234407b397f0c948738c304c228e0223039bc45eab4fbf46966a5e8cc languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.24.7" +"@babel/helper-replace-supers@npm:^7.27.1, @babel/helper-replace-supers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helper-replace-supers@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" + "@babel/helper-member-expression-to-functions": "npm:^7.28.5" + "@babel/helper-optimise-call-expression": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.6" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/e39581cf1f9a43330b8340177c618fdb3232deb03faab1937819ef39327660a1fe94fd0ec2f66d1f5b5f98acba68871a77a9931588011c13dded3d7094ecc9de + "@babel/core": ^7.0.0 + checksum: 10/ad2724713a4d983208f509e9607e8f950855f11bd97518a700057eb8bec69d687a8f90dc2da0c3c47281d2e3b79cf1d14ecf1fe3e1ee0a8e90b61aee6759c9a7 languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.25.9" +"@babel/helper-skip-transparent-expression-wrappers@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/8c6febb4ac53852314d28b5e2c23d5dbbff7bf1e57d61f9672e0d97531ef7778b3f0ad698dcf1179f5486e626c77127508916a65eb846a89e98a92f70ed3537b + "@babel/traverse": "npm:^7.27.1" + "@babel/types": "npm:^7.27.1" + checksum: 10/4f380c5d0e0769fa6942a468b0c2d7c8f0c438f941aaa88f785f8752c103631d0904c7b4e76207a3b0e6588b2dec376595370d92ca8f8f1b422c14a69aa146d4 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.24.7" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/837b60ea42fc69a430c8f7fb124247ba009ff6d93187a521fe9f83556fe124715bd46533b1684a3e139f272849a14d1d4faf3397bde13714f99ce0938526ea6f +"@babel/helper-string-parser@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-string-parser@npm:7.27.1" + checksum: 10/0ae29cc2005084abdae2966afdb86ed14d41c9c37db02c3693d5022fba9f5d59b011d039380b8e537c34daf117c549f52b452398f576e908fb9db3c7abbb3a00 languageName: node linkType: hard -"@babel/plugin-transform-member-expression-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-member-expression-literals@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/db92041ae87b8f59f98b50359e0bb172480f6ba22e5e76b13bdfe07122cbf0daa9cd8ad2e78dcb47939938fed88ad57ab5989346f64b3a16953fc73dea3a9b1f +"@babel/helper-validator-identifier@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/helper-validator-identifier@npm:7.28.5" + checksum: 10/8e5d9b0133702cfacc7f368bf792f0f8ac0483794877c6dca5fcb73810ee138e27527701826fb58a40a004f3a5ec0a2f3c3dd5e326d262530b119918f3132ba7 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-amd@npm:7.24.7" - dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/66465ffba49af7a7b7a62995eb58f591ecd23ab42b0c67f8a70020177b3789d2a379bd6cbb68cbd09a69fd75c38a91f5a09ea70f5c8347bf4c6ea81caa0f6c6b +"@babel/helper-validator-option@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/helper-validator-option@npm:7.27.1" + checksum: 10/db73e6a308092531c629ee5de7f0d04390835b21a263be2644276cb27da2384b64676cab9f22cd8d8dbd854c92b1d7d56fc8517cf0070c35d1c14a8c828b0903 languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-amd@npm:7.25.9" +"@babel/helper-wrap-function@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/helper-wrap-function@npm:7.28.6" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/75d34c6e709a23bcfa0e06f722c9a72b1d9ac3e7d72a07ef54a943d32f65f97cbbf0e387d874eb9d9b4c8d33045edfa8e8441d0f8794f3c2b9f1d71b928acf2c + "@babel/template": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/d8a895a75399904746f4127db33593a20021fc55d1a5b5dfeb060b87cc13a8dceea91e70a4951bcd376ba9bd8232b0c04bff9a86c1dab83d691e01852c3b5bcd languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.24.7" +"@babel/helpers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/helpers@npm:7.28.6" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-simple-access": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/9bd10cd03cce138a644f4e671025058348d8ff364253122bed60f9a2a32759445b93e8a6501773491cb19906602b18fd26255df0caac425343a1584599b36b24 + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/213485cdfffc4deb81fc1bf2cefed61bc825049322590ef69690e223faa300a2a4d1e7d806c723bb1f1f538226b9b1b6c356ca94eb47fa7c6d9e9f251ee425e6 languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.25.9, @babel/plugin-transform-modules-commonjs@npm:^7.26.3": - version: 7.26.3 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.26.3" +"@babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/parser@npm:7.29.0" dependencies: - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/f817f02fa04d13f1578f3026239b57f1003bebcf9f9b8d854714bed76a0e4986c79bd6d2e0ac14282c5d309454a8dab683c179709ca753b0152a69c69f3a78e3 + "@babel/types": "npm:^7.29.0" + bin: + parser: ./bin/babel-parser.js + checksum: 10/b1576dca41074997a33ee740d87b330ae2e647f4b7da9e8d2abd3772b18385d303b0cee962b9b88425e0f30d58358dbb8d63792c1a2d005c823d335f6a029747 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.24.7" +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-bugfix-firefox-class-in-computed-class-key@npm:7.28.5" dependencies: - "@babel/helper-hoist-variables": "npm:^7.24.7" - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.5" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/14f0ed1a252a2a04e075cd9051b809e33cd45374a2495dc0a428517893b8e951819acc8343c61d348c51ba54e42660bc93990a77aa3460d16a1c21d52d9c2cf1 + "@babel/core": ^7.0.0 + checksum: 10/750de98b34e6d09b545ded6e635b43cbab02fe319622964175259b98f41b16052e5931c4fbd45bad8cd0a37ebdd381233edecec9ee395b8ec51f47f47d1dbcd4 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.25.9" +"@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-class-field-initializer-scope@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/03145aa89b7c867941a03755216cfb503df6d475a78df84849a157fa5f2fcc17ba114a968d0579ae34e7c61403f35d1ba5d188fdfb9ad05f19354eb7605792f9 + "@babel/core": ^7.0.0 + checksum: 10/eb7f4146dc01f1198ce559a90b077e58b951a07521ec414e3c7d4593bf6c4ab5c2af22242a7e9fec085e20299e0ba6ea97f44a45e84ab148141bf9eb959ad25e languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-modules-umd@npm:7.24.7" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/cef9c8917b3c35c3b6cb424dc2e6f74016122f1d25c196e2c7e51eb080d95e96c5d34966c0d5b9d4e17b8e60d455a97ed271317ed104e0e70bff159830a59678 + "@babel/core": ^7.0.0 + checksum: 10/621cfddfcc99a81e74f8b6f9101fd260b27500cb1a568e3ceae9cc8afe9aee45ac3bca3900a2b66c612b1a2366d29ef67d4df5a1c975be727eaad6906f98c2c6 languageName: node linkType: hard -"@babel/plugin-transform-modules-umd@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-modules-umd@npm:7.25.9" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.27.1" dependencies: - "@babel/helper-module-transforms": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-transform-optional-chaining": "npm:^7.27.1" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/47d03485fedac828832d9fee33b3b982a6db8197e8651ceb5d001890e276150b5a7ee3e9780749e1ba76453c471af907a159108832c24f93453dd45221788e97 + "@babel/core": ^7.13.0 + checksum: 10/f07aa80272bd7a46b7ba11a4644da6c9b6a5a64e848dfaffdad6f02663adefd512e1aaebe664c4dd95f7ed4f80c872c7f8db8d8e34b47aae0930b412a28711a0 languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.24.7" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/b0ecb1afd22946b21fb8f34e826cfbfea4b5337f7592a5ff8af7937eddec4440149c59d2d134b4f21b2ed91b57611f39b19827729e19d99b7c11eaf614435f83 + checksum: 10/9377897aa7cba3a0b78a7c6015799ff71504b2b203329357e42ab3185d44aab07344ba33f5dd53f14d5340c1dc5a2587346343e0859538947bbab0484e72b914 languageName: node linkType: hard -"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" +"@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2": + version: 7.21.0-placeholder-for-preset-env.2 + resolution: "@babel/plugin-proposal-private-property-in-object@npm:7.21.0-placeholder-for-preset-env.2" peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/434346ba05cf74e3f4704b3bdd439287b95cd2a8676afcdc607810b8c38b6f4798cd69c1419726b2e4c7204e62e4a04d31b0360e91ca57a930521c9211e07789 + "@babel/core": ^7.0.0-0 + checksum: 10/fab70f399aa869275690ec6c7cedb4ef361d4e8b6f55c3d7b04bfee61d52fb93c87cec2c65d73cddbaca89fb8ef5ec0921fce675c9169d9d51f18305ab34e78a languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-new-target@npm:7.24.7" +"@babel/plugin-syntax-dynamic-import@npm:^7.8.3": + version: 7.8.3 + resolution: "@babel/plugin-syntax-dynamic-import@npm:7.8.3" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.8.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/91b6a7439b7622f80dc755ddfb9ab083355bedc0b2af18e7c7a948faed14467599609331c8d59cfab4273640e3fc36e4cd02ad5b6dcb4a428f5a8baefc507acc + checksum: 10/ce307af83cf433d4ec42932329fad25fa73138ab39c7436882ea28742e1c0066626d224e0ad2988724c82644e41601cef607b36194f695cb78a1fcdc959637bd languageName: node linkType: hard -"@babel/plugin-transform-new-target@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-new-target@npm:7.25.9" +"@babel/plugin-syntax-import-assertions@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-assertions@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/07bb3a09028ee7b8e8ede6e6390e3b3aecc5cf9adb2fc5475ff58036c552b8a3f8e63d4c43211a60545f3307cdc15919f0e54cb5455d9546daed162dc54ff94e + checksum: 10/25017235e1e2c4ed892aa327a3fa10f4209cc618c6dd7806fc40c07d8d7d24a39743d3d5568b8d1c8f416cffe03c174e78874ded513c9338b07a7ab1dcbab050 languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7" +"@babel/plugin-syntax-import-attributes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/113cd24b6ce4d0a8e54ad9324428244942ce752a3fd38f8b615c3a786641ec18a00a01b662fe4cbebf369358f5904a975bbde0a977b839f2438b16f0d7d1dd36 + checksum: 10/6c8c6a5988dbb9799d6027360d1a5ba64faabf551f2ef11ba4eade0c62253b5c85d44ddc8eb643c74b9acb2bcaa664a950bd5de9a5d4aef291c4f2a48223bb4b languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.26.6": - version: 7.26.6 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.26.6" +"@babel/plugin-syntax-jsx@npm:^7.27.1, @babel/plugin-syntax-jsx@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-jsx@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/3832609f043dd1cd8076ab6a00a201573ef3f95bb2144d57787e4a973b3189884c16b4e77ff8e84a6ca47bc3b65bb7df10dca2f6163dfffc316ac96c37b0b5a6 + checksum: 10/572e38f5c1bb4b8124300e7e3dd13e82ae84a21f90d3f0786c98cd05e63c78ca1f32d1cfe462dfbaf5e7d5102fa7cd8fd741dfe4f3afc2e01a3b2877dcc8c866 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.24.7" +"@babel/plugin-syntax-typescript@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-syntax-typescript@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/dc5bb0534889d207b1da125635471c42da61a4a4e9e68855f24b1cd04ccdcf8325b2c29112e719913c2097242e7e62d660e0fea2a46f3a9a983c9d02a0ec7a04 + checksum: 10/5c55f9c63bd36cf3d7e8db892294c8f85000f9c1526c3a1cc310d47d1e174f5c6f6605e5cc902c4636d885faba7a9f3d5e5edc6b35e4f3b1fd4c2d58d0304fa5 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.25.9" +"@babel/plugin-syntax-unicode-sets-regex@npm:^7.18.6": + version: 7.18.6 + resolution: "@babel/plugin-syntax-unicode-sets-regex@npm:7.18.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.18.6" + "@babel/helper-plugin-utils": "npm:^7.18.6" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0528ef041ed88e8c3f51624ee87b8182a7f246fe4013f0572788e0727d20795b558f2b82e3989b5dd416cbd339500f0d88857de41b6d3b6fdacb1d5344bcc5b1 + "@babel/core": ^7.0.0 + checksum: 10/a651d700fe63ff0ddfd7186f4ebc24447ca734f114433139e3c027bc94a900d013cf1ef2e2db8430425ba542e39ae160c3b05f06b59fd4656273a3df97679e9c languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.24.7" +"@babel/plugin-transform-arrow-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-arrow-functions@npm:7.27.1" dependencies: - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-transform-parameters": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/d586995dc3396bbf8fb75b84f0a3548d923e4c3500bb414641a7fe30762a4ffd82987887fece6381f600d8de2da1e3310fc9a725271724d35f9020fcd5d4b2a3 + checksum: 10/62c2cc0ae2093336b1aa1376741c5ed245c0987d9e4b4c5313da4a38155509a7098b5acce582b6781cc0699381420010da2e3086353344abe0a6a0ec38961eb7 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.25.9" +"@babel/plugin-transform-async-generator-functions@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.29.0" dependencies: - "@babel/helper-compilation-targets": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/plugin-transform-parameters": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" + "@babel/traverse": "npm:^7.29.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/a157ac5af2721090150858f301d9c0a3a0efb8ef66b90fce326d6cc0ae45ab97b6219b3e441bf8d72a2287e95eb04dd6c12544da88ea2345e70b3fac2c0ac9e2 + checksum: 10/e2c064a5eb212cbdf14f7c0113e069b845ca0f0ba431c1cc04607d3fc4f3bf1ed70f5c375fe7c61338a45db88bc1a79d270c8d633ce12256e1fce3666c1e6b93 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-object-super@npm:7.24.7" +"@babel/plugin-transform-async-to-generator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-async-to-generator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-replace-supers": "npm:^7.24.7" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-remap-async-to-generator": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/382739a017972d7126416b958ea81b4b950b6275414908a54bfef6aeed9b9fcc6c8d247db3a1134b09a3b355a60039670ce41ee41c626f8acec70f49c3c8d2a6 + checksum: 10/bca5774263ec01dd2bf71c74bbaf7baa183bf03576636b7826c3346be70c8c8cb15cff549112f2983c36885131a0afde6c443591278c281f733ee17f455aa9b1 languageName: node linkType: hard -"@babel/plugin-transform-object-super@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-object-super@npm:7.25.9" +"@babel/plugin-transform-block-scoped-functions@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-block-scoped-functions@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-replace-supers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1817b5d8b80e451ae1ad9080cca884f4f16df75880a158947df76a2ed8ab404d567a7dce71dd8051ef95f90fbe3513154086a32aba55cc76027f6cbabfbd7f98 + checksum: 10/7fb4988ca80cf1fc8345310d5edfe38e86b3a72a302675cdd09404d5064fe1d1fe1283ebe658ad2b71445ecef857bfb29a748064306b5f6c628e0084759c2201 languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.24.7" +"@babel/plugin-transform-block-scoping@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-block-scoping@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/605ae3764354e83f73c1e6430bac29e308806abcce8d1369cf69e4921771ff3592e8f60ba60c15990070d79b8d8740f0841069d64b466b3ce8a8c43e9743da7e + checksum: 10/7ab8a0856024a5360ba16c3569b739385e939bc5a15ad7d811bec8459361a9aa5ee7c5f154a4e2ce79f5d66779c19464e7532600c31a1b6f681db4eb7e1c7bde languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.25.9" +"@babel/plugin-transform-class-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-properties@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b46a8d1e91829f3db5c252583eb00d05a779b4660abeea5500fda0f8ffa3584fd18299443c22f7fddf0ed9dfdb73c782c43b445dc468d4f89803f2356963b406 + checksum: 10/200f30d44b36a768fa3a8cf690db9e333996af2ad14d9fa1b4c91a427ed9302907873b219b4ce87517ca1014a810eb2e929a6a66be68473f72b546fc64d04fbc languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.7" +"@babel/plugin-transform-class-static-block@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-class-static-block@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/0835caa8fa8561ba5da8edb82aee93aef8e5145eae33e5400569bb4fae879c596cd35d3bfe7519b222261fc370b1291c499870ca6ad9903e1a71cfaaa27a5454 + "@babel/core": ^7.12.0 + checksum: 10/bea7836846deefd02d9976ad1b30b5ade0d6329ecd92866db789dcf6aacfaf900b7a77031e25680f8de5ad636a771a5bdca8961361e6218d45d538ec5d9b71cc languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.25.9" +"@babel/plugin-transform-classes@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-classes@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-replace-supers": "npm:^7.28.6" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/bc838a499fd9892e163b8bc9bfbc4bf0b28cc3232ee0a6406ae078257c8096518f871d09b4a32c11f4a2d6953c3bc1984619ef748f7ad45aed0b0d9689a8eb36 + checksum: 10/9c3278a314d1c4bcda792bb22aced20e30c735557daf9bcc56397c0f3eb54761b21c770219e4581036a10dabda3e597321ed093bc245d5f4d561e19ceff66a6d languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-parameters@npm:7.24.7" +"@babel/plugin-transform-computed-properties@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-computed-properties@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/template": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/41ff6bda926fabfb2e5d90b70621f279330691bed92009297340a8e776cfe9c3f2dda6afbc31dd3cbdccdfa9a5c57f2046e3ccc84f963c3797356df003d1703a + checksum: 10/4a5e270f7e1f1e9787cf7cf133d48e3c1e38eb935d29a90331a1324d7c720f589b7b626b2e6485cd5521a7a13f2dbdc89a3e46ecbe7213d5bbb631175267c4aa languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-parameters@npm:7.25.9" +"@babel/plugin-transform-destructuring@npm:^7.28.5": + version: 7.28.5 + resolution: "@babel/plugin-transform-destructuring@npm:7.28.5" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/014009a1763deb41fe9f0dbca2c4489ce0ac83dd87395f488492e8eb52399f6c883d5bd591bae3b8836f2460c3937fcebd07e57dce1e0bfe30cdbc63fdfc9d3a + checksum: 10/9cc67d3377bc5d8063599f2eb4588f5f9a8ab3abc9b64a40c24501fb3c1f91f4d5cf281ea9f208fd6b2ef8d9d8b018dacf1bed9493334577c966cd32370a7036 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-private-methods@npm:7.24.7" +"@babel/plugin-transform-dotall-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-dotall-regex@npm:7.28.6" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5338df2aae53c43e6a7ea0c44f20a1100709778769c7e42d4901a61945c3200ba0e7fca83832f48932423a68528219fbea233cb5b8741a2501fdecbacdc08292 + checksum: 10/866ffbbdee77fa955063b37c75593db8dbbe46b1ebb64cc788ea437e3a9aa41cb7b9afcee617c678a32b6705baa0892ec8e5d4b8af3bbb0ab1b254514ccdbd37 languageName: node linkType: hard -"@babel/plugin-transform-private-methods@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-methods@npm:7.25.9" +"@babel/plugin-transform-duplicate-keys@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-duplicate-keys@npm:7.27.1" dependencies: - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6e3671b352c267847c53a170a1937210fa8151764d70d25005e711ef9b21969aaf422acc14f9f7fb86bc0e4ec43e7aefcc0ad9196ae02d262ec10f509f126a58 + checksum: 10/987b718d2fab7626f61b72325c8121ead42341d6f46ad3a9b5e5f67f3ec558c903f1b8336277ffc43caac504ce00dd23a5456b5d1da23913333e1da77751f08d languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.24.7" +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-duplicate-named-capturing-groups-regex@npm:7.29.0" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/a23ee18340818e292abfcb98b1086a188c81d640b1045e6809e9a3e8add78f9cb26607774de4ed653cbecd4277965dc4f4f1affc3504682209bb2a65fd4251f8 + "@babel/core": ^7.0.0 + checksum: 10/7fa7b773259a578c9e01c80946f75ecc074520064aa7a87a65db06c7df70766e2fa6be78cda55fa9418a14e30b2b9d595484a46db48074d495d9f877a4276065 languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.25.9" +"@babel/plugin-transform-dynamic-import@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/aa45bb5669b610afa763d774a4b5583bb60ce7d38e4fd2dedfd0703e73e25aa560e6c6124e155aa90b101601743b127d9e5d3eb00989a7e4b4ab9c2eb88475ba + checksum: 10/7a9fbc8d17148b7f11a1d1ca3990d2c2cd44bd08a45dcaf14f20a017721235b9044b20e6168b6940282bb1b48fb78e6afbdfb9dd9d82fde614e15baa7d579932 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-property-literals@npm:7.24.7" +"@babel/plugin-transform-explicit-resource-management@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-explicit-resource-management@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/71708890fe007d45ad7a130150a2ba1fea0205f575b925ca2e1bb65018730636a68e65c634a474e5b658378d72871c337c953560009c081a645e088769bf168a + checksum: 10/36d638a253dbdaee5548b4ddd21c04ee4e39914b207437bb64cf79bb41c2caadb4321768d3dba308c1016702649bc44efe751e2052de393004563c7376210d86 languageName: node linkType: hard -"@babel/plugin-transform-property-literals@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-property-literals@npm:7.25.9" +"@babel/plugin-transform-exponentiation-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-exponentiation-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/436046ab07d54a9b44a384eeffec701d4e959a37a7547dda72e069e751ca7ff753d1782a8339e354b97c78a868b49ea97bf41bf5a44c6d7a3c0a05ad40eeb49c + checksum: 10/b232152499370435c7cd4bf3321f58e189150e35ca3722ea16533d33434b97294df1342f5499671ec48e62b71c34cdea0ca8cf317ad12594a10f6fc670315e62 languageName: node linkType: hard -"@babel/plugin-transform-react-constant-elements@npm:^7.21.3": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-constant-elements@npm:7.24.7" +"@babel/plugin-transform-export-namespace-from@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f0e103192056c34c222d42379fc772a652e20ca89bea49f74ae1708ca0254fd1dc33b7d0dc8bd77bf2c71ed64ac7d63a3b12b6971a6cb290ee6719567cfb9a52 + checksum: 10/85082923eca317094f08f4953d8ea2a6558b3117826c0b740676983902b7236df1f4213ad844cb38c2dae104753dbe8f1cc51f01567835d476d32f5f544a4385 languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-display-name@npm:7.24.7" +"@babel/plugin-transform-for-of@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-for-of@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f5d34903680ca358c5a3ccb83421df259e5142be95dde51dc4a62ec79fd6558599b3b92b4afd37329d2567a4ba4c338f1c817f8ce0c56ddf20cd3d051498649e + checksum: 10/705c591d17ef263c309bba8c38e20655e8e74ff7fd21883a9cdaf5bf1df42d724383ad3d88ac01f42926e15b1e1e66f2f7f8c4e87de955afffa290d52314b019 languageName: node linkType: hard -"@babel/plugin-transform-react-display-name@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-display-name@npm:7.25.9" +"@babel/plugin-transform-function-name@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-function-name@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/traverse": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/dc7affde0ed98e40f629ee92a2fc44fbd8008aabda1ddb3f5bd2632699d3289b08dff65b26cf3b89dab46397ec440f453d19856bbb3a9a83df5b4ac6157c5c39 + checksum: 10/26a2a183c3c52a96495967420a64afc5a09f743a230272a131668abf23001e393afa6371e6f8e6c60f4182bea210ed31d1caf866452d91009c1daac345a52f23 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.24.7" +"@babel/plugin-transform-json-strings@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-json-strings@npm:7.28.6" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/5a158803ad71ed7c434ad047755eb98feb2c428800163ff0be1351dc06ecdd19ab503cb6a1fda8708b05decde3a9297499eb0954317af79f191b4d45135af2a2 + checksum: 10/69d82a1a0a72ed6e6f7969e09cf330516599d79b2b4e680e9dd3c57616a8c6af049b5103456e370ab56642815e80e46ed88bb81e9e059304a85c5fe0bf137c29 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-development@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.9" +"@babel/plugin-transform-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-literals@npm:7.27.1" dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/537d38369537f1eb56041c4b770bc0733fde1801a7f5ffef40a1217ea448f33ee2fa8e6098a58a82fd00e432c1b9426a66849496da419020c9eca3b1b1a23779 + checksum: 10/0a76d12ab19f32dd139964aea7da48cecdb7de0b75e207e576f0f700121fe92367d788f328bf4fb44b8261a0f605c97b44e62ae61cddbb67b14e94c88b411f95 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-jsx@npm:7.24.7" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-jsx": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/422952e034aefdb837ebe6c2f1f5bb1e0dc4d5e515e9cc46fe752785c7039481fc7470af254e26e253f641f055240ac2968f0d25cc30ae6580c977142a7c471c + checksum: 10/36095d5d1cfc680e95298b5389a16016da800ae3379b130dabf557e94652c47b06610407e9fa44aaa03e9b0a5aa7b4b93348123985d44a45e369bf5f3497d149 languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" +"@babel/plugin-transform-member-expression-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-member-expression-literals@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/plugin-syntax-jsx": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/eb179ecdf0ae19aed254105cf78fbac35f9983f51ed04b7b67c863a4820a70a879bd5da250ac518321f86df20eac010e53e3411c8750c386d51da30e4814bfb6 + checksum: 10/804121430a6dcd431e6ffe99c6d1fbbc44b43478113b79c677629e7f877b4f78a06b69c6bfb2747fd84ee91879fe2eb32e4620b53124603086cf5b727593ebe8 languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.24.7" +"@babel/plugin-transform-modules-amd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-amd@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c5110fa6088be5c4ac6d0f716cd032d30a246f371948b2ef30beb9eac187550ccbf972aa02051e780321917e1d9d85325623f68742c91e0355d238a8f5422179 + checksum: 10/5ca9257981f2bbddd9dccf9126f1368de1cb335e7a5ff5cca9282266825af5b18b5f06c144320dcf5d2a200d2b53b6d22d9b801a55dc0509ab5a5838af7e61b7 languageName: node linkType: hard -"@babel/plugin-transform-react-pure-annotations@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.25.9" +"@babel/plugin-transform-modules-commonjs@npm:^7.27.1, @babel/plugin-transform-modules-commonjs@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.28.6" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/9995c0fc7c25d3aaaa0ce84233de02eab2564ea111d0813ec5baa538eb21520402879cc787ad1ad4c2061b99cebc3beb09910e64c9592e8ccb42ae62d9e4fd9a + checksum: 10/ec6ea2958e778a7e0220f4a75cb5816cecddc6bd98efa10499fff7baabaa29a594d50d787a4ebf8a8ba66fefcf76ca2ded602be0b4554ae3317e53b3b3375b37 languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-regenerator@npm:7.24.7" +"@babel/plugin-transform-modules-systemjs@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.29.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - regenerator-transform: "npm:^0.15.2" + "@babel/helper-module-transforms": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-validator-identifier": "npm:^7.28.5" + "@babel/traverse": "npm:^7.29.0" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/70fa2bb36d3e2ce69a25c7227da8ad92307ab7b50cb6dfcc4dc5ce8f1cc79b0fcf997292a1cb3b4ae7cb136f515d1b2c3fb78c927bdba8d719794430403eb0c6 + checksum: 10/b3e64728eef02d829510778226da4c06be740fe52e0d45d4aa68b24083096d8ad7df67f2e9e67198b2e85f3237d42bd66f5771f85846f7a746105d05ca2e0cae languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-regenerator@npm:7.25.9" +"@babel/plugin-transform-modules-umd@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-modules-umd@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - regenerator-transform: "npm:^0.15.2" + "@babel/helper-module-transforms": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/1c09e8087b476c5967282c9790fb8710e065eda77c60f6cb5da541edd59ded9d003d96f8ef640928faab4a0b35bf997673499a194973da4f0c97f0935807a482 + checksum: 10/7388932863b4ee01f177eb6c2e2df9e2312005e43ada99897624d5565db4b9cef1e30aa7ad2c79bbe5373f284cfcddea98d8fe212714a24c6aba223272163058 languageName: node linkType: hard -"@babel/plugin-transform-regexp-modifiers@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.26.0" +"@babel/plugin-transform-named-capturing-groups-regex@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-named-capturing-groups-regex@npm:7.29.0" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0 - checksum: 10/726deca486bbd4b176f8a966eb0f4aabc19d9def3b8dabb8b3a656778eca0df1fda3f3c92b213aa5a184232fdafd5b7bd73b4e24ca4345c498ef6baff2bda4e1 + checksum: 10/ed8c27699ca82a6c01cbfd39f3de16b90cfea4f8146a358057f76df290d308a66a8bd2e6734e6a87f68c18576e15d2d70548a84cd474d26fdf256c3f5ae44d8c languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-reserved-words@npm:7.24.7" +"@babel/plugin-transform-new-target@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-new-target@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/64a2669671bb97c3dee3830a82c3e932fe6e02d56a4053c6ee4453d317b5f436d3d44907fbb0f4fbd8a56ebee34f6aee250e49743b7243d14d00c069215f3113 + checksum: 10/620d78ee476ae70960989e477dc86031ffa3d554b1b1999e6ec95261629f7a13e5a7b98579c63a009f9fdf14def027db57de1f0ae1f06fb6eaed8908ff65cf68 languageName: node linkType: hard -"@babel/plugin-transform-reserved-words@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-reserved-words@npm:7.25.9" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/8beda04481b25767acbd1f6b9ef7b3a9c12fbd9dcb24df45a6ad120e1dc4b247c073db60ac742f9093657d6d8c050501fc0606af042f81a3bb6a3ff862cddc47 - languageName: node - linkType: hard - -"@babel/plugin-transform-runtime@npm:^7.25.9": - version: 7.26.9 - resolution: "@babel/plugin-transform-runtime@npm:7.26.9" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.26.5" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.6" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - semver: "npm:^6.3.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7893c3501474ef19af778d02c711edc511b82df2cd4500c575f1c61565026253b024a6c9868808ea8fc3c67168e3c8bfda3b943b0d3ac3e870ada5a2dff4a77a + checksum: 10/88106952ca4f4fea8f97222a25f9595c6859d458d76905845dfa54f54e7d345e3dc338932e8c84a9c57a6c88b2f6d9ebff47130ce508a49c2b6e6a9f03858750 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7" +"@babel/plugin-transform-numeric-separator@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c68c2be965007e0cb6667daa209bc0af877cab4b327ef2e21b2114c38554243c3f7fdcc5b03679b20f72a26d966aa646af771f3165c882067e85a3887647f028 + checksum: 10/4b5ca60e481e22f0842761a3badca17376a230b5a7e5482338604eb95836c2d0c9c9bde53bdc5c2de1c6a12ae6c12de7464d098bf74b0943f85905ca358f0b68 languageName: node linkType: hard -"@babel/plugin-transform-shorthand-properties@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-shorthand-properties@npm:7.25.9" +"@babel/plugin-transform-object-rest-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" + "@babel/plugin-transform-parameters": "npm:^7.27.7" + "@babel/traverse": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f774995d58d4e3a992b732cf3a9b8823552d471040e280264dd15e0735433d51b468fef04d75853d061309389c66bda10ce1b298297ce83999220eb0ad62741d + checksum: 10/9c8c51a515a5ec98a33a715e82d49f873e58b04b53fa1e826f3c2009f7133cd396d6730553a53d265e096dbfbea17dd100ae38815d0b506c094cb316a7a5519e languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-spread@npm:7.24.7" +"@babel/plugin-transform-object-super@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-object-super@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-replace-supers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/76e2c8544129d727d5a698e2a67d74e438bc35df843adb5f769316ec432c5e1bbb4128123a95b2fe8ef0aec7b26d87efe81d64326291c77ad757ff184d38448a + checksum: 10/46b819cb9a6cd3cfefe42d07875fee414f18d5e66040366ae856116db560ad4e16f3899a0a7fddd6773e0d1458444f94b208b67c0e3b6977a27ea17a5c13dbf6 languageName: node linkType: hard -"@babel/plugin-transform-spread@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-spread@npm:7.25.9" +"@babel/plugin-transform-optional-catch-binding@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/fe72c6545267176cdc9b6f32f30f9ced37c1cafa1290e4436b83b8f377b4f1c175dad404228c96e3efdec75da692f15bfb9db2108fcd9ad260bc9968778ee41e + checksum: 10/ee24a17defec056eb9ef01824d7e4a1f65d531af6b4b79acfd0bcb95ce0b47926e80c61897f36f8c01ce733b069c9acdb1c9ce5ec07a729d0dbf9e8d859fe992 languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.24.7" +"@babel/plugin-transform-optional-chaining@npm:^7.27.1, @babel/plugin-transform-optional-chaining@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/3b9a99ae043ef363c81bfb097fa7a553fcf7c7d9fddc13dd2b47b3b2e45cf2741a9ca78cfe55f463983b043b365f0f8452f2d5eaadbdea20e6d6de50c16bed25 + checksum: 10/c7cf29f99384a9a98748f04489a122c0106e0316aa64a2e61ef8af74c1057b587b96d9a08eb4e33d2ac17d1aaff1f0a86fae658d429fa7bcce4ef977e0ad684b languageName: node linkType: hard -"@babel/plugin-transform-sticky-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-sticky-regex@npm:7.25.9" +"@babel/plugin-transform-parameters@npm:^7.27.7": + version: 7.27.7 + resolution: "@babel/plugin-transform-parameters@npm:7.27.7" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/7454b00844dbe924030dd15e2b3615b36e196500c4c47e98dabc6b37a054c5b1038ecd437e910aabf0e43bf56b973cb148d3437d50f6e2332d8309568e3e979b + checksum: 10/ba0aa8c977a03bf83030668f64c1d721e4e82d8cce89cdde75a2755862b79dbe9e7f58ca955e68c721fd494d6ee3826e46efad3fbf0855fcc92cb269477b4777 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-template-literals@npm:7.24.7" +"@babel/plugin-transform-private-methods@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-methods@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/ecf05a8511176d5570cb0d481577a407a4e8a9a430f86522d809e0ac2c823913e854ef9e2a1c83c0bd7c12489d82e1b48fabb52e697e80d6a6962125197593ca + checksum: 10/b80179b28f6a165674d0b0d6c6349b13a01dd282b18f56933423c0a33c23fc0626c8f011f859fc20737d021fe966eb8474a5233e4596401482e9ee7fb00e2aa2 languageName: node linkType: hard -"@babel/plugin-transform-template-literals@npm:^7.26.8": - version: 7.26.8 - resolution: "@babel/plugin-transform-template-literals@npm:7.26.8" +"@babel/plugin-transform-private-property-in-object@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/65874c8844ce906507cd5b9c78950d6173f8339b6416a2a9e763021db5a7045315a6f0e58976ec4af5e960c003ef322576c105130a644addb8f94d1a0821a972 + checksum: 10/d02008c62fd32ff747b850b8581ab5076b717320e1cb01c7fc66ebf5169095bd922e18cfb269992f85bc7fbd2cc61e5b5af25e2b54aad67411474b789ea94d5f languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.24.7" +"@babel/plugin-transform-property-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-property-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c07847a3bcb27509d392de7a59b9836669b90ca508d4b63b36bb73b63413bc0b2571a64410b65999a73abeac99957b31053225877dcbfaf4eb21d8cc0ae4002f + checksum: 10/7caec27d5ed8870895c9faf4f71def72745d69da0d8e77903146a4e135fd7bed5778f5f9cebb36c5fba86338e6194dd67a08c033fc84b4299b7eceab6d9630cb languageName: node linkType: hard -"@babel/plugin-transform-typeof-symbol@npm:^7.26.7": - version: 7.26.7 - resolution: "@babel/plugin-transform-typeof-symbol@npm:7.26.7" +"@babel/plugin-transform-react-constant-elements@npm:^7.21.3": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-constant-elements@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.26.5" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c4ed244c9f252f941f4dff4b6ad06f6d6f5860e9aa5a6cccb5725ead670f2dab58bba4bad9c2b7bd25685e5205fde810857df964d417072c5c282bbfa4f6bf7a + checksum: 10/906ea336502a42ca942f492f386111db4041c28c08f9dcc63eb816b75a1a96121505c1522c5e721dd192bf42a244799b78a8991e4abbf3fa17748dac1b6f142e languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-typescript@npm:7.24.7" +"@babel/plugin-transform-react-display-name@npm:^7.28.0": + version: 7.28.0 + resolution: "@babel/plugin-transform-react-display-name@npm:7.28.0" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.24.7" - "@babel/helper-create-class-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/plugin-syntax-typescript": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6a4af5a96a90f08ea679829abc558b8478b8b31b40c84b887f2859110b75ab2c8c48a2cf80193621d988a6b064aefef2a74ea3ccc310166219f87959d06a3033 + checksum: 10/d623644a078086f410b1952429d82c10e2833ebffb97800b25f55ab7f3ffafde34e57a4a71958da73f4abfcef39b598e2ca172f2b43531f98b3f12e0de17c219 languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.25.9": - version: 7.26.8 - resolution: "@babel/plugin-transform-typescript@npm:7.26.8" +"@babel/plugin-transform-react-jsx-development@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-jsx-development@npm:7.27.1" dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-create-class-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.25.9" - "@babel/plugin-syntax-typescript": "npm:^7.25.9" + "@babel/plugin-transform-react-jsx": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/42741f21aad5b9182f9d05bdef4a04e422f4dbff1c9f9cd16e3d07de985510da024b58d86d2de88d9c3534bc4f1404a288f02d4f7b8e720e757664846a88a83b + checksum: 10/b88865d5b8c018992f2332da939faa15c4d4a864c9435a5937beaff3fe43781432cc42e0a5d5631098e0bd4066fc33f5fa72203b388b074c3545fe7aaa21e474 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.24.7" +"@babel/plugin-transform-react-jsx@npm:^7.27.1": + version: 7.28.6 + resolution: "@babel/plugin-transform-react-jsx@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/plugin-syntax-jsx": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/6b8bca3495acedc89e880942de7b83c263fb5b4c9599594dcf3923e2128ae25f1f4725a295fe101027f75d8ef081ef28319296adf274b5022e57039e42836103 + checksum: 10/c6eade7309f0710b6aac9e747f8c3305633801c035a35efc5e2436742cc466e457ed5848d3dd5dade36e34332cfc50ac92d69a33f7803d66ae2d72f13a76c3bc languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.25.9" +"@babel/plugin-transform-react-pure-annotations@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-react-pure-annotations@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/f138cbee539963fb3da13f684e6f33c9f7495220369ae12a682b358f1e25ac68936825562c38eae87f01ac9992b2129208b35ec18533567fc805ce5ed0ffd775 + checksum: 10/a6f591c5e85a1ab0685d4a25afe591fe8d11dc0b73c677cf9560ff8d540d036a1cce9efcb729fc9092def4d854dc304ffdc063a89a9247900b69c516bf971a4c languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.24.7" +"@babel/plugin-transform-regenerator@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/plugin-transform-regenerator@npm:7.29.0" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/c0c284bbbdead7e17e059d72e1b288f86b0baacc410398ef6c6c703fe4326b069e68515ccb84359601315cd8e888f9226731d00624b7c6959b1c0853f072b61f + checksum: 10/c8fa9da74371568c5d34fd7d53de018752550cb10334040ca59e41f34b27f127974bdc5b4d1a1a8e8f3ebcf3cb7f650aa3f2df3b7bf1b7edf67c04493b9e3cb8 languageName: node linkType: hard -"@babel/plugin-transform-unicode-property-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.25.9" +"@babel/plugin-transform-regexp-modifiers@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-regexp-modifiers@npm:7.28.6" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10/201f6f46c1beb399e79aa208b94c5d54412047511795ce1e790edcd189cef73752e6a099fdfc01b3ad12205f139ae344143b62f21f44bbe02338a95e8506a911 + "@babel/core": ^7.0.0 + checksum: 10/5aacc570034c085afa0165137bb9a04cd4299b86eb9092933a96dcc1132c8f591d9d534419988f5f762b2f70d43a3c719a6b8fa05fdd3b2b1820d01cf85500da languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7" +"@babel/plugin-transform-reserved-words@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-reserved-words@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/b545310d0d592d75566b9cd158f4b8951e34d07d839656789d179b39b3fd92b32bd387cdfaf33a93e636609f3bfb9bb03d41f3e43be598116c9c6c80cc3418c4 + checksum: 10/dea0b66742d2863b369c06c053e11e15ba785892ea19cccf7aef3c1bdaa38b6ab082e19984c5ea7810d275d9445c5400fcc385ad71ce707ed9256fadb102af3b languageName: node linkType: hard -"@babel/plugin-transform-unicode-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-regex@npm:7.25.9" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" +"@babel/plugin-transform-runtime@npm:^7.25.9": + version: 7.29.0 + resolution: "@babel/plugin-transform-runtime@npm:7.29.0" + dependencies: + "@babel/helper-module-imports": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + babel-plugin-polyfill-corejs2: "npm:^0.4.14" + babel-plugin-polyfill-corejs3: "npm:^0.13.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.5" + semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e8baae867526e179467c6ef5280d70390fa7388f8763a19a27c21302dd59b121032568be080749514b097097ceb9af716bf4b90638f1b3cf689aa837ba20150f - languageName: node - linkType: hard - -"@babel/plugin-transform-unicode-sets-regex@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.24.7" - dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/183b72d5987dc93f9971667ce3f26d28b0e1058e71b129733dd9d5282aecba4c062b67c9567526780d2defd2bfbf950ca58d8306dc90b2761fd1e960d867ddb7 + checksum: 10/314cfede923a7fb3aeecf4b282a3090e4a9ae1d84005e9a0365284c5142165a4dccd308455af9013d486a4ad8ada25ccad2fea28c2ec19b086d1ffa0088a69d7 languageName: node linkType: hard -"@babel/plugin-transform-unicode-sets-regex@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.25.9" +"@babel/plugin-transform-shorthand-properties@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-shorthand-properties@npm:7.27.1" dependencies: - "@babel/helper-create-regexp-features-plugin": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/4445ef20de687cb4dcc95169742a8d9013d680aa5eee9186d8e25875bbfa7ee5e2de26a91177ccf70b1db518e36886abcd44750d28db5d7a9539f0efa6839f4b + "@babel/core": ^7.0.0-0 + checksum: 10/fbba6e2aef0b69681acb68202aa249c0598e470cc0853d7ff5bd0171fd6a7ec31d77cfabcce9df6360fc8349eded7e4a65218c32551bd3fc0caaa1ac899ac6d4 languageName: node linkType: hard -"@babel/preset-env@npm:^7.20.2": - version: 7.24.7 - resolution: "@babel/preset-env@npm:7.24.7" +"@babel/plugin-transform-spread@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-spread@npm:7.28.6" dependencies: - "@babel/compat-data": "npm:^7.24.7" - "@babel/helper-compilation-targets": "npm:^7.24.7" - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.24.7" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.24.7" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.24.7" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.24.7" - "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators": "npm:^7.8.4" - "@babel/plugin-syntax-class-properties": "npm:^7.12.13" - "@babel/plugin-syntax-class-static-block": "npm:^7.14.5" - "@babel/plugin-syntax-dynamic-import": "npm:^7.8.3" - "@babel/plugin-syntax-export-namespace-from": "npm:^7.8.3" - "@babel/plugin-syntax-import-assertions": "npm:^7.24.7" - "@babel/plugin-syntax-import-attributes": "npm:^7.24.7" - "@babel/plugin-syntax-import-meta": "npm:^7.10.4" - "@babel/plugin-syntax-json-strings": "npm:^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators": "npm:^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3" - "@babel/plugin-syntax-numeric-separator": "npm:^7.10.4" - "@babel/plugin-syntax-object-rest-spread": "npm:^7.8.3" - "@babel/plugin-syntax-optional-catch-binding": "npm:^7.8.3" - "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3" - "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" - "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.24.7" - "@babel/plugin-transform-async-generator-functions": "npm:^7.24.7" - "@babel/plugin-transform-async-to-generator": "npm:^7.24.7" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.24.7" - "@babel/plugin-transform-block-scoping": "npm:^7.24.7" - "@babel/plugin-transform-class-properties": "npm:^7.24.7" - "@babel/plugin-transform-class-static-block": "npm:^7.24.7" - "@babel/plugin-transform-classes": "npm:^7.24.7" - "@babel/plugin-transform-computed-properties": "npm:^7.24.7" - "@babel/plugin-transform-destructuring": "npm:^7.24.7" - "@babel/plugin-transform-dotall-regex": "npm:^7.24.7" - "@babel/plugin-transform-duplicate-keys": "npm:^7.24.7" - "@babel/plugin-transform-dynamic-import": "npm:^7.24.7" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.24.7" - "@babel/plugin-transform-export-namespace-from": "npm:^7.24.7" - "@babel/plugin-transform-for-of": "npm:^7.24.7" - "@babel/plugin-transform-function-name": "npm:^7.24.7" - "@babel/plugin-transform-json-strings": "npm:^7.24.7" - "@babel/plugin-transform-literals": "npm:^7.24.7" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.24.7" - "@babel/plugin-transform-member-expression-literals": "npm:^7.24.7" - "@babel/plugin-transform-modules-amd": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" - "@babel/plugin-transform-modules-systemjs": "npm:^7.24.7" - "@babel/plugin-transform-modules-umd": "npm:^7.24.7" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.24.7" - "@babel/plugin-transform-new-target": "npm:^7.24.7" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.24.7" - "@babel/plugin-transform-numeric-separator": "npm:^7.24.7" - "@babel/plugin-transform-object-rest-spread": "npm:^7.24.7" - "@babel/plugin-transform-object-super": "npm:^7.24.7" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.24.7" - "@babel/plugin-transform-optional-chaining": "npm:^7.24.7" - "@babel/plugin-transform-parameters": "npm:^7.24.7" - "@babel/plugin-transform-private-methods": "npm:^7.24.7" - "@babel/plugin-transform-private-property-in-object": "npm:^7.24.7" - "@babel/plugin-transform-property-literals": "npm:^7.24.7" - "@babel/plugin-transform-regenerator": "npm:^7.24.7" - "@babel/plugin-transform-reserved-words": "npm:^7.24.7" - "@babel/plugin-transform-shorthand-properties": "npm:^7.24.7" - "@babel/plugin-transform-spread": "npm:^7.24.7" - "@babel/plugin-transform-sticky-regex": "npm:^7.24.7" - "@babel/plugin-transform-template-literals": "npm:^7.24.7" - "@babel/plugin-transform-typeof-symbol": "npm:^7.24.7" - "@babel/plugin-transform-unicode-escapes": "npm:^7.24.7" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-regex": "npm:^7.24.7" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.24.7" - "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.10.4" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.31.0" - semver: "npm:^6.3.1" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/2fd90c46efefadb48dae6d13de190ac48753af187ee394924cf532c79870ebb87658bd31f06649630827a478b17a4adc41717cc6d4c460ff2ed9fafa51e5b515 + checksum: 10/1fa02ac60ae5e49d46fa2966aaf3f7578cf37255534c2ecf379d65855088a1623c3eea28b9ee6a0b1413b0199b51f9019d0da3fe9da89986bc47e07242415f60 languageName: node linkType: hard -"@babel/preset-env@npm:^7.25.9": - version: 7.26.9 - resolution: "@babel/preset-env@npm:7.26.9" +"@babel/plugin-transform-sticky-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-sticky-regex@npm:7.27.1" dependencies: - "@babel/compat-data": "npm:^7.26.8" - "@babel/helper-compilation-targets": "npm:^7.26.5" - "@babel/helper-plugin-utils": "npm:^7.26.5" - "@babel/helper-validator-option": "npm:^7.25.9" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.25.9" - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.25.9" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.25.9" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.25.9" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.25.9" - "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions": "npm:^7.26.0" - "@babel/plugin-syntax-import-attributes": "npm:^7.26.0" - "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" - "@babel/plugin-transform-arrow-functions": "npm:^7.25.9" - "@babel/plugin-transform-async-generator-functions": "npm:^7.26.8" - "@babel/plugin-transform-async-to-generator": "npm:^7.25.9" - "@babel/plugin-transform-block-scoped-functions": "npm:^7.26.5" - "@babel/plugin-transform-block-scoping": "npm:^7.25.9" - "@babel/plugin-transform-class-properties": "npm:^7.25.9" - "@babel/plugin-transform-class-static-block": "npm:^7.26.0" - "@babel/plugin-transform-classes": "npm:^7.25.9" - "@babel/plugin-transform-computed-properties": "npm:^7.25.9" - "@babel/plugin-transform-destructuring": "npm:^7.25.9" - "@babel/plugin-transform-dotall-regex": "npm:^7.25.9" - "@babel/plugin-transform-duplicate-keys": "npm:^7.25.9" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.25.9" - "@babel/plugin-transform-dynamic-import": "npm:^7.25.9" - "@babel/plugin-transform-exponentiation-operator": "npm:^7.26.3" - "@babel/plugin-transform-export-namespace-from": "npm:^7.25.9" - "@babel/plugin-transform-for-of": "npm:^7.26.9" - "@babel/plugin-transform-function-name": "npm:^7.25.9" - "@babel/plugin-transform-json-strings": "npm:^7.25.9" - "@babel/plugin-transform-literals": "npm:^7.25.9" - "@babel/plugin-transform-logical-assignment-operators": "npm:^7.25.9" - "@babel/plugin-transform-member-expression-literals": "npm:^7.25.9" - "@babel/plugin-transform-modules-amd": "npm:^7.25.9" - "@babel/plugin-transform-modules-commonjs": "npm:^7.26.3" - "@babel/plugin-transform-modules-systemjs": "npm:^7.25.9" - "@babel/plugin-transform-modules-umd": "npm:^7.25.9" - "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.25.9" - "@babel/plugin-transform-new-target": "npm:^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.26.6" - "@babel/plugin-transform-numeric-separator": "npm:^7.25.9" - "@babel/plugin-transform-object-rest-spread": "npm:^7.25.9" - "@babel/plugin-transform-object-super": "npm:^7.25.9" - "@babel/plugin-transform-optional-catch-binding": "npm:^7.25.9" - "@babel/plugin-transform-optional-chaining": "npm:^7.25.9" - "@babel/plugin-transform-parameters": "npm:^7.25.9" - "@babel/plugin-transform-private-methods": "npm:^7.25.9" - "@babel/plugin-transform-private-property-in-object": "npm:^7.25.9" - "@babel/plugin-transform-property-literals": "npm:^7.25.9" - "@babel/plugin-transform-regenerator": "npm:^7.25.9" - "@babel/plugin-transform-regexp-modifiers": "npm:^7.26.0" - "@babel/plugin-transform-reserved-words": "npm:^7.25.9" - "@babel/plugin-transform-shorthand-properties": "npm:^7.25.9" - "@babel/plugin-transform-spread": "npm:^7.25.9" - "@babel/plugin-transform-sticky-regex": "npm:^7.25.9" - "@babel/plugin-transform-template-literals": "npm:^7.26.8" - "@babel/plugin-transform-typeof-symbol": "npm:^7.26.7" - "@babel/plugin-transform-unicode-escapes": "npm:^7.25.9" - "@babel/plugin-transform-unicode-property-regex": "npm:^7.25.9" - "@babel/plugin-transform-unicode-regex": "npm:^7.25.9" - "@babel/plugin-transform-unicode-sets-regex": "npm:^7.25.9" - "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.10" - babel-plugin-polyfill-corejs3: "npm:^0.11.0" - babel-plugin-polyfill-regenerator: "npm:^0.6.1" - core-js-compat: "npm:^3.40.0" - semver: "npm:^6.3.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/ac6fad331760c0bc25ed428b7696b297bad7046a75f30e544b392acfb33709f12316b9a5b0c8606f933d5756e1b9d527b46fda09693db52e851325443dd6a574 + checksum: 10/e1414a502efba92c7974681767e365a8cda6c5e9e5f33472a9eaa0ce2e75cea0a9bef881ff8dda37c7810ad902f98d3c00ead92a3ac3b73a79d011df85b5a189 languageName: node linkType: hard -"@babel/preset-modules@npm:0.1.6-no-external-plugins": - version: 0.1.6-no-external-plugins - resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" +"@babel/plugin-transform-template-literals@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-template-literals@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.0.0" - "@babel/types": "npm:^7.4.4" - esutils: "npm:^2.0.2" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: - "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 - checksum: 10/039aba98a697b920d6440c622aaa6104bb6076d65356b29dad4b3e6627ec0354da44f9621bafbeefd052cd4ac4d7f88c9a2ab094efcb50963cb352781d0c6428 + "@babel/core": ^7.0.0-0 + checksum: 10/93aad782503b691faef7c0893372d5243df3219b07f1f22cfc32c104af6a2e7acd6102c128439eab15336d048f1b214ca134b87b0630d8cd568bf447f78b25ce languageName: node linkType: hard -"@babel/preset-react@npm:^7.18.6": - version: 7.24.7 - resolution: "@babel/preset-react@npm:7.24.7" +"@babel/plugin-transform-typeof-symbol@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-typeof-symbol@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - "@babel/plugin-transform-react-display-name": "npm:^7.24.7" - "@babel/plugin-transform-react-jsx": "npm:^7.24.7" - "@babel/plugin-transform-react-jsx-development": "npm:^7.24.7" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/e861e6b923e8eacb01c2e931310b4a5b2ae2514a089a37390051700d1103ab87003f2abc0b389a12db7be24971dd8eaabee794b799d3e854cb0c22ba07a33100 + checksum: 10/812d736402a6f9313b86b8adf36740394400be7a09c48e51ee45ab4a383a3f46fc618d656dd12e44934665e42ae71cf143e25b95491b699ef7c737950dbdb862 languageName: node linkType: hard -"@babel/preset-react@npm:^7.25.9": - version: 7.26.3 - resolution: "@babel/preset-react@npm:7.26.3" +"@babel/plugin-transform-typescript@npm:^7.28.5": + version: 7.28.6 + resolution: "@babel/plugin-transform-typescript@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-validator-option": "npm:^7.25.9" - "@babel/plugin-transform-react-display-name": "npm:^7.25.9" - "@babel/plugin-transform-react-jsx": "npm:^7.25.9" - "@babel/plugin-transform-react-jsx-development": "npm:^7.25.9" - "@babel/plugin-transform-react-pure-annotations": "npm:^7.25.9" + "@babel/helper-annotate-as-pure": "npm:^7.27.3" + "@babel/helper-create-class-features-plugin": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.27.1" + "@babel/plugin-syntax-typescript": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/88cb78c402b79f32389ee06451da51698d5b1da7641d9a47482883f537fe5441a138bd4c077d8533fd6d557406b08911c47b94402cea843db598e020bdd9a373 + checksum: 10/a0bccc531fa8710a45b0b593140273741e0e4a0721b1ef6ef9dfefae0bbe61528440d65aab7936929551fd76793272257d74f60cf66891352f793294930a4b67 languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.21.0": - version: 7.24.7 - resolution: "@babel/preset-typescript@npm:7.24.7" +"@babel/plugin-transform-unicode-escapes@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.27.1" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" - "@babel/helper-validator-option": "npm:^7.24.7" - "@babel/plugin-syntax-jsx": "npm:^7.24.7" - "@babel/plugin-transform-modules-commonjs": "npm:^7.24.7" - "@babel/plugin-transform-typescript": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.27.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/995e9783f8e474581e7533d6b10ec1fbea69528cc939ad8582b5937e13548e5215d25a8e2c845e7b351fdaa13139896b5e42ab3bde83918ea4e41773f10861ac + checksum: 10/87b9e49dee4ab6e78f4cdcdbdd837d7784f02868a96bfc206c8dbb17dd85db161b5a0ecbe95b19a42e8aea0ce57e80249e1facbf9221d7f4114d52c3b9136c9e languageName: node linkType: hard -"@babel/preset-typescript@npm:^7.25.9": - version: 7.26.0 - resolution: "@babel/preset-typescript@npm:7.26.0" +"@babel/plugin-transform-unicode-property-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-property-regex@npm:7.28.6" dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/helper-validator-option": "npm:^7.25.9" - "@babel/plugin-syntax-jsx": "npm:^7.25.9" - "@babel/plugin-transform-modules-commonjs": "npm:^7.25.9" - "@babel/plugin-transform-typescript": "npm:^7.25.9" + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 10/81a60826160163a3daae017709f42147744757b725b50c9024ef3ee5a402ee45fd2e93eaecdaaa22c81be91f7940916249cfb7711366431cfcacc69c95878c03 + checksum: 10/d14e8c51aa73f592575c1543400fd67d96df6410d75c9dc10dd640fd7eecb37366a2f2368bbdd7529842532eda4af181c921bda95146c6d373c64ea59c6e9991 languageName: node linkType: hard -"@babel/regjsgen@npm:^0.8.0": - version: 0.8.0 - resolution: "@babel/regjsgen@npm:0.8.0" - checksum: 10/c57fb730b17332b7572574b74364a77d70faa302a281a62819476fa3b09822974fd75af77aea603ad77378395be64e81f89f0e800bf86cbbf21652d49ce12ee8 +"@babel/plugin-transform-unicode-regex@npm:^7.27.1": + version: 7.27.1 + resolution: "@babel/plugin-transform-unicode-regex@npm:7.27.1" + dependencies: + "@babel/helper-create-regexp-features-plugin": "npm:^7.27.1" + "@babel/helper-plugin-utils": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/a34d89a2b75fb78e66d97c3dc90d4877f7e31f43316b52176f95a5dee20e9bb56ecf158eafc42a001676ddf7b393d9e67650bad6b32f5405780f25fb83cd68e3 languageName: node linkType: hard -"@babel/runtime-corejs3@npm:^7.25.9": - version: 7.27.4 - resolution: "@babel/runtime-corejs3@npm:7.27.4" +"@babel/plugin-transform-unicode-sets-regex@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/plugin-transform-unicode-sets-regex@npm:7.28.6" dependencies: - core-js-pure: "npm:^3.30.2" - checksum: 10/f4a713b3dba9d963c74d97836525133a9fd65f175e899c3ad6db071ccb204e8a1bfae8cfb68e33c2d9bc425b4dedf8b048d28963dba39283a5dd291a8f6163b5 + "@babel/helper-create-regexp-features-plugin": "npm:^7.28.5" + "@babel/helper-plugin-utils": "npm:^7.28.6" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10/423971fe2eef9d18782b1c30f5f42613ee510e5b9c08760c5538a0997b36c34495acce261e0e37a27831f81330359230bd1f33c2e1822de70241002b45b7d68e languageName: node linkType: hard -"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.25.9, @babel/runtime@npm:^7.8.4": - version: 7.27.4 - resolution: "@babel/runtime@npm:7.27.4" - checksum: 10/ce2495a1773c6f52c7c201f45a1e5c317f2630ff98bec8caa282d574e25f58b0f87ab6e2e2dba0e24ad819792cb0dff3423f90771635620c1f01ff24e73f770d +"@babel/preset-env@npm:^7.20.2, @babel/preset-env@npm:^7.25.9": + version: 7.29.0 + resolution: "@babel/preset-env@npm:7.29.0" + dependencies: + "@babel/compat-data": "npm:^7.29.0" + "@babel/helper-compilation-targets": "npm:^7.28.6" + "@babel/helper-plugin-utils": "npm:^7.28.6" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "npm:^7.28.5" + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "npm:^7.27.1" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.27.1" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.28.6" + "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions": "npm:^7.28.6" + "@babel/plugin-syntax-import-attributes": "npm:^7.28.6" + "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" + "@babel/plugin-transform-arrow-functions": "npm:^7.27.1" + "@babel/plugin-transform-async-generator-functions": "npm:^7.29.0" + "@babel/plugin-transform-async-to-generator": "npm:^7.28.6" + "@babel/plugin-transform-block-scoped-functions": "npm:^7.27.1" + "@babel/plugin-transform-block-scoping": "npm:^7.28.6" + "@babel/plugin-transform-class-properties": "npm:^7.28.6" + "@babel/plugin-transform-class-static-block": "npm:^7.28.6" + "@babel/plugin-transform-classes": "npm:^7.28.6" + "@babel/plugin-transform-computed-properties": "npm:^7.28.6" + "@babel/plugin-transform-destructuring": "npm:^7.28.5" + "@babel/plugin-transform-dotall-regex": "npm:^7.28.6" + "@babel/plugin-transform-duplicate-keys": "npm:^7.27.1" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "npm:^7.29.0" + "@babel/plugin-transform-dynamic-import": "npm:^7.27.1" + "@babel/plugin-transform-explicit-resource-management": "npm:^7.28.6" + "@babel/plugin-transform-exponentiation-operator": "npm:^7.28.6" + "@babel/plugin-transform-export-namespace-from": "npm:^7.27.1" + "@babel/plugin-transform-for-of": "npm:^7.27.1" + "@babel/plugin-transform-function-name": "npm:^7.27.1" + "@babel/plugin-transform-json-strings": "npm:^7.28.6" + "@babel/plugin-transform-literals": "npm:^7.27.1" + "@babel/plugin-transform-logical-assignment-operators": "npm:^7.28.6" + "@babel/plugin-transform-member-expression-literals": "npm:^7.27.1" + "@babel/plugin-transform-modules-amd": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.28.6" + "@babel/plugin-transform-modules-systemjs": "npm:^7.29.0" + "@babel/plugin-transform-modules-umd": "npm:^7.27.1" + "@babel/plugin-transform-named-capturing-groups-regex": "npm:^7.29.0" + "@babel/plugin-transform-new-target": "npm:^7.27.1" + "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.28.6" + "@babel/plugin-transform-numeric-separator": "npm:^7.28.6" + "@babel/plugin-transform-object-rest-spread": "npm:^7.28.6" + "@babel/plugin-transform-object-super": "npm:^7.27.1" + "@babel/plugin-transform-optional-catch-binding": "npm:^7.28.6" + "@babel/plugin-transform-optional-chaining": "npm:^7.28.6" + "@babel/plugin-transform-parameters": "npm:^7.27.7" + "@babel/plugin-transform-private-methods": "npm:^7.28.6" + "@babel/plugin-transform-private-property-in-object": "npm:^7.28.6" + "@babel/plugin-transform-property-literals": "npm:^7.27.1" + "@babel/plugin-transform-regenerator": "npm:^7.29.0" + "@babel/plugin-transform-regexp-modifiers": "npm:^7.28.6" + "@babel/plugin-transform-reserved-words": "npm:^7.27.1" + "@babel/plugin-transform-shorthand-properties": "npm:^7.27.1" + "@babel/plugin-transform-spread": "npm:^7.28.6" + "@babel/plugin-transform-sticky-regex": "npm:^7.27.1" + "@babel/plugin-transform-template-literals": "npm:^7.27.1" + "@babel/plugin-transform-typeof-symbol": "npm:^7.27.1" + "@babel/plugin-transform-unicode-escapes": "npm:^7.27.1" + "@babel/plugin-transform-unicode-property-regex": "npm:^7.28.6" + "@babel/plugin-transform-unicode-regex": "npm:^7.27.1" + "@babel/plugin-transform-unicode-sets-regex": "npm:^7.28.6" + "@babel/preset-modules": "npm:0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2: "npm:^0.4.15" + babel-plugin-polyfill-corejs3: "npm:^0.14.0" + babel-plugin-polyfill-regenerator: "npm:^0.6.6" + core-js-compat: "npm:^3.48.0" + semver: "npm:^6.3.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/211b33ec8644636275f61aa273071d8cbc2a6bb28d82ad246e3831a6aa7d96c610a55b5140bcd21be7f71fb04c3aa4a10eb08665fb5505e153cfdd8dbc8c1c1c languageName: node linkType: hard -"@babel/template@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/template@npm:7.24.7" +"@babel/preset-modules@npm:0.1.6-no-external-plugins": + version: 0.1.6-no-external-plugins + resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 10/5975d404ef51cf379515eb0f80b115981d0b9dff5539e53a47516644abb8c83d7559f5b083eb1d4977b20d8359ebb2f911ccd4f729143f8958fdc465f976d843 + "@babel/helper-plugin-utils": "npm:^7.0.0" + "@babel/types": "npm:^7.4.4" + esutils: "npm:^2.0.2" + peerDependencies: + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 10/039aba98a697b920d6440c622aaa6104bb6076d65356b29dad4b3e6627ec0354da44f9621bafbeefd052cd4ac4d7f88c9a2ab094efcb50963cb352781d0c6428 languageName: node linkType: hard -"@babel/template@npm:^7.25.9, @babel/template@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/template@npm:7.26.9" +"@babel/preset-react@npm:^7.18.6, @babel/preset-react@npm:^7.25.9": + version: 7.28.5 + resolution: "@babel/preset-react@npm:7.28.5" dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/parser": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" - checksum: 10/240288cebac95b1cc1cb045ad143365643da0470e905e11731e63280e43480785bd259924f4aea83898ef68e9fa7c176f5f2d1e8b0a059b27966e8ca0b41a1b6 + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-transform-react-display-name": "npm:^7.28.0" + "@babel/plugin-transform-react-jsx": "npm:^7.27.1" + "@babel/plugin-transform-react-jsx-development": "npm:^7.27.1" + "@babel/plugin-transform-react-pure-annotations": "npm:^7.27.1" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/c00d43b27790caddee7c4971b11b4bf479a761175433e2f168b3d7e1ac6ee36d4d929a76acc7f302e9bff3a5b26d02d37f0ad7ae6359e076e5baa862b00843b2 languageName: node linkType: hard -"@babel/template@npm:^7.27.2": - version: 7.27.2 - resolution: "@babel/template@npm:7.27.2" +"@babel/preset-typescript@npm:^7.21.0, @babel/preset-typescript@npm:^7.25.9": + version: 7.28.5 + resolution: "@babel/preset-typescript@npm:7.28.5" dependencies: - "@babel/code-frame": "npm:^7.27.1" - "@babel/parser": "npm:^7.27.2" - "@babel/types": "npm:^7.27.1" - checksum: 10/fed15a84beb0b9340e5f81566600dbee5eccd92e4b9cc42a944359b1aa1082373391d9d5fc3656981dff27233ec935d0bc96453cf507f60a4b079463999244d8 + "@babel/helper-plugin-utils": "npm:^7.27.1" + "@babel/helper-validator-option": "npm:^7.27.1" + "@babel/plugin-syntax-jsx": "npm:^7.27.1" + "@babel/plugin-transform-modules-commonjs": "npm:^7.27.1" + "@babel/plugin-transform-typescript": "npm:^7.28.5" + peerDependencies: + "@babel/core": ^7.0.0-0 + checksum: 10/72c03e01c34906041b1813542761a283c52da1751e7ddf63191bc5fb2a0354eca30a00537c5a92951688bec3975bdc0e50ef4516b5e94cfd6d4cf947f2125bdc languageName: node linkType: hard -"@babel/traverse@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/traverse@npm:7.24.7" +"@babel/runtime-corejs3@npm:^7.25.9": + version: 7.29.0 + resolution: "@babel/runtime-corejs3@npm:7.29.0" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.24.7" - "@babel/helper-environment-visitor": "npm:^7.24.7" - "@babel/helper-function-name": "npm:^7.24.7" - "@babel/helper-hoist-variables": "npm:^7.24.7" - "@babel/helper-split-export-declaration": "npm:^7.24.7" - "@babel/parser": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10/785cf26383a992740e492efba7016de964cd06c05c9d7146fa1b5ead409e054c444f50b36dc37856884a56e32cf9d3105ddf1543486b6df68300bffb117a245a + core-js-pure: "npm:^3.48.0" + checksum: 10/59b3b614a8b4c5cf94d1f271f36eb96def0f0be0b6fa93da2ff7a87996bc3806f83690e7517f2e675078ff645e4e953f8bf3c6fc1a59cc5327e45f04bc0dd105 languageName: node linkType: hard -"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.5, @babel/traverse@npm:^7.26.8, @babel/traverse@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/traverse@npm:7.26.9" - dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.9" - "@babel/parser": "npm:^7.26.9" - "@babel/template": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10/c16a79522eafa0a7e40eb556bf1e8a3d50dbb0ff943a80f2c06cee2ec7ff87baa0c5d040a5cff574d9bcb3bed05e7d8c6f13b238a931c97267674b02c6cf45b4 +"@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.25.9": + version: 7.28.6 + resolution: "@babel/runtime@npm:7.28.6" + checksum: 10/fbcd439cb74d4a681958eb064c509829e3f46d8a4bfaaf441baa81bb6733d1e680bccc676c813883d7741bcaada1d0d04b15aa320ef280b5734e2192b50decf9 languageName: node linkType: hard -"@babel/types@npm:^7.21.3, @babel/types@npm:^7.24.7, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.24.7 - resolution: "@babel/types@npm:7.24.7" +"@babel/template@npm:^7.28.6": + version: 7.28.6 + resolution: "@babel/template@npm:7.28.6" dependencies: - "@babel/helper-string-parser": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10/ad3c8c0d6fb4acb0bb74bb5b4bb849b181bf6185677ef9c59c18856c81e43628d0858253cf232f0eca806f02e08eff85a1d3e636a3e94daea737597796b0b430 + "@babel/code-frame": "npm:^7.28.6" + "@babel/parser": "npm:^7.28.6" + "@babel/types": "npm:^7.28.6" + checksum: 10/0ad6e32bf1e7e31bf6b52c20d15391f541ddd645cbd488a77fe537a15b280ee91acd3a777062c52e03eedbc2e1f41548791f6a3697c02476ec5daf49faa38533 languageName: node linkType: hard -"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/types@npm:7.26.9" +"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": + version: 7.29.0 + resolution: "@babel/traverse@npm:7.29.0" dependencies: - "@babel/helper-string-parser": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10/11b62ea7ed64ef7e39cc9b33852c1084064c3b970ae0eaa5db659241cfb776577d1e68cbff4de438bada885d3a827b52cc0f3746112d8e1bc672bb99a8eb5b56 + "@babel/code-frame": "npm:^7.29.0" + "@babel/generator": "npm:^7.29.0" + "@babel/helper-globals": "npm:^7.28.0" + "@babel/parser": "npm:^7.29.0" + "@babel/template": "npm:^7.28.6" + "@babel/types": "npm:^7.29.0" + debug: "npm:^4.3.1" + checksum: 10/3a0d0438f1ba9fed4fbe1706ea598a865f9af655a16ca9517ab57bda526e224569ca1b980b473fb68feea5e08deafbbf2cf9febb941f92f2d2533310c3fc4abc languageName: node linkType: hard -"@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3": - version: 7.27.3 - resolution: "@babel/types@npm:7.27.3" +"@babel/types@npm:^7.21.3, @babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0, @babel/types@npm:^7.4.4": + version: 7.29.0 + resolution: "@babel/types@npm:7.29.0" dependencies: "@babel/helper-string-parser": "npm:^7.27.1" - "@babel/helper-validator-identifier": "npm:^7.27.1" - checksum: 10/a24e6accd85c4747b974b3d68a3210d0aa1180c1a77b287ffcb7401cd2edad7bdecadaeb40fe5191be3990c3a5252943f7de7c09da13ed269adbb054b97056ee + "@babel/helper-validator-identifier": "npm:^7.28.5" + checksum: 10/bfc2b211210f3894dcd7e6a33b2d1c32c93495dc1e36b547376aa33441abe551ab4bc1640d4154ee2acd8e46d3bbc925c7224caae02fcaf0e6a771e97fccc661 languageName: node linkType: hard -"@braintree/sanitize-url@npm:^7.0.4": - version: 7.1.1 - resolution: "@braintree/sanitize-url@npm:7.1.1" - checksum: 10/a8a5535c5a0a459ba593a018c554b35493dff004fd09d7147db67243df83bce3d410b89ee7dc2d95cce195b85b877c72f8ca149e1040110a945d193c67293af0 +"@braintree/sanitize-url@npm:^7.1.1": + version: 7.1.2 + resolution: "@braintree/sanitize-url@npm:7.1.2" + checksum: 10/d9626ff8f8eb5e192cd055e6e743449c21102c76bb59e405b7028fe56230fa080bfcc80dfb1e21850a6876e75adda9f7b3c888cf0685942bb74da4d2866d6ec3 languageName: node linkType: hard -"@chevrotain/cst-dts-gen@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/cst-dts-gen@npm:11.0.3" +"@chevrotain/cst-dts-gen@npm:11.1.1": + version: 11.1.1 + resolution: "@chevrotain/cst-dts-gen@npm:11.1.1" dependencies: - "@chevrotain/gast": "npm:11.0.3" - "@chevrotain/types": "npm:11.0.3" - lodash-es: "npm:4.17.21" - checksum: 10/601d23fa3312bd0e32816bd3f9ca2dcba775a52192a082fd6c5e4a2e8ee068523401191babbe2c346d6d2551900a67b549f2f74d7ebb7d5b2ee1b6fa3c8857a0 + "@chevrotain/gast": "npm:11.1.1" + "@chevrotain/types": "npm:11.1.1" + lodash-es: "npm:4.17.23" + checksum: 10/ff69fa978abea4075cbeb8356e1d297c7063091044d4766ea9f7e037c1b0745f19bade1527f08bc7304903e54a80342faab2641004a3c9e7e9b8027c979f1cbf languageName: node linkType: hard -"@chevrotain/gast@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/gast@npm:11.0.3" +"@chevrotain/gast@npm:11.1.1": + version: 11.1.1 + resolution: "@chevrotain/gast@npm:11.1.1" dependencies: - "@chevrotain/types": "npm:11.0.3" - lodash-es: "npm:4.17.21" - checksum: 10/7169453a8fbfa994e91995523dea09eab87ab23062ad93f6e51f4a3b03f5e2958e0a8b99d5ca6fa067fccfbbbb8bcf1a4573ace2e1b5a455f6956af9eaccb35a + "@chevrotain/types": "npm:11.1.1" + lodash-es: "npm:4.17.23" + checksum: 10/7e3e951cdf1f4c90634f75a7f284b521bf01e03580ae725deefeb4178d12c70c4eeb0e44f39938cb061943940d14e5d2a79c355dae1ca7ed26a86cfc16f72e6f languageName: node linkType: hard -"@chevrotain/regexp-to-ast@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/regexp-to-ast@npm:11.0.3" - checksum: 10/7387a1c61c5a052de41e1172b33eaaedea166fcdb1ffe4c381b86d00051a8014855a031d28fb658768a62c833ef5f5b0689d0c40de3d7bed556f8fea24396e69 +"@chevrotain/regexp-to-ast@npm:11.1.1": + version: 11.1.1 + resolution: "@chevrotain/regexp-to-ast@npm:11.1.1" + checksum: 10/6eef0f317107e79b72bcd8af0f05837166200e3b8dec8dd2e235a1b73f190e2461beb86a3824627d392f59ca3bd9eb9ac0361928d9fa36664772bdac1ce857ca languageName: node linkType: hard -"@chevrotain/types@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/types@npm:11.0.3" - checksum: 10/49a82b71d2de8ceb2383ff2709fa61d245f2ab2e42790b70c57102c80846edaa318d0b3645aedc904d23ea7bd9be8a58f2397b1341760a15eb5aa95a1336e2a9 +"@chevrotain/types@npm:11.1.1": + version: 11.1.1 + resolution: "@chevrotain/types@npm:11.1.1" + checksum: 10/99c3cd6f1f77af9a0929b8ec0324ba08bbba0cac8c59e74c83ded1316b13ead5546881363089ecb45c0921738ba243c0ec15ca9d1e3a45b3aac0b157e7030cb2 languageName: node linkType: hard -"@chevrotain/utils@npm:11.0.3": - version: 11.0.3 - resolution: "@chevrotain/utils@npm:11.0.3" - checksum: 10/29b5d84373a7761ad055c53e2f540a67b5b56550d5be1c473149f6b8923eef87ff391ce021c06ac7653843b0149f6ff0cf30b5e48c3f825d295eb06a6c517bd3 +"@chevrotain/utils@npm:11.1.1": + version: 11.1.1 + resolution: "@chevrotain/utils@npm:11.1.1" + checksum: 10/c3a0dd1fbd3062b3193d200e043b612347b116383b2940239dd3d52764f14bb50a01deeb84ec944672c17799e94af9245057a9442cf6f3165fd8e0ec2026d814 languageName: node linkType: hard @@ -3023,10 +1542,10 @@ __metadata: languageName: node linkType: hard -"@csstools/color-helpers@npm:^5.0.2": - version: 5.0.2 - resolution: "@csstools/color-helpers@npm:5.0.2" - checksum: 10/8763079c54578bd2215c68de0795edb9cfa29bffa29625bff89f3c47d9df420d86296ff3a6fa8c29ca037bbaa64dc10a963461233341de0516a3161a3b549e7b +"@csstools/color-helpers@npm:^5.1.0": + version: 5.1.0 + resolution: "@csstools/color-helpers@npm:5.1.0" + checksum: 10/0138b3d5ccbe77aeccf6721fd008a53523c70e932f0c82dca24a1277ca780447e1d8357da47512ebf96358476f8764de57002f3e491920d67e69202f5a74c383 languageName: node linkType: hard @@ -3040,16 +1559,16 @@ __metadata: languageName: node linkType: hard -"@csstools/css-color-parser@npm:^3.0.10": - version: 3.0.10 - resolution: "@csstools/css-color-parser@npm:3.0.10" +"@csstools/css-color-parser@npm:^3.1.0": + version: 3.1.0 + resolution: "@csstools/css-color-parser@npm:3.1.0" dependencies: - "@csstools/color-helpers": "npm:^5.0.2" + "@csstools/color-helpers": "npm:^5.1.0" "@csstools/css-calc": "npm:^2.1.4" peerDependencies: "@csstools/css-parser-algorithms": ^3.0.5 "@csstools/css-tokenizer": ^3.0.4 - checksum: 10/d5619639f067c0a6ac95ecce6ad6adce55a5500599a4444817ac6bb5ed2a9928a08f0978a148d4687de7ebf05c068c1a1c7f9eaa039984830a84148e011cbc05 + checksum: 10/4741095fdc4501e8e7ada4ed14fbf9dbbe6fea9b989818790ebca15657c29c62defbebacf18592cde2aa638a1d098bbe86d742d2c84ba932fbc00fac51cb8805 languageName: node linkType: hard @@ -3079,74 +1598,119 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-cascade-layers@npm:^5.0.1": - version: 5.0.1 - resolution: "@csstools/postcss-cascade-layers@npm:5.0.1" +"@csstools/postcss-alpha-function@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-alpha-function@npm:1.0.1" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/40dfd418eb36fe87500769e2ee31717fc549eced3152966a4a5b4121e657a9846d14ef9bffee4faa3298a362d85af2684c3a4fea31bbca785205e7bfecbb94dc + languageName: node + linkType: hard + +"@csstools/postcss-cascade-layers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/postcss-cascade-layers@npm:5.0.2" dependencies: "@csstools/selector-specificity": "npm:^5.0.0" postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/ca0a3e324d914567f36e9ec48da290c9d10e9315dc77632f14ec8a8c608fd3b573ca146eb8aa81382013d998c4896f6ac53af48c71b23d0b3fa1b4ea5441b599 + checksum: 10/9b73c28338f75eebd1032d6375e76547f90683806971f1dd3a47e6305901c89642094e1a80815fcfbb10b0afb61174f9ab3207db860a5841ca92ae993dc87cbe languageName: node linkType: hard -"@csstools/postcss-color-function@npm:^4.0.10": - version: 4.0.10 - resolution: "@csstools/postcss-color-function@npm:4.0.10" +"@csstools/postcss-color-function-display-p3-linear@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-color-function-display-p3-linear@npm:1.0.1" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/bf7650eab21784bfd3ed5618e1df081a989cedccf54b80accc72819dd463c4c57d99b9c4e5479cac5d889f39d09cc8ad610b82148300591e6bc547b238464056 + checksum: 10/10b1b098d66314d287cca728c601c6905017769a31dd27488da49922937476a22eb280232e4b1df352b4f76158994dc18607cfc7b565d83346746795cb3f7844 languageName: node linkType: hard -"@csstools/postcss-color-mix-function@npm:^3.0.10": - version: 3.0.10 - resolution: "@csstools/postcss-color-mix-function@npm:3.0.10" +"@csstools/postcss-color-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-color-function@npm:4.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/ea52be6f45979297de77310a095d2df105e0da064300f489572cb9b78e4906e9e6bbbe8fdfc82cf2e01a8bdb2473c36a234852ad5c5ea1eda580b9bc222159b4 + checksum: 10/b13563a097966f9f670544e7f76abe8d170a59d09c5e7bd26533daf5b6bffcc74a82e694d5d970326299b5fa70c52972d9aeabe5dbd2fd90a3322668d4aa3e74 languageName: node linkType: hard -"@csstools/postcss-color-mix-variadic-function-arguments@npm:^1.0.0": - version: 1.0.0 - resolution: "@csstools/postcss-color-mix-variadic-function-arguments@npm:1.0.0" +"@csstools/postcss-color-mix-function@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/f12bf1d63eaf348ebe2ef9c79ddb1a63df3370a556f02d11cbe3ab8540016bd47fd7384948a426207f92131e0f5981d3695fbd046b5768c0ec63e45cc92e31a7 + checksum: 10/f4ac11b913860e919fc325e817ba1dd7fa2740d6a86eb2abe92013ac8173fa4efb697f6ccffa3178526fa9ed6274ce654bf278adc86effa62dd1f5adf16e2f7c languageName: node linkType: hard -"@csstools/postcss-content-alt-text@npm:^2.0.6": - version: 2.0.6 - resolution: "@csstools/postcss-content-alt-text@npm:2.0.6" +"@csstools/postcss-color-mix-variadic-function-arguments@npm:^1.0.2": + version: 1.0.2 + resolution: "@csstools/postcss-color-mix-variadic-function-arguments@npm:1.0.2" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/a38642b7020589ffc684f0f4c76a2e59a8d6dc75f55036a06c9e8a109c55245234c9fb50eae6f2b97b0046591767af922d0a089a8a0c742372cf4935411f5e5c + languageName: node + linkType: hard + +"@csstools/postcss-content-alt-text@npm:^2.0.8": + version: 2.0.8 + resolution: "@csstools/postcss-content-alt-text@npm:2.0.8" dependencies: "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/2edca1f35b9d59cc3933a318db8cdeaed435169c35d1b0e9fb394349d4633c544ca03243b21be849c8d9f0986a9b10125635e7ed33ef89c28c1346cdb05fdab6 + checksum: 10/a69e1daf2fddd4cfb46806a7e5888b9138d498e173b15040d27d963a3d66aaaed9097a780291229e5dafaf8292443b4adcb329d4f1a4fb7d3f04ef2edd798c12 + languageName: node + linkType: hard + +"@csstools/postcss-contrast-color-function@npm:^2.0.12": + version: 2.0.12 + resolution: "@csstools/postcss-contrast-color-function@npm:2.0.12" + dependencies: + "@csstools/css-color-parser": "npm:^3.1.0" + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/utilities": "npm:^2.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/ac8fed35786d6e4c077d34b023a72278e29a5cef90ee834df273ce0197fcee9848b3d40046bfff37959f42c7cfb4f14ffac1b58a86d87a80c1759a9300db7c49 languageName: node linkType: hard @@ -3175,59 +1739,59 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-gamut-mapping@npm:^2.0.10": - version: 2.0.10 - resolution: "@csstools/postcss-gamut-mapping@npm:2.0.10" +"@csstools/postcss-gamut-mapping@npm:^2.0.11": + version: 2.0.11 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.11" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" peerDependencies: postcss: ^8.4 - checksum: 10/371449cc8c3db29a27b75afeb500777150f9f9e4edca71f63f2de12bc2c68f4157450ed6a6fdddfaa5596f4a17922176b862d14458a7ce6c15c81d06a0e9fc12 + checksum: 10/be4cb5a14eef78acbd9dfca7cdad0ab4e8e4a11c9e8bbb27e427bfd276fd5d3aa37bc1bf36deb040d404398989a3123bd70fc51be970c4d944cf6a18d231c1b8 languageName: node linkType: hard -"@csstools/postcss-gradients-interpolation-method@npm:^5.0.10": - version: 5.0.10 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.10" +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.12": + version: 5.0.12 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/dcc18133442b8c72e94b77277d2213a3571526682fc351fd0126cc2490e317438d2dff5101374992b251cb3a25edfe86f79f7fe9cc88c96372aeffd80ba75194 + checksum: 10/902505cccb5a3b91d0cb8c22594130a9da3b8ec8be135b406ef7ab799e3564a8c571a08820dbe83de556d011ef9b0fe298d7cfcb741e98862ac66b287c938bf2 languageName: node linkType: hard -"@csstools/postcss-hwb-function@npm:^4.0.10": - version: 4.0.10 - resolution: "@csstools/postcss-hwb-function@npm:4.0.10" +"@csstools/postcss-hwb-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-hwb-function@npm:4.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/b2a003fe844b0d5b44a1ba46754afdb298be94a771e2b4109391e774b07a04bfad0bc8d9e833bb862567bed533f54cdc146cdc5b869b69bdd3e5526e2651c200 + checksum: 10/8e37a45cffa9458466fa9a05a0926ea1579e6b21501c59bb464282481f41a2694f45343e85d37da744a36a99a4ceb3e263aeca46ea5fcfb8a12a5558cc11efaa languageName: node linkType: hard -"@csstools/postcss-ic-unit@npm:^4.0.2": - version: 4.0.2 - resolution: "@csstools/postcss-ic-unit@npm:4.0.2" +"@csstools/postcss-ic-unit@npm:^4.0.4": + version: 4.0.4 + resolution: "@csstools/postcss-ic-unit@npm:4.0.4" dependencies: - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10/4242221d9c1ed5f6062b6816a5cbbfb121aa919a0468bb786ff84e8eaf4e7656754b4587c51e9b2ae5bc6a7e53ac17ce05297b095866c8a02edb3b31ce74e18e + checksum: 10/3bbdbba983686b9e12a5bbf36bb2ba823a6426efb9369ca415e342c37136e041929fcafacb6fa113a06a117c22785098707c91dbf306446e66618c7881553324 languageName: node linkType: hard @@ -3252,17 +1816,17 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-light-dark-function@npm:^2.0.9": - version: 2.0.9 - resolution: "@csstools/postcss-light-dark-function@npm:2.0.9" +"@csstools/postcss-light-dark-function@npm:^2.0.11": + version: 2.0.11 + resolution: "@csstools/postcss-light-dark-function@npm:2.0.11" dependencies: "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/98a68dc44dfc053b8afddf96bcf8790703d58455bc36475908255f716b88a1e87e49807ff7ae8ecf9c7345ee88524eadd2a872c8ab347348dee1a37f58c58bc4 + checksum: 10/52fa6464e31d4815557ef9bcff0a94a89549bcf1ccb4ffcc51478a5fa01815311fb2b52b96e3f671c64da8493fb50d3fc235cbfcec797f685dcccb4133dc09c4 languageName: node linkType: hard @@ -3355,40 +1919,61 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-normalize-display-values@npm:^4.0.0": - version: 4.0.0 - resolution: "@csstools/postcss-normalize-display-values@npm:4.0.0" +"@csstools/postcss-normalize-display-values@npm:^4.0.1": + version: 4.0.1 + resolution: "@csstools/postcss-normalize-display-values@npm:4.0.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10/750093837486da6dd0cc66183fe9909a18485f23610669806b708ab9942c721a773997cde37fd7ee085aca3d6de065ffd5609c77df5e2f303d67af106e53726e + checksum: 10/46138f696ddadc0777dc66e97ff3a5f5a4dfa4f25ac396590b22df66dcc46d335c19af4fb4468e35472e1379ff180c858839c3ad51e7763ba3f9d898b00fb8a1 languageName: node linkType: hard -"@csstools/postcss-oklab-function@npm:^4.0.10": - version: 4.0.10 - resolution: "@csstools/postcss-oklab-function@npm:4.0.10" +"@csstools/postcss-oklab-function@npm:^4.0.12": + version: 4.0.12 + resolution: "@csstools/postcss-oklab-function@npm:4.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/d07821fa22def72faa2d2979dd129898e7282682d194f6c043d17103582f161220272c46c45cb0c12ccb9bcfefcb4356df5b7af6b688e9c6340a320dfef2faec + checksum: 10/d5a57c23939bdb71ab9cf0ecf35b217ee958206e4b31f7955ff006a74284de51fb79bc1df50974171d2975bd0fa5d34a31687c49d1c52c36d4b83ee09b7544fc languageName: node linkType: hard -"@csstools/postcss-progressive-custom-properties@npm:^4.1.0": - version: 4.1.0 - resolution: "@csstools/postcss-progressive-custom-properties@npm:4.1.0" +"@csstools/postcss-position-area-property@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-position-area-property@npm:1.0.0" + peerDependencies: + postcss: ^8.4 + checksum: 10/50f1274b8f88d89d90494f7511c2d34736ccc6f48ce650efe85772fb1a355c98bc41b749ba6c7129de24a26536c77166a850a912b650c9c6781665ed9e85321e + languageName: node + linkType: hard + +"@csstools/postcss-progressive-custom-properties@npm:^4.2.1": + version: 4.2.1 + resolution: "@csstools/postcss-progressive-custom-properties@npm:4.2.1" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10/8936ea4afd420befe9e86a912fb4b64462cfb8a2d743ca1de5432d2980facf5d3fa2115ef3350732f70f835cc2a98d1667b050235d6f5c32873b2845ca7885c8 + checksum: 10/aefbdcd7ceaa25c004c454245148ed03cdeecf420887062c04eb0ff1a0ea0394ac174da2968250db34278236ecae5b25d8b3fb0c6b9b9e594b67f13e99ba56fd + languageName: node + linkType: hard + +"@csstools/postcss-property-rule-prelude-list@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-property-rule-prelude-list@npm:1.0.0" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/f915cef138a8a96d256a47c6c317456d3d31d516777bc3d556ad8276a2d919405cc24781c91e4c629f2bf009e79be84f38cf62ac73fe94edd7bf61d4b2c7cf93 languageName: node linkType: hard @@ -3405,18 +1990,18 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-relative-color-syntax@npm:^3.0.10": - version: 3.0.10 - resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.10" +"@csstools/postcss-relative-color-syntax@npm:^3.0.12": + version: 3.0.12 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/d09d0e559a538f3e0c120f1c660de799ada6f9f77423b945faf6648d914f8c6a3a6d8647ab6c895e5edaade4dfcceb207d6a44ff5e7e63998330677bf304cb08 + checksum: 10/7c6b5671268c1e30e8f113305c362d567010a0164e2b573a4d878289d5e79ab390d95975375a4c1ab577a1075d244bf242a411c4ca7ecc395546664d59becc0b languageName: node linkType: hard @@ -3457,15 +2042,38 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-text-decoration-shorthand@npm:^4.0.2": - version: 4.0.2 - resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.2" +"@csstools/postcss-syntax-descriptor-syntax-production@npm:^1.0.1": + version: 1.0.1 + resolution: "@csstools/postcss-syntax-descriptor-syntax-production@npm:1.0.1" + dependencies: + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/d0216cf3cd0b86203c5927cb211500543dec498d6d91b393caaa1df82af7dd7570a477a9a829ab15341ef812e341a7b34193f204a18c10e571b6da8df14c2127 + languageName: node + linkType: hard + +"@csstools/postcss-system-ui-font-family@npm:^1.0.0": + version: 1.0.0 + resolution: "@csstools/postcss-system-ui-font-family@npm:1.0.0" + dependencies: + "@csstools/css-parser-algorithms": "npm:^3.0.5" + "@csstools/css-tokenizer": "npm:^3.0.4" + peerDependencies: + postcss: ^8.4 + checksum: 10/6e2eed873ce887e3e3cec8d36d48fb71ef68b9995275ba008b3d5538ce63704eb4c9d4b1bd8e4a9e6d605116d7658a64557abbca7858069c7e81ea386433b8f9 + languageName: node + linkType: hard + +"@csstools/postcss-text-decoration-shorthand@npm:^4.0.3": + version: 4.0.3 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.3" dependencies: - "@csstools/color-helpers": "npm:^5.0.2" + "@csstools/color-helpers": "npm:^5.1.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10/c67b9c6582f7cd05d8a0df5ba98531ca07721c80f3ddf8ec69d1b9da5c6e1fd9313e25ce9ed378bbdf11c6dcd37367f3ebf1d4fabb6af99232e11bb662bfa1f9 + checksum: 10/afc350e389bae7fdceecb3876b9be00bdbd56e5f43054f9f5de2d42b3c55a163e5ba737212030479389c9c1fca5d066f5b051da1fdf72e13191a035d2cc6f4e0 languageName: node linkType: hard @@ -3525,24 +2133,38 @@ __metadata: languageName: node linkType: hard -"@docsearch/css@npm:4.2.0": - version: 4.2.0 - resolution: "@docsearch/css@npm:4.2.0" - checksum: 10/e80f9689f0c2f3aa7116f137b3afed9fcc3fd2e7d4c4a7c16cc60f0bb46c0d25c7255a902daa978799a2c2f93edaec01794176e465dcc58fb665c91d591761c8 +"@docsearch/core@npm:4.6.0": + version: 4.6.0 + resolution: "@docsearch/core@npm:4.6.0" + peerDependencies: + "@types/react": ">= 16.8.0 < 20.0.0" + react: ">= 16.8.0 < 20.0.0" + react-dom: ">= 16.8.0 < 20.0.0" + peerDependenciesMeta: + "@types/react": + optional: true + react: + optional: true + react-dom: + optional: true + checksum: 10/cd97d2e5e358ed250593521687338877852ec5fd069a674097ce999ae349da8b308eb4ac133b804cec962f5d06d67d471b33c614c85e4b6d31245787138c39c5 + languageName: node + linkType: hard + +"@docsearch/css@npm:4.6.0": + version: 4.6.0 + resolution: "@docsearch/css@npm:4.6.0" + checksum: 10/beaa96cc64eda08f58fe25b8e665bbb435e18535f8499de21a3d8d27b7d391c4f6ec3254a406c4a4ea3cc4a2c0c4218c8c18d8fac2249c94fc4cc5dbdf4a879d languageName: node linkType: hard "@docsearch/react@npm:^3.9.0 || ^4.1.0": - version: 4.2.0 - resolution: "@docsearch/react@npm:4.2.0" + version: 4.6.0 + resolution: "@docsearch/react@npm:4.6.0" dependencies: - "@ai-sdk/react": "npm:^2.0.30" "@algolia/autocomplete-core": "npm:1.19.2" - "@docsearch/css": "npm:4.2.0" - ai: "npm:^5.0.30" - algoliasearch: "npm:^5.28.0" - marked: "npm:^16.3.0" - zod: "npm:^4.1.8" + "@docsearch/core": "npm:4.6.0" + "@docsearch/css": "npm:4.6.0" peerDependencies: "@types/react": ">= 16.8.0 < 20.0.0" react: ">= 16.8.0 < 20.0.0" @@ -3557,7 +2179,7 @@ __metadata: optional: true search-insights: optional: true - checksum: 10/682a4ef428bd12e4709f706066bf4a6ddb735d67ce16b79f3ead8e4412b98973d0deef8c3cdf1bda810acf928ce6eb0b58d17efcf99ef91a295186f52d04fe45 + checksum: 10/49bd4581b02b544a8ed4581e8715b09ace984ee0c97230458e97b4811fa4c31e4312838da09ebc4a4c4367adc338e5743f644918068d18283c1ffb1634b23767 languageName: node linkType: hard @@ -4196,33 +2818,23 @@ __metadata: languageName: node linkType: hard -"@iconify/utils@npm:^2.1.33": - version: 2.3.0 - resolution: "@iconify/utils@npm:2.3.0" +"@iconify/utils@npm:^3.0.1": + version: 3.1.0 + resolution: "@iconify/utils@npm:3.1.0" dependencies: - "@antfu/install-pkg": "npm:^1.0.0" - "@antfu/utils": "npm:^8.1.0" + "@antfu/install-pkg": "npm:^1.1.0" "@iconify/types": "npm:^2.0.0" - debug: "npm:^4.4.0" - globals: "npm:^15.14.0" - kolorist: "npm:^1.8.0" - local-pkg: "npm:^1.0.0" - mlly: "npm:^1.7.4" - checksum: 10/27583d82542738c91719637793b1e2235dc847af2dd567743ec0edf0e38c614c565f12fb5a6ebdbd5346b582ad7a06eba5566c8ffe788f778d86c8e7646d7ea1 + mlly: "npm:^1.8.0" + checksum: 10/28e83311ec7eca3f94a9c128c6d6f0f6aa68b7a63bcac44d08a1ea6f94d3752a7447a4354f3d02fdcdbf782ba033784ef7a65212b3afe52d9b41ef8138e96b14 languageName: node linkType: hard -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" +"@isaacs/fs-minipass@npm:^4.0.0": + version: 4.0.1 + resolution: "@isaacs/fs-minipass@npm:4.0.1" dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10/e9ed5fd27c3aec1095e3a16e0c0cf148d1fee55a38665c35f7b3f86a9b5d00d042ddaabc98e8a1cb7463b9378c15f22a94eb35e99469c201453eb8375191f243 + minipass: "npm:^7.0.4" + checksum: 10/4412e9e6713c89c1e66d80bb0bb5a2a93192f10477623a27d08f228ba0316bb880affabc5bfe7f838f58a34d26c2c190da726e576cdfc18c49a72e89adabdcf5 languageName: node linkType: hard @@ -4249,14 +2861,23 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" +"@jridgewell/gen-mapping@npm:^0.3.12, @jridgewell/gen-mapping@npm:^0.3.5": + version: 0.3.13 + resolution: "@jridgewell/gen-mapping@npm:0.3.13" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + "@jridgewell/trace-mapping": "npm:^0.3.24" + checksum: 10/902f8261dcf450b4af7b93f9656918e02eec80a2169e155000cb2059f90113dd98f3ccf6efc6072cee1dd84cac48cade51da236972d942babc40e4c23da4d62a + languageName: node + linkType: hard + +"@jridgewell/remapping@npm:^2.3.5": + version: 2.3.5 + resolution: "@jridgewell/remapping@npm:2.3.5" dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" + "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2 + checksum: 10/c2bb01856e65b506d439455f28aceacf130d6c023d1d4e3b48705e88def3571753e1a887daa04b078b562316c92d26ce36408a60534bceca3f830aec88a339ad languageName: node linkType: hard @@ -4267,37 +2888,39 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - "@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" + version: 0.3.11 + resolution: "@jridgewell/source-map@npm:0.3.11" dependencies: "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" - checksum: 10/0a9aca9320dc9044014ba0ef989b3a8411b0d778895553e3b7ca2ac0a75a20af4a5ad3f202acfb1879fa40466036a4417e1d5b38305baed8b9c1ebe6e4b3e7f5 + checksum: 10/847f1177d3d133a0966ef61ca29abea0d79788a0652f90ee1893b3da968c190b7e31c3534cc53701179dd6b14601eef3d78644e727e05b1a08c68d281aedc4ba languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.5 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.5" + checksum: 10/5d9d207b462c11e322d71911e55e21a4e2772f71ffe8d6f1221b8eb5ae6774458c1d242f897fb0814e8714ca9a6b498abfa74dfe4f434493342902b1a48b33a5 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.20, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" +"@jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.28": + version: 0.3.31 + resolution: "@jridgewell/trace-mapping@npm:0.3.31" dependencies: "@jridgewell/resolve-uri": "npm:^3.1.0" "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc + checksum: 10/da0283270e691bdb5543806077548532791608e52386cfbbf3b9e8fb00457859d1bd01d512851161c886eb3a2f3ce6fd9bcf25db8edf3bddedd275bd4a88d606 + languageName: node + linkType: hard + +"@jsonjoy.com/base64@npm:17.67.0": + version: 17.67.0 + resolution: "@jsonjoy.com/base64@npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/ae44b0c4c83ecc5c0ee1911706a665e18e89d64a2b705cc458d7f6fc3c3c7db0e621261e978d02b74ded6a9fe1aafc8e708eb8a133e794a92bb033c50a0c4ccd languageName: node linkType: hard @@ -4310,6 +2933,15 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/buffers@npm:17.67.0, @jsonjoy.com/buffers@npm:^17.65.0": + version: 17.67.0 + resolution: "@jsonjoy.com/buffers@npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/6c8f6c4c73ec4ddab538a88be0bf72d8a934752755d43b0289fbe19ce9fa6123f082d1cd5ae179495e121a2f50267d26d36641f6dadedd8d5d2a2f980426e8ff + languageName: node + linkType: hard + "@jsonjoy.com/buffers@npm:^1.0.0, @jsonjoy.com/buffers@npm:^1.2.0": version: 1.2.1 resolution: "@jsonjoy.com/buffers@npm:1.2.1" @@ -4319,6 +2951,15 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/codegen@npm:17.67.0": + version: 17.67.0 + resolution: "@jsonjoy.com/codegen@npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/e2462836c708999d045c4a15099f12e721089a3731f0ad33da210559a52ed763b8bddbec3c181857341984ef12ea355290609f37f0dc6f8de1545c028090adf5 + languageName: node + linkType: hard + "@jsonjoy.com/codegen@npm:^1.0.0": version: 1.0.0 resolution: "@jsonjoy.com/codegen@npm:1.0.0" @@ -4328,6 +2969,109 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/fs-core@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-core@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + thingies: "npm:^2.5.0" + peerDependencies: + tslib: 2 + checksum: 10/4ff94bf45f11a87f7a2efa46af4bcdc7d3a3d89c44d834529bd32be9e4563910bd28ecb0e232bfcdd9365b7696a8ee4c5bc4928b8abd03ac14167209eff033a8 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-fsa@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-fsa@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-core": "npm:4.56.10" + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + thingies: "npm:^2.5.0" + peerDependencies: + tslib: 2 + checksum: 10/1b5213fe0c47f8ef675477bd4d66a76a5650f5891fce32599303d5a498614e248dec06cead4bcb58a0721f1c31dd2e2400b2a0941d4dc04db1861359d015aac6 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-builtins@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node-builtins@npm:4.56.10" + peerDependencies: + tslib: 2 + checksum: 10/49ebcc00bb794960b591808ce242c17604556a6b8792413876e75344e0506dd73d4ea4ea3cd566447e399cfacd8a41a2a0fbd361cdcb00a43bbb32a37d2c60d9 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-to-fsa@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node-to-fsa@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-fsa": "npm:4.56.10" + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + peerDependencies: + tslib: 2 + checksum: 10/171ad50c365829684deda3cb27de69a482dbb9916b2ea944d70f2f61a337a2994d8e5b0c17df08700fbf11f71e1a513d0332d8d9379bc3ed9e707ef0ec9967bf + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node-utils@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node-utils@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + peerDependencies: + tslib: 2 + checksum: 10/6a64c96e7b3e31580e747d675ddb380de05635970cd597c185aa254a987873410fd03cffdf52ad18512a4c9692f148a45292fbc736f1a8c0fcf03be532dd6f99 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-node@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-node@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-core": "npm:4.56.10" + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + "@jsonjoy.com/fs-print": "npm:4.56.10" + "@jsonjoy.com/fs-snapshot": "npm:4.56.10" + glob-to-regex.js: "npm:^1.0.0" + thingies: "npm:^2.5.0" + peerDependencies: + tslib: 2 + checksum: 10/5cb12740f9294d3e3ffe2d5fa19d620df7c1fddcefeb41940df62ff1c5fb7ca7c2d077cb4e285f35dd7abe1075a0998ce92c264c9d7551f5d8b0edf030c5332a + languageName: node + linkType: hard + +"@jsonjoy.com/fs-print@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-print@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/48cb69d7d2c4567d6938e59d3bcd2ddaca4d2154dcb3922064a2968727009cf239b54def9fe9e5818a9042bfd749cc11c961efbec58dd686a2ece59d127bb333 + languageName: node + linkType: hard + +"@jsonjoy.com/fs-snapshot@npm:4.56.10": + version: 4.56.10 + resolution: "@jsonjoy.com/fs-snapshot@npm:4.56.10" + dependencies: + "@jsonjoy.com/buffers": "npm:^17.65.0" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + "@jsonjoy.com/json-pack": "npm:^17.65.0" + "@jsonjoy.com/util": "npm:^17.65.0" + peerDependencies: + tslib: 2 + checksum: 10/151f38050afe22d724d3a543b5363f43f3e0e7a6904fc1c1ba890569e34c80332dbd5f30d829fad02e76ccd0a141419a3ba331b89edb86ebc3a6d1896c1b7d04 + languageName: node + linkType: hard + "@jsonjoy.com/json-pack@npm:^1.11.0": version: 1.21.0 resolution: "@jsonjoy.com/json-pack@npm:1.21.0" @@ -4346,6 +3090,35 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/json-pack@npm:^17.65.0": + version: 17.67.0 + resolution: "@jsonjoy.com/json-pack@npm:17.67.0" + dependencies: + "@jsonjoy.com/base64": "npm:17.67.0" + "@jsonjoy.com/buffers": "npm:17.67.0" + "@jsonjoy.com/codegen": "npm:17.67.0" + "@jsonjoy.com/json-pointer": "npm:17.67.0" + "@jsonjoy.com/util": "npm:17.67.0" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^2.5.0" + tree-dump: "npm:^1.1.0" + peerDependencies: + tslib: 2 + checksum: 10/9ff4403862e49433fe607175e90af749d64902640d63919ba559e5748d1a3db60d7366cc3b84dcc4a57ad478540e5eecb22fed80766e293482a0ab8e583b1b0b + languageName: node + linkType: hard + +"@jsonjoy.com/json-pointer@npm:17.67.0": + version: 17.67.0 + resolution: "@jsonjoy.com/json-pointer@npm:17.67.0" + dependencies: + "@jsonjoy.com/util": "npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/5a27c6b5b1276d357cfc3e8a05112d6305ccd17bf672190f25dfac2f4108ced170e784451d64728f60f93305c0007e3f832ddd175b8a47f3eb652cbabcec31ad + languageName: node + linkType: hard + "@jsonjoy.com/json-pointer@npm:^1.0.2": version: 1.0.2 resolution: "@jsonjoy.com/json-pointer@npm:1.0.2" @@ -4358,6 +3131,18 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/util@npm:17.67.0, @jsonjoy.com/util@npm:^17.65.0": + version: 17.67.0 + resolution: "@jsonjoy.com/util@npm:17.67.0" + dependencies: + "@jsonjoy.com/buffers": "npm:17.67.0" + "@jsonjoy.com/codegen": "npm:17.67.0" + peerDependencies: + tslib: 2 + checksum: 10/b0facf65c3190d6ed1ada7e5b7679d80fa5da73bfbd02f2bb2f3af1c28c0d854b6ee2350824313b7ba82c0e5191da94903b4af61255bc232dbb7feedd2f31e0c + languageName: node + linkType: hard + "@jsonjoy.com/util@npm:^1.9.0": version: 1.9.0 resolution: "@jsonjoy.com/util@npm:1.9.0" @@ -4378,23 +3163,25 @@ __metadata: linkType: hard "@mdx-js/mdx@npm:^3.0.0": - version: 3.0.1 - resolution: "@mdx-js/mdx@npm:3.0.1" + version: 3.1.1 + resolution: "@mdx-js/mdx@npm:3.1.1" dependencies: "@types/estree": "npm:^1.0.0" "@types/estree-jsx": "npm:^1.0.0" "@types/hast": "npm:^3.0.0" "@types/mdx": "npm:^2.0.0" + acorn: "npm:^8.0.0" collapse-white-space: "npm:^2.0.0" devlop: "npm:^1.0.0" - estree-util-build-jsx: "npm:^3.0.0" estree-util-is-identifier-name: "npm:^3.0.0" - estree-util-to-js: "npm:^2.0.0" + estree-util-scope: "npm:^1.0.0" estree-walker: "npm:^3.0.0" - hast-util-to-estree: "npm:^3.0.0" hast-util-to-jsx-runtime: "npm:^2.0.0" markdown-extensions: "npm:^2.0.0" - periscopic: "npm:^3.0.0" + recma-build-jsx: "npm:^1.0.0" + recma-jsx: "npm:^1.0.0" + recma-stringify: "npm:^1.0.0" + rehype-recma: "npm:^1.0.0" remark-mdx: "npm:^3.0.0" remark-parse: "npm:^11.0.0" remark-rehype: "npm:^11.0.0" @@ -4404,23 +3191,11 @@ __metadata: unist-util-stringify-position: "npm:^4.0.0" unist-util-visit: "npm:^5.0.0" vfile: "npm:^6.0.0" - checksum: 10/e3f0b57e6940b491fdae3ab6d746d9cb8283a3ffaa4de2f989fef883c21fbb04978bd33ae7186b16e511c007a608a00bd76fb652fb631362170f8cd7e3be1221 - languageName: node - linkType: hard - -"@mdx-js/react@npm:^3.0.0": - version: 3.0.1 - resolution: "@mdx-js/react@npm:3.0.1" - dependencies: - "@types/mdx": "npm:^2.0.0" - peerDependencies: - "@types/react": ">=16" - react: ">=16" - checksum: 10/d566407af11e76f498f8133fbfa8a9d8a2ad80dc7a66ca109d29fcb92e953a2d2d7aaedc0c28571d126f1967faeb126dd2e4ab4ea474c994bf5c76fa204c5997 + checksum: 10/b871da2497f6e0f11da1574fe772a50b09b7c177de8df0f821f708bf162febe76c01a572a5c68e860960189209fd66f768c2e747fdb3a1f497c5c32e11890c11 languageName: node linkType: hard -"@mdx-js/react@npm:^3.1.1": +"@mdx-js/react@npm:^3.0.0, @mdx-js/react@npm:^3.1.1": version: 3.1.1 resolution: "@mdx-js/react@npm:3.1.1" dependencies: @@ -4432,76 +3207,41 @@ __metadata: languageName: node linkType: hard -"@mermaid-js/parser@npm:^0.4.0": - version: 0.4.0 - resolution: "@mermaid-js/parser@npm:0.4.0" +"@mermaid-js/parser@npm:^1.0.0": + version: 1.0.0 + resolution: "@mermaid-js/parser@npm:1.0.0" dependencies: - langium: "npm:3.3.1" - checksum: 10/ae6258256c84af6cc6ce7e0ad423c3b0c16dbd1e7ff5a456d3e131238c6d1ed26d488cb339acefdb661811215da5df04dd3254e71b686acc7c53e63738816e5c + langium: "npm:^4.0.0" + checksum: 10/690004aef133b528b36f5f503ad3647568e3a40be65a4dfe41588f12d974b833c68eb2d8aa885cc56670b730f4108acb906ee8131d6f7329e49c8ca347861d9d languageName: node linkType: hard -"@mux/mux-data-google-ima@npm:0.2.8": - version: 0.2.8 - resolution: "@mux/mux-data-google-ima@npm:0.2.8" +"@monaco-editor/loader@npm:^1.5.0": + version: 1.7.0 + resolution: "@monaco-editor/loader@npm:1.7.0" dependencies: - mux-embed: "npm:5.9.0" - checksum: 10/d25dc83ff1ed1fc502a6d18b6b2ff92d9d58df1c21133efc6e8e2a473dfe8e03fce6463b766d091fe23d78bfbafa8b13471bccdf3cb1569408f87a295187ee19 + state-local: "npm:^1.0.6" + checksum: 10/7ee7406f0a7036e2638430d151c65593dcce88e3f344e2e19556c284c23c1b51d5edb08b8c15a6454aaa62f5af459a296db76b9543686e2ea5037c54723d2f2d languageName: node linkType: hard -"@mux/mux-player-react@npm:^3.6.0": - version: 3.6.1 - resolution: "@mux/mux-player-react@npm:3.6.1" +"@monaco-editor/react@npm:4.7.0": + version: 4.7.0 + resolution: "@monaco-editor/react@npm:4.7.0" dependencies: - "@mux/mux-player": "npm:3.6.1" - "@mux/playback-core": "npm:0.31.0" - prop-types: "npm:^15.8.1" + "@monaco-editor/loader": "npm:^1.5.0" peerDependencies: - "@types/react": ^17.0.0 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0 - react: ^17.0.2 || ^17.0.0-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0 - react-dom: ^17.0.2 || ^17.0.2-0 || ^18 || ^18.0.0-0 || ^19 || ^19.0.0-0 - peerDependenciesMeta: - "@types/react": - optional: true - "@types/react-dom": - optional: true - checksum: 10/d17e6b3d76d0616f36f19944a38894e5ac813a6e41a4b1012e8c9b26a12d8b7892a7df9e074521f8764f15e7f1d11b58c60c3a7b7f396de0060e641ffc58ef46 - languageName: node - linkType: hard - -"@mux/mux-player@npm:3.6.1": - version: 3.6.1 - resolution: "@mux/mux-player@npm:3.6.1" - dependencies: - "@mux/mux-video": "npm:0.27.0" - "@mux/playback-core": "npm:0.31.0" - media-chrome: "npm:~4.14.0" - player.style: "npm:^0.2.0" - checksum: 10/99f7fecf0e979c0c4f53ca14d3d6607cbd39870cac9af32d56f0b77301b387b8470e29a80a4c6a2e3fc92aff4a10474e4b37bf888506fe33539b868c8ab1b9c8 - languageName: node - linkType: hard - -"@mux/mux-video@npm:0.27.0": - version: 0.27.0 - resolution: "@mux/mux-video@npm:0.27.0" - dependencies: - "@mux/mux-data-google-ima": "npm:0.2.8" - "@mux/playback-core": "npm:0.31.0" - castable-video: "npm:~1.1.10" - custom-media-element: "npm:~1.4.5" - media-tracks: "npm:~0.3.3" - checksum: 10/f888832dbf0afe24323ea7171df6fc96c6e5e1a40bf4057d570adc65348f98c6fd056488444035f4492c08106dd64b58e60a47806fe3fb5eb780c6aa1ab84c91 + monaco-editor: ">= 0.25.0 < 1" + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/d72392c4ed6faf8d830ba43421461e1b767b5978edba0739457d7781aa9533c66982be7f59bb156a77a2b578eddfb4711f50e0d84f0f0d25d28b5ab11140f5cc languageName: node linkType: hard -"@mux/playback-core@npm:0.31.0": - version: 0.31.0 - resolution: "@mux/playback-core@npm:0.31.0" - dependencies: - hls.js: "npm:~1.6.6" - mux-embed: "npm:^5.8.3" - checksum: 10/90bf281fbd06c4f4564386d2931362866e0a2b3c3988de5fd4a99fb7c2bf976d5e5bc7f9f19b831e5d6173fe2b102e49ad3c48ed1ca83d91788c6168fde5f204 +"@noble/hashes@npm:1.4.0": + version: 1.4.0 + resolution: "@noble/hashes@npm:1.4.0" + checksum: 10/e156e65794c473794c52fa9d06baf1eb20903d0d96719530f523cc4450f6c721a957c544796e6efd0197b2296e7cd70efeb312f861465e17940a3e3c7e0febc6 languageName: node linkType: hard @@ -4532,39 +3272,170 @@ __metadata: languageName: node linkType: hard -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" +"@npmcli/agent@npm:^4.0.0": + version: 4.0.0 + resolution: "@npmcli/agent@npm:4.0.0" dependencies: agent-base: "npm:^7.1.0" http-proxy-agent: "npm:^7.0.0" https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" + lru-cache: "npm:^11.2.1" socks-proxy-agent: "npm:^8.0.3" - checksum: 10/96fc0036b101bae5032dc2a4cd832efb815ce9b33f9ee2f29909ee49d96a0026b3565f73c507a69eb8603f5cb32e0ae45a70cab1e2655990a4e06ae99f7f572a + checksum: 10/1a81573becc60515031accc696e6405e9b894e65c12b98ef4aeee03b5617c41948633159dbf6caf5dde5b47367eeb749bdc7b7dfb21960930a9060a935c6f636 languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" +"@npmcli/fs@npm:^5.0.0": + version: 5.0.0 + resolution: "@npmcli/fs@npm:5.0.0" dependencies: semver: "npm:^7.3.5" - checksum: 10/1e0e04087049b24b38bc0b30d87a9388ee3ca1d3fdfc347c2f77d84fcfe6a51f250bc57ba2c1f614d7e4285c6c62bf8c769bc19aa0949ea39e5b043ee023b0bd + checksum: 10/4935c7719d17830d0f9fa46c50be17b2a3c945cec61760f6d0909bce47677c42e1810ca673305890f9e84f008ec4d8e841182f371e42100a8159d15f22249208 languageName: node linkType: hard -"@opentelemetry/api@npm:1.9.0": - version: 1.9.0 - resolution: "@opentelemetry/api@npm:1.9.0" - checksum: 10/a607f0eef971893c4f2ee2a4c2069aade6ec3e84e2a1f5c2aac19f65c5d9eeea41aa72db917c1029faafdd71789a1a040bdc18f40d63690e22ccae5d7070f194 +"@peculiar/asn1-cms@npm:^2.6.0, @peculiar/asn1-cms@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-cms@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" + "@peculiar/asn1-x509-attr": "npm:^2.6.1" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/e431f6229b98c63a929538d266488e8c2dddc895936117da8f9ec775558e08c20ded6a4adcca4bb88bfea282e7204d4f6bba7a46da2cced162c174e1e6964f36 + languageName: node + linkType: hard + +"@peculiar/asn1-csr@npm:^2.6.0": + version: 2.6.1 + resolution: "@peculiar/asn1-csr@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/4ac2f1c3a2cb392fcdd5aa602140abe90f849af0a9e8296aab9aaf1712ee2e0c4f5fa86b0fe83975e771b0aba91fc848670f9c2008ea1e850c849fae6e181179 + languageName: node + linkType: hard + +"@peculiar/asn1-ecc@npm:^2.6.0": + version: 2.6.1 + resolution: "@peculiar/asn1-ecc@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/baa646c1c86283d5876230b1cfbd80cf42f97b3bb8d8b23cd5830f6f8d6466e6a06887c6838f3c4c61c87df9ffd2abe905f555472e8e70d722ce964a8074d838 + languageName: node + linkType: hard + +"@peculiar/asn1-pfx@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-pfx@npm:2.6.1" + dependencies: + "@peculiar/asn1-cms": "npm:^2.6.1" + "@peculiar/asn1-pkcs8": "npm:^2.6.1" + "@peculiar/asn1-rsa": "npm:^2.6.1" + "@peculiar/asn1-schema": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/50adc7db96928d98b85a1a2e6765ba1d4ec708f937b8172ea6a22e3b92137ea36d656aded64b3be661db39f924102c5a80da54ee647e2441af3bc19c55a183ef + languageName: node + linkType: hard + +"@peculiar/asn1-pkcs8@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-pkcs8@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/99c4326da30e7ef17bb8e92d8a9525b78c101e4d743493000e220f3da6bbc4755371f1dbcc2a36951fb15769c2efead20d90a08918fd268c21bebcac26e71053 + languageName: node + linkType: hard + +"@peculiar/asn1-pkcs9@npm:^2.6.0": + version: 2.6.1 + resolution: "@peculiar/asn1-pkcs9@npm:2.6.1" + dependencies: + "@peculiar/asn1-cms": "npm:^2.6.1" + "@peculiar/asn1-pfx": "npm:^2.6.1" + "@peculiar/asn1-pkcs8": "npm:^2.6.1" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" + "@peculiar/asn1-x509-attr": "npm:^2.6.1" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/61759a50d6adf108a0376735b2e76cdfc9c41db39a7abed23ca332f7699d831aa6324534aa38153018a31e6ee5e8fef85534c92b68067f6afcb90787e953c449 + languageName: node + linkType: hard + +"@peculiar/asn1-rsa@npm:^2.6.0, @peculiar/asn1-rsa@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-rsa@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/e91efe57017feac71c69ee5950e9c323b45aaf10baa32153fe88f237948f9d906ba04c645d085c4293c90440cad95392a91b3760251cd0ebc8e4c1a383fc331a + languageName: node + linkType: hard + +"@peculiar/asn1-schema@npm:^2.6.0": + version: 2.6.0 + resolution: "@peculiar/asn1-schema@npm:2.6.0" + dependencies: + asn1js: "npm:^3.0.6" + pvtsutils: "npm:^1.3.6" + tslib: "npm:^2.8.1" + checksum: 10/af9b1094d0e020f0fd828777488578322d62a41f597ead7d80939dafcfe35b672fcb0ec7460ef66b2a155f9614d4340a98896d417a830aff1685cb4c21d5bbe4 + languageName: node + linkType: hard + +"@peculiar/asn1-x509-attr@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-x509-attr@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.1" + asn1js: "npm:^3.0.6" + tslib: "npm:^2.8.1" + checksum: 10/86f7d5495459dee81daadd830ebb7d26ec15a98f6479c88b90a915ac9f28105b0d5003ba0c382b4aa8f7fa42e399f7cc37e4fe73c26cbaacd47e63a50b132e25 + languageName: node + linkType: hard + +"@peculiar/asn1-x509@npm:^2.6.0, @peculiar/asn1-x509@npm:^2.6.1": + version: 2.6.1 + resolution: "@peculiar/asn1-x509@npm:2.6.1" + dependencies: + "@peculiar/asn1-schema": "npm:^2.6.0" + asn1js: "npm:^3.0.6" + pvtsutils: "npm:^1.3.6" + tslib: "npm:^2.8.1" + checksum: 10/e3187ad04d397cdd6a946895a51202b67f57992dfef55e40acc7e7ea325e2854267ed2581c4b1ea729d7147e9e8e6f34af77f1ffb48e3e8b25b2216b213b4641 languageName: node linkType: hard -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff +"@peculiar/x509@npm:^1.14.2": + version: 1.14.3 + resolution: "@peculiar/x509@npm:1.14.3" + dependencies: + "@peculiar/asn1-cms": "npm:^2.6.0" + "@peculiar/asn1-csr": "npm:^2.6.0" + "@peculiar/asn1-ecc": "npm:^2.6.0" + "@peculiar/asn1-pkcs9": "npm:^2.6.0" + "@peculiar/asn1-rsa": "npm:^2.6.0" + "@peculiar/asn1-schema": "npm:^2.6.0" + "@peculiar/asn1-x509": "npm:^2.6.0" + pvtsutils: "npm:^1.3.6" + reflect-metadata: "npm:^0.2.2" + tslib: "npm:^2.8.1" + tsyringe: "npm:^4.10.0" + checksum: 10/d37c56fa5f2c644141948d85010e14f0e4963089e3b0b81edd0bfe85bdfea0eb3f38ab6ff20d322db2bd6977117824cc498a77b2d35af111983b4d58b5e2ccd1 languageName: node linkType: hard @@ -4584,21 +3455,21 @@ __metadata: languageName: node linkType: hard -"@pnpm/npm-conf@npm:^2.1.0": - version: 2.2.2 - resolution: "@pnpm/npm-conf@npm:2.2.2" +"@pnpm/npm-conf@npm:^3.0.2": + version: 3.0.2 + resolution: "@pnpm/npm-conf@npm:3.0.2" dependencies: "@pnpm/config.env-replace": "npm:^1.1.0" "@pnpm/network.ca-file": "npm:^1.0.1" config-chain: "npm:^1.1.11" - checksum: 10/45422fecc7ed49e5254eef744576625e27cdebccce930f42c66cf2fb70443fc24f506c3fcf4859e6371677ceb144feb45e925ec14774b54588b89806b32dea9a + checksum: 10/cc557ebc8f5523950f4947b7a46d919d6de990c3635103a603a7cb5b66ce992ab21e3f780e7266b9f97aa455bae91cccd2c4c8a3a6c02ef43330e25f01a237c9 languageName: node linkType: hard "@polka/url@npm:^1.0.0-next.24": - version: 1.0.0-next.25 - resolution: "@polka/url@npm:1.0.0-next.25" - checksum: 10/4ab1d7a37163139c0e7bfc9d1e3f6a2a0db91a78b9f0a21f571d6aec2cdaeaacced744d47886c117aa7579aa5694b303fe3e0bd1922bb9cb3ce6bf7c2dc09801 + version: 1.0.0-next.29 + resolution: "@polka/url@npm:1.0.0-next.29" + checksum: 10/69ca11ab15a4ffec7f0b07fcc4e1f01489b3d9683a7e1867758818386575c60c213401259ba3705b8a812228d17e2bfd18e6f021194d943fff4bca389c9d4f28 languageName: node linkType: hard @@ -4626,9 +3497,9 @@ __metadata: linkType: hard "@sinclair/typebox@npm:^0.27.8": - version: 0.27.8 - resolution: "@sinclair/typebox@npm:0.27.8" - checksum: 10/297f95ff77c82c54de8c9907f186076e715ff2621c5222ba50b8d40a170661c0c5242c763cba2a4791f0f91cb1d8ffa53ea1d7294570cf8cd4694c0e383e484d + version: 0.27.10 + resolution: "@sinclair/typebox@npm:0.27.10" + checksum: 10/1498c5ef1375787e6272528615d5c262afb60873191d2441316359817b1c411917063c8be102ef15b0b5c62243a9daa7aefc8426f20eb406b67038b3eaa0695a languageName: node linkType: hard @@ -4657,13 +3528,6 @@ __metadata: languageName: node linkType: hard -"@standard-schema/spec@npm:^1.0.0": - version: 1.0.0 - resolution: "@standard-schema/spec@npm:1.0.0" - checksum: 10/aee780cc1431888ca4b9aba9b24ffc8f3073fc083acc105e3951481478a2f4dc957796931b2da9e2d8329584cf211e4542275f188296c1cdff3ed44fd93a8bc8 - languageName: node - linkType: hard - "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0": version: 8.0.0 resolution: "@svgr/babel-plugin-add-jsx-attribute@npm:8.0.0" @@ -4820,13 +3684,6 @@ __metadata: languageName: node linkType: hard -"@svta/common-media-library@npm:^0.12.4": - version: 0.12.4 - resolution: "@svta/common-media-library@npm:0.12.4" - checksum: 10/c30c4f4a9261a499649a09b27548ad39f0956986854e7763ffffe2e0b12f535f7657046bcaea7fe47e5864bffb54155005039bed72433c320f68d9c68afaac27 - languageName: node - linkType: hard - "@szmarczak/http-timer@npm:^5.0.1": version: 5.0.1 resolution: "@szmarczak/http-timer@npm:5.0.1" @@ -4843,22 +3700,13 @@ __metadata: languageName: node linkType: hard -"@types/acorn@npm:^4.0.0": - version: 4.0.6 - resolution: "@types/acorn@npm:4.0.6" - dependencies: - "@types/estree": "npm:*" - checksum: 10/e00671d5055d06b07feccb8c2841467a4bdd1ab95a29e191d51cacc08c496e1ba1f54edeefab274bb2ba51cb45b0aaaa662a63897650e9d02e9997ad82124ae4 - languageName: node - linkType: hard - "@types/body-parser@npm:*": - version: 1.19.5 - resolution: "@types/body-parser@npm:1.19.5" + version: 1.19.6 + resolution: "@types/body-parser@npm:1.19.6" dependencies: "@types/connect": "npm:*" "@types/node": "npm:*" - checksum: 10/1e251118c4b2f61029cc43b0dc028495f2d1957fe8ee49a707fb940f86a9bd2f9754230805598278fe99958b49e9b7e66eec8ef6a50ab5c1f6b93e1ba2aaba82 + checksum: 10/33041e88eae00af2cfa0827e951e5f1751eafab2a8b6fce06cd89ef368a988907996436b1325180edaeddd1c0c7d0d0d4c20a6c9ff294a91e0039a9db9e9b658 languageName: node linkType: hard @@ -4891,9 +3739,9 @@ __metadata: linkType: hard "@types/d3-array@npm:*": - version: 3.2.1 - resolution: "@types/d3-array@npm:3.2.1" - checksum: 10/4a9ecacaa859cff79e10dcec0c79053f027a4749ce0a4badeaff7400d69a9c44eb8210b147916b6ff5309be049030e7d68a0e333294ff3fa11c44aa1af4ba458 + version: 3.2.2 + resolution: "@types/d3-array@npm:3.2.2" + checksum: 10/1afebd05b688cafaaea295f765b409789f088b274b8a7ca40a4bc2b79760044a898e06a915f40bbc59cf39eabdd2b5d32e960b136fc025fd05c9a9d4435614c6 languageName: node linkType: hard @@ -4947,9 +3795,9 @@ __metadata: linkType: hard "@types/d3-dispatch@npm:*": - version: 3.0.6 - resolution: "@types/d3-dispatch@npm:3.0.6" - checksum: 10/f82076c7d205885480d363c92c19b8e0d6b9e529a3a78ce772f96a7cc4cce01f7941141f148828337035fac9676b13e7440565530491d560fdf12e562cb56573 + version: 3.0.7 + resolution: "@types/d3-dispatch@npm:3.0.7" + checksum: 10/ce7ab5a7d5c64aacf563797c0c61f3862b9ff687cb35470fe462219f09e402185646f51707339beede616586d92ded6974c3958dbeb15e35a85b1ecfafdf13a8 languageName: node linkType: hard @@ -5076,11 +3924,11 @@ __metadata: linkType: hard "@types/d3-shape@npm:*": - version: 3.1.7 - resolution: "@types/d3-shape@npm:3.1.7" + version: 3.1.8 + resolution: "@types/d3-shape@npm:3.1.8" dependencies: "@types/d3-path": "npm:*" - checksum: 10/b7ddda2a9c916ba438308bfa6e53fa2bb11c2ce13537ba2a7816c16f9432287b57901921c7231d2924f2d7d360535c3795f017865ab05abe5057c6ca06ca81df + checksum: 10/ebc161d49101d84409829fea516ba7ec71ad51a1e97438ca0fafc1c30b56b3feae802d220375323632723a338dda7237c652e831e0b53527a6222ab0d1bb7809 languageName: node linkType: hard @@ -5092,9 +3940,9 @@ __metadata: linkType: hard "@types/d3-time@npm:*": - version: 3.0.3 - resolution: "@types/d3-time@npm:3.0.3" - checksum: 10/4e6bf24ec422f0893747e5020592e107bb3d96764a43d5f0bff666202bd71f052c73f735b50ec66296a6efd5766ca40b6a4e8ce3bbc61217dbe9467340608c12 + version: 3.0.4 + resolution: "@types/d3-time@npm:3.0.4" + checksum: 10/b1eb4255066da56023ad243fd4ae5a20462d73bd087a0297c7d49ece42b2304a4a04297568c604a38541019885b2bc35a9e0fd704fad218e9bc9c5f07dc685ce languageName: node linkType: hard @@ -5200,65 +4048,57 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 - languageName: node - linkType: hard - -"@types/estree@npm:^1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.8": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: 10/25a4c16a6752538ffde2826c2cc0c6491d90e69cd6187bef4a006dd2c3c45469f049e643d7e516c515f21484dc3d48fd5c870be158a5beb72f5baf3dc43e4099 languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.19.5 - resolution: "@types/express-serve-static-core@npm:4.19.5" +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": + version: 5.1.1 + resolution: "@types/express-serve-static-core@npm:5.1.1" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 10/49350c6315eeb7d640e13e6138ba6005121b3b610b1e25746fccd5b86b559be810a4ba384b9bd7eee288975b5bd8cf67c1772c646254b812beaa488774eb5513 + checksum: 10/7f3d8cf7e68764c9f3e8f6a12825b69ccf5287347fc1c20b29803d4f08a4abc1153ae11d7258852c61aad50f62ef72d4c1b9c97092b0a90462c3dddec2f6026c languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.21": - version: 4.19.7 - resolution: "@types/express-serve-static-core@npm:4.19.7" +"@types/express-serve-static-core@npm:^4.17.21, @types/express-serve-static-core@npm:^4.17.33": + version: 4.19.8 + resolution: "@types/express-serve-static-core@npm:4.19.8" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: 10/a87830df965fb52eec6390accdba918a6f33f3d6cb96853be2cc2f74829a0bc09a29bddd9699127dbc17a170c7eebbe1294a9db9843b5a34dbc768f9ee844c01 + checksum: 10/eb1b832343c0991395c9b10e124dc805921ea7c08efe01222d83912123b8c054119d009e9e55c91af6bdbeeec153c0d35411c9c6d80781bc8c0a43e8b1a84387 languageName: node linkType: hard "@types/express@npm:*": - version: 4.17.21 - resolution: "@types/express@npm:4.17.21" + version: 5.0.6 + resolution: "@types/express@npm:5.0.6" dependencies: "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^4.17.33" - "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10/7a6d26cf6f43d3151caf4fec66ea11c9d23166e4f3102edfe45a94170654a54ea08cf3103d26b3928d7ebcc24162c90488e33986b7e3a5f8941225edd5eb18c7 + "@types/express-serve-static-core": "npm:^5.0.0" + "@types/serve-static": "npm:^2" + checksum: 10/da2cc3de1b1a4d7f20ed3fb6f0a8ee08e99feb3c2eb5a8d643db77017d8d0e70fee9e95da38a73f51bcdf5eda3bb6435073c0271dc04fb16fda92e55daf911fa languageName: node linkType: hard -"@types/express@npm:^4.17.21": - version: 4.17.23 - resolution: "@types/express@npm:4.17.23" +"@types/express@npm:^4.17.25": + version: 4.17.25 + resolution: "@types/express@npm:4.17.25" dependencies: "@types/body-parser": "npm:*" "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" - "@types/serve-static": "npm:*" - checksum: 10/cf4d540bbd90801cdc79a46107b8873404698a7fd0c3e8dd42989d52d3bd7f5b8768672e54c20835e41e27349c319bb47a404ad14c0f8db0e9d055ba1cb8a05b + "@types/serve-static": "npm:^1" + checksum: 10/c309fdb79fb8569b5d8d8f11268d0160b271f8b38f0a82c20a0733e526baf033eb7a921cd51d54fe4333c616de9e31caf7d4f3ef73baaf212d61f23f460b0369 languageName: node linkType: hard @@ -5300,25 +4140,25 @@ __metadata: linkType: hard "@types/http-cache-semantics@npm:^4.0.2": - version: 4.0.4 - resolution: "@types/http-cache-semantics@npm:4.0.4" - checksum: 10/a59566cff646025a5de396d6b3f44a39ab6a74f2ed8150692e0f31cc52f3661a68b04afe3166ebe0d566bd3259cb18522f46e949576d5204781cd6452b7fe0c5 + version: 4.2.0 + resolution: "@types/http-cache-semantics@npm:4.2.0" + checksum: 10/01ea0dc9c1852267f5f9a0190846ac158707994b8e325bca190385ec97aa773d4a99cd333e22e838bde3c9aba59e2b5a6ac399b494c203587c6d8f28d21d6326 languageName: node linkType: hard "@types/http-errors@npm:*": - version: 2.0.4 - resolution: "@types/http-errors@npm:2.0.4" - checksum: 10/1f3d7c3b32c7524811a45690881736b3ef741bf9849ae03d32ad1ab7062608454b150a4e7f1351f83d26a418b2d65af9bdc06198f1c079d75578282884c4e8e3 + version: 2.0.5 + resolution: "@types/http-errors@npm:2.0.5" + checksum: 10/a88da669366bc483e8f3b3eb3d34ada5f8d13eeeef851b1204d77e2ba6fc42aba4566d877cca5c095204a3f4349b87fe397e3e21288837bdd945dd514120755b languageName: node linkType: hard "@types/http-proxy@npm:^1.17.8": - version: 1.17.14 - resolution: "@types/http-proxy@npm:1.17.14" + version: 1.17.17 + resolution: "@types/http-proxy@npm:1.17.17" dependencies: "@types/node": "npm:*" - checksum: 10/aa1a3e66cd43cbf06ea5901bf761d2031200a0ab42ba7e462a15c752e70f8669f21fb3be7c2f18fefcb83b95132dfa15740282e7421b856745598fbaea8e3a42 + checksum: 10/893e46e12be576baa471cf2fc13a4f0e413eaf30a5850de8fdbea3040e138ad4171234c59b986cf7137ff20a1582b254bf0c44cfd715d5ed772e1ab94dd75cd1 languageName: node linkType: hard @@ -5347,7 +4187,7 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 @@ -5378,27 +4218,18 @@ __metadata: linkType: hard "@types/ms@npm:*": - version: 0.7.34 - resolution: "@types/ms@npm:0.7.34" - checksum: 10/f38d36e7b6edecd9badc9cf50474159e9da5fa6965a75186cceaf883278611b9df6669dc3a3cc122b7938d317b68a9e3d573d316fcb35d1be47ec9e468c6bd8a - languageName: node - linkType: hard - -"@types/node-forge@npm:^1.3.0": - version: 1.3.11 - resolution: "@types/node-forge@npm:1.3.11" - dependencies: - "@types/node": "npm:*" - checksum: 10/670c9b377c48189186ec415e3c8ed371f141ecc1a79ab71b213b20816adeffecba44dae4f8406cc0d09e6349a4db14eb8c5893f643d8e00fa19fc035cf49dee0 + version: 2.1.0 + resolution: "@types/ms@npm:2.1.0" + checksum: 10/532d2ebb91937ccc4a89389715e5b47d4c66e708d15942fe6cc25add6dc37b2be058230a327dd50f43f89b8b6d5d52b74685a9e8f70516edfc9bdd6be910eff4 languageName: node linkType: hard "@types/node@npm:*": - version: 20.14.10 - resolution: "@types/node@npm:20.14.10" + version: 25.3.0 + resolution: "@types/node@npm:25.3.0" dependencies: - undici-types: "npm:~5.26.4" - checksum: 10/672892cf94d0d95cf052f11271990686a0fd204cd1e5fe7a4ef240e5315e06711765dc47b9ec98627d3adac18b8c92bb7e2d8db21d18faa20bc3e3203a143e79 + undici-types: "npm:~7.18.0" + checksum: 10/061b00c8de070a606a052afaa4c45dca5f8d6a8e7e39c0c3e196bb650ee37e986bbb161991ea39076a05aada102f36b13c974528448a09efd8d36bdfee75de4b languageName: node linkType: hard @@ -5410,23 +4241,16 @@ __metadata: linkType: hard "@types/prismjs@npm:^1.26.0": - version: 1.26.4 - resolution: "@types/prismjs@npm:1.26.4" - checksum: 10/fcf7072c56835bfdc9bd9c06acd733440c5198b9fba33c5de09cd7bfe9e6663604120c5d602ffbeb806cdc06447fb711d84fc89c9039b8cc95078702a15e7ff1 - languageName: node - linkType: hard - -"@types/prop-types@npm:*": - version: 15.7.12 - resolution: "@types/prop-types@npm:15.7.12" - checksum: 10/ac16cc3d0a84431ffa5cfdf89579ad1e2269549f32ce0c769321fdd078f84db4fbe1b461ed5a1a496caf09e637c0e367d600c541435716a55b1d9713f5035dfe + version: 1.26.6 + resolution: "@types/prismjs@npm:1.26.6" + checksum: 10/37c056eb7a9130ef6548d7655af78ea575c8eaa9167ea2dd64d8719384b1af4a385ffe928aa4939da607ce276703a6787bdac8ecc79a373e2a73ddf6d75bc161 languageName: node linkType: hard "@types/qs@npm:*": - version: 6.9.15 - resolution: "@types/qs@npm:6.9.15" - checksum: 10/97d8208c2b82013b618e7a9fc14df6bd40a73e1385ac479b6896bafc7949a46201c15f42afd06e86a05e914f146f495f606b6fb65610cc60cf2e0ff743ec38a2 + version: 6.14.0 + resolution: "@types/qs@npm:6.14.0" + checksum: 10/1909205514d22b3cbc7c2314e2bd8056d5f05dfb21cf4377f0730ee5e338ea19957c41735d5e4806c746176563f50005bbab602d8358432e25d900bdf4970826 languageName: node linkType: hard @@ -5470,12 +4294,11 @@ __metadata: linkType: hard "@types/react@npm:*": - version: 18.3.3 - resolution: "@types/react@npm:18.3.3" + version: 19.2.14 + resolution: "@types/react@npm:19.2.14" dependencies: - "@types/prop-types": "npm:*" - csstype: "npm:^3.0.2" - checksum: 10/68e203b7f1f91d6cf21f33fc7af9d6d228035a26c83f514981e54aa3da695d0ec6af10c277c6336de1dd76c4adbe9563f3a21f80c4462000f41e5f370b46e96c + csstype: "npm:^3.2.2" + checksum: 10/fbff239089ee64b6bd9b00543594db498278b06de527ef1b0f71bb0eb09cc4445a71b5dd3c0d3d0257255c4eed94406be40a74ad4a987ade8a8d5dd65c82bc5f languageName: node linkType: hard @@ -5496,22 +4319,21 @@ __metadata: linkType: hard "@types/send@npm:*": - version: 0.17.4 - resolution: "@types/send@npm:0.17.4" + version: 1.2.1 + resolution: "@types/send@npm:1.2.1" dependencies: - "@types/mime": "npm:^1" "@types/node": "npm:*" - checksum: 10/28320a2aa1eb704f7d96a65272a07c0bf3ae7ed5509c2c96ea5e33238980f71deeed51d3631927a77d5250e4091b3e66bce53b42d770873282c6a20bb8b0280d + checksum: 10/81ef5790037ba1d2d458392e4241501f0f8b4838cc8797e169e179e099410e12069ec68e8dbd39211cb097c4a9b1ff1682dbcea897ab4ce21dad93438b862d27 languageName: node linkType: hard "@types/send@npm:<1": - version: 0.17.5 - resolution: "@types/send@npm:0.17.5" + version: 0.17.6 + resolution: "@types/send@npm:0.17.6" dependencies: "@types/mime": "npm:^1" "@types/node": "npm:*" - checksum: 10/b68ae8f9ba9328a4f276cd010914ed43b96371fbf34c7aa08a9111bff36661810bb14b96647e4a92e319dbd2689dc107fb0f9194ec3fa9335c162dc134026240 + checksum: 10/4948ab32ab84a81a0073f8243dd48ee766bc80608d5391060360afd1249f83c08a7476f142669ac0b0b8831c89d909a88bcb392d1b39ee48b276a91b50f3d8d1 languageName: node linkType: hard @@ -5524,25 +4346,24 @@ __metadata: languageName: node linkType: hard -"@types/serve-static@npm:*": - version: 1.15.7 - resolution: "@types/serve-static@npm:1.15.7" +"@types/serve-static@npm:^1, @types/serve-static@npm:^1.15.5": + version: 1.15.10 + resolution: "@types/serve-static@npm:1.15.10" dependencies: "@types/http-errors": "npm:*" "@types/node": "npm:*" - "@types/send": "npm:*" - checksum: 10/c5a7171d5647f9fbd096ed1a26105759f3153ccf683824d99fee4c7eb9cde2953509621c56a070dd9fb1159e799e86d300cbe4e42245ebc5b0c1767e8ca94a67 + "@types/send": "npm:<1" + checksum: 10/d9be72487540b9598e7d77260d533f241eb2e5db5181bb885ef2d6bc4592dad1c9e8c0e27f465d59478b2faf90edd2d535e834f20fbd9dd3c0928d43dc486404 languageName: node linkType: hard -"@types/serve-static@npm:^1.15.5": - version: 1.15.9 - resolution: "@types/serve-static@npm:1.15.9" +"@types/serve-static@npm:^2": + version: 2.2.0 + resolution: "@types/serve-static@npm:2.2.0" dependencies: "@types/http-errors": "npm:*" "@types/node": "npm:*" - "@types/send": "npm:<1" - checksum: 10/5b7a24c1e5fb474ae539165451dae4e3e85e104d9935562de9c5f0c6b2557395aefe6fdbaf094178ea94d58fd9f26e9605a51ccaf101655fcda18971840c06ad + checksum: 10/f2bad1304c7d0d3b7221faff3e490c40129d3803f4fb1b2fb84f31f561071c5e6a4b876c41bbbe82d5645034eea936e946bcaaf993dac1093ce68b56effad6e0 languageName: node linkType: hard @@ -5563,16 +4384,16 @@ __metadata: linkType: hard "@types/unist@npm:*, @types/unist@npm:^3.0.0": - version: 3.0.2 - resolution: "@types/unist@npm:3.0.2" - checksum: 10/3d04d0be69316e5f14599a0d993a208606c12818cf631fd399243d1dc7a9bd8a3917d6066baa6abc290814afbd744621484756803c80cba892c39cd4b4a85616 + version: 3.0.3 + resolution: "@types/unist@npm:3.0.3" + checksum: 10/96e6453da9e075aaef1dc22482463898198acdc1eeb99b465e65e34303e2ec1e3b1ed4469a9118275ec284dc98019f63c3f5d49422f0e4ac707e5ab90fb3b71a languageName: node linkType: hard "@types/unist@npm:^2.0.0": - version: 2.0.10 - resolution: "@types/unist@npm:2.0.10" - checksum: 10/e2924e18dedf45f68a5c6ccd6015cd62f1643b1b43baac1854efa21ae9e70505db94290434a23da1137d9e31eb58e54ca175982005698ac37300a1c889f6c4aa + version: 2.0.11 + resolution: "@types/unist@npm:2.0.11" + checksum: 10/6d436e832bc35c6dde9f056ac515ebf2b3384a1d7f63679d12358766f9b313368077402e9c1126a14d827f10370a5485e628bf61aa91117cf4fc882423191a4e languageName: node linkType: hard @@ -5593,45 +4414,27 @@ __metadata: linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.32 - resolution: "@types/yargs@npm:17.0.32" + version: 17.0.35 + resolution: "@types/yargs@npm:17.0.35" dependencies: "@types/yargs-parser": "npm:*" - checksum: 10/1e2b2673847011ce43607df690d392f137d95a2d6ea85aa319403eadda2ef4277365efd4982354d8843f2611ef3846c88599660aaeb537fa9ccddae83c2a89de - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.0.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10/c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 - languageName: node - linkType: hard - -"@vercel/oidc@npm:3.0.3": - version: 3.0.3 - resolution: "@vercel/oidc@npm:3.0.3" - checksum: 10/2713aba666a8dd45c099f22936a25f1ab5cba357f41239fcec5ad1b65b57db2d47f322f136937c29428d8c0c9ec745aa25eafebed9fe45def94c5a4b75ca777f + checksum: 10/47bcd4476a4194ea11617ea71cba8a1eddf5505fc39c44336c1a08d452a0de4486aedbc13f47a017c8efbcb5a8aa358d976880663732ebcbc6dbcbbecadb0581 languageName: node linkType: hard -"@vimeo/player@npm:2.29.0": - version: 2.29.0 - resolution: "@vimeo/player@npm:2.29.0" - dependencies: - native-promise-only: "npm:0.8.1" - weakmap-polyfill: "npm:2.0.4" - checksum: 10/b07da9b8e5e2651eef14368bcf9c88121b985a70966e3c61eaf93f4b85e0738fb4ee96dc78cf8c1a77bf2e0f5374b8e1b5770e589f43b708a419dbb449c671b5 +"@typescript/ata@npm:^0.9.8": + version: 0.9.8 + resolution: "@typescript/ata@npm:0.9.8" + peerDependencies: + typescript: ">=4.4.4" + checksum: 10/c0f9daf7818fff7f94030387e6bb6e8e270b1d6191ce2937040f039fedb977f5c96363610bb4ff99cb061b87a4b00213a5b79b28d85759ed876984e802b01cd9 languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/ast@npm:1.12.1" - dependencies: - "@webassemblyjs/helper-numbers": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - checksum: 10/a775b0559437ae122d14fec0cfe59fdcaf5ca2d8ff48254014fd05d6797e20401e0f1518e628f9b06819aa085834a2534234977f9608b3f2e51f94b6e8b0bc43 +"@ungap/structured-clone@npm:^1.0.0": + version: 1.3.0 + resolution: "@ungap/structured-clone@npm:1.3.0" + checksum: 10/80d6910946f2b1552a2406650051c91bbd1f24a6bf854354203d84fe2714b3e8ce4618f49cc3410494173a1c1e8e9777372fe68dce74bd45faf0a7a1a6ccf448 languageName: node linkType: hard @@ -5645,13 +4448,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" - checksum: 10/29b08758841fd8b299c7152eda36b9eb4921e9c584eb4594437b5cd90ed6b920523606eae7316175f89c20628da14326801090167cc7fbffc77af448ac84b7e2 - languageName: node - linkType: hard - "@webassemblyjs/floating-point-hex-parser@npm:1.13.2": version: 1.13.2 resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" @@ -5659,13 +4455,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" - checksum: 10/e8563df85161096343008f9161adb138a6e8f3c2cc338d6a36011aa55eabb32f2fd138ffe63bc278d009ada001cc41d263dadd1c0be01be6c2ed99076103689f - languageName: node - linkType: hard - "@webassemblyjs/helper-api-error@npm:1.13.2": version: 1.13.2 resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" @@ -5673,13 +4462,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: 10/1d8705daa41f4d22ef7c6d422af4c530b84d69d0c253c6db5adec44d511d7caa66837803db5b1addcea611a1498fd5a67d2cf318b057a916283ae41ffb85ba8a - languageName: node - linkType: hard - "@webassemblyjs/helper-buffer@npm:1.14.1": version: 1.14.1 resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" @@ -5687,17 +4469,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" - dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@xtuc/long": "npm:4.2.2" - checksum: 10/9ffd258ad809402688a490fdef1fd02222f20cdfe191c895ac215a331343292164e5033dbc0347f0f76f2447865c0b5c2d2e3304ee948d44f7aa27857028fd08 - languageName: node - linkType: hard - "@webassemblyjs/helper-numbers@npm:1.13.2": version: 1.13.2 resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" @@ -5709,13 +4480,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" - checksum: 10/4ebf03e9c1941288c10e94e0f813f413f972bfaa1f09be2cc2e5577f300430906b61aa24d52f5ef2f894e8e24e61c6f7c39871d7e3d98bc69460e1b8e00bb20b - languageName: node - linkType: hard - "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": version: 1.13.2 resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" @@ -5723,18 +4487,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - checksum: 10/e91e6b28114e35321934070a2db8973a08a5cd9c30500b817214c683bbf5269ed4324366dd93ad83bf2fba0d671ac8f39df1c142bf58f70c57a827eeba4a3d2f - languageName: node - linkType: hard - "@webassemblyjs/helper-wasm-section@npm:1.14.1": version: 1.14.1 resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" @@ -5747,15 +4499,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/ieee754@npm:1.11.6" - dependencies: - "@xtuc/ieee754": "npm:^1.2.0" - checksum: 10/13574b8e41f6ca39b700e292d7edf102577db5650fe8add7066a320aa4b7a7c09a5056feccac7a74eb68c10dea9546d4461412af351f13f6b24b5f32379b49de - languageName: node - linkType: hard - "@webassemblyjs/ieee754@npm:1.13.2": version: 1.13.2 resolution: "@webassemblyjs/ieee754@npm:1.13.2" @@ -5765,15 +4508,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/leb128@npm:1.11.6" - dependencies: - "@xtuc/long": "npm:4.2.2" - checksum: 10/ec3b72db0e7ce7908fe08ec24395bfc97db486063824c0edc580f0973a4cfbadf30529569d9c7db663a56513e45b94299cca03be9e1992ea3308bb0744164f3d - languageName: node - linkType: hard - "@webassemblyjs/leb128@npm:1.13.2": version: 1.13.2 resolution: "@webassemblyjs/leb128@npm:1.13.2" @@ -5783,13 +4517,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 10/361a537bd604101b320a5604c3c96d1038d83166f1b9fb86cedadc7e81bae54c3785ae5d90bf5b1842f7da08194ccaf0f44a64fcca0cbbd6afe1a166196986d6 - languageName: node - linkType: hard - "@webassemblyjs/utf8@npm:1.13.2": version: 1.13.2 resolution: "@webassemblyjs/utf8@npm:1.13.2" @@ -5797,22 +4524,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-edit@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/helper-wasm-section": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-opt": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - "@webassemblyjs/wast-printer": "npm:1.12.1" - checksum: 10/5678ae02dbebba2f3a344e25928ea5a26a0df777166c9be77a467bfde7aca7f4b57ef95587e4bd768a402cdf2fddc4c56f0a599d164cdd9fe313520e39e18137 - languageName: node - linkType: hard - "@webassemblyjs/wasm-edit@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" @@ -5829,19 +4540,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10/ec45bd50e86bc9856f80fe9af4bc1ae5c98fb85f57023d11dff2b670da240c47a7b1b9b6c89755890314212bd167cf3adae7f1157216ddffb739a4ce589fc338 - languageName: node - linkType: hard - "@webassemblyjs/wasm-gen@npm:1.14.1": version: 1.14.1 resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" @@ -5855,18 +4553,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - checksum: 10/21f25ae109012c49bb084e09f3b67679510429adc3e2408ad3621b2b505379d9cce337799a7919ef44db64e0d136833216914aea16b0d4856f353b9778e0cdb7 - languageName: node - linkType: hard - "@webassemblyjs/wasm-opt@npm:1.14.1": version: 1.14.1 resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" @@ -5879,20 +4565,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 10/f7311685b76c3e1def2abea3488be1e77f06ecd8633143a6c5c943ca289660952b73785231bb76a010055ca64645227a4bc79705c26ab7536216891b6bb36320 - languageName: node - linkType: hard - "@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.14.1": version: 1.14.1 resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" @@ -5907,16 +4579,6 @@ __metadata: languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wast-printer@npm:1.12.1" - dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@xtuc/long": "npm:4.2.2" - checksum: 10/1a6a4b6bc4234f2b5adbab0cb11a24911b03380eb1cab6fb27a2250174a279fdc6aa2f5a9cf62dd1f6d4eb39f778f488e8ff15b9deb0670dee5c5077d46cf572 - languageName: node - linkType: hard - "@webassemblyjs/wast-printer@npm:1.14.1": version: 1.14.1 resolution: "@webassemblyjs/wast-printer@npm:1.14.1" @@ -5941,14 +4603,14 @@ __metadata: languageName: node linkType: hard -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10/ca0a54e35bea4ece0ecb68a47b312e1a9a6f772408d5bcb9051230aaa94b0460671c5b5c9cb3240eb5b7bc94c52476550eb221f65a0bbd0145bdc9f3113a6707 +"abbrev@npm:^4.0.0": + version: 4.0.0 + resolution: "abbrev@npm:4.0.0" + checksum: 10/e2f0c6a6708ad738b3e8f50233f4800de31ad41a6cdc50e0cbe51b76fed69fd0213516d92c15ce1a9985fca71a14606a9be22bf00f8475a58987b9bfb671c582 languageName: node linkType: hard -"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": +"accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: @@ -5958,12 +4620,12 @@ __metadata: languageName: node linkType: hard -"acorn-import-attributes@npm:^1.9.5": - version: 1.9.5 - resolution: "acorn-import-attributes@npm:1.9.5" +"acorn-import-phases@npm:^1.0.3": + version: 1.0.4 + resolution: "acorn-import-phases@npm:1.0.4" peerDependencies: - acorn: ^8 - checksum: 10/8bfbfbb6e2467b9b47abb4d095df717ab64fce2525da65eabee073e85e7975fb3a176b6c8bba17c99a7d8ede283a10a590272304eb54a93c4aa1af9790d47a8b + acorn: ^8.14.0 + checksum: 10/471050ac7d9b61909c837b426de9eeef2958997f6277ad7dea88d5894fd9b3245d8ed4a225c2ca44f814dbb20688009db7a80e525e8196fc9e98c5285b66161d languageName: node linkType: hard @@ -5977,29 +4639,20 @@ __metadata: linkType: hard "acorn-walk@npm:^8.0.0": - version: 8.3.3 - resolution: "acorn-walk@npm:8.3.3" + version: 8.3.5 + resolution: "acorn-walk@npm:8.3.5" dependencies: acorn: "npm:^8.11.0" - checksum: 10/59701dcb7070679622ba8e9c7f37577b4935565747ca0fd7c1c3ad30b3f1b1b008276282664e323b5495eb49f77fa12d3816fd06dc68e18f90fbebe759f71450 - languageName: node - linkType: hard - -"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.7.1, acorn@npm:^8.8.2": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" - bin: - acorn: bin/acorn - checksum: 10/d08c2d122bba32d0861e0aa840b2ee25946c286d5dc5990abca991baf8cdbfbe199b05aacb221b979411a2fea36f83e26b5ac4f6b4e0ce49038c62316c1848f0 + checksum: 10/f52a158a1c1f00c82702c7eb9b8ae8aad79748a7689241dcc2d797dce680f1dcb15c78f312f687eeacdfb3a4cac4b87d04af470f0201bd56c6661fca6f94b195 languageName: node linkType: hard -"acorn@npm:^8.14.0": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" +"acorn@npm:^8.0.0, acorn@npm:^8.0.4, acorn@npm:^8.11.0, acorn@npm:^8.15.0": + version: 8.16.0 + resolution: "acorn@npm:8.16.0" bin: acorn: bin/acorn - checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2 + checksum: 10/690c673bb4d61b38ef82795fab58526471ad7f7e67c0e40c4ff1e10ecd80ce5312554ef633c9995bfc4e6d170cef165711f9ca9e49040b62c0c66fbf2dd3df2b languageName: node linkType: hard @@ -6010,12 +4663,10 @@ __metadata: languageName: node linkType: hard -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10/c478fec8f79953f118704d007a38f2a185458853f5c45579b9669372bd0e12602e88dc2ad0233077831504f7cd6fcc8251c383375bba5eaaf563b102938bda26 +"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": + version: 7.1.4 + resolution: "agent-base@npm:7.1.4" + checksum: 10/79bef167247789f955aaba113bae74bf64aa1e1acca4b1d6bb444bdf91d82c3e07e9451ef6a6e2e35e8f71a6f97ce33e3d855a5328eb9fad1bc3cc4cfd031ed8 languageName: node linkType: hard @@ -6029,20 +4680,6 @@ __metadata: languageName: node linkType: hard -"ai@npm:5.0.76, ai@npm:^5.0.30": - version: 5.0.76 - resolution: "ai@npm:5.0.76" - dependencies: - "@ai-sdk/gateway": "npm:2.0.0" - "@ai-sdk/provider": "npm:2.0.0" - "@ai-sdk/provider-utils": "npm:3.0.12" - "@opentelemetry/api": "npm:1.9.0" - peerDependencies: - zod: ^3.25.76 || ^4.1.8 - checksum: 10/2c6f08287efb96e040dd3097c5148fe92426a5033869f67bbc076af2d346bda3e431644b3716af28b8b1d5acb86803d973f270eb803f03d18d480297a2ea2cbc - languageName: node - linkType: hard - "ajv-formats@npm:^2.1.1": version: 2.1.1 resolution: "ajv-formats@npm:2.1.1" @@ -6078,59 +4715,59 @@ __metadata: linkType: hard "ajv@npm:^6.12.5": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" + version: 6.14.0 + resolution: "ajv@npm:6.14.0" dependencies: fast-deep-equal: "npm:^3.1.1" fast-json-stable-stringify: "npm:^2.0.0" json-schema-traverse: "npm:^0.4.1" uri-js: "npm:^4.2.2" - checksum: 10/48d6ad21138d12eb4d16d878d630079a2bda25a04e745c07846a4ad768319533031e28872a9b3c5790fa1ec41aabdf2abed30a56e5a03ebc2cf92184b8ee306c + checksum: 10/c71f14dd2b6f2535d043f74019c8169f7aeb1106bafbb741af96f34fdbf932255c919ddd46344043d03b62ea0ccb319f83667ec5eedf612393f29054fe5ce4a5 languageName: node linkType: hard "ajv@npm:^8.0.0, ajv@npm:^8.9.0": - version: 8.16.0 - resolution: "ajv@npm:8.16.0" + version: 8.18.0 + resolution: "ajv@npm:8.18.0" dependencies: fast-deep-equal: "npm:^3.1.3" + fast-uri: "npm:^3.0.1" json-schema-traverse: "npm:^1.0.0" require-from-string: "npm:^2.0.2" - uri-js: "npm:^4.4.1" - checksum: 10/9b4b380efaf8be2639736d535662bd142a6972b43075b404380165c37ab6ceb72f01c7c987536747ff3e9e21eb5cd2e2a194f1e0fa8355364ea6204b1262fcd1 + checksum: 10/bfed9de827a2b27c6d4084324eda76a4e32bdde27410b3e9b81d06e6f8f5c78370fc6b93fe1d869f1939ff1d7c4ae8896960995acb8425e3e9288c8884247c48 languageName: node linkType: hard "algoliasearch-helper@npm:^3.26.0": - version: 3.26.0 - resolution: "algoliasearch-helper@npm:3.26.0" + version: 3.27.1 + resolution: "algoliasearch-helper@npm:3.27.1" dependencies: "@algolia/events": "npm:^4.0.1" peerDependencies: algoliasearch: ">= 3.1 < 6" - checksum: 10/2581409b6590e4707b3ae1b8183a7bb0c762004640439ae426f39ea5c6a4e61d0628d7ed4e99e626a7220021c2b197a15dcbb5b1e5cac7da1a077664cce8200a + checksum: 10/a7caa2a8ed24a7e7a2f389a42179746e6f54e003c5319a6c844e203abe41de3d29eebe44f0b19719b7edc3dff3700fa58e5da06fe421c97f16767bf7ad729d68 languageName: node linkType: hard -"algoliasearch@npm:^5.28.0, algoliasearch@npm:^5.37.0": - version: 5.40.1 - resolution: "algoliasearch@npm:5.40.1" +"algoliasearch@npm:^5.37.0": + version: 5.49.0 + resolution: "algoliasearch@npm:5.49.0" dependencies: - "@algolia/abtesting": "npm:1.6.1" - "@algolia/client-abtesting": "npm:5.40.1" - "@algolia/client-analytics": "npm:5.40.1" - "@algolia/client-common": "npm:5.40.1" - "@algolia/client-insights": "npm:5.40.1" - "@algolia/client-personalization": "npm:5.40.1" - "@algolia/client-query-suggestions": "npm:5.40.1" - "@algolia/client-search": "npm:5.40.1" - "@algolia/ingestion": "npm:1.40.1" - "@algolia/monitoring": "npm:1.40.1" - "@algolia/recommend": "npm:5.40.1" - "@algolia/requester-browser-xhr": "npm:5.40.1" - "@algolia/requester-fetch": "npm:5.40.1" - "@algolia/requester-node-http": "npm:5.40.1" - checksum: 10/d35803955529d1b39e9a808b34eeac4d3b667f9e219d1a3a77bd1e7a34b9dafcc8aa3fc353414e45cb8b33e11d2f9fc470ede6efc74f3711bc88d60c03e49c21 + "@algolia/abtesting": "npm:1.15.0" + "@algolia/client-abtesting": "npm:5.49.0" + "@algolia/client-analytics": "npm:5.49.0" + "@algolia/client-common": "npm:5.49.0" + "@algolia/client-insights": "npm:5.49.0" + "@algolia/client-personalization": "npm:5.49.0" + "@algolia/client-query-suggestions": "npm:5.49.0" + "@algolia/client-search": "npm:5.49.0" + "@algolia/ingestion": "npm:1.49.0" + "@algolia/monitoring": "npm:1.49.0" + "@algolia/recommend": "npm:5.49.0" + "@algolia/requester-browser-xhr": "npm:5.49.0" + "@algolia/requester-fetch": "npm:5.49.0" + "@algolia/requester-node-http": "npm:5.49.0" + checksum: 10/ccbb88a3e3a45bf6d405d43381595fd361d6fc25e5b030838e2ca1866f5e90bef42eba52de34445339a8a2a465bc84772b9229c0d68ef55b3cf5810e4a010bbd languageName: node linkType: hard @@ -6169,18 +4806,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10/1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10/d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + version: 6.2.2 + resolution: "ansi-regex@npm:6.2.2" + checksum: 10/9b17ce2c6daecc75bcd5966b9ad672c23b184dc3ed9bf3c98a0702f0d2f736c15c10d461913568f2cf527a5e64291c7473358885dd493305c84a1cfed66ba94f languageName: node linkType: hard @@ -6194,9 +4822,9 @@ __metadata: linkType: hard "ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10/70fdf883b704d17a5dfc9cde206e698c16bcd74e7f196ab821511651aee4f9f76c9514bdfa6ca3a27b5e49138b89cb222a28caf3afe4567570139577f991df32 + version: 6.2.3 + resolution: "ansi-styles@npm:6.2.3" + checksum: 10/c49dad7639f3e48859bd51824c93b9eb0db628afc243c51c3dd2410c4a15ede1a83881c6c7341aa2b159c4f90c11befb38f2ba848c07c66c9f9de4bcd7cb9f30 languageName: node linkType: hard @@ -6247,48 +4875,54 @@ __metadata: languageName: node linkType: hard +"asn1js@npm:^3.0.6": + version: 3.0.7 + resolution: "asn1js@npm:3.0.7" + dependencies: + pvtsutils: "npm:^1.3.6" + pvutils: "npm:^1.1.3" + tslib: "npm:^2.8.1" + checksum: 10/1ae92cc6825ff002aed5b2a800e89db1fccd0775b42278431332fe3ee6839711e80e1ca504c72a35a03d94d417c3b315fb03bc6a6f4518c309b1dcb5385a1a93 + languageName: node + linkType: hard + "astring@npm:^1.8.0": - version: 1.8.6 - resolution: "astring@npm:1.8.6" + version: 1.9.0 + resolution: "astring@npm:1.9.0" bin: astring: bin/astring - checksum: 10/5c1eb7cf3e8ff7da2021c887dddd887c6ae307767e76ee4418eb02dfee69794c397ea4dccaf3f28975ecd8eb32a5fe4dce108d35b2e4c6429c2a7ec9b7b7de57 + checksum: 10/ee88f71d8534557b27993d6d035ae85d78488d8dbc6429cd8e8fdfcafec3c65928a3bdc518cf69767a1298d3361490559a4819cd4b314007edae1e94cf1f9e4c languageName: node linkType: hard -"autoprefixer@npm:^10.4.19": - version: 10.4.19 - resolution: "autoprefixer@npm:10.4.19" - dependencies: - browserslist: "npm:^4.23.0" - caniuse-lite: "npm:^1.0.30001599" - fraction.js: "npm:^4.3.7" - normalize-range: "npm:^0.1.2" - picocolors: "npm:^1.0.0" - postcss-value-parser: "npm:^4.2.0" - peerDependencies: - postcss: ^8.1.0 - bin: - autoprefixer: bin/autoprefixer - checksum: 10/98378eae37b8bf0f1515e4c91b4c9c1ce69ede311d4dea7e934f5afe147d23712c577f112c4019a4c40461c585d82d474d08044f8eb6cb8a063c3d5b7aca52d2 +"async-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-function@npm:1.0.0" + checksum: 10/1a09379937d846f0ce7614e75071c12826945d4e417db634156bf0e4673c495989302f52186dfa9767a1d9181794554717badd193ca2bbab046ef1da741d8efd + languageName: node + linkType: hard + +"async-generator-function@npm:^1.0.0": + version: 1.0.0 + resolution: "async-generator-function@npm:1.0.0" + checksum: 10/3d49e7acbeee9e84537f4cb0e0f91893df8eba976759875ae8ee9e3d3c82f6ecdebdb347c2fad9926b92596d93cdfc78ecc988bcdf407e40433e8e8e6fe5d78e languageName: node linkType: hard -"autoprefixer@npm:^10.4.21": - version: 10.4.21 - resolution: "autoprefixer@npm:10.4.21" +"autoprefixer@npm:^10.4.19, autoprefixer@npm:^10.4.23": + version: 10.4.24 + resolution: "autoprefixer@npm:10.4.24" dependencies: - browserslist: "npm:^4.24.4" - caniuse-lite: "npm:^1.0.30001702" - fraction.js: "npm:^4.3.7" - normalize-range: "npm:^0.1.2" + browserslist: "npm:^4.28.1" + caniuse-lite: "npm:^1.0.30001766" + fraction.js: "npm:^5.3.4" picocolors: "npm:^1.1.1" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10/5d7aeee78ef362a6838e12312908516a8ac5364414175273e5cff83bbff67612755b93d567f3aa01ce318342df48aeab4b291847b5800c780e58c458f61a98a6 + checksum: 10/d09c4259a96001256e3150c2734aa0c5f7a53d98cc69ec42ef5fa167aadd804e857040dc3c732f62d80602212ebfd7d8783c9d27f1766a413f637eeac4fefa53 languageName: node linkType: hard @@ -6314,63 +4948,51 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.10": - version: 0.4.11 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.11" +"babel-plugin-polyfill-corejs2@npm:^0.4.14, babel-plugin-polyfill-corejs2@npm:^0.4.15": + version: 0.4.15 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.15" dependencies: - "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + "@babel/compat-data": "npm:^7.28.6" + "@babel/helper-define-polyfill-provider": "npm:^0.6.6" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/9c79908bed61b9f52190f254e22d3dca6ce25769738642579ba8d23832f3f9414567a90d8367a31831fa45d9b9607ac43d8d07ed31167d8ca8cda22871f4c7a1 - languageName: node - linkType: hard - -"babel-plugin-polyfill-corejs3@npm:^0.10.4": - version: 0.10.4 - resolution: "babel-plugin-polyfill-corejs3@npm:0.10.4" - dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.1" - core-js-compat: "npm:^3.36.1" - peerDependencies: - "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/a69ed5a95bb55e9b7ea37307d56113f7e24054d479c15de6d50fa61388b5334bed1f9b6414cde6c575fa910a4de4d1ab4f2d22720967d57c4fec9d1b8f61b355 + checksum: 10/e5f8a4e716400b2b5c51f7b3c0eec58da92f1d8cc1c6fe2e32555c98bc594be1de7fa1da373f8e42ab098c33867c4cc2931ce648c92aab7a4f4685417707c438 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.10.6": - version: 0.10.6 - resolution: "babel-plugin-polyfill-corejs3@npm:0.10.6" +"babel-plugin-polyfill-corejs3@npm:^0.13.0": + version: 0.13.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.13.0" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" - core-js-compat: "npm:^3.38.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.5" + core-js-compat: "npm:^3.43.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/360ac9054a57a18c540059dc627ad5d84d15f79790cb3d84d19a02eec7188c67d08a07db789c3822d6f5df22d918e296d1f27c4055fec2e287d328f09ea8a78a + checksum: 10/aa36f9a09521404dd0569a4cbd5f88aa4b9abff59508749abde5d09d66c746012fb94ed1e6e2c8be3710939a2a4c6293ee3be889125d7611c93e5897d9e5babd languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.11.0": - version: 0.11.1 - resolution: "babel-plugin-polyfill-corejs3@npm:0.11.1" +"babel-plugin-polyfill-corejs3@npm:^0.14.0": + version: 0.14.0 + resolution: "babel-plugin-polyfill-corejs3@npm:0.14.0" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.3" - core-js-compat: "npm:^3.40.0" + "@babel/helper-define-polyfill-provider": "npm:^0.6.6" + core-js-compat: "npm:^3.48.0" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/19a2978ee3462cc3b98e7d36e6537bf9fb1fb61f42fd96cb41e9313f2ac6f2c62380d94064366431eff537f342184720fe9bce73eb65fd57c5311d15e8648f62 + checksum: 10/09c854a3bda9a930fbce4b80d52a24e5b0744fccb0c81bf8f470d62296f197a2afe111b2b9ecb0d8a47068de2f938d14b748295953377e47594b0673d53c9396 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.6.1": - version: 0.6.2 - resolution: "babel-plugin-polyfill-regenerator@npm:0.6.2" +"babel-plugin-polyfill-regenerator@npm:^0.6.5, babel-plugin-polyfill-regenerator@npm:^0.6.6": + version: 0.6.6 + resolution: "babel-plugin-polyfill-regenerator@npm:0.6.6" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.6.2" + "@babel/helper-define-polyfill-provider": "npm:^0.6.6" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 10/150233571072b6b3dfe946242da39cba8587b7f908d1c006f7545fc88b0e3c3018d445739beb61e7a75835f0c2751dbe884a94ff9b245ec42369d9267e0e1b3f + checksum: 10/8de7ea32856e75784601cacf8f4e3cbf04ce1fd05d56614b08b7bbe0674d1e59e37ccaa1c7ed16e3b181a63abe5bd43a1ab0e28b8c95618a9ebf0be5e24d6b25 languageName: node linkType: hard @@ -6388,38 +5010,26 @@ __metadata: languageName: node linkType: hard -"batch@npm:0.6.1": - version: 0.6.1 - resolution: "batch@npm:0.6.1" - checksum: 10/61f9934c7378a51dce61b915586191078ef7f1c3eca707fdd58b96ff2ff56d9e0af2bdab66b1462301a73c73374239e6542d9821c0af787f3209a23365d07e7f - languageName: node - linkType: hard - -"bcp-47-match@npm:^2.0.0, bcp-47-match@npm:^2.0.3": - version: 2.0.3 - resolution: "bcp-47-match@npm:2.0.3" - checksum: 10/fb47d31946268865c45df4c5d447964656ea357871bbd6969dc4ea2fb6b581fda385174ed43bc1dc1a7ed75c1a93a51fef18eec0fbd24352725dfceb2246cf2e +"balanced-match@npm:^4.0.2": + version: 4.0.4 + resolution: "balanced-match@npm:4.0.4" + checksum: 10/fb07bb66a0959c2843fc055838047e2a95ccebb837c519614afb067ebfdf2fa967ca8d712c35ced07f2cd26fc6f07964230b094891315ad74f11eba3d53178a0 languageName: node linkType: hard - -"bcp-47-normalize@npm:^2.3.0": - version: 2.3.0 - resolution: "bcp-47-normalize@npm:2.3.0" - dependencies: - bcp-47: "npm:^2.0.0" - bcp-47-match: "npm:^2.0.0" - checksum: 10/acb7c9d6010f5c93dc0e6f0e56a585bfd19c95732d02d1dd2a1c8197bec12d127a344e0efb1dc91e664cc2b8fbcc0151d81386c3a44c58f634222296d7a9b222 + +"baseline-browser-mapping@npm:^2.9.0": + version: 2.10.0 + resolution: "baseline-browser-mapping@npm:2.10.0" + bin: + baseline-browser-mapping: dist/cli.cjs + checksum: 10/8145e076e4299f04c7a412e6ea63803e330153cd89c47b5303f9b56b58078f4c3d5a5b5332c1069da889e76facacca4d43f8940375f7e73ce0a4d96214332953 languageName: node linkType: hard -"bcp-47@npm:^2.0.0": - version: 2.1.0 - resolution: "bcp-47@npm:2.1.0" - dependencies: - is-alphabetical: "npm:^2.0.0" - is-alphanumerical: "npm:^2.0.0" - is-decimal: "npm:^2.0.0" - checksum: 10/3ed9da011622671e956bc1ef0f12f6e4032eaf2c955cb0792cff2ea269c7808392d15f77cc3a115f3eeee71d6ffcc0996beaf9a462985ca19bcdf36b07a0be85 +"batch@npm:0.6.1": + version: 0.6.1 + resolution: "batch@npm:0.6.1" + checksum: 10/61f9934c7378a51dce61b915586191078ef7f1c3eca707fdd58b96ff2ff56d9e0af2bdab66b1462301a73c73374239e6542d9821c0af787f3209a23365d07e7f languageName: node linkType: hard @@ -6437,23 +5047,23 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.3": - version: 1.20.3 - resolution: "body-parser@npm:1.20.3" +"body-parser@npm:~1.20.3": + version: 1.20.4 + resolution: "body-parser@npm:1.20.4" dependencies: - bytes: "npm:3.1.2" + bytes: "npm:~3.1.2" content-type: "npm:~1.0.5" debug: "npm:2.6.9" depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.13.0" - raw-body: "npm:2.5.2" + destroy: "npm:~1.2.0" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + on-finished: "npm:~2.4.1" + qs: "npm:~6.14.0" + raw-body: "npm:~2.5.3" type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 10/8723e3d7a672eb50854327453bed85ac48d045f4958e81e7d470c56bf111f835b97e5b73ae9f6393d0011cc9e252771f46fd281bbabc57d33d3986edf1e6aeca + unpipe: "npm:~1.0.0" + checksum: 10/ff67e28d3f426707be8697a75fdf8d564dc50c341b41f054264d8ab6e2924e519c7ce8acc9d0de05328fdc41e1d9f3f200aec9c1cfb1867d6b676a410d97c689 languageName: node linkType: hard @@ -6516,12 +5126,12 @@ __metadata: languageName: node linkType: hard -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" +"brace-expansion@npm:^5.0.2": + version: 5.0.3 + resolution: "brace-expansion@npm:5.0.3" dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10/a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + balanced-match: "npm:^4.0.2" + checksum: 10/8ba7deae4ca333d52418d2cde3287ac23f44f7330d92c3ecd96a8941597bea8aab02227bd990944d6711dd549bcc6e550fe70be5d94aa02e2fdc88942f480c9b languageName: node linkType: hard @@ -6534,45 +5144,18 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.22.2, browserslist@npm:^4.23.0": - version: 4.23.2 - resolution: "browserslist@npm:4.23.2" - dependencies: - caniuse-lite: "npm:^1.0.30001640" - electron-to-chromium: "npm:^1.4.820" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.1.0" - bin: - browserslist: cli.js - checksum: 10/326a98b1c39bcc9a99b197f15790dc28e122b1aead3257c837421899377ac96239123f26868698085b3d9be916d72540602738e1f857e86a387e810af3fda6e5 - languageName: node - linkType: hard - -"browserslist@npm:^4.24.0, browserslist@npm:^4.24.3, browserslist@npm:^4.24.4": - version: 4.24.4 - resolution: "browserslist@npm:4.24.4" - dependencies: - caniuse-lite: "npm:^1.0.30001688" - electron-to-chromium: "npm:^1.5.73" - node-releases: "npm:^2.0.19" - update-browserslist-db: "npm:^1.1.1" - bin: - browserslist: cli.js - checksum: 10/11fda105e803d891311a21a1f962d83599319165faf471c2d70e045dff82a12128f5b50b1fcba665a2352ad66147aaa248a9d2355a80aadc3f53375eb3de2e48 - languageName: node - linkType: hard - -"browserslist@npm:^4.25.0": - version: 4.25.0 - resolution: "browserslist@npm:4.25.0" +"browserslist@npm:^4.0.0, browserslist@npm:^4.23.0, browserslist@npm:^4.24.0, browserslist@npm:^4.28.1": + version: 4.28.1 + resolution: "browserslist@npm:4.28.1" dependencies: - caniuse-lite: "npm:^1.0.30001718" - electron-to-chromium: "npm:^1.5.160" - node-releases: "npm:^2.0.19" - update-browserslist-db: "npm:^1.1.3" + baseline-browser-mapping: "npm:^2.9.0" + caniuse-lite: "npm:^1.0.30001759" + electron-to-chromium: "npm:^1.5.263" + node-releases: "npm:^2.0.27" + update-browserslist-db: "npm:^1.2.0" bin: browserslist: cli.js - checksum: 10/4a5442b1a0d09c4c64454f184b8fed17d8c3e202034bf39de28f74497d7bd28dddee121b2bab4e34825fe0ed4c166d84e32a39f576c76fce73c1f8f05e4b6ee6 + checksum: 10/64f2a97de4bce8473c0e5ae0af8d76d1ead07a5b05fc6bc87b848678bb9c3a91ae787b27aa98cdd33fc00779607e6c156000bed58fefb9cf8e4c5a183b994cdb languageName: node linkType: hard @@ -6599,30 +5182,36 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2": +"bytes@npm:3.1.2, bytes@npm:~3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: 10/a10abf2ba70c784471d6b4f58778c0beeb2b5d405148e66affa91f23a9f13d07603d0a0354667310ae1d6dc141474ffd44e2a074be0f6e2254edb8fc21445388 languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.3 - resolution: "cacache@npm:18.0.3" +"bytestreamjs@npm:^2.0.1": + version: 2.0.1 + resolution: "bytestreamjs@npm:2.0.1" + checksum: 10/523b1024e3f887cdc0b3db7c4fc14b8563aaeb75e6642a41991b3208277fd0ae9cd66003c73473fe706c42797bf0c3f1f498fb9880b431d75b332e5709d56a0c + languageName: node + linkType: hard + +"cacache@npm:^20.0.1": + version: 20.0.3 + resolution: "cacache@npm:20.0.3" dependencies: - "@npmcli/fs": "npm:^3.1.0" + "@npmcli/fs": "npm:^5.0.0" fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" + glob: "npm:^13.0.0" + lru-cache: "npm:^11.1.0" minipass: "npm:^7.0.3" minipass-collect: "npm:^2.0.1" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10/d4c161f071524bb636334b8cf94780c014e29c180a886b8184da8f2f44d2aca88d5664797c661e9f74bdbd34697c2f231ed7c24c256cecbb0a0563ad1ada2219 + p-map: "npm:^7.0.2" + ssri: "npm:^13.0.0" + unique-filename: "npm:^5.0.0" + checksum: 10/388a0169970df9d051da30437f93f81b7e91efb570ad0ff2b8fde33279fbe726c1bc8e8e2b9c05053ffb4f563854c73db395e8712e3b62347a1bc4f7fb8899ff languageName: node linkType: hard @@ -6648,16 +5237,35 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.5, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" +"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2": + version: 1.0.2 + resolution: "call-bind-apply-helpers@npm:1.0.2" dependencies: - es-define-property: "npm:^1.0.0" es-errors: "npm:^1.3.0" function-bind: "npm:^1.1.2" + checksum: 10/00482c1f6aa7cfb30fb1dbeb13873edf81cfac7c29ed67a5957d60635a56b2a4a480f1016ddbdb3395cc37900d46037fb965043a51c5c789ffeab4fc535d18b5 + languageName: node + linkType: hard + +"call-bind@npm:^1.0.8": + version: 1.0.8 + resolution: "call-bind@npm:1.0.8" + dependencies: + call-bind-apply-helpers: "npm:^1.0.0" + es-define-property: "npm:^1.0.0" get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 10/cd6fe658e007af80985da5185bff7b55e12ef4c2b6f41829a26ed1eef254b1f1c12e3dfd5b2b068c6ba8b86aba62390842d81752e67dcbaec4f6f76e7113b6b7 + set-function-length: "npm:^1.2.2" + checksum: 10/659b03c79bbfccf0cde3a79e7d52570724d7290209823e1ca5088f94b52192dc1836b82a324d0144612f816abb2f1734447438e38d9dafe0b3f82c2a1b9e3bce + languageName: node + linkType: hard + +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3": + version: 1.0.4 + resolution: "call-bound@npm:1.0.4" + dependencies: + call-bind-apply-helpers: "npm:^1.0.2" + get-intrinsic: "npm:^1.3.0" + checksum: 10/ef2b96e126ec0e58a7ff694db43f4d0d44f80e641370c21549ed911fecbdbc2df3ebc9bddad918d6bbdefeafb60bb3337902006d5176d72bcd2da74820991af7 languageName: node linkType: hard @@ -6704,33 +5312,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001640": - version: 1.0.30001641 - resolution: "caniuse-lite@npm:1.0.30001641" - checksum: 10/d60df2662fcae31efc8f36451929640e9630bb2e936f7449166dc70dcc4a757f6d86a5a089eed763b58354d684404b175e6c8790a9fd95c48abed1fcb7c26225 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001700 - resolution: "caniuse-lite@npm:1.0.30001700" - checksum: 10/9203ed502fd1b74c47f315a001e1d91abe2abecb951f8e15dd1556cfc23a29fa7a7b2cc654380604bb6f58bcfa0c65b78055b9d99a7489c13baa0d4158a6e25e - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001718": - version: 1.0.30001723 - resolution: "caniuse-lite@npm:1.0.30001723" - checksum: 10/edab89e84a2b257cf640f0bac1f25f92c699ade86143b2affc73403468f894023416a9f4a99e5345c933956990b005a2facfb87ac4517c8ccb588819bb62453b - languageName: node - linkType: hard - -"castable-video@npm:~1.1.10": - version: 1.1.10 - resolution: "castable-video@npm:1.1.10" - dependencies: - custom-media-element: "npm:~1.4.5" - checksum: 10/4744984199fc6c4d1ab539fa80ea8d8fed805cd084802c7804dcefeb01bedfbd12fa04f8a68c9d5a324159c2508210ccc4b1ba0177b33829e38e2d4b03d3c8be +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001759, caniuse-lite@npm:^1.0.30001766": + version: 1.0.30001772 + resolution: "caniuse-lite@npm:1.0.30001772" + checksum: 10/94f0cdb55fb17271435ad5622be2d422d160a7a13cab3006aab1972b15cf699245772922ff2570b5be6ddc1708a4ac9eedb6989cdabfb2de3ef25f294231409a languageName: node linkType: hard @@ -6741,26 +5326,6 @@ __metadata: languageName: node linkType: hard -"ce-la-react@npm:^0.3.0": - version: 0.3.0 - resolution: "ce-la-react@npm:0.3.0" - peerDependencies: - react: ">=17.0.0" - checksum: 10/7e341283d53d19c153f60fac065e6e66b943c0e6cc5a1c7d6514074c6eaebfdf8eecfd79e1dc95b758ba6f5120c350fc43c0b60ff07c8d186ed6815100c8b5ec - languageName: node - linkType: hard - -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10/3d1d103433166f6bfe82ac75724951b33769675252d8417317363ef9d54699b7c3b2d46671b772b893a8e50c3ece70c4b933c73c01e81bc60ea4df9b55afa303 - languageName: node - linkType: hard - "chalk@npm:^4.0.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -6772,9 +5337,9 @@ __metadata: linkType: hard "chalk@npm:^5.0.1, chalk@npm:^5.2.0": - version: 5.3.0 - resolution: "chalk@npm:5.3.0" - checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 10/1b2f48f6fba1370670d5610f9cd54c391d6ede28f4b7062dd38244ea5768777af72e5be6b74fb6c6d54cb84c4a2dff3f3afa9b7cb5948f7f022cfd3d087989e0 languageName: node linkType: hard @@ -6842,7 +5407,7 @@ __metadata: languageName: node linkType: hard -"chevrotain-allstar@npm:~0.3.0": +"chevrotain-allstar@npm:~0.3.1": version: 0.3.1 resolution: "chevrotain-allstar@npm:0.3.1" dependencies: @@ -6853,17 +5418,17 @@ __metadata: languageName: node linkType: hard -"chevrotain@npm:~11.0.3": - version: 11.0.3 - resolution: "chevrotain@npm:11.0.3" +"chevrotain@npm:~11.1.1": + version: 11.1.1 + resolution: "chevrotain@npm:11.1.1" dependencies: - "@chevrotain/cst-dts-gen": "npm:11.0.3" - "@chevrotain/gast": "npm:11.0.3" - "@chevrotain/regexp-to-ast": "npm:11.0.3" - "@chevrotain/types": "npm:11.0.3" - "@chevrotain/utils": "npm:11.0.3" - lodash-es: "npm:4.17.21" - checksum: 10/8fa6253e51320dd4c3d386315b925734943e509d7954a2cd917746c0604461191bea57b0fb8fbab1903e0508fd94bfd35ebd0f8eace77cd0f3f42a9ee4f8f676 + "@chevrotain/cst-dts-gen": "npm:11.1.1" + "@chevrotain/gast": "npm:11.1.1" + "@chevrotain/regexp-to-ast": "npm:11.1.1" + "@chevrotain/types": "npm:11.1.1" + "@chevrotain/utils": "npm:11.1.1" + lodash-es: "npm:4.17.23" + checksum: 10/e90972f939b597908843e2b6ed23ed6756b0ce103ee2822c651d0a75cd93913e1e3d6c486315922ce3334a1ea9e1f6d0e62288d1ace8ff8e419bf8613be1b694 languageName: node linkType: hard @@ -6886,10 +5451,10 @@ __metadata: languageName: node linkType: hard -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: 10/c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f +"chownr@npm:^3.0.0": + version: 3.0.0 + resolution: "chownr@npm:3.0.0" + checksum: 10/b63cb1f73d171d140a2ed8154ee6566c8ab775d3196b0e03a2a94b5f6a0ce7777ee5685ca56849403c8d17bd457a6540672f9a60696a6137c7a409097495b82c languageName: node linkType: hard @@ -6954,13 +5519,6 @@ __metadata: languageName: node linkType: hard -"cloudflare-video-element@npm:^1.3.4": - version: 1.3.4 - resolution: "cloudflare-video-element@npm:1.3.4" - checksum: 10/9869cad828c01eea97f6a71766fd467401524f06be14e273eb69301ad04cdead263c99c63a3f5e670efc0df33f0a1d57cdcaa88e5f6766cb0e7d87ec3493a6c5 - languageName: node - linkType: hard - "clsx@npm:^2.0.0, clsx@npm:^2.1.1": version: 2.1.1 resolution: "clsx@npm:2.1.1" @@ -6968,13 +5526,6 @@ __metadata: languageName: node linkType: hard -"codem-isoboxer@npm:0.3.10": - version: 0.3.10 - resolution: "codem-isoboxer@npm:0.3.10" - checksum: 10/cbb625a46d53296dfc2d843341e4a9e5cffeab15efb7843de62fff0a110d64124e4199a345c7119c1ecb9aa2790c4b3ef8b7a10816e70bc3467930df4b54fd77 - languageName: node - linkType: hard - "collapse-white-space@npm:^2.0.0": version: 2.1.0 resolution: "collapse-white-space@npm:2.1.0" @@ -6982,15 +5533,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10/ffa319025045f2973919d155f25e7c00d08836b6b33ea2d205418c59bd63a665d713c52d9737a9e0fe467fb194b40fbef1d849bae80d674568ee220a31ef3d10 - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -7000,13 +5542,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10/09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -7084,7 +5619,7 @@ __metadata: languageName: node linkType: hard -"compressible@npm:~2.0.16": +"compressible@npm:~2.0.18": version: 2.0.18 resolution: "compressible@npm:2.0.18" dependencies: @@ -7093,18 +5628,18 @@ __metadata: languageName: node linkType: hard -"compression@npm:^1.7.4": - version: 1.7.4 - resolution: "compression@npm:1.7.4" +"compression@npm:^1.8.1": + version: 1.8.1 + resolution: "compression@npm:1.8.1" dependencies: - accepts: "npm:~1.3.5" - bytes: "npm:3.0.0" - compressible: "npm:~2.0.16" + bytes: "npm:3.1.2" + compressible: "npm:~2.0.18" debug: "npm:2.6.9" - on-headers: "npm:~1.0.2" - safe-buffer: "npm:5.1.2" + negotiator: "npm:~0.6.4" + on-headers: "npm:~1.1.0" + safe-buffer: "npm:5.2.1" vary: "npm:~1.1.2" - checksum: 10/469cd097908fe1d3ff146596d4c24216ad25eabb565c5456660bdcb3a14c82ebc45c23ce56e19fc642746cf407093b55ab9aa1ac30b06883b27c6c736e6383c2 + checksum: 10/e7552bfbd780f2003c6fe8decb44561f5cc6bc82f0c61e81122caff5ec656f37824084f52155b1e8ef31d7656cecbec9a2499b7a68e92e20780ffb39b479abb7 languageName: node linkType: hard @@ -7153,9 +5688,9 @@ __metadata: linkType: hard "consola@npm:^3.2.3": - version: 3.4.0 - resolution: "consola@npm:3.4.0" - checksum: 10/99d4a8131f4cc42ff6bb8e4fd8c9dbd428d6b949f3ec25d9d24892a7b0603b0aabeee8213e13ad74439b5078fdb204f9377bcdd401949c33fff672d91f05c4ec + version: 3.4.2 + resolution: "consola@npm:3.4.2" + checksum: 10/32192c9f50d7cac27c5d7c4ecd3ff3679aea863e6bf5bd6a9cc2b05d1cd78addf5dae71df08c54330c142be8e7fbd46f051030129b57c6aacdd771efe409c4b2 languageName: node linkType: hard @@ -7166,7 +5701,7 @@ __metadata: languageName: node linkType: hard -"content-disposition@npm:0.5.4": +"content-disposition@npm:~0.5.4": version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: @@ -7189,17 +5724,17 @@ __metadata: languageName: node linkType: hard -"cookie-signature@npm:1.0.6": - version: 1.0.6 - resolution: "cookie-signature@npm:1.0.6" - checksum: 10/f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a +"cookie-signature@npm:~1.0.6": + version: 1.0.7 + resolution: "cookie-signature@npm:1.0.7" + checksum: 10/1a62808cd30d15fb43b70e19829b64d04b0802d8ef00275b57d152de4ae6a3208ca05c197b6668d104c4d9de389e53ccc2d3bc6bcaaffd9602461417d8c40710 languageName: node linkType: hard -"cookie@npm:0.7.1": - version: 0.7.1 - resolution: "cookie@npm:0.7.1" - checksum: 10/aec6a6aa0781761bf55d60447d6be08861d381136a0fe94aa084fddd4f0300faa2b064df490c6798adfa1ebaef9e0af9b08a189c823e0811b8b313b3d9a03380 +"cookie@npm:~0.7.1": + version: 0.7.2 + resolution: "cookie@npm:0.7.2" + checksum: 10/24b286c556420d4ba4e9bc09120c9d3db7d28ace2bd0f8ccee82422ce42322f73c8312441271e5eefafbead725980e5996cc02766dbb89a90ac7f5636ede608f languageName: node linkType: hard @@ -7219,35 +5754,26 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.36.1": - version: 3.37.1 - resolution: "core-js-compat@npm:3.37.1" - dependencies: - browserslist: "npm:^4.23.0" - checksum: 10/30c6fdbd9ff179cc53951814689b8aabec106e5de6cddfa7a7feacc96b66d415b8eebcf5ec8f7c68ef35c552fe7d39edb8b15b1ce0f27379a272295b6e937061 - languageName: node - linkType: hard - -"core-js-compat@npm:^3.38.0, core-js-compat@npm:^3.40.0": - version: 3.40.0 - resolution: "core-js-compat@npm:3.40.0" +"core-js-compat@npm:^3.43.0, core-js-compat@npm:^3.48.0": + version: 3.48.0 + resolution: "core-js-compat@npm:3.48.0" dependencies: - browserslist: "npm:^4.24.3" - checksum: 10/3dd3d717b3d4ae0d9c2930d39c0f2a21ca6f195fcdd5711bda833557996c4d9f90277eab576423478e95689257e2de8d1a2623d6618084416bd224d10d5df9a4 + browserslist: "npm:^4.28.1" + checksum: 10/83c326dcfef5e174fd3f8f33c892c66e06d567ce27f323a1197a6c280c0178fe18d3e9c5fb95b00c18b98d6c53fba5c646def5fedaa77310a4297d16dfbe2029 languageName: node linkType: hard -"core-js-pure@npm:^3.30.2": - version: 3.37.1 - resolution: "core-js-pure@npm:3.37.1" - checksum: 10/c683d4e46c4e4b9573f471a8229d972f9531a27e718453dfae601f1c104a2c905c3fe4e85ea3db449e364c573ecbe8801a08a3ffe88177df8dd8f8ea9af2cf81 +"core-js-pure@npm:^3.48.0": + version: 3.48.0 + resolution: "core-js-pure@npm:3.48.0" + checksum: 10/7c624d5551252ad166b9a7df4daca354540b71bb2ce9c8df2a9ef7acb6335a7a56557bcbe2bd78e20e3a4eeeee2922ff37a22a67e978b293a2b4e5b9a7a04d9b languageName: node linkType: hard "core-js@npm:^3.31.1": - version: 3.37.1 - resolution: "core-js@npm:3.37.1" - checksum: 10/25d6bd15fcc6ffd2a0ec0be57a78ff3358b3e1fdffdb6800fc93dcfdb3854037aee41f3d101aed8c37905d107daf98218b3e7ee95cec383710d2a66a5d9e541b + version: 3.48.0 + resolution: "core-js@npm:3.48.0" + checksum: 10/08bb3cc9b3225b905e72370c18257a14bb5563946d9eb7496799e0ee4f13231768b980ffe98434df7dbd0f8209bd2c19519938a2fa94846b2c82c2d5aa804037 languageName: node linkType: hard @@ -7293,7 +5819,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.3": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -7325,24 +5851,24 @@ __metadata: linkType: hard "css-declaration-sorter@npm:^7.2.0": - version: 7.2.0 - resolution: "css-declaration-sorter@npm:7.2.0" + version: 7.3.1 + resolution: "css-declaration-sorter@npm:7.3.1" peerDependencies: postcss: ^8.0.9 - checksum: 10/2acb9c13f556fc8f05e601e66ecae4cfdec0ed50ca69f18177718ad5a86c3929f7d0a2cae433fd831b2594670c6e61d3a25c79aa7830be5828dcd9d29219d387 + checksum: 10/a5695af50aa5c35653bbb300e9741d67035b4e7348fa6a3c75b939f48e88f50fc6ad5d4cd0ac4324f4c5034b479ae71f8febd1ea7b0fe4863d91d640133ac9cf languageName: node linkType: hard -"css-has-pseudo@npm:^7.0.2": - version: 7.0.2 - resolution: "css-has-pseudo@npm:7.0.2" +"css-has-pseudo@npm:^7.0.3": + version: 7.0.3 + resolution: "css-has-pseudo@npm:7.0.3" dependencies: "@csstools/selector-specificity": "npm:^5.0.0" postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10/6032539b0dda70c77e39791a090d668cf1508ad1db65bfb044b5fc311298ac033244893494962191a1f74c4d74b1525c8969e06aaacbc0f50021da48bc65753e + checksum: 10/ffda6490aacb2903803f7d6c7b3ee41e654a3e9084c5eb0cf8f7602cf49ebce1b7891962016f622c36c67f4f685ed57628e7a0efbdba8cc55c5bf76ed58267d8 languageName: node linkType: hard @@ -7422,15 +5948,15 @@ __metadata: linkType: hard "css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" + version: 5.2.2 + resolution: "css-select@npm:5.2.2" dependencies: boolbase: "npm:^1.0.0" css-what: "npm:^6.1.0" domhandler: "npm:^5.0.2" domutils: "npm:^3.0.1" nth-check: "npm:^2.0.1" - checksum: 10/d486b1e7eb140468218a5ab5af53257e01f937d2173ac46981f6b7de9c5283d55427a36715dc8decfc0c079cf89259ac5b41ef58f6e1a422eee44ab8bfdc78da + checksum: 10/ebb6a88446433312d1a16301afd1c5f75090805b730dbbdccb0338b0d6ca7922410375f16dde06673ef7da086e2cf3b9ad91afe9a8e0d2ee3625795cb5e0170d languageName: node linkType: hard @@ -7455,16 +5981,16 @@ __metadata: linkType: hard "css-what@npm:^6.0.1, css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: 10/c67a3a2d0d81843af87f8bf0a4d0845b0f952377714abbb2884e48942409d57a2110eabee003609d02ee487b054614bdfcfc59ee265728ff105bd5aa221c1d0e + version: 6.2.2 + resolution: "css-what@npm:6.2.2" + checksum: 10/3c5a53be94728089bd1716f915f7f96adde5dd8bf374610eb03982266f3d860bf1ebaf108cda30509d02ef748fe33eaa59aa75911e2c49ee05a85ef1f9fb5223 languageName: node linkType: hard -"cssdb@npm:^8.3.0": - version: 8.3.0 - resolution: "cssdb@npm:8.3.0" - checksum: 10/f27a17d127739bb7bd7fc70f1f3b3ee7986070a895e6f1d6923f401c39be0aa21a6bac48331f76eec4bb82dfa1a4cc45827273328b11eae4402b85e709c8fdee +"cssdb@npm:^8.6.0": + version: 8.8.0 + resolution: "cssdb@npm:8.8.0" + checksum: 10/80de494f27df4e1f54a7053ba5c89615af4317999ee5f6a56375715dfa778b5ec548239530c0c56799efc4bc0bdc1090326d0bacd495cbba8f62069db1779430 languageName: node linkType: hard @@ -7564,17 +6090,10 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.2": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 10/f593cce41ff5ade23f44e77521e3a1bcc2c64107041e1bf6c3c32adc5187d0d60983292fda326154d20b01079e24931aa5b08e4467cc488b60bb1e7f6d478ade - languageName: node - linkType: hard - -"custom-media-element@npm:^1.4.5, custom-media-element@npm:~1.4.5": - version: 1.4.5 - resolution: "custom-media-element@npm:1.4.5" - checksum: 10/809064d9ca4dee988525c6cef8e603a514d50a7a73b73ede585f643f7d45936ca255c2690010561cedbe9353efb60cd56f2f75462ad1e330081938d7fae8a8ff +"csstype@npm:^3.2.2": + version: 3.2.3 + resolution: "csstype@npm:3.2.3" + checksum: 10/ad41baf7e2ffac65ab544d79107bf7cd1a4bb9bab9ac3302f59ab4ba655d5e30942a8ae46e10ba160c6f4ecea464cc95b975ca2fefbdeeacd6ac63f12f99fe1f languageName: node linkType: hard @@ -7601,9 +6120,9 @@ __metadata: linkType: hard "cytoscape@npm:^3.29.3": - version: 3.32.0 - resolution: "cytoscape@npm:3.32.0" - checksum: 10/07c2a40b1684dc1a23a0d967b0f97633c11141d91b6fcdce4d85da26ef11bb64278aae1f5c173bfe20ca5826b7f5911b96ac75da27adfd0190d21e4fd2f5ac5b + version: 3.33.1 + resolution: "cytoscape@npm:3.33.1" + checksum: 10/0e8d3ea87eb624899341d6a765cfb732199af8a871beedeb94971061632ce814c2c39e8257d6628c5611ca9dadc1a723a00377d04f149e0d24f6c133a6ab8647 languageName: node linkType: hard @@ -7745,9 +6264,9 @@ __metadata: linkType: hard "d3-format@npm:1 - 3, d3-format@npm:3": - version: 3.1.0 - resolution: "d3-format@npm:3.1.0" - checksum: 10/a0fe23d2575f738027a3db0ce57160e5a473ccf24808c1ed46d45ef4f3211076b34a18b585547d34e365e78dcc26dd4ab15c069731fc4b1c07a26bfced09ea31 + version: 3.1.2 + resolution: "d3-format@npm:3.1.2" + checksum: 10/811d913c2c7624cb0d2a8f0ccd7964c50945b3de3c7f7aa14c309fba7266a3ec53cbee8c05f6ad61b2b65b93e157c55a0e07db59bc3180c39dac52be8e841ab1 languageName: node linkType: hard @@ -7960,49 +6479,20 @@ __metadata: languageName: node linkType: hard -"dagre-d3-es@npm:7.0.11": - version: 7.0.11 - resolution: "dagre-d3-es@npm:7.0.11" +"dagre-d3-es@npm:7.0.13": + version: 7.0.13 + resolution: "dagre-d3-es@npm:7.0.13" dependencies: d3: "npm:^7.9.0" lodash-es: "npm:^4.17.21" - checksum: 10/5ea2faab020019a51e60791237239fc528bc20215503a846ad725c2e32dde6a270a16caf2ed6ec712b11e1c6616595b2b26e2c58f4f0e012218135629833e09b - languageName: node - linkType: hard - -"dash-video-element@npm:^0.2.0": - version: 0.2.0 - resolution: "dash-video-element@npm:0.2.0" - dependencies: - custom-media-element: "npm:^1.4.5" - dashjs: "npm:^5.0.3" - media-tracks: "npm:^0.3.3" - checksum: 10/4b27e82da07447b3c1b07207ea32c4268ab6f5a6455f4ea2f4f2bed113d8164a6f376e79b2b8c944ea5adc8de8b41cc020399ab833d224288a03f8ceff5f07db - languageName: node - linkType: hard - -"dashjs@npm:^5.0.3": - version: 5.0.3 - resolution: "dashjs@npm:5.0.3" - dependencies: - "@svta/common-media-library": "npm:^0.12.4" - bcp-47-match: "npm:^2.0.3" - bcp-47-normalize: "npm:^2.3.0" - codem-isoboxer: "npm:0.3.10" - fast-deep-equal: "npm:3.1.3" - html-entities: "npm:^2.5.2" - imsc: "npm:^1.1.5" - localforage: "npm:^1.10.0" - path-browserify: "npm:^1.0.1" - ua-parser-js: "npm:^1.0.37" - checksum: 10/6e6ef47abe37f23cf7838cd5727b62a4d3032dc5fc87501c61f06aec6e831ed5060338db1dddebaac9a5313e018fb050be11e374ec6fc1551943d46811161562 + checksum: 10/f6dbd373b85cc9fbcb23fba996656a0336ba48bc46f1e6d31c582418a5086caf230a4e8178b90acd7b1d14b090cbba2db50dc64484d67cf9c8856a4a2fe30cf0 languageName: node linkType: hard -"dayjs@npm:^1.11.13": - version: 1.11.13 - resolution: "dayjs@npm:1.11.13" - checksum: 10/7374d63ab179b8d909a95e74790def25c8986e329ae989840bacb8b1888be116d20e1c4eee75a69ea0dfbae13172efc50ef85619d304ee7ca3c01d5878b704f5 +"dayjs@npm:^1.11.18": + version: 1.11.19 + resolution: "dayjs@npm:1.11.19" + checksum: 10/185b820d68492b83a3ce2b8ddc7543034edc1dfd1423183f6ae4707b29929a3cc56503a81826309279f9084680c15966b99456e74cf41f7d1f6a2f98f9c7196f languageName: node linkType: hard @@ -8022,36 +6512,24 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.4": - version: 4.3.5 - resolution: "debug@npm:4.3.5" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10/cb6eab424c410e07813ca1392888589972ce9a32b8829c6508f5e1f25f3c3e70a76731610ae55b4bbe58d1a2fffa1424b30e97fa8d394e49cd2656a9643aedd2 - languageName: node - linkType: hard - -"debug@npm:^4.4.0": - version: 4.4.0 - resolution: "debug@npm:4.4.0" +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.3.1, debug@npm:^4.3.4, debug@npm:^4.4.3": + version: 4.4.3 + resolution: "debug@npm:4.4.3" dependencies: ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 + checksum: 10/9ada3434ea2993800bd9a1e320bd4aa7af69659fb51cca685d390949434bc0a8873c21ed7c9b852af6f2455a55c6d050aa3937d52b3c69f796dab666f762acad languageName: node linkType: hard "decode-named-character-reference@npm:^1.0.0": - version: 1.0.2 - resolution: "decode-named-character-reference@npm:1.0.2" + version: 1.3.0 + resolution: "decode-named-character-reference@npm:1.3.0" dependencies: character-entities: "npm:^2.0.0" - checksum: 10/f4c71d3b93105f20076052f9cb1523a22a9c796b8296cd35eef1ca54239c78d182c136a848b83ff8da2071e3ae2b1d300bf29d00650a6d6e675438cc31b11d78 + checksum: 10/82eb1208abf59d1f1e368285b6880201a3c3f147a4d7ce74e44cd41374ef00c9a376e8595e38002031db63291f91f7f3ff56b9724f715befff8f5566593d6de0 languageName: node linkType: hard @@ -8079,19 +6557,19 @@ __metadata: linkType: hard "default-browser-id@npm:^5.0.0": - version: 5.0.0 - resolution: "default-browser-id@npm:5.0.0" - checksum: 10/185bfaecec2c75fa423544af722a3469b20704c8d1942794a86e4364fe7d9e8e9f63241a5b769d61c8151993bc65833a5b959026fa1ccea343b3db0a33aa6deb + version: 5.0.1 + resolution: "default-browser-id@npm:5.0.1" + checksum: 10/52c637637bcd76bfe974462a2f1dd75cb04784c2852935575760f82e1fd338e5e80d3c45a9b01fdbb1e450553a830bb163b004d2eca223c5573989f82232a072 languageName: node linkType: hard "default-browser@npm:^5.2.1": - version: 5.2.1 - resolution: "default-browser@npm:5.2.1" + version: 5.5.0 + resolution: "default-browser@npm:5.5.0" dependencies: bundle-name: "npm:^4.1.0" default-browser-id: "npm:^5.0.0" - checksum: 10/afab7eff7b7f5f7a94d9114d1ec67273d3fbc539edf8c0f80019879d53aa71e867303c6f6d7cffeb10a6f3cfb59d4f963dba3f9c96830b4540cc7339a1bf9840 + checksum: 10/c5c5d84a4abd82850e98f06798a55dee87fc1064538bea00cc14c0fb2dccccbff5e9e07eeea80385fa653202d5d92509838b4239d610ddfa1c76a04a1f65e767 languageName: node linkType: hard @@ -8147,7 +6625,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"depd@npm:2.0.0, depd@npm:~2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 10/c0c8ff36079ce5ada64f46cc9d6fd47ebcf38241105b6e0c98f412e8ad91f084bcf906ff644cc3a4bd876ca27a62accb8b0fff72ea6ed1a414b89d8506f4a5ca @@ -8161,14 +6639,14 @@ __metadata: languageName: node linkType: hard -"dequal@npm:^2.0.0, dequal@npm:^2.0.3": +"dequal@npm:^2.0.0": version: 2.0.3 resolution: "dequal@npm:2.0.3" checksum: 10/6ff05a7561f33603df87c45e389c9ac0a95e3c056be3da1a0c4702149e3a7f6fe5ffbb294478687ba51a9e95f3a60e8b6b9005993acd79c292c7d15f71964b6b languageName: node linkType: hard -"destroy@npm:1.2.0": +"destroy@npm:1.2.0, destroy@npm:~1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 10/0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 @@ -8215,11 +6693,13 @@ __metadata: "@docusaurus/tsconfig": "npm:^3.9.2" "@docusaurus/types": "npm:^3.9.2" "@mdx-js/react": "npm:^3.1.1" + "@monaco-editor/react": "npm:4.7.0" + "@typescript/ata": "npm:^0.9.8" clsx: "npm:^2.1.1" + monaco-editor: "npm:^0.55.1" prism-react-renderer: "npm:^2.4.1" - react: "npm:^19.2.0" - react-dom: "npm:^19.2.0" - react-player: "npm:^3.3.3" + react: "npm:^19.2.4" + react-dom: "npm:^19.2.4" typescript: "npm:~5.9.3" languageName: unknown linkType: soft @@ -8298,15 +6778,27 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^3.2.4": - version: 3.2.6 - resolution: "dompurify@npm:3.2.6" +"dompurify@npm:3.2.7": + version: 3.2.7 + resolution: "dompurify@npm:3.2.7" + dependencies: + "@types/trusted-types": "npm:^2.0.7" + dependenciesMeta: + "@types/trusted-types": + optional: true + checksum: 10/51b7866fb834ee62d6c415f41ece5ce11db7b463f60a822932a1f832573a40b98be7715550298690e7647988fbe086db1098bda9b10548b3166fc975eb9bd849 + languageName: node + linkType: hard + +"dompurify@npm:^3.2.5": + version: 3.3.1 + resolution: "dompurify@npm:3.3.1" dependencies: "@types/trusted-types": "npm:^2.0.7" dependenciesMeta: "@types/trusted-types": optional: true - checksum: 10/b91631ed0e4d17fae950ef53613cc009ed7e73adc43ac94a41dd52f35483f7538d13caebdafa7626e0da145fc8184e7ac7935f14f25b7e841b32fda777e40447 + checksum: 10/f71cca489e628591165d16e8cf4fa4f0d3e2ee48db4d73e9d2c5bedc6f915c92f9e9f101f8c4ba790bec0cdffe7f4e1747f5e31c69dc53ce7ae20a81ff6b0022 languageName: node linkType: hard @@ -8322,13 +6814,13 @@ __metadata: linkType: hard "domutils@npm:^3.0.1": - version: 3.1.0 - resolution: "domutils@npm:3.1.0" + version: 3.2.2 + resolution: "domutils@npm:3.2.2" dependencies: dom-serializer: "npm:^2.0.0" domelementtype: "npm:^2.3.0" domhandler: "npm:^5.0.3" - checksum: 10/9a169a6e57ac4c738269a73ab4caf785114ed70e46254139c1bbc8144ac3102aacb28a6149508395ae34aa5d6a40081f4fa5313855dc8319c6d8359866b6dfea + checksum: 10/2e08842151aa406f50fe5e6d494f4ec73c2373199fa00d1f77b56ec604e566b7f226312ae35ab8160bb7f27a27c7285d574c8044779053e499282ca9198be210 languageName: node linkType: hard @@ -8351,6 +6843,17 @@ __metadata: languageName: node linkType: hard +"dunder-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "dunder-proto@npm:1.0.1" + dependencies: + call-bind-apply-helpers: "npm:^1.0.1" + es-errors: "npm:^1.3.0" + gopd: "npm:^1.2.0" + checksum: 10/5add88a3d68d42d6e6130a0cac450b7c2edbe73364bbd2fc334564418569bea97c6943a8fcd70e27130bf32afc236f30982fc4905039b703f23e9e0433c29934 + languageName: node + linkType: hard + "duplexer@npm:^0.1.2": version: 0.1.2 resolution: "duplexer@npm:0.1.2" @@ -8372,24 +6875,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.820": - version: 1.4.823 - resolution: "electron-to-chromium@npm:1.4.823" - checksum: 10/af2ac5c0ccfaf697e4e95c4d85c06376bdab9b46d5e3a88ca1d0a515fd4945c7d63c211efb612fb8d5bbe828055481fba2f2e0a10e82bf5090dedadf52af87df - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.160": - version: 1.5.167 - resolution: "electron-to-chromium@npm:1.5.167" - checksum: 10/078093a38e7295e575f381943f62914f49b53dd73506af2ce3e59332835c42b487ad02ff1207dfdcb33a5886d74a98e352c04431c0537366d9999a79c7d15c94 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.73": - version: 1.5.103 - resolution: "electron-to-chromium@npm:1.5.103" - checksum: 10/ffcbc1addc01bd420b12b886c1e05b8fdf0bc2e0e2d99f4f1dc4737008c2bcb0aceb3117dff7c4aa4d31cf25cda809116d5de9289263ab537a86a250a9b518a3 +"electron-to-chromium@npm:^1.5.263": + version: 1.5.302 + resolution: "electron-to-chromium@npm:1.5.302" + checksum: 10/0d31470d04a0d1ea046dd363370081b67e6fe822949b10cfece0a64fd2f8180afb5ccaf14f4294251e444a0af627eb0dc0156242b714c0f10561adf2a21aa5f7 languageName: node linkType: hard @@ -8422,16 +6911,9 @@ __metadata: linkType: hard "emoticon@npm:^4.0.1": - version: 4.0.1 - resolution: "emoticon@npm:4.0.1" - checksum: 10/31de0324419a643d6592d18b9d68f1c82bb36548f33ba2e14514545c02b30e43b362919f7b2fb9bd134d1d08d5b13953a9b0bcd4baa85b5d7657d43c891f97d3 - languageName: node - linkType: hard - -"encodeurl@npm:~1.0.2": - version: 1.0.2 - resolution: "encodeurl@npm:1.0.2" - checksum: 10/e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c + version: 4.1.0 + resolution: "emoticon@npm:4.1.0" + checksum: 10/7d88dffa04f2f8c7e1e99a62a2c7232bf057e736b281f51ad75d4e111d20459e2fca2362a7f022a6281e7e5b3ad5fa78d3720da8ba409c1c09d3dcb8938c55d0 languageName: node linkType: hard @@ -8451,13 +6933,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1": - version: 5.17.1 - resolution: "enhanced-resolve@npm:5.17.1" +"enhanced-resolve@npm:^5.19.0": + version: 5.19.0 + resolution: "enhanced-resolve@npm:5.19.0" dependencies: graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: 10/e8e03cb7a4bf3c0250a89afbd29e5ec20e90ba5fcd026066232a0754864d7d0a393fa6fc0e5379314a6529165a1834b36731147080714459d98924520410d8f5 + tapable: "npm:^2.3.0" + checksum: 10/b537d52173bf1ba903c623f96a43ea3b51466ee2b606b2fcca30d73d453fd79c8683dccbb83523de27cd02763c906f11486e2591a4335e6afe49fa5ad6e67b83 languageName: node linkType: hard @@ -8475,6 +6957,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^6.0.0": + version: 6.0.1 + resolution: "entities@npm:6.0.1" + checksum: 10/62af1307202884349d2867f0aac5c60d8b57102ea0b0e768b16246099512c28e239254ad772d6834e7e14cb1b6f153fc3d0c031934e3183b086c86d3838d874a + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -8490,20 +6979,18 @@ __metadata: linkType: hard "error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" + version: 1.3.4 + resolution: "error-ex@npm:1.3.4" dependencies: is-arrayish: "npm:^0.2.1" - checksum: 10/d547740aa29c34e753fb6fed2c5de81802438529c12b3673bd37b6bb1fe49b9b7abdc3c11e6062fe625d8a296b3cf769a80f878865e25e685f787763eede3ffb + checksum: 10/ae3939fd4a55b1404e877df2080c6b59acc516d5b7f08a181040f78f38b4e2399633bfed2d9a21b91c803713fff7295ac70bebd8f3657ef352a95c2cd9aa2e4b languageName: node linkType: hard -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 10/f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 +"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": + version: 1.0.1 + resolution: "es-define-property@npm:1.0.1" + checksum: 10/f8dc9e660d90919f11084db0a893128f3592b781ce967e4fccfb8f3106cb83e400a4032c559184ec52ee1dbd4b01e7776c7cd0b3327b1961b1a4a7008920fe78 languageName: node linkType: hard @@ -8514,21 +7001,47 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.2.1": - version: 1.5.4 - resolution: "es-module-lexer@npm:1.5.4" - checksum: 10/f29c7c97a58eb17640dcbd71bd6ef754ad4f58f95c3073894573d29dae2cad43ecd2060d97ed5b866dfb7804d5590fb7de1d2c5339a5fceae8bd60b580387fc5 +"es-module-lexer@npm:^2.0.0": + version: 2.0.0 + resolution: "es-module-lexer@npm:2.0.0" + checksum: 10/b075855289b5f40ee496f3d7525c5c501d029c3da15c22298a0030d625bf36d1da0768b26278f7f4bada2a602459b505888e20b77c414fba5da5619b0e84dbd1 languageName: node linkType: hard -"escalade@npm:^3.1.1, escalade@npm:^3.1.2": - version: 3.1.2 - resolution: "escalade@npm:3.1.2" - checksum: 10/a1e07fea2f15663c30e40b9193d658397846ffe28ce0a3e4da0d8e485fedfeca228ab846aee101a05015829adf39f9934ff45b2a3fca47bed37a29646bd05cd3 +"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1": + version: 1.1.1 + resolution: "es-object-atoms@npm:1.1.1" + dependencies: + es-errors: "npm:^1.3.0" + checksum: 10/54fe77de288451dae51c37bfbfe3ec86732dc3778f98f3eb3bdb4bf48063b2c0b8f9c93542656986149d08aa5be3204286e2276053d19582b76753f1a2728867 + languageName: node + linkType: hard + +"esast-util-from-estree@npm:^2.0.0": + version: 2.0.0 + resolution: "esast-util-from-estree@npm:2.0.0" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + devlop: "npm:^1.0.0" + estree-util-visit: "npm:^2.0.0" + unist-util-position-from-estree: "npm:^2.0.0" + checksum: 10/b11a13df70e51e0306a8097d691eb2dbde52388bb4d29f89c080fccd00c9fb22a624fad8683ca2ce01761cbf289d3fd480852aec8f5e5a3f0a2abd30aa8dfbe7 + languageName: node + linkType: hard + +"esast-util-from-js@npm:^2.0.0": + version: 2.0.1 + resolution: "esast-util-from-js@npm:2.0.1" + dependencies: + "@types/estree-jsx": "npm:^1.0.0" + acorn: "npm:^8.0.0" + esast-util-from-estree: "npm:^2.0.0" + vfile-message: "npm:^4.0.0" + checksum: 10/ad3ff18de45d981a19ae35ecd7f47a2954399c2d901f3d9f22ab58309c327215b6e2e39f9c0a8ff58d3fd0435fe81a3ff4257754e1a12bdc590a0b68c9d6e085 languageName: node linkType: hard -"escalade@npm:^3.2.0": +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 @@ -8641,6 +7154,16 @@ __metadata: languageName: node linkType: hard +"estree-util-scope@npm:^1.0.0": + version: 1.0.0 + resolution: "estree-util-scope@npm:1.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + devlop: "npm:^1.0.0" + checksum: 10/7807aaaf8651150fefee19cb60a670884f677959cc05513369c0b9646a329b132bccc9d6bbf19411a8a55a0840530f4e93cef5bba92ae9f347ac7c2ceef37cdd + languageName: node + linkType: hard + "estree-util-to-js@npm:^2.0.0": version: 2.0.0 resolution: "estree-util-to-js@npm:2.0.0" @@ -8653,11 +7176,11 @@ __metadata: linkType: hard "estree-util-value-to-estree@npm:^3.0.1": - version: 3.4.0 - resolution: "estree-util-value-to-estree@npm:3.4.0" + version: 3.5.0 + resolution: "estree-util-value-to-estree@npm:3.5.0" dependencies: "@types/estree": "npm:^1.0.0" - checksum: 10/4fdb101cba7e3c8a2aaf1881c0c169218addaea0b6101e3de344c137663e4db8887da7fccd0c96939340aa13679af085a07cca05ee168d61a5fb783054bdffe5 + checksum: 10/b8fc4db7a70d7af5c1ae9d611fc7802022e88fece351ddc557a2db3aa3c7d65eb79e4499f845b9783054cb6826b489ed17c178b09d50ca182c17c53d07a79b83 languageName: node linkType: hard @@ -8725,13 +7248,6 @@ __metadata: languageName: node linkType: hard -"eventsource-parser@npm:^3.0.5": - version: 3.0.6 - resolution: "eventsource-parser@npm:3.0.6" - checksum: 10/febf7058b9c2168ecbb33e92711a1646e06bd1568f60b6eb6a01a8bf9f8fcd29cc8320d57247059cacf657a296280159f21306d2e3ff33309a9552b2ef889387 - languageName: node - linkType: hard - "execa@npm:5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -8750,48 +7266,48 @@ __metadata: linkType: hard "exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10/2d9bbb6473de7051f96790d5f9a678f32e60ed0aa70741dc7fdc96fec8d631124ec3374ac144387604f05afff9500f31a1d45bd9eee4cdc2e4f9ad2d9b9d5dbd + version: 3.1.3 + resolution: "exponential-backoff@npm:3.1.3" + checksum: 10/ca25962b4bbab943b7c4ed0b5228e263833a5063c65e1cdeac4be9afad350aae5466e8e619b5051f4f8d37b2144a2d6e8fcc771b6cc82934f7dade2f964f652c languageName: node linkType: hard -"express@npm:^4.21.2": - version: 4.21.2 - resolution: "express@npm:4.21.2" +"express@npm:^4.22.1": + version: 4.22.1 + resolution: "express@npm:4.22.1" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.3" - content-disposition: "npm:0.5.4" + body-parser: "npm:~1.20.3" + content-disposition: "npm:~0.5.4" content-type: "npm:~1.0.4" - cookie: "npm:0.7.1" - cookie-signature: "npm:1.0.6" + cookie: "npm:~0.7.1" + cookie-signature: "npm:~1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - finalhandler: "npm:1.3.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" + finalhandler: "npm:~1.3.1" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.0" merge-descriptors: "npm:1.0.3" methods: "npm:~1.1.2" - on-finished: "npm:2.4.1" + on-finished: "npm:~2.4.1" parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.12" + path-to-regexp: "npm:~0.1.12" proxy-addr: "npm:~2.0.7" - qs: "npm:6.13.0" + qs: "npm:~6.14.0" range-parser: "npm:~1.2.1" safe-buffer: "npm:5.2.1" - send: "npm:0.19.0" - serve-static: "npm:1.16.2" + send: "npm:~0.19.0" + serve-static: "npm:~1.16.2" setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" + statuses: "npm:~2.0.1" type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10/34571c442fc8c9f2c4b442d2faa10ea1175cf8559237fc6a278f5ce6254a8ffdbeb9a15d99f77c1a9f2926ab183e3b7ba560e3261f1ad4149799e3412ab66bd1 + checksum: 10/f33c1bd0c7d36e2a1f18de9cdc176469d32f68e20258d2941b8d296ab9a4fd9011872c246391bf87714f009fac5114c832ec5ac65cbee39421f1258801eb8470 languageName: node linkType: hard @@ -8811,7 +7327,7 @@ __metadata: languageName: node linkType: hard -"fast-deep-equal@npm:3.1.3, fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": +"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" checksum: 10/e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d @@ -8819,15 +7335,15 @@ __metadata: linkType: hard "fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10/222512e9315a0efca1276af9adb2127f02105d7288fa746145bf45e2716383fb79eb983c89601a72a399a56b7c18d38ce70457c5466218c5f13fad957cee16df + micromatch: "npm:^4.0.8" + checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad languageName: node linkType: hard @@ -8838,12 +7354,19 @@ __metadata: languageName: node linkType: hard +"fast-uri@npm:^3.0.1": + version: 3.1.0 + resolution: "fast-uri@npm:3.1.0" + checksum: 10/818b2c96dc913bcf8511d844c3d2420e2c70b325c0653633f51821e4e29013c2015387944435cd0ef5322c36c9beecc31e44f71b257aeb8e0b333c1d62bb17c2 + languageName: node + linkType: hard + "fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" + version: 1.20.1 + resolution: "fastq@npm:1.20.1" dependencies: reusify: "npm:^1.0.4" - checksum: 10/a443180068b527dd7b3a63dc7f2a47ceca2f3e97b9c00a1efe5538757e6cc4056a3526df94308075d7727561baf09ebaa5b67da8dcbddb913a021c5ae69d1f69 + checksum: 10/ab2fe3a7a108112e7752cfe7fc11683c21e595913a6a593ad0b4415f31dddbfc283775ab66f2c8ccea6ab7cfc116157cbddcfae9798d9de98d08fe0a2c3e97b2 languageName: node linkType: hard @@ -8865,6 +7388,18 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10/14ca1c9f0a0e8f4f2e9bf4e8551065a164a09545dae548c12a18d238b72e51e5a7b39bd8e5494b56463a0877672d0a6c1ef62c6fa0677db1b0c847773be939b1 + languageName: node + linkType: hard + "feed@npm:^4.2.2": version: 4.2.2 resolution: "feed@npm:4.2.2" @@ -8904,18 +7439,18 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.3.1": - version: 1.3.1 - resolution: "finalhandler@npm:1.3.1" +"finalhandler@npm:~1.3.1": + version: 1.3.2 + resolution: "finalhandler@npm:1.3.2" dependencies: debug: "npm:2.6.9" encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" - on-finished: "npm:2.4.1" + on-finished: "npm:~2.4.1" parseurl: "npm:~1.3.3" - statuses: "npm:2.0.1" + statuses: "npm:~2.0.2" unpipe: "npm:~1.0.0" - checksum: 10/4babe72969b7373b5842bc9f75c3a641a4d0f8eb53af6b89fa714d4460ce03fb92b28de751d12ba415e96e7e02870c436d67412120555e2b382640535697305b + checksum: 10/6cb4f9f80eaeb5a0fac4fdbd27a65d39271f040a0034df16556d896bfd855fd42f09da886781b3102117ea8fceba97b903c1f8b08df1fb5740576d5e0f481eed languageName: node linkType: hard @@ -8949,22 +7484,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" peerDependenciesMeta: debug: optional: true - checksum: 10/70c7612c4cab18e546e36b991bbf8009a1a41cf85354afe04b113d1117569abf760269409cb3eb842d9f7b03d62826687086b081c566ea7b1e6613cf29030bf7 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.2.1 - resolution: "foreground-child@npm:3.2.1" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10/77b33b3c438a499201727ca84de39a66350ccd54a8805df712773e963cefb5c4632dbc4386109e97a0df8fb1585aee95fa35acb07587e3e04cfacabfc0ae15dc + checksum: 10/07372fd74b98c78cf4d417d68d41fdaa0be4dcacafffb9e67b1e3cf090bc4771515e65020651528faab238f10f9b9c0d9707d6c1574a6c0387c5de1042cde9ba languageName: node linkType: hard @@ -8989,14 +7514,14 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.3.7": - version: 4.3.7 - resolution: "fraction.js@npm:4.3.7" - checksum: 10/bb5ebcdeeffcdc37b68ead3bdfc244e68de188e0c64e9702197333c72963b95cc798883ad16adc21588088b942bca5b6a6ff4aeb1362d19f6f3b629035dc15f5 +"fraction.js@npm:^5.3.4": + version: 5.3.4 + resolution: "fraction.js@npm:5.3.4" + checksum: 10/ef2c4bc81b2484065f8f7e4c2498f3fdfe6d233b8e7c7f75e3683ed10698536129b2c2dbd6c3f788ca4a020ec07116dd909a91036a364c98dc802b5003bfc613 languageName: node linkType: hard -"fresh@npm:0.5.2": +"fresh@npm:~0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: 10/64c88e489b5d08e2f29664eb3c79c705ff9a8eb15d3e597198ef76546d4ade295897a44abb0abd2700e7ef784b2e3cbf1161e4fbf16f59129193fd1030d16da1 @@ -9004,22 +7529,13 @@ __metadata: linkType: hard "fs-extra@npm:^11.1.1, fs-extra@npm:^11.2.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" + version: 11.3.3 + resolution: "fs-extra@npm:11.3.3" dependencies: graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 10/0579bf6726a4cd054d4aa308f10b483f52478bb16284f32cf60b4ce0542063d551fca1a08a2af365e35db21a3fa5a06cf2a6ed614004b4368982bc754cb816b3 - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10/03191781e94bc9a54bd376d3146f90fe8e082627c502185dbf7b9b3032f66b0b142c1115f3b2cc5936575fc1b44845ce903dd4c21bec2a8d69f3bd56f9cee9ec + checksum: 10/daeaefafbebe8fa6efd2fb96fc926f2c952be5877811f00a6794f0d64e0128e3d0d93368cd328f8f063b45deacf385c40e3d931aa46014245431cd2f4f89c67a languageName: node linkType: hard @@ -9058,6 +7574,13 @@ __metadata: languageName: node linkType: hard +"generator-function@npm:^2.0.0": + version: 2.0.1 + resolution: "generator-function@npm:2.0.1" + checksum: 10/eb7e7eb896c5433f3d40982b2ccacdb3dd990dd3499f14040e002b5d54572476513be8a2e6f9609f6e41ab29f2c4469307611ddbfc37ff4e46b765c326663805 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -9065,16 +7588,24 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.3.0": + version: 1.3.1 + resolution: "get-intrinsic@npm:1.3.1" dependencies: + async-function: "npm:^1.0.0" + async-generator-function: "npm:^1.0.0" + call-bind-apply-helpers: "npm:^1.0.2" + es-define-property: "npm:^1.0.1" es-errors: "npm:^1.3.0" + es-object-atoms: "npm:^1.1.1" function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10/85bbf4b234c3940edf8a41f4ecbd4e25ce78e5e6ad4e24ca2f77037d983b9ef943fd72f00f3ee97a49ec622a506b67db49c36246150377efcda1c9eb03e5f06d + generator-function: "npm:^2.0.0" + get-proto: "npm:^1.0.1" + gopd: "npm:^1.2.0" + has-symbols: "npm:^1.1.0" + hasown: "npm:^2.0.2" + math-intrinsics: "npm:^1.1.0" + checksum: 10/bb579dda84caa4a3a41611bdd483dade7f00f246f2a7992eb143c5861155290df3fdb48a8406efa3dfb0b434e2c8fafa4eebd469e409d0439247f85fc3fa2cc1 languageName: node linkType: hard @@ -9085,6 +7616,16 @@ __metadata: languageName: node linkType: hard +"get-proto@npm:^1.0.1": + version: 1.0.1 + resolution: "get-proto@npm:1.0.1" + dependencies: + dunder-proto: "npm:^1.0.1" + es-object-atoms: "npm:^1.0.0" + checksum: 10/4fc96afdb58ced9a67558698b91433e6b037aaa6f1493af77498d7c85b141382cf223c0e5946f334fb328ee85dfe6edd06d218eaf09556f4bc4ec6005d7f5f7b + languageName: node + linkType: hard + "get-stream@npm:^6.0.0, get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" @@ -9117,7 +7658,7 @@ __metadata: languageName: node linkType: hard -"glob-to-regex.js@npm:^1.0.1": +"glob-to-regex.js@npm:^1.0.0, glob-to-regex.js@npm:^1.0.1": version: 1.2.0 resolution: "glob-to-regex.js@npm:1.2.0" peerDependencies: @@ -9133,19 +7674,14 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.4.5 - resolution: "glob@npm:10.4.5" +"glob@npm:^13.0.0": + version: 13.0.6 + resolution: "glob@npm:13.0.6" dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10/698dfe11828b7efd0514cd11e573eaed26b2dff611f0400907281ce3eab0c1e56143ef9b35adc7c77ecc71fba74717b510c7c223d34ca8a98ec81777b293d4ac + minimatch: "npm:^10.2.2" + minipass: "npm:^7.1.3" + path-scurry: "npm:^2.0.2" + checksum: 10/201ad69e5f0aa74e1d8c00a481581f8b8c804b6a4fbfabeeb8541f5d756932800331daeba99b58fb9e4cd67e12ba5a7eba5b82fb476691588418060b84353214 languageName: node linkType: hard @@ -9153,22 +7689,8 @@ __metadata: version: 3.0.1 resolution: "global-dirs@npm:3.0.1" dependencies: - ini: "npm:2.0.0" - checksum: 10/70147b80261601fd40ac02a104581432325c1c47329706acd773f3a6ce99bb36d1d996038c85ccacd482ad22258ec233c586b6a91535b1a116b89663d49d6438 - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10/9f054fa38ff8de8fa356502eb9d2dae0c928217b8b5c8de1f09f5c9b6c8a96d8b9bd3afc49acbcd384a98a81fea713c859e1b09e214c60509517bb8fc2bc13c2 - languageName: node - linkType: hard - -"globals@npm:^15.14.0": - version: 15.15.0 - resolution: "globals@npm:15.15.0" - checksum: 10/7f561c87b2fd381b27fc2db7df8a4ea7a9bb378667b8a7193e61fd2ca3a876479174e2a303a74345fbea6e1242e16db48915c1fd3bf35adcf4060a795b425e18 + ini: "npm:2.0.0" + checksum: 10/70147b80261601fd40ac02a104581432325c1c47329706acd773f3a6ce99bb36d1d996038c85ccacd482ad22258ec233c586b6a91535b1a116b89663d49d6438 languageName: node linkType: hard @@ -9199,12 +7721,10 @@ __metadata: languageName: node linkType: hard -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10/5fbc7ad57b368ae4cd2f41214bd947b045c1a4be2f194a7be1778d71f8af9dbf4004221f3b6f23e30820eb0d052b4f819fe6ebe8221e2a3c6f0ee4ef173421ca +"gopd@npm:^1.0.1, gopd@npm:^1.2.0": + version: 1.2.0 + resolution: "gopd@npm:1.2.0" + checksum: 10/94e296d69f92dc1c0768fcfeecfb3855582ab59a7c75e969d5f96ce50c3d201fd86d5a2857c22565764d5bb8a816c7b1e58f133ec318cd56274da36c5e3fb1a1 languageName: node linkType: hard @@ -9276,13 +7796,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10/4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -9299,17 +7812,10 @@ __metadata: languageName: node linkType: hard -"has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10/0b67c2c94e3bea37db3e412e3c41f79d59259875e636ba471e94c009cdfb1fa82bf045deeffafc7dbb9c148e36cae6b467055aaa5d9fad4316e11b41e3ba551a - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10/464f97a8202a7690dadd026e6d73b1ceeddd60fe6acfd06151106f050303eaa75855aaa94969df8015c11ff7c505f196114d22f7386b4a471038da5874cf5e9b +"has-symbols@npm:^1.1.0": + version: 1.1.0 + resolution: "has-symbols@npm:1.1.0" + checksum: 10/959385c98696ebbca51e7534e0dc723ada325efa3475350951363cce216d27373e0259b63edb599f72eb94d6cde8577b4b2375f080b303947e560f85692834fa languageName: node linkType: hard @@ -9320,7 +7826,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0, hasown@npm:^2.0.2": +"hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -9330,18 +7836,18 @@ __metadata: linkType: hard "hast-util-from-parse5@npm:^8.0.0": - version: 8.0.1 - resolution: "hast-util-from-parse5@npm:8.0.1" + version: 8.0.3 + resolution: "hast-util-from-parse5@npm:8.0.3" dependencies: "@types/hast": "npm:^3.0.0" "@types/unist": "npm:^3.0.0" devlop: "npm:^1.0.0" - hastscript: "npm:^8.0.0" - property-information: "npm:^6.0.0" + hastscript: "npm:^9.0.0" + property-information: "npm:^7.0.0" vfile: "npm:^6.0.0" vfile-location: "npm:^5.0.0" web-namespaces: "npm:^2.0.0" - checksum: 10/d4105af849bebceac0a641a5f4611a43eeb4b94f9d3958ce6cbbb069dd177edefb9cd31a210689bc9cca9a30db984d622bdf898aed44a2ea99560d81023b0e2d + checksum: 10/539c945c550cfef394a89dcff6e4de26768a748a7288ddce6f59554dd271b663b8398d58ace434264e965aaf3828fdbff86f9109d7fa639b3fe34dedcad4a5df languageName: node linkType: hard @@ -9355,8 +7861,8 @@ __metadata: linkType: hard "hast-util-raw@npm:^9.0.0": - version: 9.0.4 - resolution: "hast-util-raw@npm:9.0.4" + version: 9.1.0 + resolution: "hast-util-raw@npm:9.1.0" dependencies: "@types/hast": "npm:^3.0.0" "@types/unist": "npm:^3.0.0" @@ -9371,13 +7877,13 @@ __metadata: vfile: "npm:^6.0.0" web-namespaces: "npm:^2.0.0" zwitch: "npm:^2.0.0" - checksum: 10/390ca63420009e2638001ee85c9dc8553da0b70dc9dfb520824d13459f6d3e71d81b275b45a2c145c0418af71e5ee532a1148e61cf6f8a74155453244e4cd925 + checksum: 10/fa304d08a9fce0f54b2baa18d15c45cb5cac695cbee3567b8ccbd9a57fa295c0fb23d238daca1cf0135ad8d538bb341dcd7d9da03f8b7d12e6980a9f8c4340ae languageName: node linkType: hard "hast-util-to-estree@npm:^3.0.0": - version: 3.1.0 - resolution: "hast-util-to-estree@npm:3.1.0" + version: 3.1.3 + resolution: "hast-util-to-estree@npm:3.1.3" dependencies: "@types/estree": "npm:^1.0.0" "@types/estree-jsx": "npm:^1.0.0" @@ -9390,18 +7896,18 @@ __metadata: mdast-util-mdx-expression: "npm:^2.0.0" mdast-util-mdx-jsx: "npm:^3.0.0" mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^6.0.0" + property-information: "npm:^7.0.0" space-separated-tokens: "npm:^2.0.0" - style-to-object: "npm:^0.4.0" + style-to-js: "npm:^1.0.0" unist-util-position: "npm:^5.0.0" zwitch: "npm:^2.0.0" - checksum: 10/02efab6a0bc94b63dd7cbd9d8fae5152dd2dbabbc575d2875fbb2a92c407925d68dba8dadc4468a4c957efd1a35aafb67713fab09584a0688a9b17683c91a5da + checksum: 10/efe69c8af68f021d853e70916c6e940765be519aec8703765898c1c3814424b0470f70c0272cf4ac06dcaf6d6f3cc781ebf034701ed240a33ac691d1f5eaf65b languageName: node linkType: hard "hast-util-to-jsx-runtime@npm:^2.0.0": - version: 2.3.0 - resolution: "hast-util-to-jsx-runtime@npm:2.3.0" + version: 2.3.6 + resolution: "hast-util-to-jsx-runtime@npm:2.3.6" dependencies: "@types/estree": "npm:^1.0.0" "@types/hast": "npm:^3.0.0" @@ -9413,27 +7919,27 @@ __metadata: mdast-util-mdx-expression: "npm:^2.0.0" mdast-util-mdx-jsx: "npm:^3.0.0" mdast-util-mdxjs-esm: "npm:^2.0.0" - property-information: "npm:^6.0.0" + property-information: "npm:^7.0.0" space-separated-tokens: "npm:^2.0.0" - style-to-object: "npm:^1.0.0" + style-to-js: "npm:^1.0.0" unist-util-position: "npm:^5.0.0" vfile-message: "npm:^4.0.0" - checksum: 10/880c9b5a7ed1de0702af677a7ba67ce5236f4823727f79917de62652d014c06e51419db9a82c01494b86e1926b49347e766b5601351445657c6f9b091f7eac1a + checksum: 10/111bd69f482952c7591cb4e1d3face25f1c18849b310a4d6cacc91e2d2cbc965d455fad35c059b8f0cfd762e933b826a7090b6f3098dece08307a6569de8f1d8 languageName: node linkType: hard "hast-util-to-parse5@npm:^8.0.0": - version: 8.0.0 - resolution: "hast-util-to-parse5@npm:8.0.0" + version: 8.0.1 + resolution: "hast-util-to-parse5@npm:8.0.1" dependencies: "@types/hast": "npm:^3.0.0" comma-separated-tokens: "npm:^2.0.0" devlop: "npm:^1.0.0" - property-information: "npm:^6.0.0" + property-information: "npm:^7.0.0" space-separated-tokens: "npm:^2.0.0" web-namespaces: "npm:^2.0.0" zwitch: "npm:^2.0.0" - checksum: 10/ba59d0913ba7e914d8b0a50955c06806a6868445c56796ac9129d58185e86d7ff24037246767aba2ea904d9dee8c09b8ff303630bcd854431fdc1bbee2164c36 + checksum: 10/4776c2fc2d6231364e4d59e7b0045f2ba340fdbf912825147fa2c3dfdf90cc7f458c86da90a9c2c7028375197f1ba2e831ea4c4ea549a0a9911a670e73edd6a7 languageName: node linkType: hard @@ -9446,16 +7952,16 @@ __metadata: languageName: node linkType: hard -"hastscript@npm:^8.0.0": - version: 8.0.0 - resolution: "hastscript@npm:8.0.0" +"hastscript@npm:^9.0.0": + version: 9.0.1 + resolution: "hastscript@npm:9.0.1" dependencies: "@types/hast": "npm:^3.0.0" comma-separated-tokens: "npm:^2.0.0" hast-util-parse-selector: "npm:^4.0.0" - property-information: "npm:^6.0.0" + property-information: "npm:^7.0.0" space-separated-tokens: "npm:^2.0.0" - checksum: 10/cdc3477968ee0161c39615a650203e592d03bbd9a2a0e1d78d37f544fcf8c30f55fcf9e6d27c4372a89fdebeae756452f19c7f5b655a162d54524b39b2dfe0fe + checksum: 10/9aa8135faf0307807cca4075bef4e3403ae1ce959ad4b9e6720892ba957d58ff98b2f60b5eb3ac67d88ae897dc918997299cd4249d7ac602a0066dd46442c5d4 languageName: node linkType: hard @@ -9482,24 +7988,6 @@ __metadata: languageName: node linkType: hard -"hls-video-element@npm:^1.5.8": - version: 1.5.8 - resolution: "hls-video-element@npm:1.5.8" - dependencies: - custom-media-element: "npm:^1.4.5" - hls.js: "npm:^1.6.5" - media-tracks: "npm:^0.3.3" - checksum: 10/9e32ad94ba200fe00c3bec68c6e6d0bb925c2971d4cd25a551dd4d2aa3db665d69ca8016e6db2d44a0655dbf3dca02b62c38fea49de0c298f59c0f2b6f1a5e12 - languageName: node - linkType: hard - -"hls.js@npm:^1.6.5, hls.js@npm:~1.6.6": - version: 1.6.7 - resolution: "hls.js@npm:1.6.7" - checksum: 10/10674cadf31f783abe8d33c695b2061ffd578cc1fea866bfd36b9529a694ae7ca23a9c116da7c16410bdadfce7d4fb8cdc0077d65565792eba457eff87c8f5c6 - languageName: node - linkType: hard - "hoist-non-react-statics@npm:^3.1.0": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -9521,13 +8009,6 @@ __metadata: languageName: node linkType: hard -"html-entities@npm:^2.5.2": - version: 2.6.0 - resolution: "html-entities@npm:2.6.0" - checksum: 10/06d4e7a3ba6243bba558af176e56f85e09894b26d911bc1ef7b2b9b3f18b46604360805b32636f080e954778e9a34313d1982479a05a5aa49791afd6a4229346 - languageName: node - linkType: hard - "html-escaper@npm:^2.0.2": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" @@ -9584,8 +8065,8 @@ __metadata: linkType: hard "html-webpack-plugin@npm:^5.6.0": - version: 5.6.3 - resolution: "html-webpack-plugin@npm:5.6.3" + version: 5.6.6 + resolution: "html-webpack-plugin@npm:5.6.6" dependencies: "@types/html-minifier-terser": "npm:^6.0.0" html-minifier-terser: "npm:^6.0.2" @@ -9600,7 +8081,7 @@ __metadata: optional: true webpack: optional: true - checksum: 10/fd2bf1ac04823526c8b609555d027b38b9d61b4ba9f5c8116a37cc6b62d5b86cab1f478616e8c5344fee13663d2566f5c470c66265ecb1e9574dc38d0459889d + checksum: 10/819ebee079466029a771236fdadcbcfe0aaf110eac1b74c0983a0318a7f99f3c69adcf1d617e218769a8c8e96ea17de2df30759bd950ec391d0c5676d480894e languageName: node linkType: hard @@ -9629,9 +8110,9 @@ __metadata: linkType: hard "http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10/362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f + version: 4.2.0 + resolution: "http-cache-semantics@npm:4.2.0" + checksum: 10/4efd2dfcfeea9d5e88c84af450b9980be8a43c2c8179508b1c57c7b4421c855f3e8efe92fa53e0b3f4a43c85824ada930eabbc306d1b3beab750b6dcc5187693 languageName: node linkType: hard @@ -9642,35 +8123,36 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" +"http-errors@npm:~1.8.0": + version: 1.8.1 + resolution: "http-errors@npm:1.8.1" dependencies: - depd: "npm:2.0.0" + depd: "npm:~1.1.2" inherits: "npm:2.0.4" setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" + statuses: "npm:>= 1.5.0 < 2" toidentifier: "npm:1.0.1" - checksum: 10/0e7f76ee8ff8a33e58a3281a469815b893c41357378f408be8f6d4aa7d1efafb0da064625518e7078381b6a92325949b119dc38fcb30bdbc4e3a35f78c44c439 + checksum: 10/76fc491bd8df2251e21978e080d5dae20d9736cfb29bb72b5b76ec1bcebb1c14f0f58a3a128dd89288934379d2173cfb0421c571d54103e93dd65ef6243d64d8 languageName: node linkType: hard -"http-errors@npm:~1.6.2": - version: 1.6.3 - resolution: "http-errors@npm:1.6.3" +"http-errors@npm:~2.0.0, http-errors@npm:~2.0.1": + version: 2.0.1 + resolution: "http-errors@npm:2.0.1" dependencies: - depd: "npm:~1.1.2" - inherits: "npm:2.0.3" - setprototypeof: "npm:1.1.0" - statuses: "npm:>= 1.4.0 < 2" - checksum: 10/e48732657ea0b4a09853d2696a584fa59fa2a8c1ba692af7af3137b5491a997d7f9723f824e7e08eb6a87098532c09ce066966ddf0f9f3dd30905e52301acadb + depd: "npm:~2.0.0" + inherits: "npm:~2.0.4" + setprototypeof: "npm:~1.2.0" + statuses: "npm:~2.0.2" + toidentifier: "npm:~1.0.1" + checksum: 10/9fe31bc0edf36566c87048aed1d3d0cbe03552564adc3541626a0613f542d753fbcb13bdfcec0a3a530dbe1714bb566c89d46244616b66bddd26ac413b06a207 languageName: node linkType: hard "http-parser-js@npm:>=0.5.1": - version: 0.5.8 - resolution: "http-parser-js@npm:0.5.8" - checksum: 10/2a78a567ee6366dae0129d819b799dce1f95ec9732c5ab164a78ee69804ffb984abfa0660274e94e890fc54af93546eb9f12b6d10edbaed017e2d41c29b7cf29 + version: 0.5.10 + resolution: "http-parser-js@npm:0.5.10" + checksum: 10/33c53b458cfdf7e43f1517f9bcb6bed1c614b1c7c5d65581a84304110eb9eb02a48f998c7504b8bee432ef4a8ec9318e7009406b506b28b5610fed516242b20a languageName: node linkType: hard @@ -9724,12 +8206,12 @@ __metadata: linkType: hard "https-proxy-agent@npm:^7.0.1": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" + version: 7.0.6 + resolution: "https-proxy-agent@npm:7.0.6" dependencies: - agent-base: "npm:^7.0.2" + agent-base: "npm:^7.1.2" debug: "npm:4" - checksum: 10/6679d46159ab3f9a5509ee80c3a3fc83fba3a920a5e18d32176c3327852c3c00ad640c0c4210a8fd70ea3c4a6d3a1b375bf01942516e7df80e2646bdc77658ab + checksum: 10/784b628cbd55b25542a9d85033bdfd03d4eda630fb8b3c9477959367f3be95dc476ed2ecbb9836c359c7c698027fc7b45723a302324433590f45d6c1706e8c13 languageName: node linkType: hard @@ -9747,15 +8229,6 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10/6d3a2dac6e5d1fb126d25645c25c3a1209f70cceecc68b8ef51ae0da3cdc078c151fade7524a30b12a3094926336831fca09c666ef55b37e2c69638b5d6bd2e3 - languageName: node - linkType: hard - "iconv-lite@npm:0.6, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -9765,6 +8238,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:~0.4.24": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10/6d3a2dac6e5d1fb126d25645c25c3a1209f70cceecc68b8ef51ae0da3cdc078c151fade7524a30b12a3094926336831fca09c666ef55b37e2c69638b5d6bd2e3 + languageName: node + linkType: hard + "icss-utils@npm:^5.0.0, icss-utils@npm:^5.1.0": version: 5.1.0 resolution: "icss-utils@npm:5.1.0" @@ -9775,9 +8257,9 @@ __metadata: linkType: hard "ignore@npm:^5.2.0, ignore@npm:^5.2.4": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10/0a884c2fbc8c316f0b9f92beaf84464253b73230a4d4d286697be45fca081199191ca33e1c2e82d9e5f851f5e9a48a78e25a35c951e7eb41e59f150db3530065 + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 languageName: node linkType: hard @@ -9790,20 +8272,13 @@ __metadata: languageName: node linkType: hard -"immediate@npm:~3.0.5": - version: 3.0.6 - resolution: "immediate@npm:3.0.6" - checksum: 10/f9b3486477555997657f70318cc8d3416159f208bec4cca3ff3442fd266bc23f50f0c9bd8547e1371a6b5e82b821ec9a7044a4f7b944798b25aa3cc6d5e63e62 - languageName: node - linkType: hard - "import-fresh@npm:^3.3.0": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" + version: 3.3.1 + resolution: "import-fresh@npm:3.3.1" dependencies: parent-module: "npm:^1.0.0" resolve-from: "npm:^4.0.0" - checksum: 10/2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + checksum: 10/a06b19461b4879cc654d46f8a6244eb55eb053437afd4cbb6613cad6be203811849ed3e4ea038783092879487299fda24af932b86bdfff67c9055ba3612b8c87 languageName: node linkType: hard @@ -9814,15 +8289,6 @@ __metadata: languageName: node linkType: hard -"imsc@npm:^1.1.5": - version: 1.1.5 - resolution: "imsc@npm:1.1.5" - dependencies: - sax: "npm:1.2.1" - checksum: 10/07528b03c792f2338bcb594d1139910ab42e7942f4fe55ebfabdd334c4b950efef1b89b9765e8333aa0c76376d16d4b6c8fd2c7d90ccdead3ed6c80c50890700 - languageName: node - linkType: hard - "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" @@ -9844,14 +8310,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2.0.3": - version: 2.0.3 - resolution: "inherits@npm:2.0.3" - checksum: 10/8771303d66c51be433b564427c16011a8e3fbc3449f1f11ea50efb30a4369495f1d0e89f0fc12bdec0bd7e49102ced5d137e031d39ea09821cb3c717fcf21e69 - languageName: node - linkType: hard - -"inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3": +"inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 10/cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 @@ -9872,17 +8331,10 @@ __metadata: languageName: node linkType: hard -"inline-style-parser@npm:0.1.1": - version: 0.1.1 - resolution: "inline-style-parser@npm:0.1.1" - checksum: 10/e661f4fb6824a41076c4d23358e8b581fd3410fbfb9baea4cb542a85448b487691c3b9bbb58ad73a95613041ca616f059595f19cadd0c22476a1fffa79842b48 - languageName: node - linkType: hard - -"inline-style-parser@npm:0.2.3": - version: 0.2.3 - resolution: "inline-style-parser@npm:0.2.3" - checksum: 10/10b1808e9c8430db22a7b3cdb301f07fe55d539a5f700bc1d06d02a9e8ed8260900831eb4f9a5ee8ae57cfbd133713a3387eae6b3ba3c6f8d0305ec208da4889 +"inline-style-parser@npm:0.2.7": + version: 0.2.7 + resolution: "inline-style-parser@npm:0.2.7" + checksum: 10/cdfe719bd694b53bfbad20a645a9a4dda89c3ff56ee2b95945ad4eea86c541501f49f852d23bc2f73cd8127b6b62ea9027f697838e323a7f7d0d9b760e27a632 languageName: node linkType: hard @@ -9909,13 +8361,10 @@ __metadata: languageName: node linkType: hard -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10/1ed81e06721af012306329b31f532b5e24e00cb537be18ddc905a84f19fe8f83a09a1699862bf3a1ec4b9dea93c55a3fa5faf8b5ea380431469df540f38b092c +"ip-address@npm:^10.0.1": + version: 10.1.0 + resolution: "ip-address@npm:10.1.0" + checksum: 10/a6979629d1ad9c1fb424bc25182203fad739b40225aebc55ec6243bbff5035faf7b9ed6efab3a097de6e713acbbfde944baacfa73e11852bb43989c45a68d79e languageName: node linkType: hard @@ -9927,9 +8376,9 @@ __metadata: linkType: hard "ipaddr.js@npm:^2.1.0": - version: 2.2.0 - resolution: "ipaddr.js@npm:2.2.0" - checksum: 10/9e1cdd9110b3bca5d910ab70d7fb1933e9c485d9b92cb14ef39f30c412ba3fe02a553921bf696efc7149cc653453c48ccf173adb996ec27d925f1f340f872986 + version: 2.3.0 + resolution: "ipaddr.js@npm:2.3.0" + checksum: 10/be3d01bc2e20fc2dc5349b489ea40883954b816ce3e57aa48ad943d4e7c4ace501f28a7a15bde4b96b6b97d0fbb28d599ff2f87399f3cda7bd728889402eed3b languageName: node linkType: hard @@ -9977,12 +8426,12 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0": - version: 2.14.0 - resolution: "is-core-module@npm:2.14.0" +"is-core-module@npm:^2.16.1": + version: 2.16.1 + resolution: "is-core-module@npm:2.16.1" dependencies: hasown: "npm:^2.0.2" - checksum: 10/1e0d1a16cb3a94746f6a28db09ccab4562860c94c74bacedb3a6729736d61cfb97001d2052f9622637aa7ea8e0643a3f0f4f16965c70ba6ce30a8ccfe8074af8 + checksum: 10/452b2c2fb7f889cbbf7e54609ef92cf6c24637c568acc7e63d166812a0fb365ae8a504c333a29add8bdb1686704068caa7f4e4b639b650dde4f00a038b8941fb languageName: node linkType: hard @@ -10069,13 +8518,6 @@ __metadata: languageName: node linkType: hard -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10/93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - "is-network-error@npm:^1.0.0": version: 1.3.0 resolution: "is-network-error@npm:1.3.0" @@ -10084,9 +8526,9 @@ __metadata: linkType: hard "is-npm@npm:^6.0.0": - version: 6.0.0 - resolution: "is-npm@npm:6.0.0" - checksum: 10/fafe1ddc772345f5460514891bb8014376904ccdbddd59eee7525c9adcc08d426933f28b087bef3e17524da7ebf35c03ef484ff3b6ba9d5fecd8c6e6a7d4bf11 + version: 6.1.0 + resolution: "is-npm@npm:6.1.0" + checksum: 10/54779c55419da537da77f0f41a409516148d09f1c6db9063ee6598783b309abab109ce4f540ef68c45f4dc1fec8600ed251e393029da31691fa93ce18e72243a languageName: node linkType: hard @@ -10141,15 +8583,6 @@ __metadata: languageName: node linkType: hard -"is-reference@npm:^3.0.0": - version: 3.0.2 - resolution: "is-reference@npm:3.0.2" - dependencies: - "@types/estree": "npm:*" - checksum: 10/ac3bf5626fe9d0afbd7454760d73c47f16b9f471401b9749721ad3b66f0a39644390382acf88ca9d029c95782c1e2ec65662855e3ba91acf52d82231247a7fd3 - languageName: node - linkType: hard - "is-regexp@npm:^1.0.0": version: 1.0.0 resolution: "is-regexp@npm:1.0.0" @@ -10181,11 +8614,11 @@ __metadata: linkType: hard "is-wsl@npm:^3.1.0": - version: 3.1.0 - resolution: "is-wsl@npm:3.1.0" + version: 3.1.1 + resolution: "is-wsl@npm:3.1.1" dependencies: is-inside-container: "npm:^1.0.0" - checksum: 10/f9734c81f2f9cf9877c5db8356bfe1ff61680f1f4c1011e91278a9c0564b395ae796addb4bf33956871041476ec82c3e5260ed57b22ac91794d4ae70a1d2f0a9 + checksum: 10/513d95b89af0e60b43d7b17ecb7eb78edea0a439136a3da37b1b56e215379cc46a9221474ad5b2de044824ca72d7869dee6e015273dc3f71f2bb87c715f9f1dc languageName: node linkType: hard @@ -10217,10 +8650,10 @@ __metadata: languageName: node linkType: hard -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10/7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e +"isexe@npm:^4.0.0": + version: 4.0.0 + resolution: "isexe@npm:4.0.0" + checksum: 10/2ead327ef596042ef9c9ec5f236b316acfaedb87f4bb61b3c3d574fb2e9c8a04b67305e04733bde52c24d9622fdebd3270aadb632adfbf9cadef88fe30f479e5 languageName: node linkType: hard @@ -10231,19 +8664,6 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^3.1.2": - version: 3.4.2 - resolution: "jackspeak@npm:3.4.2" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10/485b77ffef380d1a1367a6453f3c6e61ca02728012be99bb397e673479020e87b1b0307d8f2a9288e48017eea9b8c95586a5c621b137e60c856e87365b9e1a8f - languageName: node - linkType: hard - "jest-util@npm:^29.7.0": version: 29.7.0 resolution: "jest-util@npm:29.7.0" @@ -10282,11 +8702,11 @@ __metadata: linkType: hard "jiti@npm:^1.20.0": - version: 1.21.6 - resolution: "jiti@npm:1.21.6" + version: 1.21.7 + resolution: "jiti@npm:1.21.7" bin: jiti: bin/jiti.js - checksum: 10/289b124cea411c130a14ffe88e3d38376ab44b6695616dfa0a1f32176a8f20ec90cdd6d2b9d81450fc6467cfa4d865f04f49b98452bff0f812bc400fd0ae78d6 + checksum: 10/6a182521532126e4b7b5ad64b64fb2e162718fc03bc6019c21aa2222aacde6c6dfce4fc3bce9f69561a73b24ab5f79750ad353c37c3487a220d5869a39eae3a2 languageName: node linkType: hard @@ -10311,45 +8731,29 @@ __metadata: linkType: hard "js-yaml@npm:^3.13.1": - version: 3.14.1 - resolution: "js-yaml@npm:3.14.1" + version: 3.14.2 + resolution: "js-yaml@npm:3.14.2" dependencies: argparse: "npm:^1.0.7" esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: 10/9e22d80b4d0105b9899135365f746d47466ed53ef4223c529b3c0f7a39907743fdbd3c4379f94f1106f02755b5e90b2faaf84801a891135544e1ea475d1a1379 + checksum: 10/172e0b6007b0bf0fc8d2469c94424f7dd765c64a047d2b790831fecef2204a4054eabf4d911eb73ab8c9a3256ab8ba1ee8d655b789bf24bf059c772acc2075a1 languageName: node linkType: hard "js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" dependencies: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10/c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10/bebe7ae829bbd586ce8cbe83501dd8cb8c282c8902a8aeeed0a073a89dc37e8103b1244f3c6acd60278bcbfe12d93a3f83c9ac396868a3b3bbc3c5e5e3b648ef - languageName: node - linkType: hard - -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 10/d2096abdcdec56969764b40ffc91d4a23408aa2f351b4d1c13f736f25476643238c43fdbaf38a191c26b1b78fd856d965f5d4d0dde7b89459cd94025190cdf13 + checksum: 10/a52d0519f0f4ef5b4adc1cde466cb54c50d56e2b4a983b9d5c9c0f2f99462047007a6274d7e95617a21d3c91fde3ee6115536ed70991cd645ba8521058b78f77 languageName: node linkType: hard -"jsesc@npm:^3.0.2": +"jsesc@npm:^3.0.2, jsesc@npm:~3.1.0": version: 3.1.0 resolution: "jsesc@npm:3.1.0" bin: @@ -10358,24 +8762,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" - bin: - jsesc: bin/jsesc - checksum: 10/fab949f585c71e169c5cbe00f049f20de74f067081bbd64a55443bad1c71e1b5a5b448f2359bf2fe06f5ed7c07e2e4a9101843b01c823c30b6afc11f5bfaf724 - languageName: node - linkType: hard - -"jsesc@npm:~3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" - bin: - jsesc: bin/jsesc - checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 - languageName: node - linkType: hard - "json-buffer@npm:3.0.1": version: 3.0.1 resolution: "json-buffer@npm:3.0.1" @@ -10404,13 +8790,6 @@ __metadata: languageName: node linkType: hard -"json-schema@npm:^0.4.0": - version: 0.4.0 - resolution: "json-schema@npm:0.4.0" - checksum: 10/8b3b64eff4a807dc2a3045b104ed1b9335cd8d57aa74c58718f07f0f48b8baa3293b00af4dcfbdc9144c3aafea1e97982cc27cc8e150fc5d93c540649507a458 - languageName: node - linkType: hard - "json5@npm:^2.1.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -10421,26 +8800,26 @@ __metadata: linkType: hard "jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" + version: 6.2.0 + resolution: "jsonfile@npm:6.2.0" dependencies: graceful-fs: "npm:^4.1.6" universalify: "npm:^2.0.0" dependenciesMeta: graceful-fs: optional: true - checksum: 10/03014769e7dc77d4cf05fa0b534907270b60890085dd5e4d60a382ff09328580651da0b8b4cdf44d91e4c8ae64d91791d965f05707beff000ed494a38b6fec85 + checksum: 10/513aac94a6eff070767cafc8eb4424b35d523eec0fcd8019fe5b975f4de5b10a54640c8d5961491ddd8e6f562588cf62435c5ddaf83aaf0986cd2ee789e0d7b9 languageName: node linkType: hard -"katex@npm:^0.16.9": - version: 0.16.22 - resolution: "katex@npm:0.16.22" +"katex@npm:^0.16.22": + version: 0.16.28 + resolution: "katex@npm:0.16.28" dependencies: commander: "npm:^8.3.0" bin: katex: cli.js - checksum: 10/fdb8667d9aa971154502b120ba340766754d202e3d3e322aca0a96de27032ad2dbb8a7295d798d310cd7ce4ddd21ed1f3318895541b61c9b4fdf611166589e02 + checksum: 10/8f8c043e95c9e97e90aa9cc59fe143a094215a08af15e49d0d09a9aaf9ae89b89c528feae5d9927c000ff0f7006df2016751d23cf524bcb69a1b06e173029376 languageName: node linkType: hard @@ -10474,23 +8853,16 @@ __metadata: languageName: node linkType: hard -"kolorist@npm:^1.8.0": - version: 1.8.0 - resolution: "kolorist@npm:1.8.0" - checksum: 10/71d5d122951cc65f2f14c3e1d7f8fd91694b374647d4f6deec3816d018cd04a44edd9578d93e00c82c2053b925e5d30a0565746c4171f4ca9fce1a13bd5f3315 - languageName: node - linkType: hard - -"langium@npm:3.3.1": - version: 3.3.1 - resolution: "langium@npm:3.3.1" +"langium@npm:^4.0.0": + version: 4.2.1 + resolution: "langium@npm:4.2.1" dependencies: - chevrotain: "npm:~11.0.3" - chevrotain-allstar: "npm:~0.3.0" + chevrotain: "npm:~11.1.1" + chevrotain-allstar: "npm:~0.3.1" vscode-languageserver: "npm:~9.0.1" vscode-languageserver-textdocument: "npm:~1.0.11" - vscode-uri: "npm:~3.0.8" - checksum: 10/6b2e5bc1ff47c6048ec24471333f3397ddb4d6419f1c2262268faff00a8f0839ac4bd4877907261273e91e82f239951249155c3aff8d395ee5e3372dfc285e04 + vscode-uri: "npm:~3.1.0" + checksum: 10/9fd9208762ae9b551ec1deea25b6633605b06b59505a1ce6bf5b6c639779378bab35f813ffe549db57af95a5b71f9dcf61e553273a5d9d6ad2a3a99c5b7bfcc2 languageName: node linkType: hard @@ -10504,12 +8876,12 @@ __metadata: linkType: hard "launch-editor@npm:^2.6.1": - version: 2.11.1 - resolution: "launch-editor@npm:2.11.1" + version: 2.13.0 + resolution: "launch-editor@npm:2.13.0" dependencies: picocolors: "npm:^1.1.1" shell-quote: "npm:^1.8.3" - checksum: 10/652230807292551876b6ee9c504c3e85193a0c21722f6975a990edb0747b0584900550a3ea001fb3adacc7d14cc6681c4f07a51ab9d6fe255aad1bd30e5a878d + checksum: 10/ca631a91563b8fbf08d866915b0fca6b5928e068a663bd56078a26f855b1c154e49a28636e031be3ab5b5889cda47378943e97e0804419df6ff78d57a3152ac8 languageName: node linkType: hard @@ -10534,19 +8906,10 @@ __metadata: languageName: node linkType: hard -"lie@npm:3.1.1": - version: 3.1.1 - resolution: "lie@npm:3.1.1" - dependencies: - immediate: "npm:~3.0.5" - checksum: 10/c2c7d9dcc3a9aae641f41cde4e2e2cd571e4426b1f5915862781d77776672dcbca43461e16f4d382c9a300825c15e1a4923f1def3a5568d97577e077a3cecb44 - languageName: node - linkType: hard - "lilconfig@npm:^3.1.1": - version: 3.1.2 - resolution: "lilconfig@npm:3.1.2" - checksum: 10/8058403850cfad76d6041b23db23f730e52b6c17a8c28d87b90766639ca0ee40c748a3e85c2d7bd133d572efabff166c4b015e5d25e01fd666cb4b13cfada7f0 + version: 3.1.3 + resolution: "lilconfig@npm:3.1.3" + checksum: 10/b932ce1af94985f0efbe8896e57b1f814a48c8dbd7fc0ef8469785c6303ed29d0090af3ccad7e36b626bfca3a4dc56cc262697e9a8dd867623cf09a39d54e4c3 languageName: node linkType: hard @@ -10557,10 +8920,10 @@ __metadata: languageName: node linkType: hard -"loader-runner@npm:^4.2.0": - version: 4.3.0 - resolution: "loader-runner@npm:4.3.0" - checksum: 10/555ae002869c1e8942a0efd29a99b50a0ce6c3296efea95caf48f00d7f6f7f659203ed6613688b6181aa81dc76de3e65ece43094c6dffef3127fe1a84d973cd3 +"loader-runner@npm:^4.3.1": + version: 4.3.1 + resolution: "loader-runner@npm:4.3.1" + checksum: 10/d77127497c3f91fdba351e3e91156034e6e590e9f050b40df6c38ac16c54b5c903f7e2e141e09fefd046ee96b26fb50773c695ebc0aa205a4918683b124b04ba languageName: node linkType: hard @@ -10575,25 +8938,6 @@ __metadata: languageName: node linkType: hard -"local-pkg@npm:^1.0.0": - version: 1.0.0 - resolution: "local-pkg@npm:1.0.0" - dependencies: - mlly: "npm:^1.7.3" - pkg-types: "npm:^1.3.0" - checksum: 10/645d1a6c9c93ec7ae9fd5d9a08aa8c2c629bc03cdbc8503c144b8e89233c10c3490994c93ac51136d1f896a06f999a7ba22d379dcdee0bd2daa98efacf526497 - languageName: node - linkType: hard - -"localforage@npm:^1.10.0": - version: 1.10.0 - resolution: "localforage@npm:1.10.0" - dependencies: - lie: "npm:3.1.1" - checksum: 10/d5c44be3a09169b013a3ebe252e678aaeb6938ffe72e9e12c199fd4307c1ec9d1a057ac2dfdfbb1379dfeec467a34ad0fc3ecd27489a2c43a154fb72b2822542 - languageName: node - linkType: hard - "locate-path@npm:^7.1.0": version: 7.2.0 resolution: "locate-path@npm:7.2.0" @@ -10603,10 +8947,10 @@ __metadata: languageName: node linkType: hard -"lodash-es@npm:4.17.21, lodash-es@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash-es@npm:4.17.21" - checksum: 10/03f39878ea1e42b3199bd3f478150ab723f93cc8730ad86fec1f2804f4a07c6e30deaac73cad53a88e9c3db33348bb8ceeb274552390e7a75d7849021c02df43 +"lodash-es@npm:4.17.23, lodash-es@npm:^4.17.21, lodash-es@npm:^4.17.23": + version: 4.17.23 + resolution: "lodash-es@npm:4.17.23" + checksum: 10/1feae200df22eb0bd93ca86d485e77784b8a9fb1d13e91b66e9baa7a7e5e04be088c12a7e20c2250fc0bd3db1bc0ef0affc7d9e3810b6af2455a3c6bf6dde59e languageName: node linkType: hard @@ -10632,9 +8976,9 @@ __metadata: linkType: hard "lodash@npm:^4.17.20, lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10/c08619c038846ea6ac754abd6dd29d2568aa705feb69339e836dfa8d8b09abbb2f859371e86863eda41848221f9af43714491467b5b0299122431e202bb0c532 + version: 4.17.23 + resolution: "lodash@npm:4.17.23" + checksum: 10/82504c88250f58da7a5a4289f57a4f759c44946c005dd232821c7688b5fcfbf4a6268f6a6cdde4b792c91edd2f3b5398c1d2a0998274432cff76def48735e233 languageName: node linkType: hard @@ -10672,10 +9016,10 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a +"lru-cache@npm:^11.0.0, lru-cache@npm:^11.1.0, lru-cache@npm:^11.2.1": + version: 11.2.6 + resolution: "lru-cache@npm:11.2.6" + checksum: 10/91222bbd59f793a0a0ad57789388f06b34ac9bb1613433c1d1810457d09db5cd3ec8943227ce2e1f5d6a0a15d6f1a9f129cb2c49ae9b6b10e82d4965fddecbef languageName: node linkType: hard @@ -10688,23 +9032,22 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" +"make-fetch-happen@npm:^15.0.0": + version: 15.0.3 + resolution: "make-fetch-happen@npm:15.0.3" dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" + "@npmcli/agent": "npm:^4.0.0" + cacache: "npm:^20.0.1" http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" + minipass-fetch: "npm:^5.0.0" minipass-flush: "npm:^1.0.5" minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" + negotiator: "npm:^1.0.0" + proc-log: "npm:^6.0.0" promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10/11bae5ad6ac59b654dbd854f30782f9de052186c429dfce308eda42374528185a100ee40ac9ffdc36a2b6c821ecaba43913e4730a12f06f15e895ea9cb23fa59 + ssri: "npm:^13.0.0" + checksum: 10/78da4fc1df83cb596e2bae25aa0653b8a9c6cbdd6674a104894e03be3acfcd08c70b78f06ef6407fbd6b173f6a60672480d78641e693d05eb71c09c13ee35278 languageName: node linkType: hard @@ -10725,61 +9068,69 @@ __metadata: linkType: hard "markdown-table@npm:^3.0.0": - version: 3.0.3 - resolution: "markdown-table@npm:3.0.3" - checksum: 10/ee6e661935c85734620d2fd10e237a60ae2992ef861713b71aa66135a5d5ae957cf06ce5e15fedf3ed1fce839dd7af1f9e87c5729186490f69fa9469e8e5c3e8 + version: 3.0.4 + resolution: "markdown-table@npm:3.0.4" + checksum: 10/bc699819e6a15607e5def0f21aa862aa061cf1f49877baa93b0185574f6ab143591afe0e18b94d9b15ea80c6a693894150dbccfacf4f6767160dc32ae393dfe0 languageName: node linkType: hard -"marked@npm:^15.0.7": - version: 15.0.12 - resolution: "marked@npm:15.0.12" +"marked@npm:14.0.0": + version: 14.0.0 + resolution: "marked@npm:14.0.0" bin: marked: bin/marked.js - checksum: 10/deeb619405c0c46af00c99b18b3365450abeb309104b24e3658f46142344f6b7c4117608c3b5834084d8738e92f81240c19f596e6ee369260f96e52b3457eaee + checksum: 10/5f69e58e177bde75fb6145127c939c096d05494c5dff92d73af8a550097d6631c82e919f8a375e3743379a2623418151086b925a902a2be123590b887716f2bb languageName: node linkType: hard -"marked@npm:^16.3.0": - version: 16.4.1 - resolution: "marked@npm:16.4.1" +"marked@npm:^16.2.1": + version: 16.4.2 + resolution: "marked@npm:16.4.2" bin: marked: bin/marked.js - checksum: 10/b5f475dbe297162dc988b7f345b559d03248fde1023822b9f2a68f50cbca0981c78c42f380c3aa5e133b5f5c069a2c6cd683413c12c83710e983a7bc46cdf4a2 + checksum: 10/6e40e40661dce97e271198daa2054fc31e6445892a735e416c248fba046bdfa4573cafa08dc254529f105e7178a34485eb7f82573979cfb377a4530f66e79187 + languageName: node + linkType: hard + +"math-intrinsics@npm:^1.1.0": + version: 1.1.0 + resolution: "math-intrinsics@npm:1.1.0" + checksum: 10/11df2eda46d092a6035479632e1ec865b8134bdfc4bd9e571a656f4191525404f13a283a515938c3a8de934dbfd9c09674d9da9fa831e6eb7e22b50b197d2edd languageName: node linkType: hard "mdast-util-directive@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-directive@npm:3.0.0" + version: 3.1.0 + resolution: "mdast-util-directive@npm:3.1.0" dependencies: "@types/mdast": "npm:^4.0.0" "@types/unist": "npm:^3.0.0" + ccount: "npm:^2.0.0" devlop: "npm:^1.0.0" mdast-util-from-markdown: "npm:^2.0.0" mdast-util-to-markdown: "npm:^2.0.0" parse-entities: "npm:^4.0.0" stringify-entities: "npm:^4.0.0" unist-util-visit-parents: "npm:^6.0.0" - checksum: 10/a205af936302467648b6007704b40e31a822016789402cbcb0239d23ce7a48e676db1cd6792c9318c1047a47c5b3956b2bd0053f14c8d257528404d6bf9b9ab4 + checksum: 10/5aabd777ae8752cb9d09c7827a6690887536da8a9f85e833d5399ab8f47e5aadaa3eea78985efd041f50c658bf91b4579800dae79b20549240f52bbc2bc26335 languageName: node linkType: hard "mdast-util-find-and-replace@npm:^3.0.0, mdast-util-find-and-replace@npm:^3.0.1": - version: 3.0.1 - resolution: "mdast-util-find-and-replace@npm:3.0.1" + version: 3.0.2 + resolution: "mdast-util-find-and-replace@npm:3.0.2" dependencies: "@types/mdast": "npm:^4.0.0" escape-string-regexp: "npm:^5.0.0" unist-util-is: "npm:^6.0.0" unist-util-visit-parents: "npm:^6.0.0" - checksum: 10/2a9bbf5508ffd6dc63d9b0067398503a017e909ff60ac8234c518fcdacf9df13a48ea26bd382402bfce398b824ec41b3911b2004785e98f9a2c80ee6b34bb9bd + checksum: 10/446561aa950341ef6828069cef05566256cb6836b77ea498e648102411f96fdfa342c78b82c9d813b51a1dac80b030ce80c055e044bc285a3d52d8558fc3d65e languageName: node linkType: hard "mdast-util-from-markdown@npm:^2.0.0": - version: 2.0.1 - resolution: "mdast-util-from-markdown@npm:2.0.1" + version: 2.0.3 + resolution: "mdast-util-from-markdown@npm:2.0.3" dependencies: "@types/mdast": "npm:^4.0.0" "@types/unist": "npm:^3.0.0" @@ -10793,7 +9144,7 @@ __metadata: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" unist-util-stringify-position: "npm:^4.0.0" - checksum: 10/4172759cdd8cf9990701796c5617c8b6a4bd3f9863e730bb4e9689189daec80af3122e77eed2ab09090f1a2d396c4f5754416a41769d7c49efd165a1c0a033c8 + checksum: 10/96f2bfb3b240c3d20a57db5d215faed795abf495c65ca2a4d61c0cf796011bc980619aa032d7984b05b67c15edc0eccd12a004a848952d3a598d108cf14901ab languageName: node linkType: hard @@ -10812,28 +9163,28 @@ __metadata: linkType: hard "mdast-util-gfm-autolink-literal@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-autolink-literal@npm:2.0.0" + version: 2.0.1 + resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1" dependencies: "@types/mdast": "npm:^4.0.0" ccount: "npm:^2.0.0" devlop: "npm:^1.0.0" mdast-util-find-and-replace: "npm:^3.0.0" micromark-util-character: "npm:^2.0.0" - checksum: 10/08656ea3a5b53376a3a09082c7017e4887c1dde00b2c21aee68440d47d9151485347745db49cc05138ce3b6b7760d9700362212685a3644a170344dc4330b696 + checksum: 10/d933b42feb126bd094d4be4a4955326c4a9e727a5d0dbe3c824534a19d831996fcf16f67df3dd29550a7d2ac4ac568c80485bee380151ebb42c62848ab20dfa6 languageName: node linkType: hard "mdast-util-gfm-footnote@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-gfm-footnote@npm:2.0.0" + version: 2.1.0 + resolution: "mdast-util-gfm-footnote@npm:2.1.0" dependencies: "@types/mdast": "npm:^4.0.0" devlop: "npm:^1.1.0" mdast-util-from-markdown: "npm:^2.0.0" mdast-util-to-markdown: "npm:^2.0.0" micromark-util-normalize-identifier: "npm:^2.0.0" - checksum: 10/9a820ce66575f1dc5bcc1e3269f27777a96f462f84651e72a74319d313f8fe4043fe329169bcc80ec2f210dabb84c832c77fa386ab9b4d23c31379d9bf0f8ff6 + checksum: 10/5fac0f64d1233f7c533c2bb99a95c56f8f5dab553ae3a83f87c1fd6e4f28e0050e3240ae32ba77b4f5df0b84404932c66fd00c852a0925059bfa5d876f155854 languageName: node linkType: hard @@ -10874,8 +9225,8 @@ __metadata: linkType: hard "mdast-util-gfm@npm:^3.0.0": - version: 3.0.0 - resolution: "mdast-util-gfm@npm:3.0.0" + version: 3.1.0 + resolution: "mdast-util-gfm@npm:3.1.0" dependencies: mdast-util-from-markdown: "npm:^2.0.0" mdast-util-gfm-autolink-literal: "npm:^2.0.0" @@ -10884,13 +9235,13 @@ __metadata: mdast-util-gfm-table: "npm:^2.0.0" mdast-util-gfm-task-list-item: "npm:^2.0.0" mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10/3e0c8e9982d3df6e9235d862cb4a2a02cf54d11e9e65f9d139d217e9b7973bb49ef4b8ee49ec05d29bdd9fe3e5f7efe1c3ebdf40a950e9f553dfc25235ebbcc2 + checksum: 10/d66809a07000ee63661ae9044f550989d96101e3c11557a84e12038ed28490667244432dbb1f8b7d9ebb4936cc8770d3de118aff85b7474f33693b4c07a1ffda languageName: node linkType: hard "mdast-util-mdx-expression@npm:^2.0.0": - version: 2.0.0 - resolution: "mdast-util-mdx-expression@npm:2.0.0" + version: 2.0.1 + resolution: "mdast-util-mdx-expression@npm:2.0.1" dependencies: "@types/estree-jsx": "npm:^1.0.0" "@types/hast": "npm:^3.0.0" @@ -10898,13 +9249,13 @@ __metadata: devlop: "npm:^1.0.0" mdast-util-from-markdown: "npm:^2.0.0" mdast-util-to-markdown: "npm:^2.0.0" - checksum: 10/378f3cbc899e95a07f3889e413ed353597331790fdbd6b9efd24bee4fb1eae11e10d35785a86e3967f301ad445b218a4d4f9af4f1453cc58e7c6a6c02a178a8a + checksum: 10/70e860f8ee22c4f478449942750055d649d4380bf43b235d0710af510189d285fb057e401d20b59596d9789f4e270fce08ca892dc849676f9e3383b991d52485 languageName: node linkType: hard "mdast-util-mdx-jsx@npm:^3.0.0": - version: 3.1.2 - resolution: "mdast-util-mdx-jsx@npm:3.1.2" + version: 3.2.0 + resolution: "mdast-util-mdx-jsx@npm:3.2.0" dependencies: "@types/estree-jsx": "npm:^1.0.0" "@types/hast": "npm:^3.0.0" @@ -10916,10 +9267,9 @@ __metadata: mdast-util-to-markdown: "npm:^2.0.0" parse-entities: "npm:^4.0.0" stringify-entities: "npm:^4.0.0" - unist-util-remove-position: "npm:^5.0.0" unist-util-stringify-position: "npm:^4.0.0" vfile-message: "npm:^4.0.0" - checksum: 10/b0b457b0fd8b2c71ff4136eac04428e1cfb5ed65918948c899c5907ba41373fdf790f0c29f5aa0125e03bfde02444589a6c59006929a76a176648a053d79931b + checksum: 10/62cd650a522e5d72ea6afd6d4a557fc86525b802d097a29a2fbe17d22e7b97c502a580611873e4d685777fe77c6ff8d39fb6e37d026b3acbc86c3b24927f4ad9 languageName: node linkType: hard @@ -10961,8 +9311,8 @@ __metadata: linkType: hard "mdast-util-to-hast@npm:^13.0.0": - version: 13.2.0 - resolution: "mdast-util-to-hast@npm:13.2.0" + version: 13.2.1 + resolution: "mdast-util-to-hast@npm:13.2.1" dependencies: "@types/hast": "npm:^3.0.0" "@types/mdast": "npm:^4.0.0" @@ -10973,23 +9323,24 @@ __metadata: unist-util-position: "npm:^5.0.0" unist-util-visit: "npm:^5.0.0" vfile: "npm:^6.0.0" - checksum: 10/b17ee338f843af31a1c7a2ebf0df6f0b41c9380b7119a63ab521d271df665456578e1234bb7617883e8d860fe878038dcf2b76ab2f21e0f7451215a096d26cce + checksum: 10/8fddf5e66ea24dc85c8fe1cc2acd8fbe36e9d4f21b06322e156431fd71385eab9d2d767646f50276ca4ce3684cb967c4e226c60c3fff3428feb687ccb598fa39 languageName: node linkType: hard "mdast-util-to-markdown@npm:^2.0.0": - version: 2.1.0 - resolution: "mdast-util-to-markdown@npm:2.1.0" + version: 2.1.2 + resolution: "mdast-util-to-markdown@npm:2.1.2" dependencies: "@types/mdast": "npm:^4.0.0" "@types/unist": "npm:^3.0.0" longest-streak: "npm:^3.0.0" mdast-util-phrasing: "npm:^4.0.0" mdast-util-to-string: "npm:^4.0.0" + micromark-util-classify-character: "npm:^2.0.0" micromark-util-decode-string: "npm:^2.0.0" unist-util-visit: "npm:^5.0.0" zwitch: "npm:^2.0.0" - checksum: 10/1c66462feab6bf574566d8f20912ccb11d43f6658a93dee068610cd39a5d9377dfb34ea7109c9467d485466300a116e74236b174fcb9fc34f1d16fc3917e0d7c + checksum: 10/ab494a32f1ec90f0a502970b403b1847a10f3ba635adddb66ce70994cc47b4924c6c05078ddd29a8c2c5c9bc8c0bcc20e5fc1ef0fcb9b0cb9c0589a000817f1c languageName: node linkType: hard @@ -11016,31 +9367,6 @@ __metadata: languageName: node linkType: hard -"media-chrome@npm:~4.13.0": - version: 4.13.1 - resolution: "media-chrome@npm:4.13.1" - dependencies: - ce-la-react: "npm:^0.3.0" - checksum: 10/08afb5f96939dd2bba39bf8251355661611184442e99a0fd113daa2cfaf8858e72190c5aaef9792c056c4abe1b0aa4a2f26c1e64a5c82e9f4b3836bde0c1e1f6 - languageName: node - linkType: hard - -"media-chrome@npm:~4.14.0": - version: 4.14.0 - resolution: "media-chrome@npm:4.14.0" - dependencies: - ce-la-react: "npm:^0.3.0" - checksum: 10/7b3f7956929216ca26e88bcbd6b3d0a2c5bd6e269aa5d5a32309bbdf1c22cfdbdd6a04847986b9150bbef274ce95805ffbd4039a78b564a6b80e51e3b7a0596e - languageName: node - linkType: hard - -"media-tracks@npm:^0.3.3, media-tracks@npm:~0.3.3": - version: 0.3.3 - resolution: "media-tracks@npm:0.3.3" - checksum: 10/277f6098c58054dece1645558333010e97cc3e6c28a51825008179e843cc68bdd232b31361c8b343a2f9446f4bc28dc5ac2eab25376d978a9432dc72dab3091b - languageName: node - linkType: hard - "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -11049,16 +9375,26 @@ __metadata: linkType: hard "memfs@npm:^4.43.1": - version: 4.49.0 - resolution: "memfs@npm:4.49.0" - dependencies: + version: 4.56.10 + resolution: "memfs@npm:4.56.10" + dependencies: + "@jsonjoy.com/fs-core": "npm:4.56.10" + "@jsonjoy.com/fs-fsa": "npm:4.56.10" + "@jsonjoy.com/fs-node": "npm:4.56.10" + "@jsonjoy.com/fs-node-builtins": "npm:4.56.10" + "@jsonjoy.com/fs-node-to-fsa": "npm:4.56.10" + "@jsonjoy.com/fs-node-utils": "npm:4.56.10" + "@jsonjoy.com/fs-print": "npm:4.56.10" + "@jsonjoy.com/fs-snapshot": "npm:4.56.10" "@jsonjoy.com/json-pack": "npm:^1.11.0" "@jsonjoy.com/util": "npm:^1.9.0" glob-to-regex.js: "npm:^1.0.1" thingies: "npm:^2.5.0" tree-dump: "npm:^1.0.3" tslib: "npm:^2.0.0" - checksum: 10/2c5fe4065d4b0f07d6ef6d0088960a5a02ddc4e32949d45010773d80344b21a34db9fe90af2a03e746874d2ddb3c814e83b2138364c915a1fc07805d494760dd + peerDependencies: + tslib: 2 + checksum: 10/9358ab01174207aa3de7c47d7810dd32d0b6c0cdcbef455f3a51628c454e29feb4f1bfc15f25bfc59354ba6645fb3a10fcbb0dd1fbfc42e0595fae33fbc73bd1 languageName: node linkType: hard @@ -11084,30 +9420,30 @@ __metadata: linkType: hard "mermaid@npm:>=11.6.0": - version: 11.6.0 - resolution: "mermaid@npm:11.6.0" + version: 11.12.3 + resolution: "mermaid@npm:11.12.3" dependencies: - "@braintree/sanitize-url": "npm:^7.0.4" - "@iconify/utils": "npm:^2.1.33" - "@mermaid-js/parser": "npm:^0.4.0" + "@braintree/sanitize-url": "npm:^7.1.1" + "@iconify/utils": "npm:^3.0.1" + "@mermaid-js/parser": "npm:^1.0.0" "@types/d3": "npm:^7.4.3" cytoscape: "npm:^3.29.3" cytoscape-cose-bilkent: "npm:^4.1.0" cytoscape-fcose: "npm:^2.2.0" d3: "npm:^7.9.0" d3-sankey: "npm:^0.12.3" - dagre-d3-es: "npm:7.0.11" - dayjs: "npm:^1.11.13" - dompurify: "npm:^3.2.4" - katex: "npm:^0.16.9" + dagre-d3-es: "npm:7.0.13" + dayjs: "npm:^1.11.18" + dompurify: "npm:^3.2.5" + katex: "npm:^0.16.22" khroma: "npm:^2.1.0" - lodash-es: "npm:^4.17.21" - marked: "npm:^15.0.7" + lodash-es: "npm:^4.17.23" + marked: "npm:^16.2.1" roughjs: "npm:^4.6.6" stylis: "npm:^4.3.6" ts-dedent: "npm:^2.2.0" uuid: "npm:^11.1.0" - checksum: 10/b3b2c00a0cb35a31051e647b2b8446c7d4d6f82d9382d2a265d521643020c7b72998c1e566d821688eb760b9a4e893b8677fe90b8e351a0aaa47f350a4b0ae74 + checksum: 10/ae8dda2b1568f489d6bec8eaa670074f7c9b2105c06a40c3e893f237af3015478fa48ac7c5631f1530ae158b8c5e16dab2cc31f7ec7ac3594d46f6cf0b7290e0 languageName: node linkType: hard @@ -11119,8 +9455,8 @@ __metadata: linkType: hard "micromark-core-commonmark@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-core-commonmark@npm:2.0.1" + version: 2.0.3 + resolution: "micromark-core-commonmark@npm:2.0.3" dependencies: decode-named-character-reference: "npm:^1.0.0" devlop: "npm:^1.0.0" @@ -11138,13 +9474,13 @@ __metadata: micromark-util-subtokenize: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/15e788b3222401572ff8f549f8ecba21fa3395c000b8005e47204e8c97200e98bb0652c2c648e357b0996f1b50a7a63cc43e849f2976e4845b4453049040f8cc + checksum: 10/2b98b9eba1463850ebd8f338f966bd2113dafe764b490ebee3dccab3764d3c48b53fe67673297530e56bf54f58de27dfd1952ed79c5b4e32047cb7f29bd807f2 languageName: node linkType: hard "micromark-extension-directive@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-directive@npm:3.0.0" + version: 3.0.2 + resolution: "micromark-extension-directive@npm:3.0.2" dependencies: devlop: "npm:^1.0.0" micromark-factory-space: "npm:^2.0.0" @@ -11153,7 +9489,7 @@ __metadata: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" parse-entities: "npm:^4.0.0" - checksum: 10/6ed8eb21548d6b3d3efb3f871881559083b11163cab65311d91b3f0d139902d3d20c2b98e12654e8361ac31490d7e3c9eab8a7f8e61036887278ba5f430c8c04 + checksum: 10/63dbaa209722c1a77ffea6c6d5ea0f873f5e795ef08a2039f3d795320c889e5ce10fe1162500b0ff3063f8ceb1f7d727ec1d29d2df6271cbe90ec0646e061c8d languageName: node linkType: hard @@ -11212,15 +9548,15 @@ __metadata: linkType: hard "micromark-extension-gfm-table@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-extension-gfm-table@npm:2.1.0" + version: 2.1.1 + resolution: "micromark-extension-gfm-table@npm:2.1.1" dependencies: devlop: "npm:^1.0.0" micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/37385c3b6e4833f9d9a277f98062af40ccf8c70e83726ab0c1ef9d6cb5784dd18489d1df62b241e8289349be11f5ab0ab3337043fe004bc9150f1067f9476c9b + checksum: 10/0391ead408d79a183a9bba325b0e660b85aef2cd6e442a9214afc4e0bdc3105cd7dbf41fc75465acf152883a4050b6203107c2a80bcadb304235581a1340fd8c languageName: node linkType: hard @@ -11263,8 +9599,8 @@ __metadata: linkType: hard "micromark-extension-mdx-expression@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdx-expression@npm:3.0.0" + version: 3.0.1 + resolution: "micromark-extension-mdx-expression@npm:3.0.1" dependencies: "@types/estree": "npm:^1.0.0" devlop: "npm:^1.0.0" @@ -11274,25 +9610,25 @@ __metadata: micromark-util-events-to-acorn: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/a5592160319d4617362f6b72a6fc44b5570466afa07419d44bcfdd9398a77a5693d7c5f8da7b3ff4682edf6209d4781835f5d2e3166fdf6bba37db456fd2d091 + checksum: 10/a185e1787fe6d49d0e435690affd4b83ce319f88a08c57d2460d37d5c0a75ea64aa49a4a116b6d37f91389dc04351e1826aa834519a9f25fc31e1424962c6eb7 languageName: node linkType: hard "micromark-extension-mdx-jsx@npm:^3.0.0": - version: 3.0.0 - resolution: "micromark-extension-mdx-jsx@npm:3.0.0" + version: 3.0.2 + resolution: "micromark-extension-mdx-jsx@npm:3.0.2" dependencies: - "@types/acorn": "npm:^4.0.0" "@types/estree": "npm:^1.0.0" devlop: "npm:^1.0.0" estree-util-is-identifier-name: "npm:^3.0.0" micromark-factory-mdx-expression: "npm:^2.0.0" micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" + micromark-util-events-to-acorn: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" vfile-message: "npm:^4.0.0" - checksum: 10/65b3a55b4abc9207e12174caba44d05d2f15e7191161ed9536a1dd558eae9ab5a9d67689bff86869e481f33e181d69e792fc0a3c85ecaf9c11bca9111ebdffec + checksum: 10/a85cdb7c972fbb2cc8f0a64adc808b2b62bc2d79dbdd31fcd3208ff15aafa0198b002022840b2c65b5bff6f2a8c2c4a59a32a89f3482e6e183114b476e98e25c languageName: node linkType: hard @@ -11339,41 +9675,42 @@ __metadata: linkType: hard "micromark-factory-destination@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-destination@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-destination@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/d36e65ed1c072ff4148b016783148ba7c68a078991154625723e24bda3945160268fb91079fb28618e1613c2b6e70390a8ddc544c45410288aa27b413593071a + checksum: 10/9c4baa9ca2ed43c061bbf40ddd3d85154c2a0f1f485de9dea41d7dd2ad994ebb02034a003b2c1dbe228ba83a0576d591f0e90e0bf978713f84ee7d7f3aa98320 languageName: node linkType: hard "micromark-factory-label@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-label@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-label@npm:2.0.1" dependencies: devlop: "npm:^1.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/c021dbd0ed367610d35f2bae21209bc804d1a6d1286ffce458fd6a717f4d7fe581a7cba7d5c2d7a63757c44eb927c80d6a571d6ea7969fae1b48ab6461d109c4 + checksum: 10/bd03f5a75f27cdbf03b894ddc5c4480fc0763061fecf9eb927d6429233c930394f223969a99472df142d570c831236134de3dc23245d23d9f046f9d0b623b5c2 languageName: node linkType: hard "micromark-factory-mdx-expression@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-factory-mdx-expression@npm:2.0.1" + version: 2.0.3 + resolution: "micromark-factory-mdx-expression@npm:2.0.3" dependencies: "@types/estree": "npm:^1.0.0" devlop: "npm:^1.0.0" + micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-events-to-acorn: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" unist-util-position-from-estree: "npm:^2.0.0" vfile-message: "npm:^4.0.0" - checksum: 10/93cf94ccbe73c22d12dfe724fd43eeab326e29e2b776e3fcc13613ad06ad5ae7fe621955445c3254893008cd205d0df9505b778716c4a75fa5bcdcefaf192673 + checksum: 10/afadae88a18f31afa564747101e076011c56457454b30294ae55aeea7efee8626ddc3bad0f0f43649008f89b8784782b5adec143fdf477fb352354d76f08db55 languageName: node linkType: hard @@ -11388,36 +9725,36 @@ __metadata: linkType: hard "micromark-factory-space@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-space@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-space@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/4ffdcdc2f759887bbb356500cb460b3915ecddcb5d85c3618d7df68ad05d13ed02b1153ee1845677b7d8126df8f388288b84fcf0d943bd9c92bcc71cd7222e37 + checksum: 10/1bd68a017c1a66f4787506660c1e1c5019169aac3b1cb075d49ac5e360e0b2065e984d4e1d6e9e52a9d44000f2fa1c98e66a743d7aae78b4b05616bf3242ed71 languageName: node linkType: hard "micromark-factory-title@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-title@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-title@npm:2.0.1" dependencies: micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/39e1ac23af3554e6e652e56065579bc7faf21ade7b8704b29c175871b4152b7109b790bb3cae0f7e088381139c6bac9553b8400772c3d322e4fa635f813a3578 + checksum: 10/b4d2e4850a8ba0dff25ce54e55a3eb0d43dda88a16293f53953153288f9d84bcdfa8ca4606b2cfbb4f132ea79587bbb478a73092a349f893f5264fbcdbce2ee1 languageName: node linkType: hard "micromark-factory-whitespace@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-factory-whitespace@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-factory-whitespace@npm:2.0.1" dependencies: micromark-factory-space: "npm:^2.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/9587c2546d1a58b4d5472b42adf05463f6212d0449455285662d63cd8eaed89c6b159ac82713fcee5f9dd88628c24307d9533cccd8971a2f3f4d48702f8f850a + checksum: 10/67b3944d012a42fee9e10e99178254a04d48af762b54c10a50fcab988688799993efb038daf9f5dbc04001a97b9c1b673fc6f00e6a56997877ab25449f0c8650 languageName: node linkType: hard @@ -11432,78 +9769,77 @@ __metadata: linkType: hard "micromark-util-character@npm:^2.0.0": - version: 2.1.0 - resolution: "micromark-util-character@npm:2.1.0" + version: 2.1.1 + resolution: "micromark-util-character@npm:2.1.1" dependencies: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/089fe853c2bede2a48fd73d977910fa657c3cf6649eddcd300557a975c6c7f1c73030d01724a483ff1dc69a0d3ac28b43b2ba4210f5ea6414807cdcd0c2fa63c + checksum: 10/85da8f8e5f7ed16046575bef5b0964ca3fca3162b87b74ae279f1e48eb7160891313eb64f04606baed81c58b514dbdb64f1a9d110a51baaaa79225d72a7b1852 languageName: node linkType: hard "micromark-util-chunked@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-chunked@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-chunked@npm:2.0.1" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10/324f95cccdae061332a8241936eaba6ef0782a1e355bac5c607ad2564fd3744929be7dc81651315a2921535747a33243e6a5606bcb64b7a56d49b6d74ea1a3d4 + checksum: 10/f8cb2a67bcefe4bd2846d838c97b777101f0043b9f1de4f69baf3e26bb1f9885948444e3c3aec66db7595cad8173bd4567a000eb933576c233d54631f6323fe4 languageName: node linkType: hard "micromark-util-classify-character@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-classify-character@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-classify-character@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/086e52904deffebb793fb1c08c94aabb8901f76958142dfc3a6282890ebaa983b285e69bd602b9d507f1b758ed38e75a994d2ad9fbbefa7de2584f67a16af405 + checksum: 10/4d8bbe3a6dbf69ac0fc43516866b5bab019fe3f4568edc525d4feaaaf78423fa54e6b6732b5bccbeed924455279a3758ffc9556954aafb903982598a95a02704 languageName: node linkType: hard "micromark-util-combine-extensions@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-combine-extensions@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-combine-extensions@npm:2.0.1" dependencies: micromark-util-chunked: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/107c47700343f365b4ed81551e18bc3458b573c500e56ac052b2490bd548adc475216e41d2271633a8867fac66fc22ba3e0a2d74a31ed79b9870ca947eb4e3ba + checksum: 10/5d22fb9ee37e8143adfe128a72b50fa09568c2cc553b3c76160486c96dbbb298c5802a177a10a215144a604b381796071b5d35be1f2c2b2ee17995eda92f0c8e languageName: node linkType: hard "micromark-util-decode-numeric-character-reference@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.1" + version: 2.0.2 + resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10/9512507722efd2033a9f08715eeef787fbfe27e23edf55db21423d46d82ab46f76c89b4f960be3f5e50a2d388d89658afc0647989cf256d051e9ea01277a1adb + checksum: 10/ee11c8bde51e250e302050474c4a2adca094bca05c69f6cdd241af12df285c48c88d19ee6e022b9728281c280be16328904adca994605680c43af56019f4b0b6 languageName: node linkType: hard "micromark-util-decode-string@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-decode-string@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-decode-string@npm:2.0.1" dependencies: decode-named-character-reference: "npm:^1.0.0" micromark-util-character: "npm:^2.0.0" micromark-util-decode-numeric-character-reference: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" - checksum: 10/a75daf32a4a6b549e9f19b4d833ebfeb09a32a9a1f9ce50f35dec6b6a3e4f9f121f49024ba7f9c91c55ebe792f7c7a332fc9604795181b6a612637df0df5b959 + checksum: 10/2f517e4c613609445db4b9a17f8c77832f55fb341620a8fd598f083c1227027485d601c2021c2f8f9883210b8671e7b3990f0c6feeecd49a136475465808c380 languageName: node linkType: hard "micromark-util-encode@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-encode@npm:2.0.0" - checksum: 10/853a3f33fce72aaf4ffa60b7f2b6fcfca40b270b3466e1b96561b02185d2bd8c01dd7948bc31a24ac014f4cc854e545ca9a8e9cf7ea46262f9d24c9e88551c66 + version: 2.0.1 + resolution: "micromark-util-encode@npm:2.0.1" + checksum: 10/be890b98e78dd0cdd953a313f4148c4692cc2fb05533e56fef5f421287d3c08feee38ca679f318e740530791fc251bfe8c80efa926fcceb4419b269c9343d226 languageName: node linkType: hard "micromark-util-events-to-acorn@npm:^2.0.0": - version: 2.0.2 - resolution: "micromark-util-events-to-acorn@npm:2.0.2" + version: 2.0.3 + resolution: "micromark-util-events-to-acorn@npm:2.0.3" dependencies: - "@types/acorn": "npm:^4.0.0" "@types/estree": "npm:^1.0.0" "@types/unist": "npm:^3.0.0" devlop: "npm:^1.0.0" @@ -11511,55 +9847,55 @@ __metadata: micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" vfile-message: "npm:^4.0.0" - checksum: 10/475367e716c4d24f2a57464a7f2c8aa507ae36c05b7767fd652895525f3f0a1179ea3219cabccc0f3038bb5e4f9cce5390d530dc56decaa5f1786bda42739810 + checksum: 10/0d87e49b897636dc0e84b4bd06b6fa9e6abcd40ab90c9431e36737c85c444d3db1e4f9b8f51433422b1bedc46f086890ce96671b5a795230c6b7b09cb53d9aba languageName: node linkType: hard "micromark-util-html-tag-name@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-html-tag-name@npm:2.0.0" - checksum: 10/d786d4486f93eb0ac5b628779809ca97c5dc60f3c9fc03eb565809831db181cf8cb7f05f9ac76852f3eb35461af0f89fa407b46f3a03f4f97a96754d8dc540d8 + version: 2.0.1 + resolution: "micromark-util-html-tag-name@npm:2.0.1" + checksum: 10/dea365f5ad28ad74ff29fcb581f7b74fc1f80271c5141b3b2bc91c454cbb6dfca753f28ae03730d657874fcbd89d0494d0e3965dfdca06d9855f467c576afa9d languageName: node linkType: hard "micromark-util-normalize-identifier@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-normalize-identifier@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-normalize-identifier@npm:2.0.1" dependencies: micromark-util-symbol: "npm:^2.0.0" - checksum: 10/b36da2d3fd102053dadd953ce5c558328df12a63a8ac0e5aad13d4dda8e43b6a5d4a661baafe0a1cd8a260bead4b4a8e6e0e74193dd651e8484225bd4f4e68aa + checksum: 10/1eb9a289d7da067323df9fdc78bfa90ca3207ad8fd893ca02f3133e973adcb3743b233393d23d95c84ccaf5d220ae7f5a28402a644f135dcd4b8cfa60a7b5f84 languageName: node linkType: hard "micromark-util-resolve-all@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-resolve-all@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-resolve-all@npm:2.0.1" dependencies: micromark-util-types: "npm:^2.0.0" - checksum: 10/31fe703b85572cb3f598ebe32750e59516925c7ff1f66cfe6afaebe0771a395a9eaa770787f2523d3c46082ea80e6c14f83643303740b3d650af7c96ebd30ccc + checksum: 10/9275f3ddb6c26f254dd2158e66215d050454b279707a7d9ce5a3cd0eba23201021cedcb78ae1a746c1b23227dcc418ee40dd074ade195359506797a5493550cc languageName: node linkType: hard "micromark-util-sanitize-uri@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-sanitize-uri@npm:2.0.0" + version: 2.0.1 + resolution: "micromark-util-sanitize-uri@npm:2.0.1" dependencies: micromark-util-character: "npm:^2.0.0" micromark-util-encode: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" - checksum: 10/7d10622f5a2bb058dda6d2e95b2735c43fdf8daa4f88a0863bc90eef6598f8e10e3df98e034341fcbc090d8021c53501308c463c49d3fe91f41eb64b5bf2766e + checksum: 10/064c72abfc9777864ca0521a016dde62ab3e7af5215d10fd27e820798500d5d305da638459c589275c1a093cf588f493cc2f65273deac5a5331ecefc6c9ea78a languageName: node linkType: hard "micromark-util-subtokenize@npm:^2.0.0": - version: 2.0.1 - resolution: "micromark-util-subtokenize@npm:2.0.1" + version: 2.1.0 + resolution: "micromark-util-subtokenize@npm:2.1.0" dependencies: devlop: "npm:^1.0.0" micromark-util-chunked: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/8e1cae8859bcc3eed54c0dc896d9c2141c990299696455124205ce538e084caeaafcbe0d459a39b81cd45e761ff874d773dbf235ab6825914190701a15226789 + checksum: 10/5f18c70cb952a414a4d161f5d6a5254d33c7dfcd56577e592ef2e172a0414058d3531a3554f43538f14e243592fffbc2e68ddaf6a41c54577b3ba7beb555d3dc languageName: node linkType: hard @@ -11571,9 +9907,9 @@ __metadata: linkType: hard "micromark-util-symbol@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-symbol@npm:2.0.0" - checksum: 10/8c662644c326b384f02a5269974d843d400930cf6f5d6a8e6db1743fc8933f5ecc125b4203ad4ebca25447f5d23eb7e5bf1f75af34570c3fdd925cb618752fcd + version: 2.0.1 + resolution: "micromark-util-symbol@npm:2.0.1" + checksum: 10/497e6d95fc21c2bb5265b78a6a60db518c376dc438739b2e7d4aee6f9f165222711724b456c63163314f32b8eea68a064687711d41e986262926eab23ddb9229 languageName: node linkType: hard @@ -11585,15 +9921,15 @@ __metadata: linkType: hard "micromark-util-types@npm:^2.0.0": - version: 2.0.0 - resolution: "micromark-util-types@npm:2.0.0" - checksum: 10/b88e0eefd4b7c8d86b54dbf4ed0094ef56a3b0c7774d040bd5c8146b8e4e05b1026bbf1cd9308c8fcd05ecdc0784507680c8cee9888a4d3c550e6e574f7aef62 + version: 2.0.2 + resolution: "micromark-util-types@npm:2.0.2" + checksum: 10/a9eb067bd9384eab61942285d53738aa22f3fef4819eaf20249bec6ec13f1e4da2800230fd0ceb7e705108987aa9062fe3e9a8e5e48aa60180db80b9489dc3e2 languageName: node linkType: hard "micromark@npm:^4.0.0": - version: 4.0.0 - resolution: "micromark@npm:4.0.0" + version: 4.0.2 + resolution: "micromark@npm:4.0.2" dependencies: "@types/debug": "npm:^4.0.0" debug: "npm:^4.0.0" @@ -11612,11 +9948,11 @@ __metadata: micromark-util-subtokenize: "npm:^2.0.0" micromark-util-symbol: "npm:^2.0.0" micromark-util-types: "npm:^2.0.0" - checksum: 10/a697c1c0c169077f5d5def9af26985baea9d4375395dcb974a96f63761d382b455d4595a60e856c83e653b1272a732e85128d992511d6dc938d61a35bdf98c99 + checksum: 10/1b85e49c8f71013df2d07a59e477deb72cd325d41cc15f35b2aa52b8b7a93fed45498ce3e18ed34464a9afa9ba8a9210b2509454b2a2d16ac06c7429f562bfac languageName: node linkType: hard -"micromatch@npm:^4.0.2, micromatch@npm:^4.0.4, micromatch@npm:^4.0.5": +"micromatch@npm:^4.0.2, micromatch@npm:^4.0.5, micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -11626,14 +9962,14 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 10/54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 languageName: node linkType: hard -"mime-db@npm:^1.54.0": +"mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.54.0": version: 1.54.0 resolution: "mime-db@npm:1.54.0" checksum: 10/9e7834be3d66ae7f10eaa69215732c6d389692b194f876198dca79b2b90cbf96688d9d5d05ef7987b20f749b769b11c01766564264ea5f919c88b32a29011311 @@ -11656,7 +9992,7 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.27, mime-types@npm:~2.1.17, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-types@npm:^2.1.27, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34, mime-types@npm:~2.1.35": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -11666,11 +10002,11 @@ __metadata: linkType: hard "mime-types@npm:^3.0.1": - version: 3.0.1 - resolution: "mime-types@npm:3.0.1" + version: 3.0.2 + resolution: "mime-types@npm:3.0.2" dependencies: mime-db: "npm:^1.54.0" - checksum: 10/fa1d3a928363723a8046c346d87bf85d35014dae4285ad70a3ff92bd35957992b3094f8417973cfe677330916c6ef30885109624f1fb3b1e61a78af509dba120 + checksum: 10/9db0ad31f5eff10ee8f848130779b7f2d056ddfdb6bda696cb69be68d486d33a3457b4f3f9bdeb60d0736edb471bd5a7c0a384375c011c51c889fd0d5c3b893e languageName: node linkType: hard @@ -11705,14 +10041,14 @@ __metadata: linkType: hard "mini-css-extract-plugin@npm:^2.9.2": - version: 2.9.2 - resolution: "mini-css-extract-plugin@npm:2.9.2" + version: 2.10.0 + resolution: "mini-css-extract-plugin@npm:2.10.0" dependencies: schema-utils: "npm:^4.0.0" tapable: "npm:^2.2.1" peerDependencies: webpack: ^5.0.0 - checksum: 10/db6ddb8ba56affa1a295b57857d66bad435d36e48e1f95c75d16fadd6c70e3ba33e8c4141c3fb0e22b4d875315b41c4f58550c6ac73b50bdbe429f768297e3ff + checksum: 10/bae5350ab82171c6c9a22a4397df14aa69280f5ff0e1ff4d2429ea841bc096927b1e27ba7b75a9c3dd77bd44bab449d6197bd748381f1326cbc8befcb10d1a9e languageName: node linkType: hard @@ -11732,12 +10068,12 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" +"minimatch@npm:^10.2.2": + version: 10.2.2 + resolution: "minimatch@npm:10.2.2" dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 + brace-expansion: "npm:^5.0.2" + checksum: 10/e135be7b502ac97c02bcee42ccc1c55dc26dbac036c0f4acde69e42fe339d7fb53fae711e57b3546cb533426382ea492c73a073c7f78832e0453d120d48dd015 languageName: node linkType: hard @@ -11757,18 +10093,18 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" +"minipass-fetch@npm:^5.0.0": + version: 5.0.1 + resolution: "minipass-fetch@npm:5.0.1" dependencies: encoding: "npm:^0.1.13" minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" + minipass-sized: "npm:^2.0.0" + minizlib: "npm:^3.0.1" dependenciesMeta: encoding: optional: true - checksum: 10/c669948bec1373313aaa8f104b962a3ced9f45c49b26366a4b0ae27ccdfa9c5740d72c8a84d3f8623d7a61c5fc7afdfda44789008c078f61a62441142efc4a97 + checksum: 10/08bf0c9866e7f344bf1863ce0d99c0a6fe96b43ef5a4119e23d84a21e613a3f55ecf302adf28d9e228b4ebd50e81d5e84c397e0535089090427319379f478d94 languageName: node linkType: hard @@ -11790,12 +10126,12 @@ __metadata: languageName: node linkType: hard -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" +"minipass-sized@npm:^2.0.0": + version: 2.0.0 + resolution: "minipass-sized@npm:2.0.0" dependencies: - minipass: "npm:^3.0.0" - checksum: 10/40982d8d836a52b0f37049a0a7e5d0f089637298e6d9b45df9c115d4f0520682a78258905e5c8b180fb41b593b0a82cc1361d2c74b45f7ada66334f84d1ecfdd + minipass: "npm:^7.1.2" + checksum: 10/3b89adf64ca705662f77481e278eff5ec0a57aeffb5feba7cc8843722b1e7770efc880f2a17d1d4877b2d7bf227873cd46afb4da44c0fd18088b601ea50f96bb languageName: node linkType: hard @@ -11808,55 +10144,48 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 10/61682162d29f45d3152b78b08bab7fb32ca10899bc5991ffe98afc18c9e9543bd1e3be94f8b8373ba6262497db63607079dc242ea62e43e7b2270837b7347c93 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10/c25f0ee8196d8e6036661104bacd743785b2599a21de5c516b32b3fa2b83113ac89a2358465bc04956baab37ffb956ae43be679b2262bf7be15fce467ccd7950 +"minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2, minipass@npm:^7.1.3": + version: 7.1.3 + resolution: "minipass@npm:7.1.3" + checksum: 10/175e4d5e20980c3cd316ae82d2c031c42f6c746467d8b1905b51060a0ba4461441a0c25bb67c025fd9617f9a3873e152c7b543c6b5ac83a1846be8ade80dffd6 languageName: node linkType: hard -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" +"minizlib@npm:^3.0.1, minizlib@npm:^3.1.0": + version: 3.1.0 + resolution: "minizlib@npm:3.1.0" dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: 10/ae0f45436fb51344dcb87938446a32fbebb540d0e191d63b35e1c773d47512e17307bf54aa88326cc6d176594d00e4423563a091f7266c2f9a6872cdc1e234d1 + minipass: "npm:^7.1.2" + checksum: 10/f47365cc2cb7f078cbe7e046eb52655e2e7e97f8c0a9a674f4da60d94fb0624edfcec9b5db32e8ba5a99a5f036f595680ae6fe02a262beaa73026e505cc52f99 languageName: node linkType: hard -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: 10/d71b8dcd4b5af2fe13ecf3bd24070263489404fe216488c5ba7e38ece1f54daf219e72a833a3a2dc404331e870e9f44963a33399589490956bff003a3404d3b2 +"mlly@npm:^1.7.4, mlly@npm:^1.8.0": + version: 1.8.0 + resolution: "mlly@npm:1.8.0" + dependencies: + acorn: "npm:^8.15.0" + pathe: "npm:^2.0.3" + pkg-types: "npm:^1.3.1" + ufo: "npm:^1.6.1" + checksum: 10/4db690a421076d5fe88331679f702b77a4bfc9fe3f324bc6150270fb0b69ecd4b5e43570b8e4573dde341515b3eac4daa720a6ac9f2715c210b670852641ab1c languageName: node linkType: hard -"mlly@npm:^1.7.3, mlly@npm:^1.7.4": - version: 1.7.4 - resolution: "mlly@npm:1.7.4" +"monaco-editor@npm:^0.55.1": + version: 0.55.1 + resolution: "monaco-editor@npm:0.55.1" dependencies: - acorn: "npm:^8.14.0" - pathe: "npm:^2.0.1" - pkg-types: "npm:^1.3.0" - ufo: "npm:^1.5.4" - checksum: 10/1b36163d38c2331f8ae480e6a11da3d15927a2148d729fcd9df6d0059ca74869aa693931bd1f762f82eb534b84c921bdfbc036eb0e4da4faeb55f1349d254f35 + dompurify: "npm:3.2.7" + marked: "npm:14.0.0" + checksum: 10/73836b612a923342001b8cbb459aad0de486c94672fb7cf9d28bdafed9f3b7523d5aba510d9f8e7d24476a5aacf0d3a5c0cdc520ed4764f6f89f8cf5ba8d9329 languageName: node linkType: hard "mrmime@npm:^2.0.0": - version: 2.0.0 - resolution: "mrmime@npm:2.0.0" - checksum: 10/8d95f714ea200c6cf3e3777cbc6168be04b05ac510090a9b41eef5ec081efeb1d1de3e535ffb9c9689fffcc42f59864fd52a500e84a677274f070adeea615c45 + version: 2.0.1 + resolution: "mrmime@npm:2.0.1" + checksum: 10/1f966e2c05b7264209c4149ae50e8e830908eb64dd903535196f6ad72681fa109b794007288a3c2814f7a1ecf9ca192769909c0c374d974d604a8de5fc095d4a languageName: node linkType: hard @@ -11867,13 +10196,6 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10/673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - "ms@npm:2.1.3, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" @@ -11893,21 +10215,7 @@ __metadata: languageName: node linkType: hard -"mux-embed@npm:5.9.0": - version: 5.9.0 - resolution: "mux-embed@npm:5.9.0" - checksum: 10/233cd35e58c046544ed472f11d52680c893ef2057f5141aef40db6d8b39cbe33d59ddd5a1df106bec3282a7e5ad7bbcdf51a27d9919aca2545cbccd116d212a3 - languageName: node - linkType: hard - -"mux-embed@npm:^5.8.3": - version: 5.11.0 - resolution: "mux-embed@npm:5.11.0" - checksum: 10/0336958615a77a5c288b7d6cd375db19bf28b255fffd2628979e47513def5457a22557018c054141ff26bd1e9077f5d17d55ff239b65d983bfdba10fa70d15dc - languageName: node - linkType: hard - -"nanoid@npm:^3.3.11, nanoid@npm:^3.3.7": +"nanoid@npm:^3.3.11": version: 3.3.11 resolution: "nanoid@npm:3.3.11" bin: @@ -11916,20 +10224,27 @@ __metadata: languageName: node linkType: hard -"native-promise-only@npm:0.8.1": - version: 0.8.1 - resolution: "native-promise-only@npm:0.8.1" - checksum: 10/fbc99d8dc2863658260a519557b0634c45583d9412de85fd706fa4fa9b11bfe4660bdac53f29171c4b2ad01a4b201c658a56f82431d19a5c155cc092c5127170 - languageName: node - linkType: hard - -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 10/2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10/b5734e87295324fabf868e36fb97c84b7d7f3156ec5f4ee5bf6e488079c11054f818290fc33804cef7b1ee21f55eeb14caea83e7dafae6492a409b3e573153e5 + languageName: node + linkType: hard + +"negotiator@npm:~0.6.4": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 10/d98c04a136583afd055746168f1067d58ce4bfe6e4c73ca1d339567f81ea1f7e665b5bd1e81f4771c67b6c2ea89b21cb2adaea2b16058c7dc31317778f931dab + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -11948,66 +10263,52 @@ __metadata: linkType: hard "node-emoji@npm:^2.1.0": - version: 2.1.3 - resolution: "node-emoji@npm:2.1.3" + version: 2.2.0 + resolution: "node-emoji@npm:2.2.0" dependencies: "@sindresorhus/is": "npm:^4.6.0" char-regex: "npm:^1.0.2" emojilib: "npm:^2.4.0" skin-tone: "npm:^2.0.0" - checksum: 10/e9cff16f557972bc45040c26cb686961935c582af612bd41446f0094834088c1cdf7d4370a39ce5d42b71c1352a35b8d8a7a2fec53922b51abf54f36e56cc614 - languageName: node - linkType: hard - -"node-forge@npm:^1": - version: 1.3.1 - resolution: "node-forge@npm:1.3.1" - checksum: 10/05bab6868633bf9ad4c3b1dd50ec501c22ffd69f556cdf169a00998ca1d03e8107a6032ba013852f202035372021b845603aeccd7dfcb58cdb7430013b3daa8d + checksum: 10/2548668f5cc9f781c94dc39971a630b2887111e0970c29fc523e924819d1b39b53a2694a4d1046861adf538c4462d06ee0269c48717ccad30336a918d9a911d5 languageName: node linkType: hard "node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" + version: 12.2.0 + resolution: "node-gyp@npm:12.2.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^4.1.0" + make-fetch-happen: "npm:^15.0.0" + nopt: "npm:^9.0.0" + proc-log: "npm:^6.0.0" semver: "npm:^7.3.5" - tar: "npm:^6.2.1" - which: "npm:^4.0.0" + tar: "npm:^7.5.4" + tinyglobby: "npm:^0.2.12" + which: "npm:^6.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10/41773093b1275751dec942b985982fd4e7a69b88cae719b868babcef3880ee6168aaec8dcaa8cd0b9fa7c84873e36cc549c6cac6a124ee65ba4ce1f1cc108cfe - languageName: node - linkType: hard - -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10/0f7607ec7db5ef1dc616899a5f24ae90c869b6a54c2d4f36ff6d84a282ab9343c7ff3ca3670fe4669171bb1e8a9b3e286e1ef1c131f09a83d70554f855d54f24 + checksum: 10/4ebab5b77585a637315e969c2274b5520562473fe75de850639a580c2599652fb9f33959ec782ea45a2e149d8f04b548030f472eeeb3dbdf19a7f2ccbc30b908 languageName: node linkType: hard -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 10/c2b33b4f0c40445aee56141f13ca692fa6805db88510e5bbb3baadb2da13e1293b738e638e15e4a8eb668bb9e97debb08e7a35409b477b5cc18f171d35a83045 +"node-releases@npm:^2.0.27": + version: 2.0.27 + resolution: "node-releases@npm:2.0.27" + checksum: 10/f6c78ddb392ae500719644afcbe68a9ea533242c02312eb6a34e8478506eb7482a3fb709c70235b01c32fe65625b68dfa9665113f816d87f163bc3819b62b106 languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" +"nopt@npm:^9.0.0": + version: 9.0.0 + resolution: "nopt@npm:9.0.0" dependencies: - abbrev: "npm:^2.0.0" + abbrev: "npm:^4.0.0" bin: nopt: bin/nopt.js - checksum: 10/95a1f6dec8a81cd18cdc2fed93e6f0b4e02cf6bdb4501c848752c6e34f9883d9942f036a5e3b21a699047d8a448562d891e67492df68ec9c373e6198133337ae + checksum: 10/56a1ccd2ad711fb5115918e2c96828703cddbe12ba2c3bd00591758f6fa30e6f47dd905c59dbfcf9b773f3a293b45996609fb6789ae29d6bfcc3cf3a6f7d9fda languageName: node linkType: hard @@ -12018,17 +10319,10 @@ __metadata: languageName: node linkType: hard -"normalize-range@npm:^0.1.2": - version: 0.1.2 - resolution: "normalize-range@npm:0.1.2" - checksum: 10/9b2f14f093593f367a7a0834267c24f3cb3e887a2d9809c77d8a7e5fd08738bcd15af46f0ab01cc3a3d660386f015816b5c922cea8bf2ee79777f40874063184 - languageName: node - linkType: hard - "normalize-url@npm:^8.0.0": - version: 8.0.1 - resolution: "normalize-url@npm:8.0.1" - checksum: 10/ae392037584fc5935b663ae4af475351930a1fc39e107956cfac44f42d5127eec2d77d9b7b12ded4696ca78103bafac5b6206a0ea8673c7bffecbe13544fcc5a + version: 8.1.1 + resolution: "normalize-url@npm:8.1.1" + checksum: 10/a96519b53692f33d5de19a8aa04fe9de4b8de1c126da89f1c47a24e48d457008867193cd9c19218810426ffabe190034249e1b82f0751c8992f2a9f716304ce0 languageName: node linkType: hard @@ -12076,10 +10370,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 10/7ef65583b6397570a17c56f0c1841e0920e83900f2c94638927abb7b81ac08a19c7aae135bd9dcca96208cac0c7332b4650fb927f027b0cf92d71df2990d0561 +"object-inspect@npm:^1.13.3": + version: 1.13.4 + resolution: "object-inspect@npm:1.13.4" + checksum: 10/aa13b1190ad3e366f6c83ad8a16ed37a19ed57d267385aa4bfdccda833d7b90465c057ff6c55d035a6b2e52c1a2295582b294217a0a3a1ae7abdd6877ef781fb languageName: node linkType: hard @@ -12091,14 +10385,16 @@ __metadata: linkType: hard "object.assign@npm:^4.1.0": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" + version: 4.1.7 + resolution: "object.assign@npm:4.1.7" dependencies: - call-bind: "npm:^1.0.5" + call-bind: "npm:^1.0.8" + call-bound: "npm:^1.0.3" define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" + es-object-atoms: "npm:^1.0.0" + has-symbols: "npm:^1.1.0" object-keys: "npm:^1.1.1" - checksum: 10/dbb22da4cda82e1658349ea62b80815f587b47131b3dd7a4ab7f84190ab31d206bbd8fe7e26ae3220c55b65725ac4529825f6142154211220302aa6b1518045d + checksum: 10/3fe28cdd779f2a728a9a66bd688679ba231a2b16646cd1e46b528fe7c947494387dda4bc189eff3417f3717ef4f0a8f2439347cf9a9aa3cef722fbfd9f615587 languageName: node linkType: hard @@ -12109,7 +10405,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1, on-finished@npm:^2.4.1": +"on-finished@npm:^2.4.1, on-finished@npm:~2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -12118,10 +10414,10 @@ __metadata: languageName: node linkType: hard -"on-headers@npm:~1.0.2": - version: 1.0.2 - resolution: "on-headers@npm:1.0.2" - checksum: 10/870766c16345855e2012e9422ba1ab110c7e44ad5891a67790f84610bd70a72b67fdd71baf497295f1d1bf38dd4c92248f825d48729c53c0eae5262fb69fa171 +"on-headers@npm:~1.1.0": + version: 1.1.0 + resolution: "on-headers@npm:1.1.0" + checksum: 10/98aa64629f986fb8cc4517dd8bede73c980e31208cba97f4442c330959f60ced3dc6214b83420491f5111fc7c4f4343abe2ea62c85f505cf041d67850f238776 languageName: node linkType: hard @@ -12207,6 +10503,13 @@ __metadata: languageName: node linkType: hard +"p-map@npm:^7.0.2": + version: 7.0.4 + resolution: "p-map@npm:7.0.4" + checksum: 10/ef48c3b2e488f31c693c9fcc0df0ef76518cf6426a495cf9486ebbb0fd7f31aef7f90e96f72e0070c0ff6e3177c9318f644b512e2c29e3feee8d7153fcb6782e + languageName: node + linkType: hard + "p-queue@npm:^6.6.2": version: 6.6.2 resolution: "p-queue@npm:6.6.2" @@ -12237,13 +10540,6 @@ __metadata: languageName: node linkType: hard -"package-json-from-dist@npm:^1.0.0": - version: 1.0.0 - resolution: "package-json-from-dist@npm:1.0.0" - checksum: 10/ac706ec856a5a03f5261e4e48fa974f24feb044d51f84f8332e2af0af04fbdbdd5bbbfb9cbbe354190409bc8307c83a9e38c6672c3c8855f709afb0006a009ea - languageName: node - linkType: hard - "package-json@npm:^8.1.0": version: 8.1.1 resolution: "package-json@npm:8.1.1" @@ -12256,10 +10552,10 @@ __metadata: languageName: node linkType: hard -"package-manager-detector@npm:^0.2.8": - version: 0.2.9 - resolution: "package-manager-detector@npm:0.2.9" - checksum: 10/08f73184bef7740a0a826704bdd7647bf2b30682b142fc1346942fe48360ddb781494c369b339e1a89d78f9247f5c95c814862bcc038e11189be0ca96078aeb5 +"package-manager-detector@npm:^1.3.0": + version: 1.6.0 + resolution: "package-manager-detector@npm:1.6.0" + checksum: 10/b38a9532198cefdb98a1b7131c42cbffa55d8b997d6117811cf83f00079fd57a572db2aa5e3db5e36bcd0af84d0bec5a7d6251142427314390ed99a3d76cd0a0 languageName: node linkType: hard @@ -12283,18 +10579,17 @@ __metadata: linkType: hard "parse-entities@npm:^4.0.0": - version: 4.0.1 - resolution: "parse-entities@npm:4.0.1" + version: 4.0.2 + resolution: "parse-entities@npm:4.0.2" dependencies: "@types/unist": "npm:^2.0.0" - character-entities: "npm:^2.0.0" character-entities-legacy: "npm:^3.0.0" character-reference-invalid: "npm:^2.0.0" decode-named-character-reference: "npm:^1.0.0" is-alphanumerical: "npm:^2.0.0" is-decimal: "npm:^2.0.0" is-hexadecimal: "npm:^2.0.0" - checksum: 10/71314312d2482422fcf0b6675e020643bab424b11f64c654b7843652cae03842a7802eda1fed194ec435debb5db47a33513eb6b1176888e9e998a0368f01f5c8 + checksum: 10/b0ce693d0b3d7ed1cea6fe814e6e077c71532695f01178e846269e9a2bc2f7ff34ca4bb8db80b48af0451100f25bb010df6591c9bb6306e4680ccb423d1e4038 languageName: node linkType: hard @@ -12318,25 +10613,25 @@ __metadata: linkType: hard "parse5-htmlparser2-tree-adapter@npm:^7.0.0": - version: 7.0.0 - resolution: "parse5-htmlparser2-tree-adapter@npm:7.0.0" + version: 7.1.0 + resolution: "parse5-htmlparser2-tree-adapter@npm:7.1.0" dependencies: - domhandler: "npm:^5.0.2" + domhandler: "npm:^5.0.3" parse5: "npm:^7.0.0" - checksum: 10/23dbe45fdd338fe726cf5c55b236e1f403aeb0c1b926e18ab8ef0aa580980a25f8492d160fe2ed0ec906c3c8e38b51e68ef5620a3b9460d9458ea78946a3f7c0 + checksum: 10/75910af9137451e9c53e1e0d712f7393f484e89e592b1809ee62ad6cedd61b98daeaa5206ff5d9f06778002c91fac311afedde4880e1916fdb44fa71199dae73 languageName: node linkType: hard "parse5@npm:^7.0.0": - version: 7.1.2 - resolution: "parse5@npm:7.1.2" + version: 7.3.0 + resolution: "parse5@npm:7.3.0" dependencies: - entities: "npm:^4.4.0" - checksum: 10/3c86806bb0fb1e9a999ff3a4c883b1ca243d99f45a619a0898dbf021a95a0189ed955c31b07fe49d342b54e814f33f2c9d7489198e8630dacd5477d413ec5782 + entities: "npm:^6.0.0" + checksum: 10/b0e48be20b820c655b138b86fa6fb3a790de6c891aa2aba536524f8027b4dca4fe538f11a0e5cf2f6f847d120dbb9e4822dcaeb933ff1e10850a2ef0154d1d88 languageName: node linkType: hard -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": +"parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 10/407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -12353,13 +10648,6 @@ __metadata: languageName: node linkType: hard -"path-browserify@npm:^1.0.1": - version: 1.0.1 - resolution: "path-browserify@npm:1.0.1" - checksum: 10/7e7368a5207e7c6b9051ef045711d0dc3c2b6203e96057e408e6e74d09f383061010d2be95cb8593fe6258a767c3e9fc6b2bfc7ce8d48ae8c3d9f6994cca9ad8 - languageName: node - linkType: hard - "path-data-parser@npm:0.1.0, path-data-parser@npm:^0.1.0": version: 0.1.0 resolution: "path-data-parser@npm:0.1.0" @@ -12395,20 +10683,13 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" +"path-scurry@npm:^2.0.2": + version: 2.0.2 + resolution: "path-scurry@npm:2.0.2" dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10/5e8845c159261adda6f09814d7725683257fcc85a18f329880ab4d7cc1d12830967eae5d5894e453f341710d5484b8fdbbd4d75181b4d6e1eb2f4dc7aeadc434 - languageName: node - linkType: hard - -"path-to-regexp@npm:0.1.12": - version: 0.1.12 - resolution: "path-to-regexp@npm:0.1.12" - checksum: 10/2e30f6a0144679c1f95c98e166b96e6acd1e72be9417830fefc8de7ac1992147eb9a4c7acaa59119fb1b3c34eec393b2129ef27e24b2054a3906fc4fb0d1398e + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10/2b4257422bcb870a4c2d205b3acdbb213a72f5e2250f61c80f79c9d014d010f82bdf8584441612c8e1fa4eb098678f5704a66fa8377d72646bad4be38e57a2c3 languageName: node linkType: hard @@ -12420,11 +10701,18 @@ __metadata: linkType: hard "path-to-regexp@npm:^1.7.0": - version: 1.8.0 - resolution: "path-to-regexp@npm:1.8.0" + version: 1.9.0 + resolution: "path-to-regexp@npm:1.9.0" dependencies: isarray: "npm:0.0.1" - checksum: 10/45a01690f72919163cf89714e31a285937b14ad54c53734c826363fcf7beba9d9d0f2de802b4986b1264374562d6a3398a2e5289753a764e3a256494f1e52add + checksum: 10/67f0f4823f7aab356523d93a83f9f8222bdd119fa0b27a8f8b587e8e6c9825294bb4ccd16ae619def111ff3fe5d15ff8f658cdd3b0d58b9c882de6fd15bc1b76 + languageName: node + linkType: hard + +"path-to-regexp@npm:~0.1.12": + version: 0.1.12 + resolution: "path-to-regexp@npm:0.1.12" + checksum: 10/2e30f6a0144679c1f95c98e166b96e6acd1e72be9417830fefc8de7ac1992147eb9a4c7acaa59119fb1b3c34eec393b2129ef27e24b2054a3906fc4fb0d1398e languageName: node linkType: hard @@ -12435,32 +10723,14 @@ __metadata: languageName: node linkType: hard -"pathe@npm:^2.0.1": +"pathe@npm:^2.0.1, pathe@npm:^2.0.3": version: 2.0.3 resolution: "pathe@npm:2.0.3" checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d languageName: node linkType: hard -"periscopic@npm:^3.0.0": - version: 3.1.0 - resolution: "periscopic@npm:3.1.0" - dependencies: - "@types/estree": "npm:^1.0.0" - estree-walker: "npm:^3.0.0" - is-reference: "npm:^3.0.0" - checksum: 10/088a85a6de42e2f34414392dec8348218508609389ecb8002b009c357fa26bdfb67c385d9ec0e4e1089e27748ddc0789254073ef78fd576a32b5e641474c56ba - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": - version: 1.0.1 - resolution: "picocolors@npm:1.0.1" - checksum: 10/fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 - languageName: node - linkType: hard - -"picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -12474,6 +10744,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 10/57b99055f40b16798f2802916d9c17e9744e620a0db136554af01d19598b96e45e2f00014c91d1b8b13874b80caa8c295b3d589a3f72373ec4aaf54baa5962d5 + languageName: node + linkType: hard + "pkg-dir@npm:^7.0.0": version: 7.0.0 resolution: "pkg-dir@npm:7.0.0" @@ -12483,7 +10760,7 @@ __metadata: languageName: node linkType: hard -"pkg-types@npm:^1.3.0": +"pkg-types@npm:^1.3.1": version: 1.3.1 resolution: "pkg-types@npm:1.3.1" dependencies: @@ -12494,12 +10771,17 @@ __metadata: languageName: node linkType: hard -"player.style@npm:^0.2.0": - version: 0.2.0 - resolution: "player.style@npm:0.2.0" +"pkijs@npm:^3.3.3": + version: 3.3.3 + resolution: "pkijs@npm:3.3.3" dependencies: - media-chrome: "npm:~4.13.0" - checksum: 10/5b3c47797e258980de2fad63654b7f8f1354490972dbdbfecd708bfa88de2d5ec341d254392ebc18f6af7f4f8cc2f8a37ee1a017304764c3361128a409c38ac9 + "@noble/hashes": "npm:1.4.0" + asn1js: "npm:^3.0.6" + bytestreamjs: "npm:^2.0.1" + pvtsutils: "npm:^1.3.6" + pvutils: "npm:^1.1.3" + tslib: "npm:^2.8.1" + checksum: 10/51ef42d8332fcb9e81f5cca9355b1a2aeacdbd77483cacc2a1c589036887a5a1dc6e7a68abd7cca2f0d605f68e038cc877e1fae4c38b3d358fa84a327dccaadd languageName: node linkType: hard @@ -12554,18 +10836,18 @@ __metadata: languageName: node linkType: hard -"postcss-color-functional-notation@npm:^7.0.10": - version: 7.0.10 - resolution: "postcss-color-functional-notation@npm:7.0.10" +"postcss-color-functional-notation@npm:^7.0.12": + version: 7.0.12 + resolution: "postcss-color-functional-notation@npm:7.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/af873fbd4899bd863aeed7b40753ab3e6028bf7b8eef53b54de1cbd1b83d92b1007a9a90db314781c2bc0ec204537ca423d17cdc37aee46ed1308d7406b81729 + checksum: 10/c3f59571330defde7c95256dbc2756ffd298072a6b167eb6751efb2f97ac267c081d7313556e3a4615cff8a46202f3c149bb2a456326805ca0cba5173faf5aad languageName: node linkType: hard @@ -12720,16 +11002,16 @@ __metadata: languageName: node linkType: hard -"postcss-double-position-gradients@npm:^6.0.2": - version: 6.0.2 - resolution: "postcss-double-position-gradients@npm:6.0.2" +"postcss-double-position-gradients@npm:^6.0.4": + version: 6.0.4 + resolution: "postcss-double-position-gradients@npm:6.0.4" dependencies: - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10/cc0302e2850334566ca7b85bddfbf6f5e839132d542d41eb8c380194048e35656aa4b7b9ea9e557747e4924a90fbd590d5abaea799e5c7493b0f239eb3d27721 + checksum: 10/2840202fd819b48f713c63e1bca5e3f6b88ac5374cf2e4ebf6fabad6d5493685f9a3cde6f890ca73f978a7f5cde5ba4b6ec02659715a0b035e9be1063b74fb1f languageName: node linkType: hard @@ -12785,18 +11067,18 @@ __metadata: languageName: node linkType: hard -"postcss-lab-function@npm:^7.0.10": - version: 7.0.10 - resolution: "postcss-lab-function@npm:7.0.10" +"postcss-lab-function@npm:^7.0.12": + version: 7.0.12 + resolution: "postcss-lab-function@npm:7.0.12" dependencies: - "@csstools/css-color-parser": "npm:^3.0.10" + "@csstools/css-color-parser": "npm:^3.1.0" "@csstools/css-parser-algorithms": "npm:^3.0.5" "@csstools/css-tokenizer": "npm:^3.0.4" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10/5d6622bb82882e16d5718d59aa0bf243537ac77239fc3727124e8b58f6bf5f768b3e1cdce886ddea1a3dc33a574dcc342d8be4ee6d2be41fb883b937f273aec1 + checksum: 10/f767b41552cff819587a316693863393b81dd6f03f4e9f484adf166834c3032541ce128688faa4c2cf3f2f1d20adb0f3b9d76b5acc3251671f646880fcdd9900 languageName: node linkType: hard @@ -12921,26 +11203,26 @@ __metadata: linkType: hard "postcss-modules-local-by-default@npm:^4.0.5": - version: 4.0.5 - resolution: "postcss-modules-local-by-default@npm:4.0.5" + version: 4.2.0 + resolution: "postcss-modules-local-by-default@npm:4.2.0" dependencies: icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" + postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.1.0" peerDependencies: postcss: ^8.1.0 - checksum: 10/b08b01aa7f3d1a80bb1a5508ba3a208578fdd2fb6e54e5613fac244a4e014aa7ca639a614859fec93b399e5a6f86938f7690ca60f7e57c4e35b75621d3c07734 + checksum: 10/552329aa39fbf229b8ac5a04f8aed0b1553e7a3c10b165ee700d1deb020c071875b3df7ab5e3591f6af33d461df66d330ec9c1256229e45fc618a47c60f41536 languageName: node linkType: hard "postcss-modules-scope@npm:^3.2.0": - version: 3.2.0 - resolution: "postcss-modules-scope@npm:3.2.0" + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" dependencies: - postcss-selector-parser: "npm:^6.0.4" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.1.0 - checksum: 10/17c293ad13355ba456498aa5815ddb7a4a736f7b781d89b294e1602a53b8d0e336131175f82460e290a0d672642f9039540042edc361d9000b682c44e766925b + checksum: 10/51c747fa15cedf1b2856da472985ea7a7bb510a63daf30f95f250f34fce9e28ef69b802e6cc03f9c01f69043d171bc33279109a9235847c2d3a75c44eac67334 languageName: node linkType: hard @@ -13119,23 +11401,26 @@ __metadata: linkType: hard "postcss-preset-env@npm:^10.2.1": - version: 10.2.3 - resolution: "postcss-preset-env@npm:10.2.3" - dependencies: - "@csstools/postcss-cascade-layers": "npm:^5.0.1" - "@csstools/postcss-color-function": "npm:^4.0.10" - "@csstools/postcss-color-mix-function": "npm:^3.0.10" - "@csstools/postcss-color-mix-variadic-function-arguments": "npm:^1.0.0" - "@csstools/postcss-content-alt-text": "npm:^2.0.6" + version: 10.6.1 + resolution: "postcss-preset-env@npm:10.6.1" + dependencies: + "@csstools/postcss-alpha-function": "npm:^1.0.1" + "@csstools/postcss-cascade-layers": "npm:^5.0.2" + "@csstools/postcss-color-function": "npm:^4.0.12" + "@csstools/postcss-color-function-display-p3-linear": "npm:^1.0.1" + "@csstools/postcss-color-mix-function": "npm:^3.0.12" + "@csstools/postcss-color-mix-variadic-function-arguments": "npm:^1.0.2" + "@csstools/postcss-content-alt-text": "npm:^2.0.8" + "@csstools/postcss-contrast-color-function": "npm:^2.0.12" "@csstools/postcss-exponential-functions": "npm:^2.0.9" "@csstools/postcss-font-format-keywords": "npm:^4.0.0" - "@csstools/postcss-gamut-mapping": "npm:^2.0.10" - "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.10" - "@csstools/postcss-hwb-function": "npm:^4.0.10" - "@csstools/postcss-ic-unit": "npm:^4.0.2" + "@csstools/postcss-gamut-mapping": "npm:^2.0.11" + "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.12" + "@csstools/postcss-hwb-function": "npm:^4.0.12" + "@csstools/postcss-ic-unit": "npm:^4.0.4" "@csstools/postcss-initial": "npm:^2.0.1" "@csstools/postcss-is-pseudo-class": "npm:^5.0.3" - "@csstools/postcss-light-dark-function": "npm:^2.0.9" + "@csstools/postcss-light-dark-function": "npm:^2.0.11" "@csstools/postcss-logical-float-and-clear": "npm:^3.0.0" "@csstools/postcss-logical-overflow": "npm:^2.0.0" "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" @@ -13144,39 +11429,43 @@ __metadata: "@csstools/postcss-media-minmax": "npm:^2.0.9" "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.5" "@csstools/postcss-nested-calc": "npm:^4.0.0" - "@csstools/postcss-normalize-display-values": "npm:^4.0.0" - "@csstools/postcss-oklab-function": "npm:^4.0.10" - "@csstools/postcss-progressive-custom-properties": "npm:^4.1.0" + "@csstools/postcss-normalize-display-values": "npm:^4.0.1" + "@csstools/postcss-oklab-function": "npm:^4.0.12" + "@csstools/postcss-position-area-property": "npm:^1.0.0" + "@csstools/postcss-progressive-custom-properties": "npm:^4.2.1" + "@csstools/postcss-property-rule-prelude-list": "npm:^1.0.0" "@csstools/postcss-random-function": "npm:^2.0.1" - "@csstools/postcss-relative-color-syntax": "npm:^3.0.10" + "@csstools/postcss-relative-color-syntax": "npm:^3.0.12" "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1" "@csstools/postcss-sign-functions": "npm:^1.1.4" "@csstools/postcss-stepped-value-functions": "npm:^4.0.9" - "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.2" + "@csstools/postcss-syntax-descriptor-syntax-production": "npm:^1.0.1" + "@csstools/postcss-system-ui-font-family": "npm:^1.0.0" + "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.3" "@csstools/postcss-trigonometric-functions": "npm:^4.0.9" "@csstools/postcss-unset-value": "npm:^4.0.0" - autoprefixer: "npm:^10.4.21" - browserslist: "npm:^4.25.0" + autoprefixer: "npm:^10.4.23" + browserslist: "npm:^4.28.1" css-blank-pseudo: "npm:^7.0.1" - css-has-pseudo: "npm:^7.0.2" + css-has-pseudo: "npm:^7.0.3" css-prefers-color-scheme: "npm:^10.0.0" - cssdb: "npm:^8.3.0" + cssdb: "npm:^8.6.0" postcss-attribute-case-insensitive: "npm:^7.0.1" postcss-clamp: "npm:^4.1.0" - postcss-color-functional-notation: "npm:^7.0.10" + postcss-color-functional-notation: "npm:^7.0.12" postcss-color-hex-alpha: "npm:^10.0.0" postcss-color-rebeccapurple: "npm:^10.0.0" postcss-custom-media: "npm:^11.0.6" postcss-custom-properties: "npm:^14.0.6" postcss-custom-selectors: "npm:^8.0.5" postcss-dir-pseudo-class: "npm:^9.0.1" - postcss-double-position-gradients: "npm:^6.0.2" + postcss-double-position-gradients: "npm:^6.0.4" postcss-focus-visible: "npm:^10.0.1" postcss-focus-within: "npm:^9.0.1" postcss-font-variant: "npm:^5.0.0" postcss-gap-properties: "npm:^6.0.0" postcss-image-set-function: "npm:^7.0.0" - postcss-lab-function: "npm:^7.0.10" + postcss-lab-function: "npm:^7.0.12" postcss-logical: "npm:^8.1.0" postcss-nesting: "npm:^13.0.2" postcss-opacity-percentage: "npm:^3.0.0" @@ -13188,7 +11477,7 @@ __metadata: postcss-selector-not: "npm:^8.0.1" peerDependencies: postcss: ^8.4 - checksum: 10/c95ef93000eec70f5b4042eced3f318110207abeb468303d4b4fd3abdbeab72964b7e967f48a2577a129b39fe1a5e1fafa36850f51489cf3419be371d2580200 + checksum: 10/e18aa351e18262a9f086a40ce15de4763f8e9e208cb8b92f05ce15ebeaca740b568409c5309d3289a7f880a81ec51b166644a4fa5a82bb4180a5fb24213a646b languageName: node linkType: hard @@ -13257,23 +11546,23 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16, postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.1.0 - resolution: "postcss-selector-parser@npm:6.1.0" +"postcss-selector-parser@npm:^6.0.11, postcss-selector-parser@npm:^6.0.16": + version: 6.1.2 + resolution: "postcss-selector-parser@npm:6.1.2" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10/2f9e5045b8bbe674fed3b79dbcd3daf21f5188cd7baf179beac513710ec3d75a8fc8184a262c3aec1c628ad3fd8bdb29c5d8530f1c9c5a61a18e1980bb000945 + checksum: 10/190034c94d809c115cd2f32ee6aade84e933450a43ec3899c3e78e7d7b33efd3a2a975bb45d7700b6c5b196c06a7d9acf3f1ba6f1d87032d9675a29d8bca1dd3 languageName: node linkType: hard "postcss-selector-parser@npm:^7.0.0": - version: 7.1.0 - resolution: "postcss-selector-parser@npm:7.1.0" + version: 7.1.1 + resolution: "postcss-selector-parser@npm:7.1.1" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10/2caf09e66e2be81d45538f8afdc5439298c89bea71e9943b364e69dce9443d9c5ab33f4dd8b237f1ed7d2f38530338dcc189c1219d888159e6afb5b0afe58b19 + checksum: 10/bb3c6455b20af26a556e3021e21101d8470252644e673c1612f7348ff8dd41b11321329f0694cf299b5b94863f823480b72d3e2f4bd3a89dc43e2d8c0dbad341 languageName: node linkType: hard @@ -13327,25 +11616,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.33": - version: 8.4.39 - resolution: "postcss@npm:8.4.39" - dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.1" - source-map-js: "npm:^1.2.0" - checksum: 10/ad9c1add892c96433b9a5502878201ede4a20c4ce02d056251f61f8d9a3e5426dab3683fe5a086edfa78a1a19f2b4988c8cea02c5122136d29758cb5a17e2621 - languageName: node - linkType: hard - -"postcss@npm:^8.5.4": - version: 8.5.5 - resolution: "postcss@npm:8.5.5" +"postcss@npm:^8.4.21, postcss@npm:^8.4.24, postcss@npm:^8.4.33, postcss@npm:^8.5.4": + version: 8.5.6 + resolution: "postcss@npm:8.5.6" dependencies: nanoid: "npm:^3.3.11" picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10/c80f723c754b656bf7c983e34841fa35fe0c37a13edd27e24de64e7962cfab11ea081b3b1c900838d2dbe576a045fdecad4f17862c488f12735742f525d22cf0 + checksum: 10/9e4fbe97574091e9736d0e82a591e29aa100a0bf60276a926308f8c57249698935f35c5d2f4e80de778d0cbb8dcffab4f383d85fd50c5649aca421c3df729b86 languageName: node linkType: hard @@ -13366,19 +11644,7 @@ __metadata: languageName: node linkType: hard -"prism-react-renderer@npm:^2.3.0": - version: 2.3.1 - resolution: "prism-react-renderer@npm:2.3.1" - dependencies: - "@types/prismjs": "npm:^1.26.0" - clsx: "npm:^2.0.0" - peerDependencies: - react: ">=16.0.0" - checksum: 10/8ef6b3b667d8761f26cbe779709f5ac708023ef88f35a858cb7d331d1eb9480684759ac90c125f1a720d44da39b8d566532a76dcfc4ebc131349093f63eb1b80 - languageName: node - linkType: hard - -"prism-react-renderer@npm:^2.4.1": +"prism-react-renderer@npm:^2.3.0, prism-react-renderer@npm:^2.4.1": version: 2.4.1 resolution: "prism-react-renderer@npm:2.4.1" dependencies: @@ -13397,10 +11663,10 @@ __metadata: languageName: node linkType: hard -"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 10/4e1394491b717f6c1ade15c570ecd4c2b681698474d3ae2d303c1e4b6ab9455bd5a81566211e82890d5a5ae9859718cc6954d5150bb18b09b72ecb297beae90a +"proc-log@npm:^6.0.0": + version: 6.1.0 + resolution: "proc-log@npm:6.1.0" + checksum: 10/9033f30f168ed5a0991b773d0c50ff88384c4738e9a0a67d341de36bf7293771eed648ab6a0562f62276da12fde91f3bbfc75ffff6e71ad49aafd74fc646be66 languageName: node linkType: hard @@ -13431,7 +11697,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prop-types@npm:^15.6.2, prop-types@npm:^15.7.2": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -13442,10 +11708,10 @@ __metadata: languageName: node linkType: hard -"property-information@npm:^6.0.0": - version: 6.5.0 - resolution: "property-information@npm:6.5.0" - checksum: 10/fced94f3a09bf651ad1824d1bdc8980428e3e480e6d01e98df6babe2cc9d45a1c52eee9a7736d2006958f9b394eb5964dedd37e23038086ddc143fc2fd5e426c +"property-information@npm:^7.0.0": + version: 7.1.0 + resolution: "property-information@npm:7.1.0" + checksum: 10/896d38a52ad7170de73f832d277c69e76a9605d941ebb3f0d6e56271414a7fdf95ff6d2819e68036b8a0c7d2d4d88bf1d4a5765c032cb19c2343567ee3a14b15 languageName: node linkType: hard @@ -13474,20 +11740,36 @@ __metadata: linkType: hard "pupa@npm:^3.1.0": - version: 3.1.0 - resolution: "pupa@npm:3.1.0" + version: 3.3.0 + resolution: "pupa@npm:3.3.0" dependencies: escape-goat: "npm:^4.0.0" - checksum: 10/32784254b76e455e92169ab88339cf3df8b5d63e52b7e6d0568f065e53946659d4c30e4b75de435c37033b7902bd1c785f142be4afb8aa984a86cf2d7e9a8421 + checksum: 10/05c84c2c7601761d3fcec7d3f9937abac197c553f6a53a1c1a6eebb8b947c5bf80e41dc4eba1be4cd061661b48612986762db58a1f98e09de4863d91d808d717 + languageName: node + linkType: hard + +"pvtsutils@npm:^1.3.6": + version: 1.3.6 + resolution: "pvtsutils@npm:1.3.6" + dependencies: + tslib: "npm:^2.8.1" + checksum: 10/d45b12f8526e13ecf15fe09b30cde65501f3300fd2a07c11b28a966d434d1f767c8a61597ecba2e19c7eb19ca0c740341a6babc67a4f741e08b1ef1095c71663 + languageName: node + linkType: hard + +"pvutils@npm:^1.1.3": + version: 1.1.5 + resolution: "pvutils@npm:1.1.5" + checksum: 10/9a5a71603c72bf9ea3a4501e8251e3f7a56026ed059bf63a18bd9a30cac6c35cc8250b39eb6291c1cb204cdeb6660663ab9bb2c74e85a512919bb2d614e340ea languageName: node linkType: hard -"qs@npm:6.13.0": - version: 6.13.0 - resolution: "qs@npm:6.13.0" +"qs@npm:~6.14.0": + version: 6.14.2 + resolution: "qs@npm:6.14.2" dependencies: - side-channel: "npm:^1.0.6" - checksum: 10/f548b376e685553d12e461409f0d6e5c59ec7c7d76f308e2a888fd9db3e0c5e89902bedd0754db3a9038eda5f27da2331a6f019c8517dc5e0a16b3c9a6e9cef8 + side-channel: "npm:^1.1.0" + checksum: 10/682933a85bb4b7bd0d66e13c0a40d9e612b5e4bcc2cb9238f711a9368cd22d91654097a74fff93551e58146db282c56ac094957dfdc60ce64ea72c3c9d7779ac languageName: node linkType: hard @@ -13528,15 +11810,15 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" +"raw-body@npm:~2.5.3": + version: 2.5.3 + resolution: "raw-body@npm:2.5.3" dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10/863b5171e140546a4d99f349b720abac4410338e23df5e409cfcc3752538c9caf947ce382c89129ba976f71894bd38b5806c774edac35ebf168d02aa1ac11a95 + bytes: "npm:~3.1.2" + http-errors: "npm:~2.0.1" + iconv-lite: "npm:~0.4.24" + unpipe: "npm:~1.0.0" + checksum: 10/f35759fe5a6548e7c529121ead1de4dd163f899749a5896c42e278479df2d9d7f98b5bb17312737c03617765e5a1433e586f717616e5cfbebc13b4738b820601 languageName: node linkType: hard @@ -13554,14 +11836,14 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:^19.2.0": - version: 19.2.0 - resolution: "react-dom@npm:19.2.0" +"react-dom@npm:^19.2.4": + version: 19.2.4 + resolution: "react-dom@npm:19.2.4" dependencies: scheduler: "npm:^0.27.0" peerDependencies: - react: ^19.2.0 - checksum: 10/3dbba071b9b1e7a19eae55f05c100f6b44f88c0aee72397d719ae338248ca66ed5028e6964c1c14870cc3e1abcecc91b22baba6dc2072f819dea81a9fd72f2fd + react: ^19.2.4 + checksum: 10/ec17721a8cb131bc33480a9f738bc5bbfe4bd11b11cf69f3f473605346578a329ad26ceef6ef0761ea67a4b455803407dd7ed4ba3d8a5abd2cee8c32d221e498 languageName: node linkType: hard @@ -13596,11 +11878,11 @@ __metadata: linkType: hard "react-json-view-lite@npm:^2.3.0": - version: 2.4.1 - resolution: "react-json-view-lite@npm:2.4.1" + version: 2.5.0 + resolution: "react-json-view-lite@npm:2.5.0" peerDependencies: react: ^18.0.0 || ^19.0.0 - checksum: 10/1c8700362198f433874650cf6063e6ba459294caf1e4d39c9e847b3b0de1b9a1de61c9eea1517e35e9c7c1ba8cb245682e115d9c0f60ec6b505af599fdafa09d + checksum: 10/196a989d3ecb6d662baeb51260f2cf1e1391e109db405343019c4fa30da1c1e6fc9c0b9aa464444b16cb5ef6867b49db547073aa73abb36b2d7d976e4dcc0dc4 languageName: node linkType: hard @@ -13627,28 +11909,6 @@ __metadata: languageName: node linkType: hard -"react-player@npm:^3.3.3": - version: 3.3.3 - resolution: "react-player@npm:3.3.3" - dependencies: - "@mux/mux-player-react": "npm:^3.6.0" - cloudflare-video-element: "npm:^1.3.4" - dash-video-element: "npm:^0.2.0" - hls-video-element: "npm:^1.5.8" - spotify-audio-element: "npm:^1.0.3" - tiktok-video-element: "npm:^0.1.1" - twitch-video-element: "npm:^0.1.4" - vimeo-video-element: "npm:^1.5.5" - wistia-video-element: "npm:^1.3.4" - youtube-video-element: "npm:^1.6.2" - peerDependencies: - "@types/react": ^17.0.0 || ^18 || ^19 - react: ^17.0.2 || ^18 || ^19 - react-dom: ^17.0.2 || ^18 || ^19 - checksum: 10/75184389dbbe4afdfbd750bba478f0004d57aea5e39b0bd583f8c08d7274155d17cb4c6ac42964316d0eb0140b7876b0c845ed7e462a829ab8a27d8bc5772f33 - languageName: node - linkType: hard - "react-router-config@npm:^5.1.1": version: 5.1.1 resolution: "react-router-config@npm:5.1.1" @@ -13697,10 +11957,10 @@ __metadata: languageName: node linkType: hard -"react@npm:^19.2.0": - version: 19.2.0 - resolution: "react@npm:19.2.0" - checksum: 10/e13bcdb8e994c3cfa922743cb75ca8deb60531bf02f584d2d8dab940a8132ce8a2e6ef16f8ed7f372b4072e7a7eeff589b2812dabbedfa73e6e46201dac8a9d0 +"react@npm:^19.2.4": + version: 19.2.4 + resolution: "react@npm:19.2.4" + checksum: 10/18179fe217f67eb2d0bc61cd04e7ad3c282ea09a1dface7eacd71816f62609f4bbf566c447c704335284deb8397b00bca084e0cd60e6f437279a7498e2d0bfe0 languageName: node linkType: hard @@ -13739,74 +11999,99 @@ __metadata: languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.1 - resolution: "regenerate-unicode-properties@npm:10.1.1" +"recma-build-jsx@npm:^1.0.0": + version: 1.0.0 + resolution: "recma-build-jsx@npm:1.0.0" dependencies: - regenerate: "npm:^1.4.2" - checksum: 10/b855152efdcca0ecc37ceb0cb6647a544344555fc293af3b57191b918e1bc9c95ee404a9a64a1d692bf66d45850942c29d93f2740c0d1980d3a8ea2ca63b184e + "@types/estree": "npm:^1.0.0" + estree-util-build-jsx: "npm:^3.0.0" + vfile: "npm:^6.0.0" + checksum: 10/ba82fe08efdf5ecd178ab76a08a4acac792a41d9f38aea99f93cb3d9e577ba8952620c547e730ba6717c13efa08fdb3dfe893bccfa9717f5a81d3fb2ab20c572 languageName: node linkType: hard -"regenerate-unicode-properties@npm:^10.2.0": - version: 10.2.0 - resolution: "regenerate-unicode-properties@npm:10.2.0" +"recma-jsx@npm:^1.0.0": + version: 1.0.1 + resolution: "recma-jsx@npm:1.0.1" dependencies: - regenerate: "npm:^1.4.2" - checksum: 10/9150eae6fe04a8c4f2ff06077396a86a98e224c8afad8344b1b656448e89e84edcd527e4b03aa5476774129eb6ad328ed684f9c1459794a935ec0cc17ce14329 + acorn-jsx: "npm:^5.0.0" + estree-util-to-js: "npm:^2.0.0" + recma-parse: "npm:^1.0.0" + recma-stringify: "npm:^1.0.0" + unified: "npm:^11.0.0" + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + checksum: 10/eebbdc4e08e03f259dcd80387e51559d792de2dcb3f553c5d5a29d1ef4385e985c377cf60eabf408b1ead923a8eff85f157797a196e8262078a21dce247bbf0f languageName: node linkType: hard -"regenerate@npm:^1.4.2": - version: 1.4.2 - resolution: "regenerate@npm:1.4.2" - checksum: 10/dc6c95ae4b3ba6adbd7687cafac260eee4640318c7a95239d5ce847d9b9263979758389e862fe9c93d633b5792ea4ada5708df75885dc5aa05a309fa18140a87 +"recma-parse@npm:^1.0.0": + version: 1.0.0 + resolution: "recma-parse@npm:1.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + esast-util-from-js: "npm:^2.0.0" + unified: "npm:^11.0.0" + vfile: "npm:^6.0.0" + checksum: 10/8854f830ee7b7a21934f9ac2108412a2bdd9c41465e617ac8d6edd158ff05c70dca121bf87d3716d863545b387d39e67ff011d5cb0c3d1fdba9d5a48140e12ee languageName: node linkType: hard -"regenerator-transform@npm:^0.15.2": - version: 0.15.2 - resolution: "regenerator-transform@npm:0.15.2" +"recma-stringify@npm:^1.0.0": + version: 1.0.0 + resolution: "recma-stringify@npm:1.0.0" dependencies: - "@babel/runtime": "npm:^7.8.4" - checksum: 10/c4fdcb46d11bbe32605b4b9ed76b21b8d3f241a45153e9dc6f5542fed4c7744fed459f42701f650d5d5956786bf7de57547329d1c05a9df2ed9e367b9d903302 + "@types/estree": "npm:^1.0.0" + estree-util-to-js: "npm:^2.0.0" + unified: "npm:^11.0.0" + vfile: "npm:^6.0.0" + checksum: 10/4ab6f0416296fd6b1a6180e74e19ec110b3fa6f0b3a434468e84092e8c36db99a3a77bd6412cf7a4c8d69b1701ab38aed7d0fd466588802ca295765892d2d361 languageName: node linkType: hard -"regexpu-core@npm:^5.3.1": - version: 5.3.2 - resolution: "regexpu-core@npm:5.3.2" +"reflect-metadata@npm:^0.2.2": + version: 0.2.2 + resolution: "reflect-metadata@npm:0.2.2" + checksum: 10/1c93f9ac790fea1c852fde80c91b2760420069f4862f28e6fae0c00c6937a56508716b0ed2419ab02869dd488d123c4ab92d062ae84e8739ea7417fae10c4745 + languageName: node + linkType: hard + +"regenerate-unicode-properties@npm:^10.2.2": + version: 10.2.2 + resolution: "regenerate-unicode-properties@npm:10.2.2" dependencies: - "@babel/regjsgen": "npm:^0.8.0" regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.1.0" - regjsparser: "npm:^0.9.1" - unicode-match-property-ecmascript: "npm:^2.0.0" - unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10/ed0d7c66d84c633fbe8db4939d084c780190eca11f6920807dfb8ebac59e2676952cd8f2008d9c86ae8cf0463ea5fd12c5cff09ef2ce7d51ee6b420a5eb4d177 + checksum: 10/5041ee31185c4700de9dd76783fab9def51c412751190d523d621db5b8e35a6c2d91f1642c12247e7d94f84b8ae388d044baac1e88fc2ba0ac215ca8dc7bed38 languageName: node linkType: hard -"regexpu-core@npm:^6.2.0": - version: 6.2.0 - resolution: "regexpu-core@npm:6.2.0" +"regenerate@npm:^1.4.2": + version: 1.4.2 + resolution: "regenerate@npm:1.4.2" + checksum: 10/dc6c95ae4b3ba6adbd7687cafac260eee4640318c7a95239d5ce847d9b9263979758389e862fe9c93d633b5792ea4ada5708df75885dc5aa05a309fa18140a87 + languageName: node + linkType: hard + +"regexpu-core@npm:^6.3.1": + version: 6.4.0 + resolution: "regexpu-core@npm:6.4.0" dependencies: regenerate: "npm:^1.4.2" - regenerate-unicode-properties: "npm:^10.2.0" + regenerate-unicode-properties: "npm:^10.2.2" regjsgen: "npm:^0.8.0" - regjsparser: "npm:^0.12.0" + regjsparser: "npm:^0.13.0" unicode-match-property-ecmascript: "npm:^2.0.0" - unicode-match-property-value-ecmascript: "npm:^2.1.0" - checksum: 10/4d054ffcd98ca4f6ca7bf0df6598ed5e4a124264602553308add41d4fa714a0c5bcfb5bc868ac91f7060a9c09889cc21d3180a3a14c5f9c5838442806129ced3 + unicode-match-property-value-ecmascript: "npm:^2.2.1" + checksum: 10/bf5f85a502a17f127a1f922270e2ecc1f0dd071ff76a3ec9afcd6b1c2bf7eae1486d1e3b1a6d621aee8960c8b15139e6b5058a84a68e518e1a92b52e9322faf9 languageName: node linkType: hard "registry-auth-token@npm:^5.0.1": - version: 5.0.2 - resolution: "registry-auth-token@npm:5.0.2" + version: 5.1.1 + resolution: "registry-auth-token@npm:5.1.1" dependencies: - "@pnpm/npm-conf": "npm:^2.1.0" - checksum: 10/0d7683b71ee418993e7872b389024b13645c4295eb7bb850d10728eaf46065db24ea4d47dc6cbb71a60d1aa4bef077b0d8b7363c9ac9d355fdba47bebdfb01dd + "@pnpm/npm-conf": "npm:^3.0.2" + checksum: 10/36cf27fca6419e4d92c27419c5a333aea1d9dec62f7fb812fa8d8d95dcfa4124e57f22bb944512f5f97ae0e0cda90c28b3a5f0e7ace0b5620d84a8b6b2cab862 languageName: node linkType: hard @@ -13826,25 +12111,14 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.12.0": - version: 0.12.0 - resolution: "regjsparser@npm:0.12.0" - dependencies: - jsesc: "npm:~3.0.2" - bin: - regjsparser: bin/parser - checksum: 10/c2d6506b3308679de5223a8916984198e0493649a67b477c66bdb875357e3785abbf3bedf7c5c2cf8967d3b3a7bdf08b7cbd39e65a70f9e1ffad584aecf5f06a - languageName: node - linkType: hard - -"regjsparser@npm:^0.9.1": - version: 0.9.1 - resolution: "regjsparser@npm:0.9.1" +"regjsparser@npm:^0.13.0": + version: 0.13.0 + resolution: "regjsparser@npm:0.13.0" dependencies: - jsesc: "npm:~0.5.0" + jsesc: "npm:~3.1.0" bin: regjsparser: bin/parser - checksum: 10/be7757ef76e1db10bf6996001d1021048b5fb12f5cb470a99b8cf7f3ff943f0f0e2291c0dcdbb418b458ddc4ac10e48680a822b69ef487a0284c8b6b77beddc3 + checksum: 10/eeaabd3454f59394cbb3bfeb15fd789e638040f37d0bee9071a9b0b85524ddc52b5f7aaaaa4847304c36fa37429e53d109c4dbf6b878cb5ffa4f4198c1042fb7 languageName: node linkType: hard @@ -13859,6 +12133,17 @@ __metadata: languageName: node linkType: hard +"rehype-recma@npm:^1.0.0": + version: 1.0.0 + resolution: "rehype-recma@npm:1.0.0" + dependencies: + "@types/estree": "npm:^1.0.0" + "@types/hast": "npm:^3.0.0" + hast-util-to-estree: "npm:^3.0.0" + checksum: 10/d3d544ad4a18485ec6b03a194b40473f96e2169c63d6a8ee3ce9af5e87b946c308fb9549b53e010c7dd39740337e387bb1a8856ce1b47f3e957b696f1d5b2d0c + languageName: node + linkType: hard + "relateurl@npm:^0.2.7": version: 0.2.7 resolution: "relateurl@npm:0.2.7" @@ -13867,14 +12152,14 @@ __metadata: linkType: hard "remark-directive@npm:^3.0.0": - version: 3.0.0 - resolution: "remark-directive@npm:3.0.0" + version: 3.0.1 + resolution: "remark-directive@npm:3.0.1" dependencies: "@types/mdast": "npm:^4.0.0" mdast-util-directive: "npm:^3.0.0" micromark-extension-directive: "npm:^3.0.0" unified: "npm:^11.0.0" - checksum: 10/fc23794c0996f5a926d4fd759632bd6fcbc8a1a34c47723d03e1a3aa3a1e5389549ae46fd679cd2ab571ca336b7ed53e76c459616559518200d3019984b5e147 + checksum: 10/819073621cb645fc7d4e6a8e28d3d3c4dcf877fd87d4f931008b9e7e68a4e80c6c11b0345be595111b32b1f16e5868e2c1d48c1b2fb02a8313a3fefa208047a1 languageName: node linkType: hard @@ -13904,8 +12189,8 @@ __metadata: linkType: hard "remark-gfm@npm:^4.0.0": - version: 4.0.0 - resolution: "remark-gfm@npm:4.0.0" + version: 4.0.1 + resolution: "remark-gfm@npm:4.0.1" dependencies: "@types/mdast": "npm:^4.0.0" mdast-util-gfm: "npm:^3.0.0" @@ -13913,17 +12198,17 @@ __metadata: remark-parse: "npm:^11.0.0" remark-stringify: "npm:^11.0.0" unified: "npm:^11.0.0" - checksum: 10/9f7b17aae0e9dc79ba9c989c2a679baff7161e1831a87307cfa2e0e9b0c492bd8c1900cdf7305855b898a2a9fab9aa8e586d71ce49cbc1ea90f68b714c249c0d + checksum: 10/86899862cf4ae1466664d3f88c6113e30b5e84e35480aef4093890aed2297ab9872506ff1f614c63963bba7d075c326d0027a1591c11bb493f6776dad21b95f6 languageName: node linkType: hard "remark-mdx@npm:^3.0.0": - version: 3.0.1 - resolution: "remark-mdx@npm:3.0.1" + version: 3.1.1 + resolution: "remark-mdx@npm:3.1.1" dependencies: mdast-util-mdx: "npm:^3.0.0" micromark-extension-mdxjs: "npm:^3.0.0" - checksum: 10/aa1d9b8baf62c98d973ff3538402378ee47eef0e7adb10123421b4fde7e187b9c5820f72a11846193b6fe43983221e1078d97ed9cebbcde0938e55cb159d5455 + checksum: 10/aaeb8d52ccfca78fb98689b106ac1f89d14b57808b2a6e414db1c6f00ff6c9ad2709b2a5a51d3b23f207321cfd82ce1e49cb07a25c3ae38d89af60e4df7edbfb languageName: node linkType: hard @@ -13940,15 +12225,15 @@ __metadata: linkType: hard "remark-rehype@npm:^11.0.0": - version: 11.1.0 - resolution: "remark-rehype@npm:11.1.0" + version: 11.1.2 + resolution: "remark-rehype@npm:11.1.2" dependencies: "@types/hast": "npm:^3.0.0" "@types/mdast": "npm:^4.0.0" mdast-util-to-hast: "npm:^13.0.0" unified: "npm:^11.0.0" vfile: "npm:^6.0.0" - checksum: 10/945a10ed91b1224f8c02e1eed7fe031ea2f04f28e5232d379dd8542b881b984d209a6009eb9c289073a2848104974d79ae3f544721ee2ed8a4ad472176568571 + checksum: 10/b5374a0bf08398431c92740d0cd9b20aea9df44cee12326820ddcc1b7ee642706604006461ea9799554c347e7caf31e7432132a03b97c508e1f77d29c423bd86 languageName: node linkType: hard @@ -14025,29 +12310,29 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.14.2": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" +"resolve@npm:^1.22.11": + version: 1.22.11 + resolution: "resolve@npm:1.22.11" dependencies: - is-core-module: "npm:^2.13.0" + is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10/c473506ee01eb45cbcfefb68652ae5759e092e6b0fb64547feadf9736a6394f258fbc6f88e00c5ca36d5477fbb65388b272432a3600fa223062e54333c156753 + checksum: 10/e1b2e738884a08de03f97ee71494335eba8c2b0feb1de9ae065e82c48997f349f77a2b10e8817e147cf610bfabc4b1cb7891ee8eaf5bf80d4ad514a34c4fab0a languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.14.2#optional!builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.22.11#optional!builtin": + version: 1.22.11 + resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d" dependencies: - is-core-module: "npm:^2.13.0" + is-core-module: "npm:^2.16.1" path-parse: "npm:^1.0.7" supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 10/f345cd37f56a2c0275e3fe062517c650bb673815d885e7507566df589375d165bbbf4bdb6aa95600a9bc55f4744b81f452b5a63f95b9f10a72787dba3c90890a + checksum: 10/fd342cad25e52cd6f4f3d1716e189717f2522bfd6641109fe7aa372f32b5714a296ed7c238ddbe7ebb0c1ddfe0b7f71c9984171024c97cf1b2073e3e40ff71a8 languageName: node linkType: hard @@ -14075,9 +12360,9 @@ __metadata: linkType: hard "reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: 10/14222c9e1d3f9ae01480c50d96057228a8524706db79cdeb5a2ce5bb7070dd9f409a6f84a02cbef8cdc80d39aef86f2dd03d155188a1300c599b05437dcd2ffb + version: 1.1.0 + resolution: "reusify@npm:1.1.0" + checksum: 10/af47851b547e8a8dc89af144fceee17b80d5beaf5e6f57ed086432d79943434ff67ca526e92275be6f54b6189f6920a24eace75c2657eed32d02c400312b21ec languageName: node linkType: hard @@ -14101,8 +12386,8 @@ __metadata: linkType: hard "rtlcss@npm:^4.1.0": - version: 4.1.1 - resolution: "rtlcss@npm:4.1.1" + version: 4.3.0 + resolution: "rtlcss@npm:4.3.0" dependencies: escalade: "npm:^3.1.1" picocolors: "npm:^1.0.0" @@ -14110,7 +12395,7 @@ __metadata: strip-json-comments: "npm:^3.1.1" bin: rtlcss: bin/rtlcss.js - checksum: 10/2d91037dfe0845ac892010556ff3d83379b8868e3d01c8c8084dac50b1f47a27d26b988ddc6d729329fc711f6db4a204291532906bf03c4a16a07c82e06e1b32 + checksum: 10/0a1e6b566b027e2b6ea1f436b67bd1c19cda48c2d768fecef821f53264c3e62947b7535a8221492056ea471df0596af1cd79c59dc0c7b14f184049707667c452 languageName: node linkType: hard @@ -14137,13 +12422,6 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10/7eb5b48f2ed9a594a4795677d5a150faa7eb54483b2318b568dc0c4fc94092a6cce5be02c7288a0500a156282f5276d5688bce7259299568d1053b2150ef374a - languageName: node - linkType: hard - "safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -14151,24 +12429,24 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 +"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": + version: 5.1.2 + resolution: "safe-buffer@npm:5.1.2" + checksum: 10/7eb5b48f2ed9a594a4795677d5a150faa7eb54483b2318b568dc0c4fc94092a6cce5be02c7288a0500a156282f5276d5688bce7259299568d1053b2150ef374a languageName: node linkType: hard -"sax@npm:1.2.1": - version: 1.2.1 - resolution: "sax@npm:1.2.1" - checksum: 10/d64f65291ce127f191eb2c22012f8f608736e306db6a28306e618bb1324cfbc19f6783c49ce0d88e5628fde30878c29189c8fb3c62c83f079b471734e4df455d +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": + version: 2.1.2 + resolution: "safer-buffer@npm:2.1.2" + checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 languageName: node linkType: hard "sax@npm:^1.2.4": - version: 1.4.1 - resolution: "sax@npm:1.4.1" - checksum: 10/b1c784b545019187b53a0c28edb4f6314951c971e2963a69739c6ce222bfbc767e54d320e689352daba79b7d5e06d22b5d7113b99336219d6e93718e2f99d335 + version: 1.4.4 + resolution: "sax@npm:1.4.4" + checksum: 10/00ff7b258baa37d98f8abfa0b5c8b3ee739ca37e9b6ecb83405be9e6e5b0b2856394a5eff142db1d987d589b54b139d4236f25830c1e17a2b640efa53c8fda72 languageName: node linkType: hard @@ -14186,7 +12464,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^3.0.0, schema-utils@npm:^3.1.1, schema-utils@npm:^3.2.0": +"schema-utils@npm:^3.0.0": version: 3.3.0 resolution: "schema-utils@npm:3.3.0" dependencies: @@ -14197,19 +12475,7 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1": - version: 4.2.0 - resolution: "schema-utils@npm:4.2.0" - dependencies: - "@types/json-schema": "npm:^7.0.9" - ajv: "npm:^8.9.0" - ajv-formats: "npm:^2.1.1" - ajv-keywords: "npm:^5.1.0" - checksum: 10/808784735eeb153ab7f3f787f840aa3bc63f423d2a5a7e96c9e70a0e53d0bc62d7b37ea396fc598ce19196e4fb86a72f897154b7c6ce2358bbc426166f205e14 - languageName: node - linkType: hard - -"schema-utils@npm:^4.2.0": +"schema-utils@npm:^4.0.0, schema-utils@npm:^4.0.1, schema-utils@npm:^4.2.0, schema-utils@npm:^4.3.0, schema-utils@npm:^4.3.3": version: 4.3.3 resolution: "schema-utils@npm:4.3.3" dependencies: @@ -14221,18 +12487,6 @@ __metadata: languageName: node linkType: hard -"schema-utils@npm:^4.3.0": - version: 4.3.0 - resolution: "schema-utils@npm:4.3.0" - dependencies: - "@types/json-schema": "npm:^7.0.9" - ajv: "npm:^8.9.0" - ajv-formats: "npm:^2.1.1" - ajv-keywords: "npm:^5.1.0" - checksum: 10/86c5a7c72a275c56f140bc3cdd832d56efb11428c88ad588127db12cb9b2c83ccaa9540e115d7baa9c6175b5e360094457e29c44e6fb76787c9498c2eb6df5d6 - languageName: node - linkType: hard - "section-matter@npm:^1.0.0": version: 1.0.0 resolution: "section-matter@npm:1.0.0" @@ -14250,13 +12504,13 @@ __metadata: languageName: node linkType: hard -"selfsigned@npm:^2.4.1": - version: 2.4.1 - resolution: "selfsigned@npm:2.4.1" +"selfsigned@npm:^5.5.0": + version: 5.5.0 + resolution: "selfsigned@npm:5.5.0" dependencies: - "@types/node-forge": "npm:^1.3.0" - node-forge: "npm:^1" - checksum: 10/52536623f1cfdeb2f8b9198377f2ce7931c677ea69421238d1dc1ea2983bbe258e56c19e7d1af87035cad7270f19b7e996eaab1212e724d887722502f68e17f2 + "@peculiar/x509": "npm:^1.14.2" + pkijs: "npm:^3.3.3" + checksum: 10/fe9be2647507c3ee21dcaf5cab20e1ae4b8b84eac83d2fe4d82f9a3b6c70636f9aaeeba0089e3343dcb13fbb31ef70c2e72c41f2e2dcf38368040b49830c670e languageName: node linkType: hard @@ -14279,32 +12533,32 @@ __metadata: linkType: hard "semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.4": - version: 7.6.2 - resolution: "semver@npm:7.6.2" + version: 7.7.4 + resolution: "semver@npm:7.7.4" bin: semver: bin/semver.js - checksum: 10/296b17d027f57a87ef645e9c725bff4865a38dfc9caf29b26aa084b85820972fbe7372caea1ba6857162fa990702c6d9c1d82297cecb72d56c78ab29070d2ca2 + checksum: 10/26bdc6d58b29528f4142d29afb8526bc335f4fc04c4a10f2b98b217f277a031c66736bf82d3d3bb354a2f6a3ae50f18fd62b053c4ac3f294a3d10a61f5075b75 languageName: node linkType: hard -"send@npm:0.19.0": - version: 0.19.0 - resolution: "send@npm:0.19.0" +"send@npm:~0.19.0, send@npm:~0.19.1": + version: 0.19.2 + resolution: "send@npm:0.19.2" dependencies: debug: "npm:2.6.9" depd: "npm:2.0.0" destroy: "npm:1.2.0" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - fresh: "npm:0.5.2" - http-errors: "npm:2.0.0" + fresh: "npm:~0.5.2" + http-errors: "npm:~2.0.1" mime: "npm:1.6.0" ms: "npm:2.1.3" - on-finished: "npm:2.4.1" + on-finished: "npm:~2.4.1" range-parser: "npm:~1.2.1" - statuses: "npm:2.0.1" - checksum: 10/1f6064dea0ae4cbe4878437aedc9270c33f2a6650a77b56a16b62d057527f2766d96ee282997dd53ec0339082f2aad935bc7d989b46b48c82fc610800dc3a1d0 + statuses: "npm:~2.0.2" + checksum: 10/e932a592f62c58560b608a402d52333a8ae98a5ada076feb5db1d03adaa77c3ca32a7befa1c4fd6dedc186e88f342725b0cb4b3d86835eaf834688b259bef18d languageName: node linkType: hard @@ -14333,33 +12587,33 @@ __metadata: linkType: hard "serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "serve-index@npm:1.9.1" + version: 1.9.2 + resolution: "serve-index@npm:1.9.2" dependencies: - accepts: "npm:~1.3.4" + accepts: "npm:~1.3.8" batch: "npm:0.6.1" debug: "npm:2.6.9" escape-html: "npm:~1.0.3" - http-errors: "npm:~1.6.2" - mime-types: "npm:~2.1.17" - parseurl: "npm:~1.3.2" - checksum: 10/2adce2878d7e30f197e66f30e39f4a404d9ae39295c0c13849bb25e7cf976b93e883204739efd1510559588bed56f8101e32191cbe75f374c6e1e803852194cb + http-errors: "npm:~1.8.0" + mime-types: "npm:~2.1.35" + parseurl: "npm:~1.3.3" + checksum: 10/fdfada071e795da265845acca05be9b498443cb5b84f8c9fd4632f01ea107ecca110725a7963a2b4b3146ec01f41c5f95df4405ff61eda13e6f229474a9ed5a6 languageName: node linkType: hard -"serve-static@npm:1.16.2": - version: 1.16.2 - resolution: "serve-static@npm:1.16.2" +"serve-static@npm:~1.16.2": + version: 1.16.3 + resolution: "serve-static@npm:1.16.3" dependencies: encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" parseurl: "npm:~1.3.3" - send: "npm:0.19.0" - checksum: 10/7fa9d9c68090f6289976b34fc13c50ac8cd7f16ae6bce08d16459300f7fc61fbc2d7ebfa02884c073ec9d6ab9e7e704c89561882bbe338e99fcacb2912fde737 + send: "npm:~0.19.1" + checksum: 10/149d6718dd9e53166784d0a65535e21a7c01249d9c51f57224b786a7306354c6807e7811a9f6c143b45c863b1524721fca2f52b5c81a8b5194e3dde034a03b9c languageName: node linkType: hard -"set-function-length@npm:^1.2.1": +"set-function-length@npm:^1.2.2": version: 1.2.2 resolution: "set-function-length@npm:1.2.2" dependencies: @@ -14373,14 +12627,7 @@ __metadata: languageName: node linkType: hard -"setprototypeof@npm:1.1.0": - version: 1.1.0 - resolution: "setprototypeof@npm:1.1.0" - checksum: 10/02d2564e02a260551bab3ec95358dcfde775fe61272b1b7c488de3676a4bb79f280b5668a324aebe0ec73f0d8ba408bc2d816a609ee5d93b1a7936b9d4ba1208 - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": +"setprototypeof@npm:1.2.0, setprototypeof@npm:~1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" checksum: 10/fde1630422502fbbc19e6844346778f99d449986b2f9cdcceb8326730d2f3d9964dbcb03c02aaadaefffecd0f2c063315ebea8b3ad895914bf1afc1747fc172e @@ -14426,15 +12673,51 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.6": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" +"side-channel-list@npm:^1.0.0": + version: 1.0.0 + resolution: "side-channel-list@npm:1.0.0" dependencies: - call-bind: "npm:^1.0.7" es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10/eb10944f38cebad8ad643dd02657592fa41273ce15b8bfa928d3291aff2d30c20ff777cfe908f76ccc4551ace2d1245822fdc576657cce40e9066c638ca8fa4d + object-inspect: "npm:^1.13.3" + checksum: 10/603b928997abd21c5a5f02ae6b9cc36b72e3176ad6827fab0417ead74580cc4fb4d5c7d0a8a2ff4ead34d0f9e35701ed7a41853dac8a6d1a664fcce1a044f86f + languageName: node + linkType: hard + +"side-channel-map@npm:^1.0.1": + version: 1.0.1 + resolution: "side-channel-map@npm:1.0.1" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + checksum: 10/5771861f77feefe44f6195ed077a9e4f389acc188f895f570d56445e251b861754b547ea9ef73ecee4e01fdada6568bfe9020d2ec2dfc5571e9fa1bbc4a10615 + languageName: node + linkType: hard + +"side-channel-weakmap@npm:^1.0.2": + version: 1.0.2 + resolution: "side-channel-weakmap@npm:1.0.2" + dependencies: + call-bound: "npm:^1.0.2" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.5" + object-inspect: "npm:^1.13.3" + side-channel-map: "npm:^1.0.1" + checksum: 10/a815c89bc78c5723c714ea1a77c938377ea710af20d4fb886d362b0d1f8ac73a17816a5f6640f354017d7e292a43da9c5e876c22145bac00b76cfb3468001736 + languageName: node + linkType: hard + +"side-channel@npm:^1.1.0": + version: 1.1.0 + resolution: "side-channel@npm:1.1.0" + dependencies: + es-errors: "npm:^1.3.0" + object-inspect: "npm:^1.13.3" + side-channel-list: "npm:^1.0.0" + side-channel-map: "npm:^1.0.1" + side-channel-weakmap: "npm:^1.0.2" + checksum: 10/7d53b9db292c6262f326b6ff3bc1611db84ece36c2c7dc0e937954c13c73185b0406c56589e2bb8d071d6fee468e14c39fb5d203ee39be66b7b8174f179afaba languageName: node linkType: hard @@ -14445,13 +12728,6 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10/c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f - languageName: node - linkType: hard - "sirv@npm:^2.0.3": version: 2.0.4 resolution: "sirv@npm:2.0.4" @@ -14536,23 +12812,23 @@ __metadata: linkType: hard "socks-proxy-agent@npm:^8.0.3": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" + version: 8.0.5 + resolution: "socks-proxy-agent@npm:8.0.5" dependencies: - agent-base: "npm:^7.1.1" + agent-base: "npm:^7.1.2" debug: "npm:^4.3.4" socks: "npm:^2.8.3" - checksum: 10/c8e7c2b398338b49a0a0f4d2bae5c0602aeeca6b478b99415927b6c5db349ca258448f2c87c6958ebf83eea17d42cbc5d1af0bfecb276cac10b9658b0f07f7d7 + checksum: 10/ee99e1dacab0985b52cbe5a75640be6e604135e9489ebdc3048635d186012fbaecc20fbbe04b177dee434c319ba20f09b3e7dfefb7d932466c0d707744eac05c languageName: node linkType: hard "socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" + version: 2.8.7 + resolution: "socks@npm:2.8.7" dependencies: - ip-address: "npm:^9.0.5" + ip-address: "npm:^10.0.1" smart-buffer: "npm:^4.2.0" - checksum: 10/ffcb622c22481dfcd7589aae71fbfd71ca34334064d181df64bf8b7feaeee19706aba4cffd1de35cc7bbaeeaa0af96be2d7f40fcbc7bc0ab69533a7ae9ffc4fb + checksum: 10/d19366c95908c19db154f329bbe94c2317d315dc933a7c2b5101e73f32a555c84fb199b62174e1490082a593a4933d8d5a9b297bde7d1419c14a11a965f51356 languageName: node linkType: hard @@ -14563,14 +12839,7 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10/74f331cfd2d121c50790c8dd6d3c9de6be21926de80583b23b37029b0f37aefc3e019fa91f9a10a5e120c08135297e1ecf312d561459c45908cb1e0e365f49e5 - languageName: node - linkType: hard - -"source-map-js@npm:^1.2.1": +"source-map-js@npm:^1.0.1, source-map-js@npm:^1.2.1": version: 1.2.1 resolution: "source-map-js@npm:1.2.1" checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 @@ -14595,9 +12864,9 @@ __metadata: linkType: hard "source-map@npm:^0.7.0": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 10/a0f7c9b797eda93139842fd28648e868a9a03ea0ad0d9fa6602a0c1f17b7fb6a7dcca00c144476cccaeaae5042e99a285723b1a201e844ad67221bf5d428f1dc + version: 0.7.6 + resolution: "source-map@npm:0.7.6" + checksum: 10/c8d2da7c57c14f3fd7568f764b39ad49bbf9dd7632b86df3542b31fed117d4af2fb74a4f886fc06baf7a510fee68e37998efc3080aacdac951c36211dc29a7a3 languageName: node linkType: hard @@ -14635,20 +12904,6 @@ __metadata: languageName: node linkType: hard -"spotify-audio-element@npm:^1.0.3": - version: 1.0.3 - resolution: "spotify-audio-element@npm:1.0.3" - checksum: 10/c09d0485b43727b5b1f0bb36e536cbf98489216fa723dc69ed99feb36be8903fe896313cd46f7565d2008028e05ed1b8c9ae6e013114d42581ad35e0d9c2147d - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10/e7587128c423f7e43cc625fe2f87e6affdf5ca51c1cc468e910d8aaca46bb44a7fbcfa552f787b1d3987f7043aeb4527d1b99559e6621e01b42b3f45e5a24cbb - languageName: node - linkType: hard - "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" @@ -14663,37 +12918,44 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" +"ssri@npm:^13.0.0": + version: 13.0.1 + resolution: "ssri@npm:13.0.1" dependencies: minipass: "npm:^7.0.3" - checksum: 10/f92c1b3cc9bfd0a925417412d07d999935917bc87049f43ebec41074661d64cf720315661844106a77da9f8204b6d55ae29f9514e673083cae39464343af2a8b + checksum: 10/ae560d0378d074006a71b06af71bfbe84a3fe1ac6e16c1f07575f69e670d40170507fe52b21bcc23399429bc6a15f4bc3ea8d9bc88e9dfd7e87de564e6da6a72 languageName: node linkType: hard -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 10/18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb +"state-local@npm:^1.0.6": + version: 1.0.7 + resolution: "state-local@npm:1.0.7" + checksum: 10/1d956043e270861d40a639ff3457938cf61dbc7e25209d21b55060d8dfaf74742b8a1e525ed6fcb0c2d89b7d3e305bb8589bf27392012889456b3ad82a4b7d0a languageName: node linkType: hard -"statuses@npm:>= 1.4.0 < 2": +"statuses@npm:>= 1.5.0 < 2": version: 1.5.0 resolution: "statuses@npm:1.5.0" checksum: 10/c469b9519de16a4bb19600205cffb39ee471a5f17b82589757ca7bd40a8d92ebb6ed9f98b5a540c5d302ccbc78f15dc03cc0280dd6e00df1335568a5d5758a5c languageName: node linkType: hard +"statuses@npm:~2.0.1, statuses@npm:~2.0.2": + version: 2.0.2 + resolution: "statuses@npm:2.0.2" + checksum: 10/6927feb50c2a75b2a4caab2c565491f7a93ad3d8dbad7b1398d52359e9243a20e2ebe35e33726dee945125ef7a515e9097d8a1b910ba2bbd818265a2f6c39879 + languageName: node + linkType: hard + "std-env@npm:^3.7.0": - version: 3.8.0 - resolution: "std-env@npm:3.8.0" - checksum: 10/034176196cfcaaab16dbdd96fc9e925a9544799fb6dc5a3e36fe43270f3a287c7f779d785b89edaf22cef2b5f1dcada2aae67430b8602e785ee74bdb3f671768 + version: 3.10.0 + resolution: "std-env@npm:3.10.0" + checksum: 10/19c9cda4f370b1ffae2b8b08c72167d8c3e5cfa972aaf5c6873f85d0ed2faa729407f5abb194dc33380708c00315002febb6f1e1b484736bfcf9361ad366013a languageName: node linkType: hard -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0": +"string-width@npm:^4.1.0, string-width@npm:^4.2.0": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -14754,7 +13016,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": +"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" dependencies: @@ -14764,11 +13026,11 @@ __metadata: linkType: hard "strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" + version: 7.1.2 + resolution: "strip-ansi@npm:7.1.2" dependencies: ansi-regex: "npm:^6.0.1" - checksum: 10/475f53e9c44375d6e72807284024ac5d668ee1d06010740dec0b9744f2ddf47de8d7151f80e5f6190fc8f384e802fdf9504b76a7e9020c9faee7103623338be2 + checksum: 10/db0e3f9654e519c8a33c50fc9304d07df5649388e7da06d3aabf66d29e5ad65d5e6315d8519d409c15b32fa82c1df7e11ed6f8cd50b0e4404463f0c9d77c8d0b languageName: node linkType: hard @@ -14800,21 +13062,21 @@ __metadata: languageName: node linkType: hard -"style-to-object@npm:^0.4.0": - version: 0.4.4 - resolution: "style-to-object@npm:0.4.4" +"style-to-js@npm:^1.0.0": + version: 1.1.21 + resolution: "style-to-js@npm:1.1.21" dependencies: - inline-style-parser: "npm:0.1.1" - checksum: 10/3101c0de5325e8051c3665125468af73578eba4712b818458b9f7ed732d7800f3b34e088e5c16f60070644db25316fa5a5b8b69e7f3414c879401eb074a2211e + style-to-object: "npm:1.0.14" + checksum: 10/5e30b4c52ed4e0294324adab2a43a0438b5495a77a72a6b1258637eebfc4dc8e0614f5ac7bf38a2f514879b3b448215d01fecf1f8d7468b8b95d90bed1d05d57 languageName: node linkType: hard -"style-to-object@npm:^1.0.0": - version: 1.0.6 - resolution: "style-to-object@npm:1.0.6" +"style-to-object@npm:1.0.14": + version: 1.0.14 + resolution: "style-to-object@npm:1.0.14" dependencies: - inline-style-parser: "npm:0.2.3" - checksum: 10/f8a969098423ca793ca01334c6df4c4e7973dd5711acf8070f603c79e7d84fb3243954717c73f685775b605bc606eadf42ae4d554261b7fb08eec7708488d583 + inline-style-parser: "npm:0.2.7" + checksum: 10/06b86a5cf435dafac908d19082842983f9052d8cf3682915b1bd9251e3fe9b8065dbd2aef060dc5dfa0fa2ee24d717b587a5205f571513a10f30e3947f9d28ff languageName: node linkType: hard @@ -14837,22 +13099,6 @@ __metadata: languageName: node linkType: hard -"super-media-element@npm:~1.4.2": - version: 1.4.2 - resolution: "super-media-element@npm:1.4.2" - checksum: 10/df32ce92cbaa663518a2bb5bbf69c44ddbd76465e0ed0f9a7f826ecd13cf1804177ce5b0d6782774e07032121b25b31e1d08e29f80462533f607a8b556c44d99 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10/5f505c6fa3c6e05873b43af096ddeb22159831597649881aeb8572d6fe3b81e798cc10840d0c9735e0026b250368851b7f77b65e84f4e4daa820a4f69947f55b - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -14902,64 +13148,29 @@ __metadata: languageName: node linkType: hard -"swr@npm:^2.2.5": - version: 2.3.6 - resolution: "swr@npm:2.3.6" - dependencies: - dequal: "npm:^2.0.3" - use-sync-external-store: "npm:^1.4.0" - peerDependencies: - react: ^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10/9948b2d92827c6118b6a66d067fbfd311950d6456180fa7be8ec59aab58634da3d2ba117535ca793c801cf0d676a392c5e48c46f5baf7050b813943d93344388 - languageName: node - linkType: hard - -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.2.1": - version: 6.2.1 - resolution: "tar@npm:6.2.1" - dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 10/bfbfbb2861888077fc1130b84029cdc2721efb93d1d1fb80f22a7ac3a98ec6f8972f29e564103bbebf5e97be67ebc356d37fa48dbc4960600a1eb7230fbd1ea0 +"tapable@npm:^2.0.0, tapable@npm:^2.2.1, tapable@npm:^2.3.0": + version: 2.3.0 + resolution: "tapable@npm:2.3.0" + checksum: 10/496a841039960533bb6e44816a01fffc2a1eb428bb2051ecab9e87adf07f19e1f937566cbbbb09dceff31163c0ffd81baafcad84db900b601f0155dd0b37e9f2 languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.10, terser-webpack-plugin@npm:^5.3.9": - version: 5.3.10 - resolution: "terser-webpack-plugin@npm:5.3.10" +"tar@npm:^7.5.4": + version: 7.5.9 + resolution: "tar@npm:7.5.9" dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.20" - jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.1" - terser: "npm:^5.26.0" - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 10/fb1c2436ae1b4e983be043fa0a3d355c047b16b68f102437d08c736d7960c001e7420e2f722b9d99ce0dc70ca26a68cc63c0b82bc45f5b48671142b352a9d938 + "@isaacs/fs-minipass": "npm:^4.0.0" + chownr: "npm:^3.0.0" + minipass: "npm:^7.1.2" + minizlib: "npm:^3.1.0" + yallist: "npm:^5.0.0" + checksum: 10/1213cdde9c22d6acf8809ba5d2a025212ce3517bc99c4a4c6981b7dc0489bf3b164db9c826c9517680889194c9ba57448c8ff0da35eca9a60bb7689bf0b3897d languageName: node linkType: hard -"terser-webpack-plugin@npm:^5.3.11": - version: 5.3.11 - resolution: "terser-webpack-plugin@npm:5.3.11" +"terser-webpack-plugin@npm:^5.3.16, terser-webpack-plugin@npm:^5.3.9": + version: 5.3.16 + resolution: "terser-webpack-plugin@npm:5.3.16" dependencies: "@jridgewell/trace-mapping": "npm:^0.3.25" jest-worker: "npm:^27.4.5" @@ -14975,35 +13186,21 @@ __metadata: optional: true uglify-js: optional: true - checksum: 10/a8f7c92c75aa42628adfa4d171d4695c366c1852ecb4a24e72dd6fec86e383e12ac24b627e798fedff4e213c21fe851cebc61be3ab5a2537e6e42bea46690aa3 - languageName: node - linkType: hard - -"terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.26.0": - version: 5.31.2 - resolution: "terser@npm:5.31.2" - dependencies: - "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" - commander: "npm:^2.20.0" - source-map-support: "npm:~0.5.20" - bin: - terser: bin/terser - checksum: 10/dab8d0a7e2845f14535433795aa8dcf1b80a33e75749f5dbd67ee97aa66c1dec37191afa46dd88dad8472c9ff0bf16a812dd4388cb30d8675a6a95a7ead0421b + checksum: 10/09dfbff602acfa114cdd174254b69a04adbc47856021ab351e37982202fd1ec85e0b62ffd5864c98beb8e96aef2f43da490b3448b4541db539c2cff6607394a6 languageName: node linkType: hard -"terser@npm:^5.31.1": - version: 5.39.0 - resolution: "terser@npm:5.39.0" +"terser@npm:^5.10.0, terser@npm:^5.15.1, terser@npm:^5.31.1": + version: 5.46.0 + resolution: "terser@npm:5.46.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" + acorn: "npm:^8.15.0" commander: "npm:^2.20.0" source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: 10/d84aff642398329f7179bbeaca28cac76a86100e2372d98d39d9b86c48023b6b9f797d983d6e7c0610b3f957c53d01ada1befa25d625614cb2ccd20714f1e98b + checksum: 10/331e4f5a165d91d16ac6a95b510d4f5ef24679e4bc9e1b4e4182e89b7245f614d24ce0def583e2ca3ca45f82ba810991e0c5b66dd4353a6e0b7082786af6bd35 languageName: node linkType: hard @@ -15016,13 +13213,6 @@ __metadata: languageName: node linkType: hard -"throttleit@npm:2.1.0": - version: 2.1.0 - resolution: "throttleit@npm:2.1.0" - checksum: 10/a2003947aafc721c4a17e6f07db72dc88a64fa9bba0f9c659f7997d30f9590b3af22dadd6a41851e0e8497d539c33b2935c2c7919cf4255922509af6913c619b - languageName: node - linkType: hard - "thunky@npm:^1.0.2": version: 1.1.0 resolution: "thunky@npm:1.1.0" @@ -15030,13 +13220,6 @@ __metadata: languageName: node linkType: hard -"tiktok-video-element@npm:^0.1.1": - version: 0.1.1 - resolution: "tiktok-video-element@npm:0.1.1" - checksum: 10/57cae013ce9a628387e77de136d7bffe2431ad757f7bc1e91937b0a53e75ae2963c3d1a91854940db37a06d615972561e5c173ddf28dc2502fccd9c873750df0 - languageName: node - linkType: hard - "tiny-invariant@npm:^1.0.2": version: 1.3.3 resolution: "tiny-invariant@npm:1.3.3" @@ -15051,24 +13234,27 @@ __metadata: languageName: node linkType: hard -"tinyexec@npm:^0.3.2": - version: 0.3.2 - resolution: "tinyexec@npm:0.3.2" - checksum: 10/b9d5fed3166fb1acd1e7f9a89afcd97ccbe18b9c1af0278e429455f6976d69271ba2d21797e7c36d57d6b05025e525d2882d88c2ab435b60d1ddf2fea361de57 +"tinyexec@npm:^1.0.1": + version: 1.0.2 + resolution: "tinyexec@npm:1.0.2" + checksum: 10/cb709ed4240e873d3816e67f851d445f5676e0ae3a52931a60ff571d93d388da09108c8057b62351766133ee05ff3159dd56c3a0fbd39a5933c6639ce8771405 languageName: node linkType: hard -"tinypool@npm:^1.0.2": - version: 1.1.0 - resolution: "tinypool@npm:1.1.0" - checksum: 10/2e99e76f01699bb3244463a4b1b473fb9a166473d417b5ce373bbd12ef4626c221100533540d90f6bddbc83149ebf97e7ce052c0d1c5ae1a5066c5690cfee538 +"tinyglobby@npm:^0.2.12": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: "npm:^6.5.0" + picomatch: "npm:^4.0.3" + checksum: 10/d72bd826a8b0fa5fa3929e7fe5ba48fceb2ae495df3a231b6c5408cd7d8c00b58ab5a9c2a76ba56a62ee9b5e083626f1f33599734bed1ffc4b792406408f0ca2 languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10/be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 +"tinypool@npm:^1.0.2": + version: 1.1.1 + resolution: "tinypool@npm:1.1.1" + checksum: 10/0d54139e9dbc6ef33349768fa78890a4d708d16a7ab68e4e4ef3bb740609ddf0f9fd13292c2f413fbba756166c97051a657181c8f7ae92ade690604f183cc01d languageName: node linkType: hard @@ -15081,7 +13267,7 @@ __metadata: languageName: node linkType: hard -"toidentifier@npm:1.0.1": +"toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" checksum: 10/952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 @@ -15125,24 +13311,26 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.0.0": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 +"tslib@npm:^1.9.3": + version: 1.14.1 + resolution: "tslib@npm:1.14.1" + checksum: 10/7dbf34e6f55c6492637adb81b555af5e3b4f9cc6b998fb440dac82d3b42bdc91560a35a5fb75e20e24a076c651438234da6743d139e4feabf0783f3cdfe1dddb languageName: node linkType: hard -"tslib@npm:^2.0.3, tslib@npm:^2.6.0": - version: 2.6.3 - resolution: "tslib@npm:2.6.3" - checksum: 10/52109bb681f8133a2e58142f11a50e05476de4f075ca906d13b596ae5f7f12d30c482feb0bff167ae01cfc84c5803e575a307d47938999246f5a49d174fc558c +"tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.6.0, tslib@npm:^2.8.1": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 languageName: node linkType: hard -"twitch-video-element@npm:^0.1.4": - version: 0.1.4 - resolution: "twitch-video-element@npm:0.1.4" - checksum: 10/ebe930bf5d6fb336a859f4f154c827811be05abd352fc8c3a8c7a4c9e58173260efbe3e62b696ed6cc42e3df789ea8531ede191dd5ae5811858e3b7bdf7babc8 +"tsyringe@npm:^4.10.0": + version: 4.10.0 + resolution: "tsyringe@npm:4.10.0" + dependencies: + tslib: "npm:^1.9.3" + checksum: 10/b42660dc112cee2db02b3d69f2ef6a6a9d185afd96b18d8f88e47c1e62be94b69a9f5a58fcfdb2a3fbb7c6c175b8162ea00f7db6499bf333ce945e570e31615c languageName: node linkType: hard @@ -15206,33 +13394,24 @@ __metadata: languageName: node linkType: hard -"ua-parser-js@npm:^1.0.37": - version: 1.0.40 - resolution: "ua-parser-js@npm:1.0.40" - bin: - ua-parser-js: script/cli.js - checksum: 10/7fced5f74ed570c83addffd4d367888d90c58803ff4bdd4a7b04b3f01d293263b8605e92ac560eb1c6a201ef3b11fcc46f3dbcbe764fbe54974924d542bc0135 - languageName: node - linkType: hard - -"ufo@npm:^1.5.4": - version: 1.5.4 - resolution: "ufo@npm:1.5.4" - checksum: 10/a885ed421e656aea6ca64e9727b8118a9488715460b6f1a0f0427118adfe2f2830fe7c1d5bd9c5c754a332e6807516551cd663ea67ce9ed6a4e3edc739916335 +"ufo@npm:^1.6.1": + version: 1.6.3 + resolution: "ufo@npm:1.6.3" + checksum: 10/79803984f3e414567273a666183d6a50d1bec0d852100a98f55c1e393cb705e3b88033e04029dd651714e6eec99e1b00f54fdc13f32404968251a16f8898cfe5 languageName: node linkType: hard -"undici-types@npm:~5.26.4": - version: 5.26.5 - resolution: "undici-types@npm:5.26.5" - checksum: 10/0097779d94bc0fd26f0418b3a05472410408877279141ded2bd449167be1aed7ea5b76f756562cb3586a07f251b90799bab22d9019ceba49c037c76445f7cddd +"undici-types@npm:~7.18.0": + version: 7.18.2 + resolution: "undici-types@npm:7.18.2" + checksum: 10/e61a5918f624d68420c3ca9d301e9f15b61cba6e97be39fe2ce266dd6151e4afe424d679372638826cb506be33952774e0424141200111a9857e464216c009af languageName: node linkType: hard "unicode-canonical-property-names-ecmascript@npm:^2.0.0": - version: 2.0.0 - resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.0" - checksum: 10/39be078afd014c14dcd957a7a46a60061bc37c4508ba146517f85f60361acf4c7539552645ece25de840e17e293baa5556268d091ca6762747fdd0c705001a45 + version: 2.0.1 + resolution: "unicode-canonical-property-names-ecmascript@npm:2.0.1" + checksum: 10/3c3dabdb1d22aef4904399f9e810d0b71c0b12b3815169d96fac97e56d5642840c6071cf709adcace2252bc6bb80242396c2ec74b37224eb015c5f7aca40bad7 languageName: node linkType: hard @@ -15253,17 +13432,17 @@ __metadata: languageName: node linkType: hard -"unicode-match-property-value-ecmascript@npm:^2.1.0": - version: 2.1.0 - resolution: "unicode-match-property-value-ecmascript@npm:2.1.0" - checksum: 10/06661bc8aba2a60c7733a7044f3e13085808939ad17924ffd4f5222a650f88009eb7c09481dc9c15cfc593d4ad99bd1cde8d54042733b335672591a81c52601c +"unicode-match-property-value-ecmascript@npm:^2.2.1": + version: 2.2.1 + resolution: "unicode-match-property-value-ecmascript@npm:2.2.1" + checksum: 10/a42bebebab4c82ea6d8363e487b1fb862f82d1b54af1b67eb3fef43672939b685780f092c4f235266b90225863afa1258d57e7be3578d8986a08d8fc309aabe1 languageName: node linkType: hard "unicode-property-aliases-ecmascript@npm:^2.0.0": - version: 2.1.0 - resolution: "unicode-property-aliases-ecmascript@npm:2.1.0" - checksum: 10/243524431893649b62cc674d877bd64ef292d6071dd2fd01ab4d5ad26efbc104ffcd064f93f8a06b7e4ec54c172bf03f6417921a0d8c3a9994161fe1f88f815b + version: 2.2.0 + resolution: "unicode-property-aliases-ecmascript@npm:2.2.0" + checksum: 10/0dd0f6e70130c59b4a841bac206758f70227b113145e4afe238161e3e8540e8eb79963e7a228cd90ad13d499e96f7ef4ee8940835404b2181ad9bf9c174818e3 languageName: node linkType: hard @@ -15282,21 +13461,21 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" +"unique-filename@npm:^5.0.0": + version: 5.0.0 + resolution: "unique-filename@npm:5.0.0" dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10/8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df + unique-slug: "npm:^6.0.0" + checksum: 10/a5f67085caef74bdd2a6869a200ed5d68d171f5cc38435a836b5fd12cce4e4eb55e6a190298035c325053a5687ed7a3c96f0a91e82215fd14729769d9ac57d9b languageName: node linkType: hard -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" +"unique-slug@npm:^6.0.0": + version: 6.0.0 + resolution: "unique-slug@npm:6.0.0" dependencies: imurmurhash: "npm:^0.1.4" - checksum: 10/40912a8963fc02fb8b600cf50197df4a275c602c60de4cac4f75879d3c48558cfac48de08a25cc10df8112161f7180b3bbb4d662aadb711568602f9eddee54f0 + checksum: 10/b78ed9d5b01ff465f80975f17387750ed3639909ac487fa82c4ae4326759f6de87c2131c0c39eca4c68cf06c537a8d104fba1dfc8a30308f99bc505345e1eba3 languageName: node linkType: hard @@ -15310,11 +13489,11 @@ __metadata: linkType: hard "unist-util-is@npm:^6.0.0": - version: 6.0.0 - resolution: "unist-util-is@npm:6.0.0" + version: 6.0.1 + resolution: "unist-util-is@npm:6.0.1" dependencies: "@types/unist": "npm:^3.0.0" - checksum: 10/edd6a93fb2255addf4b9eeb304c1da63c62179aef793169dd64ab955cf2f6814885fe25f95f8105893e3562dead348af535718d7a84333826e0491c04bf42511 + checksum: 10/dc3ebfb481f097863ae3674c440add6fe2d51a4cfcd565b13fb759c8a2eaefb71903a619b385e892c2ad6db6a5b60d068dfc5592b6dd57f4b60180082b3136d6 languageName: node linkType: hard @@ -15336,16 +13515,6 @@ __metadata: languageName: node linkType: hard -"unist-util-remove-position@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-remove-position@npm:5.0.0" - dependencies: - "@types/unist": "npm:^3.0.0" - unist-util-visit: "npm:^5.0.0" - checksum: 10/4d89dc25e2091f9d47d92552145a26bf0e4a32d6b453e9cacac7742d730ada186ee1b820579fee3eeaa31e119850c2cb82f8b5898f977a636d7220e998626967 - languageName: node - linkType: hard - "unist-util-stringify-position@npm:^4.0.0": version: 4.0.0 resolution: "unist-util-stringify-position@npm:4.0.0" @@ -15356,23 +13525,23 @@ __metadata: linkType: hard "unist-util-visit-parents@npm:^6.0.0": - version: 6.0.1 - resolution: "unist-util-visit-parents@npm:6.0.1" + version: 6.0.2 + resolution: "unist-util-visit-parents@npm:6.0.2" dependencies: "@types/unist": "npm:^3.0.0" unist-util-is: "npm:^6.0.0" - checksum: 10/645b3cbc5e923bc692b1eb1a9ca17bffc5aabc25e6090ff3f1489bff8effd1890b28f7a09dc853cb6a7fa0da8581bfebc9b670a68b53c4c086cb9610dfd37701 + checksum: 10/aa16e97e45bd1d641e1f933d2fb3bf0800865350eaeb5cc0317ab511075480fb4ac5e2a55f57dd72d27311e8ba29fd23908848bd83479849c626be1f7dabcae5 languageName: node linkType: hard "unist-util-visit@npm:^5.0.0": - version: 5.0.0 - resolution: "unist-util-visit@npm:5.0.0" + version: 5.1.0 + resolution: "unist-util-visit@npm:5.1.0" dependencies: "@types/unist": "npm:^3.0.0" unist-util-is: "npm:^6.0.0" unist-util-visit-parents: "npm:^6.0.0" - checksum: 10/f2bbde23641e9ade7640358c06ddeec0f38342322eb8e7819d9ee380b0f859d25d084dde22bf63db0280b3b2f36575f15aa1d6c23acf276c91c2493cf799e3b0 + checksum: 10/340fc1929062d21156200284105caad79cc188bd98f285b60aba887492a70e6e6cadbc7e383a68909c7e0fdd83f855cb9f4184ad8e5aa153eb2d810445aea8e5 languageName: node linkType: hard @@ -15383,44 +13552,16 @@ __metadata: languageName: node linkType: hard -"unpipe@npm:1.0.0, unpipe@npm:~1.0.0": +"unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" checksum: 10/4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0": - version: 1.1.0 - resolution: "update-browserslist-db@npm:1.1.0" - dependencies: - escalade: "npm:^3.1.2" - picocolors: "npm:^1.0.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10/d70b9efeaf4601aadb1a4f6456a7a5d9118e0063d995866b8e0c5e0cf559482671dab6ce7b079f9536b06758a344fbd83f974b965211e1c6e8d1958540b0c24c - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.1.1": - version: 1.1.2 - resolution: "update-browserslist-db@npm:1.1.2" - dependencies: - escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10/e7bf8221dfb21eba4a770cd803df94625bb04f65a706aa94c567de9600fe4eb6133fda016ec471dad43b9e7959c1bffb6580b5e20a87808d2e8a13e3892699a9 - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.1.3": - version: 1.1.3 - resolution: "update-browserslist-db@npm:1.1.3" +"update-browserslist-db@npm:^1.2.0": + version: 1.2.3 + resolution: "update-browserslist-db@npm:1.2.3" dependencies: escalade: "npm:^3.2.0" picocolors: "npm:^1.1.1" @@ -15428,7 +13569,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/87af2776054ffb9194cf95e0201547d041f72ee44ce54b144da110e65ea7ca01379367407ba21de5c9edd52c74d95395366790de67f3eb4cc4afa0fe4424e76f + checksum: 10/059f774300efb4b084a49293143c511f3ae946d40397b5c30914e900cd5691a12b8e61b41dd54ed73d3b56c8204165a0333107dd784ccf8f8c81790bcc423175 languageName: node linkType: hard @@ -15454,7 +13595,7 @@ __metadata: languageName: node linkType: hard -"uri-js@npm:^4.2.2, uri-js@npm:^4.4.1": +"uri-js@npm:^4.2.2": version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: @@ -15480,15 +13621,6 @@ __metadata: languageName: node linkType: hard -"use-sync-external-store@npm:^1.4.0": - version: 1.6.0 - resolution: "use-sync-external-store@npm:1.6.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - checksum: 10/b40ad2847ba220695bff2d4ba4f4d60391c0fb4fb012faa7a4c18eb38b69181936f5edc55a522c4d20a788d1a879b73c3810952c9d0fd128d01cb3f22042c09e - languageName: node - linkType: hard - "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -15550,42 +13682,32 @@ __metadata: linkType: hard "vfile-location@npm:^5.0.0": - version: 5.0.2 - resolution: "vfile-location@npm:5.0.2" + version: 5.0.3 + resolution: "vfile-location@npm:5.0.3" dependencies: "@types/unist": "npm:^3.0.0" vfile: "npm:^6.0.0" - checksum: 10/b61c048cedad3555b4f007f390412c6503f58a6a130b58badf4ee340c87e0d7421e9c86bbc1494c57dedfccadb60f5176cc60ba3098209d99fb3a3d8804e4c38 + checksum: 10/f481d592fd507fe242da9a00d7400ded3c91587931f24e64c54f24752d7b30321721a1c99c0d949be1f6ed5fa7f8b169054fd07c744705b65dbdd10a9e4ebfe0 languageName: node linkType: hard "vfile-message@npm:^4.0.0": - version: 4.0.2 - resolution: "vfile-message@npm:4.0.2" + version: 4.0.3 + resolution: "vfile-message@npm:4.0.3" dependencies: "@types/unist": "npm:^3.0.0" unist-util-stringify-position: "npm:^4.0.0" - checksum: 10/1a5a72bf4945a7103750a3001bd979088ce42f6a01efa8590e68b2425e1afc61ddc5c76f2d3c4a7053b40332b24c09982b68743223e99281158fe727135719fc + checksum: 10/7ba3dbeb752722a7913de8ea77c56be58cf805b5e5ccff090b2c4f8a82a32d91e058acb94d1614a40aa28191a5db99fb64014c7dfcad73d982f5d9d6702d2277 languageName: node linkType: hard "vfile@npm:^6.0.0, vfile@npm:^6.0.1": - version: 6.0.1 - resolution: "vfile@npm:6.0.1" + version: 6.0.3 + resolution: "vfile@npm:6.0.3" dependencies: "@types/unist": "npm:^3.0.0" - unist-util-stringify-position: "npm:^4.0.0" vfile-message: "npm:^4.0.0" - checksum: 10/7f8412f9ce7709d3be4041fd68a159e2cf96f9c9a4f095bcb18d1561009757b8efb37b71d0ae087e5202fe0e3b3162aae0adf92e30e2448a45645912c23c4ab2 - languageName: node - linkType: hard - -"vimeo-video-element@npm:^1.5.5": - version: 1.6.0 - resolution: "vimeo-video-element@npm:1.6.0" - dependencies: - "@vimeo/player": "npm:2.29.0" - checksum: 10/8185e817ae0ca2b9961d97cdf14ebbc2ff9e17b071ac3e0e4688c1f48acb9feb3ebc69d246afc2016609eb4ca2e59647ba600df57b8e0e3a384e4766e0851d2b + checksum: 10/a5a85293c9eb8787aa42e180edaef00c13199a493d6ed82fecf13ab29a68526850788e22434d77808ea6b17a74e03ff899b9b4711df5b9eee75afcddd7c2e1fb languageName: node linkType: hard @@ -15631,20 +13753,20 @@ __metadata: languageName: node linkType: hard -"vscode-uri@npm:~3.0.8": - version: 3.0.8 - resolution: "vscode-uri@npm:3.0.8" - checksum: 10/e882d6b679e0d053cbc042893c0951a135d899a192b62cd07f0a8924f11ae722067a8d6b1b5b147034becf57faf9fff9fb543b17b749fd0f17db1f54f783f07c +"vscode-uri@npm:~3.1.0": + version: 3.1.0 + resolution: "vscode-uri@npm:3.1.0" + checksum: 10/80c2a2421f44b64008ef1f91dfa52a2d68105cbb4dcea197dbf5b00c65ccaccf218b615e93ec587f26fc3ba04796898f3631a9406e3b04cda970c3ca8eadf646 languageName: node linkType: hard -"watchpack@npm:^2.4.1": - version: 2.4.1 - resolution: "watchpack@npm:2.4.1" +"watchpack@npm:^2.5.1": + version: 2.5.1 + resolution: "watchpack@npm:2.5.1" dependencies: glob-to-regexp: "npm:^0.4.1" graceful-fs: "npm:^4.1.2" - checksum: 10/0736ebd20b75d3931f9b6175c819a66dee29297c1b389b2e178bc53396a6f867ecc2fd5d87a713ae92dcb73e487daec4905beee20ca00a9e27f1184a7c2bca5e + checksum: 10/9c9cdd4a9f9ae146b10d15387f383f52589e4cc27b324da6be8e7e3e755255b062a69dd7f00eef2ce67b2c01e546aae353456e74f8c1350bba00462cc6375549 languageName: node linkType: hard @@ -15657,13 +13779,6 @@ __metadata: languageName: node linkType: hard -"weakmap-polyfill@npm:2.0.4": - version: 2.0.4 - resolution: "weakmap-polyfill@npm:2.0.4" - checksum: 10/45b2e1fff1c4b5be8a5bab95841cd737839f01816c82955f568b19ac33b9218f76b7b6128785452c51a71e78ee8603b652b63cd684a629efc2fcb47f9bcd41c1 - languageName: node - linkType: hard - "web-namespaces@npm:^2.0.0": version: 2.0.1 resolution: "web-namespaces@npm:2.0.1" @@ -15713,12 +13828,12 @@ __metadata: linkType: hard "webpack-dev-server@npm:^5.2.2": - version: 5.2.2 - resolution: "webpack-dev-server@npm:5.2.2" + version: 5.2.3 + resolution: "webpack-dev-server@npm:5.2.3" dependencies: "@types/bonjour": "npm:^3.5.13" "@types/connect-history-api-fallback": "npm:^1.5.4" - "@types/express": "npm:^4.17.21" + "@types/express": "npm:^4.17.25" "@types/express-serve-static-core": "npm:^4.17.21" "@types/serve-index": "npm:^1.9.4" "@types/serve-static": "npm:^1.15.5" @@ -15728,9 +13843,9 @@ __metadata: bonjour-service: "npm:^1.2.1" chokidar: "npm:^3.6.0" colorette: "npm:^2.0.10" - compression: "npm:^1.7.4" + compression: "npm:^1.8.1" connect-history-api-fallback: "npm:^2.0.0" - express: "npm:^4.21.2" + express: "npm:^4.22.1" graceful-fs: "npm:^4.2.6" http-proxy-middleware: "npm:^2.0.9" ipaddr.js: "npm:^2.1.0" @@ -15738,7 +13853,7 @@ __metadata: open: "npm:^10.0.3" p-retry: "npm:^6.2.0" schema-utils: "npm:^4.2.0" - selfsigned: "npm:^2.4.1" + selfsigned: "npm:^5.5.0" serve-index: "npm:^1.9.1" sockjs: "npm:^0.3.24" spdy: "npm:^4.0.2" @@ -15753,7 +13868,7 @@ __metadata: optional: true bin: webpack-dev-server: bin/webpack-dev-server.js - checksum: 10/59517409cd38c01a875a03b9658f3d20d492b5b8bead9ded4a0f3d33e6857daf2d352fe89f0181dcaea6d0fbe84b0494cb4750a87120fe81cdbb3c32b499451c + checksum: 10/6a3d55c5d84d10b5e23a0638e0031ef85b262947fdacc86d96b7392538ad5894ac14aebef1e2b877f8d27302c71247215b7aa6713e01b1c37d31342415b1a150 languageName: node linkType: hard @@ -15779,82 +13894,48 @@ __metadata: languageName: node linkType: hard -"webpack-sources@npm:^3.2.3": - version: 3.2.3 - resolution: "webpack-sources@npm:3.2.3" - checksum: 10/a661f41795d678b7526ae8a88cd1b3d8ce71a7d19b6503da8149b2e667fc7a12f9b899041c1665d39e38245ed3a59ab68de648ea31040c3829aa695a5a45211d - languageName: node - linkType: hard - -"webpack@npm:^5.88.1": - version: 5.95.0 - resolution: "webpack@npm:5.95.0" - dependencies: - "@types/estree": "npm:^1.0.5" - "@webassemblyjs/ast": "npm:^1.12.1" - "@webassemblyjs/wasm-edit": "npm:^1.12.1" - "@webassemblyjs/wasm-parser": "npm:^1.12.1" - acorn: "npm:^8.7.1" - acorn-import-attributes: "npm:^1.9.5" - browserslist: "npm:^4.21.10" - chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.17.1" - es-module-lexer: "npm:^1.2.1" - eslint-scope: "npm:5.1.1" - events: "npm:^3.2.0" - glob-to-regexp: "npm:^0.4.1" - graceful-fs: "npm:^4.2.11" - json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" - mime-types: "npm:^2.1.27" - neo-async: "npm:^2.6.2" - schema-utils: "npm:^3.2.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.10" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" - peerDependenciesMeta: - webpack-cli: - optional: true - bin: - webpack: bin/webpack.js - checksum: 10/0377ad3a550b041f26237c96fb55754625b0ce6bae83c1c2447e3262ad056b0b0ad770dcbb92b59f188e9a2bd56155ce910add17dcf023cfbe78bdec774380c1 +"webpack-sources@npm:^3.3.3": + version: 3.3.4 + resolution: "webpack-sources@npm:3.3.4" + checksum: 10/714427b235b04c2d7cf229f204b9e65145ea3643da3c7b139ebfa8a51056238d1e3a2a47c3cc3fc8eab71ed4300f66405cdc7cff29cd2f7f6b71086252f81cf1 languageName: node linkType: hard -"webpack@npm:^5.95.0": - version: 5.98.0 - resolution: "webpack@npm:5.98.0" +"webpack@npm:^5.88.1, webpack@npm:^5.95.0": + version: 5.105.2 + resolution: "webpack@npm:5.105.2" dependencies: "@types/eslint-scope": "npm:^3.7.7" - "@types/estree": "npm:^1.0.6" + "@types/estree": "npm:^1.0.8" + "@types/json-schema": "npm:^7.0.15" "@webassemblyjs/ast": "npm:^1.14.1" "@webassemblyjs/wasm-edit": "npm:^1.14.1" "@webassemblyjs/wasm-parser": "npm:^1.14.1" - acorn: "npm:^8.14.0" - browserslist: "npm:^4.24.0" + acorn: "npm:^8.15.0" + acorn-import-phases: "npm:^1.0.3" + browserslist: "npm:^4.28.1" chrome-trace-event: "npm:^1.0.2" - enhanced-resolve: "npm:^5.17.1" - es-module-lexer: "npm:^1.2.1" + enhanced-resolve: "npm:^5.19.0" + es-module-lexer: "npm:^2.0.0" eslint-scope: "npm:5.1.1" events: "npm:^3.2.0" glob-to-regexp: "npm:^0.4.1" graceful-fs: "npm:^4.2.11" json-parse-even-better-errors: "npm:^2.3.1" - loader-runner: "npm:^4.2.0" + loader-runner: "npm:^4.3.1" mime-types: "npm:^2.1.27" neo-async: "npm:^2.6.2" - schema-utils: "npm:^4.3.0" - tapable: "npm:^2.1.1" - terser-webpack-plugin: "npm:^5.3.11" - watchpack: "npm:^2.4.1" - webpack-sources: "npm:^3.2.3" + schema-utils: "npm:^4.3.3" + tapable: "npm:^2.3.0" + terser-webpack-plugin: "npm:^5.3.16" + watchpack: "npm:^2.5.1" + webpack-sources: "npm:^3.3.3" peerDependenciesMeta: webpack-cli: optional: true bin: webpack: bin/webpack.js - checksum: 10/eb16a58b3eb02bfb538c7716e28d7f601a03922e975c74007b41ba5926071ae70302d9acae9800fbd7ddd0c66a675b1069fc6ebb88123b87895a52882e2dc06a + checksum: 10/77cf6f13e55cae2fafae015cc4a0b341b096c284877244ef4b46b4de1884dcf4e8d1a166a91f0a7cb6db41e9de2d0facb5caf518cbd4cd7ba963c59c07ff0a5a languageName: node linkType: hard @@ -15905,14 +13986,14 @@ __metadata: languageName: node linkType: hard -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" +"which@npm:^6.0.0": + version: 6.0.1 + resolution: "which@npm:6.0.1" dependencies: - isexe: "npm:^3.1.1" + isexe: "npm:^4.0.0" bin: node-which: bin/which.js - checksum: 10/f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 + checksum: 10/dbea77c7d3058bf6c78bf9659d2dce4d2b57d39a15b826b2af6ac2e5a219b99dc8a831b79fdbc453c0598adb4f3f84cf9c2491fd52beb9f5d2dececcad117f68 languageName: node linkType: hard @@ -15932,16 +14013,7 @@ __metadata: languageName: node linkType: hard -"wistia-video-element@npm:^1.3.4": - version: 1.3.4 - resolution: "wistia-video-element@npm:1.3.4" - dependencies: - super-media-element: "npm:~1.4.2" - checksum: 10/504bc793a8011574c4a3f1e822bfc1f409e86526b0f3ebd48b9684eceff58ad56b385bc5ea37730d3f3b1955ed227b51afb8b3eec81b55ea0efe2d5f4167e1c0 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": +"wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: @@ -15991,8 +14063,8 @@ __metadata: linkType: hard "ws@npm:^8.18.0": - version: 8.18.3 - resolution: "ws@npm:8.18.3" + version: 8.19.0 + resolution: "ws@npm:8.19.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -16001,7 +14073,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 10/725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6 + checksum: 10/26e4901e93abaf73af9f26a93707c95b4845e91a7a347ec8c569e6e9be7f9df066f6c2b817b2d685544e208207898a750b78461e6e8d810c11a370771450c31b languageName: node linkType: hard @@ -16046,24 +14118,17 @@ __metadata: languageName: node linkType: hard -"yocto-queue@npm:^1.0.0": - version: 1.1.1 - resolution: "yocto-queue@npm:1.1.1" - checksum: 10/f2e05b767ed3141e6372a80af9caa4715d60969227f38b1a4370d60bffe153c9c5b33a862905609afc9b375ec57cd40999810d20e5e10229a204e8bde7ef255c - languageName: node - linkType: hard - -"youtube-video-element@npm:^1.6.2": - version: 1.6.2 - resolution: "youtube-video-element@npm:1.6.2" - checksum: 10/3e2dcf061f73e84083025da014af77509abb9aa8a876926a602e082761576051069a9c393ba8e5ccadc62135605820eeb3079eff88dabc4ca08ae02d77438470 +"yallist@npm:^5.0.0": + version: 5.0.0 + resolution: "yallist@npm:5.0.0" + checksum: 10/1884d272d485845ad04759a255c71775db0fac56308764b4c77ea56a20d56679fad340213054c8c9c9c26fcfd4c4b2a90df993b7e0aaf3cdb73c618d1d1a802a languageName: node linkType: hard -"zod@npm:^4.1.8": - version: 4.1.12 - resolution: "zod@npm:4.1.12" - checksum: 10/c5f04e6ac306515c4db6ef73cf7705f521c7a2107c8c8912416a0658d689f361db9bee829b0bf01ef4a22492f1065c5cbcdb523ce532606ac6792fd714f3c326 +"yocto-queue@npm:^1.0.0": + version: 1.2.2 + resolution: "yocto-queue@npm:1.2.2" + checksum: 10/92dd9880c324dbc94ff4b677b7d350ba8d835619062b7102f577add7a59ab4d87f40edc5a03d77d369dfa9d11175b1b2ec4a06a6f8a5d8ce5d1306713f66ee41 languageName: node linkType: hard