From d5c6e9b1db0926c985ea0c02545d4a63c0d895e8 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 15 Dec 2023 16:51:17 +0100 Subject: [PATCH 001/136] docs: first commit for the docs --- docs/.gitignore | 21 + docs/.vscode/extensions.json | 4 + docs/.vscode/launch.json | 11 + docs/README.md | 54 + docs/astro.config.mjs | 51 + docs/package.json | 21 + docs/public/favicon.svg | 1 + docs/src/assets/houston.webp | Bin 0 -> 98506 bytes docs/src/content/config.ts | 7 + docs/src/content/docs/getting-started.mdx | 153 + docs/src/content/docs/guides/example.md | 11 + docs/src/content/docs/index.mdx | 36 + docs/src/content/docs/loaders/default.mdx | 228 ++ docs/src/content/docs/loaders/index.mdx | 32 + docs/src/content/docs/loaders/mysql.mdx | 85 + .../content/docs/reference/configuration.mdx | 143 + docs/src/content/docs/reporters/default.mdx | 5 + docs/src/content/docs/reporters/index.mdx | 24 + docs/src/content/docs/reporters/pino.mdx | 5 + docs/src/content/docs/storage/file-system.mdx | 53 + docs/src/content/docs/storage/index.mdx | 33 + docs/src/content/docs/storage/mysql.mdx | 92 + docs/src/env.d.ts | 3 + docs/tsconfig.json | 3 + package.json | 2 +- pnpm-lock.yaml | 3203 +++++++++++++++++ pnpm-workspace.yaml | 1 + 27 files changed, 4281 insertions(+), 1 deletion(-) create mode 100644 docs/.gitignore create mode 100644 docs/.vscode/extensions.json create mode 100644 docs/.vscode/launch.json create mode 100644 docs/README.md create mode 100644 docs/astro.config.mjs create mode 100644 docs/package.json create mode 100644 docs/public/favicon.svg create mode 100644 docs/src/assets/houston.webp create mode 100644 docs/src/content/config.ts create mode 100644 docs/src/content/docs/getting-started.mdx create mode 100644 docs/src/content/docs/guides/example.md create mode 100644 docs/src/content/docs/index.mdx create mode 100644 docs/src/content/docs/loaders/default.mdx create mode 100644 docs/src/content/docs/loaders/index.mdx create mode 100644 docs/src/content/docs/loaders/mysql.mdx create mode 100644 docs/src/content/docs/reference/configuration.mdx create mode 100644 docs/src/content/docs/reporters/default.mdx create mode 100644 docs/src/content/docs/reporters/index.mdx create mode 100644 docs/src/content/docs/reporters/pino.mdx create mode 100644 docs/src/content/docs/storage/file-system.mdx create mode 100644 docs/src/content/docs/storage/index.mdx create mode 100644 docs/src/content/docs/storage/mysql.mdx create mode 100644 docs/src/env.d.ts create mode 100644 docs/tsconfig.json diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..6240da8 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,21 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store diff --git a/docs/.vscode/extensions.json b/docs/.vscode/extensions.json new file mode 100644 index 0000000..22a1505 --- /dev/null +++ b/docs/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] +} diff --git a/docs/.vscode/launch.json b/docs/.vscode/launch.json new file mode 100644 index 0000000..d642209 --- /dev/null +++ b/docs/.vscode/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] +} diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..b51abaa --- /dev/null +++ b/docs/README.md @@ -0,0 +1,54 @@ +# Starlight Starter Kit: Basics + +[![Built with Starlight](https://astro.badg.es/v2/built-with-starlight/tiny.svg)](https://starlight.astro.build) + +``` +npm create astro@latest -- --template starlight +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/starlight/tree/main/examples/basics) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/starlight/tree/main/examples/basics) +[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fwithastro%2Fstarlight%2Ftree%2Fmain%2Fexamples%2Fbasics&project-name=my-starlight-docs&repository-name=my-starlight-docs) + +> πŸ§‘β€πŸš€ **Seasoned astronaut?** Delete this file. Have fun! + +## πŸš€ Project Structure + +Inside of your Astro + Starlight project, you'll see the following folders and files: + +``` +. +β”œβ”€β”€ public/ +β”œβ”€β”€ src/ +β”‚ β”œβ”€β”€ assets/ +β”‚ β”œβ”€β”€ content/ +β”‚ β”‚ β”œβ”€β”€ docs/ +β”‚ β”‚ └── config.ts +β”‚ └── env.d.ts +β”œβ”€β”€ astro.config.mjs +β”œβ”€β”€ package.json +└── tsconfig.json +``` + +Starlight looks for `.md` or `.mdx` files in the `src/content/docs/` directory. Each file is exposed as a route based on its file name. + +Images can be added to `src/assets/` and embedded in Markdown with a relative link. + +Static assets, like favicons, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `npm install` | Installs dependencies | +| `npm run dev` | Starts local dev server at `localhost:4321` | +| `npm run build` | Build your production site to `./dist/` | +| `npm run preview` | Preview your build locally, before deploying | +| `npm run astro ...` | Run CLI commands like `astro add`, `astro check` | +| `npm run astro -- --help` | Get help using the Astro CLI | + +## πŸ‘€ Want to learn more? + +Check out [Starlight’s docs](https://starlight.astro.build/), read [the Astro documentation](https://docs.astro.build), or jump into the [Astro Discord server](https://astro.build/chat). diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs new file mode 100644 index 0000000..aa5a281 --- /dev/null +++ b/docs/astro.config.mjs @@ -0,0 +1,51 @@ +import { defineConfig } from 'astro/config'; +import starlight from '@astrojs/starlight'; + +// https://astro.build/config +export default defineConfig({ + integrations: [ + starlight({ + title: 'Emigrate', + social: { + github: 'https://github.com/aboviq/emigrate', + }, + editLink: { + baseUrl: 'https://github.com/aboviq/emigrate/edit/main/docs/', + }, + sidebar: [ + { + label: 'Getting Started', + link: '/getting-started/', + }, + { + label: 'Storage Plugins', + items: [ + { label: 'Introduction', link: '/storage/' }, + { label: 'File System', link: '/storage/file-system/' }, + { label: 'MySQL', link: '/storage/mysql/' }, + ], + }, + { + label: 'Loader Plugins', + items: [ + { label: 'Introduction', link: '/loaders/' }, + { label: 'Default Loader', link: '/loaders/default/' }, + { label: 'MySQL Loader', link: '/loaders/mysql/' }, + ], + }, + { + label: 'Reporters', + items: [ + { label: 'Introduction', link: '/reporters/' }, + { label: 'Default Reporter', link: '/reporters/default/', badge: 'WIP' }, + { label: 'Pino Reporter', link: '/reporters/pino/', badge: 'WIP' }, + ], + }, + { + label: 'Reference', + autogenerate: { directory: 'reference' }, + }, + ], + }), + ], +}); diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..9665665 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,21 @@ +{ + "name": "@emigrate/docs", + "private": true, + "publishConfig": { + "access": "public" + }, + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro check && astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/starlight": "^0.15.0", + "astro": "^4.0.1", + "sharp": "^0.32.5" + } +} diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg new file mode 100644 index 0000000..cba5ac1 --- /dev/null +++ b/docs/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/src/assets/houston.webp b/docs/src/assets/houston.webp new file mode 100644 index 0000000000000000000000000000000000000000..930c164974ad8eb528878f15a98016249b8cf546 GIT binary patch literal 98506 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 b6~t;_wBcJ3AWgga7~Sz~izoKbpAY~5r|m$8 literal 0 HcmV?d00001 diff --git a/docs/src/content/config.ts b/docs/src/content/config.ts new file mode 100644 index 0000000..02ea2ac --- /dev/null +++ b/docs/src/content/config.ts @@ -0,0 +1,7 @@ +import { defineCollection } from 'astro:content'; +import { docsSchema, i18nSchema } from '@astrojs/starlight/schema'; + +export const collections = { + docs: defineCollection({ schema: docsSchema() }), + i18n: defineCollection({ type: 'data', schema: i18nSchema() }), +}; diff --git a/docs/src/content/docs/getting-started.mdx b/docs/src/content/docs/getting-started.mdx new file mode 100644 index 0000000..cfad31e --- /dev/null +++ b/docs/src/content/docs/getting-started.mdx @@ -0,0 +1,153 @@ +--- +title: Getting Started +description: How to getting started with Emigrate, the database migration tool +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +Emigrate is written in [TypeScript](https://www.typescriptlang.org) and is a database migration tool for any database. + +* It's the successor of [klei-migrate](https://github.com/klei/migrate) and is designed to be compatible with [Immigration](https://github.com/blakeembrey/node-immigration) and many of its storage plugins, as well as [Migrate](https://github.com/tj/node-migrate). +* It supports migration files written using [CommonJS or ES Modules out of the box](/loaders/default/), with any of the following extensions: `.js`, `.cjs` or `.mjs`, and supports [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or using the [NodeJS Callback Pattern](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks#handling-errors-in-callbacks). +* Other languages can be used by using a [Loader Plugin](/loaders/). +* The migration history can be stored anywhere using a [Storage Plugin](/storage/). +* The output can be customized using [Reporters](/reporters/). + +:::tip[Did you know?] +Thanks to the plugin system you can even write migrations in plain SQL! So no need for Java-based tools like Liquibase or Flyway. +::: + +## Quick Start + +:::note +The following guide will be even simpler soon with the release of a initialization command. +But for now, this is the way to go. +::: + +### Install the Emigrate CLI + + + + ```bash + npm install @emigrate/cli + ``` + + + ```bash + pnpm add @emigrate/cli + ``` + + + ```bash + yarn add @emigrate/cli + ``` + + + +### Pick a storage plugin + +Emigrate uses a storage plugin to store the migration history. You can use one of the following plugins: + +- [MySQL](/storage/mysql) +- [File System](/storage/file-system) + +Install the plugin you want to use, for example: + + + + ```bash + npm install @emigrate/mysql + ``` + + + ```bash + pnpm add @emigrate/mysql + ``` + + + ```bash + yarn add @emigrate/mysql + ``` + + + +### Create your first migration + +Create a new migration file in your project using: + +```bash title="Create a new migration file" +npx emigrate new --plugin mysql create users table +``` + +```txt title="Output" +Emigrate new v0.9.0 /your/project/path + + βœ” migrations/20231215125421364_create_users_table.sql (done) 3ms + + 1 created + +``` + +:::note +The `mysql` plugin is used here to generate a migration file with the `.sql` extension. +Otherwise the file would have the `.js` extension by default. +::: + +:::tip[Did you know?] +You can avoid typing `--plugin mysql` by configuring Emigrate using an `emigrate.config.js` file. +See [Configuration](/configuration) for more information. +::: + +#### Fill the migration file + +Open the migration file in your editor and fill it with your SQL query: + +```sql title="migrations/20231215125421364_create_users_table.sql" {2-7} +-- Migration: create users table +CREATE TABLE users ( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); +``` + +### Show migration status + +To show both pending and already applied migrations (or previously failed), use the `list` command: + +```bash title="Show all migrations" +npx emigrate list --storage mysql +``` + +```txt title="Example output" +Emigrate list v0.9.0 /your/project/path + + βœ” migrations/20231211090830577_another_table.sql (done) + β€Ί migrations/20231215125421364_create_users_table.sql (pending) + + 1 done | 1 pending (2 total) + +``` + +### Running the migrations + +A good way to test your configuration is to run the migrations in dry mode: + +```bash title="Show pending migrations" +npx emigrate up --storage mysql --plugin mysql --dry +``` + +:::note +This will connect to the database using some default values. For ways to configure the connection, see [Configuration](/configuration). +::: + +:::caution +Without the `--dry` flag this will run the migration and change your database! +Be sure to configure the connection correctly and use the `--dry` flag to test your configuration. +::: + +:::tip[Did you know?] +In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a [Storage Plugin](/storage/) +and once for the `--plugin` option as a [Loader Plugin](/loaders/) to be able to read `.sql` files. +::: diff --git a/docs/src/content/docs/guides/example.md b/docs/src/content/docs/guides/example.md new file mode 100644 index 0000000..ebd0f3b --- /dev/null +++ b/docs/src/content/docs/guides/example.md @@ -0,0 +1,11 @@ +--- +title: Example Guide +description: A guide in my new Starlight docs site. +--- + +Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. +Writing a good guide requires thinking about what your users are trying to do. + +## Further reading + +- Read [about how-to guides](https://diataxis.fr/how-to-guides/) in the DiΓ‘taxis framework diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx new file mode 100644 index 0000000..fc43de1 --- /dev/null +++ b/docs/src/content/docs/index.mdx @@ -0,0 +1,36 @@ +--- +title: Effortless database changes with Emigrate +description: Adapt any and all of your databases to your needs at any scale. Modern, flexible, and easy to use. +template: splash +hero: + tagline: Adapt any and all of your databases to new business needs.
Emigrate is modern, flexible, scalable, and easy to use. + image: + file: ../../assets/houston.webp + actions: + - text: Quick Start + link: /getting-started/ + icon: right-arrow + variant: primary + - text: View on GitHub + link: https://github.com/aboviq/emigrate + icon: external +--- + +import { Card, CardGrid } from '@astrojs/starlight/components'; + +## Next steps + + + + Edit `src/content/docs/index.mdx` to see this page change. + + + Add Markdown or MDX files to `src/content/docs` to create new pages. + + + Edit your `sidebar` and other config in `astro.config.mjs`. + + + Learn more in [the Starlight Docs](https://starlight.astro.build/). + + diff --git a/docs/src/content/docs/loaders/default.mdx b/docs/src/content/docs/loaders/default.mdx new file mode 100644 index 0000000..d7c32b3 --- /dev/null +++ b/docs/src/content/docs/loaders/default.mdx @@ -0,0 +1,228 @@ +--- +title: Default Loader Plugin +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The default loader plugin is responsible for importing migration files written in JavaScript. +Migration files can be written using either CommonJS or ES Modules. + +## Supported extensions + +The default loader plugin supports the following extensions: + +* `.js` - either CommonJS or ES Modules depending on your package.json's [`type` field](https://nodejs.org/api/packages.html#type) +* `.cjs` - CommonJS +* `.mjs` - ES Modules + +## Supported exports + +The default loader plugin supports the following exports: + +### ES Modules + +#### Default export + +Exporting a function as the default export. + + + + ```js + import { database } from 'some-database'; + + export default async function someMigration() { + await database.query(...); + await database.query(...); + } + ``` + + + ```js + import { database } from 'some-database'; + + export default function someMigration() { + // Remember to return the promise + return database.query(...) + .then(() => { + return database.query(...); + }) + } + ``` + + + ```js + import { database } from 'some-database'; + + export default function someMigration(done) { + database.query(..., (err) => { + if (err) { + return done(err); + } + + database.query(..., (err) => { + if (err) { + return done(err); + } + + done(); + }); + }); + } + ``` + + + +#### Named export + +Exporting a function named `up`. + + + + ```js + import { database } from 'some-database'; + + export const up = async () => { + await database.query(...); + await database.query(...); + }; + ``` + + + ```js + import { database } from 'some-database'; + + export const up = () => { + // Remember to return the promise + return database.query(...) + .then(() => { + return database.query(...); + }) + }; + ``` + + + ```js + import { database } from 'some-database'; + + export const up = (done) => { + database.query(..., (err) => { + if (err) { + return done(err); + } + + database.query(..., (err) => { + if (err) { + return done(err); + } + + done(); + }); + }); + } + ``` + + + +### CommonJS + +#### `module.exports` + +Exporting a function as the module. + + + + ```js + const { database } = require('some-database'); + + module.exports = async function someMigration() { + await database.query(...); + await database.query(...); + } + ``` + + + ```js + const { database } = require('some-database'); + + module.exports = function someMigration() { + // Remember to return the promise + return database.query(...) + .then(() => { + return database.query(...); + }) + } + ``` + + + ```js + const { database } = require('some-database'); + + module.exports = function someMigration(done) { + database.query(..., (err) => { + if (err) { + return done(err); + } + + database.query(..., (err) => { + if (err) { + return done(err); + } + + done(); + }); + }); + } + ``` + + + +#### `exports.up` + +Exporting an `up` function. + + + + ```js + const { database } = require('some-database'); + + exports.up = async () => { + await database.query(...); + await database.query(...); + }; + ``` + + + ```js + const { database } = require('some-database'); + + exports.up = () => { + // Remember to return the promise + return database.query(...) + .then(() => { + return database.query(...); + }) + }; + ``` + + + ```js + const { database } = require('some-database'); + + exports.up = (done) => { + database.query(..., (err) => { + if (err) { + return done(err); + } + + database.query(..., (err) => { + if (err) { + return done(err); + } + + done(); + }); + }); + } + ``` + + diff --git a/docs/src/content/docs/loaders/index.mdx b/docs/src/content/docs/loaders/index.mdx new file mode 100644 index 0000000..ddbf52d --- /dev/null +++ b/docs/src/content/docs/loaders/index.mdx @@ -0,0 +1,32 @@ +--- +title: Loader Plugins +--- + +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; + +Loader plugins are used to transform any file type into a JavaScript function that will be called when the migration file is executed. + +Out of the box, Emigrate supports the following file extensions: `.js`, `.cjs` and `.mjs`. And both CommonJS and ES Modules are supported. See the [Default Loader](/loaders/default/) for more information. + +## Using a loader plugin + +You can specify a loader plugin via the `--plugin` (or `-p` for short) option: + +```bash +npx emigrate up --plugin mysql +``` + +Or set it up in your configuration file, see [Plugin configuration](/reference/configuration/#plugins) for more information. + +:::tip[Did you know?] +You can specify multiple loader plugins at the same time, which is needed when you mix file types in your migrations. +For example, you can use the `mysql` loader for `.sql` files and the `typescript` loader for `.ts` files. +The [default loader](/loaders/default/) will be used for all other file types, and doesn't need to be specified. +::: + +## Available Loader Plugins + + + + + diff --git a/docs/src/content/docs/loaders/mysql.mdx b/docs/src/content/docs/loaders/mysql.mdx new file mode 100644 index 0000000..7bc0406 --- /dev/null +++ b/docs/src/content/docs/loaders/mysql.mdx @@ -0,0 +1,85 @@ +--- +title: MySQL Loader Plugin +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The MySQL loader plugin transforms `.sql` files into JavaScript functions that Emigrate can use to execute the migrations. + +## Installation + + + + ```bash + npm install @emigrate/mysql + ``` + + + ```bash + pnpm add @emigrate/mysql + ``` + + + ```bash + yarn add @emigrate/mysql + ``` + + + +## Configuration + +The MySQL loader plugin can be configured either using environment variables or by configuring the plugin directly in the [`emigrate.config.js` file](/reference/configuration). + +### Configuration file + +```js title="emigrate.config.js" {1,4-8} +import { createMysqlLoader } from '@emigrate/mysql'; + +export default { + plugins: [ + createMysqlLoader({ + connection: { ... }, + }), + ], +}; +``` + +#### Options + +##### `connection` (required) + +**type:** `object | string` + +The connection options to use for connecting to the MySQL database when the SQL statements from the migration files are executed. This can either be a connection URI or an object with connection options. +For a list of supported connection options, see the [mysql documentation](https://github.com/mysqljs/mysql#connection-options). + +### Environment variables + +The following environment variables are supported: + +| Variable | Description | Default | +| ---------------- | --------------------------------------------------------------------------------------------------- | -------------- | +| `MYSQL_URL` | The full URI for connecting to a MySQL database, e.g: `"mysql://user:pass@127.0.0.1:3306/database"` | | +| `MYSQL_HOST` | The host on which the MySQL server instance is running | `"localhost"` | +| `MYSQL_USER` | The MySQL user account to use for the authentication | | +| `MYSQL_PASSWORD` | The MySQL user password to use for the authentication | | +| `MYSQL_PORT` | The network port on which the MySQL server is listening | `3306` | +| `MYSQL_DATABASE` | The MySQL database to use for the connection | | + +:::note +The `MYSQL_URL` environment variable takes precedence over the other environment variables. If `MYSQL_URL` is set, the other environment variables are ignored. +::: + +The environment variables are used when the plugin is used using the `--plugin` command line option: + +```bash +npx emigrate list --plugin mysql +``` + +Or when specifying the plugin in the [`emigrate.config.js` file](/reference/configuration) as a string: + +```js title="emigrate.config.js" {2} +export default { + plugins: ['mysql'], +}; +``` diff --git a/docs/src/content/docs/reference/configuration.mdx b/docs/src/content/docs/reference/configuration.mdx new file mode 100644 index 0000000..6f9f1eb --- /dev/null +++ b/docs/src/content/docs/reference/configuration.mdx @@ -0,0 +1,143 @@ +--- +title: Configuration Reference +description: How to configure Emigrate to your needs +sidebar: + order: 1 +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +Emigrate can be configured using a configuration file, and it uses [Cosmiconfig](https://github.com/cosmiconfig/cosmiconfig) under the hood +so you can use a variety of formats and locations for your configuration file. + +## Configure Emigrate + + + + ```js title="emigrate.config.js" + /** @type {import('@emigrate/cli').EmigrateConfig} */ + export default { + directory: 'migrations', + }; + ``` + + + ```ts title="emigrate.config.ts" + import { type EmigrateConfig } from '@emigrate/cli'; + + const config: EmigrateConfig = { + directory: 'migrations', + }; + + export default config; + ``` + + + +You can specify the following options: + +### `directory` + +**type:** `string` + +Set the directory where your migrations are located, relative to the project root. This option is required by all Emigrate commands. + +### `reporter` + +**type:** `string | EmigrateReporter | Promise | (() => Promise)` +**default:** `"default"` - the default reporter + +Set the reporter to use for the different commands. Specifying a reporter is most useful in a CI or production environment where you either ship logs or want to have a machine-readable format. + +```js title="emigrate.config.js" {2} +export default { + reporter: 'json', +}; +``` + +If you want to use different reporters for different commands, you can use an object: + +```js title="emigrate.config.js" {2-4} +export default { + up: { + reporter: 'json', + }, +}; +``` + +:::note +Commands that are not specified will use the default reporter. +::: + +:::tip[Did you know?] +The default reporter automatically detects if the current environment is an interactive terminal or not, and will only render animations and similar if it is. +::: + +### `storage` + +**type:** `string | EmigrateStorage | Promise | (() => Promise)` + +Set the storage plugin to use for storing and reading the migration history. This option is required by all Emigrate commands except `new` which doesn't use it. + +```js title="emigrate.config.js" {2} +export default { + storage: 'mysql', +}; +``` + +:::note +Each storage plugin can have its own configuration options, see the corresponding [Storage Plugin](/storage/) section for more information. +::: + +### `plugins` + +**type:** `Array | (() => Promise)>` + +Set the plugins to use for the different commands. There are different types of plugins, and some are only useful for specific commands. + +In short: + +* [Loader Plugins](/loaders/) - are used for transforming non-JavaScript files into JavaScript files that can be executed by Node.js. These are only used by the `up` command. +* [Generator Plugins](/generators/) - are used for generating new migration files. These are only used by the `new` command. + +```js title="emigrate.config.js" {2} +export default { + plugins: ['typescript'], +}; +``` + +:::tip[Did you know?] +The same package can expose multiple plugins, so you can specify the plugin only once and it can be used as both a loader and a generator (and storage, in the case of [MySQL](/storage/mysql) for instance). +::: + +### `template` + +**type:** `string` + +Set the path to a template file to use when creating new migrations. This option is only used by the `new` command. + +```js title="emigrate.config.js" {2-4} +export default { + new: { + template: 'path/to/template.js', + }, +}; +``` + +The migration file will use the template file's extension, unless the [extension](#extension) option is set. + +### `extension` + +**type:** `string` + +Set the extension to use for new migrations. This option is only used by the `new` command. + +```js title="emigrate.config.js" {2-4} +export default { + new: { + extension: '.ts', + }, +}; +``` + +Will create new migration files with the `.ts` extension. diff --git a/docs/src/content/docs/reporters/default.mdx b/docs/src/content/docs/reporters/default.mdx new file mode 100644 index 0000000..d710475 --- /dev/null +++ b/docs/src/content/docs/reporters/default.mdx @@ -0,0 +1,5 @@ +--- +title: Default Reporter +--- + +Emigrate's default reporter. diff --git a/docs/src/content/docs/reporters/index.mdx b/docs/src/content/docs/reporters/index.mdx new file mode 100644 index 0000000..91d3b47 --- /dev/null +++ b/docs/src/content/docs/reporters/index.mdx @@ -0,0 +1,24 @@ +--- +title: Reporters +--- + +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; + +A reporter is a plugin that's responsible for printing the migration progress and results to the console. + +## Using a reporter + +You can specify a reporter via the `--reporter` (or `-r` for short) option: + +```bash +npx emigrate list --reporter pino +``` + +Or set it up in your configuration file, see [Reporter configuration](/reference/configuration/#reporter) for more information. + +## Available Reporters + + + + + diff --git a/docs/src/content/docs/reporters/pino.mdx b/docs/src/content/docs/reporters/pino.mdx new file mode 100644 index 0000000..fb74c4e --- /dev/null +++ b/docs/src/content/docs/reporters/pino.mdx @@ -0,0 +1,5 @@ +--- +title: Pino Reporter +--- + +Emigrate's reporter that uses [Pino](https://getpino.io/#/) as the logger. diff --git a/docs/src/content/docs/storage/file-system.mdx b/docs/src/content/docs/storage/file-system.mdx new file mode 100644 index 0000000..124dee2 --- /dev/null +++ b/docs/src/content/docs/storage/file-system.mdx @@ -0,0 +1,53 @@ +--- +title: File System Storage +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The File System Storage is a storage driver that stores the migration history in a `.json` file on the local file system. + +:::caution +This is suitable for simple setups, but for more advanced setups for instance where the application is deployed on multiple servers, you should use a database storage plugin instead. +::: + +## Installation + + + + ```bash + npm install @emigrate/storage-fs + ``` + + + ```bash + pnpm add @emigrate/storage-fs + ``` + + + ```bash + yarn add @emigrate/storage-fs + ``` + + + +## Configuration + +The File System Storage can be configured easily in your [`emigrate.config.js` file](/reference/configuration): + +```js {1,4-6} +import storageFs from '@emigrate/storage-fs'; + +export default { + storage: storageFs({ + filename: './migrations.json', + }), +}; +``` + +### Options + +#### `filename` + +**type:** `string` + +Should be a path either relative to the project root or an absolute path. It doesn't need to have the `.json` extension, but its contents will be in JSON format. diff --git a/docs/src/content/docs/storage/index.mdx b/docs/src/content/docs/storage/index.mdx new file mode 100644 index 0000000..236c55c --- /dev/null +++ b/docs/src/content/docs/storage/index.mdx @@ -0,0 +1,33 @@ +--- +title: Storage Plugins +--- + +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; + +Storage plugins are used for storing and reading the migration history state. +Usually you'll want to store the migration history in the same database as the one which your migration files are targeting. + +## Using a storage plugin + +You can specify a storage plugin via the `--storage` (or `-s` for short) option: + +```bash +npx emigrate list --storage mysql +``` + +Or set it up in your configuration file, see [Storage configuration](/reference/configuration/#storage) for more information. + +## Available storage plugins + + + + + + +:::note +More storage plugins are coming soon! +::: + +:::tip[Is your database missing?] +Writing a storage plugin is easy! Check out the [Storage Plugin API](/reference/storage-plugin-api/) for more information. +::: diff --git a/docs/src/content/docs/storage/mysql.mdx b/docs/src/content/docs/storage/mysql.mdx new file mode 100644 index 0000000..8ccbc55 --- /dev/null +++ b/docs/src/content/docs/storage/mysql.mdx @@ -0,0 +1,92 @@ +--- +title: MySQL Storage +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The MySQL storage plugin uses a MySQL database to store the migration history (*duh*). + +## Installation + + + + ```bash + npm install @emigrate/mysql + ``` + + + ```bash + pnpm add @emigrate/mysql + ``` + + + ```bash + yarn add @emigrate/mysql + ``` + + + +## Configuration + +The MySQL storage can be configured either using environment variables or by configuring the plugin directly in the [`emigrate.config.js` file](/reference/configuration). + +### Configuration file + +```js title="emigrate.config.js" {1,4-7} +import { createMysqlStorage } from '@emigrate/mysql'; + +export default { + storage: createMysqlStorage({ + table: 'migrations', + connection: { ... }, + }), +}; +``` + +#### Options + +##### `table` + +**type:** `string` +**default:** `"migrations"` + +The name of the table to use for storing the migrations. + +##### `connection` (required) + +**type:** `object | string` + +The connection options to use for connecting to the MySQL database. This can either be a connection URI or an object with connection options. +For a list of supported connection options, see the [mysql documentation](https://github.com/mysqljs/mysql#connection-options). + +### Environment variables + +The following environment variables are supported: + +| Variable | Description | Default | +| ---------------- | --------------------------------------------------------------------------------------------------- | -------------- | +| `MYSQL_TABLE` | The name of the table to use for storing the migrations | `"migrations"` | +| `MYSQL_URL` | The full URI for connecting to a MySQL database, e.g: `"mysql://user:pass@127.0.0.1:3306/database"` | | +| `MYSQL_HOST` | The host on which the MySQL server instance is running | `"localhost"` | +| `MYSQL_USER` | The MySQL user account to use for the authentication | | +| `MYSQL_PASSWORD` | The MySQL user password to use for the authentication | | +| `MYSQL_PORT` | The network port on which the MySQL server is listening | `3306` | +| `MYSQL_DATABASE` | The MySQL database to use for the connection | | + +:::note +The `MYSQL_URL` environment variable takes precedence over the other environment variables. If `MYSQL_URL` is set, the other environment variables are ignored, except for `MYSQL_TABLE`. +::: + +The environment variables are used when the storage plugin is used using the `--storage` command line option: + +```bash +npx emigrate list --storage mysql +``` + +Or when specifying the storage in the [`emigrate.config.js` file](/reference/configuration) as a string: + +```js title="emigrate.config.js" {2} +export default { + storage: 'mysql', +}; +``` diff --git a/docs/src/env.d.ts b/docs/src/env.d.ts new file mode 100644 index 0000000..e815b35 --- /dev/null +++ b/docs/src/env.d.ts @@ -0,0 +1,3 @@ +/* eslint-disable @typescript-eslint/triple-slash-reference */ +/// +/// diff --git a/docs/tsconfig.json b/docs/tsconfig.json new file mode 100644 index 0000000..fbc2f5f --- /dev/null +++ b/docs/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "astro/tsconfigs/strictest" +} diff --git a/package.json b/package.json index 00c70b7..4a40f76 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "build:watch": "turbo run build:watch", "checks": "turbo run checks", "release": "run-s build && changeset publish", - "format": "prettier --write \"**/*.{ts,tsx,md,json,js}\"", + "format": "prettier --write \"**/*.{ts,tsx,md,json,js,mjs}\"", "lint": "turbo run lint", "test": "turbo run test", "test:watch": "turbo run test:watch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4875ba..f758bb5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,6 +51,18 @@ importers: specifier: 0.56.0 version: 0.56.0(webpack@5.89.0) + docs: + dependencies: + '@astrojs/starlight': + specifier: ^0.15.0 + version: 0.15.0(astro@4.0.5) + astro: + specifier: ^4.0.1 + version: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + sharp: + specifier: ^0.32.5 + version: 0.32.6 + packages/cli: dependencies: '@emigrate/plugin-tools': @@ -168,6 +180,126 @@ packages: engines: {node: '>=0.10.0'} dev: false + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: false + + /@astrojs/compiler@2.3.2: + resolution: {integrity: sha512-jkY7bCVxl27KeZsSxIZ+pqACe+g8VQUdTiSJRj/sXYdIaZlW3ZMq4qF2M17P/oDt3LBq0zLNwQr4Cb7fSpRGxQ==} + dev: false + + /@astrojs/internal-helpers@0.2.1: + resolution: {integrity: sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==} + dev: false + + /@astrojs/markdown-remark@4.0.1: + resolution: {integrity: sha512-RU4ESnqvyLpj8WZs0n5elS6idaDdtIIm7mIpMaRNPCebpxMjfcfdwcmBwz83ktAj5d2eO5bC3z92TcGdli+lRw==} + dependencies: + '@astrojs/prism': 3.0.0 + github-slugger: 2.0.0 + import-meta-resolve: 4.0.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.0.0 + remark-smartypants: 2.0.0 + shikiji: 0.6.13 + unified: 11.0.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/mdx@2.0.1(astro@4.0.5): + resolution: {integrity: sha512-lWbiNoVV/6DO8hAf6eZmcN28hY/herif9eglw2PXZ5lEPoRu175BvBtuNTt9rH9YA/Ldm5mkNXhvMWNEnMqJkw==} + engines: {node: '>=18.14.1'} + peerDependencies: + astro: ^4.0.0 + dependencies: + '@astrojs/markdown-remark': 4.0.1 + '@mdx-js/mdx': 3.0.0 + acorn: 8.11.2 + astro: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + es-module-lexer: 1.4.1 + estree-util-visit: 2.0.0 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + hast-util-to-html: 9.0.0 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.0 + remark-smartypants: 2.0.0 + source-map: 0.7.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/prism@3.0.0: + resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} + engines: {node: '>=18.14.1'} + dependencies: + prismjs: 1.29.0 + dev: false + + /@astrojs/sitemap@3.0.3: + resolution: {integrity: sha512-+GRKp1yho9dpHBcMcU6JpbL41k0yYZghOkNsMRb8QIRflbGHvd787tdv9oIZ5NJj0SqAuOlqp2UpqLkJXuAe2A==} + dependencies: + sitemap: 7.1.1 + zod: 3.22.4 + dev: false + + /@astrojs/starlight@0.15.0(astro@4.0.5): + resolution: {integrity: sha512-epLRrGP9+5gIP/ZXeRtkY/tA00yzY8iBBqYRGxkoj44fokCiDg+iKCnE9BXooAK08ELyizD8nwenUmVzDTDRXA==} + peerDependencies: + astro: ^4.0.0 + dependencies: + '@astrojs/mdx': 2.0.1(astro@4.0.5) + '@astrojs/sitemap': 3.0.3 + '@pagefind/default-ui': 1.0.4 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + astro: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + astro-expressive-code: 0.29.4(astro@4.0.5) + bcp-47: 2.1.0 + execa: 8.0.1 + hast-util-select: 6.0.2 + hastscript: 8.0.0 + mdast-util-directive: 3.0.0 + pagefind: 1.0.4 + rehype: 13.0.1 + remark-directive: 3.0.0 + unified: 11.0.4 + unist-util-remove: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/telemetry@3.0.4: + resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} + engines: {node: '>=18.14.1'} + dependencies: + ci-info: 3.9.0 + debug: 4.3.4 + dlv: 1.1.3 + dset: 3.1.3 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/code-frame@7.23.5: resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} engines: {node: '>=6.9.0'} @@ -176,11 +308,148 @@ packages: chalk: 2.4.2 dev: false + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.23.6: + resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.6) + '@babel/helpers': 7.23.6 + '@babel/parser': 7.23.6 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: false + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.5 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.22.2 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.6 + dev: false + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: false + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: false + /@babel/helper-validator-identifier@7.22.20: resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: false + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers@7.23.6: + resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/highlight@7.23.4: resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} engines: {node: '>=6.9.0'} @@ -190,6 +459,38 @@ packages: js-tokens: 4.0.0 dev: false + /@babel/parser@7.23.6: + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.6): + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.6 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) + '@babel/types': 7.23.6 + dev: false + /@babel/runtime@7.23.2: resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} engines: {node: '>=6.9.0'} @@ -197,6 +498,42 @@ packages: regenerator-runtime: 0.14.0 dev: false + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: false + + /@babel/traverse@7.23.6: + resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.6 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.23.6: + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: false + /@changesets/apply-release-plan@7.0.0: resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} dependencies: @@ -544,6 +881,11 @@ packages: chalk: 4.1.2 dev: false + /@ctrl/tinycolor@3.6.1: + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + dev: false + /@esbuild/android-arm64@0.18.20: resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} engines: {node: '>=12'} @@ -553,6 +895,15 @@ packages: dev: false optional: true + /@esbuild/android-arm64@0.19.9: + resolution: {integrity: sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/android-arm@0.18.20: resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} engines: {node: '>=12'} @@ -562,6 +913,15 @@ packages: dev: false optional: true + /@esbuild/android-arm@0.19.9: + resolution: {integrity: sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/android-x64@0.18.20: resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} engines: {node: '>=12'} @@ -571,6 +931,15 @@ packages: dev: false optional: true + /@esbuild/android-x64@0.19.9: + resolution: {integrity: sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + /@esbuild/darwin-arm64@0.18.20: resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} engines: {node: '>=12'} @@ -580,6 +949,15 @@ packages: dev: false optional: true + /@esbuild/darwin-arm64@0.19.9: + resolution: {integrity: sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/darwin-x64@0.18.20: resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} engines: {node: '>=12'} @@ -589,6 +967,15 @@ packages: dev: false optional: true + /@esbuild/darwin-x64@0.19.9: + resolution: {integrity: sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@esbuild/freebsd-arm64@0.18.20: resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} engines: {node: '>=12'} @@ -598,6 +985,15 @@ packages: dev: false optional: true + /@esbuild/freebsd-arm64@0.19.9: + resolution: {integrity: sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/freebsd-x64@0.18.20: resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} engines: {node: '>=12'} @@ -607,6 +1003,15 @@ packages: dev: false optional: true + /@esbuild/freebsd-x64@0.19.9: + resolution: {integrity: sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-arm64@0.18.20: resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} engines: {node: '>=12'} @@ -616,6 +1021,15 @@ packages: dev: false optional: true + /@esbuild/linux-arm64@0.19.9: + resolution: {integrity: sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-arm@0.18.20: resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} engines: {node: '>=12'} @@ -625,6 +1039,15 @@ packages: dev: false optional: true + /@esbuild/linux-arm@0.19.9: + resolution: {integrity: sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-ia32@0.18.20: resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} engines: {node: '>=12'} @@ -634,6 +1057,15 @@ packages: dev: false optional: true + /@esbuild/linux-ia32@0.19.9: + resolution: {integrity: sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-loong64@0.18.20: resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} engines: {node: '>=12'} @@ -643,6 +1075,15 @@ packages: dev: false optional: true + /@esbuild/linux-loong64@0.19.9: + resolution: {integrity: sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-mips64el@0.18.20: resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} engines: {node: '>=12'} @@ -652,6 +1093,15 @@ packages: dev: false optional: true + /@esbuild/linux-mips64el@0.19.9: + resolution: {integrity: sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-ppc64@0.18.20: resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} engines: {node: '>=12'} @@ -661,6 +1111,15 @@ packages: dev: false optional: true + /@esbuild/linux-ppc64@0.19.9: + resolution: {integrity: sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-riscv64@0.18.20: resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} engines: {node: '>=12'} @@ -670,6 +1129,15 @@ packages: dev: false optional: true + /@esbuild/linux-riscv64@0.19.9: + resolution: {integrity: sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-s390x@0.18.20: resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} engines: {node: '>=12'} @@ -679,6 +1147,15 @@ packages: dev: false optional: true + /@esbuild/linux-s390x@0.19.9: + resolution: {integrity: sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/linux-x64@0.18.20: resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} engines: {node: '>=12'} @@ -688,6 +1165,15 @@ packages: dev: false optional: true + /@esbuild/linux-x64@0.19.9: + resolution: {integrity: sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@esbuild/netbsd-x64@0.18.20: resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} engines: {node: '>=12'} @@ -697,6 +1183,15 @@ packages: dev: false optional: true + /@esbuild/netbsd-x64@0.19.9: + resolution: {integrity: sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/openbsd-x64@0.18.20: resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} engines: {node: '>=12'} @@ -706,6 +1201,15 @@ packages: dev: false optional: true + /@esbuild/openbsd-x64@0.19.9: + resolution: {integrity: sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + /@esbuild/sunos-x64@0.18.20: resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} engines: {node: '>=12'} @@ -715,6 +1219,15 @@ packages: dev: false optional: true + /@esbuild/sunos-x64@0.19.9: + resolution: {integrity: sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + /@esbuild/win32-arm64@0.18.20: resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} engines: {node: '>=12'} @@ -724,6 +1237,15 @@ packages: dev: false optional: true + /@esbuild/win32-arm64@0.19.9: + resolution: {integrity: sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/win32-ia32@0.18.20: resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} engines: {node: '>=12'} @@ -733,6 +1255,15 @@ packages: dev: false optional: true + /@esbuild/win32-ia32@0.19.9: + resolution: {integrity: sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@esbuild/win32-x64@0.18.20: resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} engines: {node: '>=12'} @@ -742,6 +1273,15 @@ packages: dev: false optional: true + /@esbuild/win32-x64@0.19.9: + resolution: {integrity: sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -779,6 +1319,38 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false + /@expressive-code/core@0.29.4: + resolution: {integrity: sha512-XBdMPO4BBgPxE+txtNdjkDmLwGxJpU+QqLQ/WrHWPcj1lTXcoFQTUqFO4Eav+hv/Yn+lEjiv792RrcUe2o0anA==} + dependencies: + '@ctrl/tinycolor': 3.6.1 + hast-util-to-html: 8.0.4 + hastscript: 7.2.0 + postcss: 8.4.32 + postcss-nested: 6.0.1(postcss@8.4.32) + dev: false + + /@expressive-code/plugin-frames@0.29.4: + resolution: {integrity: sha512-GE3sB7JTqjhTz7LrCm+mL9x+bIdud76AVqJa/brJgqpYFcl5aJcHtyR0PSZQqTXHL3sBIj8w0wbh+ieVM43JnQ==} + dependencies: + '@expressive-code/core': 0.29.4 + hastscript: 7.2.0 + dev: false + + /@expressive-code/plugin-shiki@0.29.4: + resolution: {integrity: sha512-vOM2JFVEClg3EAWHVd+ma8y/EsINqzCrQP1PS9sZgn2KASE3C6JBkNRXzUXKGkjDn0dsWJVYYvIsH+4xNpygZA==} + dependencies: + '@expressive-code/core': 0.29.4 + shiki: 0.14.6 + dev: false + + /@expressive-code/plugin-text-markers@0.29.4: + resolution: {integrity: sha512-U8rouNRrLzAo11Ihoi4iqEH7FD+VEUb6Pe7xJxlFJ7HRhgaFIcuHyYyn6jA1WmGP5k9BFLhYBk53+oKvlmEkKw==} + dependencies: + '@expressive-code/core': 0.29.4 + hastscript: 7.2.0 + unist-util-visit-parents: 5.1.3 + dev: false + /@humanwhocodes/config-array@0.11.13: resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} @@ -915,6 +1487,36 @@ packages: read-yaml-file: 1.1.0 dev: false + /@mdx-js/mdx@3.0.0: + resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdx': 2.0.10 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.0.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -936,6 +1538,50 @@ packages: fastq: 1.15.0 dev: false + /@pagefind/darwin-arm64@1.0.4: + resolution: {integrity: sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/darwin-x64@1.0.4: + resolution: {integrity: sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/default-ui@1.0.4: + resolution: {integrity: sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==} + dev: false + + /@pagefind/linux-arm64@1.0.4: + resolution: {integrity: sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/linux-x64@1.0.4: + resolution: {integrity: sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/windows-x64@1.0.4: + resolution: {integrity: sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@pkgjs/parseargs@0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -955,6 +1601,110 @@ packages: tslib: 2.6.2 dev: false + /@rollup/rollup-android-arm-eabi@4.9.0: + resolution: {integrity: sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-android-arm64@4.9.0: + resolution: {integrity: sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-arm64@4.9.0: + resolution: {integrity: sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-x64@4.9.0: + resolution: {integrity: sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.0: + resolution: {integrity: sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.0: + resolution: {integrity: sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.0: + resolution: {integrity: sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.0: + resolution: {integrity: sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.0: + resolution: {integrity: sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.0: + resolution: {integrity: sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.0: + resolution: {integrity: sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.9.0: + resolution: {integrity: sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-x64-msvc@4.9.0: + resolution: {integrity: sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@sindresorhus/is@0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} @@ -967,6 +1717,47 @@ packages: defer-to-connect: 1.1.3 dev: false + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__generator': 7.6.7 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.4 + dev: false + + /@types/babel__generator@7.6.7: + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.23.6 + '@babel/types': 7.23.6 + dev: false + + /@types/babel__traverse@7.20.4: + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + dependencies: + '@babel/types': 7.23.6 + dev: false + + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + dev: false + /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: @@ -988,10 +1779,28 @@ packages: '@types/json-schema': 7.0.15 dev: false + /@types/estree-jsx@1.0.3: + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: false + /@types/hast@2.3.8: + resolution: {integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /@types/hast@3.0.3: + resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: false @@ -1006,14 +1815,38 @@ packages: '@types/node': 20.10.4 dev: false + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/mdx@2.0.10: + resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} + dev: false + /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: false + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: false + + /@types/nlcst@1.0.4: + resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + dependencies: + '@types/unist': 2.0.10 + dev: false + /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} dev: false + /@types/node@17.0.45: + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + dev: false + /@types/node@18.19.3: resolution: {integrity: sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==} dependencies: @@ -1030,12 +1863,22 @@ packages: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: false + /@types/parse5@6.0.3: + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + dev: false + /@types/responselike@1.0.3: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: '@types/node': 20.10.4 dev: false + /@types/sax@1.2.7: + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + dependencies: + '@types/node': 20.10.4 + dev: false + /@types/semver@6.2.6: resolution: {integrity: sha512-6Xe+YAhzQKMxEytKnq01VdyhNwz+M/nJBnOcdIWxBHAl5MS6QOYzOX7PazFDUdtUhTSzvfLKZN9fq5ShKDaAvA==} dev: false @@ -1044,6 +1887,14 @@ packages: resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} dev: false + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + dev: false + + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + dev: false + /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -1356,6 +2207,12 @@ packages: uri-js: 4.4.1 dev: false + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: false + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -1392,6 +2249,10 @@ packages: engines: {node: '>=12'} dev: false + /ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + dev: false + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -1416,6 +2277,18 @@ packages: engines: {node: '>=12.13'} dev: false + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: @@ -1448,6 +2321,10 @@ packages: is-string: 1.0.7 dev: false + /array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + dev: false + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -1505,6 +2382,100 @@ packages: engines: {node: '>=12'} dev: false + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false + + /astro-expressive-code@0.29.4(astro@4.0.5): + resolution: {integrity: sha512-FoOp0gq+BOss92Tqm1tmUJwVsmCE9odEfura/an27l2tc6LU9Ki2NX3N6TWpvl95NLKQZeFpBl26ZB2yhjrt2Q==} + peerDependencies: + astro: ^3.0.0-beta || ^4.0.0-beta + dependencies: + astro: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + remark-expressive-code: 0.29.4 + dev: false + + /astro@4.0.5(@types/node@20.10.4)(typescript@5.2.2): + resolution: {integrity: sha512-OTiTEiXYdXTkVJXNNKIWdYG1z2wpTST+92Qcldm36x91Pe4fKpLxeuRloy5cW175oHi8lvXytgG3Gl3VBP18RQ==} + engines: {node: '>=18.14.1', npm: '>=6.14.0'} + hasBin: true + dependencies: + '@astrojs/compiler': 2.3.2 + '@astrojs/internal-helpers': 0.2.1 + '@astrojs/markdown-remark': 4.0.1 + '@astrojs/telemetry': 3.0.4 + '@babel/core': 7.23.6 + '@babel/generator': 7.23.6 + '@babel/parser': 7.23.6 + '@babel/plugin-transform-react-jsx': 7.23.4(@babel/core@7.23.6) + '@babel/traverse': 7.23.6 + '@babel/types': 7.23.6 + '@types/babel__core': 7.20.5 + acorn: 8.11.2 + boxen: 7.1.1 + chokidar: 3.5.3 + ci-info: 4.0.0 + clsx: 2.0.0 + common-ancestor-path: 1.0.1 + cookie: 0.6.0 + debug: 4.3.4 + deterministic-object-hash: 2.0.2 + devalue: 4.3.2 + diff: 5.1.0 + dlv: 1.1.3 + dset: 3.1.3 + es-module-lexer: 1.4.1 + esbuild: 0.19.9 + estree-walker: 3.0.3 + execa: 8.0.1 + fast-glob: 3.3.2 + flattie: 1.1.0 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.5 + mdast-util-to-hast: 13.0.2 + mime: 3.0.0 + ora: 7.0.1 + p-limit: 5.0.0 + p-queue: 7.4.1 + path-to-regexp: 6.2.1 + preferred-pm: 3.1.2 + probe-image-size: 7.2.3 + prompts: 2.4.2 + rehype: 13.0.1 + resolve: 1.22.8 + semver: 7.5.4 + server-destroy: 1.0.1 + shikiji: 0.6.13 + string-width: 7.0.0 + strip-ansi: 7.1.0 + tsconfck: 3.0.0(typescript@5.2.2) + unist-util-visit: 5.0.0 + vfile: 6.0.1 + vite: 5.0.9(@types/node@20.10.4) + vitefu: 0.2.5(vite@5.0.9) + which-pm: 2.1.1 + yargs-parser: 21.1.1 + zod: 3.22.4 + optionalDependencies: + sharp: 0.32.6 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - typescript + dev: false + /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -1515,14 +2486,38 @@ packages: engines: {node: '>= 0.4'} dev: false + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: false + /base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + dev: false + /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} dev: false + /bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + dev: false + + /bcp-47@2.1.0: + resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + dependencies: + is-alphabetical: 2.0.1 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + dev: false + /better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -1535,6 +2530,45 @@ packages: engines: {node: '>=0.6'} dev: false + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: false + /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -1583,6 +2617,13 @@ packages: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: false + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + /buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: @@ -1652,10 +2693,19 @@ packages: engines: {node: '>=6'} dev: false + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: false + /caniuse-lite@1.0.30001570: resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} dev: false + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -1678,10 +2728,45 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: false + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + dev: false + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + dev: false + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: false + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + dev: false + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: false + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -1692,6 +2777,11 @@ packages: engines: {node: '>=8'} dev: false + /ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + dev: false + /clean-regexp@1.0.0: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} @@ -1699,6 +2789,11 @@ packages: escape-string-regexp: 1.0.5 dev: false + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: false + /cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1706,6 +2801,11 @@ packages: restore-cursor: 4.0.0 dev: false + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: false + /cli-truncate@3.1.0: resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1742,6 +2842,15 @@ packages: engines: {node: '>=0.8'} dev: false + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + dev: false + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -1763,10 +2872,29 @@ packages: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} dev: false + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + /colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} dev: false + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + /commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -1776,6 +2904,10 @@ packages: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + dev: false + /common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} dev: false @@ -1820,6 +2952,15 @@ packages: split2: 4.2.0 dev: false + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: false + + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: false + /cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.2.2): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} @@ -1878,6 +3019,16 @@ packages: which: 2.0.2 dev: false + /css-selector-parser@3.0.3: + resolution: {integrity: sha512-HAcgYSBFKo1jnglINdHeBPIscPOCOh8vCDCaOV5xkwMSlGPEnfdynxBuWkgZMwXltMKgFbDcr4EPmDpSWi34MA==} + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false + /csv-generate@3.4.3: resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} dev: false @@ -1905,6 +3056,17 @@ packages: engines: {node: '>=8'} dev: false + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: false + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1941,6 +3103,12 @@ packages: engines: {node: '>=0.10.0'} dev: false + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + /decompress-response@3.3.0: resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} engines: {node: '>=4'} @@ -1948,6 +3116,13 @@ packages: mimic-response: 1.0.1 dev: false + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -2018,11 +3193,43 @@ packages: engines: {node: '>=0.10'} dev: false + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: false + /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} dev: false + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false + + /deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + dependencies: + base-64: 1.0.0 + dev: false + + /devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + dev: false + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2030,6 +3237,15 @@ packages: path-type: 4.0.0 dev: false + /direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -2051,6 +3267,11 @@ packages: is-obj: 2.0.0 dev: false + /dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} + engines: {node: '>=4'} + dev: false + /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} dev: false @@ -2118,6 +3339,11 @@ packages: strip-ansi: 6.0.1 dev: false + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + /env-editor@1.1.0: resolution: {integrity: sha512-7AXskzN6T7Q9TFcKAGJprUbpQa4i1VsAetO9rdBqbGMGlragTziBgWt4pVYJMBWHQlLoX0buy6WFikzPH4Qjpw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2232,6 +3458,36 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: false + /esbuild@0.19.9: + resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.9 + '@esbuild/android-arm64': 0.19.9 + '@esbuild/android-x64': 0.19.9 + '@esbuild/darwin-arm64': 0.19.9 + '@esbuild/darwin-x64': 0.19.9 + '@esbuild/freebsd-arm64': 0.19.9 + '@esbuild/freebsd-x64': 0.19.9 + '@esbuild/linux-arm': 0.19.9 + '@esbuild/linux-arm64': 0.19.9 + '@esbuild/linux-ia32': 0.19.9 + '@esbuild/linux-loong64': 0.19.9 + '@esbuild/linux-mips64el': 0.19.9 + '@esbuild/linux-ppc64': 0.19.9 + '@esbuild/linux-riscv64': 0.19.9 + '@esbuild/linux-s390x': 0.19.9 + '@esbuild/linux-x64': 0.19.9 + '@esbuild/netbsd-x64': 0.19.9 + '@esbuild/openbsd-x64': 0.19.9 + '@esbuild/sunos-x64': 0.19.9 + '@esbuild/win32-arm64': 0.19.9 + '@esbuild/win32-ia32': 0.19.9 + '@esbuild/win32-x64': 0.19.9 + dev: false + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -2247,6 +3503,11 @@ packages: engines: {node: '>=10'} dev: false + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + /eslint-config-prettier@8.10.0(eslint@8.53.0): resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true @@ -2641,6 +3902,46 @@ packages: engines: {node: '>=4.0'} dev: false + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + dependencies: + '@types/estree-jsx': 1.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + dependencies: + '@types/estree-jsx': 1.0.3 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/unist': 3.0.2 + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2705,6 +4006,31 @@ packages: strip-final-newline: 3.0.0 dev: false + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + dev: false + + /expressive-code@0.29.4: + resolution: {integrity: sha512-MA0cdWkFsIPQ/DAiPgL49y1mZiOXOuxiBXlZ28SrtItNeoh3/NwUhZ21z5BwlaC7b6nkXfkI4E+HWguuIpEhSA==} + dependencies: + '@expressive-code/core': 0.29.4 + '@expressive-code/plugin-frames': 0.29.4 + '@expressive-code/plugin-shiki': 0.29.4 + '@expressive-code/plugin-text-markers': 0.29.4 + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + /extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} dev: false @@ -2726,6 +4052,10 @@ packages: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} dev: false + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + dev: false + /fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -2833,6 +4163,11 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: false + /flattie@1.1.0: + resolution: {integrity: sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw==} + engines: {node: '>=8'} + dev: false + /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: @@ -2847,6 +4182,10 @@ packages: signal-exit: 4.1.0 dev: false + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + /fs-extra@11.2.0: resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} engines: {node: '>=14.14'} @@ -2910,6 +4249,11 @@ packages: is-property: 1.0.2 dev: false + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2989,6 +4333,14 @@ packages: through2: 4.0.2 dev: false + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + dev: false + + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3037,6 +4389,11 @@ packages: ini: 1.3.8 dev: false + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + /globals@13.23.0: resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} engines: {node: '>=8'} @@ -3111,6 +4468,16 @@ packages: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: false + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} @@ -3165,6 +4532,252 @@ packages: function-bind: 1.1.2 dev: false + /hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + dependencies: + '@types/hast': 3.0.3 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + dev: false + + /hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + dependencies: + '@types/hast': 2.3.8 + '@types/unist': 2.0.10 + hastscript: 7.2.0 + property-information: 6.4.0 + vfile: 5.3.7 + vfile-location: 4.1.0 + web-namespaces: 2.0.1 + dev: false + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.4.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + dev: false + + /hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + dependencies: + '@types/hast': 2.3.8 + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + dependencies: + '@types/hast': 2.3.8 + '@types/parse5': 6.0.3 + hast-util-from-parse5: 7.1.2 + hast-util-to-parse5: 7.1.0 + html-void-elements: 2.0.1 + parse5: 6.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-select@6.0.2: + resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + bcp-47-match: 2.0.3 + comma-separated-tokens: 2.0.3 + css-selector-parser: 3.0.3 + devlop: 1.1.0 + direction: 2.0.1 + hast-util-has-property: 3.0.0 + hast-util-to-string: 3.0.0 + hast-util-whitespace: 3.0.0 + not: 0.1.0 + nth-check: 2.1.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-html@8.0.4: + resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + dependencies: + '@types/hast': 2.3.8 + '@types/unist': 2.0.10 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 7.2.3 + hast-util-whitespace: 2.0.1 + html-void-elements: 2.0.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false + + /hast-util-to-html@9.0.0: + resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + dependencies: + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.1 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false + + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.3 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + dependencies: + '@types/hast': 2.3.8 + comma-separated-tokens: 2.0.3 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-string@3.0.0: + resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.3 + dev: false + + /hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + dependencies: + '@types/hast': 2.3.8 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 3.1.1 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + dev: false + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.3 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.4.0 + space-separated-tokens: 2.0.2 + dev: false + /hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} dev: false @@ -3176,6 +4789,18 @@ packages: lru-cache: 6.0.0 dev: false + /html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + dev: false + + /html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + dev: false + + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: false + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false @@ -3280,6 +4905,14 @@ packages: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} dev: false + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: false + /internal-slot@1.0.6: resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} engines: {node: '>= 0.4'} @@ -3307,6 +4940,17 @@ packages: is-windows: 1.0.2 dev: false + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + dev: false + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + dev: false + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -3319,12 +4963,23 @@ packages: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: false + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 dev: false + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} @@ -3333,6 +4988,11 @@ packages: has-tostringtag: 1.0.0 dev: false + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + /is-builtin-module@3.2.1: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} @@ -3358,6 +5018,10 @@ packages: has-tostringtag: 1.0.0 dev: false + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + dev: false + /is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -3370,6 +5034,11 @@ packages: hasBin: true dev: false + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -3406,6 +5075,10 @@ packages: is-extglob: 2.1.1 dev: false + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + dev: false + /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -3469,6 +5142,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + /is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} dev: false @@ -3480,6 +5158,12 @@ packages: proto-props: 2.0.0 dev: false + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.5 + dev: false + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -3558,6 +5242,11 @@ packages: engines: {node: '>=10'} dev: false + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + /is-unicode-supported@2.0.0: resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} engines: {node: '>=18'} @@ -3581,6 +5270,13 @@ packages: is-docker: 2.2.1 dev: false + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: false + /isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: false @@ -3645,6 +5341,12 @@ packages: hasBin: true dev: false + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + /jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -3686,6 +5388,16 @@ packages: minimist: 1.2.8 dev: false + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: false + /jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: @@ -3722,6 +5434,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: false + /kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -3884,6 +5601,14 @@ packages: is-unicode-supported: 0.1.0 dev: false + /log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + dev: false + /log-update@5.0.1: resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3910,6 +5635,10 @@ packages: resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} dev: false + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + dev: false + /lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} @@ -3932,6 +5661,12 @@ packages: yallist: 2.1.2 dev: false + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -3949,6 +5684,13 @@ packages: engines: {node: '>=16.14'} dev: false + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + /map-obj@1.0.1: resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} engines: {node: '>=0.10.0'} @@ -3959,6 +5701,232 @@ packages: engines: {node: '>=8'} dev: false + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + dev: false + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false + + /mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + dependencies: + '@types/mdast': 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + dependencies: + '@types/mdast': 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + dev: false + + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@3.0.0: + resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.0.0 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.3 + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + dev: false + + /mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.0.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + dev: false + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 + dev: false + /memory-fs@0.2.0: resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} dev: false @@ -4020,6 +5988,352 @@ packages: resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} dev: false + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-directive@3.0.0: + resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + parse-entities: 4.0.1 + dev: false + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.0.1 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: false + + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: false + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: false + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: false + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} @@ -4040,6 +6354,12 @@ packages: mime-db: 1.52.0 dev: false + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -4055,6 +6375,11 @@ packages: engines: {node: '>=4'} dev: false + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -4096,6 +6421,14 @@ packages: engines: {node: '>= 8.0.0'} dev: false + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: false @@ -4121,10 +6454,32 @@ packages: lru-cache: 7.18.3 dev: false + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + dev: false + /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: false + /needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + dependencies: + debug: 3.2.7 + iconv-lite: 0.4.24 + sax: 1.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: false @@ -4133,6 +6488,23 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: false + /nlcst-to-string@3.1.1: + resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + dependencies: + '@types/nlcst': 1.0.4 + dev: false + + /node-abi@3.52.0: + resolution: {integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: false + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + dev: false + /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} dev: false @@ -4166,6 +6538,10 @@ packages: engines: {node: '>=8'} dev: false + /not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + dev: false + /npm-run-all@4.1.5: resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} engines: {node: '>= 4'} @@ -4196,6 +6572,12 @@ packages: path-key: 4.0.0 dev: false + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + /obj-props@1.4.0: resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} engines: {node: '>=0.10.0'} @@ -4295,6 +6677,21 @@ packages: type-check: 0.4.0 dev: false + /ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + string-width: 6.1.0 + strip-ansi: 7.1.0 + dev: false + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -4337,6 +6734,13 @@ packages: yocto-queue: 1.0.0 dev: false + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: false + /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -4363,6 +6767,19 @@ packages: engines: {node: '>=6'} dev: false + /p-queue@7.4.1: + resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} + engines: {node: '>=12'} + dependencies: + eventemitter3: 5.0.1 + p-timeout: 5.1.0 + dev: false + + /p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + dev: false + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -4378,6 +6795,17 @@ packages: semver: 6.3.1 dev: false + /pagefind@1.0.4: + resolution: {integrity: sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==} + hasBin: true + optionalDependencies: + '@pagefind/darwin-arm64': 1.0.4 + '@pagefind/darwin-x64': 1.0.4 + '@pagefind/linux-arm64': 1.0.4 + '@pagefind/linux-x64': 1.0.4 + '@pagefind/windows-x64': 1.0.4 + dev: false + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4385,6 +6813,19 @@ packages: callsites: 3.1.0 dev: false + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + dev: false + /parse-github-url@1.0.2: resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} engines: {node: '>=0.10.0'} @@ -4409,11 +6850,29 @@ packages: lines-and-columns: 1.2.4 dev: false + /parse-latin@5.0.1: + resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + dependencies: + nlcst-to-string: 3.1.1 + unist-util-modify-children: 3.1.1 + unist-util-visit-children: 2.0.2 + dev: false + /parse-ms@3.0.0: resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} engines: {node: '>=12'} dev: false + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: false + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -4456,6 +6915,10 @@ packages: minipass: 7.0.4 dev: false + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + /path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} @@ -4468,6 +6931,14 @@ packages: engines: {node: '>=8'} dev: false + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + dev: false + /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: false @@ -4560,6 +7031,52 @@ packages: engines: {node: '>=4'} dev: false + /postcss-nested@6.0.1(postcss@8.4.32): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.32 + postcss-selector-parser: 6.0.13 + dev: false + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.52.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + /preferred-pm@3.1.2: resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} engines: {node: '>=10'} @@ -4606,6 +7123,21 @@ packages: parse-ms: 3.0.0 dev: false + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: false + + /probe-image-size@7.2.3: + resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==} + dependencies: + lodash.merge: 4.6.2 + needle: 2.9.1 + stream-parser: 0.3.1 + transitivePeerDependencies: + - supports-color + dev: false + /process-warning@2.3.2: resolution: {integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==} dev: false @@ -4615,6 +7147,18 @@ packages: engines: {node: '>= 0.6.0'} dev: false + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + + /property-information@6.4.0: + resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + dev: false + /proto-props@2.0.0: resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} engines: {node: '>=4'} @@ -4640,6 +7184,10 @@ packages: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: false + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + dev: false + /quick-format-unescaped@4.0.4: resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} dev: false @@ -4723,6 +7271,13 @@ packages: string_decoder: 1.3.0 dev: false + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + /real-require@0.2.0: resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} engines: {node: '>= 12.13.0'} @@ -4775,6 +7330,118 @@ packages: jsesc: 0.5.0 dev: false + /rehype-parse@9.0.0: + resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + dependencies: + '@types/hast': 3.0.3 + hast-util-from-html: 2.0.1 + unified: 11.0.4 + dev: false + + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + dependencies: + '@types/hast': 3.0.3 + hast-util-raw: 9.0.1 + vfile: 6.0.1 + dev: false + + /rehype-stringify@10.0.0: + resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + dependencies: + '@types/hast': 3.0.3 + hast-util-to-html: 9.0.0 + unified: 11.0.4 + dev: false + + /rehype@13.0.1: + resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + dependencies: + '@types/hast': 3.0.3 + rehype-parse: 9.0.0 + rehype-stringify: 10.0.0 + unified: 11.0.4 + dev: false + + /remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-expressive-code@0.29.4: + resolution: {integrity: sha512-7PX6TgPKFDfrixlBugCXYQGb6HWWGCyMcLBSpUZG8aiJvbFEaERYTMhj3WPKc2haAqliCcMjzGV4Kdbl+ci0yA==} + dependencies: + expressive-code: 0.29.4 + hast-util-to-html: 8.0.4 + unist-util-visit: 4.1.2 + dev: false + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-mdx@3.0.0: + resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@11.0.0: + resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} + dependencies: + '@types/hast': 3.0.3 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.0.2 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + + /remark-smartypants@2.0.0: + resolution: {integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + retext: 8.1.0 + retext-smartypants: 5.2.0 + unist-util-visit: 4.1.2 + dev: false + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + dev: false + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4842,6 +7509,41 @@ packages: signal-exit: 3.0.7 dev: false + /retext-latin@3.1.0: + resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + dependencies: + '@types/nlcst': 1.0.4 + parse-latin: 5.0.1 + unherit: 3.0.1 + unified: 10.1.2 + dev: false + + /retext-smartypants@5.2.0: + resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + dependencies: + '@types/nlcst': 1.0.4 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + unist-util-visit: 4.1.2 + dev: false + + /retext-stringify@3.1.0: + resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + dependencies: + '@types/nlcst': 1.0.4 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + dev: false + + /retext@8.1.0: + resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + dependencies: + '@types/nlcst': 1.0.4 + retext-latin: 3.1.0 + retext-stringify: 3.1.0 + unified: 10.1.2 + dev: false + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4858,6 +7560,27 @@ packages: glob: 7.2.3 dev: false + /rollup@4.9.0: + resolution: {integrity: sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.0 + '@rollup/rollup-android-arm64': 4.9.0 + '@rollup/rollup-darwin-arm64': 4.9.0 + '@rollup/rollup-darwin-x64': 4.9.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.0 + '@rollup/rollup-linux-arm64-gnu': 4.9.0 + '@rollup/rollup-linux-arm64-musl': 4.9.0 + '@rollup/rollup-linux-riscv64-gnu': 4.9.0 + '@rollup/rollup-linux-x64-gnu': 4.9.0 + '@rollup/rollup-linux-x64-musl': 4.9.0 + '@rollup/rollup-win32-arm64-msvc': 4.9.0 + '@rollup/rollup-win32-ia32-msvc': 4.9.0 + '@rollup/rollup-win32-x64-msvc': 4.9.0 + fsevents: 2.3.3 + dev: false + /run-applescript@5.0.0: resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} engines: {node: '>=12'} @@ -4902,6 +7625,10 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: false + /sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + dev: false + /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -4911,6 +7638,14 @@ packages: ajv-keywords: 3.5.2(ajv@6.12.6) dev: false + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + /sembear@0.5.2: resolution: {integrity: sha512-Ij1vCAdFgWABd7zTg50Xw1/p0JgESNxuLlneEAsmBrKishA06ulTTL/SHGmNy2Zud7+rKrHTKNI6moJsn1ppAQ==} dependencies: @@ -4953,6 +7688,10 @@ packages: randombytes: 2.1.0 dev: false + /server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + dev: false + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: false @@ -4976,6 +7715,21 @@ packages: has-property-descriptors: 1.0.1 dev: false + /sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 + dev: false + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -5004,6 +7758,21 @@ packages: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} dev: false + /shiki@0.14.6: + resolution: {integrity: sha512-R4koBBlQP33cC8cpzX0hAoOURBHJILp4Aaduh2eYi+Vj8ZBqtK/5SWNEHBS3qwUMu8dqOtI/ftno3ESfNeVW9g==} + dependencies: + ansi-sequence-parser: 1.1.1 + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + dev: false + + /shikiji@0.6.13: + resolution: {integrity: sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==} + dependencies: + hast-util-to-html: 9.0.0 + dev: false + /side-channel@1.0.4: resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} dependencies: @@ -5021,6 +7790,39 @@ packages: engines: {node: '>=14'} dev: false + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + dev: false + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + + /sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + dependencies: + '@types/node': 17.0.45 + '@types/sax': 1.2.7 + arg: 5.0.2 + sax: 1.3.0 + dev: false + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -5071,6 +7873,11 @@ packages: atomic-sleep: 1.0.0 dev: false + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: @@ -5083,6 +7890,15 @@ packages: engines: {node: '>=0.10.0'} dev: false + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + /spawndamnit@2.0.0: resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} dependencies: @@ -5132,12 +7948,34 @@ packages: engines: {node: '>= 0.6'} dev: false + /stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bl: 5.1.0 + dev: false + + /stream-parser@0.3.1: + resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + dependencies: + debug: 2.6.9 + transitivePeerDependencies: + - supports-color + dev: false + /stream-transform@2.1.3: resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} dependencies: mixme: 0.5.9 dev: false + /streamx@2.15.6: + resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: false + /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5161,6 +7999,15 @@ packages: strip-ansi: 7.1.0 dev: false + /string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.3.0 + strip-ansi: 7.1.0 + dev: false + /string-width@7.0.0: resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} engines: {node: '>=18'} @@ -5210,6 +8057,13 @@ packages: safe-buffer: 5.2.1 dev: false + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + dev: false + /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5224,6 +8078,11 @@ packages: ansi-regex: 6.0.1 dev: false + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -5256,6 +8115,18 @@ packages: engines: {node: '>=8'} dev: false + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -5308,6 +8179,42 @@ packages: engines: {node: '>=6'} dev: false + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: false + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.6 + dev: false + /term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -5393,6 +8300,11 @@ packages: is-negated-glob: 1.0.0 dev: false + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + /to-readable-stream@1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} @@ -5405,11 +8317,19 @@ packages: is-number: 7.0.0 dev: false + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + /trim-newlines@3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} dev: false + /trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + dev: false + /ts-api-utils@1.0.3(typescript@5.2.2): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} @@ -5419,6 +8339,19 @@ packages: typescript: 5.2.2 dev: false + /tsconfck@3.0.0(typescript@5.2.2): + resolution: {integrity: sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.2.2 + dev: false + /tsconfig-paths@3.14.2: resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} dependencies: @@ -5457,6 +8390,12 @@ packages: yargs: 17.7.2 dev: false + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + /turbo-darwin-64@1.10.16: resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} cpu: [x64] @@ -5631,6 +8570,134 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: false + /unherit@3.0.1: + resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} + dev: false + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 5.3.7 + dev: false + + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.1.0 + vfile: 6.0.1 + dev: false + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-modify-children@3.1.1: + resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + dependencies: + '@types/unist': 2.0.10 + array-iterate: 2.0.1 + dev: false + + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false + + /unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-visit-children@2.0.2: + resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -5691,6 +8758,106 @@ packages: builtins: 1.0.3 dev: false + /vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + dependencies: + '@types/unist': 2.0.10 + vfile: 5.3.7 + dev: false + + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + dev: false + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + + /vite@5.0.9(@types/node@20.10.4): + resolution: {integrity: sha512-wVqMd5kp28QWGgfYPDfrj771VyHTJ4UDlCteLH7bJDGDEamaz5hV8IX6h1brSGgnnyf9lI2RnzXq/JmD0c2wwg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.10.4 + esbuild: 0.19.9 + postcss: 8.4.32 + rollup: 4.9.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /vitefu@0.2.5(vite@5.0.9): + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 5.0.9(@types/node@20.10.4) + dev: false + + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: false + + /vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + dev: false + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} @@ -5705,6 +8872,10 @@ packages: defaults: 1.0.4 dev: false + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + /webpack-sources@3.2.3: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} @@ -5764,6 +8935,11 @@ packages: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} dev: false + /which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + dev: false + /which-pm@2.0.0: resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} engines: {node: '>=8.15'} @@ -5772,6 +8948,14 @@ packages: path-exists: 4.0.0 dev: false + /which-pm@2.1.1: + resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + /which-typed-array@1.1.13: resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} engines: {node: '>= 0.4'} @@ -5798,6 +8982,13 @@ packages: isexe: 2.0.0 dev: false + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: false + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -5904,6 +9095,10 @@ packages: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: false + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: false @@ -5970,3 +9165,11 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 18ec407..59a60bd 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,3 @@ packages: - 'packages/*' + - 'docs' From 99d189aeb909cebb816a4b542be9513d55dfb245 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 09:27:44 +0100 Subject: [PATCH 002/136] docs: move all plugin types under the same "Plugins" category --- docs/astro.config.mjs | 52 ++++++++++++------- docs/src/content/docs/getting-started.mdx | 10 ++-- docs/src/content/docs/plugins/index.mdx | 35 +++++++++++++ .../docs/{ => plugins}/loaders/default.mdx | 0 .../docs/{ => plugins}/loaders/index.mdx | 2 +- .../docs/{ => plugins}/loaders/mysql.mdx | 0 .../docs/{ => plugins}/reporters/default.mdx | 0 .../docs/{ => plugins}/reporters/index.mdx | 0 .../docs/{ => plugins}/reporters/pino.mdx | 0 .../{ => plugins}/storage/file-system.mdx | 0 .../docs/{ => plugins}/storage/index.mdx | 0 .../docs/{ => plugins}/storage/mysql.mdx | 0 12 files changed, 73 insertions(+), 26 deletions(-) create mode 100644 docs/src/content/docs/plugins/index.mdx rename docs/src/content/docs/{ => plugins}/loaders/default.mdx (100%) rename docs/src/content/docs/{ => plugins}/loaders/index.mdx (95%) rename docs/src/content/docs/{ => plugins}/loaders/mysql.mdx (100%) rename docs/src/content/docs/{ => plugins}/reporters/default.mdx (100%) rename docs/src/content/docs/{ => plugins}/reporters/index.mdx (100%) rename docs/src/content/docs/{ => plugins}/reporters/pino.mdx (100%) rename docs/src/content/docs/{ => plugins}/storage/file-system.mdx (100%) rename docs/src/content/docs/{ => plugins}/storage/index.mdx (100%) rename docs/src/content/docs/{ => plugins}/storage/mysql.mdx (100%) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index aa5a281..ea22a06 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -18,27 +18,39 @@ export default defineConfig({ link: '/getting-started/', }, { - label: 'Storage Plugins', + label: 'Plugins', items: [ - { label: 'Introduction', link: '/storage/' }, - { label: 'File System', link: '/storage/file-system/' }, - { label: 'MySQL', link: '/storage/mysql/' }, - ], - }, - { - label: 'Loader Plugins', - items: [ - { label: 'Introduction', link: '/loaders/' }, - { label: 'Default Loader', link: '/loaders/default/' }, - { label: 'MySQL Loader', link: '/loaders/mysql/' }, - ], - }, - { - label: 'Reporters', - items: [ - { label: 'Introduction', link: '/reporters/' }, - { label: 'Default Reporter', link: '/reporters/default/', badge: 'WIP' }, - { label: 'Pino Reporter', link: '/reporters/pino/', badge: 'WIP' }, + { + label: 'Introduction', + link: '/plugins/', + }, + { + label: 'Storage Plugins', + collapsed: true, + items: [ + { label: 'Introduction', link: '/plugins/storage/' }, + { label: 'File System', link: '/plugins/storage/file-system/' }, + { label: 'MySQL', link: '/plugins/storage/mysql/' }, + ], + }, + { + label: 'Loader Plugins', + collapsed: true, + items: [ + { label: 'Introduction', link: '/plugins/loaders/' }, + { label: 'Default Loader', link: '/plugins/loaders/default/' }, + { label: 'MySQL Loader', link: '/plugins/loaders/mysql/' }, + ], + }, + { + label: 'Reporters', + collapsed: true, + items: [ + { label: 'Introduction', link: '/plugins/reporters/' }, + { label: 'Default Reporter', link: '/plugins/reporters/default/', badge: 'WIP' }, + { label: 'Pino Reporter', link: '/plugins/reporters/pino/', badge: 'WIP' }, + ], + }, ], }, { diff --git a/docs/src/content/docs/getting-started.mdx b/docs/src/content/docs/getting-started.mdx index cfad31e..8f44c5d 100644 --- a/docs/src/content/docs/getting-started.mdx +++ b/docs/src/content/docs/getting-started.mdx @@ -14,7 +14,7 @@ Emigrate is written in [TypeScript](https://www.typescriptlang.org) and is a dat * The output can be customized using [Reporters](/reporters/). :::tip[Did you know?] -Thanks to the plugin system you can even write migrations in plain SQL! So no need for Java-based tools like Liquibase or Flyway. +Thanks to [the plugin system](/plugins/) you can even write migrations in plain SQL! So no need for Java-based tools like Liquibase or Flyway. ::: ## Quick Start @@ -46,10 +46,10 @@ But for now, this is the way to go. ### Pick a storage plugin -Emigrate uses a storage plugin to store the migration history. You can use one of the following plugins: +Emigrate uses a [storage plugin](/plugins/storage/) to store the migration history. You can use one of the following plugins: -- [MySQL](/storage/mysql) -- [File System](/storage/file-system) +- [MySQL](/plugins/storage/mysql) +- [File System](/plugins/storage/file-system) Install the plugin you want to use, for example: @@ -95,7 +95,7 @@ Otherwise the file would have the `.js` extension by default. :::tip[Did you know?] You can avoid typing `--plugin mysql` by configuring Emigrate using an `emigrate.config.js` file. -See [Configuration](/configuration) for more information. +See [Configuration](/configuration/) for more information. ::: #### Fill the migration file diff --git a/docs/src/content/docs/plugins/index.mdx b/docs/src/content/docs/plugins/index.mdx new file mode 100644 index 0000000..0b19dad --- /dev/null +++ b/docs/src/content/docs/plugins/index.mdx @@ -0,0 +1,35 @@ +--- +title: The Plugin System +--- + +import { LinkCard } from '@astrojs/starlight/components'; + +Emigrate uses a plugin system to allow you to extend and customize the functionality so that it fits your needs. + +## The types of plugins + +Emigrate supports different types of plugins that all have different purposes. + + + + + + + + diff --git a/docs/src/content/docs/loaders/default.mdx b/docs/src/content/docs/plugins/loaders/default.mdx similarity index 100% rename from docs/src/content/docs/loaders/default.mdx rename to docs/src/content/docs/plugins/loaders/default.mdx diff --git a/docs/src/content/docs/loaders/index.mdx b/docs/src/content/docs/plugins/loaders/index.mdx similarity index 95% rename from docs/src/content/docs/loaders/index.mdx rename to docs/src/content/docs/plugins/loaders/index.mdx index ddbf52d..3b0bde7 100644 --- a/docs/src/content/docs/loaders/index.mdx +++ b/docs/src/content/docs/plugins/loaders/index.mdx @@ -19,7 +19,7 @@ npx emigrate up --plugin mysql Or set it up in your configuration file, see [Plugin configuration](/reference/configuration/#plugins) for more information. :::tip[Did you know?] -You can specify multiple loader plugins at the same time, which is needed when you mix file types in your migrations. +You can specify multiple loader plugins at the same time, which is needed when you mix file types in your migrations folder. For example, you can use the `mysql` loader for `.sql` files and the `typescript` loader for `.ts` files. The [default loader](/loaders/default/) will be used for all other file types, and doesn't need to be specified. ::: diff --git a/docs/src/content/docs/loaders/mysql.mdx b/docs/src/content/docs/plugins/loaders/mysql.mdx similarity index 100% rename from docs/src/content/docs/loaders/mysql.mdx rename to docs/src/content/docs/plugins/loaders/mysql.mdx diff --git a/docs/src/content/docs/reporters/default.mdx b/docs/src/content/docs/plugins/reporters/default.mdx similarity index 100% rename from docs/src/content/docs/reporters/default.mdx rename to docs/src/content/docs/plugins/reporters/default.mdx diff --git a/docs/src/content/docs/reporters/index.mdx b/docs/src/content/docs/plugins/reporters/index.mdx similarity index 100% rename from docs/src/content/docs/reporters/index.mdx rename to docs/src/content/docs/plugins/reporters/index.mdx diff --git a/docs/src/content/docs/reporters/pino.mdx b/docs/src/content/docs/plugins/reporters/pino.mdx similarity index 100% rename from docs/src/content/docs/reporters/pino.mdx rename to docs/src/content/docs/plugins/reporters/pino.mdx diff --git a/docs/src/content/docs/storage/file-system.mdx b/docs/src/content/docs/plugins/storage/file-system.mdx similarity index 100% rename from docs/src/content/docs/storage/file-system.mdx rename to docs/src/content/docs/plugins/storage/file-system.mdx diff --git a/docs/src/content/docs/storage/index.mdx b/docs/src/content/docs/plugins/storage/index.mdx similarity index 100% rename from docs/src/content/docs/storage/index.mdx rename to docs/src/content/docs/plugins/storage/index.mdx diff --git a/docs/src/content/docs/storage/mysql.mdx b/docs/src/content/docs/plugins/storage/mysql.mdx similarity index 100% rename from docs/src/content/docs/storage/mysql.mdx rename to docs/src/content/docs/plugins/storage/mysql.mdx From c460ae7459b1648c0b0ea11cdbc933e976d22ddf Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 10:04:06 +0100 Subject: [PATCH 003/136] docs: split the getting started guide into two separate pages in the "introduction" section --- .editorconfig | 2 +- docs/astro.config.mjs | 13 +++++- docs/src/content/docs/index.mdx | 24 ++++++----- .../quick-start.mdx} | 43 ++++++++----------- .../src/content/docs/intro/whats-emigrate.mdx | 17 ++++++++ 5 files changed, 60 insertions(+), 39 deletions(-) rename docs/src/content/docs/{getting-started.mdx => intro/quick-start.mdx} (60%) create mode 100644 docs/src/content/docs/intro/whats-emigrate.mdx diff --git a/.editorconfig b/.editorconfig index 4d5114b..07daa84 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,7 +5,7 @@ end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true -[*.md] +[*.{md,mdx}] trim_trailing_whitespace = false [*.{ts,js,tsx,json,yml}] diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index ea22a06..c91251a 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -14,8 +14,17 @@ export default defineConfig({ }, sidebar: [ { - label: 'Getting Started', - link: '/getting-started/', + label: 'Introduction', + items: [ + { + label: "What's Emigrate?", + link: '/intro/whats-emigrate/', + }, + { + label: 'Quick Start', + link: '/intro/quick-start/', + }, + ], }, { label: 'Plugins', diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index fc43de1..7f16846 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -3,12 +3,12 @@ title: Effortless database changes with Emigrate description: Adapt any and all of your databases to your needs at any scale. Modern, flexible, and easy to use. template: splash hero: - tagline: Adapt any and all of your databases to new business needs.
Emigrate is modern, flexible, scalable, and easy to use. + tagline: Adapt any and all of your databases to new business needs.
Emigrate is a modern migration tool that's flexible, scalable, and easy to use. image: file: ../../assets/houston.webp actions: - text: Quick Start - link: /getting-started/ + link: /intro/quick-start/ icon: right-arrow variant: primary - text: View on GitHub @@ -18,19 +18,21 @@ hero: import { Card, CardGrid } from '@astrojs/starlight/components'; -## Next steps +## Key features - - Edit `src/content/docs/index.mdx` to see this page change. + + Emigrate is a database agnostic migration tool.
+ You are in full control over what your migrations do.
- - Add Markdown or MDX files to `src/content/docs` to create new pages. + + Migrate many databases from one repository or many repositories to one database. There's no need to synchronize deployments. - - Edit your `sidebar` and other config in `astro.config.mjs`. + + Write your migration files using the [language of your choice](/plugins/loaders/). + And mix and match them as you need. E.g. `SQL` for database schema changes, and `JavaScript` for data transformation. - - Learn more in [the Starlight Docs](https://starlight.astro.build/). + + Emigrate is designed to be flexible and customizable to suite any environment and setup using its [plugin system](/plugins/).
diff --git a/docs/src/content/docs/getting-started.mdx b/docs/src/content/docs/intro/quick-start.mdx similarity index 60% rename from docs/src/content/docs/getting-started.mdx rename to docs/src/content/docs/intro/quick-start.mdx index 8f44c5d..8b17463 100644 --- a/docs/src/content/docs/getting-started.mdx +++ b/docs/src/content/docs/intro/quick-start.mdx @@ -1,29 +1,21 @@ --- -title: Getting Started -description: How to getting started with Emigrate, the database migration tool +title: Quick Start +description: Get going with Emigrate quickly --- -import { Tabs, TabItem } from '@astrojs/starlight/components'; - -Emigrate is written in [TypeScript](https://www.typescriptlang.org) and is a database migration tool for any database. - -* It's the successor of [klei-migrate](https://github.com/klei/migrate) and is designed to be compatible with [Immigration](https://github.com/blakeembrey/node-immigration) and many of its storage plugins, as well as [Migrate](https://github.com/tj/node-migrate). -* It supports migration files written using [CommonJS or ES Modules out of the box](/loaders/default/), with any of the following extensions: `.js`, `.cjs` or `.mjs`, and supports [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or using the [NodeJS Callback Pattern](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks#handling-errors-in-callbacks). -* Other languages can be used by using a [Loader Plugin](/loaders/). -* The migration history can be stored anywhere using a [Storage Plugin](/storage/). -* The output can be customized using [Reporters](/reporters/). - -:::tip[Did you know?] -Thanks to [the plugin system](/plugins/) you can even write migrations in plain SQL! So no need for Java-based tools like Liquibase or Flyway. -::: - -## Quick Start +import { Tabs, TabItem, LinkCard } from '@astrojs/starlight/components'; :::note The following guide will be even simpler soon with the release of a initialization command. But for now, this is the way to go. ::: + + ### Install the Emigrate CLI @@ -46,10 +38,7 @@ But for now, this is the way to go. ### Pick a storage plugin -Emigrate uses a [storage plugin](/plugins/storage/) to store the migration history. You can use one of the following plugins: - -- [MySQL](/plugins/storage/mysql) -- [File System](/plugins/storage/file-system) +Emigrate uses a [storage plugin](/plugins/storage/) to store the migration history. Install the plugin you want to use, for example: @@ -80,7 +69,7 @@ npx emigrate new --plugin mysql create users table ``` ```txt title="Output" -Emigrate new v0.9.0 /your/project/path +Emigrate new v0.10.0 /your/project/path βœ” migrations/20231215125421364_create_users_table.sql (done) 3ms @@ -112,6 +101,10 @@ CREATE TABLE users ( ); ``` +:::note +There's no magic about the first line comment as when using Liquibase, it's just a comment and can be erased. +::: + ### Show migration status To show both pending and already applied migrations (or previously failed), use the `list` command: @@ -121,7 +114,7 @@ npx emigrate list --storage mysql ``` ```txt title="Example output" -Emigrate list v0.9.0 /your/project/path +Emigrate list v0.10.0 /your/project/path βœ” migrations/20231211090830577_another_table.sql (done) β€Ί migrations/20231215125421364_create_users_table.sql (pending) @@ -148,6 +141,6 @@ Be sure to configure the connection correctly and use the `--dry` flag to test y ::: :::tip[Did you know?] -In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a [Storage Plugin](/storage/) -and once for the `--plugin` option as a [Loader Plugin](/loaders/) to be able to read `.sql` files. +In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a [Storage Plugin](/plugins/storage/) +and once for the `--plugin` option as a [Loader Plugin](/plugins/loaders/) to be able to read `.sql` files. ::: diff --git a/docs/src/content/docs/intro/whats-emigrate.mdx b/docs/src/content/docs/intro/whats-emigrate.mdx new file mode 100644 index 0000000..4697e1c --- /dev/null +++ b/docs/src/content/docs/intro/whats-emigrate.mdx @@ -0,0 +1,17 @@ +--- +title: What's Emigrate? +description: An introduction to Emigrate, the modern database agnostic migration tool. +--- + +Emigrate is written in [TypeScript](https://www.typescriptlang.org) and is a migration tool for any database or data. + +* It's database agnostic - you can use it with any database, or even with non-database data. +* It's the successor of [klei-migrate](https://github.com/klei/migrate) and is designed to be compatible with [Immigration](https://github.com/blakeembrey/node-immigration) and many of its storage plugins, as well as [Migrate](https://github.com/tj/node-migrate). +* It supports migration files written using [CommonJS or ES Modules out of the box](/plugins/loaders/default/), with any of the following extensions: `.js`, `.cjs` or `.mjs`, and supports [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or using the [NodeJS Callback Pattern](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks#handling-errors-in-callbacks). +* Other languages can be used by using a [Loader Plugin](/plugins/loaders/). +* The migration history can be stored anywhere using a [Storage Plugin](/plugins/storage/). +* The output can be customized using [Reporters](/plugins/reporters/). + +:::tip[Did you know?] +Thanks to [the plugin system](/plugins/) you can even write migrations in plain SQL! So no need for Java-based tools like Liquibase or Flyway. +::: From 2a82897ba8cdd353c72d1d3319cdb0a9863c0c08 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 11:55:32 +0100 Subject: [PATCH 004/136] docs: add documentation for the commands: up, list, new and remove --- docs/astro.config.mjs | 24 +++++++ docs/src/components/PageTitle.astro | 27 ++++++++ docs/src/content/docs/commands/list.mdx | 55 ++++++++++++++++ docs/src/content/docs/commands/new.mdx | 72 +++++++++++++++++++++ docs/src/content/docs/commands/remove.mdx | 62 ++++++++++++++++++ docs/src/content/docs/commands/up.mdx | 76 +++++++++++++++++++++++ 6 files changed, 316 insertions(+) create mode 100644 docs/src/components/PageTitle.astro create mode 100644 docs/src/content/docs/commands/list.mdx create mode 100644 docs/src/content/docs/commands/new.mdx create mode 100644 docs/src/content/docs/commands/remove.mdx create mode 100644 docs/src/content/docs/commands/up.mdx diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index c91251a..fdbadee 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -12,6 +12,9 @@ export default defineConfig({ editLink: { baseUrl: 'https://github.com/aboviq/emigrate/edit/main/docs/', }, + components: { + PageTitle: './src/components/PageTitle.astro', + }, sidebar: [ { label: 'Introduction', @@ -26,6 +29,27 @@ export default defineConfig({ }, ], }, + { + label: 'Commands', + items: [ + { + label: 'emigrate up', + link: '/commands/up/', + }, + { + label: 'emigrate list', + link: '/commands/list/', + }, + { + label: 'emigrate new', + link: '/commands/new/', + }, + { + label: 'emigrate remove', + link: '/commands/remove/', + }, + ], + }, { label: 'Plugins', items: [ diff --git a/docs/src/components/PageTitle.astro b/docs/src/components/PageTitle.astro new file mode 100644 index 0000000..76e9e02 --- /dev/null +++ b/docs/src/components/PageTitle.astro @@ -0,0 +1,27 @@ +--- +import type { Props } from '@astrojs/starlight/props'; + +const { title } = Astro.props.entry.data; +const isCode = title.startsWith('`') && title.endsWith('`'); +--- + +

{isCode ? {title.slice(1, -1)} : title}

+ + diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx new file mode 100644 index 0000000..c17dedb --- /dev/null +++ b/docs/src/content/docs/commands/list.mdx @@ -0,0 +1,55 @@ +--- +title: "`emigrate list`" +description: "List migrations and their status." +--- + +The `list` command is used to list _all_ migrations, i.e. both already run migrations and migrations that haven't been run yet. + +Emigrate takes all migration files in the given directory that haven't been run yet and all migrations from the migration history. +It then sorts the migrations by filename in ascending order and outputs them and their respective status one by one. + +## Usage + +```bash +emigrate list [options] +``` + +## Options + +### `-h`, `--help` + +Show command help and exit + +### `-d`, `--directory ` + +The directory where the migration files are located. The given path should be absolute or relative to the current working directory. + +### `-s`, `--storage ` + +The storage to use for where to read the migration history. + +The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: + +- `@emigrate/storage-` +- `emigrate-storage-` +- `@emigrate/plugin-storage-` +- `@emigrate/` + +And then try to load the module/package with the given name. + +For example, if you want to use the `emigrate-storage-somedb` package, you can specify either `emigrate-storage-somedb` or just `somedb` as the name. +In case you have both a `emigrate-storage-somedb` and a `somedb` package installed, the `emigrate-storage-somedb` package will be used. + +### `-r`, `--reporter ` + +The reporter to use for listing the migrations. + +The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: + +- `@emigrate/reporter-` +- `emigrate-reporter-` +- `@emigrate/` + +And then try to load the module/package with the given name. + +For example, if you want to use the `emigrate-reporter-somereporter` package, you can specify either `emigrate-reporter-somereporter` or just `somereporter` as the name. diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx new file mode 100644 index 0000000..48ca2be --- /dev/null +++ b/docs/src/content/docs/commands/new.mdx @@ -0,0 +1,72 @@ +--- +title: "`emigrate new`" +description: "Create new migration." +--- + +The `new` command is used to create a new migration file in the given directory. + +The migration file can be based on a template, generated by a [generator plugin](/plugins/generators/), or just be an empty file. + +## Usage + +```bash +emigrate new [options] +``` + +## Arguments + +### `` + +The name of the migration. The name will be used to generate the migration filename. + +The name can be provided as a single argument or as multiple arguments. +If multiple arguments are provided, the arguments will be joined with a space before being passed to the filename generator (the default filename generator replaces all whitespace and non-path safe characters with underscores). + +## Options + +### `-h`, `--help` + +Show command help and exit + +### `-d`, `--directory ` + +The directory where the migration files are located. The given path should be absolute or relative to the current working directory. + +### `-t`, `--template ` + +The template file to use for generating the migration file. The given path should be absolute or relative to the current working directory. + +The template can contain a `{{name}}` placeholder which will be replaced with the migration name provided to the command. The generated file will have the same extension as the template file, unless the [`--extension`](#e---extension-ext) option is used. + +### `-e`, `--extension ` + +The extension to use for the migration file. Unless the [`--template`](#t---template-path) option is also specified the file will be empty. + +### `-p`, `--plugin ` + +The [generator plugin](/plugins/generators/) to use. The generator plugin is responsible for generating the migration filename and its contents. + +The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: + +- `@emigrate/plugin-` +- `emigrate-plugin-` +- `@emigrate/` + +And then try to load the module/package with the given name. + +For example, if you want to use the `emigrate-plugin-someplugin` package, you can specify either `emigrate-plugin-someplugin` or just `someplugin` as the name. +In case you have both a `emigrate-plugin-someplugin` and a `someplugin` package installed, the `emigrate-plugin-someplugin` package will be used. + +### `-r`, `--reporter ` + +The reporter to use for listing the migrations. + +The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: + +- `@emigrate/reporter-` +- `emigrate-reporter-` +- `@emigrate/` + +And then try to load the module/package with the given name. + +For example, if you want to use the `emigrate-reporter-somereporter` package, you can specify either `emigrate-reporter-somereporter` or just `somereporter` as the name. diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx new file mode 100644 index 0000000..dca59ae --- /dev/null +++ b/docs/src/content/docs/commands/remove.mdx @@ -0,0 +1,62 @@ +--- +title: "`emigrate remove`" +description: "Remove a migration from the history." +--- + +The `remove` command is used to remove a migration from the history. This is useful if you want to retry a migration that has failed. + +## Usage + +```bash +emigrate remove [options] +``` + +## Arguments + +### `` + +The name of the migration file to remove, including the extension, e.g. `20200101000000_some_migration.js`. + +## Options + +### `-h`, `--help` + +Show command help and exit + +### `-d`, `--directory ` + +The directory where the migration files are located. The given path should be absolute or relative to the current working directory. + +### `-f`, `--force` + +Force removal of the migration history entry even if the migration file does not exist or it's in a non-failed state. + +### `-s`, `--storage ` + +The storage to use for where to read the migration history. + +The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: + +- `@emigrate/storage-` +- `emigrate-storage-` +- `@emigrate/plugin-storage-` +- `@emigrate/` + +And then try to load the module/package with the given name. + +For example, if you want to use the `emigrate-storage-somedb` package, you can specify either `emigrate-storage-somedb` or just `somedb` as the name. +In case you have both a `emigrate-storage-somedb` and a `somedb` package installed, the `emigrate-storage-somedb` package will be used. + +### `-r`, `--reporter ` + +The reporter to use for listing the migrations. + +The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: + +- `@emigrate/reporter-` +- `emigrate-reporter-` +- `@emigrate/` + +And then try to load the module/package with the given name. + +For example, if you want to use the `emigrate-reporter-somereporter` package, you can specify either `emigrate-reporter-somereporter` or just `somereporter` as the name. diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx new file mode 100644 index 0000000..78aea06 --- /dev/null +++ b/docs/src/content/docs/commands/up.mdx @@ -0,0 +1,76 @@ +--- +title: "`emigrate up`" +description: "Run migrations" +--- + +The `up` command is used to either list or run all pending migrations, i.e. migrations that haven't been run yet. + +Emigrate takes all migration files in the given directory and compares them to the migration history so that it knows which migrations are pending. +It then sorts the pending migrations by filename in ascending order and runs them one by one. + +If any of the migrations fail, the command will be aborted and the rest of the migrations will not be run. + +## Usage + +```bash +emigrate up [options] +``` + +## Options + +### `-h`, `--help` + +Show command help and exit + +### `--dry` + +List the pending migrations that would be run without actually running them + +### `-d`, `--directory ` + +The directory where the migration files are located. The given path should be absolute or relative to the current working directory. + +### `-s`, `--storage ` + +The storage to use for where to store the migration history. + +The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: + +- `@emigrate/storage-` +- `emigrate-storage-` +- `@emigrate/plugin-storage-` +- `@emigrate/` + +And then try to load the module/package with the given name. + +For example, if you want to use the `emigrate-storage-somedb` package, you can specify either `emigrate-storage-somedb` or just `somedb` as the name. +In case you have both a `emigrate-storage-somedb` and a `somedb` package installed, the `emigrate-storage-somedb` package will be used. + +### `-p`, `--plugin ` + +The [loader plugin(s)](/plugins/loaders/) to use. Can be specified multiple times to use multiple plugins. + +The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: + +- `@emigrate/plugin-` +- `emigrate-plugin-` +- `@emigrate/` + +And then try to load the module/package with the given name. + +For example, if you want to use the `emigrate-plugin-someplugin` package, you can specify either `emigrate-plugin-someplugin` or just `someplugin` as the name. +In case you have both a `emigrate-plugin-someplugin` and a `someplugin` package installed, the `emigrate-plugin-someplugin` package will be used. + +### `-r`, `--reporter ` + +The reporter to use for reporting the migration progress. + +The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: + +- `@emigrate/reporter-` +- `emigrate-reporter-` +- `@emigrate/` + +And then try to load the module/package with the given name. + +For example, if you want to use the `emigrate-reporter-somereporter` package, you can specify either `emigrate-reporter-somereporter` or just `somereporter` as the name. From 1fc24269f42b7bd12feb84b9f3ba9ceff759291b Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 12:10:35 +0100 Subject: [PATCH 005/136] docs: add a basic FAQ section --- docs/astro.config.mjs | 4 ++++ docs/src/content/docs/intro/faq.mdx | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 docs/src/content/docs/intro/faq.mdx diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index fdbadee..31d5617 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -27,6 +27,10 @@ export default defineConfig({ label: 'Quick Start', link: '/intro/quick-start/', }, + { + label: 'FAQ', + link: '/intro/faq/', + }, ], }, { diff --git a/docs/src/content/docs/intro/faq.mdx b/docs/src/content/docs/intro/faq.mdx new file mode 100644 index 0000000..a97574c --- /dev/null +++ b/docs/src/content/docs/intro/faq.mdx @@ -0,0 +1,19 @@ +--- +title: "FAQ" +description: "Frequently asked questions about Emigrate." +--- + +## Why no `down` migrations? + +> Always forward never backwards. + +Many other migration tools support `down` migrations, but in all the years we have been +doing migrations we have never needed to rollback a migration in production, +in that case we would just write a new migration to fix the problem. + +In our experience the only time `down` migrations are useful is in development, +and in such case you just revert the migration manually and fix the `up` migration. + +The benefit of this is that you don't have to worry about writing `down` migrations, and you can focus on writing the `up` migrations. +This way you will only ever have to write `down` migrations when they are really necessary instead of for every migration +(which makes it the exception rather than the rule, which is closer to the truth). From 445fe69e6092e4bd00d17af5c1cbc81a5298bf64 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 13:49:06 +0100 Subject: [PATCH 006/136] docs: update all command docs with package manager variants --- docs/src/content/docs/commands/list.mdx | 31 ++++++++++++++++++++--- docs/src/content/docs/commands/new.mdx | 31 ++++++++++++++++++++--- docs/src/content/docs/commands/remove.mdx | 31 ++++++++++++++++++++--- docs/src/content/docs/commands/up.mdx | 31 ++++++++++++++++++++--- 4 files changed, 112 insertions(+), 12 deletions(-) diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx index c17dedb..1a037fe 100644 --- a/docs/src/content/docs/commands/list.mdx +++ b/docs/src/content/docs/commands/list.mdx @@ -3,6 +3,8 @@ title: "`emigrate list`" description: "List migrations and their status." --- +import { Tabs, TabItem } from '@astrojs/starlight/components'; + The `list` command is used to list _all_ migrations, i.e. both already run migrations and migrations that haven't been run yet. Emigrate takes all migration files in the given directory that haven't been run yet and all migrations from the migration history. @@ -10,9 +12,32 @@ It then sorts the migrations by filename in ascending order and outputs them and ## Usage -```bash -emigrate list [options] -``` + + + ```bash + npx emigrate list [options] + ``` + + + ```bash + pnpm exec emigrate list [options] + ``` + + + ```bash + yarn exec emigrate -- list [options] + ``` + + + ```json {3} + { + "scripts": { + "emigrate": "emigrate list [options]" + } + } + ``` + + ## Options diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx index 48ca2be..b6132ee 100644 --- a/docs/src/content/docs/commands/new.mdx +++ b/docs/src/content/docs/commands/new.mdx @@ -3,15 +3,40 @@ title: "`emigrate new`" description: "Create new migration." --- +import { Tabs, TabItem } from '@astrojs/starlight/components'; + The `new` command is used to create a new migration file in the given directory. The migration file can be based on a template, generated by a [generator plugin](/plugins/generators/), or just be an empty file. ## Usage -```bash -emigrate new [options] -``` + + + ```bash + npx emigrate new [options] + ``` + + + ```bash + pnpm exec emigrate new [options] + ``` + + + ```bash + yarn exec emigrate -- new [options] + ``` + + + ```json {3} + { + "scripts": { + "emigrate": "emigrate new [options] " + } + } + ``` + + ## Arguments diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index dca59ae..5fafd2c 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -3,13 +3,38 @@ title: "`emigrate remove`" description: "Remove a migration from the history." --- +import { Tabs, TabItem } from '@astrojs/starlight/components'; + The `remove` command is used to remove a migration from the history. This is useful if you want to retry a migration that has failed. ## Usage -```bash -emigrate remove [options] -``` + + + ```bash + npx emigrate remove [options] + ``` + + + ```bash + pnpm exec emigrate remove [options] + ``` + + + ```bash + yarn exec emigrate -- remove [options] + ``` + + + ```json {3} + { + "scripts": { + "emigrate": "emigrate remove [options] " + } + } + ``` + + ## Arguments diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 78aea06..17012b8 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -3,6 +3,8 @@ title: "`emigrate up`" description: "Run migrations" --- +import { Tabs, TabItem } from '@astrojs/starlight/components'; + The `up` command is used to either list or run all pending migrations, i.e. migrations that haven't been run yet. Emigrate takes all migration files in the given directory and compares them to the migration history so that it knows which migrations are pending. @@ -12,9 +14,32 @@ If any of the migrations fail, the command will be aborted and the rest of the m ## Usage -```bash -emigrate up [options] -``` + + + ```bash + npx emigrate up [options] + ``` + + + ```bash + pnpm exec emigrate up [options] + ``` + + + ```bash + yarn exec emigrate -- up [options] + ``` + + + ```json {3} + { + "scripts": { + "emigrate": "emigrate up [options]" + } + } + ``` + + ## Options From 418737f97d840565c3ae6a5fe3c7bcf59c208d61 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 13:51:24 +0100 Subject: [PATCH 007/136] docs: add logo --- docs/astro.config.mjs | 37 +++++++++++++++++++++++++ docs/public/android-chrome-192x192.png | Bin 0 -> 44584 bytes docs/public/android-chrome-512x512.png | Bin 0 -> 257641 bytes docs/public/apple-touch-icon.png | Bin 0 -> 40105 bytes docs/public/favicon-16x16.png | Bin 0 -> 948 bytes docs/public/favicon-32x32.png | Bin 0 -> 2506 bytes docs/public/favicon.ico | Bin 0 -> 15406 bytes docs/public/favicon.svg | 1 - docs/public/site.webmanifest | 11 ++++++++ docs/src/assets/emigrate.png | Bin 0 -> 57920 bytes docs/src/assets/houston.webp | Bin 98506 -> 0 bytes docs/src/content/docs/index.mdx | 2 +- 12 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 docs/public/android-chrome-192x192.png create mode 100644 docs/public/android-chrome-512x512.png create mode 100644 docs/public/apple-touch-icon.png create mode 100644 docs/public/favicon-16x16.png create mode 100644 docs/public/favicon-32x32.png create mode 100644 docs/public/favicon.ico delete mode 100644 docs/public/favicon.svg create mode 100644 docs/public/site.webmanifest create mode 100644 docs/src/assets/emigrate.png delete mode 100644 docs/src/assets/houston.webp diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 31d5617..be11f9f 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -6,6 +6,43 @@ export default defineConfig({ integrations: [ starlight({ title: 'Emigrate', + favicon: '/favicon.ico', + head: [ + { + tag: 'link', + attrs: { + rel: 'apple-touch-icon', + type: 'image/png', + href: '/apple-touch-icon.png', + sizes: '180x180', + }, + }, + { + tag: 'link', + attrs: { + rel: 'icon', + type: 'image/png', + href: '/favicon-32x32.png', + sizes: '32x32', + }, + }, + { + tag: 'link', + attrs: { + rel: 'icon', + type: 'image/png', + href: '/favicon-16x16.png', + sizes: '16x16', + }, + }, + { + tag: 'link', + attrs: { + rel: 'manifest', + href: '/site.webmanifest', + }, + }, + ], social: { github: 'https://github.com/aboviq/emigrate', }, diff --git a/docs/public/android-chrome-192x192.png b/docs/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..656288f958cca7ec6ad83f167b6166131ea9f281 GIT binary patch literal 44584 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 z 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

1zkXzMv5^@GWuCDt@5V#UU72RPlqk%Oxny?l$ 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 literal 0 HcmV?d00001 diff --git a/docs/public/favicon-16x16.png b/docs/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..e070d3eb770d5457f6475f59087ea45f66cc53b9 GIT binary patch literal 948 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 UWzo22L;wH)07*qoM6N<$f+C@tQ2+n{ literal 0 HcmV?d00001 diff --git a/docs/public/favicon.ico b/docs/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e01f12b601c9238ac75961a6954bee39b850c14 GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/docs/public/favicon.svg b/docs/public/favicon.svg deleted file mode 100644 index cba5ac1..0000000 --- a/docs/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/public/site.webmanifest b/docs/public/site.webmanifest new file mode 100644 index 0000000..8aa8e35 --- /dev/null +++ b/docs/public/site.webmanifest @@ -0,0 +1,11 @@ +{ + "name": "Emigrate", + "short_name": "Emigrate", + "icons": [ + { "src": "/android-chrome-192x192.png", "sizes": "192x192", "type": "image/png" }, + { "src": "/android-chrome-512x512.png", "sizes": "512x512", "type": "image/png" } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/docs/src/assets/emigrate.png b/docs/src/assets/emigrate.png new file mode 100644 index 0000000000000000000000000000000000000000..28fa6afb088cb2512cc28b5a4f618db0dd01238e GIT binary patch literal 57920 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 b6~t;_wBcJ3AWgga7~Sz~izoKbpAY~5r|m$8 diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index 7f16846..6d033e3 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -5,7 +5,7 @@ template: splash hero: tagline: Adapt any and all of your databases to new business needs.
Emigrate is a modern migration tool that's flexible, scalable, and easy to use. image: - file: ../../assets/houston.webp + file: ../../assets/emigrate.png actions: - text: Quick Start link: /intro/quick-start/ From bf52bd0d3cfe089608a246b5fc930fd749468a38 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 14:21:30 +0100 Subject: [PATCH 008/136] docs(commands): use more idiomatic commands per package manager --- docs/src/content/docs/commands/list.mdx | 4 ++-- docs/src/content/docs/commands/new.mdx | 4 ++-- docs/src/content/docs/commands/remove.mdx | 4 ++-- docs/src/content/docs/commands/up.mdx | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx index 1a037fe..0238d76 100644 --- a/docs/src/content/docs/commands/list.mdx +++ b/docs/src/content/docs/commands/list.mdx @@ -20,12 +20,12 @@ It then sorts the migrations by filename in ascending order and outputs them and ```bash - pnpm exec emigrate list [options] + pnpm emigrate list [options] ``` ```bash - yarn exec emigrate -- list [options] + yarn emigrate list [options] ``` diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx index b6132ee..dfb8c04 100644 --- a/docs/src/content/docs/commands/new.mdx +++ b/docs/src/content/docs/commands/new.mdx @@ -19,12 +19,12 @@ The migration file can be based on a template, generated by a [generator plugin] ```bash - pnpm exec emigrate new [options] + pnpm emigrate new [options] ``` ```bash - yarn exec emigrate -- new [options] + yarn emigrate new [options] ``` diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index 5fafd2c..5347e43 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -17,12 +17,12 @@ The `remove` command is used to remove a migration from the history. This is use ```bash - pnpm exec emigrate remove [options] + pnpm emigrate remove [options] ``` ```bash - yarn exec emigrate -- remove [options] + yarn emigrate remove [options] ``` diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 17012b8..3320487 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -22,12 +22,12 @@ If any of the migrations fail, the command will be aborted and the rest of the m ```bash - pnpm exec emigrate up [options] + pnpm emigrate up [options] ``` ```bash - yarn exec emigrate -- up [options] + yarn emigrate up [options] ``` From 43f4df5f37df1dabc94eb660d807a3aeeeed5a5c Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 14:31:52 +0100 Subject: [PATCH 009/136] docs(style): use Tailwind to customize the docs colors --- docs/astro.config.mjs | 56 +++++++-- docs/package.json | 5 +- docs/src/tailwind.css | 3 + docs/tailwind.config.mjs | 17 +++ pnpm-lock.yaml | 239 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 309 insertions(+), 11 deletions(-) create mode 100644 docs/src/tailwind.css create mode 100644 docs/tailwind.config.mjs diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index be11f9f..be163f7 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -1,5 +1,6 @@ import { defineConfig } from 'astro/config'; import starlight from '@astrojs/starlight'; +import tailwind from '@astrojs/tailwind'; // https://astro.build/config export default defineConfig({ @@ -7,6 +8,7 @@ export default defineConfig({ starlight({ title: 'Emigrate', favicon: '/favicon.ico', + customCss: ['./src/tailwind.css'], head: [ { tag: 'link', @@ -102,36 +104,70 @@ export default defineConfig({ label: 'Storage Plugins', collapsed: true, items: [ - { label: 'Introduction', link: '/plugins/storage/' }, - { label: 'File System', link: '/plugins/storage/file-system/' }, - { label: 'MySQL', link: '/plugins/storage/mysql/' }, + { + label: 'Introduction', + link: '/plugins/storage/', + }, + { + label: 'File System', + link: '/plugins/storage/file-system/', + }, + { + label: 'MySQL', + link: '/plugins/storage/mysql/', + }, ], }, { label: 'Loader Plugins', collapsed: true, items: [ - { label: 'Introduction', link: '/plugins/loaders/' }, - { label: 'Default Loader', link: '/plugins/loaders/default/' }, - { label: 'MySQL Loader', link: '/plugins/loaders/mysql/' }, + { + label: 'Introduction', + link: '/plugins/loaders/', + }, + { + label: 'Default Loader', + link: '/plugins/loaders/default/', + }, + { + label: 'MySQL Loader', + link: '/plugins/loaders/mysql/', + }, ], }, { label: 'Reporters', collapsed: true, items: [ - { label: 'Introduction', link: '/plugins/reporters/' }, - { label: 'Default Reporter', link: '/plugins/reporters/default/', badge: 'WIP' }, - { label: 'Pino Reporter', link: '/plugins/reporters/pino/', badge: 'WIP' }, + { + label: 'Introduction', + link: '/plugins/reporters/', + }, + { + label: 'Default Reporter', + link: '/plugins/reporters/default/', + badge: 'WIP', + }, + { + label: 'Pino Reporter', + link: '/plugins/reporters/pino/', + badge: 'WIP', + }, ], }, ], }, { label: 'Reference', - autogenerate: { directory: 'reference' }, + autogenerate: { + directory: 'reference', + }, }, ], }), + tailwind({ + applyBaseStyles: false, + }), ], }); diff --git a/docs/package.json b/docs/package.json index 9665665..58534a2 100644 --- a/docs/package.json +++ b/docs/package.json @@ -15,7 +15,10 @@ }, "dependencies": { "@astrojs/starlight": "^0.15.0", + "@astrojs/starlight-tailwind": "2.0.1", + "@astrojs/tailwind": "^5.0.3", "astro": "^4.0.1", - "sharp": "^0.32.5" + "sharp": "^0.32.5", + "tailwindcss": "^3.3.6" } } diff --git a/docs/src/tailwind.css b/docs/src/tailwind.css new file mode 100644 index 0000000..b5c61c9 --- /dev/null +++ b/docs/src/tailwind.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/docs/tailwind.config.mjs b/docs/tailwind.config.mjs new file mode 100644 index 0000000..0bdfcc2 --- /dev/null +++ b/docs/tailwind.config.mjs @@ -0,0 +1,17 @@ +import starlightPlugin from '@astrojs/starlight-tailwind'; +import colors from 'tailwindcss/colors'; + +/** @type {import('tailwindcss').Config} */ +// eslint-disable-next-line import/no-anonymous-default-export +export default { + content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'], + theme: { + extend: { + colors: { + accent: colors.orange, + gray: colors.slate, + }, + }, + }, + plugins: [starlightPlugin()], +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f758bb5..3f23e8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -56,12 +56,21 @@ importers: '@astrojs/starlight': specifier: ^0.15.0 version: 0.15.0(astro@4.0.5) + '@astrojs/starlight-tailwind': + specifier: 2.0.1 + version: 2.0.1(@astrojs/starlight@0.15.0)(@astrojs/tailwind@5.0.3)(tailwindcss@3.3.6) + '@astrojs/tailwind': + specifier: ^5.0.3 + version: 5.0.3(astro@4.0.5)(tailwindcss@3.3.6) astro: specifier: ^4.0.1 version: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) sharp: specifier: ^0.32.5 version: 0.32.6 + tailwindcss: + specifier: ^3.3.6 + version: 3.3.6 packages/cli: dependencies: @@ -180,6 +189,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -257,6 +271,18 @@ packages: zod: 3.22.4 dev: false + /@astrojs/starlight-tailwind@2.0.1(@astrojs/starlight@0.15.0)(@astrojs/tailwind@5.0.3)(tailwindcss@3.3.6): + resolution: {integrity: sha512-niMgFcR7NHcsBVy8UAN3F2gqhmoN5v83st5Hu4YzvUL+6SNwjQmIipXppXdN9+iVneRjPr6PLGzDfI+wnjSBWQ==} + peerDependencies: + '@astrojs/starlight': '>=0.9.0' + '@astrojs/tailwind': ^5.0.0 + tailwindcss: ^3.3.3 + dependencies: + '@astrojs/starlight': 0.15.0(astro@4.0.5) + '@astrojs/tailwind': 5.0.3(astro@4.0.5)(tailwindcss@3.3.6) + tailwindcss: 3.3.6 + dev: false + /@astrojs/starlight@0.15.0(astro@4.0.5): resolution: {integrity: sha512-epLRrGP9+5gIP/ZXeRtkY/tA00yzY8iBBqYRGxkoj44fokCiDg+iKCnE9BXooAK08ELyizD8nwenUmVzDTDRXA==} peerDependencies: @@ -285,6 +311,21 @@ packages: - supports-color dev: false + /@astrojs/tailwind@5.0.3(astro@4.0.5)(tailwindcss@3.3.6): + resolution: {integrity: sha512-p+uFa1PNuV8RxhGkPUFgVq8CUbmS3xr0u5k1An2xKECLotRh7vsrGcPUijHvYOt42URohcg8rIq0CxNoVMhReg==} + peerDependencies: + astro: ^3.0.0 || ^4.0.0 + tailwindcss: ^3.0.24 + dependencies: + astro: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + autoprefixer: 10.4.16(postcss@8.4.32) + postcss: 8.4.32 + postcss-load-config: 4.0.2(postcss@8.4.32) + tailwindcss: 3.3.6 + transitivePeerDependencies: + - ts-node + dev: false + /@astrojs/telemetry@3.0.4: resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} engines: {node: '>=18.14.1'} @@ -2277,6 +2318,10 @@ packages: engines: {node: '>=12.13'} dev: false + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -2481,6 +2526,22 @@ packages: engines: {node: '>=8.0.0'} dev: false + /autoprefixer@10.4.16(postcss@8.4.32): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.2 + caniuse-lite: 1.0.30001570 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + dev: false + /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} @@ -2679,6 +2740,11 @@ packages: engines: {node: '>=6'} dev: false + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false + /camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -2904,6 +2970,11 @@ packages: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: false + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + /common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} dev: false @@ -3225,6 +3296,10 @@ packages: dequal: 2.0.3 dev: false + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false + /diff@5.1.0: resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} engines: {node: '>=0.3.1'} @@ -4182,6 +4257,10 @@ packages: signal-exit: 4.1.0 dev: false + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false + /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false @@ -4371,6 +4450,17 @@ packages: path-scurry: 1.10.1 dev: false + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -5457,6 +5547,11 @@ packages: engines: {node: '>=10'} dev: false + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: false + /line-column-path@3.0.0: resolution: {integrity: sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6447,6 +6542,14 @@ packages: sqlstring: 2.3.3 dev: false + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + /named-placeholders@1.1.3: resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} engines: {node: '>=12.0.0'} @@ -6533,6 +6636,11 @@ packages: engines: {node: '>=0.10.0'} dev: false + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false + /normalize-url@4.5.1: resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} engines: {node: '>=8'} @@ -6583,6 +6691,16 @@ packages: engines: {node: '>=0.10.0'} dev: false + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + /object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} dev: false @@ -6960,6 +7078,11 @@ packages: hasBin: true dev: false + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + /pify@3.0.0: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} @@ -6998,6 +7121,11 @@ packages: thread-stream: 2.4.1 dev: false + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: false + /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -7031,6 +7159,45 @@ packages: engines: {node: '>=4'} dev: false + /postcss-import@15.1.0(postcss@8.4.32): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.32 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: false + + /postcss-js@4.0.1(postcss@8.4.32): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.32 + dev: false + + /postcss-load-config@4.0.2(postcss@8.4.32): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.0.0 + postcss: 8.4.32 + yaml: 2.3.4 + dev: false + /postcss-nested@6.0.1(postcss@8.4.32): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} engines: {node: '>=12.0'} @@ -7049,6 +7216,10 @@ packages: util-deprecate: 1.0.2 dev: false + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + /postcss@8.4.32: resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} engines: {node: ^10 || ^12 || >=14} @@ -7213,6 +7384,12 @@ packages: strip-json-comments: 2.0.1 dev: false + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + /read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -8127,6 +8304,20 @@ packages: inline-style-parser: 0.2.2 dev: false + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -8169,6 +8360,37 @@ packages: tslib: 2.6.2 dev: false + /tailwindcss@3.3.6: + resolution: {integrity: sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.32 + postcss-import: 15.1.0(postcss@8.4.32) + postcss-js: 4.0.1(postcss@8.4.32) + postcss-load-config: 4.0.2(postcss@8.4.32) + postcss-nested: 6.0.1(postcss@8.4.32) + postcss-selector-parser: 6.0.13 + resolve: 1.22.8 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: false + /tapable@0.1.10: resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} engines: {node: '>=0.6'} @@ -8264,6 +8486,19 @@ packages: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} dev: false + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + /thread-stream@2.4.1: resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} dependencies: @@ -8339,6 +8574,10 @@ packages: typescript: 5.2.2 dev: false + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + /tsconfck@3.0.0(typescript@5.2.2): resolution: {integrity: sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==} engines: {node: ^18 || >=20} From 1843bf893d62014f51a10051d1917009e1285e5a Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 14:32:43 +0100 Subject: [PATCH 010/136] docs: remove staggering of cards --- docs/src/content/docs/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index 6d033e3..eb44940 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -20,7 +20,7 @@ import { Card, CardGrid } from '@astrojs/starlight/components'; ## Key features - + Emigrate is a database agnostic migration tool.
You are in full control over what your migrations do. From 7da778c767fa97fee66af1afad5af6017d06f3a2 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:04:28 +0100 Subject: [PATCH 011/136] docs(reporters): write some documentation for the reporters --- docs/astro.config.mjs | 20 ++++++- .../docs/plugins/reporters/default.mdx | 20 ++++++- .../content/docs/plugins/reporters/pino.mdx | 57 +++++++++++++++++++ 3 files changed, 94 insertions(+), 3 deletions(-) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index be163f7..6bcfc33 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -147,12 +147,28 @@ export default defineConfig({ { label: 'Default Reporter', link: '/plugins/reporters/default/', - badge: 'WIP', }, { label: 'Pino Reporter', link: '/plugins/reporters/pino/', - badge: 'WIP', + }, + ], + }, + { + label: 'Generator Plugins', + collapsed: true, + items: [ + { + label: 'Introduction', + link: '/plugins/generators/', + }, + { + label: 'JavaScript Generator', + link: '/plugins/generators/js/', + }, + { + label: 'MySQL Generator', + link: '/plugins/generators/mysql/', }, ], }, diff --git a/docs/src/content/docs/plugins/reporters/default.mdx b/docs/src/content/docs/plugins/reporters/default.mdx index d710475..8a76ff2 100644 --- a/docs/src/content/docs/plugins/reporters/default.mdx +++ b/docs/src/content/docs/plugins/reporters/default.mdx @@ -2,4 +2,22 @@ title: Default Reporter --- -Emigrate's default reporter. +Emigrate's default reporter. The default reporter recognizes if the current terminal is an interactive shell (or if it's a CI environment), if that's the case _no_ animations will be shown. + +## Usage + +By default, Emigrate uses the default reporter. + +## Example output + +```bash + +Emigrate up v0.10.0 /Users/joakim/dev/@aboviq/test-emigrate (dry run) + + 1 pending migrations to run + + β€Ί migration-folder/20231218135441244_create_some_table.sql (pending) + + 1 pending (1 total) + +``` diff --git a/docs/src/content/docs/plugins/reporters/pino.mdx b/docs/src/content/docs/plugins/reporters/pino.mdx index fb74c4e..2574f6f 100644 --- a/docs/src/content/docs/plugins/reporters/pino.mdx +++ b/docs/src/content/docs/plugins/reporters/pino.mdx @@ -2,4 +2,61 @@ title: Pino Reporter --- +import { Tabs, TabItem } from '@astrojs/starlight/components'; + Emigrate's reporter that uses [Pino](https://getpino.io/#/) as the logger. + +This is useful in production environments where you want all logs as JSON, which is suitable for log aggregators/shippers. + +## Installation + + + + ```bash + npm install @emigrate/reporter-pino + ``` + + + ```bash + pnpm add @emigrate/reporter-pino + ``` + + + ```bash + yarn add @emigrate/reporter-pino + ``` + + + +## Usage + +:::tip +The `@emigrate/reporter-` prefix is optional when using this reporter. +::: + +### Via CLI + +```bash +emigrate --reporter pino +``` + +See for instance the [Reporter Option](/commands/up/#-r---reporter-name) for the `up` command for more information. + +### Via configuration file + +```js title="emigrate.config.js" {2} +export default { + reporter: 'pino', +}; +``` + +See [Reporter Configuration](/docs/configuration/#reporter) for more information. + +## Example output + +```json +{"level":30,"time":1702907697803,"scope":"list","version":"0.10.0","name":"emigrate","parameters":{"cwd":"/your/project/dir","dry":false,"directory":"migration-folder"},"msg":"Emigrate \"list\" initialized"} +{"level":30,"time":1702907697836,"scope":"list","version":"0.10.0","name":"emigrate","migrationCount":1,"msg":"1 pending migrations to run"} +{"level":30,"time":1702907697836,"scope":"list","version":"0.10.0","name":"emigrate","migration":"migration-folder/20231218135441244_create_some_table.sql","msg":"20231218135441244_create_some_table.sql (pending)"} +{"level":30,"time":1702907697836,"scope":"list","version":"0.10.0","name":"emigrate","result":{"failed":0,"done":0,"skipped":0,"pending":1,"total":1},"msg":"Emigrate \"list\" finished successfully"} +``` From 13e370362a3cc46a0f5060301b099af3e62c782d Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:05:05 +0100 Subject: [PATCH 012/136] docs: fix some links --- docs/src/content/docs/plugins/loaders/index.mdx | 6 +++--- docs/src/content/docs/plugins/storage/index.mdx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/content/docs/plugins/loaders/index.mdx b/docs/src/content/docs/plugins/loaders/index.mdx index 3b0bde7..3784f6f 100644 --- a/docs/src/content/docs/plugins/loaders/index.mdx +++ b/docs/src/content/docs/plugins/loaders/index.mdx @@ -21,12 +21,12 @@ Or set it up in your configuration file, see [Plugin configuration](/reference/c :::tip[Did you know?] You can specify multiple loader plugins at the same time, which is needed when you mix file types in your migrations folder. For example, you can use the `mysql` loader for `.sql` files and the `typescript` loader for `.ts` files. -The [default loader](/loaders/default/) will be used for all other file types, and doesn't need to be specified. +The [default loader](/plugins/loaders/default/) will be used for all other file types, and doesn't need to be specified. ::: ## Available Loader Plugins - - + + diff --git a/docs/src/content/docs/plugins/storage/index.mdx b/docs/src/content/docs/plugins/storage/index.mdx index 236c55c..ec318cf 100644 --- a/docs/src/content/docs/plugins/storage/index.mdx +++ b/docs/src/content/docs/plugins/storage/index.mdx @@ -20,8 +20,8 @@ Or set it up in your configuration file, see [Storage configuration](/reference/ ## Available storage plugins - - + + :::note From 5911331889e8873b430a2c9fbe1bdf853c12879c Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:17:12 +0100 Subject: [PATCH 013/136] docs(generators): add some documentation for generator plugins --- .../content/docs/plugins/generators/index.mdx | 24 +++++++++++++ .../content/docs/plugins/generators/js.mdx | 35 +++++++++++++++++++ .../content/docs/plugins/generators/mysql.mdx | 35 +++++++++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 docs/src/content/docs/plugins/generators/index.mdx create mode 100644 docs/src/content/docs/plugins/generators/js.mdx create mode 100644 docs/src/content/docs/plugins/generators/mysql.mdx diff --git a/docs/src/content/docs/plugins/generators/index.mdx b/docs/src/content/docs/plugins/generators/index.mdx new file mode 100644 index 0000000..d7f9104 --- /dev/null +++ b/docs/src/content/docs/plugins/generators/index.mdx @@ -0,0 +1,24 @@ +--- +title: "Generator Plugins" +--- + +import { LinkCard, CardGrid } from '@astrojs/starlight/components'; + +A generator plugin is a plugin that generates new migration files. +They are responsible for both generating the new file's name and its contents. + +:::tip[Did you know?] +Many of the [Loader Plugins](/plugins/loaders/) usually include a generator plugin as well. +The generator is responsible for generating migration files in a specific format and the loader is responsible for loading the same format. +::: + +## Available Generator Plugins + + + + + + +:::note +Instead of having to install a generator plugin, you can also use the much simpler [`--template`](/commands/new/#t---template-path) option to specify a custom template file for new migrations. +::: diff --git a/docs/src/content/docs/plugins/generators/js.mdx b/docs/src/content/docs/plugins/generators/js.mdx new file mode 100644 index 0000000..dd2ae37 --- /dev/null +++ b/docs/src/content/docs/plugins/generators/js.mdx @@ -0,0 +1,35 @@ +--- +title: "JavaScript Generator" +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +A [generator plugin](/plugins/generators/) for generating new migration files in JavaScript. + +## Installation + + + + ```bash + npm install @emigrate/plugin-generate-js + ``` + + + ```bash + pnpm add @emigrate/plugin-generate-js + ``` + + + ```bash + yarn add @emigrate/plugin-generate-js + ``` + + + +## Usage + +```bash +emigrate new --plugin generate-js create some fancy table +``` + +For more information see [the `new` command](/commands/new/)'s documentation. diff --git a/docs/src/content/docs/plugins/generators/mysql.mdx b/docs/src/content/docs/plugins/generators/mysql.mdx new file mode 100644 index 0000000..1ee069a --- /dev/null +++ b/docs/src/content/docs/plugins/generators/mysql.mdx @@ -0,0 +1,35 @@ +--- +title: "MySQL Generator" +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; + +The MySQL generator creates new migration files with the `.sql` extension. In the same package you can find the [MySQL Loader](/plugins/loaders/mysql/) and the [MySQL Storage](/plugins/storage/mysql/). + +## Installation + + + + ```bash + npm install @emigrate/mysql + ``` + + + ```bash + pnpm add @emigrate/mysql + ``` + + + ```bash + yarn add @emigrate/mysql + ``` + + + +## Usage + +```bash +emigrate new --plugin mysql create some fancy table +``` + +For more information see [the `new` command](/commands/new/)'s documentation. From 665f0ad9cf8bfed0680b42ae3a28481c1e5067db Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:17:43 +0100 Subject: [PATCH 014/136] docs: fix some faulty links --- docs/src/content/docs/plugins/loaders/mysql.mdx | 2 +- docs/src/content/docs/plugins/storage/mysql.mdx | 2 +- docs/src/content/docs/reference/configuration.mdx | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/src/content/docs/plugins/loaders/mysql.mdx b/docs/src/content/docs/plugins/loaders/mysql.mdx index 7bc0406..44dbd23 100644 --- a/docs/src/content/docs/plugins/loaders/mysql.mdx +++ b/docs/src/content/docs/plugins/loaders/mysql.mdx @@ -4,7 +4,7 @@ title: MySQL Loader Plugin import { Tabs, TabItem } from '@astrojs/starlight/components'; -The MySQL loader plugin transforms `.sql` files into JavaScript functions that Emigrate can use to execute the migrations. +The MySQL loader plugin transforms `.sql` files into JavaScript functions that Emigrate can use to execute the migrations. In the same package you can find the [MySQL Generator](/plugins/generators/mysql/) and the [MySQL Storage](/plugins/storage/mysql/). ## Installation diff --git a/docs/src/content/docs/plugins/storage/mysql.mdx b/docs/src/content/docs/plugins/storage/mysql.mdx index 8ccbc55..5250b84 100644 --- a/docs/src/content/docs/plugins/storage/mysql.mdx +++ b/docs/src/content/docs/plugins/storage/mysql.mdx @@ -4,7 +4,7 @@ title: MySQL Storage import { Tabs, TabItem } from '@astrojs/starlight/components'; -The MySQL storage plugin uses a MySQL database to store the migration history (*duh*). +The MySQL storage plugin uses a MySQL database to store the migration history (*duh*). In the same package you can find the [MySQL Loader](/plugins/loaders/mysql/) and the [MySQL Generator](/plugins/generators/mysql/). ## Installation diff --git a/docs/src/content/docs/reference/configuration.mdx b/docs/src/content/docs/reference/configuration.mdx index 6f9f1eb..e8753da 100644 --- a/docs/src/content/docs/reference/configuration.mdx +++ b/docs/src/content/docs/reference/configuration.mdx @@ -47,7 +47,7 @@ Set the directory where your migrations are located, relative to the project roo **type:** `string | EmigrateReporter | Promise | (() => Promise)` **default:** `"default"` - the default reporter -Set the reporter to use for the different commands. Specifying a reporter is most useful in a CI or production environment where you either ship logs or want to have a machine-readable format. +Set the reporter to use for the different commands. Specifying a [reporter](/plugins/reporters/) is most useful in a CI or production environment where you either ship logs or want to have a machine-readable format. ```js title="emigrate.config.js" {2} export default { @@ -77,7 +77,7 @@ The default reporter automatically detects if the current environment is an inte **type:** `string | EmigrateStorage | Promise | (() => Promise)` -Set the storage plugin to use for storing and reading the migration history. This option is required by all Emigrate commands except `new` which doesn't use it. +Set the [storage plugin](/plugins/storage/) to use for storing and reading the migration history. This option is required by all Emigrate commands except `new` which doesn't use it. ```js title="emigrate.config.js" {2} export default { @@ -86,7 +86,7 @@ export default { ``` :::note -Each storage plugin can have its own configuration options, see the corresponding [Storage Plugin](/storage/) section for more information. +Each storage plugin can have its own configuration options, see the corresponding [Storage Plugin](/plugins/storage/) section for more information. ::: ### `plugins` @@ -97,8 +97,8 @@ Set the plugins to use for the different commands. There are different types of In short: -* [Loader Plugins](/loaders/) - are used for transforming non-JavaScript files into JavaScript files that can be executed by Node.js. These are only used by the `up` command. -* [Generator Plugins](/generators/) - are used for generating new migration files. These are only used by the `new` command. +* [Loader Plugins](/plugins/loaders/) - are used for transforming non-JavaScript files into JavaScript files that can be executed by Node.js. These are only used by the `up` command. +* [Generator Plugins](/plugins/generators/) - are used for generating new migration files. These are only used by the `new` command. ```js title="emigrate.config.js" {2} export default { @@ -107,7 +107,7 @@ export default { ``` :::tip[Did you know?] -The same package can expose multiple plugins, so you can specify the plugin only once and it can be used as both a loader and a generator (and storage, in the case of [MySQL](/storage/mysql) for instance). +The same package can expose multiple plugins, so you can specify the plugin only once and it can be used as both a loader and a generator (and storage, in the case of [MySQL](/plugins/storage/mysql) for instance). ::: ### `template` From f63fa9d8642cb3ad80dc2775d41d67a68b17d9f8 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:25:15 +0100 Subject: [PATCH 015/136] ci: add GitHub Pages deployment --- .github/workflows/deploy.yaml | 39 +++++++++++++++++++++++++++++++++++ docs/astro.config.mjs | 2 ++ 2 files changed, 41 insertions(+) create mode 100644 .github/workflows/deploy.yaml diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml new file mode 100644 index 0000000..a95b56e --- /dev/null +++ b/.github/workflows/deploy.yaml @@ -0,0 +1,39 @@ +name: Deploy to GitHub Pages + +on: + # Trigger the workflow every time you push to the `main` branch + # Using a different branch name? Replace `main` with your branch’s name + push: + branches: [main] + # Allows you to run this workflow manually from the Actions tab on GitHub. + workflow_dispatch: + +# Allow this job to clone the repo and create a page deployment +permissions: + contents: read + pages: write + id-token: write + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout your repository using git + uses: actions/checkout@v3 + - name: Install, build, and upload your site output + uses: withastro/action@v1 + with: + path: ./docs # The root location of your Astro project inside the repository. (optional) + node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 18. (optional) + # package-manager: pnpm@latest # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v1 diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 6bcfc33..29f18b1 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -4,6 +4,8 @@ import tailwind from '@astrojs/tailwind'; // https://astro.build/config export default defineConfig({ + site: 'https://aboviq.github.io', + base: '/emigrate', integrations: [ starlight({ title: 'Emigrate', From e245d6f18a95f572f5578ebfebc3de8f8930339f Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:38:42 +0100 Subject: [PATCH 016/136] ci: only set site and base during deployment --- .github/workflows/deploy.yaml | 3 +++ docs/astro.config.mjs | 5 +++-- docs/package.json | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index a95b56e..1272c67 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -22,6 +22,9 @@ jobs: uses: actions/checkout@v3 - name: Install, build, and upload your site output uses: withastro/action@v1 + environment: + ASTRO_SITE: 'https://aboviq.github.io' + ASTRO_BASE: '/emigrate' with: path: ./docs # The root location of your Astro project inside the repository. (optional) node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 18. (optional) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 29f18b1..4738a14 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -1,11 +1,12 @@ +import process from 'node:process'; import { defineConfig } from 'astro/config'; import starlight from '@astrojs/starlight'; import tailwind from '@astrojs/tailwind'; // https://astro.build/config export default defineConfig({ - site: 'https://aboviq.github.io', - base: '/emigrate', + site: process.env.ASTRO_SITE, + base: process.env.ASTRO_BASE, integrations: [ starlight({ title: 'Emigrate', diff --git a/docs/package.json b/docs/package.json index 58534a2..194c96e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -20,5 +20,9 @@ "astro": "^4.0.1", "sharp": "^0.32.5", "tailwindcss": "^3.3.6" - } + }, + "volta": { + "extends": "../../package.json" + }, + "packageManager": "pnpm@8.10.2" } From 9c0cbb0d534e1349267b9aec46e772d875f7da00 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:42:29 +0100 Subject: [PATCH 017/136] ci: set site and base correctly --- .github/workflows/deploy.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 1272c67..ebb2ae0 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -17,14 +17,14 @@ permissions: jobs: build: runs-on: ubuntu-latest + environment: + ASTRO_SITE: ${{ vars.ASTRO_SITE }} + ASTRO_BASE: ${{ vars.ASTRO_BASE }} steps: - name: Checkout your repository using git uses: actions/checkout@v3 - name: Install, build, and upload your site output uses: withastro/action@v1 - environment: - ASTRO_SITE: 'https://aboviq.github.io' - ASTRO_BASE: '/emigrate' with: path: ./docs # The root location of your Astro project inside the repository. (optional) node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 18. (optional) From 65be64329d49bef81729453c000aa7da6d75ec67 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:47:11 +0100 Subject: [PATCH 018/136] ci: this is the way --- .github/workflows/deploy.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index ebb2ae0..6cf4f43 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -14,12 +14,13 @@ permissions: pages: write id-token: write +env: + ASTRO_SITE: ${{ vars.ASTRO_SITE }} + ASTRO_BASE: ${{ vars.ASTRO_BASE }} + jobs: build: runs-on: ubuntu-latest - environment: - ASTRO_SITE: ${{ vars.ASTRO_SITE }} - ASTRO_BASE: ${{ vars.ASTRO_BASE }} steps: - name: Checkout your repository using git uses: actions/checkout@v3 From afa20f5bef174e6560a3dd60d6375195f434d364 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:48:21 +0100 Subject: [PATCH 019/136] ci: is this the way? --- .github/workflows/deploy.yaml | 2 +- docs/package.json | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 6cf4f43..fda5b91 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -29,7 +29,7 @@ jobs: with: path: ./docs # The root location of your Astro project inside the repository. (optional) node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 18. (optional) - # package-manager: pnpm@latest # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) + package-manager: pnpm@8.10.2 # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) deploy: needs: build diff --git a/docs/package.json b/docs/package.json index 194c96e..9453180 100644 --- a/docs/package.json +++ b/docs/package.json @@ -23,6 +23,5 @@ }, "volta": { "extends": "../../package.json" - }, - "packageManager": "pnpm@8.10.2" + } } From bd6aea8a4245220dfffb34cdc656c924fe262c55 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:53:44 +0100 Subject: [PATCH 020/136] ci: do we get the correct values? --- .github/workflows/deploy.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index fda5b91..9a3a0a4 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -24,6 +24,10 @@ jobs: steps: - name: Checkout your repository using git uses: actions/checkout@v3 + - name: Show vars + run: | + echo $ASTRO_SITE + echo $ASTRO_BASE - name: Install, build, and upload your site output uses: withastro/action@v1 with: From 319901c7ace3ffa43fdb312b1c13b090b57b4306 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 15:57:51 +0100 Subject: [PATCH 021/136] ci: how about now? --- .github/workflows/deploy.yaml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 9a3a0a4..c1c4db9 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -14,10 +14,6 @@ permissions: pages: write id-token: write -env: - ASTRO_SITE: ${{ vars.ASTRO_SITE }} - ASTRO_BASE: ${{ vars.ASTRO_BASE }} - jobs: build: runs-on: ubuntu-latest From 3bffb9875073d1e09f22ae49dbc14460c1a3b5d0 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 16:02:44 +0100 Subject: [PATCH 022/136] ci: and now then? --- .github/workflows/deploy.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index c1c4db9..9a3a0a4 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -14,6 +14,10 @@ permissions: pages: write id-token: write +env: + ASTRO_SITE: ${{ vars.ASTRO_SITE }} + ASTRO_BASE: ${{ vars.ASTRO_BASE }} + jobs: build: runs-on: ubuntu-latest From 03ec8f25994f54f98dcf609f6ecd789009987a74 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 16:25:14 +0100 Subject: [PATCH 023/136] docs: make all links relative to support mounting anywhere --- docs/package.json | 2 +- docs/src/content/docs/commands/list.mdx | 2 +- docs/src/content/docs/commands/new.mdx | 4 ++-- docs/src/content/docs/commands/remove.mdx | 2 +- docs/src/content/docs/commands/up.mdx | 4 ++-- docs/src/content/docs/index.mdx | 4 ++-- docs/src/content/docs/intro/quick-start.mdx | 12 ++++++------ docs/src/content/docs/intro/whats-emigrate.mdx | 10 +++++----- docs/src/content/docs/plugins/generators/index.mdx | 8 ++++---- docs/src/content/docs/plugins/generators/js.mdx | 4 ++-- docs/src/content/docs/plugins/generators/mysql.mdx | 4 ++-- docs/src/content/docs/plugins/index.mdx | 8 ++++---- docs/src/content/docs/plugins/loaders/index.mdx | 10 +++++----- docs/src/content/docs/plugins/loaders/mysql.mdx | 6 +++--- docs/src/content/docs/plugins/reporters/index.mdx | 6 +++--- docs/src/content/docs/plugins/reporters/pino.mdx | 4 ++-- .../src/content/docs/plugins/storage/file-system.mdx | 2 +- docs/src/content/docs/plugins/storage/index.mdx | 8 ++++---- docs/src/content/docs/plugins/storage/mysql.mdx | 6 +++--- docs/src/content/docs/reference/configuration.mdx | 12 ++++++------ 20 files changed, 59 insertions(+), 59 deletions(-) diff --git a/docs/package.json b/docs/package.json index 9453180..5a0ec0a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -22,6 +22,6 @@ "tailwindcss": "^3.3.6" }, "volta": { - "extends": "../../package.json" + "extends": "../package.json" } } diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx index 0238d76..48d393e 100644 --- a/docs/src/content/docs/commands/list.mdx +++ b/docs/src/content/docs/commands/list.mdx @@ -51,7 +51,7 @@ The directory where the migration files are located. The given path should be ab ### `-s`, `--storage ` -The storage to use for where to read the migration history. +The [storage plugin](../../plugins/storage/) to use, which is responsible for where to store the migration history. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx index dfb8c04..2466901 100644 --- a/docs/src/content/docs/commands/new.mdx +++ b/docs/src/content/docs/commands/new.mdx @@ -7,7 +7,7 @@ import { Tabs, TabItem } from '@astrojs/starlight/components'; The `new` command is used to create a new migration file in the given directory. -The migration file can be based on a template, generated by a [generator plugin](/plugins/generators/), or just be an empty file. +The migration file can be based on a template, generated by a [generator plugin](../../plugins/generators/), or just be an empty file. ## Usage @@ -69,7 +69,7 @@ The extension to use for the migration file. Unless the [`--template`](#t---temp ### `-p`, `--plugin ` -The [generator plugin](/plugins/generators/) to use. The generator plugin is responsible for generating the migration filename and its contents. +The [generator plugin](../../plugins/generators/) to use. The generator plugin is responsible for generating the migration filename and its contents. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index 5347e43..6c19500 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -58,7 +58,7 @@ Force removal of the migration history entry even if the migration file does not ### `-s`, `--storage ` -The storage to use for where to read the migration history. +The [storage plugin](../../plugins/storage/) to use, which is responsible for where to store the migration history. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 3320487..7edd241 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -57,7 +57,7 @@ The directory where the migration files are located. The given path should be ab ### `-s`, `--storage ` -The storage to use for where to store the migration history. +The [storage plugin](../../plugins/storage/) to use, which is responsible for where to store the migration history. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: @@ -73,7 +73,7 @@ In case you have both a `emigrate-storage-somedb` and a `somedb` package install ### `-p`, `--plugin ` -The [loader plugin(s)](/plugins/loaders/) to use. Can be specified multiple times to use multiple plugins. +The [loader plugin(s)](../../plugins/loaders/) to use. Can be specified multiple times to use multiple plugins. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index eb44940..d08a601 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -29,10 +29,10 @@ import { Card, CardGrid } from '@astrojs/starlight/components'; Migrate many databases from one repository or many repositories to one database. There's no need to synchronize deployments.
- Write your migration files using the [language of your choice](/plugins/loaders/). + Write your migration files using the [language of your choice](plugins/loaders/). And mix and match them as you need. E.g. `SQL` for database schema changes, and `JavaScript` for data transformation. - Emigrate is designed to be flexible and customizable to suite any environment and setup using its [plugin system](/plugins/). + Emigrate is designed to be flexible and customizable to suite any environment and setup using its [plugin system](plugins/).
diff --git a/docs/src/content/docs/intro/quick-start.mdx b/docs/src/content/docs/intro/quick-start.mdx index 8b17463..3f70685 100644 --- a/docs/src/content/docs/intro/quick-start.mdx +++ b/docs/src/content/docs/intro/quick-start.mdx @@ -11,7 +11,7 @@ But for now, this is the way to go. ::: @@ -38,7 +38,7 @@ But for now, this is the way to go. ### Pick a storage plugin -Emigrate uses a [storage plugin](/plugins/storage/) to store the migration history. +Emigrate uses a [storage plugin](../plugins/storage/) to store the migration history. Install the plugin you want to use, for example: @@ -84,7 +84,7 @@ Otherwise the file would have the `.js` extension by default. :::tip[Did you know?] You can avoid typing `--plugin mysql` by configuring Emigrate using an `emigrate.config.js` file. -See [Configuration](/configuration/) for more information. +See [Configuration](../reference/configuration/) for more information. ::: #### Fill the migration file @@ -132,7 +132,7 @@ npx emigrate up --storage mysql --plugin mysql --dry ``` :::note -This will connect to the database using some default values. For ways to configure the connection, see [Configuration](/configuration). +This will connect to the database using some default values. For ways to configure the connection, see [Configuration](../reference/configuration/). ::: :::caution @@ -141,6 +141,6 @@ Be sure to configure the connection correctly and use the `--dry` flag to test y ::: :::tip[Did you know?] -In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a [Storage Plugin](/plugins/storage/) -and once for the `--plugin` option as a [Loader Plugin](/plugins/loaders/) to be able to read `.sql` files. +In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a [Storage Plugin](../plugins/storage/) +and once for the `--plugin` option as a [Loader Plugin](../plugins/loaders/) to be able to read `.sql` files. ::: diff --git a/docs/src/content/docs/intro/whats-emigrate.mdx b/docs/src/content/docs/intro/whats-emigrate.mdx index 4697e1c..dd83f50 100644 --- a/docs/src/content/docs/intro/whats-emigrate.mdx +++ b/docs/src/content/docs/intro/whats-emigrate.mdx @@ -7,11 +7,11 @@ Emigrate is written in [TypeScript](https://www.typescriptlang.org) and is a mig * It's database agnostic - you can use it with any database, or even with non-database data. * It's the successor of [klei-migrate](https://github.com/klei/migrate) and is designed to be compatible with [Immigration](https://github.com/blakeembrey/node-immigration) and many of its storage plugins, as well as [Migrate](https://github.com/tj/node-migrate). -* It supports migration files written using [CommonJS or ES Modules out of the box](/plugins/loaders/default/), with any of the following extensions: `.js`, `.cjs` or `.mjs`, and supports [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or using the [NodeJS Callback Pattern](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks#handling-errors-in-callbacks). -* Other languages can be used by using a [Loader Plugin](/plugins/loaders/). -* The migration history can be stored anywhere using a [Storage Plugin](/plugins/storage/). -* The output can be customized using [Reporters](/plugins/reporters/). +* It supports migration files written using [CommonJS or ES Modules out of the box](../../plugins/loaders/default/), with any of the following extensions: `.js`, `.cjs` or `.mjs`, and supports [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or using the [NodeJS Callback Pattern](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks#handling-errors-in-callbacks). +* Other languages can be used by using a [Loader Plugin](../../plugins/loaders/). +* The migration history can be stored anywhere using a [Storage Plugin](../../plugins/storage/). +* The output can be customized using [Reporters](../../plugins/reporters/). :::tip[Did you know?] -Thanks to [the plugin system](/plugins/) you can even write migrations in plain SQL! So no need for Java-based tools like Liquibase or Flyway. +Thanks to [the plugin system](../../plugins/) you can even write migrations in plain SQL! So no need for Java-based tools like Liquibase or Flyway. ::: diff --git a/docs/src/content/docs/plugins/generators/index.mdx b/docs/src/content/docs/plugins/generators/index.mdx index d7f9104..4049e68 100644 --- a/docs/src/content/docs/plugins/generators/index.mdx +++ b/docs/src/content/docs/plugins/generators/index.mdx @@ -8,17 +8,17 @@ A generator plugin is a plugin that generates new migration files. They are responsible for both generating the new file's name and its contents. :::tip[Did you know?] -Many of the [Loader Plugins](/plugins/loaders/) usually include a generator plugin as well. +Many of the [Loader Plugins](../loaders/) usually include a generator plugin as well. The generator is responsible for generating migration files in a specific format and the loader is responsible for loading the same format. ::: ## Available Generator Plugins - - + + :::note -Instead of having to install a generator plugin, you can also use the much simpler [`--template`](/commands/new/#t---template-path) option to specify a custom template file for new migrations. +Instead of having to install a generator plugin, you can also use the much simpler [`--template`](../../commands/new/#t---template-path) option to specify a custom template file for new migrations. ::: diff --git a/docs/src/content/docs/plugins/generators/js.mdx b/docs/src/content/docs/plugins/generators/js.mdx index dd2ae37..38b41de 100644 --- a/docs/src/content/docs/plugins/generators/js.mdx +++ b/docs/src/content/docs/plugins/generators/js.mdx @@ -4,7 +4,7 @@ title: "JavaScript Generator" import { Tabs, TabItem } from '@astrojs/starlight/components'; -A [generator plugin](/plugins/generators/) for generating new migration files in JavaScript. +A [generator plugin](../) for generating new migration files in JavaScript. ## Installation @@ -32,4 +32,4 @@ A [generator plugin](/plugins/generators/) for generating new migration files in emigrate new --plugin generate-js create some fancy table ``` -For more information see [the `new` command](/commands/new/)'s documentation. +For more information see [the `new` command](../../commands/new/)'s documentation. diff --git a/docs/src/content/docs/plugins/generators/mysql.mdx b/docs/src/content/docs/plugins/generators/mysql.mdx index 1ee069a..b923cb7 100644 --- a/docs/src/content/docs/plugins/generators/mysql.mdx +++ b/docs/src/content/docs/plugins/generators/mysql.mdx @@ -4,7 +4,7 @@ title: "MySQL Generator" import { Tabs, TabItem } from '@astrojs/starlight/components'; -The MySQL generator creates new migration files with the `.sql` extension. In the same package you can find the [MySQL Loader](/plugins/loaders/mysql/) and the [MySQL Storage](/plugins/storage/mysql/). +The MySQL generator creates new migration files with the `.sql` extension. In the same package you can find the [MySQL Loader](../../loaders/mysql/) and the [MySQL Storage](../../storage/mysql/). ## Installation @@ -32,4 +32,4 @@ The MySQL generator creates new migration files with the `.sql` extension. In th emigrate new --plugin mysql create some fancy table ``` -For more information see [the `new` command](/commands/new/)'s documentation. +For more information see [the `new` command](../../../commands/new/)'s documentation. diff --git a/docs/src/content/docs/plugins/index.mdx b/docs/src/content/docs/plugins/index.mdx index 0b19dad..348551d 100644 --- a/docs/src/content/docs/plugins/index.mdx +++ b/docs/src/content/docs/plugins/index.mdx @@ -11,25 +11,25 @@ Emigrate uses a plugin system to allow you to extend and customize the functiona Emigrate supports different types of plugins that all have different purposes. diff --git a/docs/src/content/docs/plugins/loaders/index.mdx b/docs/src/content/docs/plugins/loaders/index.mdx index 3784f6f..3e1606a 100644 --- a/docs/src/content/docs/plugins/loaders/index.mdx +++ b/docs/src/content/docs/plugins/loaders/index.mdx @@ -6,7 +6,7 @@ import { LinkCard, CardGrid } from '@astrojs/starlight/components'; Loader plugins are used to transform any file type into a JavaScript function that will be called when the migration file is executed. -Out of the box, Emigrate supports the following file extensions: `.js`, `.cjs` and `.mjs`. And both CommonJS and ES Modules are supported. See the [Default Loader](/loaders/default/) for more information. +Out of the box, Emigrate supports the following file extensions: `.js`, `.cjs` and `.mjs`. And both CommonJS and ES Modules are supported. See the [Default Loader](default/) for more information. ## Using a loader plugin @@ -16,17 +16,17 @@ You can specify a loader plugin via the `--plugin` (or `-p` for short) option: npx emigrate up --plugin mysql ``` -Or set it up in your configuration file, see [Plugin configuration](/reference/configuration/#plugins) for more information. +Or set it up in your configuration file, see [Plugin configuration](../../reference/configuration/#plugins) for more information. :::tip[Did you know?] You can specify multiple loader plugins at the same time, which is needed when you mix file types in your migrations folder. For example, you can use the `mysql` loader for `.sql` files and the `typescript` loader for `.ts` files. -The [default loader](/plugins/loaders/default/) will be used for all other file types, and doesn't need to be specified. +The [default loader](default/) will be used for all other file types, and doesn't need to be specified. ::: ## Available Loader Plugins - - + + diff --git a/docs/src/content/docs/plugins/loaders/mysql.mdx b/docs/src/content/docs/plugins/loaders/mysql.mdx index 44dbd23..b5f8946 100644 --- a/docs/src/content/docs/plugins/loaders/mysql.mdx +++ b/docs/src/content/docs/plugins/loaders/mysql.mdx @@ -4,7 +4,7 @@ title: MySQL Loader Plugin import { Tabs, TabItem } from '@astrojs/starlight/components'; -The MySQL loader plugin transforms `.sql` files into JavaScript functions that Emigrate can use to execute the migrations. In the same package you can find the [MySQL Generator](/plugins/generators/mysql/) and the [MySQL Storage](/plugins/storage/mysql/). +The MySQL loader plugin transforms `.sql` files into JavaScript functions that Emigrate can use to execute the migrations. In the same package you can find the [MySQL Generator](../../generators/mysql/) and the [MySQL Storage](../../storage/mysql/). ## Installation @@ -28,7 +28,7 @@ The MySQL loader plugin transforms `.sql` files into JavaScript functions that E ## Configuration -The MySQL loader plugin can be configured either using environment variables or by configuring the plugin directly in the [`emigrate.config.js` file](/reference/configuration). +The MySQL loader plugin can be configured either using environment variables or by configuring the plugin directly in the [`emigrate.config.js` file](../../../reference/configuration/). ### Configuration file @@ -76,7 +76,7 @@ The environment variables are used when the plugin is used using the `--plugin` npx emigrate list --plugin mysql ``` -Or when specifying the plugin in the [`emigrate.config.js` file](/reference/configuration) as a string: +Or when specifying the plugin in the [`emigrate.config.js` file](../../../reference/configuration) as a string: ```js title="emigrate.config.js" {2} export default { diff --git a/docs/src/content/docs/plugins/reporters/index.mdx b/docs/src/content/docs/plugins/reporters/index.mdx index 91d3b47..cc26701 100644 --- a/docs/src/content/docs/plugins/reporters/index.mdx +++ b/docs/src/content/docs/plugins/reporters/index.mdx @@ -14,11 +14,11 @@ You can specify a reporter via the `--reporter` (or `-r` for short) option: npx emigrate list --reporter pino ``` -Or set it up in your configuration file, see [Reporter configuration](/reference/configuration/#reporter) for more information. +Or set it up in your configuration file, see [Reporter configuration](../../reference/configuration/#reporter) for more information. ## Available Reporters - - + + diff --git a/docs/src/content/docs/plugins/reporters/pino.mdx b/docs/src/content/docs/plugins/reporters/pino.mdx index 2574f6f..d4ce2b2 100644 --- a/docs/src/content/docs/plugins/reporters/pino.mdx +++ b/docs/src/content/docs/plugins/reporters/pino.mdx @@ -40,7 +40,7 @@ The `@emigrate/reporter-` prefix is optional when using this reporter. emigrate --reporter pino ``` -See for instance the [Reporter Option](/commands/up/#-r---reporter-name) for the `up` command for more information. +See for instance the [Reporter Option](../../../commands/up/#-r---reporter-name) for the `up` command for more information. ### Via configuration file @@ -50,7 +50,7 @@ export default { }; ``` -See [Reporter Configuration](/docs/configuration/#reporter) for more information. +See [Reporter Configuration](../../../reference/configuration/#reporter) for more information. ## Example output diff --git a/docs/src/content/docs/plugins/storage/file-system.mdx b/docs/src/content/docs/plugins/storage/file-system.mdx index 124dee2..784acdf 100644 --- a/docs/src/content/docs/plugins/storage/file-system.mdx +++ b/docs/src/content/docs/plugins/storage/file-system.mdx @@ -32,7 +32,7 @@ This is suitable for simple setups, but for more advanced setups for instance wh ## Configuration -The File System Storage can be configured easily in your [`emigrate.config.js` file](/reference/configuration): +The File System Storage can be configured easily in your [`emigrate.config.js` file](../../reference/configuration/): ```js {1,4-6} import storageFs from '@emigrate/storage-fs'; diff --git a/docs/src/content/docs/plugins/storage/index.mdx b/docs/src/content/docs/plugins/storage/index.mdx index ec318cf..b066ba4 100644 --- a/docs/src/content/docs/plugins/storage/index.mdx +++ b/docs/src/content/docs/plugins/storage/index.mdx @@ -15,13 +15,13 @@ You can specify a storage plugin via the `--storage` (or `-s` for short) option: npx emigrate list --storage mysql ``` -Or set it up in your configuration file, see [Storage configuration](/reference/configuration/#storage) for more information. +Or set it up in your configuration file, see [Storage configuration](../../reference/configuration/#storage) for more information. ## Available storage plugins - - + + :::note @@ -29,5 +29,5 @@ More storage plugins are coming soon! ::: :::tip[Is your database missing?] -Writing a storage plugin is easy! Check out the [Storage Plugin API](/reference/storage-plugin-api/) for more information. +Writing a storage plugin is easy! Check out the [Storage Plugin API](../../reference/storage-plugin-api/) for more information. ::: diff --git a/docs/src/content/docs/plugins/storage/mysql.mdx b/docs/src/content/docs/plugins/storage/mysql.mdx index 5250b84..6dc5e01 100644 --- a/docs/src/content/docs/plugins/storage/mysql.mdx +++ b/docs/src/content/docs/plugins/storage/mysql.mdx @@ -4,7 +4,7 @@ title: MySQL Storage import { Tabs, TabItem } from '@astrojs/starlight/components'; -The MySQL storage plugin uses a MySQL database to store the migration history (*duh*). In the same package you can find the [MySQL Loader](/plugins/loaders/mysql/) and the [MySQL Generator](/plugins/generators/mysql/). +The MySQL storage plugin uses a MySQL database to store the migration history (*duh*). In the same package you can find the [MySQL Loader](../../loaders/mysql/) and the [MySQL Generator](../../generators/mysql/). ## Installation @@ -28,7 +28,7 @@ The MySQL storage plugin uses a MySQL database to store the migration history (* ## Configuration -The MySQL storage can be configured either using environment variables or by configuring the plugin directly in the [`emigrate.config.js` file](/reference/configuration). +The MySQL storage can be configured either using environment variables or by configuring the plugin directly in the [`emigrate.config.js` file](../../../reference/configuration/). ### Configuration file @@ -83,7 +83,7 @@ The environment variables are used when the storage plugin is used using the `-- npx emigrate list --storage mysql ``` -Or when specifying the storage in the [`emigrate.config.js` file](/reference/configuration) as a string: +Or when specifying the storage in the [`emigrate.config.js` file](../../../reference/configuration) as a string: ```js title="emigrate.config.js" {2} export default { diff --git a/docs/src/content/docs/reference/configuration.mdx b/docs/src/content/docs/reference/configuration.mdx index e8753da..d03dcf7 100644 --- a/docs/src/content/docs/reference/configuration.mdx +++ b/docs/src/content/docs/reference/configuration.mdx @@ -47,7 +47,7 @@ Set the directory where your migrations are located, relative to the project roo **type:** `string | EmigrateReporter | Promise | (() => Promise)` **default:** `"default"` - the default reporter -Set the reporter to use for the different commands. Specifying a [reporter](/plugins/reporters/) is most useful in a CI or production environment where you either ship logs or want to have a machine-readable format. +Set the reporter to use for the different commands. Specifying a [reporter](../plugins/reporters/) is most useful in a CI or production environment where you either ship logs or want to have a machine-readable format. ```js title="emigrate.config.js" {2} export default { @@ -77,7 +77,7 @@ The default reporter automatically detects if the current environment is an inte **type:** `string | EmigrateStorage | Promise | (() => Promise)` -Set the [storage plugin](/plugins/storage/) to use for storing and reading the migration history. This option is required by all Emigrate commands except `new` which doesn't use it. +Set the [storage plugin](../plugins/storage/) to use for storing and reading the migration history. This option is required by all Emigrate commands except `new` which doesn't use it. ```js title="emigrate.config.js" {2} export default { @@ -86,7 +86,7 @@ export default { ``` :::note -Each storage plugin can have its own configuration options, see the corresponding [Storage Plugin](/plugins/storage/) section for more information. +Each storage plugin can have its own configuration options, see the corresponding [Storage Plugin](../plugins/storage/) section for more information. ::: ### `plugins` @@ -97,8 +97,8 @@ Set the plugins to use for the different commands. There are different types of In short: -* [Loader Plugins](/plugins/loaders/) - are used for transforming non-JavaScript files into JavaScript files that can be executed by Node.js. These are only used by the `up` command. -* [Generator Plugins](/plugins/generators/) - are used for generating new migration files. These are only used by the `new` command. +* [Loader Plugins](../plugins/loaders/) - are used for transforming non-JavaScript files into JavaScript files that can be executed by Node.js. These are only used by the `up` command. +* [Generator Plugins](../plugins/generators/) - are used for generating new migration files. These are only used by the `new` command. ```js title="emigrate.config.js" {2} export default { @@ -107,7 +107,7 @@ export default { ``` :::tip[Did you know?] -The same package can expose multiple plugins, so you can specify the plugin only once and it can be used as both a loader and a generator (and storage, in the case of [MySQL](/plugins/storage/mysql) for instance). +The same package can expose multiple plugins, so you can specify the plugin only once and it can be used as both a loader and a generator (and storage, in the case of [MySQL](../plugins/storage/mysql) for instance). ::: ### `template` From e186c1fbce1d7644d156fc04b236b21e06096454 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 16:28:46 +0100 Subject: [PATCH 024/136] docs: a few more links to fix --- docs/src/content/docs/intro/quick-start.mdx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/src/content/docs/intro/quick-start.mdx b/docs/src/content/docs/intro/quick-start.mdx index 3f70685..12eac1f 100644 --- a/docs/src/content/docs/intro/quick-start.mdx +++ b/docs/src/content/docs/intro/quick-start.mdx @@ -38,7 +38,7 @@ But for now, this is the way to go. ### Pick a storage plugin -Emigrate uses a [storage plugin](../plugins/storage/) to store the migration history. +Emigrate uses a [storage plugin](../../plugins/storage/) to store the migration history. Install the plugin you want to use, for example: @@ -84,7 +84,7 @@ Otherwise the file would have the `.js` extension by default. :::tip[Did you know?] You can avoid typing `--plugin mysql` by configuring Emigrate using an `emigrate.config.js` file. -See [Configuration](../reference/configuration/) for more information. +See [Configuration](../../reference/configuration/) for more information. ::: #### Fill the migration file @@ -132,7 +132,7 @@ npx emigrate up --storage mysql --plugin mysql --dry ``` :::note -This will connect to the database using some default values. For ways to configure the connection, see [Configuration](../reference/configuration/). +This will connect to the database using some default values. For ways to configure the connection, see [Configuration](../../reference/configuration/). ::: :::caution @@ -141,6 +141,6 @@ Be sure to configure the connection correctly and use the `--dry` flag to test y ::: :::tip[Did you know?] -In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a [Storage Plugin](../plugins/storage/) -and once for the `--plugin` option as a [Loader Plugin](../plugins/loaders/) to be able to read `.sql` files. +In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a [Storage Plugin](../../plugins/storage/) +and once for the `--plugin` option as a [Loader Plugin](../../plugins/loaders/) to be able to read `.sql` files. ::: From 58316ba6f81b8bde42b7ff898b736c6443032964 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 16:30:34 +0100 Subject: [PATCH 025/136] docs: and yet another --- docs/src/content/docs/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index d08a601..060db67 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -8,7 +8,7 @@ hero: file: ../../assets/emigrate.png actions: - text: Quick Start - link: /intro/quick-start/ + link: intro/quick-start/ icon: right-arrow variant: primary - text: View on GitHub From bdf831b008659687bed3ebefcc26e25b4be5b83a Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 18 Dec 2023 16:36:05 +0100 Subject: [PATCH 026/136] docs: use correct hrefs for all link elements --- docs/astro.config.mjs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 4738a14..e60204a 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -3,10 +3,12 @@ import { defineConfig } from 'astro/config'; import starlight from '@astrojs/starlight'; import tailwind from '@astrojs/tailwind'; +const base = process.env.ASTRO_BASE || ''; + // https://astro.build/config export default defineConfig({ site: process.env.ASTRO_SITE, - base: process.env.ASTRO_BASE, + base: base || undefined, integrations: [ starlight({ title: 'Emigrate', @@ -18,7 +20,7 @@ export default defineConfig({ attrs: { rel: 'apple-touch-icon', type: 'image/png', - href: '/apple-touch-icon.png', + href: `${base}/apple-touch-icon.png`, sizes: '180x180', }, }, @@ -27,7 +29,7 @@ export default defineConfig({ attrs: { rel: 'icon', type: 'image/png', - href: '/favicon-32x32.png', + href: `${base}/favicon-32x32.png`, sizes: '32x32', }, }, @@ -36,7 +38,7 @@ export default defineConfig({ attrs: { rel: 'icon', type: 'image/png', - href: '/favicon-16x16.png', + href: `${base}/favicon-16x16.png`, sizes: '16x16', }, }, @@ -44,7 +46,7 @@ export default defineConfig({ tag: 'link', attrs: { rel: 'manifest', - href: '/site.webmanifest', + href: `${base}/site.webmanifest`, }, }, ], From ca6834d95fab4ae79fd153b5009a0958960ffab8 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 19 Dec 2023 09:57:23 +0100 Subject: [PATCH 027/136] refactor: use a custom Link component to be able to use absolute URLs everywhere ...that supports any `base` property --- docs/astro.config.mjs | 2 +- docs/src/components/Link.astro | 11 +++++++++++ docs/src/content/docs/commands/list.mdx | 5 +++-- docs/src/content/docs/commands/new.mdx | 11 ++++++----- docs/src/content/docs/commands/remove.mdx | 5 +++-- docs/src/content/docs/commands/up.mdx | 7 ++++--- docs/src/content/docs/index.mdx | 5 +++-- docs/src/content/docs/intro/quick-start.mdx | 11 ++++++----- docs/src/content/docs/intro/whats-emigrate.mdx | 12 +++++++----- docs/src/content/docs/plugins/generators/index.mdx | 5 +++-- docs/src/content/docs/plugins/generators/js.mdx | 5 +++-- docs/src/content/docs/plugins/generators/mysql.mdx | 5 +++-- docs/src/content/docs/plugins/loaders/index.mdx | 7 ++++--- docs/src/content/docs/plugins/loaders/mysql.mdx | 7 ++++--- docs/src/content/docs/plugins/reporters/index.mdx | 3 ++- docs/src/content/docs/plugins/reporters/pino.mdx | 5 +++-- .../content/docs/plugins/storage/file-system.mdx | 3 ++- docs/src/content/docs/plugins/storage/index.mdx | 5 +++-- docs/src/content/docs/plugins/storage/mysql.mdx | 7 ++++--- docs/src/content/docs/reference/configuration.mdx | 13 +++++++------ docs/tsconfig.json | 8 +++++++- 21 files changed, 89 insertions(+), 53 deletions(-) create mode 100644 docs/src/components/Link.astro diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index e60204a..00937fe 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -7,7 +7,7 @@ const base = process.env.ASTRO_BASE || ''; // https://astro.build/config export default defineConfig({ - site: process.env.ASTRO_SITE, + site: process.env.ASTRO_SITE ?? 'http://localhost:4321', base: base || undefined, integrations: [ starlight({ diff --git a/docs/src/components/Link.astro b/docs/src/components/Link.astro new file mode 100644 index 0000000..8c45d97 --- /dev/null +++ b/docs/src/components/Link.astro @@ -0,0 +1,11 @@ +--- +interface Props { + href: string; +} + +const base = import.meta.env.BASE_URL === '/' || !import.meta.env.BASE_URL ? '' : import.meta.env.BASE_URL; +const site = import.meta.env.SITE ?? ''; +const { href } = Astro.props; +--- + +
diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx index 48d393e..e433a34 100644 --- a/docs/src/content/docs/commands/list.mdx +++ b/docs/src/content/docs/commands/list.mdx @@ -4,6 +4,7 @@ description: "List migrations and their status." --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; The `list` command is used to list _all_ migrations, i.e. both already run migrations and migrations that haven't been run yet. @@ -51,7 +52,7 @@ The directory where the migration files are located. The given path should be ab ### `-s`, `--storage ` -The [storage plugin](../../plugins/storage/) to use, which is responsible for where to store the migration history. +The storage plugin to use, which is responsible for where to store the migration history. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: @@ -67,7 +68,7 @@ In case you have both a `emigrate-storage-somedb` and a `somedb` package install ### `-r`, `--reporter ` -The reporter to use for listing the migrations. +The reporter to use for listing the migrations. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx index 2466901..517bbbb 100644 --- a/docs/src/content/docs/commands/new.mdx +++ b/docs/src/content/docs/commands/new.mdx @@ -4,10 +4,11 @@ description: "Create new migration." --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; The `new` command is used to create a new migration file in the given directory. -The migration file can be based on a template, generated by a [generator plugin](../../plugins/generators/), or just be an empty file. +The migration file can be based on a template, generated by a generator plugin, or just be an empty file. ## Usage @@ -61,15 +62,15 @@ The directory where the migration files are located. The given path should be ab The template file to use for generating the migration file. The given path should be absolute or relative to the current working directory. -The template can contain a `{{name}}` placeholder which will be replaced with the migration name provided to the command. The generated file will have the same extension as the template file, unless the [`--extension`](#e---extension-ext) option is used. +The template can contain a `{{name}}` placeholder which will be replaced with the migration name provided to the command. The generated file will have the same extension as the template file, unless the [`--extension`](#-e---extension-ext) option is used. ### `-e`, `--extension ` -The extension to use for the migration file. Unless the [`--template`](#t---template-path) option is also specified the file will be empty. +The extension to use for the migration file. Unless the [`--template`](#-t---template-path) option is also specified the file will be empty. ### `-p`, `--plugin ` -The [generator plugin](../../plugins/generators/) to use. The generator plugin is responsible for generating the migration filename and its contents. +The generator plugin to use. The generator plugin is responsible for generating the migration filename and its contents. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: @@ -84,7 +85,7 @@ In case you have both a `emigrate-plugin-someplugin` and a `someplugin` package ### `-r`, `--reporter ` -The reporter to use for listing the migrations. +The reporter to use for listing the migrations. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index 6c19500..be029eb 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -4,6 +4,7 @@ description: "Remove a migration from the history." --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; The `remove` command is used to remove a migration from the history. This is useful if you want to retry a migration that has failed. @@ -58,7 +59,7 @@ Force removal of the migration history entry even if the migration file does not ### `-s`, `--storage ` -The [storage plugin](../../plugins/storage/) to use, which is responsible for where to store the migration history. +The storage plugin to use, which is responsible for where to store the migration history. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: @@ -74,7 +75,7 @@ In case you have both a `emigrate-storage-somedb` and a `somedb` package install ### `-r`, `--reporter ` -The reporter to use for listing the migrations. +The reporter to use for listing the migrations. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 7edd241..b45effb 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -4,6 +4,7 @@ description: "Run migrations" --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; The `up` command is used to either list or run all pending migrations, i.e. migrations that haven't been run yet. @@ -57,7 +58,7 @@ The directory where the migration files are located. The given path should be ab ### `-s`, `--storage ` -The [storage plugin](../../plugins/storage/) to use, which is responsible for where to store the migration history. +The storage plugin to use, which is responsible for where to store the migration history. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: @@ -73,7 +74,7 @@ In case you have both a `emigrate-storage-somedb` and a `somedb` package install ### `-p`, `--plugin ` -The [loader plugin(s)](../../plugins/loaders/) to use. Can be specified multiple times to use multiple plugins. +The loader plugin(s) to use. Can be specified multiple times to use multiple plugins. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: @@ -88,7 +89,7 @@ In case you have both a `emigrate-plugin-someplugin` and a `someplugin` package ### `-r`, `--reporter ` -The reporter to use for reporting the migration progress. +The reporter to use for reporting the migration progress. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/index.mdx b/docs/src/content/docs/index.mdx index 060db67..2ac0dae 100644 --- a/docs/src/content/docs/index.mdx +++ b/docs/src/content/docs/index.mdx @@ -17,6 +17,7 @@ hero: --- import { Card, CardGrid } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; ## Key features @@ -29,10 +30,10 @@ import { Card, CardGrid } from '@astrojs/starlight/components'; Migrate many databases from one repository or many repositories to one database. There's no need to synchronize deployments. - Write your migration files using the [language of your choice](plugins/loaders/). + Write your migration files using the language of your choice. And mix and match them as you need. E.g. `SQL` for database schema changes, and `JavaScript` for data transformation. - Emigrate is designed to be flexible and customizable to suite any environment and setup using its [plugin system](plugins/). + Emigrate is designed to be flexible and customizable to suite any environment and setup using its plugin system. diff --git a/docs/src/content/docs/intro/quick-start.mdx b/docs/src/content/docs/intro/quick-start.mdx index 12eac1f..5017867 100644 --- a/docs/src/content/docs/intro/quick-start.mdx +++ b/docs/src/content/docs/intro/quick-start.mdx @@ -4,6 +4,7 @@ description: Get going with Emigrate quickly --- import { Tabs, TabItem, LinkCard } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; :::note The following guide will be even simpler soon with the release of a initialization command. @@ -38,7 +39,7 @@ But for now, this is the way to go. ### Pick a storage plugin -Emigrate uses a [storage plugin](../../plugins/storage/) to store the migration history. +Emigrate uses a storage plugin to store the migration history. Install the plugin you want to use, for example: @@ -84,7 +85,7 @@ Otherwise the file would have the `.js` extension by default. :::tip[Did you know?] You can avoid typing `--plugin mysql` by configuring Emigrate using an `emigrate.config.js` file. -See [Configuration](../../reference/configuration/) for more information. +See Configuration for more information. ::: #### Fill the migration file @@ -132,7 +133,7 @@ npx emigrate up --storage mysql --plugin mysql --dry ``` :::note -This will connect to the database using some default values. For ways to configure the connection, see [Configuration](../../reference/configuration/). +This will connect to the database using some default values. For ways to configure the connection, see Configuration. ::: :::caution @@ -141,6 +142,6 @@ Be sure to configure the connection correctly and use the `--dry` flag to test y ::: :::tip[Did you know?] -In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a [Storage Plugin](../../plugins/storage/) -and once for the `--plugin` option as a [Loader Plugin](../../plugins/loaders/) to be able to read `.sql` files. +In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a Storage Plugin +and once for the `--plugin` option as a Loader Plugin to be able to read `.sql` files. ::: diff --git a/docs/src/content/docs/intro/whats-emigrate.mdx b/docs/src/content/docs/intro/whats-emigrate.mdx index dd83f50..c152272 100644 --- a/docs/src/content/docs/intro/whats-emigrate.mdx +++ b/docs/src/content/docs/intro/whats-emigrate.mdx @@ -3,15 +3,17 @@ title: What's Emigrate? description: An introduction to Emigrate, the modern database agnostic migration tool. --- +import Link from '@components/Link.astro'; + Emigrate is written in [TypeScript](https://www.typescriptlang.org) and is a migration tool for any database or data. * It's database agnostic - you can use it with any database, or even with non-database data. * It's the successor of [klei-migrate](https://github.com/klei/migrate) and is designed to be compatible with [Immigration](https://github.com/blakeembrey/node-immigration) and many of its storage plugins, as well as [Migrate](https://github.com/tj/node-migrate). -* It supports migration files written using [CommonJS or ES Modules out of the box](../../plugins/loaders/default/), with any of the following extensions: `.js`, `.cjs` or `.mjs`, and supports [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or using the [NodeJS Callback Pattern](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks#handling-errors-in-callbacks). -* Other languages can be used by using a [Loader Plugin](../../plugins/loaders/). -* The migration history can be stored anywhere using a [Storage Plugin](../../plugins/storage/). -* The output can be customized using [Reporters](../../plugins/reporters/). +* It supports migration files written using CommonJS or ES Modules out of the box, with any of the following extensions: `.js`, `.cjs` or `.mjs`, and supports [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or using the [NodeJS Callback Pattern](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks#handling-errors-in-callbacks). +* Other languages can be used by using a Loader Plugin. +* The migration history can be stored anywhere using a Storage Plugin. +* The output can be customized using Reporters. :::tip[Did you know?] -Thanks to [the plugin system](../../plugins/) you can even write migrations in plain SQL! So no need for Java-based tools like Liquibase or Flyway. +Thanks to the plugin system you can even write migrations in plain SQL! So no need for Java-based tools like Liquibase or Flyway. ::: diff --git a/docs/src/content/docs/plugins/generators/index.mdx b/docs/src/content/docs/plugins/generators/index.mdx index 4049e68..3d737ca 100644 --- a/docs/src/content/docs/plugins/generators/index.mdx +++ b/docs/src/content/docs/plugins/generators/index.mdx @@ -3,12 +3,13 @@ title: "Generator Plugins" --- import { LinkCard, CardGrid } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; A generator plugin is a plugin that generates new migration files. They are responsible for both generating the new file's name and its contents. :::tip[Did you know?] -Many of the [Loader Plugins](../loaders/) usually include a generator plugin as well. +Many of the Loader Plugins usually include a generator plugin as well. The generator is responsible for generating migration files in a specific format and the loader is responsible for loading the same format. ::: @@ -20,5 +21,5 @@ The generator is responsible for generating migration files in a specific format :::note -Instead of having to install a generator plugin, you can also use the much simpler [`--template`](../../commands/new/#t---template-path) option to specify a custom template file for new migrations. +Instead of having to install a generator plugin, you can also use the much simpler `--template` option to specify a custom template file for new migrations. ::: diff --git a/docs/src/content/docs/plugins/generators/js.mdx b/docs/src/content/docs/plugins/generators/js.mdx index 38b41de..f344fa5 100644 --- a/docs/src/content/docs/plugins/generators/js.mdx +++ b/docs/src/content/docs/plugins/generators/js.mdx @@ -3,8 +3,9 @@ title: "JavaScript Generator" --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; -A [generator plugin](../) for generating new migration files in JavaScript. +A generator plugin for generating new migration files in JavaScript. ## Installation @@ -32,4 +33,4 @@ A [generator plugin](../) for generating new migration files in JavaScript. emigrate new --plugin generate-js create some fancy table ``` -For more information see [the `new` command](../../commands/new/)'s documentation. +For more information see the `new` command's documentation. diff --git a/docs/src/content/docs/plugins/generators/mysql.mdx b/docs/src/content/docs/plugins/generators/mysql.mdx index b923cb7..582b16f 100644 --- a/docs/src/content/docs/plugins/generators/mysql.mdx +++ b/docs/src/content/docs/plugins/generators/mysql.mdx @@ -3,8 +3,9 @@ title: "MySQL Generator" --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; -The MySQL generator creates new migration files with the `.sql` extension. In the same package you can find the [MySQL Loader](../../loaders/mysql/) and the [MySQL Storage](../../storage/mysql/). +The MySQL generator creates new migration files with the `.sql` extension. In the same package you can find the MySQL Loader and the MySQL Storage. ## Installation @@ -32,4 +33,4 @@ The MySQL generator creates new migration files with the `.sql` extension. In th emigrate new --plugin mysql create some fancy table ``` -For more information see [the `new` command](../../../commands/new/)'s documentation. +For more information see the `new` command's documentation. diff --git a/docs/src/content/docs/plugins/loaders/index.mdx b/docs/src/content/docs/plugins/loaders/index.mdx index 3e1606a..288393a 100644 --- a/docs/src/content/docs/plugins/loaders/index.mdx +++ b/docs/src/content/docs/plugins/loaders/index.mdx @@ -3,10 +3,11 @@ title: Loader Plugins --- import { LinkCard, CardGrid } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; Loader plugins are used to transform any file type into a JavaScript function that will be called when the migration file is executed. -Out of the box, Emigrate supports the following file extensions: `.js`, `.cjs` and `.mjs`. And both CommonJS and ES Modules are supported. See the [Default Loader](default/) for more information. +Out of the box, Emigrate supports the following file extensions: `.js`, `.cjs` and `.mjs`. And both CommonJS and ES Modules are supported. See the Default Loader for more information. ## Using a loader plugin @@ -16,12 +17,12 @@ You can specify a loader plugin via the `--plugin` (or `-p` for short) option: npx emigrate up --plugin mysql ``` -Or set it up in your configuration file, see [Plugin configuration](../../reference/configuration/#plugins) for more information. +Or set it up in your configuration file, see Plugin configuration for more information. :::tip[Did you know?] You can specify multiple loader plugins at the same time, which is needed when you mix file types in your migrations folder. For example, you can use the `mysql` loader for `.sql` files and the `typescript` loader for `.ts` files. -The [default loader](default/) will be used for all other file types, and doesn't need to be specified. +The default loader will be used for all other file types, and doesn't need to be specified. ::: ## Available Loader Plugins diff --git a/docs/src/content/docs/plugins/loaders/mysql.mdx b/docs/src/content/docs/plugins/loaders/mysql.mdx index b5f8946..a2baab8 100644 --- a/docs/src/content/docs/plugins/loaders/mysql.mdx +++ b/docs/src/content/docs/plugins/loaders/mysql.mdx @@ -3,8 +3,9 @@ title: MySQL Loader Plugin --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; -The MySQL loader plugin transforms `.sql` files into JavaScript functions that Emigrate can use to execute the migrations. In the same package you can find the [MySQL Generator](../../generators/mysql/) and the [MySQL Storage](../../storage/mysql/). +The MySQL loader plugin transforms `.sql` files into JavaScript functions that Emigrate can use to execute the migrations. In the same package you can find the MySQL Generator and the MySQL Storage. ## Installation @@ -28,7 +29,7 @@ The MySQL loader plugin transforms `.sql` files into JavaScript functions that E ## Configuration -The MySQL loader plugin can be configured either using environment variables or by configuring the plugin directly in the [`emigrate.config.js` file](../../../reference/configuration/). +The MySQL loader plugin can be configured either using environment variables or by configuring the plugin directly in the `emigrate.config.js` file. ### Configuration file @@ -76,7 +77,7 @@ The environment variables are used when the plugin is used using the `--plugin` npx emigrate list --plugin mysql ``` -Or when specifying the plugin in the [`emigrate.config.js` file](../../../reference/configuration) as a string: +Or when specifying the plugin in the `emigrate.config.js` file as a string: ```js title="emigrate.config.js" {2} export default { diff --git a/docs/src/content/docs/plugins/reporters/index.mdx b/docs/src/content/docs/plugins/reporters/index.mdx index cc26701..be0a1ec 100644 --- a/docs/src/content/docs/plugins/reporters/index.mdx +++ b/docs/src/content/docs/plugins/reporters/index.mdx @@ -3,6 +3,7 @@ title: Reporters --- import { LinkCard, CardGrid } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; A reporter is a plugin that's responsible for printing the migration progress and results to the console. @@ -14,7 +15,7 @@ You can specify a reporter via the `--reporter` (or `-r` for short) option: npx emigrate list --reporter pino ``` -Or set it up in your configuration file, see [Reporter configuration](../../reference/configuration/#reporter) for more information. +Or set it up in your configuration file, see Reporter configuration for more information. ## Available Reporters diff --git a/docs/src/content/docs/plugins/reporters/pino.mdx b/docs/src/content/docs/plugins/reporters/pino.mdx index d4ce2b2..37d7be6 100644 --- a/docs/src/content/docs/plugins/reporters/pino.mdx +++ b/docs/src/content/docs/plugins/reporters/pino.mdx @@ -3,6 +3,7 @@ title: Pino Reporter --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; Emigrate's reporter that uses [Pino](https://getpino.io/#/) as the logger. @@ -40,7 +41,7 @@ The `@emigrate/reporter-` prefix is optional when using this reporter. emigrate --reporter pino ``` -See for instance the [Reporter Option](../../../commands/up/#-r---reporter-name) for the `up` command for more information. +See for instance the Reporter Option for the `up` command for more information. ### Via configuration file @@ -50,7 +51,7 @@ export default { }; ``` -See [Reporter Configuration](../../../reference/configuration/#reporter) for more information. +See Reporter Configuration for more information. ## Example output diff --git a/docs/src/content/docs/plugins/storage/file-system.mdx b/docs/src/content/docs/plugins/storage/file-system.mdx index 784acdf..94a5cad 100644 --- a/docs/src/content/docs/plugins/storage/file-system.mdx +++ b/docs/src/content/docs/plugins/storage/file-system.mdx @@ -3,6 +3,7 @@ title: File System Storage --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; The File System Storage is a storage driver that stores the migration history in a `.json` file on the local file system. @@ -32,7 +33,7 @@ This is suitable for simple setups, but for more advanced setups for instance wh ## Configuration -The File System Storage can be configured easily in your [`emigrate.config.js` file](../../reference/configuration/): +The File System Storage can be configured easily in your `emigrate.config.js` file: ```js {1,4-6} import storageFs from '@emigrate/storage-fs'; diff --git a/docs/src/content/docs/plugins/storage/index.mdx b/docs/src/content/docs/plugins/storage/index.mdx index b066ba4..4188084 100644 --- a/docs/src/content/docs/plugins/storage/index.mdx +++ b/docs/src/content/docs/plugins/storage/index.mdx @@ -3,6 +3,7 @@ title: Storage Plugins --- import { LinkCard, CardGrid } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; Storage plugins are used for storing and reading the migration history state. Usually you'll want to store the migration history in the same database as the one which your migration files are targeting. @@ -15,7 +16,7 @@ You can specify a storage plugin via the `--storage` (or `-s` for short) option: npx emigrate list --storage mysql ``` -Or set it up in your configuration file, see [Storage configuration](../../reference/configuration/#storage) for more information. +Or set it up in your configuration file, see Storage configuration for more information. ## Available storage plugins @@ -29,5 +30,5 @@ More storage plugins are coming soon! ::: :::tip[Is your database missing?] -Writing a storage plugin is easy! Check out the [Storage Plugin API](../../reference/storage-plugin-api/) for more information. +Writing a storage plugin is easy! Check out the Storage Plugin API for more information. ::: diff --git a/docs/src/content/docs/plugins/storage/mysql.mdx b/docs/src/content/docs/plugins/storage/mysql.mdx index 6dc5e01..8e36a5a 100644 --- a/docs/src/content/docs/plugins/storage/mysql.mdx +++ b/docs/src/content/docs/plugins/storage/mysql.mdx @@ -3,8 +3,9 @@ title: MySQL Storage --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; -The MySQL storage plugin uses a MySQL database to store the migration history (*duh*). In the same package you can find the [MySQL Loader](../../loaders/mysql/) and the [MySQL Generator](../../generators/mysql/). +The MySQL storage plugin uses a MySQL database to store the migration history (*duh*). In the same package you can find the MySQL Loader and the MySQL Generator. ## Installation @@ -28,7 +29,7 @@ The MySQL storage plugin uses a MySQL database to store the migration history (* ## Configuration -The MySQL storage can be configured either using environment variables or by configuring the plugin directly in the [`emigrate.config.js` file](../../../reference/configuration/). +The MySQL storage can be configured either using environment variables or by configuring the plugin directly in the `emigrate.config.js` file. ### Configuration file @@ -83,7 +84,7 @@ The environment variables are used when the storage plugin is used using the `-- npx emigrate list --storage mysql ``` -Or when specifying the storage in the [`emigrate.config.js` file](../../../reference/configuration) as a string: +Or when specifying the storage in the `emigrate.config.js` file as a string: ```js title="emigrate.config.js" {2} export default { diff --git a/docs/src/content/docs/reference/configuration.mdx b/docs/src/content/docs/reference/configuration.mdx index d03dcf7..5294cc3 100644 --- a/docs/src/content/docs/reference/configuration.mdx +++ b/docs/src/content/docs/reference/configuration.mdx @@ -6,6 +6,7 @@ sidebar: --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; Emigrate can be configured using a configuration file, and it uses [Cosmiconfig](https://github.com/cosmiconfig/cosmiconfig) under the hood so you can use a variety of formats and locations for your configuration file. @@ -47,7 +48,7 @@ Set the directory where your migrations are located, relative to the project roo **type:** `string | EmigrateReporter | Promise | (() => Promise)` **default:** `"default"` - the default reporter -Set the reporter to use for the different commands. Specifying a [reporter](../plugins/reporters/) is most useful in a CI or production environment where you either ship logs or want to have a machine-readable format. +Set the reporter to use for the different commands. Specifying a reporter is most useful in a CI or production environment where you either ship logs or want to have a machine-readable format. ```js title="emigrate.config.js" {2} export default { @@ -77,7 +78,7 @@ The default reporter automatically detects if the current environment is an inte **type:** `string | EmigrateStorage | Promise | (() => Promise)` -Set the [storage plugin](../plugins/storage/) to use for storing and reading the migration history. This option is required by all Emigrate commands except `new` which doesn't use it. +Set the storage plugin to use for storing and reading the migration history. This option is required by all Emigrate commands except `new` which doesn't use it. ```js title="emigrate.config.js" {2} export default { @@ -86,7 +87,7 @@ export default { ``` :::note -Each storage plugin can have its own configuration options, see the corresponding [Storage Plugin](../plugins/storage/) section for more information. +Each storage plugin can have its own configuration options, see the corresponding Storage Plugin section for more information. ::: ### `plugins` @@ -97,8 +98,8 @@ Set the plugins to use for the different commands. There are different types of In short: -* [Loader Plugins](../plugins/loaders/) - are used for transforming non-JavaScript files into JavaScript files that can be executed by Node.js. These are only used by the `up` command. -* [Generator Plugins](../plugins/generators/) - are used for generating new migration files. These are only used by the `new` command. +* Loader Plugins - are used for transforming non-JavaScript files into JavaScript files that can be executed by Node.js. These are only used by the `up` command. +* Generator Plugins - are used for generating new migration files. These are only used by the `new` command. ```js title="emigrate.config.js" {2} export default { @@ -107,7 +108,7 @@ export default { ``` :::tip[Did you know?] -The same package can expose multiple plugins, so you can specify the plugin only once and it can be used as both a loader and a generator (and storage, in the case of [MySQL](../plugins/storage/mysql) for instance). +The same package can expose multiple plugins, so you can specify the plugin only once and it can be used as both a loader and a generator (and storage, in the case of MySQL for instance). ::: ### `template` diff --git a/docs/tsconfig.json b/docs/tsconfig.json index fbc2f5f..a128757 100644 --- a/docs/tsconfig.json +++ b/docs/tsconfig.json @@ -1,3 +1,9 @@ { - "extends": "astro/tsconfigs/strictest" + "extends": "astro/tsconfigs/strictest", + "compilerOptions": { + "baseUrl": ".", + "paths": { + "@components/*": ["src/components/*"] + } + } } From f8e13f0d6679198a3dba74eaf70f76ccd23c18ff Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 19 Dec 2023 10:25:06 +0100 Subject: [PATCH 028/136] docs: add some basic documentation for the storage plugin api --- .../docs/reference/migration-types.mdx | 93 +++++++++++++++++++ .../docs/reference/storage-plugin-api.mdx | 86 +++++++++++++++++ 2 files changed, 179 insertions(+) create mode 100644 docs/src/content/docs/reference/migration-types.mdx create mode 100644 docs/src/content/docs/reference/storage-plugin-api.mdx diff --git a/docs/src/content/docs/reference/migration-types.mdx b/docs/src/content/docs/reference/migration-types.mdx new file mode 100644 index 0000000..b47f5c0 --- /dev/null +++ b/docs/src/content/docs/reference/migration-types.mdx @@ -0,0 +1,93 @@ +--- +title: Migration Types +--- + +import Link from '@components/Link.astro'; + +These are common TypeScript types for migration files used by plugins. + +## `MigrationMetadata` + +```ts +type MigrationMetadata = { + /** + * The name of the migration file + * + * @example 20210901123456000_create_users_table.js + */ + name: string; + /** + * The directory where the migration file is located, relative to the current working directory + * + * @example migrations + */ + directory: string; + /** + * The full absolute path to the migration file + * + * @example /home/user/project/migrations/20210901123456000_create_users_table.js + */ + filePath: string; + /** + * The relative path to the migration file, relative to the current working directory + * + * @example migrations/20210901123456000_create_users_table.js + */ + relativeFilePath: string; + /** + * The current working directory (the same as process.cwd()) + */ + cwd: string; + /** + * The extension of the migration file, with a leading period + * + * @example .js + */ + extension: string; +}; +``` + +## `MigrationMetadataFinished` + +```ts +type MigrationMetadataFinished = MigrationMetadata & { + status: 'done' | 'failed' | 'skipped' | 'pending'; + /** + * The duration of the migration in milliseconds + */ + duration: number; + /** + * The error that occurred during the migration, if `status` is `"failed"` + */ + error?: Error; +}; +``` + +## `MigrationHistoryEntry` + +```ts +type MigrationHistoryEntry = { + /** + * The name of the migration. + * + * @example 20210901123456000_create_users_table.js + */ + name: string; + /** + * The date when the migration was executed. + */ + date: Date; + /** + * The status of the migration. + * + * As an entry is only added to the history after the migration has finished, this will always be either `"done"` or `"failed"`. + */ + status: 'done' | 'failed'; + /** + * The error that occurred during the migration, if `status` is `"failed"` + * + * This should be a plain object, as it is serialized when passed to the storage plugin's `onError` method. + */ + error?: Record; +}; +``` diff --git a/docs/src/content/docs/reference/storage-plugin-api.mdx b/docs/src/content/docs/reference/storage-plugin-api.mdx new file mode 100644 index 0000000..5840fe9 --- /dev/null +++ b/docs/src/content/docs/reference/storage-plugin-api.mdx @@ -0,0 +1,86 @@ +--- +title: Storage Plugin API +--- + +import Link from '@components/Link.astro'; + +When writing a storage plugin, you will need to implement the following interface: + +```ts +type EmigrateStorage = { + initializeStorage(): Promise; +}; +``` + +Where `Storage` is the following interface: + +```ts +type Storage = { + /** + * Acquire a lock on the given migrations. + * + * To best support concurrent migrations (e.g. when multiple services are deployed at the same time and want to migrate the same database) + * the plugin should try to lock all migrations at once (i.e. in a transaction) and ignore migrations that are already locked (or done). + * The successfully locked migrations should be returned and are the migrations that will be executed. + * + * If one of the migrations to lock is in a failed state, the plugin should throw an error to abort the migration attempt. + * + * @returns The migrations that were successfully locked. + */ + lock(migrations: MigrationMetadata[]): Promise; + /** + * The unlock method is called after all migrations have been executed or when the process is interrupted (e.g. by a SIGTERM or SIGINT signal). + * + * Depending on the plugin implementation, the unlock method is usually a no-op for already succeeded or failed migrations. + * + * @param migrations The previously successfully locked migrations that should now be unlocked. + */ + unlock(migrations: MigrationMetadata[]): Promise; + + /** + * Remove a migration from the history. + * + * This is used to remove a migration from the history which is needed for failed migrations to be re-executed. + * + * @param migration The migration that should be removed from the history. + */ + remove(migration: MigrationMetadata): Promise; + /** + * Get the history of previously executed migrations. + * + * For failed migrations, the error property should be set. + * Emigrate will not sort the history entries, so the plugin should return the entries in the order they were executed. + * The order doesn't affect the execution of migrations, but it does affect the order in which the history is displayed in the CLI. + * Migrations that have not yet been executed will always be run in alphabetical order. + * + * The history has two purposes: + * 1. To determine which migrations have already been executed. + * 2. To list the migration history in the CLI. + */ + getHistory(): AsyncIterable; + /** + * Called when a migration has been successfully executed. + * + * @param migration The name of the migration that should be marked as done. + */ + onSuccess(migration: MigrationMetadataFinished): Promise; + /** + * Called when a migration has failed. + * + * The passed error will be serialized so it's easily storable it in the history. + * If the original Error instance is needed it's available as the `error` property on the finished migration. + * + * @param migration The name of the migration that should be marked as failed. + * @param error The error that caused the migration to fail. Serialized for easy storage. + */ + onError(migration: MigrationMetadataFinished, error: SerializedError): Promise; + /** + * Called when the command is finished or aborted (e.g. by a SIGTERM or SIGINT signal). + * + * Use this to clean up any resources like database connections or file handles. + */ + end(): Promise; +}; +``` + +See the Migration Types page for more information about the `MigrationMetadata`, `MigrationMetadataFinished`, and `MigrationHistoryEntry` types. From 3d34b8ba138a2d621d11c9526b2456a004af45a3 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 19 Dec 2023 10:27:54 +0100 Subject: [PATCH 029/136] chore(deps): remove unused @manypkg/cli package --- package.json | 1 - pnpm-lock.yaml | 249 ------------------------------------------------- 2 files changed, 250 deletions(-) diff --git a/package.json b/package.json index 4a40f76..c1bd171 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,6 @@ "@changesets/cli": "2.27.1", "@commitlint/cli": "18.4.3", "@commitlint/config-conventional": "18.4.3", - "@manypkg/cli": "0.21.0", "@types/node": "20.10.4", "glob": "10.3.10", "husky": "8.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f23e8d..1c78edd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,9 +17,6 @@ importers: '@commitlint/config-conventional': specifier: 18.4.3 version: 18.4.3 - '@manypkg/cli': - specifier: 0.21.0 - version: 0.21.0 '@types/node': specifier: 20.10.4 version: 20.10.4 @@ -1461,26 +1458,6 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false - /@manypkg/cli@0.21.0: - resolution: {integrity: sha512-q/JF25il2EXtyPpc5U/Pp7TMgJot/WmFkyh7M9FiutQkliHp58UqUxIPeUObLu9EtoAp/uP21t+TMDsq1DMbeg==} - engines: {node: '>=14.18.0'} - hasBin: true - dependencies: - '@manypkg/get-packages': 2.2.0 - chalk: 2.4.2 - detect-indent: 6.1.0 - find-up: 4.1.0 - fs-extra: 8.1.0 - normalize-path: 3.0.0 - p-limit: 2.3.0 - package-json: 6.5.0 - parse-github-url: 1.0.2 - sembear: 0.5.2 - semver: 6.3.1 - spawndamnit: 2.0.0 - validate-npm-package-name: 3.0.0 - dev: false - /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: @@ -1490,15 +1467,6 @@ packages: fs-extra: 8.1.0 dev: false - /@manypkg/find-root@2.2.1: - resolution: {integrity: sha512-34NlypD5mmTY65cFAK7QPgY5Tzt0qXR4ZRXdg97xAlkiLuwXUPBEXy5Hsqzd+7S2acsLxUz6Cs50rlDZQr4xUA==} - engines: {node: '>=14.18.0'} - dependencies: - '@manypkg/tools': 1.1.0 - find-up: 4.1.0 - fs-extra: 8.1.0 - dev: false - /@manypkg/get-packages@1.1.3: resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} dependencies: @@ -1510,24 +1478,6 @@ packages: read-yaml-file: 1.1.0 dev: false - /@manypkg/get-packages@2.2.0: - resolution: {integrity: sha512-B5p5BXMwhGZKi/syEEAP1eVg5DZ/9LP+MZr0HqfrHLgu9fq0w4ZwH8yVen4JmjrxI2dWS31dcoswYzuphLaRxg==} - engines: {node: '>=14.18.0'} - dependencies: - '@manypkg/find-root': 2.2.1 - '@manypkg/tools': 1.1.0 - dev: false - - /@manypkg/tools@1.1.0: - resolution: {integrity: sha512-SkAyKAByB9l93Slyg8AUHGuM2kjvWioUTCckT/03J09jYnfEzMO/wSXmEhnKGYs6qx9De8TH4yJCl0Y9lRgnyQ==} - engines: {node: '>=14.18.0'} - dependencies: - fs-extra: 8.1.0 - globby: 11.1.0 - jju: 1.4.0 - read-yaml-file: 1.1.0 - dev: false - /@mdx-js/mdx@3.0.0: resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} dependencies: @@ -1746,18 +1696,6 @@ packages: dev: false optional: true - /@sindresorhus/is@0.14.0: - resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} - engines: {node: '>=6'} - dev: false - - /@szmarczak/http-timer@1.1.2: - resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} - engines: {node: '>=6'} - dependencies: - defer-to-connect: 1.1.3 - dev: false - /@types/acorn@4.0.6: resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} dependencies: @@ -1850,12 +1788,6 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: false - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 20.10.4 - dev: false - /@types/mdast@4.0.3: resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} dependencies: @@ -1908,22 +1840,12 @@ packages: resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} dev: false - /@types/responselike@1.0.3: - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - dependencies: - '@types/node': 20.10.4 - dev: false - /@types/sax@1.2.7: resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} dependencies: '@types/node': 20.10.4 dev: false - /@types/semver@6.2.6: - resolution: {integrity: sha512-6Xe+YAhzQKMxEytKnq01VdyhNwz+M/nJBnOcdIWxBHAl5MS6QOYzOX7PazFDUdtUhTSzvfLKZN9fq5ShKDaAvA==} - dev: false - /@types/semver@7.5.5: resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} dev: false @@ -2697,10 +2619,6 @@ packages: engines: {node: '>=6'} dev: false - /builtins@1.0.3: - resolution: {integrity: sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==} - dev: false - /builtins@5.0.1: resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} dependencies: @@ -2714,19 +2632,6 @@ packages: run-applescript: 5.0.0 dev: false - /cacheable-request@6.1.0: - resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 3.1.0 - lowercase-keys: 2.0.0 - normalize-url: 4.5.1 - responselike: 1.0.2 - dev: false - /call-bind@1.0.5: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} dependencies: @@ -2897,12 +2802,6 @@ packages: wrap-ansi: 7.0.0 dev: false - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: false - /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -3180,13 +3079,6 @@ packages: character-entities: 2.0.2 dev: false - /decompress-response@3.3.0: - resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==} - engines: {node: '>=4'} - dependencies: - mimic-response: 1.0.1 - dev: false - /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} @@ -3227,10 +3119,6 @@ packages: clone: 1.0.4 dev: false - /defer-to-connect@1.1.3: - resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} - dev: false - /define-data-property@1.1.1: resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} engines: {node: '>= 0.4'} @@ -3347,10 +3235,6 @@ packages: engines: {node: '>=4'} dev: false - /duplexer3@0.1.5: - resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - dev: false - /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: false @@ -4362,20 +4246,6 @@ packages: engines: {node: '>=12'} dev: false - /get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - dependencies: - pump: 3.0.0 - dev: false - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: false - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -4527,25 +4397,6 @@ packages: get-intrinsic: 1.2.2 dev: false - /got@9.6.0: - resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} - engines: {node: '>=8.6'} - dependencies: - '@sindresorhus/is': 0.14.0 - '@szmarczak/http-timer': 1.1.2 - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - cacheable-request: 6.1.0 - decompress-response: 3.3.0 - duplexer3: 0.1.5 - get-stream: 4.1.0 - lowercase-keys: 1.0.1 - mimic-response: 1.0.1 - p-cancelable: 1.1.0 - to-readable-stream: 1.0.0 - url-parse-lax: 3.0.0 - dev: false - /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: false @@ -5398,10 +5249,6 @@ packages: hasBin: true dev: false - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: false - /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: false @@ -5443,10 +5290,6 @@ packages: hasBin: true dev: false - /json-buffer@3.0.0: - resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==} - dev: false - /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: false @@ -5507,12 +5350,6 @@ packages: engines: {'0': node >= 0.2.0} dev: false - /keyv@3.1.0: - resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} - dependencies: - json-buffer: 3.0.0 - dev: false - /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: @@ -5739,11 +5576,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: false - /lru-cache@10.0.1: resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} engines: {node: 14 || >=16.14} @@ -6465,11 +6297,6 @@ packages: engines: {node: '>=12'} dev: false - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: false - /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -6641,11 +6468,6 @@ packages: engines: {node: '>=0.10.0'} dev: false - /normalize-url@4.5.1: - resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} - engines: {node: '>=8'} - dev: false - /not@0.1.0: resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} dev: false @@ -6819,11 +6641,6 @@ packages: resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} dev: false - /p-cancelable@1.1.0: - resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} - engines: {node: '>=6'} - dev: false - /p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -6903,16 +6720,6 @@ packages: engines: {node: '>=6'} dev: false - /package-json@6.5.0: - resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} - engines: {node: '>=8'} - dependencies: - got: 9.6.0 - registry-auth-token: 4.2.2 - registry-url: 5.1.0 - semver: 6.3.1 - dev: false - /pagefind@1.0.4: resolution: {integrity: sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==} hasBin: true @@ -6944,12 +6751,6 @@ packages: is-hexadecimal: 2.0.1 dev: false - /parse-github-url@1.0.2: - resolution: {integrity: sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw==} - engines: {node: '>=0.10.0'} - hasBin: true - dev: false - /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -7263,11 +7064,6 @@ packages: engines: {node: '>= 0.8.0'} dev: false - /prepend-http@2.0.0: - resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} - engines: {node: '>=4'} - dev: false - /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} @@ -7486,20 +7282,6 @@ packages: set-function-name: 2.0.1 dev: false - /registry-auth-token@4.2.2: - resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==} - engines: {node: '>=6.0.0'} - dependencies: - rc: 1.2.8 - dev: false - - /registry-url@5.1.0: - resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} - engines: {node: '>=8'} - dependencies: - rc: 1.2.8 - dev: false - /regjsparser@0.10.0: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true @@ -7672,12 +7454,6 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: false - /responselike@1.0.2: - resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} - dependencies: - lowercase-keys: 1.0.1 - dev: false - /restore-cursor@4.0.0: resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -7823,13 +7599,6 @@ packages: kind-of: 6.0.3 dev: false - /sembear@0.5.2: - resolution: {integrity: sha512-Ij1vCAdFgWABd7zTg50Xw1/p0JgESNxuLlneEAsmBrKishA06ulTTL/SHGmNy2Zud7+rKrHTKNI6moJsn1ppAQ==} - dependencies: - '@types/semver': 6.2.6 - semver: 6.3.1 - dev: false - /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -8540,11 +8309,6 @@ packages: engines: {node: '>=4'} dev: false - /to-readable-stream@1.0.0: - resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} - engines: {node: '>=6'} - dev: false - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -8973,13 +8737,6 @@ packages: resolution: {integrity: sha512-dsBD6GbytSMj9YDb3jVzSRENwFh50oUORnWBeSHfo0Lnwv2KMm/J4npyGy1P9rivUPsUGLjTA53XqAFqpe0nww==} dev: false - /url-parse-lax@3.0.0: - resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==} - engines: {node: '>=4'} - dependencies: - prepend-http: 2.0.0 - dev: false - /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false @@ -8991,12 +8748,6 @@ packages: spdx-expression-parse: 3.0.1 dev: false - /validate-npm-package-name@3.0.0: - resolution: {integrity: sha512-M6w37eVCMMouJ9V/sdPGnC5H4uDr73/+xdq0FBLO3TFFX1+7wiUY6Es328NN+y43tmY+doUdN9g9J21vqB7iLw==} - dependencies: - builtins: 1.0.3 - dev: false - /vfile-location@4.1.0: resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} dependencies: From 17c4723bb85fa2a03e07f073ff7bbc14e0fca1cb Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 19 Dec 2023 13:18:56 +0100 Subject: [PATCH 030/136] feat(postgres): implement the first version of the PostgreSQL plugin --- .changeset/hip-camels-learn.md | 5 + docs/astro.config.mjs | 12 + docs/src/content/docs/intro/quick-start.mdx | 25 +- .../content/docs/plugins/generators/index.mdx | 1 + .../docs/plugins/generators/postgres.mdx | 36 +++ .../content/docs/plugins/loaders/index.mdx | 3 +- .../content/docs/plugins/loaders/postgres.mdx | 86 ++++++ .../content/docs/plugins/storage/index.mdx | 3 +- .../content/docs/plugins/storage/postgres.mdx | 93 +++++++ packages/cli/src/cli.ts | 2 +- packages/mysql/README.md | 4 +- packages/postgres/README.md | 177 ++++++++++++ packages/postgres/package.json | 51 ++++ packages/postgres/src/index.ts | 252 ++++++++++++++++++ packages/postgres/tsconfig.json | 8 + pnpm-lock.yaml | 21 ++ 16 files changed, 761 insertions(+), 18 deletions(-) create mode 100644 .changeset/hip-camels-learn.md create mode 100644 docs/src/content/docs/plugins/generators/postgres.mdx create mode 100644 docs/src/content/docs/plugins/loaders/postgres.mdx create mode 100644 docs/src/content/docs/plugins/storage/postgres.mdx create mode 100644 packages/postgres/README.md create mode 100644 packages/postgres/package.json create mode 100644 packages/postgres/src/index.ts create mode 100644 packages/postgres/tsconfig.json diff --git a/.changeset/hip-camels-learn.md b/.changeset/hip-camels-learn.md new file mode 100644 index 0000000..ca95dbf --- /dev/null +++ b/.changeset/hip-camels-learn.md @@ -0,0 +1,5 @@ +--- +'@emigrate/postgres': minor +--- + +Implement the first version of the @emigrate/postgres plugin diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 00937fe..6d0a145 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -117,6 +117,10 @@ export default defineConfig({ label: 'File System', link: '/plugins/storage/file-system/', }, + { + label: 'PostgreSQL', + link: '/plugins/storage/postgres/', + }, { label: 'MySQL', link: '/plugins/storage/mysql/', @@ -135,6 +139,10 @@ export default defineConfig({ label: 'Default Loader', link: '/plugins/loaders/default/', }, + { + label: 'PostgreSQL Loader', + link: '/plugins/loaders/postgres/', + }, { label: 'MySQL Loader', link: '/plugins/loaders/mysql/', @@ -171,6 +179,10 @@ export default defineConfig({ label: 'JavaScript Generator', link: '/plugins/generators/js/', }, + { + label: 'PostgreSQL Generator', + link: '/plugins/generators/postgres/', + }, { label: 'MySQL Generator', link: '/plugins/generators/mysql/', diff --git a/docs/src/content/docs/intro/quick-start.mdx b/docs/src/content/docs/intro/quick-start.mdx index 5017867..76cf108 100644 --- a/docs/src/content/docs/intro/quick-start.mdx +++ b/docs/src/content/docs/intro/quick-start.mdx @@ -41,22 +41,22 @@ But for now, this is the way to go. Emigrate uses a storage plugin to store the migration history. -Install the plugin you want to use, for example: +Install the plugin you want to use, for example the PostgreSQL Storage: ```bash - npm install @emigrate/mysql + npm install @emigrate/postgres ``` ```bash - pnpm add @emigrate/mysql + pnpm add @emigrate/postgres ``` ```bash - yarn add @emigrate/mysql + yarn add @emigrate/postgres ``` @@ -66,7 +66,7 @@ Install the plugin you want to use, for example: Create a new migration file in your project using: ```bash title="Create a new migration file" -npx emigrate new --plugin mysql create users table +npx emigrate new --plugin postgres create users table ``` ```txt title="Output" @@ -79,12 +79,12 @@ Emigrate new v0.10.0 /your/project/path ``` :::note -The `mysql` plugin is used here to generate a migration file with the `.sql` extension. +The `postgres` plugin is used here to generate a migration file with the `.sql` extension. Otherwise the file would have the `.js` extension by default. ::: :::tip[Did you know?] -You can avoid typing `--plugin mysql` by configuring Emigrate using an `emigrate.config.js` file. +You can avoid typing `--plugin postgres` by configuring Emigrate using an `emigrate.config.js` file. See Configuration for more information. ::: @@ -95,10 +95,9 @@ Open the migration file in your editor and fill it with your SQL query: ```sql title="migrations/20231215125421364_create_users_table.sql" {2-7} -- Migration: create users table CREATE TABLE users ( - id INT NOT NULL AUTO_INCREMENT, + id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, - email VARCHAR(255) NOT NULL, - PRIMARY KEY (id) + email VARCHAR(255) NOT NULL ); ``` @@ -111,7 +110,7 @@ There's no magic about the first line comment as when using Liquibase, it's just To show both pending and already applied migrations (or previously failed), use the `list` command: ```bash title="Show all migrations" -npx emigrate list --storage mysql +npx emigrate list --storage postgres ``` ```txt title="Example output" @@ -129,7 +128,7 @@ Emigrate list v0.10.0 /your/project/path A good way to test your configuration is to run the migrations in dry mode: ```bash title="Show pending migrations" -npx emigrate up --storage mysql --plugin mysql --dry +npx emigrate up --storage postgres --plugin postgres --dry ``` :::note @@ -142,6 +141,6 @@ Be sure to configure the connection correctly and use the `--dry` flag to test y ::: :::tip[Did you know?] -In the example above the `@emigrate/mysql` plugin is used twice, once for the `--storage` option as a Storage Plugin +In the example above the `@emigrate/postgres` plugin is used twice, once for the `--storage` option as a Storage Plugin and once for the `--plugin` option as a Loader Plugin to be able to read `.sql` files. ::: diff --git a/docs/src/content/docs/plugins/generators/index.mdx b/docs/src/content/docs/plugins/generators/index.mdx index 3d737ca..de8c0da 100644 --- a/docs/src/content/docs/plugins/generators/index.mdx +++ b/docs/src/content/docs/plugins/generators/index.mdx @@ -17,6 +17,7 @@ The generator is responsible for generating migration files in a specific format + diff --git a/docs/src/content/docs/plugins/generators/postgres.mdx b/docs/src/content/docs/plugins/generators/postgres.mdx new file mode 100644 index 0000000..ef7686d --- /dev/null +++ b/docs/src/content/docs/plugins/generators/postgres.mdx @@ -0,0 +1,36 @@ +--- +title: "PostgreSQL Generator" +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; + +The PostgreSQL generator creates new migration files with the `.sql` extension. In the same package you can find the PostgreSQL Loader and the PostgreSQL Storage. + +## Installation + + + + ```bash + npm install @emigrate/postgres + ``` + + + ```bash + pnpm add @emigrate/postgres + ``` + + + ```bash + yarn add @emigrate/postgres + ``` + + + +## Usage + +```bash +emigrate new --plugin postgres create some fancy table +``` + +For more information see the `new` command's documentation. diff --git a/docs/src/content/docs/plugins/loaders/index.mdx b/docs/src/content/docs/plugins/loaders/index.mdx index 288393a..bca094b 100644 --- a/docs/src/content/docs/plugins/loaders/index.mdx +++ b/docs/src/content/docs/plugins/loaders/index.mdx @@ -21,7 +21,7 @@ Or set it up in your configuration file, see default loader will be used for all other file types, and doesn't need to be specified. ::: @@ -29,5 +29,6 @@ The default loader will be used fo + diff --git a/docs/src/content/docs/plugins/loaders/postgres.mdx b/docs/src/content/docs/plugins/loaders/postgres.mdx new file mode 100644 index 0000000..38ec8ac --- /dev/null +++ b/docs/src/content/docs/plugins/loaders/postgres.mdx @@ -0,0 +1,86 @@ +--- +title: PostgreSQL Loader Plugin +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; + +The PostgreSQL loader plugin transforms `.sql` files into JavaScript functions that Emigrate can use to execute the migrations. In the same package you can find the PostgreSQL Generator and the PostgreSQL Storage. + +## Installation + + + + ```bash + npm install @emigrate/postgres + ``` + + + ```bash + pnpm add @emigrate/postgres + ``` + + + ```bash + yarn add @emigrate/postgres + ``` + + + +## Configuration + +The PostgreSQL loader plugin can be configured either using environment variables or by configuring the plugin directly in the `emigrate.config.js` file. + +### Configuration file + +```js title="emigrate.config.js" {1,4-8} +import { createPostgresLoader } from '@emigrate/postgres'; + +export default { + plugins: [ + createPostgresLoader({ + connection: { ... }, + }), + ], +}; +``` + +#### Options + +##### `connection` (required) + +**type:** `object | string` + +The connection options to use for connecting to the PostgreSQL database when the SQL statements from the migration files are executed. This can either be a connection URI or an object with connection options. +For a list of supported connection options, see the [postgres documentation](https://github.com/porsager/postgres#connection). + +### Environment variables + +The following environment variables are supported: + +| Variable | Description | Default | +| ------------------- | ----------------------------------------------------------------------------------------------------------- | ------------- | +| `POSTGRES_URL` | The full URI for connecting to a PostgreSQL database, e.g: `"postgres://user:pass@127.0.0.1:3306/database"` | | +| `POSTGRES_HOST` | The host on which the PostgreSQL server instance is running | `"localhost"` | +| `POSTGRES_USER` | The PostgreSQL user account to use for the authentication | | +| `POSTGRES_PASSWORD` | The PostgreSQL user password to use for the authentication | | +| `POSTGRES_PORT` | The network port on which the PostgreSQL server is listening | `5432` | +| `POSTGRES_DB` | The PostgreSQL database to use for the connection | | + +:::note +The `POSTGRES_URL` environment variable takes precedence over the other environment variables. If `POSTGRES_URL` is set, the other environment variables are ignored. +::: + +The environment variables are used when the plugin is used using the `--plugin` command line option: + +```bash +npx emigrate list --plugin postgres +``` + +Or when specifying the plugin in the `emigrate.config.js` file as a string: + +```js title="emigrate.config.js" {2} +export default { + plugins: ['postgres'], +}; +``` diff --git a/docs/src/content/docs/plugins/storage/index.mdx b/docs/src/content/docs/plugins/storage/index.mdx index 4188084..319969c 100644 --- a/docs/src/content/docs/plugins/storage/index.mdx +++ b/docs/src/content/docs/plugins/storage/index.mdx @@ -13,7 +13,7 @@ Usually you'll want to store the migration history in the same database as the o You can specify a storage plugin via the `--storage` (or `-s` for short) option: ```bash -npx emigrate list --storage mysql +npx emigrate list --storage postgres ``` Or set it up in your configuration file, see Storage configuration for more information. @@ -22,6 +22,7 @@ Or set it up in your configuration file, see + diff --git a/docs/src/content/docs/plugins/storage/postgres.mdx b/docs/src/content/docs/plugins/storage/postgres.mdx new file mode 100644 index 0000000..368e894 --- /dev/null +++ b/docs/src/content/docs/plugins/storage/postgres.mdx @@ -0,0 +1,93 @@ +--- +title: PostgreSQL Storage +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; + +The PostgreSQL storage plugin uses a PostgreSQL database to store the migration history (*duh*). In the same package you can find the PostgreSQL Loader and the PostgreSQL Generator. + +## Installation + + + + ```bash + npm install @emigrate/postgres + ``` + + + ```bash + pnpm add @emigrate/postgres + ``` + + + ```bash + yarn add @emigrate/postgres + ``` + + + +## Configuration + +The PostgreSQL storage can be configured either using environment variables or by configuring the plugin directly in the `emigrate.config.js` file. + +### Configuration file + +```js title="emigrate.config.js" {1,4-7} +import { createPostgresStorage } from '@emigrate/postgres'; + +export default { + storage: createPostgresStorage({ + table: 'migrations', + connection: { ... }, + }), +}; +``` + +#### Options + +##### `table` + +**type:** `string` +**default:** `"migrations"` + +The name of the table to use for storing the migrations. + +##### `connection` (required) + +**type:** `object | string` + +The connection options to use for connecting to the PostgreSQL database. This can either be a connection URI or an object with connection options. +For a list of supported connection options, see the [postgres documentation](https://github.com/porsager/postgres#connection). + +### Environment variables + +The following environment variables are supported: + +| Variable | Description | Default | +| ------------------- | ----------------------------------------------------------------------------------------------------------- | -------------- | +| `POSTGRES_TABLE` | The name of the table to use for storing the migrations | `"migrations"` | +| `POSTGRES_URL` | The full URI for connecting to a PostgreSQL database, e.g: `"postgres://user:pass@127.0.0.1:3306/database"` | | +| `POSTGRES_HOST` | The host on which the PostgreSQL server instance is running | `"localhost"` | +| `POSTGRES_USER` | The PostgreSQL user account to use for the authentication | | +| `POSTGRES_PASSWORD` | The PostgreSQL user password to use for the authentication | | +| `POSTGRES_PORT` | The network port on which the PostgreSQL server is listening | `5432` | +| `POSTGRES_DB` | The PostgreSQL database to use for the connection | | + +:::note +The `POSTGRES_URL` environment variable takes precedence over the other environment variables. If `POSTGRES_URL` is set, the other environment variables are ignored, except for `POSTGRES_TABLE`. +::: + +The environment variables are used when the storage plugin is used using the `--storage` command line option: + +```bash +npx emigrate list --storage postgres +``` + +Or when specifying the storage in the `emigrate.config.js` file as a string: + +```js title="emigrate.config.js" {2} +export default { + storage: 'postgres', +}; +``` diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 53494b9..0ea469c 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -56,7 +56,7 @@ Options: Examples: emigrate up --directory src/migrations -s fs - emigrate up -d ./migrations --storage @emigrate/storage-mysql + emigrate up -d ./migrations --storage @emigrate/mysql emigrate up -d src/migrations -s postgres -r json --dry `; diff --git a/packages/mysql/README.md b/packages/mysql/README.md index 4cf64f8..54abfe7 100644 --- a/packages/mysql/README.md +++ b/packages/mysql/README.md @@ -1,6 +1,6 @@ -# @emigrate/storage-mysql +# @emigrate/mysql -A MySQL plugin for Emigrate. Uses a MySQL database for storing migration history. Can load and generate .sql migration files. +A MySQL plugin for Emigrate. Uses a MySQL database for storing the migration history. Can load and generate .sql migration files. The table used for storing the migration history is compatible with the [immigration-mysql](https://github.com/joakimbeng/immigration-mysql) package, so you can use this together with the [@emigrate/cli](../cli) as a drop-in replacement for that package. diff --git a/packages/postgres/README.md b/packages/postgres/README.md new file mode 100644 index 0000000..1e397c3 --- /dev/null +++ b/packages/postgres/README.md @@ -0,0 +1,177 @@ +# @emigrate/postgres + +A PostgreSQL plugin for Emigrate. Uses a PostgreSQL database for storing the migration history. Can load and generate .sql migration files. + +The table used for storing the migration history is compatible with the [immigration-postgres](https://github.com/aboviq/immigration-postgres) package, so you can use this together with the [@emigrate/cli](../cli) as a drop-in replacement for that package. + +## Description + +This plugin is actually three different Emigrate plugins in one: + +1. A [storage plugin](#using-the-storage-plugin) for storing the migration history in a PostgreSQL database. +2. A [loader plugin](#using-the-loader-plugin) for loading .sql migration files and be able to execute them as part of the migration process. +3. A [generator plugin](#using-the-generator-plugin) for generating .sql migration files. + +## Installation + +Install the plugin in your project, alongside the Emigrate CLI: + +```bash +npm install --save-dev @emigrate/cli @emigrate/postgres +``` + +## Usage + +### Using the storage plugin + +See [Options](#options) below for the default values and how to configure the plugin using environment variables. + +Configure the storage in your `emigrate.config.js` file: + +```js +export default { + directory: 'migrations', + storage: 'postgres', // the @emigrate/ prefix is optional +}; +``` + +Or use the CLI options `--storage` (or `-s`) + +```bash +emigrate up --storage postgres # the @emigrate/ prefix is optional +``` + +#### Storage plugin with custom options + +Configure the storage in your `emigrate.config.js` file by importing the `createPostgresStorage` function (see [Options](#options) for available options). + +In this mode the plugin will _not_ use any of the environment variables for configuration. + +```js +import { createPostgresStorage } from '@emigrate/postgres'; + +export default { + directory: 'migrations', + storage: createPostgresStorage({ table: 'migrations', connection: { ... } }), // All connection options are passed to postgres() +}; +``` + +Or use the CLI option `--storage` (or `-s`) and use environment variables (see [Options](#options) for available variables). + +```bash +POSTGRES_URL=postgres://user:pass@host/db emigrate up --storage postgres # the @emigrate/ prefix is optional +``` + +### Using the loader plugin + +The loader plugin is used to transform .sql migration files into JavaScript functions that can be executed by the "up" command. + +See [Options](#options) below for the default values and how to configure the plugin using environment variables. + +Configure the loader in your `emigrate.config.js` file: + +```js +export default { + directory: 'migrations', + plugins: ['postgres'], // the @emigrate/ prefix is optional +}; +``` + +Or by importing the default export from the plugin: + +```js +import postgresPlugin from '@emigrate/postgres'; + +export default { + directory: 'migrations', + plugins: [postgresPlugin], +}; +``` + +**NOTE:** Using the root level `plugins` option will load the plugin for all commands, which means the [generator plugin](#using-the-generator-plugin) will be used by default for the "new" command as well. If you only want to use the loader plugin, use the `up.plugins` option instead: + +```js +export default { + directory: 'migrations', + up: { + plugins: ['postgres'], // the @emigrate/ prefix is optional + // or: + plugins: [import('@emigrate/postgres')], + }, +}; +``` + +The loader plugin can also be loaded using the CLI option `--plugin` (or `-p`) together with the "up" command: + +```bash +emigrate up --plugin postgres # the @emigrate/ prefix is optional +``` + +### Using the generator plugin + +The generator plugin is used to generate skeleton .sql migration files inside your migration directory. + +Configure the generator in your `emigrate.config.js` file: + +```js +export default { + directory: 'migrations', + plugins: ['postgres'], // the @emigrate/ prefix is optional +}; +``` + +Or by importing the default export from the plugin: + +```js +import postgresPlugin from '@emigrate/postgres'; + +export default { + directory: 'migrations', + plugins: [postgresPlugin], +}; +``` + +**NOTE:** Using the root level `plugins` option will load the plugin for all commands, which means the [loader plugin](#using-the-loader-plugin) will be used by default for the "up" command as well. If you only want to use the generator plugin, use the `new.plugins` option instead: + +```js +export default { + directory: 'migrations', + new: { + plugins: ['postgres'], // the @emigrate/ prefix is optional + // or: + plugins: [import('@emigrate/postgres')], + }, +}; +``` + +The generator plugin can also be loaded using the CLI option `--plugin` (or `-p`) together with the "new" command: + +```bash +emigrate new --plugin postgres My new migration file # the @emigrate/ prefix is optional +``` + +#### Loader plugin with custom options + +Configure the loader in your `emigrate.config.js` file by importing the `createPostgresLoader` function (see [Options](#options) for available options). + +In this mode the plugin will _not_ use any of the environment variables for configuration. + +```js +import { createPostgresLoader } from '@emigrate/postgres'; + +export default { + directory: 'migrations', + plugins: [ + createPostgresLoader({ connection: { ... } }), // All connection options are passed to postgres() + ], +}; +``` + +## Options + +The storage plugin accepts the following options: + +| Option | Applies to | Description | Default | Environment variable | +| ------------ | -------------------------- | -------------------------------------------------------------------------------------------------- | ------------ | ---------------------------------------------------------------------------------------------------------- | +| `table` | storage plugin | The name of the table to use for storing the migrations. | `migrations` | `POSTGRES_TABLE` | +| `connection` | storage and loader plugins | The connection options to pass to [`postgres()`](https://github.com/porsager/postgres#connection). | `{}` | `POSTGRES_URL` or `POSTGRES_HOST`, `POSTGRES_PORT`, `POSTGRES_USER`, `POSTGRES_PASSWORD` and `POSTGRES_DB` | diff --git a/packages/postgres/package.json b/packages/postgres/package.json new file mode 100644 index 0000000..82a6cb8 --- /dev/null +++ b/packages/postgres/package.json @@ -0,0 +1,51 @@ +{ + "name": "@emigrate/postgres", + "version": "0.0.0", + "publishConfig": { + "access": "public" + }, + "description": "A PostgreSQL plugin for Emigrate. Uses a PostgreSQL database for storing migration history. Can load and generate .sql migration files.", + "main": "dist/index.js", + "types": "dist/index.d.js", + "type": "module", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist" + ], + "scripts": { + "build": "tsc --pretty", + "build:watch": "tsc --pretty --watch", + "lint": "xo --cwd=../.. $(pwd)" + }, + "keywords": [ + "emigrate", + "emigrate-storage", + "emigrate-loader", + "emigrate-plugin", + "emigrate-generator", + "migrations", + "postgres", + "postgresql" + ], + "author": "Aboviq AB (https://www.aboviq.com)", + "homepage": "https://github.com/aboviq/emigrate/tree/main/packages/postgres#readme", + "repository": "https://github.com/aboviq/emigrate/tree/main/packages/postgres", + "bugs": "https://github.com/aboviq/emigrate/issues", + "license": "MIT", + "dependencies": { + "@emigrate/plugin-tools": "workspace:*", + "@emigrate/types": "workspace:*", + "postgres": "3.4.3" + }, + "devDependencies": { + "@emigrate/tsconfig": "workspace:*" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/packages/postgres/src/index.ts b/packages/postgres/src/index.ts new file mode 100644 index 0000000..bcbe9e1 --- /dev/null +++ b/packages/postgres/src/index.ts @@ -0,0 +1,252 @@ +import process from 'node:process'; +import postgres, { type Options, type PostgresType, type Sql } from 'postgres'; +import { getTimestampPrefix, sanitizeMigrationName } from '@emigrate/plugin-tools'; +import { + type MigrationMetadata, + type EmigrateStorage, + type LoaderPlugin, + type Storage, + type MigrationMetadataFinished, + type GenerateMigrationFunction, + type GeneratorPlugin, + type SerializedError, + type MigrationHistoryEntry, +} from '@emigrate/types'; + +const defaultTable = 'migrations'; + +type ConnectionOptions = Options>; + +export type PostgresStorageOptions = { + table?: string; + /** + * @see https://github.com/porsager/postgres#connection + */ + connection: ConnectionOptions | string; +}; + +export type PostgresLoaderOptions = { + /** + * @see https://github.com/porsager/postgres#connection + */ + connection: ConnectionOptions | string; +}; + +const getPool = (connection: ConnectionOptions | string) => { + if (typeof connection === 'string') { + return postgres(connection); + } + + return postgres(connection); +}; + +const lockMigration = async (sql: Sql, table: string, migration: MigrationMetadata) => { + const result = await sql` + INSERT INTO ${sql(table)} (name, status, date) + VALUES (${migration.name}, ${'locked'}, NOW()) + ON CONFLICT (name) DO NOTHING + `; + + return result.count === 1; +}; + +const unlockMigration = async (sql: Sql, table: string, migration: MigrationMetadata) => { + const result = await sql` + DELETE FROM ${sql(table)} + WHERE + name = ${migration.name} + AND status = ${'locked'} + `; + + return result.count === 1; +}; + +const finishMigration = async ( + sql: Sql, + table: string, + migration: MigrationMetadataFinished, + _error?: SerializedError, +) => { + const result = await sql` + UPDATE + ${sql(table)} + SET + status = ${migration.status}, + date = NOW() + WHERE + name = ${migration.name} + AND status = ${'locked'} + `; + + return result.count === 1; +}; + +const deleteMigration = async (sql: Sql, table: string, migration: MigrationMetadata) => { + const result = await sql` + DELETE FROM ${sql(table)} + WHERE + name = ${migration.name} + AND status <> ${'locked'} + `; + + return result.count === 1; +}; + +const initializeTable = async (sql: Sql, table: string) => { + const [row] = await sql>` + SELECT 1 as exists + FROM + information_schema.tables + WHERE + table_schema = 'public' + AND table_name = ${table} + `; + + if (row?.exists) { + return; + } + + // This table definition is compatible with the one used by the immigration-postgres package + await sql` + CREATE TABLE ${sql(table)} ( + name varchar(255) not null primary key, + status varchar(32), + date timestamptz not null + ); + `; +}; + +export const createPostgresStorage = ({ + table = defaultTable, + connection, +}: PostgresStorageOptions): EmigrateStorage => { + return { + async initializeStorage() { + const sql = getPool(connection); + + try { + await initializeTable(sql, table); + } catch (error) { + await sql.end(); + throw error; + } + + const storage: Storage = { + async lock(migrations) { + const lockedMigrations: MigrationMetadata[] = []; + + for await (const migration of migrations) { + if (await lockMigration(sql, table, migration)) { + lockedMigrations.push(migration); + } + } + + return lockedMigrations; + }, + async unlock(migrations) { + for await (const migration of migrations) { + await unlockMigration(sql, table, migration); + } + }, + async remove(migration) { + await deleteMigration(sql, table, migration); + }, + async *getHistory() { + const query = sql>>` + SELECT + * + FROM + ${sql(table)} + WHERE + status <> ${'locked'} + ORDER BY + date ASC + `.cursor(); + + for await (const [row] of query) { + if (!row) { + continue; + } + + if (row.status === 'failed') { + yield { + ...row, + error: { name: 'Error', message: 'Unknown error' }, + }; + continue; + } + + yield row; + } + }, + async onSuccess(migration) { + await finishMigration(sql, table, migration); + }, + async onError(migration, error) { + await finishMigration(sql, table, migration, error); + }, + async end() { + await sql.end(); + }, + }; + + return storage; + }, + }; +}; + +export const { initializeStorage } = createPostgresStorage({ + table: process.env['POSTGRES_TABLE'], + connection: process.env['POSTGRES_URL'] ?? { + host: process.env['POSTGRES_HOST'], + port: process.env['POSTGRES_PORT'] ? Number.parseInt(process.env['POSTGRES_PORT'], 10) : undefined, + user: process.env['POSTGRES_USER'], + password: process.env['POSTGRES_PASSWORD'], + database: process.env['POSTGRES_DB'], + }, +}); + +export const createPostgresLoader = ({ connection }: PostgresLoaderOptions): LoaderPlugin => { + return { + loadableExtensions: ['.sql'], + async loadMigration(migration) { + return async () => { + const sql = getPool(connection); + + try { + // @ts-expect-error The "simple" option is not documented, but it exists + await sql.file(migration.filePath, { simple: true }); + } finally { + await sql.end(); + } + }; + }, + }; +}; + +export const { loadableExtensions, loadMigration } = createPostgresLoader({ + connection: process.env['POSTGRES_URL'] ?? { + host: process.env['POSTGRES_HOST'], + port: process.env['POSTGRES_PORT'] ? Number.parseInt(process.env['POSTGRES_PORT'], 10) : undefined, + user: process.env['POSTGRES_USER'], + password: process.env['POSTGRES_PASSWORD'], + database: process.env['POSTGRES_DB'], + }, +}); + +export const generateMigration: GenerateMigrationFunction = async (name) => { + return { + filename: `${getTimestampPrefix()}_${sanitizeMigrationName(name)}.sql`, + content: `-- Migration: ${name} +`, + }; +}; + +const defaultExport: EmigrateStorage & LoaderPlugin & GeneratorPlugin = { + initializeStorage, + loadableExtensions, + loadMigration, + generateMigration, +}; + +export default defaultExport; diff --git a/packages/postgres/tsconfig.json b/packages/postgres/tsconfig.json new file mode 100644 index 0000000..1cfcebb --- /dev/null +++ b/packages/postgres/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "@emigrate/tsconfig/build.json", + "compilerOptions": { + "outDir": "dist" + }, + "include": ["src"], + "exclude": ["node_modules", "dist"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c78edd..9951810 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -148,6 +148,22 @@ importers: specifier: workspace:* version: link:../tsconfig + packages/postgres: + dependencies: + '@emigrate/plugin-tools': + specifier: workspace:* + version: link:../plugin-tools + '@emigrate/types': + specifier: workspace:* + version: link:../types + postgres: + specifier: 3.4.3 + version: 3.4.3 + devDependencies: + '@emigrate/tsconfig': + specifier: workspace:* + version: link:../tsconfig + packages/reporter-pino: dependencies: '@emigrate/types': @@ -7030,6 +7046,11 @@ packages: source-map-js: 1.0.2 dev: false + /postgres@3.4.3: + resolution: {integrity: sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==} + engines: {node: '>=12'} + dev: false + /prebuild-install@7.1.1: resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} engines: {node: '>=10'} From c284cc48d1f7ec1b67f2bfc81893ce92c46385a1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 19 Dec 2023 12:28:36 +0000 Subject: [PATCH 031/136] chore(release): version packages --- .changeset/hip-camels-learn.md | 5 ----- packages/postgres/CHANGELOG.md | 7 +++++++ packages/postgres/package.json | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) delete mode 100644 .changeset/hip-camels-learn.md create mode 100644 packages/postgres/CHANGELOG.md diff --git a/.changeset/hip-camels-learn.md b/.changeset/hip-camels-learn.md deleted file mode 100644 index ca95dbf..0000000 --- a/.changeset/hip-camels-learn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/postgres': minor ---- - -Implement the first version of the @emigrate/postgres plugin diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md new file mode 100644 index 0000000..9643b48 --- /dev/null +++ b/packages/postgres/CHANGELOG.md @@ -0,0 +1,7 @@ +# @emigrate/postgres + +## 0.1.0 + +### Minor Changes + +- 17c4723: Implement the first version of the @emigrate/postgres plugin diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 82a6cb8..21479ea 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.0.0", + "version": "0.1.0", "publishConfig": { "access": "public" }, From ce6946cac4af3a5474d86e57cc866da6309ffb93 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 19 Dec 2023 14:00:20 +0100 Subject: [PATCH 032/136] feat: support for Bun --- .changeset/lazy-plums-wink.md | 12 ++++++++++++ README.md | 16 +++++++++++++++- docs/src/content/docs/commands/list.mdx | 5 +++++ docs/src/content/docs/commands/new.mdx | 5 +++++ docs/src/content/docs/commands/remove.mdx | 5 +++++ docs/src/content/docs/commands/up.mdx | 5 +++++ docs/src/content/docs/intro/quick-start.mdx | 10 ++++++++++ docs/src/content/docs/intro/whats-emigrate.mdx | 1 + docs/src/content/docs/plugins/generators/js.mdx | 5 +++++ .../content/docs/plugins/generators/mysql.mdx | 5 +++++ .../content/docs/plugins/generators/postgres.mdx | 5 +++++ docs/src/content/docs/plugins/loaders/mysql.mdx | 5 +++++ .../content/docs/plugins/loaders/postgres.mdx | 5 +++++ docs/src/content/docs/plugins/reporters/pino.mdx | 5 +++++ .../content/docs/plugins/storage/file-system.mdx | 5 +++++ docs/src/content/docs/plugins/storage/mysql.mdx | 5 +++++ .../content/docs/plugins/storage/postgres.mdx | 5 +++++ packages/cli/src/cli.ts | 2 +- packages/mysql/package.json | 1 + packages/plugin-generate-js/package.json | 1 + packages/plugin-tools/package.json | 1 + packages/postgres/package.json | 1 + packages/reporter-pino/package.json | 1 + packages/storage-fs/package.json | 1 + packages/types/package.json | 1 + 25 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 .changeset/lazy-plums-wink.md diff --git a/.changeset/lazy-plums-wink.md b/.changeset/lazy-plums-wink.md new file mode 100644 index 0000000..816fab9 --- /dev/null +++ b/.changeset/lazy-plums-wink.md @@ -0,0 +1,12 @@ +--- +'@emigrate/plugin-generate-js': minor +'@emigrate/reporter-pino': minor +'@emigrate/plugin-tools': minor +'@emigrate/storage-fs': minor +'@emigrate/postgres': minor +'@emigrate/mysql': minor +'@emigrate/types': minor +'@emigrate/cli': minor +--- + +Emigrate supports Bun, make use of the `bun` key in package.json `exports` diff --git a/README.md b/README.md index 82ace5e..94c3271 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ It's effectively a successor of [klei-migrate](https://www.npmjs.com/package/klei-migrate) and [Immigration](https://www.npmjs.com/package/immigration). +πŸ“– Read the [documentation](https://emigrate.dev) for more information! + ## Features - Database agnostic @@ -29,6 +31,12 @@ Install the Emigrate CLI in your project: ```bash npm install --save-dev @emigrate/cli +# or +pnpm add --save-dev @emigrate/cli +# or +yarn add --dev @emigrate/cli +# or +bun add --dev @emigrate/cli ``` ## Usage @@ -36,7 +44,13 @@ npm install --save-dev @emigrate/cli Create a new migration: ```bash -emigrate new -d migrations -e .js create some fancy table +npx emigrate new -d migrations -e .js create some fancy table +# or +pnpm emigrate new -d migrations -e .js create some fancy table +# or +yarn emigrate new -d migrations -e .js create some fancy table +# or +bunx --bun emigrate new -d migrations -e .js create some fancy table ``` Will create a new empty JavaScript migration file with the name "YYYYMMDDHHmmssuuu_create_some_fancy_table.js" in the `migrations` directory. diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx index e433a34..cb05c16 100644 --- a/docs/src/content/docs/commands/list.mdx +++ b/docs/src/content/docs/commands/list.mdx @@ -29,6 +29,11 @@ It then sorts the migrations by filename in ascending order and outputs them and yarn emigrate list [options] ``` + + ```bash + bunx --bun emigrate list [options] + ``` + ```json {3} { diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx index 517bbbb..18b97a8 100644 --- a/docs/src/content/docs/commands/new.mdx +++ b/docs/src/content/docs/commands/new.mdx @@ -28,6 +28,11 @@ The migration file can be based on a template, generated by a + ```bash + bunx --bun emigrate new [options] + ``` + ```json {3} { diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index be029eb..600a1df 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -26,6 +26,11 @@ The `remove` command is used to remove a migration from the history. This is use yarn emigrate remove [options] ``` + + ```bash + bunx --bun emigrate remove [options] + ``` + ```json {3} { diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index b45effb..76d6683 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -31,6 +31,11 @@ If any of the migrations fail, the command will be aborted and the rest of the m yarn emigrate up [options] ``` + + ```bash + bunx --bun emigrate up [options] + ``` + ```json {3} { diff --git a/docs/src/content/docs/intro/quick-start.mdx b/docs/src/content/docs/intro/quick-start.mdx index 76cf108..77233c8 100644 --- a/docs/src/content/docs/intro/quick-start.mdx +++ b/docs/src/content/docs/intro/quick-start.mdx @@ -35,6 +35,11 @@ But for now, this is the way to go. yarn add @emigrate/cli ``` + + ```bash + bun add @emigrate/cli + ``` + ### Pick a storage plugin @@ -59,6 +64,11 @@ Install the plugin you want to use, for example the + ```bash + bun add @emigrate/postgres + ``` + ### Create your first migration diff --git a/docs/src/content/docs/intro/whats-emigrate.mdx b/docs/src/content/docs/intro/whats-emigrate.mdx index c152272..fc1a7bd 100644 --- a/docs/src/content/docs/intro/whats-emigrate.mdx +++ b/docs/src/content/docs/intro/whats-emigrate.mdx @@ -8,6 +8,7 @@ import Link from '@components/Link.astro'; Emigrate is written in [TypeScript](https://www.typescriptlang.org) and is a migration tool for any database or data. * It's database agnostic - you can use it with any database, or even with non-database data. +* It can be run on multiple platforms - currently [NodeJS](https://nodejs.org) and [Bun](https://bun.sh) is supported, but more platforms is planned. * It's the successor of [klei-migrate](https://github.com/klei/migrate) and is designed to be compatible with [Immigration](https://github.com/blakeembrey/node-immigration) and many of its storage plugins, as well as [Migrate](https://github.com/tj/node-migrate). * It supports migration files written using CommonJS or ES Modules out of the box, with any of the following extensions: `.js`, `.cjs` or `.mjs`, and supports [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or using the [NodeJS Callback Pattern](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks#handling-errors-in-callbacks). * Other languages can be used by using a Loader Plugin. diff --git a/docs/src/content/docs/plugins/generators/js.mdx b/docs/src/content/docs/plugins/generators/js.mdx index f344fa5..1e1fae2 100644 --- a/docs/src/content/docs/plugins/generators/js.mdx +++ b/docs/src/content/docs/plugins/generators/js.mdx @@ -25,6 +25,11 @@ A generator plugin for generating new m yarn add @emigrate/plugin-generate-js ``` + + ```bash + bun add @emigrate/plugin-generate-js + ``` + ## Usage diff --git a/docs/src/content/docs/plugins/generators/mysql.mdx b/docs/src/content/docs/plugins/generators/mysql.mdx index 582b16f..786fde0 100644 --- a/docs/src/content/docs/plugins/generators/mysql.mdx +++ b/docs/src/content/docs/plugins/generators/mysql.mdx @@ -25,6 +25,11 @@ The MySQL generator creates new migration files with the `.sql` extension. In th yarn add @emigrate/mysql ``` + + ```bash + bun add @emigrate/mysql + ``` + ## Usage diff --git a/docs/src/content/docs/plugins/generators/postgres.mdx b/docs/src/content/docs/plugins/generators/postgres.mdx index ef7686d..d6e670c 100644 --- a/docs/src/content/docs/plugins/generators/postgres.mdx +++ b/docs/src/content/docs/plugins/generators/postgres.mdx @@ -25,6 +25,11 @@ The PostgreSQL generator creates new migration files with the `.sql` extension. yarn add @emigrate/postgres ``` + + ```bash + bun add @emigrate/postgres + ``` + ## Usage diff --git a/docs/src/content/docs/plugins/loaders/mysql.mdx b/docs/src/content/docs/plugins/loaders/mysql.mdx index a2baab8..52249d0 100644 --- a/docs/src/content/docs/plugins/loaders/mysql.mdx +++ b/docs/src/content/docs/plugins/loaders/mysql.mdx @@ -25,6 +25,11 @@ The MySQL loader plugin transforms `.sql` files into JavaScript functions that E yarn add @emigrate/mysql ``` + + ```bash + bun add @emigrate/mysql + ``` + ## Configuration diff --git a/docs/src/content/docs/plugins/loaders/postgres.mdx b/docs/src/content/docs/plugins/loaders/postgres.mdx index 38ec8ac..39a9f15 100644 --- a/docs/src/content/docs/plugins/loaders/postgres.mdx +++ b/docs/src/content/docs/plugins/loaders/postgres.mdx @@ -25,6 +25,11 @@ The PostgreSQL loader plugin transforms `.sql` files into JavaScript functions t yarn add @emigrate/postgres ``` + + ```bash + bun add @emigrate/postgres + ``` + ## Configuration diff --git a/docs/src/content/docs/plugins/reporters/pino.mdx b/docs/src/content/docs/plugins/reporters/pino.mdx index 37d7be6..5ff75be 100644 --- a/docs/src/content/docs/plugins/reporters/pino.mdx +++ b/docs/src/content/docs/plugins/reporters/pino.mdx @@ -27,6 +27,11 @@ This is useful in production environments where you want all logs as JSON, which yarn add @emigrate/reporter-pino ``` + + ```bash + bun add @emigrate/reporter-pino + ``` + ## Usage diff --git a/docs/src/content/docs/plugins/storage/file-system.mdx b/docs/src/content/docs/plugins/storage/file-system.mdx index 94a5cad..f969129 100644 --- a/docs/src/content/docs/plugins/storage/file-system.mdx +++ b/docs/src/content/docs/plugins/storage/file-system.mdx @@ -29,6 +29,11 @@ This is suitable for simple setups, but for more advanced setups for instance wh yarn add @emigrate/storage-fs ``` + + ```bash + bun add @emigrate/storage-fs + ``` + ## Configuration diff --git a/docs/src/content/docs/plugins/storage/mysql.mdx b/docs/src/content/docs/plugins/storage/mysql.mdx index 8e36a5a..1816179 100644 --- a/docs/src/content/docs/plugins/storage/mysql.mdx +++ b/docs/src/content/docs/plugins/storage/mysql.mdx @@ -25,6 +25,11 @@ The MySQL storage plugin uses a MySQL database to store the migration history (* yarn add @emigrate/mysql ``` + + ```bash + bun add @emigrate/mysql + ``` + ## Configuration diff --git a/docs/src/content/docs/plugins/storage/postgres.mdx b/docs/src/content/docs/plugins/storage/postgres.mdx index 368e894..7e586ed 100644 --- a/docs/src/content/docs/plugins/storage/postgres.mdx +++ b/docs/src/content/docs/plugins/storage/postgres.mdx @@ -25,6 +25,11 @@ The PostgreSQL storage plugin uses a PostgreSQL database to store the migration yarn add @emigrate/postgres ``` + + ```bash + bun add @emigrate/postgres + ``` + ## Configuration diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 0ea469c..de7132b 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -143,7 +143,7 @@ Options: Examples: emigrate new -d src/migrations -t migration-template.js create users table - emigrate new --directory ./migrations --plugin @emigrate/plugin-generate-sql create_users_table + emigrate new --directory ./migrations --plugin @emigrate/postgres create_users_table emigrate new -d ./migrations -e .sql create_users_table emigrate new -d ./migrations -t .migration-template -e .sql "drop some table" `; diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 45f9ef4..dec4f3b 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -10,6 +10,7 @@ "type": "module", "exports": { ".": { + "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index 6cff96f..4076753 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -10,6 +10,7 @@ "type": "module", "exports": { ".": { + "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index 04f32a9..7ba094e 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -10,6 +10,7 @@ "type": "module", "exports": { ".": { + "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 21479ea..1030ad6 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -10,6 +10,7 @@ "type": "module", "exports": { ".": { + "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index f0ece71..95cf8cc 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -10,6 +10,7 @@ "type": "module", "exports": { ".": { + "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index bcb819e..351a94d 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -10,6 +10,7 @@ "type": "module", "exports": { ".": { + "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/types/package.json b/packages/types/package.json index 0cfaae3..737d465 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -10,6 +10,7 @@ "type": "module", "exports": { ".": { + "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } From 747f9dbddb8e4cf35eddde9ae4c495e414bc3737 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 19 Dec 2023 13:06:28 +0000 Subject: [PATCH 033/136] chore(release): version packages --- .changeset/lazy-plums-wink.md | 12 ------------ packages/cli/CHANGELOG.md | 12 ++++++++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 12 ++++++++++++ packages/mysql/package.json | 2 +- packages/plugin-generate-js/CHANGELOG.md | 12 ++++++++++++ packages/plugin-generate-js/package.json | 2 +- packages/plugin-tools/CHANGELOG.md | 11 +++++++++++ packages/plugin-tools/package.json | 2 +- packages/postgres/CHANGELOG.md | 12 ++++++++++++ packages/postgres/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 11 +++++++++++ packages/reporter-pino/package.json | 2 +- packages/storage-fs/CHANGELOG.md | 11 +++++++++++ packages/storage-fs/package.json | 2 +- packages/types/CHANGELOG.md | 6 ++++++ packages/types/package.json | 2 +- 17 files changed, 95 insertions(+), 20 deletions(-) delete mode 100644 .changeset/lazy-plums-wink.md diff --git a/.changeset/lazy-plums-wink.md b/.changeset/lazy-plums-wink.md deleted file mode 100644 index 816fab9..0000000 --- a/.changeset/lazy-plums-wink.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@emigrate/plugin-generate-js': minor -'@emigrate/reporter-pino': minor -'@emigrate/plugin-tools': minor -'@emigrate/storage-fs': minor -'@emigrate/postgres': minor -'@emigrate/mysql': minor -'@emigrate/types': minor -'@emigrate/cli': minor ---- - -Emigrate supports Bun, make use of the `bun` key in package.json `exports` diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 1cd5ead..185face 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,17 @@ # @emigrate/cli +## 0.11.0 + +### Minor Changes + +- ce6946c: Emigrate supports Bun, make use of the `bun` key in package.json `exports` + +### Patch Changes + +- Updated dependencies [ce6946c] + - @emigrate/plugin-tools@0.9.0 + - @emigrate/types@0.9.0 + ## 0.10.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index a7549e1..ac0cc44 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.10.0", + "version": "0.11.0", "publishConfig": { "access": "public" }, diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index 75e1767..591beea 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,17 @@ # @emigrate/mysql +## 0.2.0 + +### Minor Changes + +- ce6946c: Emigrate supports Bun, make use of the `bun` key in package.json `exports` + +### Patch Changes + +- Updated dependencies [ce6946c] + - @emigrate/plugin-tools@0.9.0 + - @emigrate/types@0.9.0 + ## 0.1.3 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index dec4f3b..eb0cbb7 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.1.3", + "version": "0.2.0", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-generate-js/CHANGELOG.md b/packages/plugin-generate-js/CHANGELOG.md index a77abf2..588e944 100644 --- a/packages/plugin-generate-js/CHANGELOG.md +++ b/packages/plugin-generate-js/CHANGELOG.md @@ -1,5 +1,17 @@ # @emigrate/plugin-generate-js +## 0.3.0 + +### Minor Changes + +- ce6946c: Emigrate supports Bun, make use of the `bun` key in package.json `exports` + +### Patch Changes + +- Updated dependencies [ce6946c] + - @emigrate/plugin-tools@0.9.0 + - @emigrate/types@0.9.0 + ## 0.2.7 ### Patch Changes diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index 4076753..fa5af04 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-generate-js", - "version": "0.2.7", + "version": "0.3.0", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-tools/CHANGELOG.md b/packages/plugin-tools/CHANGELOG.md index 78087a0..178b98c 100644 --- a/packages/plugin-tools/CHANGELOG.md +++ b/packages/plugin-tools/CHANGELOG.md @@ -1,5 +1,16 @@ # @emigrate/plugin-tools +## 0.9.0 + +### Minor Changes + +- ce6946c: Emigrate supports Bun, make use of the `bun` key in package.json `exports` + +### Patch Changes + +- Updated dependencies [ce6946c] + - @emigrate/types@0.9.0 + ## 0.8.0 ### Minor Changes diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index 7ba094e..0eee5e8 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-tools", - "version": "0.8.0", + "version": "0.9.0", "publishConfig": { "access": "public" }, diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index 9643b48..8c5ff2e 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,17 @@ # @emigrate/postgres +## 0.2.0 + +### Minor Changes + +- ce6946c: Emigrate supports Bun, make use of the `bun` key in package.json `exports` + +### Patch Changes + +- Updated dependencies [ce6946c] + - @emigrate/plugin-tools@0.9.0 + - @emigrate/types@0.9.0 + ## 0.1.0 ### Minor Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 1030ad6..1739464 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.1.0", + "version": "0.2.0", "publishConfig": { "access": "public" }, diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index b7b0f01..3e2f92d 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,16 @@ # @emigrate/reporter-pino +## 0.4.0 + +### Minor Changes + +- ce6946c: Emigrate supports Bun, make use of the `bun` key in package.json `exports` + +### Patch Changes + +- Updated dependencies [ce6946c] + - @emigrate/types@0.9.0 + ## 0.3.1 ### Patch Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 95cf8cc..a195e36 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.3.1", + "version": "0.4.0", "publishConfig": { "access": "public" }, diff --git a/packages/storage-fs/CHANGELOG.md b/packages/storage-fs/CHANGELOG.md index bae7b27..eb1f53f 100644 --- a/packages/storage-fs/CHANGELOG.md +++ b/packages/storage-fs/CHANGELOG.md @@ -1,5 +1,16 @@ # @emigrate/storage-fs +## 0.4.0 + +### Minor Changes + +- ce6946c: Emigrate supports Bun, make use of the `bun` key in package.json `exports` + +### Patch Changes + +- Updated dependencies [ce6946c] + - @emigrate/types@0.9.0 + ## 0.3.3 ### Patch Changes diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index 351a94d..190202f 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/storage-fs", - "version": "0.3.3", + "version": "0.4.0", "publishConfig": { "access": "public" }, diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 71c1bb5..9efd48a 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/types +## 0.9.0 + +### Minor Changes + +- ce6946c: Emigrate supports Bun, make use of the `bun` key in package.json `exports` + ## 0.8.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index 737d465..8a05ce2 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/types", - "version": "0.8.0", + "version": "0.9.0", "publishConfig": { "access": "public" }, From 3a8b06b3b1afe36a81144512cf7ca8a043048420 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 19 Dec 2023 14:25:58 +0100 Subject: [PATCH 034/136] fix: revert usage of `bun` key in package.json `exports` --- .changeset/ninety-files-doubt.md | 10 ++++++++++ packages/mysql/package.json | 1 - packages/plugin-generate-js/package.json | 1 - packages/plugin-tools/package.json | 1 - packages/postgres/package.json | 1 - packages/reporter-pino/package.json | 1 - packages/storage-fs/package.json | 1 - 7 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 .changeset/ninety-files-doubt.md diff --git a/.changeset/ninety-files-doubt.md b/.changeset/ninety-files-doubt.md new file mode 100644 index 0000000..fe1fbb8 --- /dev/null +++ b/.changeset/ninety-files-doubt.md @@ -0,0 +1,10 @@ +--- +'@emigrate/plugin-generate-js': patch +'@emigrate/reporter-pino': patch +'@emigrate/plugin-tools': patch +'@emigrate/storage-fs': patch +'@emigrate/postgres': patch +'@emigrate/mysql': patch +--- + +Don't use the `bun` key in `exports` as that would mean we have to include both built files and source files in each package, which is a bit wasteful. Maybe reconsider in the future if we can package only source files. diff --git a/packages/mysql/package.json b/packages/mysql/package.json index eb0cbb7..fe75410 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -10,7 +10,6 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index fa5af04..e8bd2af 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -10,7 +10,6 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index 0eee5e8..d5a7877 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -10,7 +10,6 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 1739464..ec30a92 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -10,7 +10,6 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index a195e36..8b1fc95 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -10,7 +10,6 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index 190202f..b735b9b 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -10,7 +10,6 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } From beb6cf77191cdb06b99cbd561aaa3b3f69a58c4b Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 15 Dec 2023 13:00:41 +0100 Subject: [PATCH 035/136] chore(deps): upgrade ansis package --- packages/cli/package.json | 2 +- packages/cli/src/reporters/default.ts | 8 ++++---- pnpm-lock.yaml | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/cli/package.json b/packages/cli/package.json index ac0cc44..a2b32ab 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -45,7 +45,7 @@ "dependencies": { "@emigrate/plugin-tools": "workspace:*", "@emigrate/types": "workspace:*", - "ansis": "2.0.2", + "ansis": "2.0.3", "cosmiconfig": "8.3.6", "elegant-spinner": "3.0.0", "figures": "6.0.1", diff --git a/packages/cli/src/reporters/default.ts b/packages/cli/src/reporters/default.ts index b290612..b90078c 100644 --- a/packages/cli/src/reporters/default.ts +++ b/packages/cli/src/reporters/default.ts @@ -24,9 +24,9 @@ const formatDuration = (duration: number): string => { }; const getTitle = ({ command, version, dry, cwd }: ReporterInitParameters) => { - return `${black.bgBlueBright(' Emigrate ').trim()} ${blueBright.bold(command)} ${blueBright(`v${version}`)} ${gray( - cwd, - )}${dry ? yellow` (dry run)` : ''}`; + return `${black.bgBlueBright` Emigrate `.trim()} ${blueBright.bold(command)} ${blueBright`v${version}`} ${gray(cwd)}${ + dry ? yellow` (dry run)` : '' + }`; }; const getMigrationStatus = ( @@ -100,7 +100,7 @@ const getMigrationText = ( parts.push(`${dim(pathWithoutName)}${getName(nameWithoutExtension, status)}${dim(migration.extension)}`); if ('status' in migration) { - parts.push(gray(`(${migration.status})`)); + parts.push(gray`(${migration.status})`); } else if (migration.name === activeMigration?.name) { parts.push(gray`(running)`); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9951810..08e785c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -78,8 +78,8 @@ importers: specifier: workspace:* version: link:../types ansis: - specifier: 2.0.2 - version: 2.0.2 + specifier: 2.0.3 + version: 2.0.3 cosmiconfig: specifier: 8.3.6 version: 8.3.6(typescript@5.2.2) @@ -2251,8 +2251,8 @@ packages: engines: {node: '>=12'} dev: false - /ansis@2.0.2: - resolution: {integrity: sha512-D64onic45SdssSfEKNJOybZhDSE9BFryY6LX1CvRzuChBC7SJGJ+VZzgiWrXTEiOK3f/MA7wyFbu34/PvhVDsQ==} + /ansis@2.0.3: + resolution: {integrity: sha512-tcSGX0mhuDFHsgRrT56xnZ9v2X+TOeKhJ75YopI5OBgyT7tGaG5m6BmeC+6KHjiucfBvUHehQMecHbULIAkFPA==} engines: {node: '>=12.13'} dev: false From e67ce0de1eb138295d0a1976ac053782eaabebb8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 19 Dec 2023 13:35:30 +0000 Subject: [PATCH 036/136] chore(release): version packages --- .changeset/ninety-files-doubt.md | 10 ---------- packages/cli/CHANGELOG.md | 7 +++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 8 ++++++++ packages/mysql/package.json | 2 +- packages/plugin-generate-js/CHANGELOG.md | 8 ++++++++ packages/plugin-generate-js/package.json | 2 +- packages/plugin-tools/CHANGELOG.md | 6 ++++++ packages/plugin-tools/package.json | 2 +- packages/postgres/CHANGELOG.md | 8 ++++++++ packages/postgres/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 6 ++++++ packages/reporter-pino/package.json | 2 +- packages/storage-fs/CHANGELOG.md | 6 ++++++ packages/storage-fs/package.json | 2 +- 15 files changed, 56 insertions(+), 17 deletions(-) delete mode 100644 .changeset/ninety-files-doubt.md diff --git a/.changeset/ninety-files-doubt.md b/.changeset/ninety-files-doubt.md deleted file mode 100644 index fe1fbb8..0000000 --- a/.changeset/ninety-files-doubt.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@emigrate/plugin-generate-js': patch -'@emigrate/reporter-pino': patch -'@emigrate/plugin-tools': patch -'@emigrate/storage-fs': patch -'@emigrate/postgres': patch -'@emigrate/mysql': patch ---- - -Don't use the `bun` key in `exports` as that would mean we have to include both built files and source files in each package, which is a bit wasteful. Maybe reconsider in the future if we can package only source files. diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 185face..2ee4630 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/cli +## 0.11.1 + +### Patch Changes + +- Updated dependencies [3a8b06b] + - @emigrate/plugin-tools@0.9.1 + ## 0.11.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index a2b32ab..3637072 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.11.0", + "version": "0.11.1", "publishConfig": { "access": "public" }, diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index 591beea..cf93e46 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/mysql +## 0.2.1 + +### Patch Changes + +- 3a8b06b: Don't use the `bun` key in `exports` as that would mean we have to include both built files and source files in each package, which is a bit wasteful. Maybe reconsider in the future if we can package only source files. +- Updated dependencies [3a8b06b] + - @emigrate/plugin-tools@0.9.1 + ## 0.2.0 ### Minor Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index fe75410..831a63c 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.2.0", + "version": "0.2.1", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-generate-js/CHANGELOG.md b/packages/plugin-generate-js/CHANGELOG.md index 588e944..2a51e10 100644 --- a/packages/plugin-generate-js/CHANGELOG.md +++ b/packages/plugin-generate-js/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-generate-js +## 0.3.1 + +### Patch Changes + +- 3a8b06b: Don't use the `bun` key in `exports` as that would mean we have to include both built files and source files in each package, which is a bit wasteful. Maybe reconsider in the future if we can package only source files. +- Updated dependencies [3a8b06b] + - @emigrate/plugin-tools@0.9.1 + ## 0.3.0 ### Minor Changes diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index e8bd2af..39c27bc 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-generate-js", - "version": "0.3.0", + "version": "0.3.1", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-tools/CHANGELOG.md b/packages/plugin-tools/CHANGELOG.md index 178b98c..ae17c9e 100644 --- a/packages/plugin-tools/CHANGELOG.md +++ b/packages/plugin-tools/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/plugin-tools +## 0.9.1 + +### Patch Changes + +- 3a8b06b: Don't use the `bun` key in `exports` as that would mean we have to include both built files and source files in each package, which is a bit wasteful. Maybe reconsider in the future if we can package only source files. + ## 0.9.0 ### Minor Changes diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index d5a7877..dc2815c 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-tools", - "version": "0.9.0", + "version": "0.9.1", "publishConfig": { "access": "public" }, diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index 8c5ff2e..e06d0f4 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/postgres +## 0.2.1 + +### Patch Changes + +- 3a8b06b: Don't use the `bun` key in `exports` as that would mean we have to include both built files and source files in each package, which is a bit wasteful. Maybe reconsider in the future if we can package only source files. +- Updated dependencies [3a8b06b] + - @emigrate/plugin-tools@0.9.1 + ## 0.2.0 ### Minor Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index ec30a92..c46222f 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.2.0", + "version": "0.2.1", "publishConfig": { "access": "public" }, diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index 3e2f92d..31c709f 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/reporter-pino +## 0.4.1 + +### Patch Changes + +- 3a8b06b: Don't use the `bun` key in `exports` as that would mean we have to include both built files and source files in each package, which is a bit wasteful. Maybe reconsider in the future if we can package only source files. + ## 0.4.0 ### Minor Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 8b1fc95..e8555a4 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.4.0", + "version": "0.4.1", "publishConfig": { "access": "public" }, diff --git a/packages/storage-fs/CHANGELOG.md b/packages/storage-fs/CHANGELOG.md index eb1f53f..ff303a1 100644 --- a/packages/storage-fs/CHANGELOG.md +++ b/packages/storage-fs/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/storage-fs +## 0.4.1 + +### Patch Changes + +- 3a8b06b: Don't use the `bun` key in `exports` as that would mean we have to include both built files and source files in each package, which is a bit wasteful. Maybe reconsider in the future if we can package only source files. + ## 0.4.0 ### Minor Changes diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index b735b9b..3d961d5 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/storage-fs", - "version": "0.4.0", + "version": "0.4.1", "publishConfig": { "access": "public" }, From a6c6e6dc78dbe3932e6143c2f2fdf3039c900308 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 19 Dec 2023 14:45:52 +0100 Subject: [PATCH 037/136] fix(types): forgot about the `bun` key in one package --- .changeset/witty-mice-clean.md | 5 +++++ packages/types/package.json | 1 - 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 .changeset/witty-mice-clean.md diff --git a/.changeset/witty-mice-clean.md b/.changeset/witty-mice-clean.md new file mode 100644 index 0000000..d3eea22 --- /dev/null +++ b/.changeset/witty-mice-clean.md @@ -0,0 +1,5 @@ +--- +'@emigrate/types': patch +--- + +Remove the `bun` exports config in this package as well diff --git a/packages/types/package.json b/packages/types/package.json index 8a05ce2..f96c2f3 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -10,7 +10,6 @@ "type": "module", "exports": { ".": { - "bun": "./src/index.ts", "import": "./dist/index.js", "types": "./dist/index.d.ts" } From e8e35215bedaf314e705b588af449c1d10ee4362 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 19 Dec 2023 13:49:57 +0000 Subject: [PATCH 038/136] chore(release): version packages --- .changeset/witty-mice-clean.md | 5 ----- packages/cli/CHANGELOG.md | 8 ++++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 8 ++++++++ packages/mysql/package.json | 2 +- packages/plugin-generate-js/CHANGELOG.md | 8 ++++++++ packages/plugin-generate-js/package.json | 2 +- packages/plugin-tools/CHANGELOG.md | 7 +++++++ packages/plugin-tools/package.json | 2 +- packages/postgres/CHANGELOG.md | 8 ++++++++ packages/postgres/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 7 +++++++ packages/reporter-pino/package.json | 2 +- packages/storage-fs/CHANGELOG.md | 7 +++++++ packages/storage-fs/package.json | 2 +- packages/types/CHANGELOG.md | 6 ++++++ packages/types/package.json | 2 +- 17 files changed, 67 insertions(+), 13 deletions(-) delete mode 100644 .changeset/witty-mice-clean.md diff --git a/.changeset/witty-mice-clean.md b/.changeset/witty-mice-clean.md deleted file mode 100644 index d3eea22..0000000 --- a/.changeset/witty-mice-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/types': patch ---- - -Remove the `bun` exports config in this package as well diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 2ee4630..a24ce1c 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/cli +## 0.11.2 + +### Patch Changes + +- Updated dependencies [a6c6e6d] + - @emigrate/types@0.9.1 + - @emigrate/plugin-tools@0.9.2 + ## 0.11.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 3637072..e2ead0c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.11.1", + "version": "0.11.2", "publishConfig": { "access": "public" }, diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index cf93e46..bfcfe8a 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/mysql +## 0.2.2 + +### Patch Changes + +- Updated dependencies [a6c6e6d] + - @emigrate/types@0.9.1 + - @emigrate/plugin-tools@0.9.2 + ## 0.2.1 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 831a63c..5b4a2f4 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.2.1", + "version": "0.2.2", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-generate-js/CHANGELOG.md b/packages/plugin-generate-js/CHANGELOG.md index 2a51e10..728cf02 100644 --- a/packages/plugin-generate-js/CHANGELOG.md +++ b/packages/plugin-generate-js/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-generate-js +## 0.3.2 + +### Patch Changes + +- Updated dependencies [a6c6e6d] + - @emigrate/types@0.9.1 + - @emigrate/plugin-tools@0.9.2 + ## 0.3.1 ### Patch Changes diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index 39c27bc..90a8d11 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-generate-js", - "version": "0.3.1", + "version": "0.3.2", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-tools/CHANGELOG.md b/packages/plugin-tools/CHANGELOG.md index ae17c9e..ea70371 100644 --- a/packages/plugin-tools/CHANGELOG.md +++ b/packages/plugin-tools/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/plugin-tools +## 0.9.2 + +### Patch Changes + +- Updated dependencies [a6c6e6d] + - @emigrate/types@0.9.1 + ## 0.9.1 ### Patch Changes diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index dc2815c..cc698b9 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-tools", - "version": "0.9.1", + "version": "0.9.2", "publishConfig": { "access": "public" }, diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index e06d0f4..beb36c3 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/postgres +## 0.2.2 + +### Patch Changes + +- Updated dependencies [a6c6e6d] + - @emigrate/types@0.9.1 + - @emigrate/plugin-tools@0.9.2 + ## 0.2.1 ### Patch Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index c46222f..3f48d05 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.2.1", + "version": "0.2.2", "publishConfig": { "access": "public" }, diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index 31c709f..c8c28ee 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/reporter-pino +## 0.4.2 + +### Patch Changes + +- Updated dependencies [a6c6e6d] + - @emigrate/types@0.9.1 + ## 0.4.1 ### Patch Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index e8555a4..493508d 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.4.1", + "version": "0.4.2", "publishConfig": { "access": "public" }, diff --git a/packages/storage-fs/CHANGELOG.md b/packages/storage-fs/CHANGELOG.md index ff303a1..13fedf4 100644 --- a/packages/storage-fs/CHANGELOG.md +++ b/packages/storage-fs/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/storage-fs +## 0.4.2 + +### Patch Changes + +- Updated dependencies [a6c6e6d] + - @emigrate/types@0.9.1 + ## 0.4.1 ### Patch Changes diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index 3d961d5..f180395 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/storage-fs", - "version": "0.4.1", + "version": "0.4.2", "publishConfig": { "access": "public" }, diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 9efd48a..5df7e88 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/types +## 0.9.1 + +### Patch Changes + +- a6c6e6d: Remove the `bun` exports config in this package as well + ## 0.9.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index f96c2f3..5c9029c 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/types", - "version": "0.9.0", + "version": "0.9.1", "publishConfig": { "access": "public" }, From 7bae76f496e5d807649d779bea658df2b08d447b Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 19 Dec 2023 15:32:16 +0100 Subject: [PATCH 039/136] docs: include Deno usage instructions in the documentation --- README.md | 8 +- docs/src/content/docs/commands/list.mdx | 13 +- docs/src/content/docs/commands/new.mdx | 13 +- docs/src/content/docs/commands/remove.mdx | 13 +- docs/src/content/docs/commands/up.mdx | 13 +- docs/src/content/docs/intro/quick-start.mdx | 136 ++++++++++++++++-- .../src/content/docs/intro/whats-emigrate.mdx | 2 +- .../content/docs/plugins/generators/js.mdx | 47 +++++- .../content/docs/plugins/generators/mysql.mdx | 47 +++++- .../docs/plugins/generators/postgres.mdx | 47 +++++- .../content/docs/plugins/loaders/mysql.mdx | 47 +++++- .../content/docs/plugins/loaders/postgres.mdx | 47 +++++- .../content/docs/plugins/reporters/pino.mdx | 47 +++++- .../docs/plugins/storage/file-system.mdx | 9 ++ .../content/docs/plugins/storage/mysql.mdx | 9 ++ .../content/docs/plugins/storage/postgres.mdx | 9 ++ packages/cli/README.md | 8 +- packages/mysql/README.md | 8 +- packages/plugin-generate-js/README.md | 8 +- packages/postgres/README.md | 8 +- packages/reporter-pino/README.md | 8 +- packages/storage-fs/README.md | 8 +- 22 files changed, 505 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 94c3271..85dfe0d 100644 --- a/README.md +++ b/README.md @@ -30,13 +30,13 @@ It's effectively a successor of [klei-migrate](https://www.npmjs.com/package/kle Install the Emigrate CLI in your project: ```bash -npm install --save-dev @emigrate/cli +npm install @emigrate/cli # or -pnpm add --save-dev @emigrate/cli +pnpm add @emigrate/cli # or -yarn add --dev @emigrate/cli +yarn add @emigrate/cli # or -bun add --dev @emigrate/cli +bun add @emigrate/cli ``` ## Usage diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx index cb05c16..7c79628 100644 --- a/docs/src/content/docs/commands/list.mdx +++ b/docs/src/content/docs/commands/list.mdx @@ -34,14 +34,21 @@ It then sorts the migrations by filename in ascending order and outputs them and bunx --bun emigrate list [options] ``` - - ```json {3} + + ```json title="package.json" {3,6} { "scripts": { - "emigrate": "emigrate list [options]" + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" } } ``` + + ```bash + deno task emigrate list [options] + ``` diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx index 18b97a8..a411b29 100644 --- a/docs/src/content/docs/commands/new.mdx +++ b/docs/src/content/docs/commands/new.mdx @@ -33,14 +33,21 @@ The migration file can be based on a template, generated by a - ```json {3} + + ```json title="package.json" {3,6} { "scripts": { - "emigrate": "emigrate new [options] " + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" } } ``` + + ```bash + deno task emigrate new [options] + ``` diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index 600a1df..d1e8ebe 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -31,14 +31,21 @@ The `remove` command is used to remove a migration from the history. This is use bunx --bun emigrate remove [options] ``` - - ```json {3} + + ```json title="package.json" {3,6} { "scripts": { - "emigrate": "emigrate remove [options] " + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" } } ``` + + ```bash + deno task emigrate remove [options] + ``` diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 76d6683..3868217 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -36,14 +36,21 @@ If any of the migrations fail, the command will be aborted and the rest of the m bunx --bun emigrate up [options] ``` - - ```json {3} + + ```json title="package.json" {3,6} { "scripts": { - "emigrate": "emigrate up [options]" + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" } } ``` + + ```bash + deno task emigrate up [options] + ``` diff --git a/docs/src/content/docs/intro/quick-start.mdx b/docs/src/content/docs/intro/quick-start.mdx index 77233c8..905e078 100644 --- a/docs/src/content/docs/intro/quick-start.mdx +++ b/docs/src/content/docs/intro/quick-start.mdx @@ -40,6 +40,18 @@ But for now, this is the way to go. bun add @emigrate/cli ``` + + ```json title="package.json" {3,6} + { + "scripts": { + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" + } + } + ``` + ### Pick a storage plugin @@ -69,15 +81,57 @@ Install the plugin you want to use, for example the + ```json title="package.json" {4} + { + "dependencies": { + "@emigrate/cli": "*", + "@emigrate/postgres": "*" + } + } + ``` + ### Create your first migration Create a new migration file in your project using: -```bash title="Create a new migration file" -npx emigrate new --plugin postgres create users table -``` + + + ```bash title="Create a new migration file" + npx emigrate new --plugin postgres create users table + ``` + + + ```bash title="Create a new migration file" + pnpm emigrate new --plugin postgres create users table + ``` + + + ```bash title="Create a new migration file" + yarn emigrate new --plugin postgres create users table + ``` + + + ```bash title="Create a new migration file" + bunx --bun emigrate new --plugin postgres create users table + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash title="Create a new migration file" + deno task emigrate new --plugin postgres create users table + ``` + + ```txt title="Output" Emigrate new v0.10.0 /your/project/path @@ -119,9 +173,41 @@ There's no magic about the first line comment as when using Liquibase, it's just To show both pending and already applied migrations (or previously failed), use the `list` command: -```bash title="Show all migrations" -npx emigrate list --storage postgres -``` + + + ```bash title="Show all migrations" + npx emigrate list --storage postgres + ``` + + + ```bash title="Show all migrations" + pnpm emigrate list --storage postgres + ``` + + + ```bash title="Show all migrations" + yarn emigrate list --storage postgres + ``` + + + ```bash title="Show all migrations" + bunx --bun emigrate list --storage postgres + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash title="Show all migrations" + deno task emigrate list --storage postgres + ``` + + ```txt title="Example output" Emigrate list v0.10.0 /your/project/path @@ -137,9 +223,41 @@ Emigrate list v0.10.0 /your/project/path A good way to test your configuration is to run the migrations in dry mode: -```bash title="Show pending migrations" -npx emigrate up --storage postgres --plugin postgres --dry -``` + + + ```bash title="Show pending migrations" + npx emigrate up --storage postgres --plugin postgres --dry + ``` + + + ```bash title="Show pending migrations" + pnpm emigrate up --storage postgres --plugin postgres --dry + ``` + + + ```bash title="Show pending migrations" + yarn emigrate up --storage postgres --plugin postgres --dry + ``` + + + ```bash title="Show pending migrations" + bunx --bun emigrate up --storage postgres --plugin postgres --dry + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash title="Show pending migrations" + deno task emigrate up --storage postgres --plugin postgres --dry + ``` + + :::note This will connect to the database using some default values. For ways to configure the connection, see Configuration. diff --git a/docs/src/content/docs/intro/whats-emigrate.mdx b/docs/src/content/docs/intro/whats-emigrate.mdx index fc1a7bd..58ff0c5 100644 --- a/docs/src/content/docs/intro/whats-emigrate.mdx +++ b/docs/src/content/docs/intro/whats-emigrate.mdx @@ -8,7 +8,7 @@ import Link from '@components/Link.astro'; Emigrate is written in [TypeScript](https://www.typescriptlang.org) and is a migration tool for any database or data. * It's database agnostic - you can use it with any database, or even with non-database data. -* It can be run on multiple platforms - currently [NodeJS](https://nodejs.org) and [Bun](https://bun.sh) is supported, but more platforms is planned. +* It can be run on multiple platforms - currently [NodeJS](https://nodejs.org), [Bun](https://bun.sh) and [Deno](https://deno.com) is supported, but more platforms is planned. * It's the successor of [klei-migrate](https://github.com/klei/migrate) and is designed to be compatible with [Immigration](https://github.com/blakeembrey/node-immigration) and many of its storage plugins, as well as [Migrate](https://github.com/tj/node-migrate). * It supports migration files written using CommonJS or ES Modules out of the box, with any of the following extensions: `.js`, `.cjs` or `.mjs`, and supports [async functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function), [Promises](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) or using the [NodeJS Callback Pattern](https://nodejs.org/en/learn/asynchronous-work/javascript-asynchronous-programming-and-callbacks#handling-errors-in-callbacks). * Other languages can be used by using a Loader Plugin. diff --git a/docs/src/content/docs/plugins/generators/js.mdx b/docs/src/content/docs/plugins/generators/js.mdx index 1e1fae2..b77c6be 100644 --- a/docs/src/content/docs/plugins/generators/js.mdx +++ b/docs/src/content/docs/plugins/generators/js.mdx @@ -30,12 +30,53 @@ A generator plugin for generating new m bun add @emigrate/plugin-generate-js ``` + + ```json title="package.json" {3} + { + "dependencies": { + "@emigrate/plugin-generate-js": "*" + } + } + ``` + ## Usage -```bash -emigrate new --plugin generate-js create some fancy table -``` + + + ```bash + npx emigrate new --plugin generate-js create some fancy table + ``` + + + ```bash + pnpm emigrate new --plugin generate-js create some fancy table + ``` + + + ```bash + yarn emigrate new --plugin generate-js create some fancy table + ``` + + + ```bash + bunx --bun emigrate new --plugin generate-js create some fancy table + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash + deno task emigrate new --plugin generate-js create some fancy table + ``` + + For more information see the `new` command's documentation. diff --git a/docs/src/content/docs/plugins/generators/mysql.mdx b/docs/src/content/docs/plugins/generators/mysql.mdx index 786fde0..d36e7d3 100644 --- a/docs/src/content/docs/plugins/generators/mysql.mdx +++ b/docs/src/content/docs/plugins/generators/mysql.mdx @@ -30,12 +30,53 @@ The MySQL generator creates new migration files with the `.sql` extension. In th bun add @emigrate/mysql ``` + + ```json title="package.json" {3} + { + "dependencies": { + "@emigrate/mysql": "*" + } + } + ``` + ## Usage -```bash -emigrate new --plugin mysql create some fancy table -``` + + + ```bash + npx emigrate new --plugin mysql create some fancy table + ``` + + + ```bash + pnpm emigrate new --plugin mysql create some fancy table + ``` + + + ```bash + yarn emigrate new --plugin mysql create some fancy table + ``` + + + ```bash + bunx --bun emigrate new --plugin mysql create some fancy table + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash + deno task emigrate new --plugin mysql create some fancy table + ``` + + For more information see the `new` command's documentation. diff --git a/docs/src/content/docs/plugins/generators/postgres.mdx b/docs/src/content/docs/plugins/generators/postgres.mdx index d6e670c..748c511 100644 --- a/docs/src/content/docs/plugins/generators/postgres.mdx +++ b/docs/src/content/docs/plugins/generators/postgres.mdx @@ -30,12 +30,53 @@ The PostgreSQL generator creates new migration files with the `.sql` extension. bun add @emigrate/postgres ``` + + ```json title="package.json" {3} + { + "dependencies": { + "@emigrate/postgres": "*" + } + } + ``` + ## Usage -```bash -emigrate new --plugin postgres create some fancy table -``` + + + ```bash + npx emigrate new --plugin postgres create some fancy table + ``` + + + ```bash + pnpm emigrate new --plugin postgres create some fancy table + ``` + + + ```bash + yarn emigrate new --plugin postgres create some fancy table + ``` + + + ```bash + bunx --bun emigrate new --plugin postgres create some fancy table + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash + deno task emigrate new --plugin postgres create some fancy table + ``` + + For more information see the `new` command's documentation. diff --git a/docs/src/content/docs/plugins/loaders/mysql.mdx b/docs/src/content/docs/plugins/loaders/mysql.mdx index 52249d0..47dc6f3 100644 --- a/docs/src/content/docs/plugins/loaders/mysql.mdx +++ b/docs/src/content/docs/plugins/loaders/mysql.mdx @@ -30,6 +30,15 @@ The MySQL loader plugin transforms `.sql` files into JavaScript functions that E bun add @emigrate/mysql ``` + + ```json title="package.json" {3} + { + "dependencies": { + "@emigrate/mysql": "*" + } + } + ``` + ## Configuration @@ -78,9 +87,41 @@ The `MYSQL_URL` environment variable takes precedence over the other environment The environment variables are used when the plugin is used using the `--plugin` command line option: -```bash -npx emigrate list --plugin mysql -``` + + + ```bash + npx emigrate list --plugin mysql + ``` + + + ```bash + pnpm emigrate list --plugin mysql + ``` + + + ```bash + yarn emigrate list --plugin mysql + ``` + + + ```bash + bunx --bun emigrate list --plugin mysql + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash + deno task emigrate list --plugin mysql + ``` + + Or when specifying the plugin in the `emigrate.config.js` file as a string: diff --git a/docs/src/content/docs/plugins/loaders/postgres.mdx b/docs/src/content/docs/plugins/loaders/postgres.mdx index 39a9f15..2c7d6d3 100644 --- a/docs/src/content/docs/plugins/loaders/postgres.mdx +++ b/docs/src/content/docs/plugins/loaders/postgres.mdx @@ -30,6 +30,15 @@ The PostgreSQL loader plugin transforms `.sql` files into JavaScript functions t bun add @emigrate/postgres ``` + + ```json title="package.json" {3} + { + "dependencies": { + "@emigrate/postgres": "*" + } + } + ``` + ## Configuration @@ -78,9 +87,41 @@ The `POSTGRES_URL` environment variable takes precedence over the other environm The environment variables are used when the plugin is used using the `--plugin` command line option: -```bash -npx emigrate list --plugin postgres -``` + + + ```bash + npx emigrate list --plugin postgres + ``` + + + ```bash + pnpm emigrate list --plugin postgres + ``` + + + ```bash + yarn emigrate list --plugin postgres + ``` + + + ```bash + bunx --bun emigrate list --plugin postgres + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash + deno task emigrate list --plugin postgres + ``` + + Or when specifying the plugin in the `emigrate.config.js` file as a string: diff --git a/docs/src/content/docs/plugins/reporters/pino.mdx b/docs/src/content/docs/plugins/reporters/pino.mdx index 5ff75be..2ee3c19 100644 --- a/docs/src/content/docs/plugins/reporters/pino.mdx +++ b/docs/src/content/docs/plugins/reporters/pino.mdx @@ -32,6 +32,15 @@ This is useful in production environments where you want all logs as JSON, which bun add @emigrate/reporter-pino ``` + + ```json title="package.json" {3} + { + "dependencies": { + "@emigrate/reporter-pino": "*" + } + } + ``` + ## Usage @@ -42,9 +51,41 @@ The `@emigrate/reporter-` prefix is optional when using this reporter. ### Via CLI -```bash -emigrate --reporter pino -``` + + + ```bash + npx emigrate --reporter pino + ``` + + + ```bash + pnpm emigrate --reporter pino + ``` + + + ```bash + yarn emigrate --reporter pino + ``` + + + ```bash + bunx --bun emigrate --reporter pino + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash + deno task emigrate --reporter pino + ``` + + See for instance the Reporter Option for the `up` command for more information. diff --git a/docs/src/content/docs/plugins/storage/file-system.mdx b/docs/src/content/docs/plugins/storage/file-system.mdx index f969129..0d865de 100644 --- a/docs/src/content/docs/plugins/storage/file-system.mdx +++ b/docs/src/content/docs/plugins/storage/file-system.mdx @@ -34,6 +34,15 @@ This is suitable for simple setups, but for more advanced setups for instance wh bun add @emigrate/storage-fs ``` + + ```json title="package.json" {3} + { + "dependencies": { + "@emigrate/storage-fs": "*" + } + } + ``` + ## Configuration diff --git a/docs/src/content/docs/plugins/storage/mysql.mdx b/docs/src/content/docs/plugins/storage/mysql.mdx index 1816179..62a49c7 100644 --- a/docs/src/content/docs/plugins/storage/mysql.mdx +++ b/docs/src/content/docs/plugins/storage/mysql.mdx @@ -30,6 +30,15 @@ The MySQL storage plugin uses a MySQL database to store the migration history (* bun add @emigrate/mysql ``` + + ```json title="package.json" {3} + { + "dependencies": { + "@emigrate/mysql": "*" + } + } + ``` + ## Configuration diff --git a/docs/src/content/docs/plugins/storage/postgres.mdx b/docs/src/content/docs/plugins/storage/postgres.mdx index 7e586ed..a4c8503 100644 --- a/docs/src/content/docs/plugins/storage/postgres.mdx +++ b/docs/src/content/docs/plugins/storage/postgres.mdx @@ -30,6 +30,15 @@ The PostgreSQL storage plugin uses a PostgreSQL database to store the migration bun add @emigrate/postgres ``` + + ```json title="package.json" {3} + { + "dependencies": { + "@emigrate/postgres": "*" + } + } + ``` + ## Configuration diff --git a/packages/cli/README.md b/packages/cli/README.md index 6e01f65..8c84c57 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -7,7 +7,13 @@ Emigrate is a tool for managing database migrations. It is designed to be simple Install the Emigrate CLI in your project: ```bash -npm install --save-dev @emigrate/cli +npm install @emigrate/cli +# or +pnpm add @emigrate/cli +# or +yarn add @emigrate/cli +# or +bun add @emigrate/cli ``` ## Usage diff --git a/packages/mysql/README.md b/packages/mysql/README.md index 54abfe7..c9a174c 100644 --- a/packages/mysql/README.md +++ b/packages/mysql/README.md @@ -17,7 +17,13 @@ This plugin is actually three different Emigrate plugins in one: Install the plugin in your project, alongside the Emigrate CLI: ```bash -npm install --save-dev @emigrate/cli @emigrate/mysql +npm install @emigrate/cli @emigrate/mysql +# or +pnpm add @emigrate/cli @emigrate/mysql +# or +yarn add @emigrate/cli @emigrate/mysql +# or +bun add @emigrate/cli @emigrate/mysql ``` ## Usage diff --git a/packages/plugin-generate-js/README.md b/packages/plugin-generate-js/README.md index c04e9c8..3147665 100644 --- a/packages/plugin-generate-js/README.md +++ b/packages/plugin-generate-js/README.md @@ -7,7 +7,13 @@ This package contains an Emigrate plugin for generating migration files using Ja Install the package: ```bash -npm install --save-dev @emigrate/plugin-generate-js +npm install @emigrate/cli @emigrate/plugin-generate-js +# or +pnpm add @emigrate/cli @emigrate/plugin-generate-js +# or +yarn add @emigrate/cli @emigrate/plugin-generate-js +# or +bun add @emigrate/cli @emigrate/plugin-generate-js ``` Use the plugin with the `emigrate new` command: diff --git a/packages/postgres/README.md b/packages/postgres/README.md index 1e397c3..aa606b9 100644 --- a/packages/postgres/README.md +++ b/packages/postgres/README.md @@ -17,7 +17,13 @@ This plugin is actually three different Emigrate plugins in one: Install the plugin in your project, alongside the Emigrate CLI: ```bash -npm install --save-dev @emigrate/cli @emigrate/postgres +npm install @emigrate/cli @emigrate/postgres +# or +pnpm add @emigrate/cli @emigrate/postgres +# or +yarn add @emigrate/cli @emigrate/postgres +# or +bun add @emigrate/cli @emigrate/postgres ``` ## Usage diff --git a/packages/reporter-pino/README.md b/packages/reporter-pino/README.md index 975623f..73b8eb7 100644 --- a/packages/reporter-pino/README.md +++ b/packages/reporter-pino/README.md @@ -8,7 +8,13 @@ Which is great both in production environments and for piping the output to othe Install the reporter in your project, alongside the Emigrate CLI: ```bash -npm install --save-dev @emigrate/cli @emigrate/reporter-pino +npm install @emigrate/cli @emigrate/reporter-pino +# or +pnpm add @emigrate/cli @emigrate/reporter-pino +# or +yarn add @emigrate/cli @emigrate/reporter-pino +# or +bun add @emigrate/cli @emigrate/reporter-pino ``` ## Usage diff --git a/packages/storage-fs/README.md b/packages/storage-fs/README.md index 3fc6e65..d83805b 100644 --- a/packages/storage-fs/README.md +++ b/packages/storage-fs/README.md @@ -7,7 +7,13 @@ A file system storage plugin for Emigrate, suitable for simple migration setups. Install the storage plugin in your project, alongside the Emigrate CLI: ```bash -npm install --save-dev @emigrate/cli @emigrate/storage-fs +npm install @emigrate/cli @emigrate/storage-fs +# or +pnpm add @emigrate/cli @emigrate/storage-fs +# or +yarn add @emigrate/cli @emigrate/storage-fs +# or +bun add @emigrate/cli @emigrate/storage-fs ``` ## Usage From f9a16d87a1b874623d0bd9cc9efed241f4499406 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Wed, 20 Dec 2023 09:06:13 +0100 Subject: [PATCH 040/136] feat: add `color` option to CLI and configuration file The option is used to force enable/disable color output and is passed to the reporter which should respect it --- .changeset/funny-ladybugs-cheat.md | 6 +++ docs/src/content/docs/commands/list.mdx | 4 ++ docs/src/content/docs/commands/new.mdx | 4 ++ docs/src/content/docs/commands/remove.mdx | 4 ++ docs/src/content/docs/commands/up.mdx | 4 ++ .../content/docs/reference/configuration.mdx | 15 ++++++ packages/cli/src/cli.ts | 51 +++++++++++++++++-- packages/cli/src/commands/list.ts | 9 +++- packages/cli/src/commands/new.ts | 4 +- packages/cli/src/commands/remove.ts | 4 +- packages/cli/src/commands/up.test.ts | 7 +++ packages/cli/src/commands/up.ts | 3 +- packages/cli/src/types.ts | 1 + packages/types/src/index.ts | 7 +++ 14 files changed, 112 insertions(+), 11 deletions(-) create mode 100644 .changeset/funny-ladybugs-cheat.md diff --git a/.changeset/funny-ladybugs-cheat.md b/.changeset/funny-ladybugs-cheat.md new file mode 100644 index 0000000..4d48eb7 --- /dev/null +++ b/.changeset/funny-ladybugs-cheat.md @@ -0,0 +1,6 @@ +--- +'@emigrate/types': minor +'@emigrate/cli': minor +--- + +Add `color` option to the CLI and configuration file, which is used to force enable/disable color output from the reporter (the option is passed to the chosen reporter which should respect it) diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx index 7c79628..6120302 100644 --- a/docs/src/content/docs/commands/list.mdx +++ b/docs/src/content/docs/commands/list.mdx @@ -91,3 +91,7 @@ The name can be either a path to a module or a package name. For package names E And then try to load the module/package with the given name. For example, if you want to use the `emigrate-reporter-somereporter` package, you can specify either `emigrate-reporter-somereporter` or just `somereporter` as the name. + +### `--color`, `--no-color` + +Force enable/disable colored output, option is passed to the reporter which should respect it. diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx index a411b29..0c0721d 100644 --- a/docs/src/content/docs/commands/new.mdx +++ b/docs/src/content/docs/commands/new.mdx @@ -108,3 +108,7 @@ The name can be either a path to a module or a package name. For package names E And then try to load the module/package with the given name. For example, if you want to use the `emigrate-reporter-somereporter` package, you can specify either `emigrate-reporter-somereporter` or just `somereporter` as the name. + +### `--color`, `--no-color` + +Force enable/disable colored output, option is passed to the reporter which should respect it. diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index d1e8ebe..af17a52 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -98,3 +98,7 @@ The name can be either a path to a module or a package name. For package names E And then try to load the module/package with the given name. For example, if you want to use the `emigrate-reporter-somereporter` package, you can specify either `emigrate-reporter-somereporter` or just `somereporter` as the name. + +### `--color`, `--no-color` + +Force enable/disable colored output, option is passed to the reporter which should respect it. diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 3868217..d431807 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -112,3 +112,7 @@ The name can be either a path to a module or a package name. For package names E And then try to load the module/package with the given name. For example, if you want to use the `emigrate-reporter-somereporter` package, you can specify either `emigrate-reporter-somereporter` or just `somereporter` as the name. + +### `--color`, `--no-color` + +Force enable/disable colored output, option is passed to the reporter which should respect it. diff --git a/docs/src/content/docs/reference/configuration.mdx b/docs/src/content/docs/reference/configuration.mdx index 5294cc3..46d0a67 100644 --- a/docs/src/content/docs/reference/configuration.mdx +++ b/docs/src/content/docs/reference/configuration.mdx @@ -46,6 +46,7 @@ Set the directory where your migrations are located, relative to the project roo ### `reporter` **type:** `string | EmigrateReporter | Promise | (() => Promise)` + **default:** `"default"` - the default reporter Set the reporter to use for the different commands. Specifying a reporter is most useful in a CI or production environment where you either ship logs or want to have a machine-readable format. @@ -74,6 +75,20 @@ Commands that are not specified will use the default reporter. The default reporter automatically detects if the current environment is an interactive terminal or not, and will only render animations and similar if it is. ::: +### `color` + +**type:** `boolean | undefined` + +**default:** `undefined` + +Set whether to force colors in the output or not. This option is passed to the reporter which should respect it. + +```js title="emigrate.config.js" {2} +export default { + color: false, +}; +``` + ### `storage` **type:** `string | EmigrateStorage | Promise | (() => Promise)` diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index de7132b..4ad8ace 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -6,6 +6,14 @@ import { getConfig } from './get-config.js'; type Action = (args: string[]) => Promise; +const useColors = (values: { color?: boolean; 'no-color'?: boolean }) => { + if (values['no-color']) { + return false; + } + + return values.color; +}; + const up: Action = async (args) => { const config = await getConfig('up'); const { values } = parseArgs({ @@ -36,6 +44,12 @@ const up: Action = async (args) => { multiple: true, default: [], }, + color: { + type: 'boolean', + }, + 'no-color': { + type: 'boolean', + }, }, allowPositionals: false, }); @@ -52,6 +66,8 @@ Options: -p, --plugin The plugin(s) to use (can be specified multiple times) -r, --reporter The reporter to use for reporting the migration progress --dry List the pending migrations that would be run without actually running them + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) Examples: @@ -71,7 +87,7 @@ Examples: try { const { default: upCommand } = await import('./commands/up.js'); - process.exitCode = await upCommand({ storage, reporter, directory, plugins, dry }); + process.exitCode = await upCommand({ storage, reporter, directory, plugins, dry, color: useColors(values) }); } catch (error) { if (error instanceof ShowUsageError) { console.error(error.message, '\n'); @@ -115,6 +131,12 @@ const newMigration: Action = async (args) => { multiple: true, default: [], }, + color: { + type: 'boolean', + }, + 'no-color': { + type: 'boolean', + }, }, allowPositionals: true, }); @@ -137,6 +159,8 @@ Options: (if the extension option is not provided the template file's extension will be used) -e, --extension The extension to use for the new migration file (if no template or plugin is provided an empty migration file will be created with the given extension) + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) One of the --template, --extension or the --plugin options must be specified @@ -165,7 +189,7 @@ Examples: try { const { default: newCommand } = await import('./commands/new.js'); - await newCommand({ directory, template, plugins, extension, reporter }, name); + await newCommand({ directory, template, plugins, extension, reporter, color: useColors(values) }, name); } catch (error) { if (error instanceof ShowUsageError) { console.error(error.message, '\n'); @@ -199,6 +223,12 @@ const list: Action = async (args) => { type: 'string', short: 's', }, + color: { + type: 'boolean', + }, + 'no-color': { + type: 'boolean', + }, }, allowPositionals: false, }); @@ -213,6 +243,8 @@ Options: -d, --directory The directory where the migration files are located (required) -r, --reporter The reporter to use for reporting the migrations -s, --storage The storage to use to get the migration history (required) + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) Examples: @@ -230,7 +262,7 @@ Examples: try { const { default: listCommand } = await import('./commands/list.js'); - process.exitCode = await listCommand({ directory, storage, reporter }); + process.exitCode = await listCommand({ directory, storage, reporter, color: useColors(values) }); } catch (error) { if (error instanceof ShowUsageError) { console.error(error.message, '\n'); @@ -268,6 +300,12 @@ const remove: Action = async (args) => { type: 'string', short: 's', }, + color: { + type: 'boolean', + }, + 'no-color': { + type: 'boolean', + }, }, allowPositionals: true, }); @@ -289,6 +327,8 @@ Options: -s, --storage The storage to use to get the migration history (required) -f, --force Force removal of the migration history entry even if the migration file does not exist or it's in a non-failed state + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) Examples: @@ -306,7 +346,10 @@ Examples: try { const { default: removeCommand } = await import('./commands/remove.js'); - process.exitCode = await removeCommand({ directory, storage, reporter, force }, positionals[0] ?? ''); + process.exitCode = await removeCommand( + { directory, storage, reporter, force, color: useColors(values) }, + positionals[0] ?? '', + ); } catch (error) { if (error instanceof ShowUsageError) { console.error(error.message, '\n'); diff --git a/packages/cli/src/commands/list.ts b/packages/cli/src/commands/list.ts index d0ed7b5..726351f 100644 --- a/packages/cli/src/commands/list.ts +++ b/packages/cli/src/commands/list.ts @@ -10,7 +10,12 @@ import { version } from '../get-package-info.js'; const lazyDefaultReporter = async () => import('../reporters/default.js'); -export default async function listCommand({ directory, reporter: reporterConfig, storage: storageConfig }: Config) { +export default async function listCommand({ + directory, + reporter: reporterConfig, + storage: storageConfig, + color, +}: Config) { if (!directory) { throw MissingOptionError.fromOption('directory'); } @@ -31,7 +36,7 @@ export default async function listCommand({ directory, reporter: reporterConfig, ); } - await reporter.onInit?.({ command: 'list', version, cwd, dry: false, directory }); + await reporter.onInit?.({ command: 'list', version, cwd, dry: false, directory, color }); const [storage, storageError] = await exec(async () => storagePlugin.initializeStorage()); diff --git a/packages/cli/src/commands/new.ts b/packages/cli/src/commands/new.ts index 8c551c4..bd4f682 100644 --- a/packages/cli/src/commands/new.ts +++ b/packages/cli/src/commands/new.ts @@ -19,7 +19,7 @@ import { getDuration } from '../get-duration.js'; const lazyDefaultReporter = async () => import('../reporters/default.js'); export default async function newCommand( - { directory, template, reporter: reporterConfig, plugins = [], extension }: Config, + { directory, template, reporter: reporterConfig, plugins = [], extension, color }: Config, name: string, ) { if (!directory) { @@ -45,7 +45,7 @@ export default async function newCommand( ); } - await reporter.onInit?.({ command: 'new', version, cwd, dry: false, directory }); + await reporter.onInit?.({ command: 'new', version, cwd, dry: false, directory, color }); const start = process.hrtime(); diff --git a/packages/cli/src/commands/remove.ts b/packages/cli/src/commands/remove.ts index 852a34e..b74ecaf 100644 --- a/packages/cli/src/commands/remove.ts +++ b/packages/cli/src/commands/remove.ts @@ -22,7 +22,7 @@ type ExtraFlags = { const lazyDefaultReporter = async () => import('../reporters/default.js'); export default async function removeCommand( - { directory, reporter: reporterConfig, storage: storageConfig, force }: Config & ExtraFlags, + { directory, reporter: reporterConfig, storage: storageConfig, color, force = false }: Config & ExtraFlags, name: string, ) { if (!directory) { @@ -57,7 +57,7 @@ export default async function removeCommand( return 1; } - await reporter.onInit?.({ command: 'remove', version, cwd, dry: false, directory }); + await reporter.onInit?.({ command: 'remove', version, cwd, dry: false, directory, color }); const [migrationFile, fileError] = await exec(async () => getMigration(cwd, directory, name, !force)); diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index c0b63c4..fe88b74 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -33,6 +33,7 @@ describe('up', () => { command: 'up', cwd: '/emigrate', dry: false, + color: undefined, version, directory: 'migrations', }, @@ -111,6 +112,7 @@ describe('up', () => { cwd: '/emigrate', version, dry: false, + color: undefined, directory: 'migrations', }, ]); @@ -152,6 +154,7 @@ describe('up', () => { cwd: '/emigrate', version, dry: true, + color: undefined, directory: 'migrations', }, ]); @@ -193,6 +196,7 @@ describe('up', () => { cwd: '/emigrate', version, dry: false, + color: undefined, directory: 'migrations', }, ]); @@ -219,6 +223,7 @@ describe('up', () => { cwd: '/emigrate', version, dry: false, + color: undefined, directory: 'migrations', }, ]); @@ -265,6 +270,7 @@ describe('up', () => { cwd: '/emigrate', version, dry: false, + color: undefined, directory: 'migrations', }, ]); @@ -312,6 +318,7 @@ describe('up', () => { cwd: '/emigrate', version, dry: false, + color: undefined, directory: 'migrations', }, ]); diff --git a/packages/cli/src/commands/up.ts b/packages/cli/src/commands/up.ts index 07ec7c9..2423286 100644 --- a/packages/cli/src/commands/up.ts +++ b/packages/cli/src/commands/up.ts @@ -25,6 +25,7 @@ export default async function upCommand({ storage: storageConfig, reporter: reporterConfig, directory, + color, dry = false, plugins = [], cwd = process.cwd(), @@ -49,7 +50,7 @@ export default async function upCommand({ ); } - await reporter.onInit?.({ command: 'up', version, cwd, dry, directory }); + await reporter.onInit?.({ command: 'up', version, cwd, dry, directory, color }); const [storage, storageError] = await exec(async () => storagePlugin.initializeStorage()); diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts index 2880bd8..bc4e000 100644 --- a/packages/cli/src/types.ts +++ b/packages/cli/src/types.ts @@ -11,6 +11,7 @@ export type Config = { directory?: string; template?: string; extension?: string; + color?: boolean; }; export type EmigrateConfig = Config & { diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index a062519..dea668d 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -229,6 +229,13 @@ export type ReporterInitParameters = { * Will only be true when the command is 'up' and the --dry option is specified. */ dry: boolean; + /** + * Forcibly enable or disable colors in the output. + * + * If set to true, the reporter should use colors in the output. + * If set to false, the reporter should not use colors in the output. + */ + color?: boolean; }; export type EmigrateReporter = Partial<{ From e6e4433018f5ea22818930f273879a06eec7b8f7 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Wed, 20 Dec 2023 09:22:42 +0100 Subject: [PATCH 041/136] feat(cli): rename extension short option from `-e` to `-x` BREAKING CHANGE: if you've been using the `-e` short option you should change it to `-x` or use the long option name `--extension` --- .changeset/sharp-eggs-poke.md | 5 +++++ README.md | 8 ++++---- docs/src/content/docs/commands/new.mdx | 8 ++++++-- packages/cli/README.md | 10 +++++++++- packages/cli/src/cli.ts | 8 ++++---- 5 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 .changeset/sharp-eggs-poke.md diff --git a/.changeset/sharp-eggs-poke.md b/.changeset/sharp-eggs-poke.md new file mode 100644 index 0000000..cc6ae22 --- /dev/null +++ b/.changeset/sharp-eggs-poke.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +BREAKING CHANGE: Rename the `extension` short CLI option from `-e` to `-x` in preparation for an upcoming option that will take its place diff --git a/README.md b/README.md index 85dfe0d..d494410 100644 --- a/README.md +++ b/README.md @@ -44,13 +44,13 @@ bun add @emigrate/cli Create a new migration: ```bash -npx emigrate new -d migrations -e .js create some fancy table +npx emigrate new -d migrations create some fancy table # or -pnpm emigrate new -d migrations -e .js create some fancy table +pnpm emigrate new -d migrations create some fancy table # or -yarn emigrate new -d migrations -e .js create some fancy table +yarn emigrate new -d migrations create some fancy table # or -bunx --bun emigrate new -d migrations -e .js create some fancy table +bunx --bun emigrate new -d migrations create some fancy table ``` Will create a new empty JavaScript migration file with the name "YYYYMMDDHHmmssuuu_create_some_fancy_table.js" in the `migrations` directory. diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx index 0c0721d..671b918 100644 --- a/docs/src/content/docs/commands/new.mdx +++ b/docs/src/content/docs/commands/new.mdx @@ -74,12 +74,16 @@ The directory where the migration files are located. The given path should be ab The template file to use for generating the migration file. The given path should be absolute or relative to the current working directory. -The template can contain a `{{name}}` placeholder which will be replaced with the migration name provided to the command. The generated file will have the same extension as the template file, unless the [`--extension`](#-e---extension-ext) option is used. +The template can contain a `{{name}}` placeholder which will be replaced with the migration name provided to the command. The generated file will have the same extension as the template file, unless the [`--extension`](#-x---extension-ext) option is used. -### `-e`, `--extension ` +### `-x`, `--extension ` The extension to use for the migration file. Unless the [`--template`](#-t---template-path) option is also specified the file will be empty. +If both the `--template` and `--extension` options are specified, the extension will override the template file extension. + +**Example:** `--extension .sql` will generate a file with the `.sql` extension. + ### `-p`, `--plugin ` The generator plugin to use. The generator plugin is responsible for generating the migration filename and its contents. diff --git a/packages/cli/README.md b/packages/cli/README.md index 8c84c57..19f8c42 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -2,6 +2,8 @@ Emigrate is a tool for managing database migrations. It is designed to be simple yet support advanced setups, modular and extensible. +πŸ“– Read the [documentation](https://emigrate.dev) for more information! + ## Installation Install the Emigrate CLI in your project: @@ -21,7 +23,13 @@ bun add @emigrate/cli Create a new migration: ```bash -emigrate new -d migrations -e .js create some fancy table +npx emigrate new -d migrations create some fancy table +# or +pnpm emigrate new -d migrations create some fancy table +# or +yarn emigrate new -d migrations create some fancy table +# or +bunx --bun emigrate new -d migrations create some fancy table ``` Will create a new empty JavaScript migration file with the name "YYYYMMDDHHmmssuuu_create_some_fancy_table.js" in the `migrations` directory. diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 4ad8ace..ca31f55 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -123,7 +123,7 @@ const newMigration: Action = async (args) => { }, extension: { type: 'string', - short: 'e', + short: 'x', }, plugin: { type: 'string', @@ -157,7 +157,7 @@ Options: -p, --plugin The plugin(s) to use (can be specified multiple times) -t, --template A template file to use as contents for the new migration file (if the extension option is not provided the template file's extension will be used) - -e, --extension The extension to use for the new migration file + -x, --extension The extension to use for the new migration file (if no template or plugin is provided an empty migration file will be created with the given extension) --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) @@ -168,8 +168,8 @@ Examples: emigrate new -d src/migrations -t migration-template.js create users table emigrate new --directory ./migrations --plugin @emigrate/postgres create_users_table - emigrate new -d ./migrations -e .sql create_users_table - emigrate new -d ./migrations -t .migration-template -e .sql "drop some table" + emigrate new -d ./migrations -x .sql create_users_table + emigrate new -d ./migrations -t .migration-template -x .sql "drop some table" `; if (values.help) { From 9f91bdcfa08ebb76ac2aa1d5fea6f2dfedba4c29 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Wed, 20 Dec 2023 11:01:01 +0100 Subject: [PATCH 042/136] feat(cli): add the `--import` option for importing modules/packages before commands are run Can for instance be used to load environment variables using Dotenv --- .changeset/curvy-days-teach.md | 5 ++ docs/src/content/docs/commands/list.mdx | 6 ++ docs/src/content/docs/commands/remove.mdx | 6 ++ docs/src/content/docs/commands/up.mdx | 6 ++ packages/cli/package.json | 1 + packages/cli/src/cli.ts | 102 +++++++++++++++++----- packages/cli/src/commands/list.ts | 9 +- packages/cli/src/commands/new.ts | 16 ++-- packages/cli/src/commands/remove.ts | 8 +- packages/cli/src/commands/up.ts | 5 +- packages/cli/src/migration-runner.ts | 4 +- pnpm-lock.yaml | 3 + 12 files changed, 131 insertions(+), 40 deletions(-) create mode 100644 .changeset/curvy-days-teach.md diff --git a/.changeset/curvy-days-teach.md b/.changeset/curvy-days-teach.md new file mode 100644 index 0000000..cea91df --- /dev/null +++ b/.changeset/curvy-days-teach.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Add support for the `--import` option to import modules/packages before any command is run. This can for instance be used to load environment variables using the [dotenv](https://github.com/motdotla/dotenv) package with `--import dotenv/config`. diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx index 6120302..8e1fb92 100644 --- a/docs/src/content/docs/commands/list.mdx +++ b/docs/src/content/docs/commands/list.mdx @@ -62,6 +62,12 @@ Show command help and exit The directory where the migration files are located. The given path should be absolute or relative to the current working directory. +### `-i`, `--import ` + +A module to import before listing the migrations. This option can be specified multiple times. + +Can for instance be used to load environment variables using [dotenv](https://github.com/motdotla/dotenv) with `--import dotenv/config`. + ### `-s`, `--storage ` The storage plugin to use, which is responsible for where to store the migration history. diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index af17a52..421b7de 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -69,6 +69,12 @@ The directory where the migration files are located. The given path should be ab Force removal of the migration history entry even if the migration file does not exist or it's in a non-failed state. +### `-i`, `--import ` + +A module to import before remove the migration. This option can be specified multiple times. + +Can for instance be used to load environment variables using [dotenv](https://github.com/motdotla/dotenv) with `--import dotenv/config`. + ### `-s`, `--storage ` The storage plugin to use, which is responsible for where to store the migration history. diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index d431807..64db94c 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -68,6 +68,12 @@ List the pending migrations that would be run without actually running them The directory where the migration files are located. The given path should be absolute or relative to the current working directory. +### `-i`, `--import ` + +A module to import before running the migrations. This option can be specified multiple times. + +Can for instance be used to load environment variables using [dotenv](https://github.com/motdotla/dotenv) with `--import dotenv/config`. + ### `-s`, `--storage ` The storage plugin to use, which is responsible for where to store the migration history. diff --git a/packages/cli/package.json b/packages/cli/package.json index e2ead0c..3a0e7e4 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -49,6 +49,7 @@ "cosmiconfig": "8.3.6", "elegant-spinner": "3.0.0", "figures": "6.0.1", + "import-from-esm": "1.3.3", "is-interactive": "2.0.0", "log-update": "6.0.0", "pretty-ms": "8.0.0", diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index ca31f55..ca1b0d7 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -1,6 +1,7 @@ #!/usr/bin/env node --enable-source-maps import process from 'node:process'; import { parseArgs } from 'node:util'; +import importFromEsm from 'import-from-esm'; import { ShowUsageError } from './errors.js'; import { getConfig } from './get-config.js'; @@ -14,6 +15,12 @@ const useColors = (values: { color?: boolean; 'no-color'?: boolean }) => { return values.color; }; +const importAll = async (cwd: string, modules: string[]) => { + for await (const module of modules) { + await importFromEsm(cwd, module); + } +}; + const up: Action = async (args) => { const config = await getConfig('up'); const { values } = parseArgs({ @@ -27,6 +34,12 @@ const up: Action = async (args) => { type: 'string', short: 'd', }, + import: { + type: 'string', + short: 'i', + multiple: true, + default: [], + }, reporter: { type: 'string', short: 'r', @@ -60,20 +73,23 @@ Run all pending migrations Options: - -h, --help Show this help message and exit - -d, --directory The directory where the migration files are located (required) - -s, --storage The storage to use for where to store the migration history (required) - -p, --plugin The plugin(s) to use (can be specified multiple times) - -r, --reporter The reporter to use for reporting the migration progress - --dry List the pending migrations that would be run without actually running them - --color Force color output (this option is passed to the reporter) - --no-color Disable color output (this option is passed to the reporter) + -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before running the migrations (can be specified multiple times) + For example if you want to use Dotenv to load environment variables or when using TypeScript + -s, --storage The storage to use for where to store the migration history (required) + -p, --plugin The plugin(s) to use (can be specified multiple times) + -r, --reporter The reporter to use for reporting the migration progress + --dry List the pending migrations that would be run without actually running them + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) Examples: emigrate up --directory src/migrations -s fs emigrate up -d ./migrations --storage @emigrate/mysql emigrate up -d src/migrations -s postgres -r json --dry + emigrate up -d ./migrations -s mysql --import dotenv/config `; if (values.help) { @@ -82,12 +98,21 @@ Examples: return; } - const { directory = config.directory, storage = config.storage, reporter = config.reporter, dry } = values; + const cwd = process.cwd(); + const { + directory = config.directory, + storage = config.storage, + reporter = config.reporter, + dry, + import: imports = [], + } = values; const plugins = [...(config.plugins ?? []), ...(values.plugin ?? [])]; + await importAll(cwd, imports); + try { const { default: upCommand } = await import('./commands/up.js'); - process.exitCode = await upCommand({ storage, reporter, directory, plugins, dry, color: useColors(values) }); + process.exitCode = await upCommand({ storage, reporter, directory, plugins, cwd, dry, color: useColors(values) }); } catch (error) { if (error instanceof ShowUsageError) { console.error(error.message, '\n'); @@ -178,6 +203,7 @@ Examples: return; } + const cwd = process.cwd(); const { directory = config.directory, template = config.template, @@ -189,7 +215,7 @@ Examples: try { const { default: newCommand } = await import('./commands/new.js'); - await newCommand({ directory, template, plugins, extension, reporter, color: useColors(values) }, name); + await newCommand({ directory, template, plugins, extension, reporter, cwd, color: useColors(values) }, name); } catch (error) { if (error instanceof ShowUsageError) { console.error(error.message, '\n'); @@ -215,6 +241,12 @@ const list: Action = async (args) => { type: 'string', short: 'd', }, + import: { + type: 'string', + short: 'i', + multiple: true, + default: [], + }, reporter: { type: 'string', short: 'r', @@ -239,10 +271,12 @@ List all migrations and their status. This command does not run any migrations. Options: - -h, --help Show this help message and exit - -d, --directory The directory where the migration files are located (required) - -r, --reporter The reporter to use for reporting the migrations - -s, --storage The storage to use to get the migration history (required) + -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before listing the migrations (can be specified multiple times) + For example if you want to use Dotenv to load environment variables + -r, --reporter The reporter to use for reporting the migrations + -s, --storage The storage to use to get the migration history (required) --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) @@ -258,11 +292,19 @@ Examples: return; } - const { directory = config.directory, storage = config.storage, reporter = config.reporter } = values; + const cwd = process.cwd(); + const { + directory = config.directory, + storage = config.storage, + reporter = config.reporter, + import: imports = [], + } = values; + + await importAll(cwd, imports); try { const { default: listCommand } = await import('./commands/list.js'); - process.exitCode = await listCommand({ directory, storage, reporter, color: useColors(values) }); + process.exitCode = await listCommand({ directory, storage, reporter, cwd, color: useColors(values) }); } catch (error) { if (error instanceof ShowUsageError) { console.error(error.message, '\n'); @@ -288,6 +330,12 @@ const remove: Action = async (args) => { type: 'string', short: 'd', }, + import: { + type: 'string', + short: 'i', + multiple: true, + default: [], + }, force: { type: 'boolean', short: 'f', @@ -323,6 +371,8 @@ Options: -h, --help Show this help message and exit -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before removing the migration (can be specified multiple times) + For example if you want to use Dotenv to load environment variables -r, --reporter The reporter to use for reporting the removal process -s, --storage The storage to use to get the migration history (required) -f, --force Force removal of the migration history entry even if the migration file does not exist @@ -334,6 +384,7 @@ Examples: emigrate remove -d migrations -s fs 20231122120529381_some_migration_file.js emigrate remove --directory ./migrations --storage postgres 20231122120529381_some_migration_file.sql + emigrate remove -i dotenv/config -d ./migrations -s postgres 20231122120529381_some_migration_file.sql `; if (values.help) { @@ -342,12 +393,21 @@ Examples: return; } - const { directory = config.directory, storage = config.storage, reporter = config.reporter, force } = values; + const cwd = process.cwd(); + const { + directory = config.directory, + storage = config.storage, + reporter = config.reporter, + force, + import: imports = [], + } = values; + + await importAll(cwd, imports); try { const { default: removeCommand } = await import('./commands/remove.js'); process.exitCode = await removeCommand( - { directory, storage, reporter, force, color: useColors(values) }, + { directory, storage, reporter, force, cwd, color: useColors(values) }, positionals[0] ?? '', ); } catch (error) { @@ -428,9 +488,9 @@ try { await main(process.argv.slice(2)); } catch (error) { if (error instanceof Error) { - console.error(error.message); + console.error(error); if (error.cause instanceof Error) { - console.error(error.cause.stack); + console.error(error.cause); } } else { console.error(error); diff --git a/packages/cli/src/commands/list.ts b/packages/cli/src/commands/list.ts index 726351f..add45d0 100644 --- a/packages/cli/src/commands/list.ts +++ b/packages/cli/src/commands/list.ts @@ -1,4 +1,3 @@ -import process from 'node:process'; import { getOrLoadReporter, getOrLoadStorage } from '@emigrate/plugin-tools'; import { BadOptionError, MissingOptionError, StorageInitError, toError } from '../errors.js'; import { type Config } from '../types.js'; @@ -10,17 +9,21 @@ import { version } from '../get-package-info.js'; const lazyDefaultReporter = async () => import('../reporters/default.js'); +type ExtraFlags = { + cwd: string; +}; + export default async function listCommand({ directory, reporter: reporterConfig, storage: storageConfig, color, -}: Config) { + cwd, +}: Config & ExtraFlags) { if (!directory) { throw MissingOptionError.fromOption('directory'); } - const cwd = process.cwd(); const storagePlugin = await getOrLoadStorage([storageConfig]); if (!storagePlugin) { diff --git a/packages/cli/src/commands/new.ts b/packages/cli/src/commands/new.ts index bd4f682..81351b8 100644 --- a/packages/cli/src/commands/new.ts +++ b/packages/cli/src/commands/new.ts @@ -1,4 +1,4 @@ -import process from 'node:process'; +import { hrtime } from 'node:process'; import fs from 'node:fs/promises'; import path from 'node:path'; import { getTimestampPrefix, sanitizeMigrationName, getOrLoadPlugin, getOrLoadReporter } from '@emigrate/plugin-tools'; @@ -18,8 +18,12 @@ import { getDuration } from '../get-duration.js'; const lazyDefaultReporter = async () => import('../reporters/default.js'); +type ExtraFlags = { + cwd: string; +}; + export default async function newCommand( - { directory, template, reporter: reporterConfig, plugins = [], extension, color }: Config, + { directory, template, reporter: reporterConfig, plugins = [], cwd, extension, color }: Config & ExtraFlags, name: string, ) { if (!directory) { @@ -34,8 +38,6 @@ export default async function newCommand( throw MissingOptionError.fromOption(['extension', 'template', 'plugin']); } - const cwd = process.cwd(); - const reporter = await getOrLoadReporter([reporterConfig ?? lazyDefaultReporter]); if (!reporter) { @@ -47,14 +49,14 @@ export default async function newCommand( await reporter.onInit?.({ command: 'new', version, cwd, dry: false, directory, color }); - const start = process.hrtime(); + const start = hrtime(); let filename: string | undefined; let content: string | undefined; if (template) { const fs = await import('node:fs/promises'); - const templatePath = path.resolve(process.cwd(), template); + const templatePath = path.resolve(cwd, template); const fileExtension = path.extname(templatePath); try { @@ -98,7 +100,7 @@ export default async function newCommand( ); } - const directoryPath = path.resolve(process.cwd(), directory); + const directoryPath = path.resolve(cwd, directory); const filePath = path.resolve(directoryPath, filename); const migration: MigrationMetadata = { diff --git a/packages/cli/src/commands/remove.ts b/packages/cli/src/commands/remove.ts index b74ecaf..cd2a42d 100644 --- a/packages/cli/src/commands/remove.ts +++ b/packages/cli/src/commands/remove.ts @@ -16,13 +16,14 @@ import { exec } from '../exec.js'; import { version } from '../get-package-info.js'; type ExtraFlags = { + cwd: string; force?: boolean; }; const lazyDefaultReporter = async () => import('../reporters/default.js'); export default async function removeCommand( - { directory, reporter: reporterConfig, storage: storageConfig, color, force = false }: Config & ExtraFlags, + { directory, reporter: reporterConfig, storage: storageConfig, color, cwd, force = false }: Config & ExtraFlags, name: string, ) { if (!directory) { @@ -33,7 +34,6 @@ export default async function removeCommand( throw MissingArgumentsError.fromArgument('name'); } - const cwd = process.cwd(); const storagePlugin = await getOrLoadStorage([storageConfig]); if (!storagePlugin) { @@ -49,6 +49,8 @@ export default async function removeCommand( ); } + await reporter.onInit?.({ command: 'remove', version, cwd, dry: false, directory, color }); + const [storage, storageError] = await exec(async () => storagePlugin.initializeStorage()); if (storageError) { @@ -57,8 +59,6 @@ export default async function removeCommand( return 1; } - await reporter.onInit?.({ command: 'remove', version, cwd, dry: false, directory, color }); - const [migrationFile, fileError] = await exec(async () => getMigration(cwd, directory, name, !force)); if (fileError) { diff --git a/packages/cli/src/commands/up.ts b/packages/cli/src/commands/up.ts index 2423286..c260c46 100644 --- a/packages/cli/src/commands/up.ts +++ b/packages/cli/src/commands/up.ts @@ -1,4 +1,3 @@ -import process from 'node:process'; import { getOrLoadPlugins, getOrLoadReporter, getOrLoadStorage } from '@emigrate/plugin-tools'; import { isFinishedMigration, type LoaderPlugin } from '@emigrate/types'; import { BadOptionError, MigrationLoadError, MissingOptionError, StorageInitError, toError } from '../errors.js'; @@ -13,7 +12,7 @@ import { arrayFromAsync } from '../array-from-async.js'; import { version } from '../get-package-info.js'; type ExtraFlags = { - cwd?: string; + cwd: string; dry?: boolean; getMigrations?: GetMigrationsFunction; }; @@ -28,7 +27,7 @@ export default async function upCommand({ color, dry = false, plugins = [], - cwd = process.cwd(), + cwd, getMigrations, }: Config & ExtraFlags): Promise { if (!directory) { diff --git a/packages/cli/src/migration-runner.ts b/packages/cli/src/migration-runner.ts index a8914e2..8cdf88c 100644 --- a/packages/cli/src/migration-runner.ts +++ b/packages/cli/src/migration-runner.ts @@ -1,4 +1,4 @@ -import process from 'node:process'; +import { hrtime } from 'node:process'; import { isFinishedMigration, isFailedMigration, @@ -123,7 +123,7 @@ export const migrationRunner = async ({ await reporter.onMigrationStart?.(migration); - const start = process.hrtime(); + const start = hrtime(); const [, migrationError] = await exec(async () => execute(migration)); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 08e785c..daf748b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -89,6 +89,9 @@ importers: figures: specifier: 6.0.1 version: 6.0.1 + import-from-esm: + specifier: 1.3.3 + version: 1.3.3 is-interactive: specifier: 2.0.0 version: 2.0.0 From 59eb90b8cb3d1f2b3c3792ee0c3d55ad03ff4e58 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 20 Dec 2023 10:09:03 +0000 Subject: [PATCH 043/136] chore(release): version packages --- .changeset/curvy-days-teach.md | 5 ----- .changeset/funny-ladybugs-cheat.md | 6 ------ .changeset/sharp-eggs-poke.md | 5 ----- packages/cli/CHANGELOG.md | 14 ++++++++++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 8 ++++++++ packages/mysql/package.json | 2 +- packages/plugin-generate-js/CHANGELOG.md | 8 ++++++++ packages/plugin-generate-js/package.json | 2 +- packages/plugin-tools/CHANGELOG.md | 7 +++++++ packages/plugin-tools/package.json | 2 +- packages/postgres/CHANGELOG.md | 8 ++++++++ packages/postgres/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 7 +++++++ packages/reporter-pino/package.json | 2 +- packages/storage-fs/CHANGELOG.md | 7 +++++++ packages/storage-fs/package.json | 2 +- packages/types/CHANGELOG.md | 6 ++++++ packages/types/package.json | 2 +- 19 files changed, 73 insertions(+), 24 deletions(-) delete mode 100644 .changeset/curvy-days-teach.md delete mode 100644 .changeset/funny-ladybugs-cheat.md delete mode 100644 .changeset/sharp-eggs-poke.md diff --git a/.changeset/curvy-days-teach.md b/.changeset/curvy-days-teach.md deleted file mode 100644 index cea91df..0000000 --- a/.changeset/curvy-days-teach.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Add support for the `--import` option to import modules/packages before any command is run. This can for instance be used to load environment variables using the [dotenv](https://github.com/motdotla/dotenv) package with `--import dotenv/config`. diff --git a/.changeset/funny-ladybugs-cheat.md b/.changeset/funny-ladybugs-cheat.md deleted file mode 100644 index 4d48eb7..0000000 --- a/.changeset/funny-ladybugs-cheat.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@emigrate/types': minor -'@emigrate/cli': minor ---- - -Add `color` option to the CLI and configuration file, which is used to force enable/disable color output from the reporter (the option is passed to the chosen reporter which should respect it) diff --git a/.changeset/sharp-eggs-poke.md b/.changeset/sharp-eggs-poke.md deleted file mode 100644 index cc6ae22..0000000 --- a/.changeset/sharp-eggs-poke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -BREAKING CHANGE: Rename the `extension` short CLI option from `-e` to `-x` in preparation for an upcoming option that will take its place diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index a24ce1c..e82bbf6 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,19 @@ # @emigrate/cli +## 0.12.0 + +### Minor Changes + +- 9f91bdc: Add support for the `--import` option to import modules/packages before any command is run. This can for instance be used to load environment variables using the [dotenv](https://github.com/motdotla/dotenv) package with `--import dotenv/config`. +- f9a16d8: Add `color` option to the CLI and configuration file, which is used to force enable/disable color output from the reporter (the option is passed to the chosen reporter which should respect it) +- e6e4433: BREAKING CHANGE: Rename the `extension` short CLI option from `-e` to `-x` in preparation for an upcoming option that will take its place + +### Patch Changes + +- Updated dependencies [f9a16d8] + - @emigrate/types@0.10.0 + - @emigrate/plugin-tools@0.9.3 + ## 0.11.2 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 3a0e7e4..ed00390 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.11.2", + "version": "0.12.0", "publishConfig": { "access": "public" }, diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index bfcfe8a..22016d4 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/mysql +## 0.2.3 + +### Patch Changes + +- Updated dependencies [f9a16d8] + - @emigrate/types@0.10.0 + - @emigrate/plugin-tools@0.9.3 + ## 0.2.2 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 5b4a2f4..d62be01 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.2.2", + "version": "0.2.3", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-generate-js/CHANGELOG.md b/packages/plugin-generate-js/CHANGELOG.md index 728cf02..9464f5f 100644 --- a/packages/plugin-generate-js/CHANGELOG.md +++ b/packages/plugin-generate-js/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-generate-js +## 0.3.3 + +### Patch Changes + +- Updated dependencies [f9a16d8] + - @emigrate/types@0.10.0 + - @emigrate/plugin-tools@0.9.3 + ## 0.3.2 ### Patch Changes diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index 90a8d11..c9fc1d5 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-generate-js", - "version": "0.3.2", + "version": "0.3.3", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-tools/CHANGELOG.md b/packages/plugin-tools/CHANGELOG.md index ea70371..67cf09f 100644 --- a/packages/plugin-tools/CHANGELOG.md +++ b/packages/plugin-tools/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/plugin-tools +## 0.9.3 + +### Patch Changes + +- Updated dependencies [f9a16d8] + - @emigrate/types@0.10.0 + ## 0.9.2 ### Patch Changes diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index cc698b9..28ea06b 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-tools", - "version": "0.9.2", + "version": "0.9.3", "publishConfig": { "access": "public" }, diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index beb36c3..413f87d 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/postgres +## 0.2.3 + +### Patch Changes + +- Updated dependencies [f9a16d8] + - @emigrate/types@0.10.0 + - @emigrate/plugin-tools@0.9.3 + ## 0.2.2 ### Patch Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 3f48d05..1a08f90 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.2.2", + "version": "0.2.3", "publishConfig": { "access": "public" }, diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index c8c28ee..a62e206 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/reporter-pino +## 0.4.3 + +### Patch Changes + +- Updated dependencies [f9a16d8] + - @emigrate/types@0.10.0 + ## 0.4.2 ### Patch Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 493508d..0dfd986 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.4.2", + "version": "0.4.3", "publishConfig": { "access": "public" }, diff --git a/packages/storage-fs/CHANGELOG.md b/packages/storage-fs/CHANGELOG.md index 13fedf4..70927ed 100644 --- a/packages/storage-fs/CHANGELOG.md +++ b/packages/storage-fs/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/storage-fs +## 0.4.3 + +### Patch Changes + +- Updated dependencies [f9a16d8] + - @emigrate/types@0.10.0 + ## 0.4.2 ### Patch Changes diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index f180395..1b54191 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/storage-fs", - "version": "0.4.2", + "version": "0.4.3", "publishConfig": { "access": "public" }, diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 5df7e88..4fdf48a 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/types +## 0.10.0 + +### Minor Changes + +- f9a16d8: Add `color` option to the CLI and configuration file, which is used to force enable/disable color output from the reporter (the option is passed to the chosen reporter which should respect it) + ## 0.9.1 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 5c9029c..ec20393 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/types", - "version": "0.9.1", + "version": "0.10.0", "publishConfig": { "access": "public" }, From 9a605a85f125c2f342f38a5881318c67bffbf1fc Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Wed, 20 Dec 2023 12:06:20 +0100 Subject: [PATCH 044/136] feat: add support for TypeScript migration files And add a guide to the documentation on how to set it up for NodeJS --- .changeset/fresh-coins-teach.md | 5 + .changeset/tough-snakes-float.md | 5 + docs/astro.config.mjs | 9 ++ docs/src/content/docs/commands/up.mdx | 3 +- docs/src/content/docs/guides/example.md | 11 -- docs/src/content/docs/guides/typescript.mdx | 132 ++++++++++++++++++ .../content/docs/plugins/loaders/default.mdx | 10 +- packages/cli/src/plugin-loader-js.ts | 2 +- 8 files changed, 163 insertions(+), 14 deletions(-) create mode 100644 .changeset/fresh-coins-teach.md create mode 100644 .changeset/tough-snakes-float.md delete mode 100644 docs/src/content/docs/guides/example.md create mode 100644 docs/src/content/docs/guides/typescript.mdx diff --git a/.changeset/fresh-coins-teach.md b/.changeset/fresh-coins-teach.md new file mode 100644 index 0000000..c501941 --- /dev/null +++ b/.changeset/fresh-coins-teach.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Add support for loading TypeScript migration files in the default loader diff --git a/.changeset/tough-snakes-float.md b/.changeset/tough-snakes-float.md new file mode 100644 index 0000000..a84cd4e --- /dev/null +++ b/.changeset/tough-snakes-float.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Add a guide for running migration files written in TypeScript to the documentation diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 6d0a145..063a49e 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -98,6 +98,15 @@ export default defineConfig({ }, ], }, + { + label: 'Guides', + items: [ + { + label: 'Using TypeScript', + link: '/guides/typescript/', + }, + ], + }, { label: 'Plugins', items: [ diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 64db94c..2c2dd8a 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -72,7 +72,8 @@ The directory where the migration files are located. The given path should be ab A module to import before running the migrations. This option can be specified multiple times. -Can for instance be used to load environment variables using [dotenv](https://github.com/motdotla/dotenv) with `--import dotenv/config`. +Can for instance be used to load environment variables using [dotenv](https://github.com/motdotla/dotenv) with `--import dotenv/config`, +or for running migrations in NodeJS written in TypeScript with [tsx](https://github.com/privatenumber/tsx) (`--import tsx`), see the TypeScript guide for more information. ### `-s`, `--storage ` diff --git a/docs/src/content/docs/guides/example.md b/docs/src/content/docs/guides/example.md deleted file mode 100644 index ebd0f3b..0000000 --- a/docs/src/content/docs/guides/example.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Example Guide -description: A guide in my new Starlight docs site. ---- - -Guides lead a user through a specific task they want to accomplish, often with a sequence of steps. -Writing a good guide requires thinking about what your users are trying to do. - -## Further reading - -- Read [about how-to guides](https://diataxis.fr/how-to-guides/) in the DiΓ‘taxis framework diff --git a/docs/src/content/docs/guides/typescript.mdx b/docs/src/content/docs/guides/typescript.mdx new file mode 100644 index 0000000..8e580a4 --- /dev/null +++ b/docs/src/content/docs/guides/typescript.mdx @@ -0,0 +1,132 @@ +--- +title: Using TypeScript +description: A guide on how to support migration files written in TypeScript +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; + +:::tip[Using Bun or Deno?] +If you are using [Bun](https://bun.sh) or [Deno](https://deno.land) you are already good to go as they both support TypeScript out of the box. +::: + +You have at least the two following options to support running TypeScript migration files in NodeJS. + +## Using `tsx` + +If you want to be able to write and run migration files written in TypeScript the easiest way is to install the [`tsx`](https://github.com/privatenumber/tsx) package. + +### Installing `tsx` + + + + ```bash + npm install tsx + ``` + + + ```bash + pnpm add tsx + ``` + + + ```bash + yarn add tsx + ``` + + + +:::note +You must install `tsx` as an ordinary dependency, not as a dev dependency, +in case you are pruning your development dependencies before deploying your application (which you should). +::: + +### Loading TypeScript migrations + +After installing `tsx` you can load it in two ways. + +#### Via CLI + +Using the `--import` flag you can load `tsx` before running your migration files. + + + + ```bash + npx emigrate up --import tsx + ``` + + + ```bash + pnpm emigrate up --import tsx + ``` + + + ```bash + yarn emigrate up --import tsx + ``` + + + +#### Via configuration file + +You can also directly import `tsx` in your configuration file. + +```js title="emigrate.config.js" {1} +import 'tsx'; + +export default { + // ... +}; +``` + +Then you can run your migration files as usual: + + + + ```bash + npx emigrate up + ``` + + + ```bash + pnpm emigrate up + ``` + + + ```bash + yarn emigrate up + ``` + + + +## Building TypeScript migrations + +If you don't want to have `tsx` (or similar) as a dependency included in your production environment then +you can build your TypeScript migration files using the [`tsc`](https://www.typescriptlang.org/docs/handbook/compiler-options.html) compiler or +some other tool that are already part of your build process when transpiling your TypeScript code to JavaScript. + +Assume that you have all of your migrations in a `src/migrations` directory and you have built them to a `dist/migrations` directory. + +Then you can run your migration files by pointing to the `dist/migrations` directory: + + + + ```bash + npx emigrate up -d dist/migrations + ``` + + + ```bash + pnpm emigrate up -d dist/migrations + ``` + + + ```bash + yarn emigrate up -d dist/migrations + ``` + + + +:::note +If you're mixing languages for your migration files, e.g. you have both `.sql` and `.ts` files in `src/migrations`, make sure that they are all copied to the destination directory if not part of the TypeScript build process. +::: diff --git a/docs/src/content/docs/plugins/loaders/default.mdx b/docs/src/content/docs/plugins/loaders/default.mdx index d7c32b3..2c881bc 100644 --- a/docs/src/content/docs/plugins/loaders/default.mdx +++ b/docs/src/content/docs/plugins/loaders/default.mdx @@ -3,8 +3,9 @@ title: Default Loader Plugin --- import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; -The default loader plugin is responsible for importing migration files written in JavaScript. +The default loader plugin is responsible for importing migration files written in JavaScript or TypeScript. Migration files can be written using either CommonJS or ES Modules. ## Supported extensions @@ -14,6 +15,13 @@ The default loader plugin supports the following extensions: * `.js` - either CommonJS or ES Modules depending on your package.json's [`type` field](https://nodejs.org/api/packages.html#type) * `.cjs` - CommonJS * `.mjs` - ES Modules +* `.ts` - either CommonJS or ES Modules written in TypeScript +* `.cts` - CommonJS written in TypeScript +* `.mts` - ES Modules written in TypeScript + +:::note +To enable TypeScript support in NodeJS you also need to follow the TypeScript setup guide. +::: ## Supported exports diff --git a/packages/cli/src/plugin-loader-js.ts b/packages/cli/src/plugin-loader-js.ts index 3a502ac..1f044fe 100644 --- a/packages/cli/src/plugin-loader-js.ts +++ b/packages/cli/src/plugin-loader-js.ts @@ -17,7 +17,7 @@ const promisifyIfNeeded = (fn: T) => { }; const loaderJs: LoaderPlugin = { - loadableExtensions: ['.js', '.cjs', '.mjs'], + loadableExtensions: ['.js', '.cjs', '.mjs', '.ts', '.cts', '.mts'], async loadMigration(migration) { const migrationModule: unknown = await import(migration.filePath); From 3c54917c3532b41b45d34eb38642d40981c77852 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 20 Dec 2023 14:27:33 +0000 Subject: [PATCH 045/136] chore(release): version packages --- .changeset/fresh-coins-teach.md | 5 ----- .changeset/tough-snakes-float.md | 5 ----- packages/cli/CHANGELOG.md | 7 +++++++ packages/cli/package.json | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) delete mode 100644 .changeset/fresh-coins-teach.md delete mode 100644 .changeset/tough-snakes-float.md diff --git a/.changeset/fresh-coins-teach.md b/.changeset/fresh-coins-teach.md deleted file mode 100644 index c501941..0000000 --- a/.changeset/fresh-coins-teach.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Add support for loading TypeScript migration files in the default loader diff --git a/.changeset/tough-snakes-float.md b/.changeset/tough-snakes-float.md deleted file mode 100644 index a84cd4e..0000000 --- a/.changeset/tough-snakes-float.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Add a guide for running migration files written in TypeScript to the documentation diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index e82bbf6..187a41d 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/cli +## 0.13.0 + +### Minor Changes + +- 9a605a8: Add support for loading TypeScript migration files in the default loader +- 9a605a8: Add a guide for running migration files written in TypeScript to the documentation + ## 0.12.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index ed00390..1e9eff1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.12.0", + "version": "0.13.0", "publishConfig": { "access": "public" }, From a130248687fd36a77785fd41b4ce0e25af6b595e Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 8 Jan 2024 10:19:37 +0100 Subject: [PATCH 046/136] docs: update loader plugin intro after adding TypeScript support --- docs/src/content/docs/plugins/loaders/index.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/content/docs/plugins/loaders/index.mdx b/docs/src/content/docs/plugins/loaders/index.mdx index bca094b..01101eb 100644 --- a/docs/src/content/docs/plugins/loaders/index.mdx +++ b/docs/src/content/docs/plugins/loaders/index.mdx @@ -7,7 +7,7 @@ import Link from '@components/Link.astro'; Loader plugins are used to transform any file type into a JavaScript function that will be called when the migration file is executed. -Out of the box, Emigrate supports the following file extensions: `.js`, `.cjs` and `.mjs`. And both CommonJS and ES Modules are supported. See the Default Loader for more information. +Out of the box, Emigrate supports the following file extensions: `.js`, `.cjs`, `.mjs`, `.ts`, `.cts` and `.mts`. And both CommonJS and ES Modules are supported. See the Default Loader for more information. ## Using a loader plugin @@ -21,14 +21,14 @@ Or set it up in your configuration file, see default loader will be used for all other file types, and doesn't need to be specified. ::: ## Available Loader Plugins - + From 0cce84743d3f855c6b40513a6d5c606955d0131a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jan 2024 19:57:55 +0000 Subject: [PATCH 047/136] chore(deps): bump actions/checkout from 3 to 4 Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 9a3a0a4..fd1fd6d 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -23,7 +23,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout your repository using git - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Show vars run: | echo $ASTRO_SITE From a5264ab3d423171cce73da2b6bcf42966ac17c6c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 07:53:22 +0000 Subject: [PATCH 048/136] chore(deps): bump lint-staged from 15.1.0 to 15.2.0 Bumps [lint-staged](https://github.com/okonet/lint-staged) from 15.1.0 to 15.2.0. - [Release notes](https://github.com/okonet/lint-staged/releases) - [Changelog](https://github.com/lint-staged/lint-staged/blob/master/CHANGELOG.md) - [Commits](https://github.com/okonet/lint-staged/compare/v15.1.0...v15.2.0) --- updated-dependencies: - dependency-name: lint-staged dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 55 +++++++++++++++----------------------------------- 2 files changed, 17 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index c1bd171..d0b379f 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "@types/node": "20.10.4", "glob": "10.3.10", "husky": "8.0.3", - "lint-staged": "15.1.0", + "lint-staged": "15.2.0", "npm-run-all": "4.1.5", "prettier": "3.1.1", "tsx": "4.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index daf748b..a36c2a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,8 +27,8 @@ importers: specifier: 8.0.3 version: 8.0.3 lint-staged: - specifier: 15.1.0 - version: 15.1.0 + specifier: 15.2.0 + version: 15.2.0 npm-run-all: specifier: 4.1.5 version: 4.1.5 @@ -2207,13 +2207,6 @@ packages: type-fest: 0.21.3 dev: false - /ansi-escapes@5.0.0: - resolution: {integrity: sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==} - engines: {node: '>=12'} - dependencies: - type-fest: 1.4.0 - dev: false - /ansi-escapes@6.2.0: resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} engines: {node: '>=14.16'} @@ -2796,12 +2789,12 @@ packages: engines: {node: '>=6'} dev: false - /cli-truncate@3.1.0: - resolution: {integrity: sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} dependencies: slice-ansi: 5.0.0 - string-width: 5.1.2 + string-width: 7.0.0 dev: false /cliui@6.0.0: @@ -5419,8 +5412,8 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: false - /lint-staged@15.1.0: - resolution: {integrity: sha512-ZPKXWHVlL7uwVpy8OZ7YQjYDAuO5X4kMh0XgZvPNxLcCCngd0PO5jKQyy3+s4TL2EnHoIXIzP1422f/l3nZKMw==} + /lint-staged@15.2.0: + resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} engines: {node: '>=18.12.0'} hasBin: true dependencies: @@ -5428,8 +5421,8 @@ packages: commander: 11.1.0 debug: 4.3.4 execa: 8.0.1 - lilconfig: 2.1.0 - listr2: 7.0.2 + lilconfig: 3.0.0 + listr2: 8.0.0 micromatch: 4.0.5 pidtree: 0.6.0 string-argv: 0.3.2 @@ -5438,16 +5431,16 @@ packages: - supports-color dev: false - /listr2@7.0.2: - resolution: {integrity: sha512-rJysbR9GKIalhTbVL2tYbF2hVyDnrf7pFUZBwjPaMIdadYHmeT+EVi/Bu3qd7ETQPahTotg2WRCatXwRBW554g==} - engines: {node: '>=16.0.0'} + /listr2@8.0.0: + resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} + engines: {node: '>=18.0.0'} dependencies: - cli-truncate: 3.1.0 + cli-truncate: 4.0.0 colorette: 2.0.20 eventemitter3: 5.0.1 - log-update: 5.0.1 + log-update: 6.0.0 rfdc: 1.3.0 - wrap-ansi: 8.1.0 + wrap-ansi: 9.0.0 dev: false /load-json-file@4.0.0: @@ -5560,17 +5553,6 @@ packages: is-unicode-supported: 1.3.0 dev: false - /log-update@5.0.1: - resolution: {integrity: sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - ansi-escapes: 5.0.0 - cli-cursor: 4.0.0 - slice-ansi: 5.0.0 - strip-ansi: 7.1.0 - wrap-ansi: 8.1.0 - dev: false - /log-update@6.0.0: resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} engines: {node: '>=18'} @@ -8520,11 +8502,6 @@ packages: engines: {node: '>=8'} dev: false - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: false - /type-fest@2.19.0: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} From af83bf6d7fec6628f0f8a4e1f761d5adc217395a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 08:51:46 +0000 Subject: [PATCH 049/136] chore(deps): bump tsx from 4.6.2 to 4.7.0 Bumps [tsx](https://github.com/privatenumber/tsx) from 4.6.2 to 4.7.0. - [Release notes](https://github.com/privatenumber/tsx/releases) - [Changelog](https://github.com/privatenumber/tsx/blob/develop/release.config.cjs) - [Commits](https://github.com/privatenumber/tsx/compare/v4.6.2...v4.7.0) --- updated-dependencies: - dependency-name: tsx dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 156 ++++++++++++++++++++++++++----------------------- 2 files changed, 84 insertions(+), 74 deletions(-) diff --git a/package.json b/package.json index d0b379f..4beaf20 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "lint-staged": "15.2.0", "npm-run-all": "4.1.5", "prettier": "3.1.1", - "tsx": "4.6.2", + "tsx": "4.7.0", "turbo": "1.10.16", "typescript": "5.2.2", "xo": "0.56.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a36c2a3..da8ea85 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,8 @@ importers: specifier: 3.1.1 version: 3.1.1 tsx: - specifier: 4.6.2 - version: 4.6.2 + specifier: 4.7.0 + version: 4.7.0 turbo: specifier: 1.10.16 version: 1.10.16 @@ -943,8 +943,17 @@ packages: engines: {node: '>=10'} dev: false - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + /@esbuild/aix-ppc64@0.19.11: + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.19.11: + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -961,8 +970,8 @@ packages: dev: false optional: true - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + /@esbuild/android-arm@0.19.11: + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -979,8 +988,8 @@ packages: dev: false optional: true - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + /@esbuild/android-x64@0.19.11: + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -997,8 +1006,8 @@ packages: dev: false optional: true - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + /@esbuild/darwin-arm64@0.19.11: + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -1015,8 +1024,8 @@ packages: dev: false optional: true - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + /@esbuild/darwin-x64@0.19.11: + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -1033,8 +1042,8 @@ packages: dev: false optional: true - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + /@esbuild/freebsd-arm64@0.19.11: + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -1051,8 +1060,8 @@ packages: dev: false optional: true - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + /@esbuild/freebsd-x64@0.19.11: + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -1069,8 +1078,8 @@ packages: dev: false optional: true - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + /@esbuild/linux-arm64@0.19.11: + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -1087,8 +1096,8 @@ packages: dev: false optional: true - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + /@esbuild/linux-arm@0.19.11: + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -1105,8 +1114,8 @@ packages: dev: false optional: true - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + /@esbuild/linux-ia32@0.19.11: + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -1123,8 +1132,8 @@ packages: dev: false optional: true - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + /@esbuild/linux-loong64@0.19.11: + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -1141,8 +1150,8 @@ packages: dev: false optional: true - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + /@esbuild/linux-mips64el@0.19.11: + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -1159,8 +1168,8 @@ packages: dev: false optional: true - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + /@esbuild/linux-ppc64@0.19.11: + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -1177,8 +1186,8 @@ packages: dev: false optional: true - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + /@esbuild/linux-riscv64@0.19.11: + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -1195,8 +1204,8 @@ packages: dev: false optional: true - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + /@esbuild/linux-s390x@0.19.11: + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1213,8 +1222,8 @@ packages: dev: false optional: true - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + /@esbuild/linux-x64@0.19.11: + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1231,8 +1240,8 @@ packages: dev: false optional: true - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + /@esbuild/netbsd-x64@0.19.11: + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1249,8 +1258,8 @@ packages: dev: false optional: true - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + /@esbuild/openbsd-x64@0.19.11: + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1267,8 +1276,8 @@ packages: dev: false optional: true - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + /@esbuild/sunos-x64@0.19.11: + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1285,8 +1294,8 @@ packages: dev: false optional: true - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + /@esbuild/win32-arm64@0.19.11: + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1303,8 +1312,8 @@ packages: dev: false optional: true - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + /@esbuild/win32-ia32@0.19.11: + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1321,8 +1330,8 @@ packages: dev: false optional: true - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + /@esbuild/win32-x64@0.19.11: + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -3399,34 +3408,35 @@ packages: is-symbol: 1.0.4 dev: false - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + /esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 + '@esbuild/aix-ppc64': 0.19.11 + '@esbuild/android-arm': 0.19.11 + '@esbuild/android-arm64': 0.19.11 + '@esbuild/android-x64': 0.19.11 + '@esbuild/darwin-arm64': 0.19.11 + '@esbuild/darwin-x64': 0.19.11 + '@esbuild/freebsd-arm64': 0.19.11 + '@esbuild/freebsd-x64': 0.19.11 + '@esbuild/linux-arm': 0.19.11 + '@esbuild/linux-arm64': 0.19.11 + '@esbuild/linux-ia32': 0.19.11 + '@esbuild/linux-loong64': 0.19.11 + '@esbuild/linux-mips64el': 0.19.11 + '@esbuild/linux-ppc64': 0.19.11 + '@esbuild/linux-riscv64': 0.19.11 + '@esbuild/linux-s390x': 0.19.11 + '@esbuild/linux-x64': 0.19.11 + '@esbuild/netbsd-x64': 0.19.11 + '@esbuild/openbsd-x64': 0.19.11 + '@esbuild/sunos-x64': 0.19.11 + '@esbuild/win32-arm64': 0.19.11 + '@esbuild/win32-ia32': 0.19.11 + '@esbuild/win32-x64': 0.19.11 dev: false /esbuild@0.19.9: @@ -8374,12 +8384,12 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: false - /tsx@4.6.2: - resolution: {integrity: sha512-QPpBdJo+ZDtqZgAnq86iY/PD2KYCUPSUGIunHdGwyII99GKH+f3z3FZ8XNFLSGQIA4I365ui8wnQpl8OKLqcsg==} + /tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} engines: {node: '>=18.0.0'} hasBin: true dependencies: - esbuild: 0.18.20 + esbuild: 0.19.11 get-tsconfig: 4.7.2 optionalDependencies: fsevents: 2.3.3 From 9bfd0e44c39858f0d768372305f8488667093dac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 08:58:06 +0000 Subject: [PATCH 050/136] chore(deps): bump typescript from 5.2.2 to 5.3.3 Bumps [typescript](https://github.com/Microsoft/TypeScript) from 5.2.2 to 5.3.3. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v5.2.2...v5.3.3) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 114 ++++++++++++++++++++++++------------------------- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/package.json b/package.json index 4beaf20..e195014 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,7 @@ "prettier": "3.1.1", "tsx": "4.7.0", "turbo": "1.10.16", - "typescript": "5.2.2", + "typescript": "5.3.3", "xo": "0.56.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index da8ea85..f44a527 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 2.27.1 '@commitlint/cli': specifier: 18.4.3 - version: 18.4.3(typescript@5.2.2) + version: 18.4.3(typescript@5.3.3) '@commitlint/config-conventional': specifier: 18.4.3 version: 18.4.3 @@ -42,8 +42,8 @@ importers: specifier: 1.10.16 version: 1.10.16 typescript: - specifier: 5.2.2 - version: 5.2.2 + specifier: 5.3.3 + version: 5.3.3 xo: specifier: 0.56.0 version: 0.56.0(webpack@5.89.0) @@ -61,7 +61,7 @@ importers: version: 5.0.3(astro@4.0.5)(tailwindcss@3.3.6) astro: specifier: ^4.0.1 - version: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + version: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) sharp: specifier: ^0.32.5 version: 0.32.6 @@ -82,7 +82,7 @@ importers: version: 2.0.3 cosmiconfig: specifier: 8.3.6 - version: 8.3.6(typescript@5.2.2) + version: 8.3.6(typescript@5.3.3) elegant-spinner: specifier: 3.0.0 version: 3.0.0 @@ -256,7 +256,7 @@ packages: '@astrojs/markdown-remark': 4.0.1 '@mdx-js/mdx': 3.0.0 acorn: 8.11.2 - astro: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) es-module-lexer: 1.4.1 estree-util-visit: 2.0.0 github-slugger: 2.0.0 @@ -309,7 +309,7 @@ packages: '@pagefind/default-ui': 1.0.4 '@types/hast': 3.0.3 '@types/mdast': 4.0.3 - astro: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) astro-expressive-code: 0.29.4(astro@4.0.5) bcp-47: 2.1.0 execa: 8.0.1 @@ -333,7 +333,7 @@ packages: astro: ^3.0.0 || ^4.0.0 tailwindcss: ^3.0.24 dependencies: - astro: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) autoprefixer: 10.4.16(postcss@8.4.32) postcss: 8.4.32 postcss-load-config: 4.0.2(postcss@8.4.32) @@ -774,14 +774,14 @@ packages: prettier: 2.8.8 dev: false - /@commitlint/cli@18.4.3(typescript@5.2.2): + /@commitlint/cli@18.4.3(typescript@5.3.3): resolution: {integrity: sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww==} engines: {node: '>=v18'} hasBin: true dependencies: '@commitlint/format': 18.4.3 '@commitlint/lint': 18.4.3 - '@commitlint/load': 18.4.3(typescript@5.2.2) + '@commitlint/load': 18.4.3(typescript@5.3.3) '@commitlint/read': 18.4.3 '@commitlint/types': 18.4.3 execa: 5.1.1 @@ -851,7 +851,7 @@ packages: '@commitlint/types': 18.4.3 dev: false - /@commitlint/load@18.4.3(typescript@5.2.2): + /@commitlint/load@18.4.3(typescript@5.3.3): resolution: {integrity: sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==} engines: {node: '>=v18'} dependencies: @@ -861,8 +861,8 @@ packages: '@commitlint/types': 18.4.3 '@types/node': 18.19.3 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.2.2) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.2.2) + cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.3.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -1886,7 +1886,7 @@ packages: resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} dev: false - /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3): resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1898,10 +1898,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.3.3) '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4 eslint: 8.53.0 @@ -1909,13 +1909,13 @@ packages: ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.3.3): resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1927,11 +1927,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.10.0 '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.3.3) '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4 eslint: 8.53.0 - typescript: 5.2.2 + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false @@ -1944,7 +1944,7 @@ packages: '@typescript-eslint/visitor-keys': 6.10.0 dev: false - /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.3.3): resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1954,12 +1954,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.3.3) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.3.3) debug: 4.3.4 eslint: 8.53.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false @@ -1969,7 +1969,7 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: false - /@typescript-eslint/typescript-estree@6.10.0(typescript@5.2.2): + /@typescript-eslint/typescript-estree@6.10.0(typescript@5.3.3): resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1984,13 +1984,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 transitivePeerDependencies: - supports-color dev: false - /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.2.2): + /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.3.3): resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -2001,7 +2001,7 @@ packages: '@types/semver': 7.5.5 '@typescript-eslint/scope-manager': 6.10.0 '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.3.3) eslint: 8.53.0 semver: 7.5.4 transitivePeerDependencies: @@ -2380,11 +2380,11 @@ packages: peerDependencies: astro: ^3.0.0-beta || ^4.0.0-beta dependencies: - astro: 4.0.5(@types/node@20.10.4)(typescript@5.2.2) + astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) remark-expressive-code: 0.29.4 dev: false - /astro@4.0.5(@types/node@20.10.4)(typescript@5.2.2): + /astro@4.0.5(@types/node@20.10.4)(typescript@5.3.3): resolution: {integrity: sha512-OTiTEiXYdXTkVJXNNKIWdYG1z2wpTST+92Qcldm36x91Pe4fKpLxeuRloy5cW175oHi8lvXytgG3Gl3VBP18RQ==} engines: {node: '>=18.14.1', npm: '>=6.14.0'} hasBin: true @@ -2442,7 +2442,7 @@ packages: shikiji: 0.6.13 string-width: 7.0.0 strip-ansi: 7.1.0 - tsconfck: 3.0.0(typescript@5.2.2) + tsconfck: 3.0.0(typescript@5.3.3) unist-util-visit: 5.0.0 vfile: 6.0.1 vite: 5.0.9(@types/node@20.10.4) @@ -2952,7 +2952,7 @@ packages: engines: {node: '>= 0.6'} dev: false - /cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.2.2): + /cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.3.3): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} peerDependencies: @@ -2961,12 +2961,12 @@ packages: typescript: '>=4' dependencies: '@types/node': 18.19.3 - cosmiconfig: 8.3.6(typescript@5.2.2) + cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.21.0 - typescript: 5.2.2 + typescript: 5.3.3 dev: false - /cosmiconfig@8.3.6(typescript@5.2.2): + /cosmiconfig@8.3.6(typescript@5.3.3): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -2979,7 +2979,7 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.2.2 + typescript: 5.3.3 dev: false /cross-spawn@5.1.0: @@ -3498,7 +3498,7 @@ packages: eslint: 8.53.0 dev: false - /eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2): + /eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3): resolution: {integrity: sha512-vPQssnRSUgBFOEfB/KY12CXwltwFSn4RSCfa+w7gjBC2PFQ7Yfgmyei+1XUZ3K+8LRGef2NMJUcxts7PldhDjg==} engines: {node: '>=16'} peerDependencies: @@ -3507,10 +3507,10 @@ packages: eslint: '>=8.0.0' typescript: '>=4.7' dependencies: - '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) eslint: 8.53.0 - typescript: 5.2.2 + typescript: 5.3.3 dev: false /eslint-config-xo@0.43.1(eslint@8.53.0): @@ -3592,7 +3592,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) debug: 3.2.7 eslint: 8.53.0 eslint-import-resolver-node: 0.3.9 @@ -3650,7 +3650,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 @@ -8345,20 +8345,20 @@ packages: resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} dev: false - /ts-api-utils@1.0.3(typescript@5.2.2): + /ts-api-utils@1.0.3(typescript@5.3.3): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.2.2 + typescript: 5.3.3 dev: false /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: false - /tsconfck@3.0.0(typescript@5.2.2): + /tsconfck@3.0.0(typescript@5.3.3): resolution: {integrity: sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==} engines: {node: ^18 || >=20} hasBin: true @@ -8368,7 +8368,7 @@ packages: typescript: optional: true dependencies: - typescript: 5.2.2 + typescript: 5.3.3 dev: false /tsconfig-paths@3.14.2: @@ -8560,8 +8560,8 @@ packages: is-typed-array: 1.1.12 dev: false - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true dev: false @@ -9041,15 +9041,15 @@ packages: optional: true dependencies: '@eslint/eslintrc': 2.1.3 - '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) arrify: 3.0.0 - cosmiconfig: 8.3.6(typescript@5.2.2) + cosmiconfig: 8.3.6(typescript@5.3.3) define-lazy-prop: 3.0.0 eslint: 8.53.0 eslint-config-prettier: 8.10.0(eslint@8.53.0) eslint-config-xo: 0.43.1(eslint@8.53.0) - eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.2.2) + eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3) eslint-formatter-pretty: 5.0.0 eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.89.0) eslint-plugin-ava: 14.0.0(eslint@8.53.0) @@ -9075,7 +9075,7 @@ packages: semver: 7.5.4 slash: 5.1.0 to-absolute-glob: 3.0.0 - typescript: 5.2.2 + typescript: 5.3.3 webpack: 5.89.0 transitivePeerDependencies: - '@types/eslint' From a6e096bcbc9611f2ec5cfffc7ec0049cdad8f4c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:22:37 +0000 Subject: [PATCH 051/136] chore(deps): bump turbo from 1.10.16 to 1.11.3 Bumps [turbo](https://github.com/vercel/turbo) from 1.10.16 to 1.11.3. - [Release notes](https://github.com/vercel/turbo/releases) - [Changelog](https://github.com/vercel/turbo/blob/main/release.md) - [Commits](https://github.com/vercel/turbo/compare/v1.10.16...v1.11.3) --- updated-dependencies: - dependency-name: turbo dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 44 ++++++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index e195014..1621f6d 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "npm-run-all": "4.1.5", "prettier": "3.1.1", "tsx": "4.7.0", - "turbo": "1.10.16", + "turbo": "1.11.3", "typescript": "5.3.3", "xo": "0.56.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f44a527..21478c6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: 4.7.0 version: 4.7.0 turbo: - specifier: 1.10.16 - version: 1.10.16 + specifier: 1.11.3 + version: 1.11.3 typescript: specifier: 5.3.3 version: 5.3.3 @@ -8415,64 +8415,64 @@ packages: safe-buffer: 5.2.1 dev: false - /turbo-darwin-64@1.10.16: - resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} + /turbo-darwin-64@1.11.3: + resolution: {integrity: sha512-IsOOg2bVbIt3o/X8Ew9fbQp5t1hTHN3fGNQYrPQwMR2W1kIAC6RfbVD4A9OeibPGyEPUpwOH79hZ9ydFH5kifw==} cpu: [x64] os: [darwin] requiresBuild: true dev: false optional: true - /turbo-darwin-arm64@1.10.16: - resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} + /turbo-darwin-arm64@1.11.3: + resolution: {integrity: sha512-FsJL7k0SaPbJzI/KCnrf/fi3PgCDCjTliMc/kEFkuWVA6Httc3Q4lxyLIIinz69q6JTx8wzh6yznUMzJRI3+dg==} cpu: [arm64] os: [darwin] requiresBuild: true dev: false optional: true - /turbo-linux-64@1.10.16: - resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} + /turbo-linux-64@1.11.3: + resolution: {integrity: sha512-SvW7pvTVRGsqtSkII5w+wriZXvxqkluw5FO/MNAdFw0qmoov+PZ237+37/NgArqE3zVn1GX9P6nUx9VO+xcQAg==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /turbo-linux-arm64@1.10.16: - resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} + /turbo-linux-arm64@1.11.3: + resolution: {integrity: sha512-YhUfBi1deB3m+3M55X458J6B7RsIS7UtM3P1z13cUIhF+pOt65BgnaSnkHLwETidmhRh8Dl3GelaQGrB3RdCDw==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /turbo-windows-64@1.10.16: - resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} + /turbo-windows-64@1.11.3: + resolution: {integrity: sha512-s+vEnuM2TiZuAUUUpmBHDr6vnNbJgj+5JYfnYmVklYs16kXh+EppafYQOAkcRIMAh7GjV3pLq5/uGqc7seZeHA==} cpu: [x64] os: [win32] requiresBuild: true dev: false optional: true - /turbo-windows-arm64@1.10.16: - resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} + /turbo-windows-arm64@1.11.3: + resolution: {integrity: sha512-ZR5z5Zpc7cASwfdRAV5yNScCZBsgGSbcwiA/u3farCacbPiXsfoWUkz28iyrx21/TRW0bi6dbsB2v17swa8bjw==} cpu: [arm64] os: [win32] requiresBuild: true dev: false optional: true - /turbo@1.10.16: - resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} + /turbo@1.11.3: + resolution: {integrity: sha512-RCJOUFcFMQNIGKSjC9YmA5yVP1qtDiBA0Lv9VIgrXraI5Da1liVvl3VJPsoDNIR9eFMyA/aagx1iyj6UWem5hA==} hasBin: true optionalDependencies: - turbo-darwin-64: 1.10.16 - turbo-darwin-arm64: 1.10.16 - turbo-linux-64: 1.10.16 - turbo-linux-arm64: 1.10.16 - turbo-windows-64: 1.10.16 - turbo-windows-arm64: 1.10.16 + turbo-darwin-64: 1.11.3 + turbo-darwin-arm64: 1.11.3 + turbo-linux-64: 1.11.3 + turbo-linux-arm64: 1.11.3 + turbo-windows-64: 1.11.3 + turbo-windows-arm64: 1.11.3 dev: false /type-check@0.4.0: From 83dc618c2e9cfe499579bf7b65bbaeeeb8f6b802 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 18 Jan 2024 10:40:53 +0100 Subject: [PATCH 052/136] fix(cli): remove --enable-source-maps flag --- .changeset/large-cats-whisper.md | 5 +++++ packages/cli/src/cli.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/large-cats-whisper.md diff --git a/.changeset/large-cats-whisper.md b/.changeset/large-cats-whisper.md new file mode 100644 index 0000000..8e2d12f --- /dev/null +++ b/.changeset/large-cats-whisper.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Remove the --enable-source-maps flag from the shebang for better NodeJS compatibility diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index ca1b0d7..f17f37d 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -1,4 +1,4 @@ -#!/usr/bin/env node --enable-source-maps +#!/usr/bin/env node import process from 'node:process'; import { parseArgs } from 'node:util'; import importFromEsm from 'import-from-esm'; From 9130af7b12aae56c05d1b147b9b68c2a45ac2090 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 18 Jan 2024 09:48:01 +0000 Subject: [PATCH 053/136] chore(release): version packages --- .changeset/large-cats-whisper.md | 5 ----- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/large-cats-whisper.md diff --git a/.changeset/large-cats-whisper.md b/.changeset/large-cats-whisper.md deleted file mode 100644 index 8e2d12f..0000000 --- a/.changeset/large-cats-whisper.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Remove the --enable-source-maps flag from the shebang for better NodeJS compatibility diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 187a41d..0959a94 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/cli +## 0.13.1 + +### Patch Changes + +- 83dc618: Remove the --enable-source-maps flag from the shebang for better NodeJS compatibility + ## 0.13.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 1e9eff1..5e28181 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.13.0", + "version": "0.13.1", "publishConfig": { "access": "public" }, From 891402c7d4f1045325bb767af62308ca58d92603 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 18 Jan 2024 11:02:07 +0100 Subject: [PATCH 054/136] ci: does this make the release flow work? --- .github/workflows/release.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0e19219..e8dbde0 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -15,6 +15,7 @@ jobs: contents: write packages: write pull-requests: write + actions: read steps: - name: Checkout Repo uses: actions/checkout@v4 @@ -35,7 +36,7 @@ jobs: run: pnpm install - name: Create Release Pull Request - uses: changesets/action@v1 + uses: changesets/action@v1.4.5 with: publish: pnpm run release commit: 'chore(release): version packages' From 1b8439a5304dfef66a6c9a09f6175b4dc3af6819 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 18 Jan 2024 11:09:12 +0100 Subject: [PATCH 055/136] ci: and does this make any difference? --- .github/workflows/release.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index e8dbde0..b984a29 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -21,6 +21,8 @@ jobs: uses: actions/checkout@v4 with: token: ${{ secrets.PAT_GITHUB_TOKEN }} + persist-credentials: false + fetch-depth: 0 - uses: pnpm/action-setup@v2.4.0 with: From cbc3193626f1386962e453c1f381fd462982a4e4 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 18 Jan 2024 11:13:28 +0100 Subject: [PATCH 056/136] chore(deps): downgrade Turbo to 1.10.16 as it did work in the CI env --- package.json | 2 +- pnpm-lock.yaml | 44 ++++++++++++++++++++++---------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 1621f6d..e195014 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "npm-run-all": "4.1.5", "prettier": "3.1.1", "tsx": "4.7.0", - "turbo": "1.11.3", + "turbo": "1.10.16", "typescript": "5.3.3", "xo": "0.56.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 21478c6..f44a527 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: 4.7.0 version: 4.7.0 turbo: - specifier: 1.11.3 - version: 1.11.3 + specifier: 1.10.16 + version: 1.10.16 typescript: specifier: 5.3.3 version: 5.3.3 @@ -8415,64 +8415,64 @@ packages: safe-buffer: 5.2.1 dev: false - /turbo-darwin-64@1.11.3: - resolution: {integrity: sha512-IsOOg2bVbIt3o/X8Ew9fbQp5t1hTHN3fGNQYrPQwMR2W1kIAC6RfbVD4A9OeibPGyEPUpwOH79hZ9ydFH5kifw==} + /turbo-darwin-64@1.10.16: + resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} cpu: [x64] os: [darwin] requiresBuild: true dev: false optional: true - /turbo-darwin-arm64@1.11.3: - resolution: {integrity: sha512-FsJL7k0SaPbJzI/KCnrf/fi3PgCDCjTliMc/kEFkuWVA6Httc3Q4lxyLIIinz69q6JTx8wzh6yznUMzJRI3+dg==} + /turbo-darwin-arm64@1.10.16: + resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} cpu: [arm64] os: [darwin] requiresBuild: true dev: false optional: true - /turbo-linux-64@1.11.3: - resolution: {integrity: sha512-SvW7pvTVRGsqtSkII5w+wriZXvxqkluw5FO/MNAdFw0qmoov+PZ237+37/NgArqE3zVn1GX9P6nUx9VO+xcQAg==} + /turbo-linux-64@1.10.16: + resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} cpu: [x64] os: [linux] requiresBuild: true dev: false optional: true - /turbo-linux-arm64@1.11.3: - resolution: {integrity: sha512-YhUfBi1deB3m+3M55X458J6B7RsIS7UtM3P1z13cUIhF+pOt65BgnaSnkHLwETidmhRh8Dl3GelaQGrB3RdCDw==} + /turbo-linux-arm64@1.10.16: + resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} cpu: [arm64] os: [linux] requiresBuild: true dev: false optional: true - /turbo-windows-64@1.11.3: - resolution: {integrity: sha512-s+vEnuM2TiZuAUUUpmBHDr6vnNbJgj+5JYfnYmVklYs16kXh+EppafYQOAkcRIMAh7GjV3pLq5/uGqc7seZeHA==} + /turbo-windows-64@1.10.16: + resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} cpu: [x64] os: [win32] requiresBuild: true dev: false optional: true - /turbo-windows-arm64@1.11.3: - resolution: {integrity: sha512-ZR5z5Zpc7cASwfdRAV5yNScCZBsgGSbcwiA/u3farCacbPiXsfoWUkz28iyrx21/TRW0bi6dbsB2v17swa8bjw==} + /turbo-windows-arm64@1.10.16: + resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} cpu: [arm64] os: [win32] requiresBuild: true dev: false optional: true - /turbo@1.11.3: - resolution: {integrity: sha512-RCJOUFcFMQNIGKSjC9YmA5yVP1qtDiBA0Lv9VIgrXraI5Da1liVvl3VJPsoDNIR9eFMyA/aagx1iyj6UWem5hA==} + /turbo@1.10.16: + resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} hasBin: true optionalDependencies: - turbo-darwin-64: 1.11.3 - turbo-darwin-arm64: 1.11.3 - turbo-linux-64: 1.11.3 - turbo-linux-arm64: 1.11.3 - turbo-windows-64: 1.11.3 - turbo-windows-arm64: 1.11.3 + turbo-darwin-64: 1.10.16 + turbo-darwin-arm64: 1.10.16 + turbo-linux-64: 1.10.16 + turbo-linux-arm64: 1.10.16 + turbo-windows-64: 1.10.16 + turbo-windows-arm64: 1.10.16 dev: false /type-check@0.4.0: From b083e88bac83117e7f98efed4d6be37dfbac8681 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jan 2024 13:07:12 +0000 Subject: [PATCH 057/136] chore(deps): bump cosmiconfig from 8.3.6 to 9.0.0 Bumps [cosmiconfig](https://github.com/cosmiconfig/cosmiconfig) from 8.3.6 to 9.0.0. - [Release notes](https://github.com/cosmiconfig/cosmiconfig/releases) - [Changelog](https://github.com/cosmiconfig/cosmiconfig/blob/main/CHANGELOG.md) - [Commits](https://github.com/cosmiconfig/cosmiconfig/compare/cosmiconfig-v8.3.6...v9.0.0) --- updated-dependencies: - dependency-name: cosmiconfig dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .changeset/clean-turtles-sparkle.md | 5 +++++ packages/cli/package.json | 2 +- pnpm-lock.yaml | 25 +++++++++++++++++++++++-- 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 .changeset/clean-turtles-sparkle.md diff --git a/.changeset/clean-turtles-sparkle.md b/.changeset/clean-turtles-sparkle.md new file mode 100644 index 0000000..fa21b04 --- /dev/null +++ b/.changeset/clean-turtles-sparkle.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Upgrade cosmiconfig to 9.0.0 diff --git a/packages/cli/package.json b/packages/cli/package.json index 5e28181..3d51232 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -46,7 +46,7 @@ "@emigrate/plugin-tools": "workspace:*", "@emigrate/types": "workspace:*", "ansis": "2.0.3", - "cosmiconfig": "8.3.6", + "cosmiconfig": "9.0.0", "elegant-spinner": "3.0.0", "figures": "6.0.1", "import-from-esm": "1.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f44a527..2910926 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,8 +81,8 @@ importers: specifier: 2.0.3 version: 2.0.3 cosmiconfig: - specifier: 8.3.6 - version: 8.3.6(typescript@5.3.3) + specifier: 9.0.0 + version: 9.0.0(typescript@5.3.3) elegant-spinner: specifier: 3.0.0 version: 3.0.0 @@ -2982,6 +2982,22 @@ packages: typescript: 5.3.3 dev: false + /cosmiconfig@9.0.0(typescript@5.3.3): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.3.3 + dev: false + /cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} dependencies: @@ -3329,6 +3345,11 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: false + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: false + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: From 114979f1549ee0d26eb3489841fa6d2f30586b5b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 18 Jan 2024 13:50:50 +0000 Subject: [PATCH 058/136] chore(release): version packages --- .changeset/clean-turtles-sparkle.md | 5 ----- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/clean-turtles-sparkle.md diff --git a/.changeset/clean-turtles-sparkle.md b/.changeset/clean-turtles-sparkle.md deleted file mode 100644 index fa21b04..0000000 --- a/.changeset/clean-turtles-sparkle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Upgrade cosmiconfig to 9.0.0 diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 0959a94..e8b08ff 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/cli +## 0.14.0 + +### Minor Changes + +- b083e88: Upgrade cosmiconfig to 9.0.0 + ## 0.13.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 3d51232..a67ebdd 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.13.1", + "version": "0.14.0", "publishConfig": { "access": "public" }, From 73a8a42e5fa5bf9ac66960eed906cbd21a0ea3a5 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 18 Jan 2024 15:11:51 +0100 Subject: [PATCH 059/136] fix(history): support a migration history with entries without file extensions (.js is assumed in such case) --- .changeset/real-parrots-chew.md | 5 +++ packages/cli/src/collect-migrations.ts | 5 ++- packages/cli/src/commands/up.test.ts | 54 ++++++++++++++++++++++++++ packages/cli/src/get-migrations.ts | 5 ++- 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 .changeset/real-parrots-chew.md diff --git a/.changeset/real-parrots-chew.md b/.changeset/real-parrots-chew.md new file mode 100644 index 0000000..6f5d15c --- /dev/null +++ b/.changeset/real-parrots-chew.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Support stored migration histories that have only stored the migration file names without file extension and assume it's .js files in that case. This is to be compatible with a migration history generated by Immigration. diff --git a/packages/cli/src/collect-migrations.ts b/packages/cli/src/collect-migrations.ts index d583a44..dc1ce8f 100644 --- a/packages/cli/src/collect-migrations.ts +++ b/packages/cli/src/collect-migrations.ts @@ -1,3 +1,4 @@ +import { extname } from 'node:path'; import { type MigrationHistoryEntry, type MigrationMetadata, type MigrationMetadataFinished } from '@emigrate/types'; import { toMigrationMetadata } from './to-migration-metadata.js'; import { getMigrations as getMigrationsOriginal } from './get-migrations.js'; @@ -11,7 +12,9 @@ export async function* collectMigrations( const allMigrations = await getMigrations(cwd, directory); const seen = new Set(); - for await (const entry of history) { + for await (const entry_ of history) { + const entry = extname(entry_.name) === '' ? { ...entry_, name: `${entry_.name}.js` } : entry_; + const index = allMigrations.findIndex((migrationFile) => migrationFile.name === entry.name); if (index === -1) { diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index fe88b74..5cdae25 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -48,6 +48,60 @@ describe('up', () => { assert.deepStrictEqual(reporter.onFinished.mock.calls[0]?.arguments, [[], undefined]); }); + it('returns 0 and finishes without an error when all migrations have already been run', async () => { + const { reporter, run } = getUpCommand(['my_migration.js'], getStorage(['my_migration.js'])); + + const exitCode = await run(); + + assert.strictEqual(exitCode, 0); + assert.strictEqual(reporter.onInit.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ + { + command: 'up', + cwd: '/emigrate', + dry: false, + color: undefined, + version, + directory: 'migrations', + }, + ]); + assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); + assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); + assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0); + assert.strictEqual(reporter.onFinished.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onFinished.mock.calls[0]?.arguments, [[], undefined]); + }); + + it('returns 0 and finishes without an error when all migrations have already been run even when the history responds without file extensions', async () => { + const { reporter, run } = getUpCommand(['my_migration.js'], getStorage(['my_migration'])); + + const exitCode = await run(); + + assert.strictEqual(exitCode, 0); + assert.strictEqual(reporter.onInit.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ + { + command: 'up', + cwd: '/emigrate', + dry: false, + color: undefined, + version, + directory: 'migrations', + }, + ]); + assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); + assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); + assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0); + assert.strictEqual(reporter.onFinished.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onFinished.mock.calls[0]?.arguments, [[], undefined]); + }); + it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin', async () => { const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], getStorage([])); diff --git a/packages/cli/src/get-migrations.ts b/packages/cli/src/get-migrations.ts index 735fc49..e208ac7 100644 --- a/packages/cli/src/get-migrations.ts +++ b/packages/cli/src/get-migrations.ts @@ -23,7 +23,10 @@ export const getMigrations = async (cwd: string, directory: string): Promise file.isFile() && !file.name.startsWith('.') && !file.name.startsWith('_')) + .filter( + (file) => + file.isFile() && !file.name.startsWith('.') && !file.name.startsWith('_') && path.extname(file.name) !== '', + ) .sort((a, b) => a.name.localeCompare(b.name)) .map(({ name }) => { const filePath = path.join(directoryPath, name); From 424d3e990346bfb8ec00a62e238e731d11f7d6eb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 18 Jan 2024 14:19:02 +0000 Subject: [PATCH 060/136] chore(release): version packages --- .changeset/real-parrots-chew.md | 5 ----- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/real-parrots-chew.md diff --git a/.changeset/real-parrots-chew.md b/.changeset/real-parrots-chew.md deleted file mode 100644 index 6f5d15c..0000000 --- a/.changeset/real-parrots-chew.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Support stored migration histories that have only stored the migration file names without file extension and assume it's .js files in that case. This is to be compatible with a migration history generated by Immigration. diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index e8b08ff..5b991fd 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/cli +## 0.14.1 + +### Patch Changes + +- 73a8a42: Support stored migration histories that have only stored the migration file names without file extension and assume it's .js files in that case. This is to be compatible with a migration history generated by Immigration. + ## 0.14.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index a67ebdd..d85ddfb 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.14.0", + "version": "0.14.1", "publishConfig": { "access": "public" }, From bf4d596980fd3d1892c78b0c801aa8e4f8010395 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 18 Jan 2024 16:34:47 +0100 Subject: [PATCH 061/136] fix(cli): clarify which options that takes parameters --- .changeset/grumpy-files-heal.md | 5 +++ packages/cli/src/cli.ts | 76 ++++++++++++++++----------------- 2 files changed, 43 insertions(+), 38 deletions(-) create mode 100644 .changeset/grumpy-files-heal.md diff --git a/.changeset/grumpy-files-heal.md b/.changeset/grumpy-files-heal.md new file mode 100644 index 0000000..187b4b4 --- /dev/null +++ b/.changeset/grumpy-files-heal.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Clarify which cli options that needs parameters diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index f17f37d..5bec5df 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -73,16 +73,16 @@ Run all pending migrations Options: - -h, --help Show this help message and exit - -d, --directory The directory where the migration files are located (required) - -i, --import Additional modules/packages to import before running the migrations (can be specified multiple times) - For example if you want to use Dotenv to load environment variables or when using TypeScript - -s, --storage The storage to use for where to store the migration history (required) - -p, --plugin The plugin(s) to use (can be specified multiple times) - -r, --reporter The reporter to use for reporting the migration progress - --dry List the pending migrations that would be run without actually running them - --color Force color output (this option is passed to the reporter) - --no-color Disable color output (this option is passed to the reporter) + -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before running the migrations (can be specified multiple times) + For example if you want to use Dotenv to load environment variables or when using TypeScript + -s, --storage The storage to use for where to store the migration history (required) + -p, --plugin The plugin(s) to use (can be specified multiple times) + -r, --reporter The reporter to use for reporting the migration progress + --dry List the pending migrations that would be run without actually running them + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) Examples: @@ -176,16 +176,16 @@ Arguments: Options: - -h, --help Show this help message and exit - -d, --directory The directory where the migration files are located (required) - -r, --reporter The reporter to use for reporting the migration file creation progress - -p, --plugin The plugin(s) to use (can be specified multiple times) - -t, --template A template file to use as contents for the new migration file - (if the extension option is not provided the template file's extension will be used) - -x, --extension The extension to use for the new migration file - (if no template or plugin is provided an empty migration file will be created with the given extension) - --color Force color output (this option is passed to the reporter) - --no-color Disable color output (this option is passed to the reporter) + -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -r, --reporter The reporter to use for reporting the migration file creation progress + -p, --plugin The plugin(s) to use (can be specified multiple times) + -t, --template A template file to use as contents for the new migration file + (if the extension option is not provided the template file's extension will be used) + -x, --extension The extension to use for the new migration file + (if no template or plugin is provided an empty migration file will be created with the given extension) + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) One of the --template, --extension or the --plugin options must be specified @@ -271,14 +271,14 @@ List all migrations and their status. This command does not run any migrations. Options: - -h, --help Show this help message and exit - -d, --directory The directory where the migration files are located (required) - -i, --import Additional modules/packages to import before listing the migrations (can be specified multiple times) - For example if you want to use Dotenv to load environment variables - -r, --reporter The reporter to use for reporting the migrations - -s, --storage The storage to use to get the migration history (required) - --color Force color output (this option is passed to the reporter) - --no-color Disable color output (this option is passed to the reporter) + -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before listing the migrations (can be specified multiple times) + For example if you want to use Dotenv to load environment variables + -r, --reporter The reporter to use for reporting the migrations + -s, --storage The storage to use to get the migration history (required) + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) Examples: @@ -369,16 +369,16 @@ Arguments: Options: - -h, --help Show this help message and exit - -d, --directory The directory where the migration files are located (required) - -i, --import Additional modules/packages to import before removing the migration (can be specified multiple times) - For example if you want to use Dotenv to load environment variables - -r, --reporter The reporter to use for reporting the removal process - -s, --storage The storage to use to get the migration history (required) - -f, --force Force removal of the migration history entry even if the migration file does not exist - or it's in a non-failed state - --color Force color output (this option is passed to the reporter) - --no-color Disable color output (this option is passed to the reporter) + -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before removing the migration (can be specified multiple times) + For example if you want to use Dotenv to load environment variables + -r, --reporter The reporter to use for reporting the removal process + -s, --storage The storage to use to get the migration history (required) + -f, --force Force removal of the migration history entry even if the migration file does not exist + or it's in a non-failed state + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) Examples: From 02c142e39a235315cb4b1643e376e5d7147de6df Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 18 Jan 2024 19:01:23 +0100 Subject: [PATCH 062/136] feat(up): add --limit option to limit the number of migrations to run --- .changeset/sharp-buses-draw.md | 5 ++ docs/src/content/docs/commands/up.mdx | 5 ++ packages/cli/README.md | 29 +++++++++ packages/cli/src/cli.ts | 26 +++++++- packages/cli/src/commands/up.test.ts | 93 ++++++++++++++++++++++++++- packages/cli/src/commands/up.ts | 3 + packages/cli/src/migration-runner.ts | 20 +++++- 7 files changed, 176 insertions(+), 5 deletions(-) create mode 100644 .changeset/sharp-buses-draw.md diff --git a/.changeset/sharp-buses-draw.md b/.changeset/sharp-buses-draw.md new file mode 100644 index 0000000..1070334 --- /dev/null +++ b/.changeset/sharp-buses-draw.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Add --limit option to the "up" command, for limiting the number of migrations to run diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 2c2dd8a..c80a715 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -64,6 +64,11 @@ Show command help and exit List the pending migrations that would be run without actually running them +### `-l, --limit ` + +Limit the number of migrations to run. Can be combined with `--dry` which will show "pending" for the migrations that would be run if not in dry-run mode, +and "skipped" for the migrations that also haven't been run but won't because of the set limit. + ### `-d`, `--directory ` The directory where the migration files are located. The given path should be absolute or relative to the current working directory. diff --git a/packages/cli/README.md b/packages/cli/README.md index 19f8c42..f398240 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -20,6 +20,35 @@ bun add @emigrate/cli ## Usage +```text +Usage: emigrate up [options] + +Run all pending migrations + +Options: + + -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before running the migrations (can be specified multiple times) + For example if you want to use Dotenv to load environment variables or when using TypeScript + -s, --storage The storage to use for where to store the migration history (required) + -p, --plugin The plugin(s) to use (can be specified multiple times) + -r, --reporter The reporter to use for reporting the migration progress + -l, --limit Limit the number of migrations to run + --dry List the pending migrations that would be run without actually running them + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) + +Examples: + + emigrate up --directory src/migrations -s fs + emigrate up -d ./migrations --storage @emigrate/mysql + emigrate up -d src/migrations -s postgres -r json --dry + emigrate up -d ./migrations -s mysql --import dotenv/config +``` + +### Examples + Create a new migration: ```bash diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 5bec5df..203287a 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -48,6 +48,10 @@ const up: Action = async (args) => { type: 'string', short: 's', }, + limit: { + type: 'string', + short: 'l', + }, dry: { type: 'boolean', }, @@ -80,6 +84,7 @@ Options: -s, --storage The storage to use for where to store the migration history (required) -p, --plugin The plugin(s) to use (can be specified multiple times) -r, --reporter The reporter to use for reporting the migration progress + -l, --limit Limit the number of migrations to run --dry List the pending migrations that would be run without actually running them --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) @@ -104,15 +109,34 @@ Examples: storage = config.storage, reporter = config.reporter, dry, + limit: limitString, import: imports = [], } = values; const plugins = [...(config.plugins ?? []), ...(values.plugin ?? [])]; + const limit = limitString === undefined ? undefined : Number.parseInt(limitString, 10); + + if (Number.isNaN(limit)) { + console.error('Invalid limit value, expected an integer but was:', limitString); + console.log(usage); + process.exitCode = 1; + return; + } + await importAll(cwd, imports); try { const { default: upCommand } = await import('./commands/up.js'); - process.exitCode = await upCommand({ storage, reporter, directory, plugins, cwd, dry, color: useColors(values) }); + process.exitCode = await upCommand({ + storage, + reporter, + directory, + plugins, + cwd, + dry, + limit, + color: useColors(values), + }); } catch (error) { if (error instanceof ShowUsageError) { console.error(error.message, '\n'); diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index 5cdae25..f9d42cd 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -198,7 +198,7 @@ describe('up', () => { const failedEntry = toEntry('some_failed_migration.js', 'failed'); const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], getStorage([failedEntry])); - const exitCode = await run(true); + const exitCode = await run({ dry: true }); assert.strictEqual(exitCode, 1); assert.strictEqual(reporter.onInit.mock.calls.length, 1); @@ -344,6 +344,88 @@ describe('up', () => { ); }); + it('returns 0 and finishes without an error when the given number of pending migrations are run successfully', async () => { + const { reporter, run } = getUpCommand( + ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], + getStorage(['some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return async () => { + // Success + }; + }, + }, + ], + ); + + const exitCode = await run({ limit: 1 }); + + assert.strictEqual(exitCode, 0); + assert.strictEqual(reporter.onInit.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ + { + command: 'up', + cwd: '/emigrate', + version, + dry: false, + color: undefined, + directory: 'migrations', + }, + ]); + assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); + assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); + assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 1); + assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 1); + assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 1); + assert.strictEqual(reporter.onFinished.mock.calls.length, 1); + const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; + assert.strictEqual(error, undefined); + assert.strictEqual(entries?.length, 2); + assert.deepStrictEqual( + entries.map((entry) => `${entry.name} (${entry.status})`), + ['some_migration.js (done)', 'some_other_migration.js (skipped)'], + ); + }); + + it('returns 0 and finishes without an error with the given number of pending migrations are validated and listed successfully in dry-mode', async () => { + const { reporter, run } = getUpCommand( + ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], + getStorage(['some_already_run_migration.js']), + ); + + const exitCode = await run({ dry: true, limit: 1 }); + + assert.strictEqual(exitCode, 0); + assert.strictEqual(reporter.onInit.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ + { + command: 'up', + cwd: '/emigrate', + version, + dry: true, + color: undefined, + directory: 'migrations', + }, + ]); + assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); + assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); + assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); + assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 2); + assert.strictEqual(reporter.onFinished.mock.calls.length, 1); + const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; + assert.strictEqual(error, undefined); + assert.strictEqual(entries?.length, 2); + assert.deepStrictEqual( + entries.map((entry) => `${entry.name} (${entry.status})`), + ['some_migration.js (pending)', 'some_other_migration.js (skipped)'], + ); + }); + it('returns 1 and finishes with an error when a pending migration throw when run', async () => { const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'fail.js', 'some_other_migration.js'], @@ -495,7 +577,12 @@ function getUpCommand(migrationFiles: string[], storage?: Mocked, plugi onMigrationSkip: mock.fn(noop), }; - const run = async (dry = false) => { + const run = async ( + options?: Omit< + Parameters[0], + 'cwd' | 'directory' | 'storage' | 'reporter' | 'plugins' | 'getMigrations' + >, + ) => { return upCommand({ cwd: '/emigrate', directory: 'migrations', @@ -509,11 +596,11 @@ function getUpCommand(migrationFiles: string[], storage?: Mocked, plugi }, }, reporter, - dry, plugins: plugins ?? [], async getMigrations(cwd, directory) { return toMigrations(cwd, directory, migrationFiles); }, + ...options, }); }; diff --git a/packages/cli/src/commands/up.ts b/packages/cli/src/commands/up.ts index c260c46..9613982 100644 --- a/packages/cli/src/commands/up.ts +++ b/packages/cli/src/commands/up.ts @@ -14,6 +14,7 @@ import { version } from '../get-package-info.js'; type ExtraFlags = { cwd: string; dry?: boolean; + limit?: number; getMigrations?: GetMigrationsFunction; }; @@ -25,6 +26,7 @@ export default async function upCommand({ reporter: reporterConfig, directory, color, + limit, dry = false, plugins = [], cwd, @@ -83,6 +85,7 @@ export default async function upCommand({ const error = await migrationRunner({ dry, + limit, reporter, storage, migrations: await arrayFromAsync(collectedMigrations), diff --git a/packages/cli/src/migration-runner.ts b/packages/cli/src/migration-runner.ts index 8cdf88c..f62011e 100644 --- a/packages/cli/src/migration-runner.ts +++ b/packages/cli/src/migration-runner.ts @@ -15,6 +15,7 @@ import { getDuration } from './get-duration.js'; type MigrationRunnerParameters = { dry: boolean; + limit?: number; reporter: EmigrateReporter; storage: Storage; migrations: Array; @@ -24,6 +25,7 @@ type MigrationRunnerParameters = { export const migrationRunner = async ({ dry, + limit, reporter, storage, migrations, @@ -70,7 +72,12 @@ export const migrationRunner = async ({ } } - const [lockedMigrations, lockError] = dry ? [migrationsToRun] : await exec(async () => storage.lock(migrationsToRun)); + const migrationsToLock = limit ? migrationsToRun.slice(0, limit) : migrationsToRun; + const migrationsToSkip = limit ? migrationsToRun.slice(limit) : []; + + const [lockedMigrations, lockError] = dry + ? [migrationsToLock] + : await exec(async () => storage.lock(migrationsToLock)); if (lockError) { for await (const migration of migrationsToRun) { @@ -152,6 +159,17 @@ export const migrationRunner = async ({ } } + for await (const migration of migrationsToSkip) { + const finishedMigration: MigrationMetadataFinished = { + ...migration, + status: 'skipped', + }; + + await reporter.onMigrationSkip?.(finishedMigration); + + finishedMigrations.push(finishedMigration); + } + const [, unlockError] = dry ? [] : await exec(async () => storage.unlock(lockedMigrations ?? [])); // eslint-disable-next-line unicorn/no-array-callback-reference From 9ef0fa2776f8bf3820944ee714dfa5b2b9137ec6 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 19 Jan 2024 10:34:06 +0100 Subject: [PATCH 063/136] feat(cli): add --from and --to options to limit what migrations to run --- .changeset/quiet-ravens-sleep.md | 5 + README.md | 35 ++ docs/src/content/docs/commands/up.mdx | 18 + packages/cli/README.md | 6 + packages/cli/src/cli.ts | 18 + packages/cli/src/commands/up.test.ts | 621 ++++++++++++++------------ packages/cli/src/commands/up.ts | 6 + packages/cli/src/migration-runner.ts | 122 +++-- 8 files changed, 485 insertions(+), 346 deletions(-) create mode 100644 .changeset/quiet-ravens-sleep.md diff --git a/.changeset/quiet-ravens-sleep.md b/.changeset/quiet-ravens-sleep.md new file mode 100644 index 0000000..24023cf --- /dev/null +++ b/.changeset/quiet-ravens-sleep.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Add --from and --to CLI options to control which migrations to include or skip when executing migrations. diff --git a/README.md b/README.md index d494410..bd62417 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,41 @@ bun add @emigrate/cli ## Usage +```text +Usage: emigrate up [options] + +Run all pending migrations + +Options: + + -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before running the migrations (can be specified multiple times) + For example if you want to use Dotenv to load environment variables or when using TypeScript + -s, --storage The storage to use for where to store the migration history (required) + -p, --plugin The plugin(s) to use (can be specified multiple times) + -r, --reporter The reporter to use for reporting the migration progress + -l, --limit Limit the number of migrations to run + -f, --from Start running migrations from the given migration name, the given name doesn't need to exist + and is compared in lexicographical order + -t, --to Skip migrations after the given migration name, the given name doesn't need to exist + and is compared in lexicographical order + --dry List the pending migrations that would be run without actually running them + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) + +Examples: + + emigrate up --directory src/migrations -s fs + emigrate up -d ./migrations --storage @emigrate/mysql + emigrate up -d src/migrations -s postgres -r json --dry + emigrate up -d ./migrations -s mysql --import dotenv/config + emigrate up --limit 1 + emigrate up --to 20231122120529381_some_migration_file.js +``` + +### Examples + Create a new migration: ```bash diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index c80a715..39d6151 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -73,6 +73,24 @@ and "skipped" for the migrations that also haven't been run but won't because of The directory where the migration files are located. The given path should be absolute or relative to the current working directory. +### `-f`, `--from ` + +The name of the migration to start from. This can be used to run only a subset of the pending migrations. + +The given migration name does not need to exist and is compared in lexicographical order with the migration names, so it can be a prefix of a migration name or similar. + +Can be combined with `--dry` which will show "pending" for the migrations that would be run if not in dry-run mode, +and "skipped" for the migrations that also haven't been run but won't because of the set "from". + +### `-t`, `--to ` + +The name of the migration to end at. This can be used to run only a subset of the pending migrations. + +The given migration name does not need to exist and is compared in lexicographical order with the migration names, so it can be a prefix of a migration name or similar. + +Can be combined with `--dry` which will show "pending" for the migrations that would be run if not in dry-run mode, +and "skipped" for the migrations that also haven't been run but won't because of the set "to". + ### `-i`, `--import ` A module to import before running the migrations. This option can be specified multiple times. diff --git a/packages/cli/README.md b/packages/cli/README.md index f398240..95945ef 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -35,6 +35,10 @@ Options: -p, --plugin The plugin(s) to use (can be specified multiple times) -r, --reporter The reporter to use for reporting the migration progress -l, --limit Limit the number of migrations to run + -f, --from Start running migrations from the given migration name, the given name doesn't need to exist + and is compared in lexicographical order + -t, --to Skip migrations after the given migration name, the given name doesn't need to exist + and is compared in lexicographical order --dry List the pending migrations that would be run without actually running them --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) @@ -45,6 +49,8 @@ Examples: emigrate up -d ./migrations --storage @emigrate/mysql emigrate up -d src/migrations -s postgres -r json --dry emigrate up -d ./migrations -s mysql --import dotenv/config + emigrate up --limit 1 + emigrate up --to 20231122120529381_some_migration_file.js ``` ### Examples diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 203287a..1ac7520 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -52,6 +52,14 @@ const up: Action = async (args) => { type: 'string', short: 'l', }, + from: { + type: 'string', + short: 'f', + }, + to: { + type: 'string', + short: 't', + }, dry: { type: 'boolean', }, @@ -85,6 +93,10 @@ Options: -p, --plugin The plugin(s) to use (can be specified multiple times) -r, --reporter The reporter to use for reporting the migration progress -l, --limit Limit the number of migrations to run + -f, --from Start running migrations from the given migration name, the given name doesn't need to exist + and is compared in lexicographical order + -t, --to Skip migrations after the given migration name, the given name doesn't need to exist + and is compared in lexicographical order --dry List the pending migrations that would be run without actually running them --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) @@ -95,6 +107,8 @@ Examples: emigrate up -d ./migrations --storage @emigrate/mysql emigrate up -d src/migrations -s postgres -r json --dry emigrate up -d ./migrations -s mysql --import dotenv/config + emigrate up --limit 1 + emigrate up --to 20231122120529381_some_migration_file.js `; if (values.help) { @@ -109,6 +123,8 @@ Examples: storage = config.storage, reporter = config.reporter, dry, + from, + to, limit: limitString, import: imports = [], } = values; @@ -135,6 +151,8 @@ Examples: cwd, dry, limit, + from, + to, color: useColors(values), }); } catch (error) { diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index f9d42cd..df4a07e 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -10,9 +10,11 @@ import { type SerializedError, type FailedMigrationHistoryEntry, type NonFailedMigrationHistoryEntry, + type MigrationMetadataFinished, } from '@emigrate/types'; import { deserializeError } from 'serialize-error'; import { version } from '../get-package-info.js'; +import { BadOptionError, MigrationHistoryError, MigrationRunError, StorageInitError } from '../errors.js'; import upCommand from './up.js'; type Mocked = { @@ -27,25 +29,7 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 0); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - dry: false, - color: undefined, - version, - directory: 'migrations', - }, - ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onFinished.mock.calls[0]?.arguments, [[], undefined]); + assertPreconditionsFulfilled({ dry: false }, reporter, []); }); it('returns 0 and finishes without an error when all migrations have already been run', async () => { @@ -54,25 +38,7 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 0); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - dry: false, - color: undefined, - version, - directory: 'migrations', - }, - ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onFinished.mock.calls[0]?.arguments, [[], undefined]); + assertPreconditionsFulfilled({ dry: false }, reporter, []); }); it('returns 0 and finishes without an error when all migrations have already been run even when the history responds without file extensions', async () => { @@ -81,25 +47,7 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 0); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - dry: false, - color: undefined, - version, - directory: 'migrations', - }, - ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onFinished.mock.calls[0]?.arguments, [[], undefined]); + assertPreconditionsFulfilled({ dry: false }, reporter, []); }); it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin', async () => { @@ -108,48 +56,40 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 1); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 1); - const args = reporter.onFinished.mock.calls[0]?.arguments; - assert.strictEqual(args?.length, 2); - const entries = args[0]; - const error = args[1]; - assert.deepStrictEqual( - entries.map((entry) => `${entry.name} (${entry.status})`), - ['some_other.js (skipped)', 'some_file.sql (failed)'], + assertPreconditionsFulfilled( + { dry: false }, + reporter, + [ + { name: 'some_other.js', status: 'skipped' }, + { + name: 'some_file.sql', + status: 'failed', + error: BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), + }, + ], + BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), ); - assert.strictEqual(entries.length, 2); - assert.strictEqual(error?.message, 'No loader plugin found for file extension: .sql'); }); it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin in dry-run mode as well', async () => { const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], getStorage([])); - const exitCode = await run(); + const exitCode = await run({ dry: true }); assert.strictEqual(exitCode, 1); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 1); - const args = reporter.onFinished.mock.calls[0]?.arguments; - assert.strictEqual(args?.length, 2); - const entries = args[0]; - const error = args[1]; - assert.strictEqual(entries.length, 2); - assert.deepStrictEqual( - entries.map((entry) => `${entry.name} (${entry.status})`), - ['some_other.js (skipped)', 'some_file.sql (failed)'], + assertPreconditionsFulfilled( + { dry: true }, + reporter, + [ + { name: 'some_other.js', status: 'skipped' }, + { + name: 'some_file.sql', + status: 'failed', + error: BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), + }, + ], + BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), ); - assert.strictEqual(error?.message, 'No loader plugin found for file extension: .sql'); }); it('returns 1 and finishes with an error when there are failed migrations in the history', async () => { @@ -159,38 +99,24 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 1); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - version, - dry: false, - color: undefined, - directory: 'migrations', - }, - ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 1); - assert.deepStrictEqual( - getErrorCause(reporter.onMigrationError.mock.calls[0]?.arguments[1]), - deserializeError(failedEntry.error), - ); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 1); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assert.strictEqual( - error?.message, - `Migration ${failedEntry.name} is in a failed state, it should be fixed and removed`, - ); - assert.deepStrictEqual(getErrorCause(error), deserializeError(failedEntry.error)); - assert.strictEqual(entries?.length, 2); - assert.deepStrictEqual( - entries.map((entry) => `${entry.name} (${entry.status})`), - ['some_failed_migration.js (failed)', 'some_file.js (skipped)'], + assertPreconditionsFulfilled( + { dry: false }, + reporter, + [ + { + name: 'some_failed_migration.js', + status: 'failed', + error: new MigrationHistoryError( + 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', + { cause: failedEntry.error }, + ), + }, + { name: 'some_file.js', status: 'skipped' }, + ], + new MigrationHistoryError( + 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', + { cause: failedEntry.error }, + ), ); }); @@ -201,38 +127,24 @@ describe('up', () => { const exitCode = await run({ dry: true }); assert.strictEqual(exitCode, 1); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - version, - dry: true, - color: undefined, - directory: 'migrations', - }, - ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 1); - assert.deepStrictEqual( - getErrorCause(reporter.onMigrationError.mock.calls[0]?.arguments[1]), - deserializeError(failedEntry.error), - ); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 1); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assert.strictEqual( - error?.message, - `Migration ${failedEntry.name} is in a failed state, it should be fixed and removed`, - ); - assert.deepStrictEqual(getErrorCause(error), deserializeError(failedEntry.error)); - assert.strictEqual(entries?.length, 2); - assert.deepStrictEqual( - entries.map((entry) => `${entry.name} (${entry.status})`), - ['some_failed_migration.js (failed)', 'some_file.js (pending)'], + assertPreconditionsFulfilled( + { dry: true }, + reporter, + [ + { + name: 'some_failed_migration.js', + status: 'failed', + error: new MigrationHistoryError( + 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', + { cause: failedEntry.error }, + ), + }, + { name: 'some_file.js', status: 'skipped' }, + ], + new MigrationHistoryError( + 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', + { cause: failedEntry.error }, + ), ); }); @@ -243,25 +155,7 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 0); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - version, - dry: false, - color: undefined, - directory: 'migrations', - }, - ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onFinished.mock.calls[0]?.arguments, [[], undefined]); + assertPreconditionsFulfilled({ dry: false }, reporter, []); }); it("returns 1 and finishes with an error when the storage couldn't be initialized", async () => { @@ -270,32 +164,7 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 1); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - version, - dry: false, - color: undefined, - directory: 'migrations', - }, - ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 0); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - const args = reporter.onFinished.mock.calls[0]?.arguments; - assert.strictEqual(args?.length, 2); - const entries = args[0]; - const error = args[1]; - const cause = getErrorCause(error); - assert.deepStrictEqual(entries, []); - assert.strictEqual(error?.message, 'Could not initialize storage'); - assert.strictEqual(cause?.message, 'No storage configured'); + assertPreconditionsFailed({ dry: false }, reporter, StorageInitError.fromError(new Error('No storage configured'))); }); it('returns 0 and finishes without an error when all pending migrations are run successfully', async () => { @@ -317,31 +186,10 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 0); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - version, - dry: false, - color: undefined, - directory: 'migrations', - }, + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: 'some_migration.js', status: 'done', started: true }, + { name: 'some_other_migration.js', status: 'done', started: true }, ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 2); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 2); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assert.strictEqual(error, undefined); - assert.strictEqual(entries?.length, 2); - assert.deepStrictEqual( - entries.map((entry) => `${entry.name} (${entry.status})`), - ['some_migration.js (done)', 'some_other_migration.js (done)'], - ); }); it('returns 0 and finishes without an error when the given number of pending migrations are run successfully', async () => { @@ -363,31 +211,10 @@ describe('up', () => { const exitCode = await run({ limit: 1 }); assert.strictEqual(exitCode, 0); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - version, - dry: false, - color: undefined, - directory: 'migrations', - }, + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: 'some_migration.js', status: 'done', started: true }, + { name: 'some_other_migration.js', status: 'skipped' }, ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 1); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assert.strictEqual(error, undefined); - assert.strictEqual(entries?.length, 2); - assert.deepStrictEqual( - entries.map((entry) => `${entry.name} (${entry.status})`), - ['some_migration.js (done)', 'some_other_migration.js (skipped)'], - ); }); it('returns 0 and finishes without an error with the given number of pending migrations are validated and listed successfully in dry-mode', async () => { @@ -399,31 +226,125 @@ describe('up', () => { const exitCode = await run({ dry: true, limit: 1 }); assert.strictEqual(exitCode, 0); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - version, - dry: true, - color: undefined, - directory: 'migrations', - }, + assertPreconditionsFulfilled({ dry: true }, reporter, [ + { name: 'some_migration.js', status: 'pending' }, + { name: 'some_other_migration.js', status: 'skipped' }, ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 2); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assert.strictEqual(error, undefined); - assert.strictEqual(entries?.length, 2); - assert.deepStrictEqual( - entries.map((entry) => `${entry.name} (${entry.status})`), - ['some_migration.js (pending)', 'some_other_migration.js (skipped)'], + }); + + it('returns 0 and finishes without an error when pending migrations after given "from" parameter are run successfully, even when the "from" is not an existing migration', async () => { + const { reporter, run } = getUpCommand( + ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return async () => { + // Success + }; + }, + }, + ], ); + + const exitCode = await run({ from: '3_non_existing_migration.js' }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '4_some_other_migration.js', status: 'done', started: true }, + ]); + }); + + it('returns 0 and finishes without an error when pending migrations after given "from" parameter are validated and listed successfully in dry-mode, even when the "from" is not an existing migration', async () => { + const { reporter, run } = getUpCommand( + ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + getStorage(['1_some_already_run_migration.js']), + ); + + const exitCode = await run({ dry: true, from: '3_non_existing_migration.js' }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: true }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '4_some_other_migration.js', status: 'pending' }, + ]); + }); + + it('returns 0 and finishes without an error when pending migrations before given "to" parameter are run successfully, even when the "to" is not an existing migration', async () => { + const { reporter, run } = getUpCommand( + ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return async () => { + // Success + }; + }, + }, + ], + ); + + const exitCode = await run({ to: '3_non_existing_migration.js' }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'skipped' }, + ]); + }); + + it('returns 0 and finishes without an error when pending migrations after given "to" parameter are validated and listed successfully in dry-mode, even when the "to" is not an existing migration', async () => { + const { reporter, run } = getUpCommand( + ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + getStorage(['1_some_already_run_migration.js']), + ); + + const exitCode = await run({ dry: true, to: '3_non_existing_migration.js' }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: true }, reporter, [ + { name: '2_some_migration.js', status: 'pending' }, + { name: '4_some_other_migration.js', status: 'skipped' }, + ]); + }); + + it('returns 0 and finishes without an error when the pending migrations fulfilling "from", "to" and "limit" are run successfully', async () => { + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_another_migration.js', + '4_some_other_migration.js', + '5_yet_another_migration.js', + '6_some_more_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return async () => { + // Success + }; + }, + }, + ], + ); + + const exitCode = await run({ from: '3_another_migration.js', to: '5_yet_another_migration.js', limit: 2 }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '3_another_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'done', started: true }, + { name: '5_yet_another_migration.js', status: 'skipped' }, + { name: '6_some_more_migration.js', status: 'skipped' }, + ]); }); it('returns 1 and finishes with an error when a pending migration throw when run', async () => { @@ -447,33 +368,15 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 1); - assert.strictEqual(reporter.onInit.mock.calls.length, 1); - assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ - { - command: 'up', - cwd: '/emigrate', - version, - dry: false, - color: undefined, - directory: 'migrations', - }, - ]); - assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 2); - assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationError.mock.calls.length, 1); - assert.strictEqual(reporter.onMigrationError.mock.calls[0]?.arguments[1]?.message, 'Oh noes!'); - assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 1); - assert.strictEqual(reporter.onFinished.mock.calls.length, 1); - const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assert.strictEqual(error?.message, 'Failed to run migration: migrations/fail.js'); - const cause = getErrorCause(error); - assert.strictEqual(cause?.message, 'Oh noes!'); - assert.strictEqual(entries?.length, 3); - assert.deepStrictEqual( - entries.map((entry) => `${entry.name} (${entry.status})`), - ['some_migration.js (done)', 'fail.js (failed)', 'some_other_migration.js (skipped)'], + assertPreconditionsFulfilled( + { dry: false }, + reporter, + [ + { name: 'some_migration.js', status: 'done', started: true }, + { name: 'fail.js', status: 'failed', started: true, error: new Error('Oh noes!') }, + { name: 'some_other_migration.js', status: 'skipped' }, + ], + new MigrationRunError('Failed to run migration: migrations/fail.js', { cause: new Error('Oh noes!') }), ); }); }); @@ -610,3 +513,127 @@ function getUpCommand(migrationFiles: string[], storage?: Mocked, plugi run, }; } + +function assertPreconditionsFulfilled( + options: { dry: boolean }, + reporter: Mocked>, + expected: Array<{ name: string; status: MigrationMetadataFinished['status']; started?: boolean; error?: Error }>, + finishedError?: Error, +) { + assert.strictEqual(reporter.onInit.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ + { + command: 'up', + cwd: '/emigrate', + version, + dry: options.dry, + color: undefined, + directory: 'migrations', + }, + ]); + + let started = 0; + let done = 0; + let failed = 0; + let skipped = 0; + let pending = 0; + const failedEntries: typeof expected = []; + + for (const entry of expected) { + if (entry.started) { + started++; + } + + // eslint-disable-next-line default-case + switch (entry.status) { + case 'done': { + done++; + break; + } + + case 'failed': { + failed++; + failedEntries.push(entry); + break; + } + + case 'skipped': { + skipped++; + break; + } + + case 'pending': { + pending++; + break; + } + } + } + + assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1, 'Collected call'); + assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 1, 'Locked call'); + assert.strictEqual(reporter.onMigrationStart.mock.calls.length, started, 'Started migrations'); + assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, done, 'Successful migrations'); + assert.strictEqual(reporter.onMigrationError.mock.calls.length, failed, 'Failed migrations'); + + for (const [index, entry] of failedEntries.entries()) { + if (entry.status === 'failed') { + const error = reporter.onMigrationError.mock.calls[index]?.arguments[1]; + assert.deepStrictEqual(error, entry.error, 'Error'); + const cause = entry.error?.cause; + assert.deepStrictEqual(error?.cause, cause ? deserializeError(cause) : cause, 'Error cause'); + } + } + + assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, pending + skipped, 'Total pending and skipped'); + assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); + const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; + assert.deepStrictEqual(error, finishedError, 'Finished error'); + const cause = getErrorCause(error); + const expectedCause = finishedError?.cause; + assert.deepStrictEqual( + cause, + expectedCause ? deserializeError(expectedCause) : expectedCause, + 'Finished error cause', + ); + assert.strictEqual(entries?.length, expected.length, 'Finished entries length'); + assert.deepStrictEqual( + entries.map((entry) => `${entry.name} (${entry.status})`), + expected.map((entry) => `${entry.name} (${entry.status})`), + 'Finished entries', + ); +} + +function assertPreconditionsFailed( + options: { dry: boolean }, + reporter: Mocked>, + finishedError?: Error, +) { + assert.strictEqual(reporter.onInit.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ + { + command: 'up', + cwd: '/emigrate', + version, + dry: options.dry, + color: undefined, + directory: 'migrations', + }, + ]); + assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 0, 'Collected call'); + assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 0, 'Locked call'); + assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0, 'Started migrations'); + assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0, 'Successful migrations'); + assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0, 'Failed migrations'); + assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0, 'Total pending and skipped'); + assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); + const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; + assert.deepStrictEqual(error, finishedError, 'Finished error'); + const cause = getErrorCause(error); + const expectedCause = finishedError?.cause; + assert.deepStrictEqual( + cause, + expectedCause ? deserializeError(expectedCause) : expectedCause, + 'Finished error cause', + ); + assert.strictEqual(entries?.length, 0, 'Finished entries length'); +} diff --git a/packages/cli/src/commands/up.ts b/packages/cli/src/commands/up.ts index 9613982..6ffecdc 100644 --- a/packages/cli/src/commands/up.ts +++ b/packages/cli/src/commands/up.ts @@ -15,6 +15,8 @@ type ExtraFlags = { cwd: string; dry?: boolean; limit?: number; + from?: string; + to?: string; getMigrations?: GetMigrationsFunction; }; @@ -27,6 +29,8 @@ export default async function upCommand({ directory, color, limit, + from, + to, dry = false, plugins = [], cwd, @@ -86,6 +90,8 @@ export default async function upCommand({ const error = await migrationRunner({ dry, limit, + from, + to, reporter, storage, migrations: await arrayFromAsync(collectedMigrations), diff --git a/packages/cli/src/migration-runner.ts b/packages/cli/src/migration-runner.ts index f62011e..e09d6c4 100644 --- a/packages/cli/src/migration-runner.ts +++ b/packages/cli/src/migration-runner.ts @@ -16,6 +16,8 @@ import { getDuration } from './get-duration.js'; type MigrationRunnerParameters = { dry: boolean; limit?: number; + from?: string; + to?: string; reporter: EmigrateReporter; storage: Storage; migrations: Array; @@ -26,6 +28,8 @@ type MigrationRunnerParameters = { export const migrationRunner = async ({ dry, limit, + from, + to, reporter, storage, migrations, @@ -34,8 +38,8 @@ export const migrationRunner = async ({ }: MigrationRunnerParameters): Promise => { await reporter.onCollectedMigrations?.(migrations); - const finishedMigrations: MigrationMetadataFinished[] = []; - const migrationsToRun: MigrationMetadata[] = []; + const validatedMigrations: Array = []; + const migrationsToLock: MigrationMetadata[] = []; let skip = false; @@ -43,24 +47,35 @@ export const migrationRunner = async ({ if (isFinishedMigration(migration)) { skip ||= migration.status === 'failed' || migration.status === 'skipped'; - finishedMigrations.push(migration); - } else if (skip) { - finishedMigrations.push({ + validatedMigrations.push(migration); + } else if ( + skip || + Boolean(from && migration.name < from) || + Boolean(to && migration.name > to) || + (limit && migrationsToLock.length >= limit) + ) { + validatedMigrations.push({ ...migration, - status: dry ? 'pending' : 'skipped', + status: 'skipped', }); } else { try { await validate(migration); - migrationsToRun.push(migration); + migrationsToLock.push(migration); + validatedMigrations.push(migration); } catch (error) { - for await (const migration of migrationsToRun) { - finishedMigrations.push({ ...migration, status: 'skipped' }); + for (const migration of migrationsToLock) { + const validatedIndex = validatedMigrations.indexOf(migration); + + validatedMigrations[validatedIndex] = { + ...migration, + status: 'skipped', + }; } - migrationsToRun.length = 0; + migrationsToLock.length = 0; - finishedMigrations.push({ + validatedMigrations.push({ ...migration, status: 'failed', duration: 0, @@ -72,50 +87,70 @@ export const migrationRunner = async ({ } } - const migrationsToLock = limit ? migrationsToRun.slice(0, limit) : migrationsToRun; - const migrationsToSkip = limit ? migrationsToRun.slice(limit) : []; - const [lockedMigrations, lockError] = dry ? [migrationsToLock] : await exec(async () => storage.lock(migrationsToLock)); if (lockError) { - for await (const migration of migrationsToRun) { - finishedMigrations.push({ ...migration, status: 'skipped' }); + for (const migration of migrationsToLock) { + const validatedIndex = validatedMigrations.indexOf(migration); + + validatedMigrations[validatedIndex] = { + ...migration, + status: 'skipped', + }; } - migrationsToRun.length = 0; + migrationsToLock.length = 0; skip = true; } else { + for (const migration of migrationsToLock) { + const isLocked = lockedMigrations.some((lockedMigration) => lockedMigration.name === migration.name); + + if (!isLocked) { + const validatedIndex = validatedMigrations.indexOf(migration); + + validatedMigrations[validatedIndex] = { + ...migration, + status: 'skipped', + }; + } + } + await reporter.onLockedMigrations?.(lockedMigrations); } - for await (const finishedMigration of finishedMigrations) { - switch (finishedMigration.status) { - case 'failed': { - await reporter.onMigrationError?.(finishedMigration, finishedMigration.error); - break; + const finishedMigrations: MigrationMetadataFinished[] = []; + + for await (const migration of validatedMigrations) { + if (isFinishedMigration(migration)) { + switch (migration.status) { + case 'failed': { + await reporter.onMigrationError?.(migration, migration.error); + break; + } + + case 'pending': { + await reporter.onMigrationSkip?.(migration); + break; + } + + case 'skipped': { + await reporter.onMigrationSkip?.(migration); + break; + } + + default: { + await reporter.onMigrationSuccess?.(migration); + break; + } } - case 'pending': { - await reporter.onMigrationSkip?.(finishedMigration); - break; - } - - case 'skipped': { - await reporter.onMigrationSkip?.(finishedMigration); - break; - } - - default: { - await reporter.onMigrationSuccess?.(finishedMigration); - break; - } + finishedMigrations.push(migration); + continue; } - } - for await (const migration of lockedMigrations ?? []) { if (dry || skip) { const finishedMigration: MigrationMetadataFinished = { ...migration, @@ -159,17 +194,6 @@ export const migrationRunner = async ({ } } - for await (const migration of migrationsToSkip) { - const finishedMigration: MigrationMetadataFinished = { - ...migration, - status: 'skipped', - }; - - await reporter.onMigrationSkip?.(finishedMigration); - - finishedMigrations.push(finishedMigration); - } - const [, unlockError] = dry ? [] : await exec(async () => storage.unlock(lockedMigrations ?? [])); // eslint-disable-next-line unicorn/no-array-callback-reference From e71c318ea5fb01fe9e57773309e1138ef96a3130 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 19 Jan 2024 11:05:23 +0100 Subject: [PATCH 064/136] test(up): structure the up tests in a better way --- packages/cli/src/commands/up.test.ts | 566 ++++++++++++++------------- 1 file changed, 291 insertions(+), 275 deletions(-) diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index df4a07e..dce2c1e 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -23,6 +23,15 @@ type Mocked = { }; describe('up', () => { + it("returns 1 and finishes with an error when the storage couldn't be initialized", async () => { + const { reporter, run } = getUpCommand(['some_migration.js']); + + const exitCode = await run(); + + assert.strictEqual(exitCode, 1); + assertPreconditionsFailed({ dry: false }, reporter, StorageInitError.fromError(new Error('No storage configured'))); + }); + it('returns 0 and finishes without an error when there are no migrations to run', async () => { const { reporter, run } = getUpCommand([], getStorage([])); @@ -50,124 +59,10 @@ describe('up', () => { assertPreconditionsFulfilled({ dry: false }, reporter, []); }); - it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin', async () => { - const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], getStorage([])); - - const exitCode = await run(); - - assert.strictEqual(exitCode, 1); - assertPreconditionsFulfilled( - { dry: false }, - reporter, - [ - { name: 'some_other.js', status: 'skipped' }, - { - name: 'some_file.sql', - status: 'failed', - error: BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), - }, - ], - BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), - ); - }); - - it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin in dry-run mode as well', async () => { - const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], getStorage([])); - - const exitCode = await run({ dry: true }); - - assert.strictEqual(exitCode, 1); - assertPreconditionsFulfilled( - { dry: true }, - reporter, - [ - { name: 'some_other.js', status: 'skipped' }, - { - name: 'some_file.sql', - status: 'failed', - error: BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), - }, - ], - BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), - ); - }); - - it('returns 1 and finishes with an error when there are failed migrations in the history', async () => { - const failedEntry = toEntry('some_failed_migration.js', 'failed'); - const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], getStorage([failedEntry])); - - const exitCode = await run(); - - assert.strictEqual(exitCode, 1); - assertPreconditionsFulfilled( - { dry: false }, - reporter, - [ - { - name: 'some_failed_migration.js', - status: 'failed', - error: new MigrationHistoryError( - 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', - { cause: failedEntry.error }, - ), - }, - { name: 'some_file.js', status: 'skipped' }, - ], - new MigrationHistoryError( - 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', - { cause: failedEntry.error }, - ), - ); - }); - - it('returns 1 and finishes with an error when there are failed migrations in the history in dry-run mode as well', async () => { - const failedEntry = toEntry('some_failed_migration.js', 'failed'); - const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], getStorage([failedEntry])); - - const exitCode = await run({ dry: true }); - - assert.strictEqual(exitCode, 1); - assertPreconditionsFulfilled( - { dry: true }, - reporter, - [ - { - name: 'some_failed_migration.js', - status: 'failed', - error: new MigrationHistoryError( - 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', - { cause: failedEntry.error }, - ), - }, - { name: 'some_file.js', status: 'skipped' }, - ], - new MigrationHistoryError( - 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', - { cause: failedEntry.error }, - ), - ); - }); - - it('returns 0 and finishes without an error when the failed migrations in the history are not part of the current set of migrations', async () => { - const failedEntry = toEntry('some_failed_migration.js', 'failed'); - const { reporter, run } = getUpCommand([], getStorage([failedEntry])); - - const exitCode = await run(); - - assert.strictEqual(exitCode, 0); - assertPreconditionsFulfilled({ dry: false }, reporter, []); - }); - - it("returns 1 and finishes with an error when the storage couldn't be initialized", async () => { - const { reporter, run } = getUpCommand(['some_migration.js']); - - const exitCode = await run(); - - assert.strictEqual(exitCode, 1); - assertPreconditionsFailed({ dry: false }, reporter, StorageInitError.fromError(new Error('No storage configured'))); - }); - it('returns 0 and finishes without an error when all pending migrations are run successfully', async () => { + const migration = mock.fn(async () => { + // Success + }); const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], getStorage(['some_already_run_migration.js']), @@ -175,9 +70,7 @@ describe('up', () => { { loadableExtensions: ['.js'], async loadMigration() { - return async () => { - // Success - }; + return migration; }, }, ], @@ -190,161 +83,7 @@ describe('up', () => { { name: 'some_migration.js', status: 'done', started: true }, { name: 'some_other_migration.js', status: 'done', started: true }, ]); - }); - - it('returns 0 and finishes without an error when the given number of pending migrations are run successfully', async () => { - const { reporter, run } = getUpCommand( - ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], - getStorage(['some_already_run_migration.js']), - [ - { - loadableExtensions: ['.js'], - async loadMigration() { - return async () => { - // Success - }; - }, - }, - ], - ); - - const exitCode = await run({ limit: 1 }); - - assert.strictEqual(exitCode, 0); - assertPreconditionsFulfilled({ dry: false }, reporter, [ - { name: 'some_migration.js', status: 'done', started: true }, - { name: 'some_other_migration.js', status: 'skipped' }, - ]); - }); - - it('returns 0 and finishes without an error with the given number of pending migrations are validated and listed successfully in dry-mode', async () => { - const { reporter, run } = getUpCommand( - ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], - getStorage(['some_already_run_migration.js']), - ); - - const exitCode = await run({ dry: true, limit: 1 }); - - assert.strictEqual(exitCode, 0); - assertPreconditionsFulfilled({ dry: true }, reporter, [ - { name: 'some_migration.js', status: 'pending' }, - { name: 'some_other_migration.js', status: 'skipped' }, - ]); - }); - - it('returns 0 and finishes without an error when pending migrations after given "from" parameter are run successfully, even when the "from" is not an existing migration', async () => { - const { reporter, run } = getUpCommand( - ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], - getStorage(['1_some_already_run_migration.js']), - [ - { - loadableExtensions: ['.js'], - async loadMigration() { - return async () => { - // Success - }; - }, - }, - ], - ); - - const exitCode = await run({ from: '3_non_existing_migration.js' }); - - assert.strictEqual(exitCode, 0); - assertPreconditionsFulfilled({ dry: false }, reporter, [ - { name: '2_some_migration.js', status: 'skipped' }, - { name: '4_some_other_migration.js', status: 'done', started: true }, - ]); - }); - - it('returns 0 and finishes without an error when pending migrations after given "from" parameter are validated and listed successfully in dry-mode, even when the "from" is not an existing migration', async () => { - const { reporter, run } = getUpCommand( - ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], - getStorage(['1_some_already_run_migration.js']), - ); - - const exitCode = await run({ dry: true, from: '3_non_existing_migration.js' }); - - assert.strictEqual(exitCode, 0); - assertPreconditionsFulfilled({ dry: true }, reporter, [ - { name: '2_some_migration.js', status: 'skipped' }, - { name: '4_some_other_migration.js', status: 'pending' }, - ]); - }); - - it('returns 0 and finishes without an error when pending migrations before given "to" parameter are run successfully, even when the "to" is not an existing migration', async () => { - const { reporter, run } = getUpCommand( - ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], - getStorage(['1_some_already_run_migration.js']), - [ - { - loadableExtensions: ['.js'], - async loadMigration() { - return async () => { - // Success - }; - }, - }, - ], - ); - - const exitCode = await run({ to: '3_non_existing_migration.js' }); - - assert.strictEqual(exitCode, 0); - assertPreconditionsFulfilled({ dry: false }, reporter, [ - { name: '2_some_migration.js', status: 'done', started: true }, - { name: '4_some_other_migration.js', status: 'skipped' }, - ]); - }); - - it('returns 0 and finishes without an error when pending migrations after given "to" parameter are validated and listed successfully in dry-mode, even when the "to" is not an existing migration', async () => { - const { reporter, run } = getUpCommand( - ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], - getStorage(['1_some_already_run_migration.js']), - ); - - const exitCode = await run({ dry: true, to: '3_non_existing_migration.js' }); - - assert.strictEqual(exitCode, 0); - assertPreconditionsFulfilled({ dry: true }, reporter, [ - { name: '2_some_migration.js', status: 'pending' }, - { name: '4_some_other_migration.js', status: 'skipped' }, - ]); - }); - - it('returns 0 and finishes without an error when the pending migrations fulfilling "from", "to" and "limit" are run successfully', async () => { - const { reporter, run } = getUpCommand( - [ - '1_some_already_run_migration.js', - '2_some_migration.js', - '3_another_migration.js', - '4_some_other_migration.js', - '5_yet_another_migration.js', - '6_some_more_migration.js', - ], - getStorage(['1_some_already_run_migration.js']), - [ - { - loadableExtensions: ['.js'], - async loadMigration() { - return async () => { - // Success - }; - }, - }, - ], - ); - - const exitCode = await run({ from: '3_another_migration.js', to: '5_yet_another_migration.js', limit: 2 }); - - assert.strictEqual(exitCode, 0); - assertPreconditionsFulfilled({ dry: false }, reporter, [ - { name: '2_some_migration.js', status: 'skipped' }, - { name: '3_another_migration.js', status: 'done', started: true }, - { name: '4_some_other_migration.js', status: 'done', started: true }, - { name: '5_yet_another_migration.js', status: 'skipped' }, - { name: '6_some_more_migration.js', status: 'skipped' }, - ]); + assert.strictEqual(migration.mock.calls.length, 2); }); it('returns 1 and finishes with an error when a pending migration throw when run', async () => { @@ -379,6 +118,283 @@ describe('up', () => { new MigrationRunError('Failed to run migration: migrations/fail.js', { cause: new Error('Oh noes!') }), ); }); + + describe('each migration file extension needs a corresponding loader plugin', () => { + it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin', async () => { + const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], getStorage([])); + + const exitCode = await run(); + + assert.strictEqual(exitCode, 1); + assertPreconditionsFulfilled( + { dry: false }, + reporter, + [ + { name: 'some_other.js', status: 'skipped' }, + { + name: 'some_file.sql', + status: 'failed', + error: BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), + }, + ], + BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), + ); + }); + + it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin in dry-run mode as well', async () => { + const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], getStorage([])); + + const exitCode = await run({ dry: true }); + + assert.strictEqual(exitCode, 1); + assertPreconditionsFulfilled( + { dry: true }, + reporter, + [ + { name: 'some_other.js', status: 'skipped' }, + { + name: 'some_file.sql', + status: 'failed', + error: BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), + }, + ], + BadOptionError.fromOption('plugin', 'No loader plugin found for file extension: .sql'), + ); + }); + }); + + describe('failed migrations in the history are blocking', () => { + it('returns 1 and finishes with an error when there are failed migrations in the history', async () => { + const failedEntry = toEntry('some_failed_migration.js', 'failed'); + const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], getStorage([failedEntry])); + + const exitCode = await run(); + + assert.strictEqual(exitCode, 1); + assertPreconditionsFulfilled( + { dry: false }, + reporter, + [ + { + name: 'some_failed_migration.js', + status: 'failed', + error: new MigrationHistoryError( + 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', + { cause: failedEntry.error }, + ), + }, + { name: 'some_file.js', status: 'skipped' }, + ], + new MigrationHistoryError( + 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', + { cause: failedEntry.error }, + ), + ); + }); + + it('returns 1 and finishes with an error when there are failed migrations in the history in dry-run mode as well', async () => { + const failedEntry = toEntry('some_failed_migration.js', 'failed'); + const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], getStorage([failedEntry])); + + const exitCode = await run({ dry: true }); + + assert.strictEqual(exitCode, 1); + assertPreconditionsFulfilled( + { dry: true }, + reporter, + [ + { + name: 'some_failed_migration.js', + status: 'failed', + error: new MigrationHistoryError( + 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', + { cause: failedEntry.error }, + ), + }, + { name: 'some_file.js', status: 'skipped' }, + ], + new MigrationHistoryError( + 'Migration some_failed_migration.js is in a failed state, it should be fixed and removed', + { cause: failedEntry.error }, + ), + ); + }); + + it('returns 0 and finishes without an error when the failed migrations in the history are not part of the current set of migrations', async () => { + const failedEntry = toEntry('some_failed_migration.js', 'failed'); + const { reporter, run } = getUpCommand([], getStorage([failedEntry])); + + const exitCode = await run(); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: false }, reporter, []); + }); + }); + + it('returns 0 and finishes without an error when the given number of pending migrations are run successfully', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], + getStorage(['some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ limit: 1 }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: 'some_migration.js', status: 'done', started: true }, + { name: 'some_other_migration.js', status: 'skipped' }, + ]); + assert.strictEqual(migration.mock.calls.length, 1); + }); + + describe('limiting which pending migrations to run', () => { + it('returns 0 and finishes without an error with the given number of pending migrations are validated and listed successfully in dry-mode', async () => { + const { reporter, run } = getUpCommand( + ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], + getStorage(['some_already_run_migration.js']), + ); + + const exitCode = await run({ dry: true, limit: 1 }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: true }, reporter, [ + { name: 'some_migration.js', status: 'pending' }, + { name: 'some_other_migration.js', status: 'skipped' }, + ]); + }); + + it('returns 0 and finishes without an error when pending migrations after given "from" parameter are run successfully, even when the "from" is not an existing migration', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ from: '3_non_existing_migration.js' }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '4_some_other_migration.js', status: 'done', started: true }, + ]); + assert.strictEqual(migration.mock.calls.length, 1); + }); + + it('returns 0 and finishes without an error when pending migrations after given "from" parameter are validated and listed successfully in dry-mode, even when the "from" is not an existing migration', async () => { + const { reporter, run } = getUpCommand( + ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + getStorage(['1_some_already_run_migration.js']), + ); + + const exitCode = await run({ dry: true, from: '3_non_existing_migration.js' }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: true }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '4_some_other_migration.js', status: 'pending' }, + ]); + }); + + it('returns 0 and finishes without an error when pending migrations before given "to" parameter are run successfully, even when the "to" is not an existing migration', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ to: '3_non_existing_migration.js' }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'skipped' }, + ]); + assert.strictEqual(migration.mock.calls.length, 1); + }); + + it('returns 0 and finishes without an error when pending migrations after given "to" parameter are validated and listed successfully in dry-mode, even when the "to" is not an existing migration', async () => { + const { reporter, run } = getUpCommand( + ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + getStorage(['1_some_already_run_migration.js']), + ); + + const exitCode = await run({ dry: true, to: '3_non_existing_migration.js' }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: true }, reporter, [ + { name: '2_some_migration.js', status: 'pending' }, + { name: '4_some_other_migration.js', status: 'skipped' }, + ]); + }); + + it('returns 0 and finishes without an error when the pending migrations fulfilling "from", "to" and "limit" are run successfully', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_another_migration.js', + '4_some_other_migration.js', + '5_yet_another_migration.js', + '6_some_more_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ from: '3_another_migration.js', to: '5_yet_another_migration.js', limit: 2 }); + + assert.strictEqual(exitCode, 0); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '3_another_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'done', started: true }, + { name: '5_yet_another_migration.js', status: 'skipped' }, + { name: '6_some_more_migration.js', status: 'skipped' }, + ]); + assert.strictEqual(migration.mock.calls.length, 2); + }); + }); }); function getErrorCause(error: Error | undefined): Error | SerializedError | undefined { From f515c8a8547baded645444400985979e314e9e24 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 19 Jan 2024 13:13:33 +0100 Subject: [PATCH 065/136] feat(cli): add --no-execution option to the "up" command ...which can be used to log manually run migrations as successful or for baselining a database. --- .changeset/beige-bottles-tie.md | 5 ++ README.md | 3 + docs/src/content/docs/commands/up.mdx | 5 ++ packages/cli/README.md | 3 + packages/cli/src/cli.ts | 8 ++ packages/cli/src/commands/up.test.ts | 122 ++++++++++++++++++++++---- packages/cli/src/commands/up.ts | 10 +++ 7 files changed, 138 insertions(+), 18 deletions(-) create mode 100644 .changeset/beige-bottles-tie.md diff --git a/.changeset/beige-bottles-tie.md b/.changeset/beige-bottles-tie.md new file mode 100644 index 0000000..148f832 --- /dev/null +++ b/.changeset/beige-bottles-tie.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Add support for the --no-execution option to the "up" command to be able to log migrations as successful without actually running them. Can for instance be used for baselining a database or logging manually run migrations as successful. diff --git a/README.md b/README.md index bd62417..1d1521f 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,8 @@ Options: --dry List the pending migrations that would be run without actually running them --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) + --no-execution Mark the migrations as executed and successful without actually running them, + which is useful if you want to mark migrations as successful after running them manually Examples: @@ -72,6 +74,7 @@ Examples: emigrate up -d ./migrations -s mysql --import dotenv/config emigrate up --limit 1 emigrate up --to 20231122120529381_some_migration_file.js + emigrate up --to 20231122120529381_some_migration_file.js --no-execution ``` ### Examples diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 39d6151..1b6eedc 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -146,3 +146,8 @@ For example, if you want to use the `emigrate-reporter-somereporter` package, yo ### `--color`, `--no-color` Force enable/disable colored output, option is passed to the reporter which should respect it. + +### `--no-execution` + +Mark the migrations as executed and successful without actually running them, +which is useful if you want to mark migrations as successful after running them manually diff --git a/packages/cli/README.md b/packages/cli/README.md index 95945ef..87ee365 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -42,6 +42,8 @@ Options: --dry List the pending migrations that would be run without actually running them --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) + --no-execution Mark the migrations as executed and successful without actually running them, + which is useful if you want to mark migrations as successful after running them manually Examples: @@ -51,6 +53,7 @@ Examples: emigrate up -d ./migrations -s mysql --import dotenv/config emigrate up --limit 1 emigrate up --to 20231122120529381_some_migration_file.js + emigrate up --to 20231122120529381_some_migration_file.js --no-execution ``` ### Examples diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 1ac7520..999ef57 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -72,6 +72,9 @@ const up: Action = async (args) => { color: { type: 'boolean', }, + 'no-execution': { + type: 'boolean', + }, 'no-color': { type: 'boolean', }, @@ -100,6 +103,8 @@ Options: --dry List the pending migrations that would be run without actually running them --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) + --no-execution Mark the migrations as executed and successful without actually running them, + which is useful if you want to mark migrations as successful after running them manually Examples: @@ -109,6 +114,7 @@ Examples: emigrate up -d ./migrations -s mysql --import dotenv/config emigrate up --limit 1 emigrate up --to 20231122120529381_some_migration_file.js + emigrate up --to 20231122120529381_some_migration_file.js --no-execution `; if (values.help) { @@ -127,6 +133,7 @@ Examples: to, limit: limitString, import: imports = [], + 'no-execution': noExecution, } = values; const plugins = [...(config.plugins ?? []), ...(values.plugin ?? [])]; @@ -153,6 +160,7 @@ Examples: limit, from, to, + noExecution, color: useColors(values), }); } catch (error) { diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index dce2c1e..0ce4cde 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -28,7 +28,7 @@ describe('up', () => { const exitCode = await run(); - assert.strictEqual(exitCode, 1); + assert.strictEqual(exitCode, 1, 'Exit code'); assertPreconditionsFailed({ dry: false }, reporter, StorageInitError.fromError(new Error('No storage configured'))); }); @@ -37,7 +37,7 @@ describe('up', () => { const exitCode = await run(); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: false }, reporter, []); }); @@ -46,7 +46,7 @@ describe('up', () => { const exitCode = await run(); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: false }, reporter, []); }); @@ -55,7 +55,7 @@ describe('up', () => { const exitCode = await run(); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: false }, reporter, []); }); @@ -78,7 +78,7 @@ describe('up', () => { const exitCode = await run(); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: false }, reporter, [ { name: 'some_migration.js', status: 'done', started: true }, { name: 'some_other_migration.js', status: 'done', started: true }, @@ -106,7 +106,7 @@ describe('up', () => { const exitCode = await run(); - assert.strictEqual(exitCode, 1); + assert.strictEqual(exitCode, 1, 'Exit code'); assertPreconditionsFulfilled( { dry: false }, reporter, @@ -125,7 +125,7 @@ describe('up', () => { const exitCode = await run(); - assert.strictEqual(exitCode, 1); + assert.strictEqual(exitCode, 1, 'Exit code'); assertPreconditionsFulfilled( { dry: false }, reporter, @@ -146,7 +146,7 @@ describe('up', () => { const exitCode = await run({ dry: true }); - assert.strictEqual(exitCode, 1); + assert.strictEqual(exitCode, 1, 'Exit code'); assertPreconditionsFulfilled( { dry: true }, reporter, @@ -170,7 +170,7 @@ describe('up', () => { const exitCode = await run(); - assert.strictEqual(exitCode, 1); + assert.strictEqual(exitCode, 1, 'Exit code'); assertPreconditionsFulfilled( { dry: false }, reporter, @@ -198,7 +198,7 @@ describe('up', () => { const exitCode = await run({ dry: true }); - assert.strictEqual(exitCode, 1); + assert.strictEqual(exitCode, 1, 'Exit code'); assertPreconditionsFulfilled( { dry: true }, reporter, @@ -226,7 +226,7 @@ describe('up', () => { const exitCode = await run(); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: false }, reporter, []); }); }); @@ -250,7 +250,7 @@ describe('up', () => { const exitCode = await run({ limit: 1 }); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: false }, reporter, [ { name: 'some_migration.js', status: 'done', started: true }, { name: 'some_other_migration.js', status: 'skipped' }, @@ -267,7 +267,7 @@ describe('up', () => { const exitCode = await run({ dry: true, limit: 1 }); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: true }, reporter, [ { name: 'some_migration.js', status: 'pending' }, { name: 'some_other_migration.js', status: 'skipped' }, @@ -293,7 +293,7 @@ describe('up', () => { const exitCode = await run({ from: '3_non_existing_migration.js' }); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: false }, reporter, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '4_some_other_migration.js', status: 'done', started: true }, @@ -309,7 +309,7 @@ describe('up', () => { const exitCode = await run({ dry: true, from: '3_non_existing_migration.js' }); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: true }, reporter, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '4_some_other_migration.js', status: 'pending' }, @@ -335,7 +335,7 @@ describe('up', () => { const exitCode = await run({ to: '3_non_existing_migration.js' }); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: false }, reporter, [ { name: '2_some_migration.js', status: 'done', started: true }, { name: '4_some_other_migration.js', status: 'skipped' }, @@ -351,7 +351,7 @@ describe('up', () => { const exitCode = await run({ dry: true, to: '3_non_existing_migration.js' }); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: true }, reporter, [ { name: '2_some_migration.js', status: 'pending' }, { name: '4_some_other_migration.js', status: 'skipped' }, @@ -384,7 +384,7 @@ describe('up', () => { const exitCode = await run({ from: '3_another_migration.js', to: '5_yet_another_migration.js', limit: 2 }); - assert.strictEqual(exitCode, 0); + assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: false }, reporter, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '3_another_migration.js', status: 'done', started: true }, @@ -395,6 +395,92 @@ describe('up', () => { assert.strictEqual(migration.mock.calls.length, 2); }); }); + + describe('marking migrations as successful without running them', () => { + it('returns 0 and finishes without an error when the pending migrations have been marked as successful without executing them', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_another_migration.js', + '4_some_other_migration.js', + '5_yet_another_migration.js', + '6_some_more_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ + from: '3_another_migration.js', + to: '5_yet_another_migration.js', + limit: 2, + noExecution: true, + }); + + assert.strictEqual(exitCode, 0, 'Exit code'); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '3_another_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'done', started: true }, + { name: '5_yet_another_migration.js', status: 'skipped' }, + { name: '6_some_more_migration.js', status: 'skipped' }, + ]); + assert.strictEqual(migration.mock.calls.length, 0); + }); + }); + + it('returns 0 and finishes without an error when the pending migrations have been marked as successful without executing them even though they have no corresponding loader', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_another_migration.js', + '4_some_other_migration.sql', + '5_yet_another_migration.js', + '6_some_more_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ + from: '3_another_migration.js', + to: '5_yet_another_migration.js', + limit: 2, + noExecution: true, + }); + + assert.strictEqual(exitCode, 0, 'Exit code'); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '3_another_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.sql', status: 'done', started: true }, + { name: '5_yet_another_migration.js', status: 'skipped' }, + { name: '6_some_more_migration.js', status: 'skipped' }, + ]); + assert.strictEqual(migration.mock.calls.length, 0); + }); }); function getErrorCause(error: Error | undefined): Error | SerializedError | undefined { diff --git a/packages/cli/src/commands/up.ts b/packages/cli/src/commands/up.ts index 6ffecdc..896c443 100644 --- a/packages/cli/src/commands/up.ts +++ b/packages/cli/src/commands/up.ts @@ -17,6 +17,7 @@ type ExtraFlags = { limit?: number; from?: string; to?: string; + noExecution?: boolean; getMigrations?: GetMigrationsFunction; }; @@ -31,6 +32,7 @@ export default async function upCommand({ limit, from, to, + noExecution, dry = false, plugins = [], cwd, @@ -96,6 +98,10 @@ export default async function upCommand({ storage, migrations: await arrayFromAsync(collectedMigrations), async validate(migration) { + if (noExecution) { + return; + } + const loader = getLoaderByExtension(migration.extension); if (!loader) { @@ -106,6 +112,10 @@ export default async function upCommand({ } }, async execute(migration) { + if (noExecution) { + return; + } + const loader = getLoaderByExtension(migration.extension)!; const [migrationFunction, loadError] = await exec(async () => loader.loadMigration(migration)); From e739e453d7cd96e31a86842f68e8b6eda2730da1 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 19 Jan 2024 13:18:29 +0100 Subject: [PATCH 066/136] docs: add Baseline guide --- docs/astro.config.mjs | 14 +- docs/src/content/docs/commands/up.mdx | 4 + docs/src/content/docs/guides/baseline.mdx | 255 ++++++++++++++++++++ docs/src/content/docs/intro/quick-start.mdx | 10 +- 4 files changed, 276 insertions(+), 7 deletions(-) create mode 100644 docs/src/content/docs/guides/baseline.mdx diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 063a49e..679de7d 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -105,13 +105,17 @@ export default defineConfig({ label: 'Using TypeScript', link: '/guides/typescript/', }, + { + label: 'Baseline', + link: '/guides/baseline/', + }, ], }, { label: 'Plugins', items: [ { - label: 'Introduction', + label: 'Plugins Introduction', link: '/plugins/', }, { @@ -119,7 +123,7 @@ export default defineConfig({ collapsed: true, items: [ { - label: 'Introduction', + label: 'Storage Plugins', link: '/plugins/storage/', }, { @@ -141,7 +145,7 @@ export default defineConfig({ collapsed: true, items: [ { - label: 'Introduction', + label: 'Loader Plugins', link: '/plugins/loaders/', }, { @@ -163,7 +167,7 @@ export default defineConfig({ collapsed: true, items: [ { - label: 'Introduction', + label: 'Reporters', link: '/plugins/reporters/', }, { @@ -181,7 +185,7 @@ export default defineConfig({ collapsed: true, items: [ { - label: 'Introduction', + label: 'Generator Plugins', link: '/plugins/generators/', }, { diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 1b6eedc..b3afb2a 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -151,3 +151,7 @@ Force enable/disable colored output, option is passed to the reporter which shou Mark the migrations as executed and successful without actually running them, which is useful if you want to mark migrations as successful after running them manually + +:::tip +See the Baseline guide for example usage of the `--no-execution` option +::: diff --git a/docs/src/content/docs/guides/baseline.mdx b/docs/src/content/docs/guides/baseline.mdx new file mode 100644 index 0000000..2e2df5e --- /dev/null +++ b/docs/src/content/docs/guides/baseline.mdx @@ -0,0 +1,255 @@ +--- +title: Baseline +description: A guide on how to baseline an existing database at a specific version +--- + +import { Tabs, TabItem, LinkCard } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; + +A common scenario is to have an existing database that you want to start managing with Emigrate. This is called baselining. + +## Baselining an existing database schema + +Let's assume you have a PostgreSQL database with the following schema: + +```sql +CREATE TABLE public.users ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE public.posts ( + id SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES public.users(id), + title VARCHAR(255) NOT NULL, + body TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); +``` + + + + + +### Create a baseline migration + +You can baseline this database by first creating a baseline migration (here we name it "baseline"): + + + + ```bash + npx emigrate new --plugin postgres baseline + ``` + + + ```bash + pnpm emigrate new --plugin postgres baseline + ``` + + + ```bash + yarn emigrate new --plugin postgres baseline + ``` + + + ```bash + bunx --bun emigrate new --plugin postgres baseline + ``` + + + ```json title="package.json" {3,6} + { + "scripts": { + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" + } + } + ``` + + ```bash + deno task emigrate new --plugin postgres baseline + ``` + + + +Which will generate an empty migration file in your migration directory: + +```sql title="migrations/20240118123456789_baseline.sql" +-- Migration: baseline + +``` + +You can then add the SQL statements for your database schema to this migration file: + +```sql title="migrations/20240118123456789_baseline.sql" +-- Migration: baseline +CREATE TABLE public.users ( + id SERIAL PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); + +CREATE TABLE public.posts ( + id SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES public.users(id), + title VARCHAR(255) NOT NULL, + body TEXT NOT NULL, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() +); +``` + +### Log the baseline migration + +For new environments this baseline migration will automatically be run when you run `emigrate up`. +For any existing environments you will need to run `emigrate up` with the `--no-execution` flag to prevent the migration from being executed and only log the migration: + + + + ```bash + npx emigrate up --no-execution + ``` + + + ```bash + pnpm emigrate up --no-execution + ``` + + + ```bash + yarn emigrate up --no-execution + ``` + + + ```bash + bunx --bun emigrate up --no-execution + ``` + + + ```json title="package.json" {3,6} + { + "scripts": { + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" + } + } + ``` + + ```bash + deno task emigrate up --no-execution + ``` + + + +In case you have already added more migration files to your migration directory you can limit the "up" command to just log the baseline migration by specifying the `--to` option: + + + + ```bash + npx emigrate up --no-execution --to 20240118123456789_baseline.sql + ``` + + + ```bash + pnpm emigrate up --no-execution --to 20240118123456789_baseline.sql + ``` + + + ```bash + yarn emigrate up --no-execution --to 20240118123456789_baseline.sql + ``` + + + ```bash + bunx --bun emigrate up --no-execution --to 20240118123456789_baseline.sql + ``` + + + ```json title="package.json" {3,6} + { + "scripts": { + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" + } + } + ``` + + ```bash + deno task emigrate up --no-execution --to 20240118123456789_baseline.sql + ``` + + + +### Verify the baseline migration status + +You can verify the status of the baseline migration by running the `emigrate list` command: + + + + ```bash + npx emigrate list + ``` + + + ```bash + pnpm emigrate list + ``` + + + ```bash + yarn emigrate list + ``` + + + ```bash + bunx --bun emigrate list + ``` + + + ```json title="package.json" {3,6} + { + "scripts": { + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" + } + } + ``` + + ```bash + deno task emigrate list + ``` + + + +Which should output something like this: + +```txt title="emigrate list" +Emigrate list v0.14.1 /your/project/path + + βœ” migrations/20240118123456789_baseline.sql (done) + + 1 done (1 total) +``` + +### Happy migrating! + +You can now start adding new migrations to your migration directory and run `emigrate up` to apply them to your database. +Which should be part of your CD pipeline to ensure that your database schema is always up to date in each environment. diff --git a/docs/src/content/docs/intro/quick-start.mdx b/docs/src/content/docs/intro/quick-start.mdx index 905e078..82a962e 100644 --- a/docs/src/content/docs/intro/quick-start.mdx +++ b/docs/src/content/docs/intro/quick-start.mdx @@ -95,6 +95,12 @@ Install the plugin you want to use, for example the + Create a new migration file in your project using: @@ -133,7 +139,7 @@ Create a new migration file in your project using: -```txt title="Output" +```txt title="emigrate new" Emigrate new v0.10.0 /your/project/path βœ” migrations/20231215125421364_create_users_table.sql (done) 3ms @@ -209,7 +215,7 @@ To show both pending and already applied migrations (or previously failed), use -```txt title="Example output" +```txt title="emigrate list" Emigrate list v0.10.0 /your/project/path βœ” migrations/20231211090830577_another_table.sql (done) From cbc35bd64657a0c9a09d560a6c58601dbbb116b1 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 19 Jan 2024 13:23:43 +0100 Subject: [PATCH 067/136] chore: start writing changesets for the documentation --- .changeset/stupid-kings-battle.md | 5 +++++ .changeset/unlucky-seals-camp.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/stupid-kings-battle.md create mode 100644 .changeset/unlucky-seals-camp.md diff --git a/.changeset/stupid-kings-battle.md b/.changeset/stupid-kings-battle.md new file mode 100644 index 0000000..f1fd283 --- /dev/null +++ b/.changeset/stupid-kings-battle.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': minor +--- + +Add first version of the [Baseline guide](https://emigrate.dev/guides/baseline) diff --git a/.changeset/unlucky-seals-camp.md b/.changeset/unlucky-seals-camp.md new file mode 100644 index 0000000..fe808e4 --- /dev/null +++ b/.changeset/unlucky-seals-camp.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': minor +--- + +Document the new --limit, --from and --to options for the ["up" command](https://emigrate.dev/commands/up/) From 98adcda37e08ab50a20bf625c3873a2d04edc2ff Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 19 Jan 2024 13:30:17 +0100 Subject: [PATCH 068/136] fix(reporters): use better wording in the header in the default reporter Also show the number of skipped migrations --- .changeset/smart-ducks-cheer.md | 5 ++++ packages/cli/src/reporters/default.ts | 41 +++++++++++++++++++-------- 2 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 .changeset/smart-ducks-cheer.md diff --git a/.changeset/smart-ducks-cheer.md b/.changeset/smart-ducks-cheer.md new file mode 100644 index 0000000..6115706 --- /dev/null +++ b/.changeset/smart-ducks-cheer.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Use better wording in the header in the console output from the default reporter diff --git a/packages/cli/src/reporters/default.ts b/packages/cli/src/reporters/default.ts index b90078c..210c4f7 100644 --- a/packages/cli/src/reporters/default.ts +++ b/packages/cli/src/reporters/default.ts @@ -1,4 +1,4 @@ -import { black, blueBright, bold, cyan, dim, faint, gray, green, red, redBright, yellow } from 'ansis'; +import { black, blueBright, bold, cyan, dim, faint, gray, green, red, redBright, yellow, yellowBright } from 'ansis'; import logUpdate from 'log-update'; import elegantSpinner from 'elegant-spinner'; import figures from 'figures'; @@ -232,26 +232,43 @@ const getHeaderMessage = ( } if (migrations.length === 0) { - return ' No pending migrations found'; + return ' No migrations found'; } + const statusText = command === 'list' ? 'migrations are pending' : 'pending migrations to run'; + if (migrations.length === lockedMigrations.length) { - return ` ${bold(migrations.length.toString())} ${dim('pending migrations to run')}`; + return ` ${bold(migrations.length.toString())} ${dim(statusText)}`; } - const nonLockedMigrations = migrations.filter( - (migration) => !lockedMigrations.some((lockedMigration) => lockedMigration.name === migration.name), - ); - const failedMigrations = nonLockedMigrations.filter( - (migration) => 'status' in migration && migration.status === 'failed', - ); - const unlockableCount = command === 'up' ? nonLockedMigrations.length - failedMigrations.length : 0; + let skippedCount = 0; + let failedCount = 0; + let unlockableCount = 0; + + for (const migration of migrations) { + const isLocked = lockedMigrations.some((lockedMigration) => lockedMigration.name === migration.name); + + if (isLocked) { + continue; + } + + if ('status' in migration) { + if (migration.status === 'failed') { + failedCount += 1; + } else if (migration.status === 'skipped') { + skippedCount += 1; + } else { + unlockableCount += 1; + } + } + } const parts = [ bold(`${lockedMigrations.length} of ${migrations.length}`), - dim`pending migrations to run`, + dim(statusText), unlockableCount > 0 ? yellow(`(${unlockableCount} locked)`) : '', - failedMigrations.length > 0 ? redBright(`(${failedMigrations.length} failed)`) : '', + skippedCount > 0 ? yellowBright(`(${skippedCount} skipped)`) : '', + failedCount > 0 ? redBright(`(${failedCount} failed)`) : '', ].filter(Boolean); return ` ${parts.join(' ')}`; From 49d8925778ec734b359e9ef1d52bf6e0cd7d73c7 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 19 Jan 2024 13:38:58 +0100 Subject: [PATCH 069/136] fix(docs): remove access control from package config --- docs/package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/package.json b/docs/package.json index 5a0ec0a..6bbd190 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,9 +1,6 @@ { "name": "@emigrate/docs", "private": true, - "publishConfig": { - "access": "public" - }, "type": "module", "version": "0.0.1", "scripts": { From 576dfbb1246b667daf836fb48b6a48b719790cb6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 19 Jan 2024 12:44:24 +0000 Subject: [PATCH 070/136] chore(release): version packages --- .changeset/beige-bottles-tie.md | 5 ----- .changeset/grumpy-files-heal.md | 5 ----- .changeset/quiet-ravens-sleep.md | 5 ----- .changeset/sharp-buses-draw.md | 5 ----- .changeset/smart-ducks-cheer.md | 5 ----- .changeset/stupid-kings-battle.md | 5 ----- .changeset/unlucky-seals-camp.md | 5 ----- docs/CHANGELOG.md | 8 ++++++++ docs/package.json | 2 +- packages/cli/CHANGELOG.md | 13 +++++++++++++ packages/cli/package.json | 2 +- 11 files changed, 23 insertions(+), 37 deletions(-) delete mode 100644 .changeset/beige-bottles-tie.md delete mode 100644 .changeset/grumpy-files-heal.md delete mode 100644 .changeset/quiet-ravens-sleep.md delete mode 100644 .changeset/sharp-buses-draw.md delete mode 100644 .changeset/smart-ducks-cheer.md delete mode 100644 .changeset/stupid-kings-battle.md delete mode 100644 .changeset/unlucky-seals-camp.md create mode 100644 docs/CHANGELOG.md diff --git a/.changeset/beige-bottles-tie.md b/.changeset/beige-bottles-tie.md deleted file mode 100644 index 148f832..0000000 --- a/.changeset/beige-bottles-tie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Add support for the --no-execution option to the "up" command to be able to log migrations as successful without actually running them. Can for instance be used for baselining a database or logging manually run migrations as successful. diff --git a/.changeset/grumpy-files-heal.md b/.changeset/grumpy-files-heal.md deleted file mode 100644 index 187b4b4..0000000 --- a/.changeset/grumpy-files-heal.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Clarify which cli options that needs parameters diff --git a/.changeset/quiet-ravens-sleep.md b/.changeset/quiet-ravens-sleep.md deleted file mode 100644 index 24023cf..0000000 --- a/.changeset/quiet-ravens-sleep.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Add --from and --to CLI options to control which migrations to include or skip when executing migrations. diff --git a/.changeset/sharp-buses-draw.md b/.changeset/sharp-buses-draw.md deleted file mode 100644 index 1070334..0000000 --- a/.changeset/sharp-buses-draw.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Add --limit option to the "up" command, for limiting the number of migrations to run diff --git a/.changeset/smart-ducks-cheer.md b/.changeset/smart-ducks-cheer.md deleted file mode 100644 index 6115706..0000000 --- a/.changeset/smart-ducks-cheer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Use better wording in the header in the console output from the default reporter diff --git a/.changeset/stupid-kings-battle.md b/.changeset/stupid-kings-battle.md deleted file mode 100644 index f1fd283..0000000 --- a/.changeset/stupid-kings-battle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': minor ---- - -Add first version of the [Baseline guide](https://emigrate.dev/guides/baseline) diff --git a/.changeset/unlucky-seals-camp.md b/.changeset/unlucky-seals-camp.md deleted file mode 100644 index fe808e4..0000000 --- a/.changeset/unlucky-seals-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': minor ---- - -Document the new --limit, --from and --to options for the ["up" command](https://emigrate.dev/commands/up/) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md new file mode 100644 index 0000000..1fec6e8 --- /dev/null +++ b/docs/CHANGELOG.md @@ -0,0 +1,8 @@ +# @emigrate/docs + +## 0.1.0 + +### Minor Changes + +- cbc35bd: Add first version of the [Baseline guide](https://emigrate.dev/guides/baseline) +- cbc35bd: Document the new --limit, --from and --to options for the ["up" command](https://emigrate.dev/commands/up/) diff --git a/docs/package.json b/docs/package.json index 6bbd190..bdc380e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -2,7 +2,7 @@ "name": "@emigrate/docs", "private": true, "type": "module", - "version": "0.0.1", + "version": "0.1.0", "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 5b991fd..09e5617 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,18 @@ # @emigrate/cli +## 0.15.0 + +### Minor Changes + +- f515c8a: Add support for the --no-execution option to the "up" command to be able to log migrations as successful without actually running them. Can for instance be used for baselining a database or logging manually run migrations as successful. +- 9ef0fa2: Add --from and --to CLI options to control which migrations to include or skip when executing migrations. +- 02c142e: Add --limit option to the "up" command, for limiting the number of migrations to run + +### Patch Changes + +- bf4d596: Clarify which cli options that needs parameters +- 98adcda: Use better wording in the header in the console output from the default reporter + ## 0.14.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index d85ddfb..280cdce 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.14.1", + "version": "0.15.0", "publishConfig": { "access": "public" }, From ce15648251512e20bcc7e528c4070e05672f2e7d Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 22 Jan 2024 10:16:35 +0100 Subject: [PATCH 071/136] feat(types): add type for the onAbort Reporter method --- .changeset/late-phones-smile.md | 5 +++++ packages/types/src/index.ts | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 .changeset/late-phones-smile.md diff --git a/.changeset/late-phones-smile.md b/.changeset/late-phones-smile.md new file mode 100644 index 0000000..31a36d0 --- /dev/null +++ b/.changeset/late-phones-smile.md @@ -0,0 +1,5 @@ +--- +'@emigrate/types': minor +--- + +Add type for onAbort Reporter method diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index dea668d..89a546a 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -243,6 +243,14 @@ export type EmigrateReporter = Partial<{ * Called when the reporter is initialized, which is the first method that is called when a command is executed. */ onInit(parameters: ReporterInitParameters): Awaitable; + /** + * Called when the current command (in practice the "up" command) is aborted. + * + * This is called when the process is interrupted, e.g. by a SIGTERM or SIGINT signal, or an unhandled error occurs. + * + * @param reason The reason why the command was aborted. + */ + onAbort(reason: Error): Awaitable; /** * Called when all pending migrations that should be executed have been collected. * From a4da353d5a594fe389665a85a25b2eda8511e722 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 22 Jan 2024 10:53:01 +0100 Subject: [PATCH 072/136] feat(cli): add graceful process abort Using an AbortSignal and Promise.race we abandon running migrations that take longer to complete after the process is aborted than the given abortRespite period --- .changeset/bright-poems-fold.md | 5 + .changeset/pink-hairs-kiss.md | 5 + .changeset/wicked-turkeys-smile.md | 5 + README.md | 1 + docs/src/content/docs/commands/up.mdx | 9 ++ .../content/docs/reference/configuration.mdx | 13 ++ packages/cli/README.md | 1 + packages/cli/src/cli.ts | 78 +++++++--- packages/cli/src/commands/up.test.ts | 141 +++++++++++++++++- packages/cli/src/commands/up.ts | 6 + packages/cli/src/defaults.ts | 2 + packages/cli/src/errors.ts | 26 ++++ packages/cli/src/exec.ts | 55 ++++++- packages/cli/src/migration-runner.ts | 31 +++- packages/cli/src/reporters/default.ts | 26 ++++ packages/cli/src/types.ts | 1 + packages/reporter-pino/src/index.ts | 4 + 17 files changed, 378 insertions(+), 31 deletions(-) create mode 100644 .changeset/bright-poems-fold.md create mode 100644 .changeset/pink-hairs-kiss.md create mode 100644 .changeset/wicked-turkeys-smile.md create mode 100644 packages/cli/src/defaults.ts diff --git a/.changeset/bright-poems-fold.md b/.changeset/bright-poems-fold.md new file mode 100644 index 0000000..3ccb9b4 --- /dev/null +++ b/.changeset/bright-poems-fold.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': minor +--- + +Document the --abort-respite CLI option and the corresponding abortRespite config diff --git a/.changeset/pink-hairs-kiss.md b/.changeset/pink-hairs-kiss.md new file mode 100644 index 0000000..9f9df38 --- /dev/null +++ b/.changeset/pink-hairs-kiss.md @@ -0,0 +1,5 @@ +--- +'@emigrate/reporter-pino': minor +--- + +Handle the new onAbort method diff --git a/.changeset/wicked-turkeys-smile.md b/.changeset/wicked-turkeys-smile.md new file mode 100644 index 0000000..5ea24ad --- /dev/null +++ b/.changeset/wicked-turkeys-smile.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Handle process interruptions gracefully, e.g. due to receiving a SIGINT or SIGTERM signal. If a migration is currently running when the process is about to shutdown it will have a maximum of 10 more seconds to finish before being deserted (there's no way to cancel a promise sadly, and many database queries are not easy to abort either). The 10 second respite length can be customized using the --abort-respite CLI option or the abortRespite config. diff --git a/README.md b/README.md index 1d1521f..7d0ec15 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ Options: --no-color Disable color output (this option is passed to the reporter) --no-execution Mark the migrations as executed and successful without actually running them, which is useful if you want to mark migrations as successful after running them manually + --abort-respite The number of seconds to wait before abandoning running migrations after the command has been aborted (default: 10) Examples: diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index b3afb2a..3008376 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -66,6 +66,8 @@ List the pending migrations that would be run without actually running them ### `-l, --limit ` +**type:** `number` + Limit the number of migrations to run. Can be combined with `--dry` which will show "pending" for the migrations that would be run if not in dry-run mode, and "skipped" for the migrations that also haven't been run but won't because of the set limit. @@ -155,3 +157,10 @@ which is useful if you want to mark migrations as successful after running them :::tip See the Baseline guide for example usage of the `--no-execution` option ::: + +### `--abort-respite` + +**type:** `number` +**default:** `10` + +Customize the number of seconds to wait before abandoning a running migration when the process is about to shutdown, for instance when the user presses `Ctrl+C` or when the container is being stopped (if running inside a container). diff --git a/docs/src/content/docs/reference/configuration.mdx b/docs/src/content/docs/reference/configuration.mdx index 46d0a67..524e4d9 100644 --- a/docs/src/content/docs/reference/configuration.mdx +++ b/docs/src/content/docs/reference/configuration.mdx @@ -157,3 +157,16 @@ export default { ``` Will create new migration files with the `.ts` extension. + +### `abortRespite` + +**type:** `number` +**default:** `10` + +Customize the number of seconds to wait before abandoning a running migration when the process is about to shutdown, for instance when the user presses `Ctrl+C` or when the container is being stopped (if running inside a container). + +```js title="emigrate.config.js" {2} +export default { + abortRespite: 10, +}; +``` diff --git a/packages/cli/README.md b/packages/cli/README.md index 87ee365..156321a 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -44,6 +44,7 @@ Options: --no-color Disable color output (this option is passed to the reporter) --no-execution Mark the migrations as executed and successful without actually running them, which is useful if you want to mark migrations as successful after running them manually + --abort-respite The number of seconds to wait before abandoning running migrations after the command has been aborted (default: 10) Examples: diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 999ef57..cababf1 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -2,10 +2,11 @@ import process from 'node:process'; import { parseArgs } from 'node:util'; import importFromEsm from 'import-from-esm'; -import { ShowUsageError } from './errors.js'; +import { CommandAbortError, ShowUsageError } from './errors.js'; import { getConfig } from './get-config.js'; +import { DEFAULT_RESPITE_SECONDS } from './defaults.js'; -type Action = (args: string[]) => Promise; +type Action = (args: string[], abortSignal: AbortSignal) => Promise; const useColors = (values: { color?: boolean; 'no-color'?: boolean }) => { if (values['no-color']) { @@ -21,7 +22,7 @@ const importAll = async (cwd: string, modules: string[]) => { } }; -const up: Action = async (args) => { +const up: Action = async (args, abortSignal) => { const config = await getConfig('up'); const { values } = parseArgs({ args, @@ -78,6 +79,9 @@ const up: Action = async (args) => { 'no-color': { type: 'boolean', }, + 'abort-respite': { + type: 'string', + }, }, allowPositionals: false, }); @@ -105,6 +109,7 @@ Options: --no-color Disable color output (this option is passed to the reporter) --no-execution Mark the migrations as executed and successful without actually running them, which is useful if you want to mark migrations as successful after running them manually + --abort-respite The number of seconds to wait before abandoning running migrations after the command has been aborted (default: ${DEFAULT_RESPITE_SECONDS}) Examples: @@ -133,11 +138,13 @@ Examples: to, limit: limitString, import: imports = [], + 'abort-respite': abortRespiteString, 'no-execution': noExecution, } = values; const plugins = [...(config.plugins ?? []), ...(values.plugin ?? [])]; const limit = limitString === undefined ? undefined : Number.parseInt(limitString, 10); + const abortRespite = abortRespiteString === undefined ? config.abortRespite : Number.parseInt(abortRespiteString, 10); if (Number.isNaN(limit)) { console.error('Invalid limit value, expected an integer but was:', limitString); @@ -146,6 +153,16 @@ Examples: return; } + if (Number.isNaN(abortRespite)) { + console.error( + 'Invalid abortRespite value, expected an integer but was:', + abortRespiteString ?? config.abortRespite, + ); + console.log(usage); + process.exitCode = 1; + return; + } + await importAll(cwd, imports); try { @@ -161,6 +178,8 @@ Examples: from, to, noExecution, + abortSignal, + abortRespite: (abortRespite ?? DEFAULT_RESPITE_SECONDS) * 1000, color: useColors(values), }); } catch (error) { @@ -479,7 +498,7 @@ const commands: Record = { new: newMigration, }; -const main: Action = async (args) => { +const main: Action = async (args, abortSignal) => { const { values, positionals } = parseArgs({ args, options: { @@ -531,20 +550,43 @@ Commands: return; } - await action(process.argv.slice(3)); + try { + await action(process.argv.slice(3), abortSignal); + } catch (error) { + if (error instanceof Error) { + console.error(error); + if (error.cause instanceof Error) { + console.error(error.cause); + } + } else { + console.error(error); + } + + process.exitCode = 1; + } }; -try { - await main(process.argv.slice(2)); -} catch (error) { - if (error instanceof Error) { - console.error(error); - if (error.cause instanceof Error) { - console.error(error.cause); - } - } else { - console.error(error); - } +const controller = new AbortController(); - process.exitCode = 1; -} +process.on('SIGINT', () => { + controller.abort(CommandAbortError.fromSignal('SIGINT')); +}); + +process.on('SIGTERM', () => { + controller.abort(CommandAbortError.fromSignal('SIGTERM')); +}); + +process.on('uncaughtException', (error) => { + controller.abort(CommandAbortError.fromReason('Uncaught exception', error)); +}); + +process.on('unhandledRejection', (error) => { + controller.abort(CommandAbortError.fromReason('Unhandled rejection', error)); +}); + +await main(process.argv.slice(2), controller.signal); + +setTimeout(() => { + console.error('Process did not exit within 10 seconds, forcing exit'); + process.exit(1); +}, 10_000).unref(); diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index 0ce4cde..bc1f840 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -12,9 +12,16 @@ import { type NonFailedMigrationHistoryEntry, type MigrationMetadataFinished, } from '@emigrate/types'; -import { deserializeError } from 'serialize-error'; +import { deserializeError, serializeError } from 'serialize-error'; import { version } from '../get-package-info.js'; -import { BadOptionError, MigrationHistoryError, MigrationRunError, StorageInitError } from '../errors.js'; +import { + BadOptionError, + CommandAbortError, + ExecutionDesertedError, + MigrationHistoryError, + MigrationRunError, + StorageInitError, +} from '../errors.js'; import upCommand from './up.js'; type Mocked = { @@ -481,6 +488,123 @@ describe('up', () => { ]); assert.strictEqual(migration.mock.calls.length, 0); }); + + describe("aborting the migration process before it's finished", () => { + it('returns 1 and finishes with a command abort error when the migration process is aborted prematurely', async () => { + const controller = new AbortController(); + const migration = mock.fn( + async () => { + // Success on second call, and abort + controller.abort(CommandAbortError.fromSignal('SIGINT')); + }, + async () => { + // Success on first call + }, + { times: 1 }, + ); + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_another_migration.js', + '4_some_other_migration.js', + '5_yet_another_migration.js', + '6_some_more_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ + abortSignal: controller.signal, + }); + + assert.strictEqual(exitCode, 1, 'Exit code'); + assertPreconditionsFulfilled( + { dry: false }, + reporter, + [ + { name: '2_some_migration.js', status: 'done', started: true }, + { name: '3_another_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'skipped' }, + { name: '5_yet_another_migration.js', status: 'skipped' }, + { name: '6_some_more_migration.js', status: 'skipped' }, + ], + CommandAbortError.fromSignal('SIGINT'), + ); + assert.strictEqual(reporter.onAbort.mock.calls.length, 1); + assert.strictEqual(migration.mock.calls.length, 2); + }); + }); + + it('returns 1 and finishes with a deserted error with a command abort error as cause when the migration process is aborted prematurely and stops waiting on migrations taking longer than the respite period after the abort', async () => { + const controller = new AbortController(); + const migration = mock.fn( + async () => { + // Success on second call, and abort + controller.abort(CommandAbortError.fromSignal('SIGINT')); + return new Promise((resolve) => { + setTimeout(resolve, 100); // Take longer than the respite period + }); + }, + async () => { + // Success on first call + }, + { times: 1 }, + ); + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_another_migration.js', + '4_some_other_migration.js', + '5_yet_another_migration.js', + '6_some_more_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ + abortSignal: controller.signal, + abortRespite: 10, + }); + + assert.strictEqual(exitCode, 1, 'Exit code'); + assertPreconditionsFulfilled( + { dry: false }, + reporter, + [ + { name: '2_some_migration.js', status: 'done', started: true }, + { + name: '3_another_migration.js', + status: 'failed', + started: true, + error: ExecutionDesertedError.fromReason('Deserted after 10ms', CommandAbortError.fromSignal('SIGINT')), + }, + { name: '4_some_other_migration.js', status: 'skipped' }, + { name: '5_yet_another_migration.js', status: 'skipped' }, + { name: '6_some_more_migration.js', status: 'skipped' }, + ], + ExecutionDesertedError.fromReason('Deserted after 10ms', CommandAbortError.fromSignal('SIGINT')), + ); + assert.strictEqual(reporter.onAbort.mock.calls.length, 1); + assert.strictEqual(migration.mock.calls.length, 2); + }); }); function getErrorCause(error: Error | undefined): Error | SerializedError | undefined { @@ -570,6 +694,7 @@ function getUpCommand(migrationFiles: string[], storage?: Mocked, plugi const reporter: Mocked> = { onFinished: mock.fn(noop), onInit: mock.fn(noop), + onAbort: mock.fn(noop), onCollectedMigrations: mock.fn(noop), onLockedMigrations: mock.fn(noop), onNewMigration: mock.fn(noop), @@ -689,7 +814,17 @@ function assertPreconditionsFulfilled( assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, pending + skipped, 'Total pending and skipped'); assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assert.deepStrictEqual(error, finishedError, 'Finished error'); + if (finishedError instanceof DOMException || error instanceof DOMException) { + // The assert library doesn't support DOMException apparently, so ugly workaround here: + assert.deepStrictEqual( + deserializeError(serializeError(error)), + deserializeError(serializeError(finishedError)), + 'Finished error', + ); + } else { + assert.deepStrictEqual(error, finishedError, 'Finished error'); + } + const cause = getErrorCause(error); const expectedCause = finishedError?.cause; assert.deepStrictEqual( diff --git a/packages/cli/src/commands/up.ts b/packages/cli/src/commands/up.ts index 896c443..aebf3c3 100644 --- a/packages/cli/src/commands/up.ts +++ b/packages/cli/src/commands/up.ts @@ -19,6 +19,8 @@ type ExtraFlags = { to?: string; noExecution?: boolean; getMigrations?: GetMigrationsFunction; + abortSignal?: AbortSignal; + abortRespite?: number; }; const lazyDefaultReporter = async () => import('../reporters/default.js'); @@ -33,6 +35,8 @@ export default async function upCommand({ from, to, noExecution, + abortSignal, + abortRespite, dry = false, plugins = [], cwd, @@ -94,6 +98,8 @@ export default async function upCommand({ limit, from, to, + abortSignal, + abortRespite, reporter, storage, migrations: await arrayFromAsync(collectedMigrations), diff --git a/packages/cli/src/defaults.ts b/packages/cli/src/defaults.ts new file mode 100644 index 0000000..18901d0 --- /dev/null +++ b/packages/cli/src/defaults.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/naming-convention +export const DEFAULT_RESPITE_SECONDS = 10; diff --git a/packages/cli/src/errors.ts b/packages/cli/src/errors.ts index 4038901..b867021 100644 --- a/packages/cli/src/errors.ts +++ b/packages/cli/src/errors.ts @@ -146,6 +146,30 @@ export class StorageInitError extends EmigrateError { } } +export class CommandAbortError extends EmigrateError { + static fromSignal(signal: NodeJS.Signals) { + return new CommandAbortError(`Command aborted due to signal: ${signal}`); + } + + static fromReason(reason: string, cause?: unknown) { + return new CommandAbortError(`Command aborted: ${reason}`, { cause }); + } + + constructor(message: string | undefined, options?: ErrorOptions) { + super(message, options, 'ERR_COMMAND_ABORT'); + } +} + +export class ExecutionDesertedError extends EmigrateError { + static fromReason(reason: string, cause?: Error) { + return new ExecutionDesertedError(`Execution deserted: ${reason}`, { cause }); + } + + constructor(message: string | undefined, options?: ErrorOptions) { + super(message, options, 'ERR_EXECUTION_DESERTED'); + } +} + errorConstructors.set('EmigrateError', EmigrateError as ErrorConstructor); errorConstructors.set('ShowUsageError', ShowUsageError as ErrorConstructor); errorConstructors.set('MissingOptionError', MissingOptionError as unknown as ErrorConstructor); @@ -158,3 +182,5 @@ errorConstructors.set('MigrationLoadError', MigrationLoadError as unknown as Err errorConstructors.set('MigrationRunError', MigrationRunError as unknown as ErrorConstructor); errorConstructors.set('MigrationNotRunError', MigrationNotRunError as unknown as ErrorConstructor); errorConstructors.set('StorageInitError', StorageInitError as unknown as ErrorConstructor); +errorConstructors.set('CommandAbortError', CommandAbortError as unknown as ErrorConstructor); +errorConstructors.set('ExecutionDesertedError', ExecutionDesertedError as unknown as ErrorConstructor); diff --git a/packages/cli/src/exec.ts b/packages/cli/src/exec.ts index 200521d..3f39d1a 100644 --- a/packages/cli/src/exec.ts +++ b/packages/cli/src/exec.ts @@ -1,22 +1,65 @@ -import { toError } from './errors.js'; +import prettyMs from 'pretty-ms'; +import { ExecutionDesertedError, toError } from './errors.js'; +import { DEFAULT_RESPITE_SECONDS } from './defaults.js'; -type Fn = (...args: Args) => Result; type Result = [value: T, error: undefined] | [value: undefined, error: Error]; +type ExecOptions = { + abortSignal?: AbortSignal; + abortRespite?: number; +}; + /** * Execute a function and return a result tuple * * This is a helper function to make it easier to handle errors without the extra nesting of try/catch + * If an abort signal is provided the function will reject with an ExecutionDesertedError if the signal is aborted + * and the given function has not yet resolved within the given respite time (or a default of 30 seconds) + * + * @param fn The function to execute + * @param options Options for the execution */ -export const exec = async >( - fn: Fn, - ...args: Args +export const exec = async >( + fn: () => Return, + options: ExecOptions = {}, ): Promise>> => { try { - const result = await fn(...args); + const aborter = options.abortSignal ? getAborter(options.abortSignal, options.abortRespite) : undefined; + const result = await Promise.race(aborter ? [aborter, fn()] : [fn()]); return [result, undefined]; } catch (error) { return [undefined, toError(error)]; } }; + +/** + * Returns a promise that rejects after a given time after the given signal is aborted + * + * @param signal The abort signal to listen to + * @param respite The time in milliseconds to wait before rejecting + */ +const getAborter = async (signal: AbortSignal, respite = DEFAULT_RESPITE_SECONDS * 1000): Promise => { + return new Promise((_, reject) => { + if (signal.aborted) { + setTimeout( + reject, + respite, + ExecutionDesertedError.fromReason(`Deserted after ${prettyMs(respite)}`, toError(signal.reason)), + ).unref(); + return; + } + + signal.addEventListener( + 'abort', + () => { + setTimeout( + reject, + respite, + ExecutionDesertedError.fromReason(`Deserted after ${prettyMs(respite)}`, toError(signal.reason)), + ).unref(); + }, + { once: true }, + ); + }); +}; diff --git a/packages/cli/src/migration-runner.ts b/packages/cli/src/migration-runner.ts index e09d6c4..dac5620 100644 --- a/packages/cli/src/migration-runner.ts +++ b/packages/cli/src/migration-runner.ts @@ -18,6 +18,8 @@ type MigrationRunnerParameters = { limit?: number; from?: string; to?: string; + abortSignal?: AbortSignal; + abortRespite?: number; reporter: EmigrateReporter; storage: Storage; migrations: Array; @@ -30,6 +32,8 @@ export const migrationRunner = async ({ limit, from, to, + abortSignal, + abortRespite, reporter, storage, migrations, @@ -43,6 +47,22 @@ export const migrationRunner = async ({ let skip = false; + abortSignal?.addEventListener( + 'abort', + () => { + skip = true; + reporter.onAbort?.(toError(abortSignal.reason))?.then( + () => { + /* noop */ + }, + () => { + /* noop */ + }, + ); + }, + { once: true }, + ); + for await (const migration of migrations) { if (isFinishedMigration(migration)) { skip ||= migration.status === 'failed' || migration.status === 'skipped'; @@ -89,7 +109,7 @@ export const migrationRunner = async ({ const [lockedMigrations, lockError] = dry ? [migrationsToLock] - : await exec(async () => storage.lock(migrationsToLock)); + : await exec(async () => storage.lock(migrationsToLock), { abortSignal, abortRespite }); if (lockError) { for (const migration of migrationsToLock) { @@ -167,7 +187,7 @@ export const migrationRunner = async ({ const start = hrtime(); - const [, migrationError] = await exec(async () => execute(migration)); + const [, migrationError] = await exec(async () => execute(migration), { abortSignal, abortRespite }); const duration = getDuration(start); @@ -194,7 +214,9 @@ export const migrationRunner = async ({ } } - const [, unlockError] = dry ? [] : await exec(async () => storage.unlock(lockedMigrations ?? [])); + const [, unlockError] = dry + ? [] + : await exec(async () => storage.unlock(lockedMigrations ?? []), { abortSignal, abortRespite }); // eslint-disable-next-line unicorn/no-array-callback-reference const firstFailed = finishedMigrations.find(isFailedMigration); @@ -204,7 +226,8 @@ export const migrationRunner = async ({ : firstFailed ? MigrationRunError.fromMetadata(firstFailed) : undefined; - const error = unlockError ?? firstError ?? lockError; + const error = + unlockError ?? firstError ?? lockError ?? (abortSignal?.aborted ? toError(abortSignal.reason) : undefined); await reporter.onFinished?.(finishedMigrations, error); diff --git a/packages/cli/src/reporters/default.ts b/packages/cli/src/reporters/default.ts index 210c4f7..1caeda7 100644 --- a/packages/cli/src/reporters/default.ts +++ b/packages/cli/src/reporters/default.ts @@ -165,6 +165,20 @@ const getError = (error?: ErrorLike, indent = ' ') => { return parts.join('\n'); }; +const getAbortMessage = (reason?: Error) => { + if (!reason) { + return ''; + } + + const parts = [` ${red.bold(reason.message)}`]; + + if (isErrorLike(reason.cause)) { + parts.push(getError(reason.cause, ' ')); + } + + return parts.join('\n'); +}; + const getSummary = ( command: ReporterInitParameters['command'], migrations: Array = [], @@ -281,6 +295,7 @@ class DefaultFancyReporter implements Required { #error: Error | undefined; #parameters!: ReporterInitParameters; #interval: NodeJS.Timeout | undefined; + #abortReason: Error | undefined; onInit(parameters: ReporterInitParameters): void | PromiseLike { this.#parameters = parameters; @@ -288,6 +303,10 @@ class DefaultFancyReporter implements Required { this.#start(); } + onAbort(reason: Error): void | PromiseLike { + this.#abortReason = reason; + } + onCollectedMigrations(migrations: MigrationMetadata[]): void | PromiseLike { this.#migrations = migrations; } @@ -358,6 +377,7 @@ class DefaultFancyReporter implements Required { getTitle(this.#parameters), getHeaderMessage(this.#parameters.command, this.#migrations, this.#lockedMigrations), this.#migrations?.map((migration) => getMigrationText(migration, this.#activeMigration)).join('\n') ?? '', + getAbortMessage(this.#abortReason), getSummary(this.#parameters.command, this.#migrations), getError(this.#error), ]; @@ -403,6 +423,12 @@ class DefaultReporter implements Required { console.log(''); } + onAbort(reason: Error): void | PromiseLike { + console.log(''); + console.error(getAbortMessage(reason)); + console.log(''); + } + onCollectedMigrations(migrations: MigrationMetadata[]): void | PromiseLike { this.#migrations = migrations; } diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts index bc4e000..7d6b400 100644 --- a/packages/cli/src/types.ts +++ b/packages/cli/src/types.ts @@ -12,6 +12,7 @@ export type Config = { template?: string; extension?: string; color?: boolean; + abortRespite?: number; }; export type EmigrateConfig = Config & { diff --git a/packages/reporter-pino/src/index.ts b/packages/reporter-pino/src/index.ts index 65e8a10..942c55d 100644 --- a/packages/reporter-pino/src/index.ts +++ b/packages/reporter-pino/src/index.ts @@ -57,6 +57,10 @@ class PinoReporter implements Required { this.#logger.info({ parameters }, `Emigrate "${command}" initialized${parameters.dry ? ' (dry-run)' : ''}`); } + onAbort(reason: Error): Awaitable { + this.#logger.error({ reason }, `Emigrate "${this.#command}" shutting down`); + } + onCollectedMigrations(migrations: MigrationMetadata[]): Awaitable { this.#migrations = migrations; } From bddb2d6b140d3f4261659b1c9a7a7b402cd6d86c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jan 2024 10:30:34 +0000 Subject: [PATCH 073/136] chore(release): version packages --- .changeset/bright-poems-fold.md | 5 ----- .changeset/late-phones-smile.md | 5 ----- .changeset/pink-hairs-kiss.md | 5 ----- .changeset/wicked-turkeys-smile.md | 5 ----- docs/CHANGELOG.md | 6 ++++++ docs/package.json | 2 +- packages/cli/CHANGELOG.md | 12 ++++++++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 8 ++++++++ packages/mysql/package.json | 2 +- packages/plugin-generate-js/CHANGELOG.md | 8 ++++++++ packages/plugin-generate-js/package.json | 2 +- packages/plugin-tools/CHANGELOG.md | 7 +++++++ packages/plugin-tools/package.json | 2 +- packages/postgres/CHANGELOG.md | 8 ++++++++ packages/postgres/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 11 +++++++++++ packages/reporter-pino/package.json | 2 +- packages/storage-fs/CHANGELOG.md | 7 +++++++ packages/storage-fs/package.json | 2 +- packages/types/CHANGELOG.md | 6 ++++++ packages/types/package.json | 2 +- 22 files changed, 82 insertions(+), 29 deletions(-) delete mode 100644 .changeset/bright-poems-fold.md delete mode 100644 .changeset/late-phones-smile.md delete mode 100644 .changeset/pink-hairs-kiss.md delete mode 100644 .changeset/wicked-turkeys-smile.md diff --git a/.changeset/bright-poems-fold.md b/.changeset/bright-poems-fold.md deleted file mode 100644 index 3ccb9b4..0000000 --- a/.changeset/bright-poems-fold.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': minor ---- - -Document the --abort-respite CLI option and the corresponding abortRespite config diff --git a/.changeset/late-phones-smile.md b/.changeset/late-phones-smile.md deleted file mode 100644 index 31a36d0..0000000 --- a/.changeset/late-phones-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/types': minor ---- - -Add type for onAbort Reporter method diff --git a/.changeset/pink-hairs-kiss.md b/.changeset/pink-hairs-kiss.md deleted file mode 100644 index 9f9df38..0000000 --- a/.changeset/pink-hairs-kiss.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/reporter-pino': minor ---- - -Handle the new onAbort method diff --git a/.changeset/wicked-turkeys-smile.md b/.changeset/wicked-turkeys-smile.md deleted file mode 100644 index 5ea24ad..0000000 --- a/.changeset/wicked-turkeys-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Handle process interruptions gracefully, e.g. due to receiving a SIGINT or SIGTERM signal. If a migration is currently running when the process is about to shutdown it will have a maximum of 10 more seconds to finish before being deserted (there's no way to cancel a promise sadly, and many database queries are not easy to abort either). The 10 second respite length can be customized using the --abort-respite CLI option or the abortRespite config. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 1fec6e8..aa71ff8 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/docs +## 0.2.0 + +### Minor Changes + +- a4da353: Document the --abort-respite CLI option and the corresponding abortRespite config + ## 0.1.0 ### Minor Changes diff --git a/docs/package.json b/docs/package.json index bdc380e..c70d3a0 100644 --- a/docs/package.json +++ b/docs/package.json @@ -2,7 +2,7 @@ "name": "@emigrate/docs", "private": true, "type": "module", - "version": "0.1.0", + "version": "0.2.0", "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 09e5617..b62cbbe 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,17 @@ # @emigrate/cli +## 0.16.0 + +### Minor Changes + +- a4da353: Handle process interruptions gracefully, e.g. due to receiving a SIGINT or SIGTERM signal. If a migration is currently running when the process is about to shutdown it will have a maximum of 10 more seconds to finish before being deserted (there's no way to cancel a promise sadly, and many database queries are not easy to abort either). The 10 second respite length can be customized using the --abort-respite CLI option or the abortRespite config. + +### Patch Changes + +- Updated dependencies [ce15648] + - @emigrate/types@0.11.0 + - @emigrate/plugin-tools@0.9.4 + ## 0.15.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 280cdce..8ebfe63 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.15.0", + "version": "0.16.0", "publishConfig": { "access": "public" }, diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index 22016d4..3231cc3 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/mysql +## 0.2.4 + +### Patch Changes + +- Updated dependencies [ce15648] + - @emigrate/types@0.11.0 + - @emigrate/plugin-tools@0.9.4 + ## 0.2.3 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index d62be01..6f7e1f4 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.2.3", + "version": "0.2.4", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-generate-js/CHANGELOG.md b/packages/plugin-generate-js/CHANGELOG.md index 9464f5f..12f2bed 100644 --- a/packages/plugin-generate-js/CHANGELOG.md +++ b/packages/plugin-generate-js/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-generate-js +## 0.3.4 + +### Patch Changes + +- Updated dependencies [ce15648] + - @emigrate/types@0.11.0 + - @emigrate/plugin-tools@0.9.4 + ## 0.3.3 ### Patch Changes diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index c9fc1d5..472c930 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-generate-js", - "version": "0.3.3", + "version": "0.3.4", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-tools/CHANGELOG.md b/packages/plugin-tools/CHANGELOG.md index 67cf09f..17a97f6 100644 --- a/packages/plugin-tools/CHANGELOG.md +++ b/packages/plugin-tools/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/plugin-tools +## 0.9.4 + +### Patch Changes + +- Updated dependencies [ce15648] + - @emigrate/types@0.11.0 + ## 0.9.3 ### Patch Changes diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index 28ea06b..b1098ad 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-tools", - "version": "0.9.3", + "version": "0.9.4", "publishConfig": { "access": "public" }, diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index 413f87d..a2955b8 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/postgres +## 0.2.4 + +### Patch Changes + +- Updated dependencies [ce15648] + - @emigrate/types@0.11.0 + - @emigrate/plugin-tools@0.9.4 + ## 0.2.3 ### Patch Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 1a08f90..9cfd051 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.2.3", + "version": "0.2.4", "publishConfig": { "access": "public" }, diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index a62e206..4d18577 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,16 @@ # @emigrate/reporter-pino +## 0.5.0 + +### Minor Changes + +- a4da353: Handle the new onAbort method + +### Patch Changes + +- Updated dependencies [ce15648] + - @emigrate/types@0.11.0 + ## 0.4.3 ### Patch Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 0dfd986..71cefec 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.4.3", + "version": "0.5.0", "publishConfig": { "access": "public" }, diff --git a/packages/storage-fs/CHANGELOG.md b/packages/storage-fs/CHANGELOG.md index 70927ed..f3548d4 100644 --- a/packages/storage-fs/CHANGELOG.md +++ b/packages/storage-fs/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/storage-fs +## 0.4.4 + +### Patch Changes + +- Updated dependencies [ce15648] + - @emigrate/types@0.11.0 + ## 0.4.3 ### Patch Changes diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index 1b54191..d763f26 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/storage-fs", - "version": "0.4.3", + "version": "0.4.4", "publishConfig": { "access": "public" }, diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 4fdf48a..78f9264 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/types +## 0.11.0 + +### Minor Changes + +- ce15648: Add type for onAbort Reporter method + ## 0.10.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index ec20393..116b525 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/types", - "version": "0.10.0", + "version": "0.11.0", "publishConfig": { "access": "public" }, From 121492b30309d041fa867b7e825a5826269ee093 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 22 Jan 2024 13:39:38 +0100 Subject: [PATCH 074/136] fix(cli): sort migrations lexicographically for real --- .changeset/funny-pants-heal.md | 5 + packages/cli/src/get-migrations.test.ts | 134 ++++++++++++++++++++++++ packages/cli/src/get-migrations.ts | 16 +-- 3 files changed, 144 insertions(+), 11 deletions(-) create mode 100644 .changeset/funny-pants-heal.md create mode 100644 packages/cli/src/get-migrations.test.ts diff --git a/.changeset/funny-pants-heal.md b/.changeset/funny-pants-heal.md new file mode 100644 index 0000000..2e4e2e7 --- /dev/null +++ b/.changeset/funny-pants-heal.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Sort migration files lexicographically correctly by using the default Array.sort implementation diff --git a/packages/cli/src/get-migrations.test.ts b/packages/cli/src/get-migrations.test.ts new file mode 100644 index 0000000..3391b04 --- /dev/null +++ b/packages/cli/src/get-migrations.test.ts @@ -0,0 +1,134 @@ +import fs from 'node:fs/promises'; +import { afterEach, beforeEach, describe, it, mock } from 'node:test'; +import assert from 'node:assert'; +import { getMigrations } from './get-migrations.js'; + +const originalReaddir = fs.readdir; +const readdirMock = mock.fn(originalReaddir); + +describe('get-migrations', () => { + beforeEach(() => { + fs.readdir = readdirMock; + }); + + afterEach(() => { + readdirMock.mock.restore(); + fs.readdir = originalReaddir; + }); + + it('should skip files with leading periods', async () => { + readdirMock.mock.mockImplementation(async () => ['.foo.js', 'bar.js', 'baz.js']); + + const migrations = await getMigrations('/cwd/', 'directory'); + + assert.deepStrictEqual(migrations, [ + { + name: 'bar.js', + filePath: '/cwd/directory/bar.js', + relativeFilePath: 'directory/bar.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + { + name: 'baz.js', + filePath: '/cwd/directory/baz.js', + relativeFilePath: 'directory/baz.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + ]); + }); + + it('should skip files with leading underscores', async () => { + readdirMock.mock.mockImplementation(async () => ['_foo.js', 'bar.js', 'baz.js']); + + const migrations = await getMigrations('/cwd/', 'directory'); + + assert.deepStrictEqual(migrations, [ + { + name: 'bar.js', + filePath: '/cwd/directory/bar.js', + relativeFilePath: 'directory/bar.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + { + name: 'baz.js', + filePath: '/cwd/directory/baz.js', + relativeFilePath: 'directory/baz.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + ]); + }); + + it('should skip files without file extensions', async () => { + readdirMock.mock.mockImplementation(async () => ['foo', 'bar.js', 'baz.js']); + + const migrations = await getMigrations('/cwd/', 'directory'); + + assert.deepStrictEqual(migrations, [ + { + name: 'bar.js', + filePath: '/cwd/directory/bar.js', + relativeFilePath: 'directory/bar.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + { + name: 'baz.js', + filePath: '/cwd/directory/baz.js', + relativeFilePath: 'directory/baz.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + ]); + }); + + it('should sort them in lexicographical order', async () => { + readdirMock.mock.mockImplementation(async () => ['foo.js', 'bar_data.js', 'bar.js', 'baz.js']); + + const migrations = await getMigrations('/cwd/', 'directory'); + + assert.deepStrictEqual(migrations, [ + { + name: 'bar.js', + filePath: '/cwd/directory/bar.js', + relativeFilePath: 'directory/bar.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + { + name: 'bar_data.js', + filePath: '/cwd/directory/bar_data.js', + relativeFilePath: 'directory/bar_data.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + { + name: 'baz.js', + filePath: '/cwd/directory/baz.js', + relativeFilePath: 'directory/baz.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + { + name: 'foo.js', + filePath: '/cwd/directory/foo.js', + relativeFilePath: 'directory/foo.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + ]); + }); +}); diff --git a/packages/cli/src/get-migrations.ts b/packages/cli/src/get-migrations.ts index e208ac7..228b132 100644 --- a/packages/cli/src/get-migrations.ts +++ b/packages/cli/src/get-migrations.ts @@ -1,17 +1,14 @@ import path from 'node:path'; import fs from 'node:fs/promises'; -import { type Dirent } from 'node:fs'; import { type MigrationMetadata } from '@emigrate/types'; import { withLeadingPeriod } from './with-leading-period.js'; import { BadOptionError } from './errors.js'; export type GetMigrationsFunction = typeof getMigrations; -const tryReadDirectory = async (directoryPath: string): Promise => { +const tryReadDirectory = async (directoryPath: string): Promise => { try { - return await fs.readdir(directoryPath, { - withFileTypes: true, - }); + return await fs.readdir(directoryPath); } catch { throw BadOptionError.fromOption('directory', `Couldn't read directory: ${directoryPath}`); } @@ -23,12 +20,9 @@ export const getMigrations = async (cwd: string, directory: string): Promise - file.isFile() && !file.name.startsWith('.') && !file.name.startsWith('_') && path.extname(file.name) !== '', - ) - .sort((a, b) => a.name.localeCompare(b.name)) - .map(({ name }) => { + .filter((name) => !name.startsWith('.') && !name.startsWith('_') && path.extname(name) !== '') + .sort() + .map((name) => { const filePath = path.join(directoryPath, name); return { From ea327bbc494e91c1114a7052fbd04baf56823db7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 22 Jan 2024 12:48:35 +0000 Subject: [PATCH 075/136] chore(release): version packages --- .changeset/funny-pants-heal.md | 5 ----- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/funny-pants-heal.md diff --git a/.changeset/funny-pants-heal.md b/.changeset/funny-pants-heal.md deleted file mode 100644 index 2e4e2e7..0000000 --- a/.changeset/funny-pants-heal.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Sort migration files lexicographically correctly by using the default Array.sort implementation diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index b62cbbe..600112d 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/cli +## 0.16.1 + +### Patch Changes + +- 121492b: Sort migration files lexicographically correctly by using the default Array.sort implementation + ## 0.16.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 8ebfe63..4591ed7 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.16.0", + "version": "0.16.1", "publishConfig": { "access": "public" }, From b56b6daf73240f5bc72719fb139d2269f28d4eb4 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 23 Jan 2024 11:32:58 +0100 Subject: [PATCH 076/136] fix(cli): handle migration history entries without file extensions correctly ...even when the migration file names include periods in their names. --- .changeset/eleven-knives-learn.md | 5 ++ packages/cli/src/collect-migrations.test.ts | 99 +++++++++++++++++++++ packages/cli/src/collect-migrations.ts | 15 ++-- packages/cli/src/commands/up.test.ts | 54 +---------- packages/cli/src/test-utils.ts | 56 ++++++++++++ 5 files changed, 168 insertions(+), 61 deletions(-) create mode 100644 .changeset/eleven-knives-learn.md create mode 100644 packages/cli/src/collect-migrations.test.ts create mode 100644 packages/cli/src/test-utils.ts diff --git a/.changeset/eleven-knives-learn.md b/.changeset/eleven-knives-learn.md new file mode 100644 index 0000000..a7110c7 --- /dev/null +++ b/.changeset/eleven-knives-learn.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Handle migration history entries without file extensions for migration files with periods in their names that are not part of the file extension. Previously Emigrate would attempt to re-run these migrations, but now it will correctly ignore them. E.g. the migration history contains an entry for "migration.file.name" and the migration file is named "migration.file.name.js" it will not be re-run. diff --git a/packages/cli/src/collect-migrations.test.ts b/packages/cli/src/collect-migrations.test.ts new file mode 100644 index 0000000..f5a2b72 --- /dev/null +++ b/packages/cli/src/collect-migrations.test.ts @@ -0,0 +1,99 @@ +import { describe, it } from 'node:test'; +import assert from 'node:assert'; +import { collectMigrations } from './collect-migrations.js'; +import { toEntries, toEntry, toMigration, toMigrations } from './test-utils.js'; +import { arrayFromAsync } from './array-from-async.js'; +import { MigrationHistoryError } from './errors.js'; + +describe('collect-migrations', () => { + it('returns all migrations from the history and all pending migrations', async () => { + const cwd = '/cwd'; + const directory = 'directory'; + const history = { + async *[Symbol.asyncIterator]() { + yield* toEntries(['migration1.js', 'migration2.js']); + }, + }; + const getMigrations = async () => toMigrations(cwd, directory, ['migration1.js', 'migration2.js', 'migration3.js']); + + const result = await arrayFromAsync(collectMigrations(cwd, directory, history, getMigrations)); + + assert.deepStrictEqual(result, [ + { + ...toMigration(cwd, directory, 'migration1.js'), + duration: 0, + status: 'done', + }, + { + ...toMigration(cwd, directory, 'migration2.js'), + duration: 0, + status: 'done', + }, + toMigration(cwd, directory, 'migration3.js'), + ]); + }); + + it('includes any errors from the history', async () => { + const entry = toEntry('migration1.js', 'failed'); + const cwd = '/cwd'; + const directory = 'directory'; + const history = { + async *[Symbol.asyncIterator]() { + yield* [entry]; + }, + }; + const getMigrations = async () => toMigrations(cwd, directory, ['migration1.js', 'migration2.js', 'migration3.js']); + + const result = await arrayFromAsync(collectMigrations(cwd, directory, history, getMigrations)); + + assert.deepStrictEqual(result, [ + { + ...toMigration(cwd, directory, 'migration1.js'), + duration: 0, + status: 'failed', + error: MigrationHistoryError.fromHistoryEntry(entry), + }, + toMigration(cwd, directory, 'migration2.js'), + toMigration(cwd, directory, 'migration3.js'), + ]); + }); + + it('can handle a migration history without file extensions', async () => { + const cwd = '/cwd'; + const directory = 'directory'; + const history = { + async *[Symbol.asyncIterator]() { + yield* toEntries(['migration1']); + }, + }; + const getMigrations = async () => toMigrations(cwd, directory, ['migration1.js', 'migration2.js', 'migration3.js']); + + const result = await arrayFromAsync(collectMigrations(cwd, directory, history, getMigrations)); + + assert.deepStrictEqual(result, [ + { ...toMigration(cwd, directory, 'migration1.js'), duration: 0, status: 'done' }, + toMigration(cwd, directory, 'migration2.js'), + toMigration(cwd, directory, 'migration3.js'), + ]); + }); + + it('can handle a migration history without file extensions even if the migration name contains periods', async () => { + const cwd = '/cwd'; + const directory = 'directory'; + const history = { + async *[Symbol.asyncIterator]() { + yield* toEntries(['mig.ration1']); + }, + }; + const getMigrations = async () => + toMigrations(cwd, directory, ['mig.ration1.js', 'migration2.js', 'migration3.js']); + + const result = await arrayFromAsync(collectMigrations(cwd, directory, history, getMigrations)); + + assert.deepStrictEqual(result, [ + { ...toMigration(cwd, directory, 'mig.ration1.js'), duration: 0, status: 'done' }, + toMigration(cwd, directory, 'migration2.js'), + toMigration(cwd, directory, 'migration3.js'), + ]); + }); +}); diff --git a/packages/cli/src/collect-migrations.ts b/packages/cli/src/collect-migrations.ts index dc1ce8f..0c1886a 100644 --- a/packages/cli/src/collect-migrations.ts +++ b/packages/cli/src/collect-migrations.ts @@ -1,4 +1,3 @@ -import { extname } from 'node:path'; import { type MigrationHistoryEntry, type MigrationMetadata, type MigrationMetadataFinished } from '@emigrate/types'; import { toMigrationMetadata } from './to-migration-metadata.js'; import { getMigrations as getMigrationsOriginal } from './get-migrations.js'; @@ -12,18 +11,18 @@ export async function* collectMigrations( const allMigrations = await getMigrations(cwd, directory); const seen = new Set(); - for await (const entry_ of history) { - const entry = extname(entry_.name) === '' ? { ...entry_, name: `${entry_.name}.js` } : entry_; + for await (const entry of history) { + const migration = allMigrations.find((migrationFile) => { + return migrationFile.name === entry.name || migrationFile.name === `${entry.name}.js`; + }); - const index = allMigrations.findIndex((migrationFile) => migrationFile.name === entry.name); - - if (index === -1) { + if (!migration) { continue; } - yield toMigrationMetadata(entry, { cwd, directory }); + yield toMigrationMetadata({ ...entry, name: migration.name }, { cwd, directory }); - seen.add(entry.name); + seen.add(migration.name); } yield* allMigrations.filter((migration) => !seen.has(migration.name)); diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index bc1f840..f58ce8d 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -1,15 +1,11 @@ import { describe, it, mock, type Mock } from 'node:test'; import assert from 'node:assert'; -import path from 'node:path'; import { type EmigrateReporter, type MigrationHistoryEntry, - type MigrationMetadata, type Storage, type Plugin, type SerializedError, - type FailedMigrationHistoryEntry, - type NonFailedMigrationHistoryEntry, type MigrationMetadataFinished, } from '@emigrate/types'; import { deserializeError, serializeError } from 'serialize-error'; @@ -22,6 +18,7 @@ import { MigrationRunError, StorageInitError, } from '../errors.js'; +import { toEntries, toEntry, toMigrations } from '../test-utils.js'; import upCommand from './up.js'; type Mocked = { @@ -619,55 +616,6 @@ function getErrorCause(error: Error | undefined): Error | SerializedError | unde return undefined; } -function toMigration(cwd: string, directory: string, name: string): MigrationMetadata { - return { - name, - filePath: `${cwd}/${directory}/${name}`, - relativeFilePath: `${directory}/${name}`, - extension: path.extname(name), - directory, - cwd, - }; -} - -function toMigrations(cwd: string, directory: string, names: string[]): MigrationMetadata[] { - return names.map((name) => toMigration(cwd, directory, name)); -} - -function toEntry(name: MigrationHistoryEntry): MigrationHistoryEntry; -function toEntry( - name: string, - status?: S, -): S extends 'failed' ? FailedMigrationHistoryEntry : NonFailedMigrationHistoryEntry; - -function toEntry(name: string | MigrationHistoryEntry, status?: 'done' | 'failed'): MigrationHistoryEntry { - if (typeof name !== 'string') { - return name.status === 'failed' ? name : name; - } - - if (status === 'failed') { - return { - name, - status, - date: new Date(), - error: { name: 'Error', message: 'Failed' }, - }; - } - - return { - name, - status: status ?? 'done', - date: new Date(), - }; -} - -function toEntries( - names: Array, - status?: MigrationHistoryEntry['status'], -): MigrationHistoryEntry[] { - return names.map((name) => (typeof name === 'string' ? toEntry(name, status) : name)); -} - async function noop() { // noop } diff --git a/packages/cli/src/test-utils.ts b/packages/cli/src/test-utils.ts new file mode 100644 index 0000000..2e1b7cc --- /dev/null +++ b/packages/cli/src/test-utils.ts @@ -0,0 +1,56 @@ +import path from 'node:path'; +import { + type FailedMigrationHistoryEntry, + type MigrationHistoryEntry, + type MigrationMetadata, + type NonFailedMigrationHistoryEntry, +} from '@emigrate/types'; + +export function toMigration(cwd: string, directory: string, name: string): MigrationMetadata { + return { + name, + filePath: `${cwd}/${directory}/${name}`, + relativeFilePath: `${directory}/${name}`, + extension: path.extname(name), + directory, + cwd, + }; +} + +export function toMigrations(cwd: string, directory: string, names: string[]): MigrationMetadata[] { + return names.map((name) => toMigration(cwd, directory, name)); +} + +export function toEntry(name: MigrationHistoryEntry): MigrationHistoryEntry; +export function toEntry( + name: string, + status?: S, +): S extends 'failed' ? FailedMigrationHistoryEntry : NonFailedMigrationHistoryEntry; + +export function toEntry(name: string | MigrationHistoryEntry, status?: 'done' | 'failed'): MigrationHistoryEntry { + if (typeof name !== 'string') { + return name.status === 'failed' ? name : name; + } + + if (status === 'failed') { + return { + name, + status, + date: new Date(), + error: { name: 'Error', message: 'Failed' }, + }; + } + + return { + name, + status: status ?? 'done', + date: new Date(), + }; +} + +export function toEntries( + names: Array, + status?: MigrationHistoryEntry['status'], +): MigrationHistoryEntry[] { + return names.map((name) => (typeof name === 'string' ? toEntry(name, status) : name)); +} From 986456b03800a1da6beaaaa60038732e1b4faacd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 23 Jan 2024 10:37:12 +0000 Subject: [PATCH 077/136] chore(release): version packages --- .changeset/eleven-knives-learn.md | 5 ----- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/eleven-knives-learn.md diff --git a/.changeset/eleven-knives-learn.md b/.changeset/eleven-knives-learn.md deleted file mode 100644 index a7110c7..0000000 --- a/.changeset/eleven-knives-learn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Handle migration history entries without file extensions for migration files with periods in their names that are not part of the file extension. Previously Emigrate would attempt to re-run these migrations, but now it will correctly ignore them. E.g. the migration history contains an entry for "migration.file.name" and the migration file is named "migration.file.name.js" it will not be re-run. diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 600112d..ea9622a 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/cli +## 0.16.2 + +### Patch Changes + +- b56b6da: Handle migration history entries without file extensions for migration files with periods in their names that are not part of the file extension. Previously Emigrate would attempt to re-run these migrations, but now it will correctly ignore them. E.g. the migration history contains an entry for "migration.file.name" and the migration file is named "migration.file.name.js" it will not be re-run. + ## 0.16.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 4591ed7..dbc092e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.16.1", + "version": "0.16.2", "publishConfig": { "access": "public" }, From 9109238b86f75da1b3248976557b3c3f813743da Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 25 Jan 2024 17:59:20 +0100 Subject: [PATCH 078/136] feat(cli): improve the "up" commands --from and --to options The given values can either be migration names or relative paths to migration files. The given migration must exist to avoid accidentally running migrations that wasn't intended to run. --- .changeset/plenty-insects-accept.md | 5 + .changeset/tricky-turkeys-refuse.md | 5 + .changeset/twelve-hairs-relate.md | 5 + README.md | 21 ++- docs/src/content/docs/commands/up.mdx | 22 ++- packages/cli/README.md | 21 ++- packages/cli/src/cli.ts | 21 ++- packages/cli/src/commands/list.ts | 3 +- packages/cli/src/commands/up.test.ts | 212 +++++++++++++++++++++++--- packages/cli/src/commands/up.ts | 21 ++- packages/cli/src/filter-async.ts | 13 -- packages/cli/src/migration-runner.ts | 62 +++++++- 12 files changed, 346 insertions(+), 65 deletions(-) create mode 100644 .changeset/plenty-insects-accept.md create mode 100644 .changeset/tricky-turkeys-refuse.md create mode 100644 .changeset/twelve-hairs-relate.md delete mode 100644 packages/cli/src/filter-async.ts diff --git a/.changeset/plenty-insects-accept.md b/.changeset/plenty-insects-accept.md new file mode 100644 index 0000000..c28ddad --- /dev/null +++ b/.changeset/plenty-insects-accept.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +When the `--from` or `--to` CLI options are used the given migration name (or path to migration file) must exist. This is a BREAKING CHANGE from before. The reasoning is that by forcing the migrations to exist you avoid accidentally running migrations you don't intend to, because a simple typo could have the effect that many unwanted migrations is executed so it's better to show an error if that's the case. diff --git a/.changeset/tricky-turkeys-refuse.md b/.changeset/tricky-turkeys-refuse.md new file mode 100644 index 0000000..9e57a25 --- /dev/null +++ b/.changeset/tricky-turkeys-refuse.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': minor +--- + +Document the changes to the "up" command's `--from` and `--to` options, specifically that they can take relative file paths and that the given migration must exist. diff --git a/.changeset/twelve-hairs-relate.md b/.changeset/twelve-hairs-relate.md new file mode 100644 index 0000000..46e52ba --- /dev/null +++ b/.changeset/twelve-hairs-relate.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Add support for passing relative paths to migration files as the `--from` and `--to` CLI options. This is very useful from terminals that support autocomplete for file paths. It also makes it possible to copy the path to a migration file from Emigrate's output and use that as either `--from` and `--to` directly. diff --git a/README.md b/README.md index 7d0ec15..3715a10 100644 --- a/README.md +++ b/README.md @@ -49,22 +49,35 @@ Run all pending migrations Options: -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before running the migrations (can be specified multiple times) For example if you want to use Dotenv to load environment variables or when using TypeScript + -s, --storage The storage to use for where to store the migration history (required) + -p, --plugin The plugin(s) to use (can be specified multiple times) + -r, --reporter The reporter to use for reporting the migration progress + -l, --limit Limit the number of migrations to run - -f, --from Start running migrations from the given migration name, the given name doesn't need to exist - and is compared in lexicographical order - -t, --to Skip migrations after the given migration name, the given name doesn't need to exist - and is compared in lexicographical order + + -f, --from Start running migrations from the given migration name or relative file path to a migration file, + the given name or path needs to exist. The same migration and those after it lexicographically will be run + + -t, --to Skip migrations after the given migration name or relative file path to a migration file, + the given name or path needs to exist. The same migration and those before it lexicographically will be run + --dry List the pending migrations that would be run without actually running them + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) + --no-execution Mark the migrations as executed and successful without actually running them, which is useful if you want to mark migrations as successful after running them manually + --abort-respite The number of seconds to wait before abandoning running migrations after the command has been aborted (default: 10) Examples: diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index 3008376..cc12ad1 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -75,20 +75,34 @@ and "skipped" for the migrations that also haven't been run but won't because of The directory where the migration files are located. The given path should be absolute or relative to the current working directory. -### `-f`, `--from ` +### `-f`, `--from ` The name of the migration to start from. This can be used to run only a subset of the pending migrations. -The given migration name does not need to exist and is compared in lexicographical order with the migration names, so it can be a prefix of a migration name or similar. +The given migration need to exist and is compared in lexicographical order with all migrations, the migration with the same name and those lexicographically after it will be migrated. +It's okay to use an already executed migration as the "from" migration, it won't be executed again. + +The reason for why the given migration name must exist and cannot be just a prefix is to avoid accidentally running migrations that you didn't intend to run. + +The given name can also be a relative path to a migration file, which makes it easier to use with terminals that support tab completion +or when copying the output from Emigrate and using it directly as the value of the `--from` option. +Relative paths are resolved relative to the current working directory. Can be combined with `--dry` which will show "pending" for the migrations that would be run if not in dry-run mode, and "skipped" for the migrations that also haven't been run but won't because of the set "from". -### `-t`, `--to ` +### `-t`, `--to ` The name of the migration to end at. This can be used to run only a subset of the pending migrations. -The given migration name does not need to exist and is compared in lexicographical order with the migration names, so it can be a prefix of a migration name or similar. +The given migration name need to exist and is compared in lexicographical order with all migrations, the migration with the same name and those lexicographically before it will be migrated. +It's okay to use an already executed migration as the "to" migration, it won't be executed again. + +The reason for why the given migration name must exist and cannot be just a prefix is to avoid accidentally running migrations that you didn't intend to run. + +The given name can also be a relative path to a migration file, which makes it easier to use with terminals that support tab completion +or when copying the output from Emigrate and using it directly as the value of the `--to` option. +Relative paths are resolved relative to the current working directory. Can be combined with `--dry` which will show "pending" for the migrations that would be run if not in dry-run mode, and "skipped" for the migrations that also haven't been run but won't because of the set "to". diff --git a/packages/cli/README.md b/packages/cli/README.md index 156321a..0769765 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -28,22 +28,35 @@ Run all pending migrations Options: -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before running the migrations (can be specified multiple times) For example if you want to use Dotenv to load environment variables or when using TypeScript + -s, --storage The storage to use for where to store the migration history (required) + -p, --plugin The plugin(s) to use (can be specified multiple times) + -r, --reporter The reporter to use for reporting the migration progress + -l, --limit Limit the number of migrations to run - -f, --from Start running migrations from the given migration name, the given name doesn't need to exist - and is compared in lexicographical order - -t, --to Skip migrations after the given migration name, the given name doesn't need to exist - and is compared in lexicographical order + + -f, --from Start running migrations from the given migration name or relative file path to a migration file, + the given name or path needs to exist. The same migration and those after it lexicographically will be run + + -t, --to Skip migrations after the given migration name or relative file path to a migration file, + the given name or path needs to exist. The same migration and those before it lexicographically will be run + --dry List the pending migrations that would be run without actually running them + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) + --no-execution Mark the migrations as executed and successful without actually running them, which is useful if you want to mark migrations as successful after running them manually + --abort-respite The number of seconds to wait before abandoning running migrations after the command has been aborted (default: 10) Examples: diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index cababf1..d6a2e81 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -93,22 +93,35 @@ Run all pending migrations Options: -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before running the migrations (can be specified multiple times) For example if you want to use Dotenv to load environment variables or when using TypeScript + -s, --storage The storage to use for where to store the migration history (required) + -p, --plugin The plugin(s) to use (can be specified multiple times) + -r, --reporter The reporter to use for reporting the migration progress + -l, --limit Limit the number of migrations to run - -f, --from Start running migrations from the given migration name, the given name doesn't need to exist - and is compared in lexicographical order - -t, --to Skip migrations after the given migration name, the given name doesn't need to exist - and is compared in lexicographical order + + -f, --from Start running migrations from the given migration name or relative file path to a migration file, + the given name or path needs to exist. The same migration and those after it lexicographically will be run + + -t, --to Skip migrations after the given migration name or relative file path to a migration file, + the given name or path needs to exist. The same migration and those before it lexicographically will be run + --dry List the pending migrations that would be run without actually running them + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) + --no-execution Mark the migrations as executed and successful without actually running them, which is useful if you want to mark migrations as successful after running them manually + --abort-respite The number of seconds to wait before abandoning running migrations after the command has been aborted (default: ${DEFAULT_RESPITE_SECONDS}) Examples: diff --git a/packages/cli/src/commands/list.ts b/packages/cli/src/commands/list.ts index add45d0..8d40265 100644 --- a/packages/cli/src/commands/list.ts +++ b/packages/cli/src/commands/list.ts @@ -3,7 +3,6 @@ import { BadOptionError, MissingOptionError, StorageInitError, toError } from '. import { type Config } from '../types.js'; import { exec } from '../exec.js'; import { migrationRunner } from '../migration-runner.js'; -import { arrayFromAsync } from '../array-from-async.js'; import { collectMigrations } from '../collect-migrations.js'; import { version } from '../get-package-info.js'; @@ -56,7 +55,7 @@ export default async function listCommand({ dry: true, reporter, storage, - migrations: await arrayFromAsync(collectedMigrations), + migrations: collectedMigrations, async validate() { // No-op }, diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index f58ce8d..b55aabb 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -278,7 +278,100 @@ describe('up', () => { ]); }); - it('returns 0 and finishes without an error when pending migrations after given "from" parameter are run successfully, even when the "from" is not an existing migration', async () => { + it('returns 0 and finishes without an error when pending migrations after given "from" parameter are run successfully', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_existing_migration.js', + '4_some_other_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ from: '3_existing_migration.js' }); + + assert.strictEqual(exitCode, 0, 'Exit code'); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '3_existing_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'done', started: true }, + ]); + assert.strictEqual(migration.mock.calls.length, 2); + }); + + it('returns 0 and finishes without an error when pending migrations after given "from" parameter are run successfully, when the "from" parameter is a relative path', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_existing_migration.js', + '4_some_other_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ from: 'migrations/3_existing_migration.js' }); + + assert.strictEqual(exitCode, 0, 'Exit code'); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '3_existing_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'done', started: true }, + ]); + assert.strictEqual(migration.mock.calls.length, 2); + }); + + it('returns 0 and runs all pending migrations, if "from" is an already executed migration', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ from: '1_some_already_run_migration.js' }); + + assert.strictEqual(exitCode, 0, 'Exit code'); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'done', started: true }, + ]); + assert.strictEqual(migration.mock.calls.length, 2); + }); + + it('returns 1 and finishes with an error when the given "from" migration name does not exist', async () => { const migration = mock.fn(async () => { // Success }); @@ -297,30 +390,71 @@ describe('up', () => { const exitCode = await run({ from: '3_non_existing_migration.js' }); - assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ - { name: '2_some_migration.js', status: 'skipped' }, - { name: '4_some_other_migration.js', status: 'done', started: true }, - ]); - assert.strictEqual(migration.mock.calls.length, 1); + assert.strictEqual(exitCode, 1, 'Exit code'); + assertPreconditionsFulfilled( + { dry: false }, + reporter, + [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '4_some_other_migration.js', status: 'skipped' }, + ], + BadOptionError.fromOption( + 'from', + 'The "from" migration: "migrations/3_non_existing_migration.js" was not found', + ), + ); + assert.strictEqual(migration.mock.calls.length, 0); }); - it('returns 0 and finishes without an error when pending migrations after given "from" parameter are validated and listed successfully in dry-mode, even when the "from" is not an existing migration', async () => { + it('returns 0 and finishes without an error when pending migrations after given "from" parameter are validated and listed successfully in dry-mode', async () => { const { reporter, run } = getUpCommand( - ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], + ['1_some_already_run_migration.js', '2_some_migration.js', '3_some_other_migration.js'], getStorage(['1_some_already_run_migration.js']), ); - const exitCode = await run({ dry: true, from: '3_non_existing_migration.js' }); + const exitCode = await run({ dry: true, from: '3_some_other_migration.js' }); assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: true }, reporter, [ { name: '2_some_migration.js', status: 'skipped' }, - { name: '4_some_other_migration.js', status: 'pending' }, + { name: '3_some_other_migration.js', status: 'pending' }, ]); }); - it('returns 0 and finishes without an error when pending migrations before given "to" parameter are run successfully, even when the "to" is not an existing migration', async () => { + it('returns 0 and finishes without an error when pending migrations before given "to" parameter are run successfully', async () => { + const migration = mock.fn(async () => { + // Success + }); + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_existing_migration.js', + '4_some_other_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], + ); + + const exitCode = await run({ to: '3_existing_migration.js' }); + + assert.strictEqual(exitCode, 0, 'Exit code'); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'done', started: true }, + { name: '3_existing_migration.js', status: 'done', started: true }, + { name: '4_some_other_migration.js', status: 'skipped' }, + ]); + assert.strictEqual(migration.mock.calls.length, 2); + }); + + it('returns 1 and finishes with an error when the given "to" migration name does not exist', async () => { const migration = mock.fn(async () => { // Success }); @@ -339,25 +473,63 @@ describe('up', () => { const exitCode = await run({ to: '3_non_existing_migration.js' }); - assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ - { name: '2_some_migration.js', status: 'done', started: true }, - { name: '4_some_other_migration.js', status: 'skipped' }, - ]); - assert.strictEqual(migration.mock.calls.length, 1); + assert.strictEqual(exitCode, 1, 'Exit code'); + assertPreconditionsFulfilled( + { dry: false }, + reporter, + [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '4_some_other_migration.js', status: 'skipped' }, + ], + BadOptionError.fromOption('to', 'The "to" migration: "migrations/3_non_existing_migration.js" was not found'), + ); + assert.strictEqual(migration.mock.calls.length, 0); }); - it('returns 0 and finishes without an error when pending migrations after given "to" parameter are validated and listed successfully in dry-mode, even when the "to" is not an existing migration', async () => { + it('returns 0 and runs no migrations, if "to" is an already executed migration', async () => { + const migration = mock.fn(async () => { + // Success + }); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], getStorage(['1_some_already_run_migration.js']), + [ + { + loadableExtensions: ['.js'], + async loadMigration() { + return migration; + }, + }, + ], ); - const exitCode = await run({ dry: true, to: '3_non_existing_migration.js' }); + const exitCode = await run({ to: '1_some_already_run_migration.js' }); + + assert.strictEqual(exitCode, 0, 'Exit code'); + assertPreconditionsFulfilled({ dry: false }, reporter, [ + { name: '2_some_migration.js', status: 'skipped' }, + { name: '4_some_other_migration.js', status: 'skipped' }, + ]); + assert.strictEqual(migration.mock.calls.length, 0); + }); + + it('returns 0 and finishes without an error when pending migrations after given "to" parameter are validated and listed successfully in dry-mode', async () => { + const { reporter, run } = getUpCommand( + [ + '1_some_already_run_migration.js', + '2_some_migration.js', + '3_existing_migration.js', + '4_some_other_migration.js', + ], + getStorage(['1_some_already_run_migration.js']), + ); + + const exitCode = await run({ dry: true, to: '3_existing_migration.js' }); assert.strictEqual(exitCode, 0, 'Exit code'); assertPreconditionsFulfilled({ dry: true }, reporter, [ { name: '2_some_migration.js', status: 'pending' }, + { name: '3_existing_migration.js', status: 'pending' }, { name: '4_some_other_migration.js', status: 'skipped' }, ]); }); diff --git a/packages/cli/src/commands/up.ts b/packages/cli/src/commands/up.ts index aebf3c3..5488f2a 100644 --- a/packages/cli/src/commands/up.ts +++ b/packages/cli/src/commands/up.ts @@ -1,3 +1,4 @@ +import path from 'node:path'; import { getOrLoadPlugins, getOrLoadReporter, getOrLoadStorage } from '@emigrate/plugin-tools'; import { isFinishedMigration, type LoaderPlugin } from '@emigrate/types'; import { BadOptionError, MigrationLoadError, MissingOptionError, StorageInitError, toError } from '../errors.js'; @@ -6,9 +7,7 @@ import { withLeadingPeriod } from '../with-leading-period.js'; import { type GetMigrationsFunction } from '../get-migrations.js'; import { exec } from '../exec.js'; import { migrationRunner } from '../migration-runner.js'; -import { filterAsync } from '../filter-async.js'; import { collectMigrations } from '../collect-migrations.js'; -import { arrayFromAsync } from '../array-from-async.js'; import { version } from '../get-package-info.js'; type ExtraFlags = { @@ -72,10 +71,7 @@ export default async function upCommand({ } try { - const collectedMigrations = filterAsync( - collectMigrations(cwd, directory, storage.getHistory(), getMigrations), - (migration) => !isFinishedMigration(migration) || migration.status === 'failed', - ); + const collectedMigrations = collectMigrations(cwd, directory, storage.getHistory(), getMigrations); const loaderPlugins = await getOrLoadPlugins('loader', [lazyPluginLoaderJs, ...plugins]); @@ -93,6 +89,14 @@ export default async function upCommand({ return loaderByExtension.get(extension); }; + if (from && !from.includes(path.sep)) { + from = path.join(directory, from); + } + + if (to && !to.includes(path.sep)) { + to = path.join(directory, to); + } + const error = await migrationRunner({ dry, limit, @@ -102,7 +106,10 @@ export default async function upCommand({ abortRespite, reporter, storage, - migrations: await arrayFromAsync(collectedMigrations), + migrations: collectedMigrations, + migrationFilter(migration) { + return !isFinishedMigration(migration) || migration.status === 'failed'; + }, async validate(migration) { if (noExecution) { return; diff --git a/packages/cli/src/filter-async.ts b/packages/cli/src/filter-async.ts deleted file mode 100644 index 77a62ce..0000000 --- a/packages/cli/src/filter-async.ts +++ /dev/null @@ -1,13 +0,0 @@ -export function filterAsync( - iterable: AsyncIterable, - filter: (item: T) => item is S, -): AsyncIterable; -export function filterAsync(iterable: AsyncIterable, filter: (item: T) => unknown): AsyncIterable; - -export async function* filterAsync(iterable: AsyncIterable, filter: (item: T) => unknown): AsyncIterable { - for await (const item of iterable) { - if (filter(item)) { - yield item; - } - } -} diff --git a/packages/cli/src/migration-runner.ts b/packages/cli/src/migration-runner.ts index dac5620..a8ee424 100644 --- a/packages/cli/src/migration-runner.ts +++ b/packages/cli/src/migration-runner.ts @@ -9,7 +9,7 @@ import { type FailedMigrationMetadata, type SuccessfulMigrationMetadata, } from '@emigrate/types'; -import { toError, EmigrateError, MigrationRunError, toSerializedError } from './errors.js'; +import { toError, EmigrateError, MigrationRunError, toSerializedError, BadOptionError } from './errors.js'; import { exec } from './exec.js'; import { getDuration } from './get-duration.js'; @@ -22,7 +22,8 @@ type MigrationRunnerParameters = { abortRespite?: number; reporter: EmigrateReporter; storage: Storage; - migrations: Array; + migrations: AsyncIterable; + migrationFilter?: (migration: MigrationMetadata | MigrationMetadataFinished) => boolean; validate: (migration: MigrationMetadata) => Promise; execute: (migration: MigrationMetadata) => Promise; }; @@ -39,9 +40,9 @@ export const migrationRunner = async ({ migrations, validate, execute, + migrationFilter = () => true, }: MigrationRunnerParameters): Promise => { - await reporter.onCollectedMigrations?.(migrations); - + const collectedMigrations: Array = []; const validatedMigrations: Array = []; const migrationsToLock: MigrationMetadata[] = []; @@ -63,15 +64,32 @@ export const migrationRunner = async ({ { once: true }, ); + let fromFound = false; + let toFound = false; + for await (const migration of migrations) { + if (from && migration.relativeFilePath === from) { + fromFound = true; + } + + if (to && migration.relativeFilePath === to) { + toFound = true; + } + + if (!migrationFilter(migration)) { + continue; + } + + collectedMigrations.push(migration); + if (isFinishedMigration(migration)) { skip ||= migration.status === 'failed' || migration.status === 'skipped'; validatedMigrations.push(migration); } else if ( skip || - Boolean(from && migration.name < from) || - Boolean(to && migration.name > to) || + Boolean(from && migration.relativeFilePath < from) || + Boolean(to && migration.relativeFilePath > to) || (limit && migrationsToLock.length >= limit) ) { validatedMigrations.push({ @@ -107,6 +125,32 @@ export const migrationRunner = async ({ } } + await reporter.onCollectedMigrations?.(collectedMigrations); + + let optionError: Error | undefined; + + if (from && !fromFound) { + optionError = BadOptionError.fromOption('from', `The "from" migration: "${from}" was not found`); + } else if (to && !toFound) { + optionError = BadOptionError.fromOption('to', `The "to" migration: "${to}" was not found`); + } + + if (optionError) { + dry = true; + skip = true; + + for (const migration of migrationsToLock) { + const validatedIndex = validatedMigrations.indexOf(migration); + + validatedMigrations[validatedIndex] = { + ...migration, + status: 'skipped', + }; + } + + migrationsToLock.length = 0; + } + const [lockedMigrations, lockError] = dry ? [migrationsToLock] : await exec(async () => storage.lock(migrationsToLock), { abortSignal, abortRespite }); @@ -227,7 +271,11 @@ export const migrationRunner = async ({ ? MigrationRunError.fromMetadata(firstFailed) : undefined; const error = - unlockError ?? firstError ?? lockError ?? (abortSignal?.aborted ? toError(abortSignal.reason) : undefined); + optionError ?? + unlockError ?? + firstError ?? + lockError ?? + (abortSignal?.aborted ? toError(abortSignal.reason) : undefined); await reporter.onFinished?.(finishedMigrations, error); From f1b90987504027a7c9f275e4eb2d10692f207891 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 26 Jan 2024 09:17:47 +0100 Subject: [PATCH 079/136] fix(migrations): don't include folders when collecting migrations It should be possible to have folders inside your migrations folder --- .changeset/cuddly-peaches-look.md | 5 ++ packages/cli/src/get-migrations.test.ts | 74 ++++++++++++++++++++++--- packages/cli/src/get-migrations.ts | 45 ++++++++------- 3 files changed, 95 insertions(+), 29 deletions(-) create mode 100644 .changeset/cuddly-peaches-look.md diff --git a/.changeset/cuddly-peaches-look.md b/.changeset/cuddly-peaches-look.md new file mode 100644 index 0000000..26aa479 --- /dev/null +++ b/.changeset/cuddly-peaches-look.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Only include files when collecting migrations, i.e. it should be possible to have folders inside your migrations folder. diff --git a/packages/cli/src/get-migrations.test.ts b/packages/cli/src/get-migrations.test.ts index 3391b04..8c9e5d1 100644 --- a/packages/cli/src/get-migrations.test.ts +++ b/packages/cli/src/get-migrations.test.ts @@ -3,21 +3,27 @@ import { afterEach, beforeEach, describe, it, mock } from 'node:test'; import assert from 'node:assert'; import { getMigrations } from './get-migrations.js'; -const originalReaddir = fs.readdir; -const readdirMock = mock.fn(originalReaddir); +const originalOpendir = fs.opendir; +const opendirMock = mock.fn(originalOpendir); describe('get-migrations', () => { beforeEach(() => { - fs.readdir = readdirMock; + fs.opendir = opendirMock; }); afterEach(() => { - readdirMock.mock.restore(); - fs.readdir = originalReaddir; + opendirMock.mock.restore(); + fs.opendir = originalOpendir; }); it('should skip files with leading periods', async () => { - readdirMock.mock.mockImplementation(async () => ['.foo.js', 'bar.js', 'baz.js']); + opendirMock.mock.mockImplementation(async function* () { + yield* [ + { name: '.foo.js', isFile: () => true }, + { name: 'bar.js', isFile: () => true }, + { name: 'baz.js', isFile: () => true }, + ]; + }); const migrations = await getMigrations('/cwd/', 'directory'); @@ -42,7 +48,13 @@ describe('get-migrations', () => { }); it('should skip files with leading underscores', async () => { - readdirMock.mock.mockImplementation(async () => ['_foo.js', 'bar.js', 'baz.js']); + opendirMock.mock.mockImplementation(async function* () { + yield* [ + { name: '_foo.js', isFile: () => true }, + { name: 'bar.js', isFile: () => true }, + { name: 'baz.js', isFile: () => true }, + ]; + }); const migrations = await getMigrations('/cwd/', 'directory'); @@ -67,7 +79,44 @@ describe('get-migrations', () => { }); it('should skip files without file extensions', async () => { - readdirMock.mock.mockImplementation(async () => ['foo', 'bar.js', 'baz.js']); + opendirMock.mock.mockImplementation(async function* () { + yield* [ + { name: 'foo', isFile: () => true }, + { name: 'bar.js', isFile: () => true }, + { name: 'baz.js', isFile: () => true }, + ]; + }); + + const migrations = await getMigrations('/cwd/', 'directory'); + + assert.deepStrictEqual(migrations, [ + { + name: 'bar.js', + filePath: '/cwd/directory/bar.js', + relativeFilePath: 'directory/bar.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + { + name: 'baz.js', + filePath: '/cwd/directory/baz.js', + relativeFilePath: 'directory/baz.js', + extension: '.js', + directory: 'directory', + cwd: '/cwd/', + }, + ]); + }); + + it('should skip non-files', async () => { + opendirMock.mock.mockImplementation(async function* () { + yield* [ + { name: 'foo.js', isFile: () => false }, + { name: 'bar.js', isFile: () => true }, + { name: 'baz.js', isFile: () => true }, + ]; + }); const migrations = await getMigrations('/cwd/', 'directory'); @@ -92,7 +141,14 @@ describe('get-migrations', () => { }); it('should sort them in lexicographical order', async () => { - readdirMock.mock.mockImplementation(async () => ['foo.js', 'bar_data.js', 'bar.js', 'baz.js']); + opendirMock.mock.mockImplementation(async function* () { + yield* [ + { name: 'foo.js', isFile: () => true }, + { name: 'bar_data.js', isFile: () => true }, + { name: 'bar.js', isFile: () => true }, + { name: 'baz.js', isFile: () => true }, + ]; + }); const migrations = await getMigrations('/cwd/', 'directory'); diff --git a/packages/cli/src/get-migrations.ts b/packages/cli/src/get-migrations.ts index 228b132..fb6033d 100644 --- a/packages/cli/src/get-migrations.ts +++ b/packages/cli/src/get-migrations.ts @@ -3,37 +3,42 @@ import fs from 'node:fs/promises'; import { type MigrationMetadata } from '@emigrate/types'; import { withLeadingPeriod } from './with-leading-period.js'; import { BadOptionError } from './errors.js'; +import { arrayFromAsync } from './array-from-async.js'; export type GetMigrationsFunction = typeof getMigrations; -const tryReadDirectory = async (directoryPath: string): Promise => { +async function* tryReadDirectory(directoryPath: string): AsyncIterable { try { - return await fs.readdir(directoryPath); + for await (const entry of await fs.opendir(directoryPath)) { + if ( + entry.isFile() && + !entry.name.startsWith('.') && + !entry.name.startsWith('_') && + path.extname(entry.name) !== '' + ) { + yield entry.name; + } + } } catch { throw BadOptionError.fromOption('directory', `Couldn't read directory: ${directoryPath}`); } -}; +} export const getMigrations = async (cwd: string, directory: string): Promise => { const directoryPath = path.resolve(cwd, directory); - const allFilesInMigrationDirectory = await tryReadDirectory(directoryPath); + const allFilesInMigrationDirectory = await arrayFromAsync(tryReadDirectory(directoryPath)); - const migrationFiles: MigrationMetadata[] = allFilesInMigrationDirectory - .filter((name) => !name.startsWith('.') && !name.startsWith('_') && path.extname(name) !== '') - .sort() - .map((name) => { - const filePath = path.join(directoryPath, name); + return allFilesInMigrationDirectory.sort().map((name) => { + const filePath = path.join(directoryPath, name); - return { - name, - filePath, - relativeFilePath: path.relative(cwd, filePath), - extension: withLeadingPeriod(path.extname(name)), - directory, - cwd, - }; - }); - - return migrationFiles; + return { + name, + filePath, + relativeFilePath: path.relative(cwd, filePath), + extension: withLeadingPeriod(path.extname(name)), + directory, + cwd, + } satisfies MigrationMetadata; + }); }; From f2d4bb346e02012322885b91b729c1bed196d7f4 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 26 Jan 2024 11:25:34 +0100 Subject: [PATCH 080/136] fix(cli): make sure errors passed to the storage are serialized correctly --- .changeset/sharp-cows-joke.md | 5 + packages/cli/src/commands/up.test.ts | 186 +++++++++++++++++++-------- packages/cli/src/errors.ts | 1 + 3 files changed, 138 insertions(+), 54 deletions(-) create mode 100644 .changeset/sharp-cows-joke.md diff --git a/.changeset/sharp-cows-joke.md b/.changeset/sharp-cows-joke.md new file mode 100644 index 0000000..db9d413 --- /dev/null +++ b/.changeset/sharp-cows-joke.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Set Emigrate error instance names from their respective constructor's name for consistency and correct error deserialization. diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index b55aabb..17f1b39 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -8,7 +8,7 @@ import { type SerializedError, type MigrationMetadataFinished, } from '@emigrate/types'; -import { deserializeError, serializeError } from 'serialize-error'; +import { deserializeError } from 'serialize-error'; import { version } from '../get-package-info.js'; import { BadOptionError, @@ -17,6 +17,7 @@ import { MigrationHistoryError, MigrationRunError, StorageInitError, + toSerializedError, } from '../errors.js'; import { toEntries, toEntry, toMigrations } from '../test-utils.js'; import upCommand from './up.js'; @@ -37,39 +38,43 @@ describe('up', () => { }); it('returns 0 and finishes without an error when there are no migrations to run', async () => { - const { reporter, run } = getUpCommand([], getStorage([])); + const storage = getStorage([]); + const { reporter, run } = getUpCommand([], storage); const exitCode = await run(); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, []); + assertPreconditionsFulfilled({ dry: false }, reporter, storage, []); }); it('returns 0 and finishes without an error when all migrations have already been run', async () => { - const { reporter, run } = getUpCommand(['my_migration.js'], getStorage(['my_migration.js'])); + const storage = getStorage(['my_migration.js']); + const { reporter, run } = getUpCommand(['my_migration.js'], storage); const exitCode = await run(); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, []); + assertPreconditionsFulfilled({ dry: false }, reporter, storage, []); }); it('returns 0 and finishes without an error when all migrations have already been run even when the history responds without file extensions', async () => { - const { reporter, run } = getUpCommand(['my_migration.js'], getStorage(['my_migration'])); + const storage = getStorage(['my_migration']); + const { reporter, run } = getUpCommand(['my_migration.js'], storage); const exitCode = await run(); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, []); + assertPreconditionsFulfilled({ dry: false }, reporter, storage, []); }); it('returns 0 and finishes without an error when all pending migrations are run successfully', async () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], - getStorage(['some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -83,7 +88,7 @@ describe('up', () => { const exitCode = await run(); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: 'some_migration.js', status: 'done', started: true }, { name: 'some_other_migration.js', status: 'done', started: true }, ]); @@ -91,9 +96,10 @@ describe('up', () => { }); it('returns 1 and finishes with an error when a pending migration throw when run', async () => { + const storage = getStorage(['some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'fail.js', 'some_other_migration.js'], - getStorage(['some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -114,6 +120,7 @@ describe('up', () => { assertPreconditionsFulfilled( { dry: false }, reporter, + storage, [ { name: 'some_migration.js', status: 'done', started: true }, { name: 'fail.js', status: 'failed', started: true, error: new Error('Oh noes!') }, @@ -125,7 +132,8 @@ describe('up', () => { describe('each migration file extension needs a corresponding loader plugin', () => { it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin', async () => { - const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], getStorage([])); + const storage = getStorage([]); + const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], storage); const exitCode = await run(); @@ -133,6 +141,7 @@ describe('up', () => { assertPreconditionsFulfilled( { dry: false }, reporter, + storage, [ { name: 'some_other.js', status: 'skipped' }, { @@ -146,7 +155,8 @@ describe('up', () => { }); it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin in dry-run mode as well', async () => { - const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], getStorage([])); + const storage = getStorage([]); + const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], storage); const exitCode = await run({ dry: true }); @@ -154,6 +164,7 @@ describe('up', () => { assertPreconditionsFulfilled( { dry: true }, reporter, + storage, [ { name: 'some_other.js', status: 'skipped' }, { @@ -170,7 +181,8 @@ describe('up', () => { describe('failed migrations in the history are blocking', () => { it('returns 1 and finishes with an error when there are failed migrations in the history', async () => { const failedEntry = toEntry('some_failed_migration.js', 'failed'); - const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], getStorage([failedEntry])); + const storage = getStorage([failedEntry]); + const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], storage); const exitCode = await run(); @@ -178,6 +190,7 @@ describe('up', () => { assertPreconditionsFulfilled( { dry: false }, reporter, + storage, [ { name: 'some_failed_migration.js', @@ -198,7 +211,8 @@ describe('up', () => { it('returns 1 and finishes with an error when there are failed migrations in the history in dry-run mode as well', async () => { const failedEntry = toEntry('some_failed_migration.js', 'failed'); - const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], getStorage([failedEntry])); + const storage = getStorage([failedEntry]); + const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], storage); const exitCode = await run({ dry: true }); @@ -206,6 +220,7 @@ describe('up', () => { assertPreconditionsFulfilled( { dry: true }, reporter, + storage, [ { name: 'some_failed_migration.js', @@ -226,12 +241,13 @@ describe('up', () => { it('returns 0 and finishes without an error when the failed migrations in the history are not part of the current set of migrations', async () => { const failedEntry = toEntry('some_failed_migration.js', 'failed'); - const { reporter, run } = getUpCommand([], getStorage([failedEntry])); + const storage = getStorage([failedEntry]); + const { reporter, run } = getUpCommand([], storage); const exitCode = await run(); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, []); + assertPreconditionsFulfilled({ dry: false }, reporter, storage, []); }); }); @@ -239,9 +255,10 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], - getStorage(['some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -255,7 +272,7 @@ describe('up', () => { const exitCode = await run({ limit: 1 }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: 'some_migration.js', status: 'done', started: true }, { name: 'some_other_migration.js', status: 'skipped' }, ]); @@ -264,15 +281,16 @@ describe('up', () => { describe('limiting which pending migrations to run', () => { it('returns 0 and finishes without an error with the given number of pending migrations are validated and listed successfully in dry-mode', async () => { + const storage = getStorage(['some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], - getStorage(['some_already_run_migration.js']), + storage, ); const exitCode = await run({ dry: true, limit: 1 }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: true }, reporter, [ + assertPreconditionsFulfilled({ dry: true }, reporter, storage, [ { name: 'some_migration.js', status: 'pending' }, { name: 'some_other_migration.js', status: 'skipped' }, ]); @@ -282,6 +300,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -289,7 +308,7 @@ describe('up', () => { '3_existing_migration.js', '4_some_other_migration.js', ], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -303,7 +322,7 @@ describe('up', () => { const exitCode = await run({ from: '3_existing_migration.js' }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '3_existing_migration.js', status: 'done', started: true }, { name: '4_some_other_migration.js', status: 'done', started: true }, @@ -315,6 +334,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -322,7 +342,7 @@ describe('up', () => { '3_existing_migration.js', '4_some_other_migration.js', ], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -336,7 +356,7 @@ describe('up', () => { const exitCode = await run({ from: 'migrations/3_existing_migration.js' }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '3_existing_migration.js', status: 'done', started: true }, { name: '4_some_other_migration.js', status: 'done', started: true }, @@ -348,9 +368,10 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -364,7 +385,7 @@ describe('up', () => { const exitCode = await run({ from: '1_some_already_run_migration.js' }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: '2_some_migration.js', status: 'done', started: true }, { name: '4_some_other_migration.js', status: 'done', started: true }, ]); @@ -375,9 +396,10 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -394,6 +416,7 @@ describe('up', () => { assertPreconditionsFulfilled( { dry: false }, reporter, + storage, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '4_some_other_migration.js', status: 'skipped' }, @@ -407,15 +430,16 @@ describe('up', () => { }); it('returns 0 and finishes without an error when pending migrations after given "from" parameter are validated and listed successfully in dry-mode', async () => { + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '3_some_other_migration.js'], - getStorage(['1_some_already_run_migration.js']), + storage, ); const exitCode = await run({ dry: true, from: '3_some_other_migration.js' }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: true }, reporter, [ + assertPreconditionsFulfilled({ dry: true }, reporter, storage, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '3_some_other_migration.js', status: 'pending' }, ]); @@ -425,6 +449,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -432,7 +457,7 @@ describe('up', () => { '3_existing_migration.js', '4_some_other_migration.js', ], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -446,7 +471,7 @@ describe('up', () => { const exitCode = await run({ to: '3_existing_migration.js' }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: '2_some_migration.js', status: 'done', started: true }, { name: '3_existing_migration.js', status: 'done', started: true }, { name: '4_some_other_migration.js', status: 'skipped' }, @@ -458,9 +483,10 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -477,6 +503,7 @@ describe('up', () => { assertPreconditionsFulfilled( { dry: false }, reporter, + storage, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '4_some_other_migration.js', status: 'skipped' }, @@ -490,9 +517,10 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -506,7 +534,7 @@ describe('up', () => { const exitCode = await run({ to: '1_some_already_run_migration.js' }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '4_some_other_migration.js', status: 'skipped' }, ]); @@ -514,6 +542,7 @@ describe('up', () => { }); it('returns 0 and finishes without an error when pending migrations after given "to" parameter are validated and listed successfully in dry-mode', async () => { + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -521,13 +550,13 @@ describe('up', () => { '3_existing_migration.js', '4_some_other_migration.js', ], - getStorage(['1_some_already_run_migration.js']), + storage, ); const exitCode = await run({ dry: true, to: '3_existing_migration.js' }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: true }, reporter, [ + assertPreconditionsFulfilled({ dry: true }, reporter, storage, [ { name: '2_some_migration.js', status: 'pending' }, { name: '3_existing_migration.js', status: 'pending' }, { name: '4_some_other_migration.js', status: 'skipped' }, @@ -538,6 +567,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -547,7 +577,7 @@ describe('up', () => { '5_yet_another_migration.js', '6_some_more_migration.js', ], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -561,7 +591,7 @@ describe('up', () => { const exitCode = await run({ from: '3_another_migration.js', to: '5_yet_another_migration.js', limit: 2 }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '3_another_migration.js', status: 'done', started: true }, { name: '4_some_other_migration.js', status: 'done', started: true }, @@ -577,6 +607,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -586,7 +617,7 @@ describe('up', () => { '5_yet_another_migration.js', '6_some_more_migration.js', ], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -605,7 +636,7 @@ describe('up', () => { }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '3_another_migration.js', status: 'done', started: true }, { name: '4_some_other_migration.js', status: 'done', started: true }, @@ -620,6 +651,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -629,7 +661,7 @@ describe('up', () => { '5_yet_another_migration.js', '6_some_more_migration.js', ], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -648,7 +680,7 @@ describe('up', () => { }); assert.strictEqual(exitCode, 0, 'Exit code'); - assertPreconditionsFulfilled({ dry: false }, reporter, [ + assertPreconditionsFulfilled({ dry: false }, reporter, storage, [ { name: '2_some_migration.js', status: 'skipped' }, { name: '3_another_migration.js', status: 'done', started: true }, { name: '4_some_other_migration.sql', status: 'done', started: true }, @@ -671,6 +703,7 @@ describe('up', () => { }, { times: 1 }, ); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -680,7 +713,7 @@ describe('up', () => { '5_yet_another_migration.js', '6_some_more_migration.js', ], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -699,6 +732,7 @@ describe('up', () => { assertPreconditionsFulfilled( { dry: false }, reporter, + storage, [ { name: '2_some_migration.js', status: 'done', started: true }, { name: '3_another_migration.js', status: 'done', started: true }, @@ -728,6 +762,7 @@ describe('up', () => { }, { times: 1 }, ); + const storage = getStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -737,7 +772,7 @@ describe('up', () => { '5_yet_another_migration.js', '6_some_more_migration.js', ], - getStorage(['1_some_already_run_migration.js']), + storage, [ { loadableExtensions: ['.js'], @@ -757,6 +792,7 @@ describe('up', () => { assertPreconditionsFulfilled( { dry: false }, reporter, + storage, [ { name: '2_some_migration.js', status: 'done', started: true }, { @@ -864,6 +900,7 @@ function getUpCommand(migrationFiles: string[], storage?: Mocked, plugi function assertPreconditionsFulfilled( options: { dry: boolean }, reporter: Mocked>, + storage: Mocked, expected: Array<{ name: string; status: MigrationMetadataFinished['status']; started?: boolean; error?: Error }>, finishedError?: Error, ) { @@ -884,7 +921,9 @@ function assertPreconditionsFulfilled( let failed = 0; let skipped = 0; let pending = 0; + let failedAndStarted = 0; const failedEntries: typeof expected = []; + const successfulEntries: typeof expected = []; for (const entry of expected) { if (entry.started) { @@ -895,12 +934,22 @@ function assertPreconditionsFulfilled( switch (entry.status) { case 'done': { done++; + + if (entry.started) { + successfulEntries.push(entry); + } + break; } case 'failed': { failed++; failedEntries.push(entry); + + if (entry.started) { + failedAndStarted++; + } + break; } @@ -922,28 +971,29 @@ function assertPreconditionsFulfilled( assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, done, 'Successful migrations'); assert.strictEqual(reporter.onMigrationError.mock.calls.length, failed, 'Failed migrations'); + assert.strictEqual(storage.onSuccess.mock.calls.length, successfulEntries.length, 'Storage onSuccess calls'); + assert.strictEqual(storage.onError.mock.calls.length, failedAndStarted, 'Storage onError calls'); + for (const [index, entry] of failedEntries.entries()) { if (entry.status === 'failed') { const error = reporter.onMigrationError.mock.calls[index]?.arguments[1]; assert.deepStrictEqual(error, entry.error, 'Error'); const cause = entry.error?.cause; assert.deepStrictEqual(error?.cause, cause ? deserializeError(cause) : cause, 'Error cause'); + + if (entry.started) { + const [finishedMigration, error] = storage.onError.mock.calls[index]?.arguments ?? []; + assert.strictEqual(finishedMigration?.name, entry.name); + assert.strictEqual(finishedMigration?.status, entry.status); + assertErrorEqualEnough(error, entry.error); + } } } assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, pending + skipped, 'Total pending and skipped'); assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - if (finishedError instanceof DOMException || error instanceof DOMException) { - // The assert library doesn't support DOMException apparently, so ugly workaround here: - assert.deepStrictEqual( - deserializeError(serializeError(error)), - deserializeError(serializeError(finishedError)), - 'Finished error', - ); - } else { - assert.deepStrictEqual(error, finishedError, 'Finished error'); - } + assertErrorEqualEnough(error, finishedError); const cause = getErrorCause(error); const expectedCause = finishedError?.cause; @@ -958,6 +1008,14 @@ function assertPreconditionsFulfilled( expected.map((entry) => `${entry.name} (${entry.status})`), 'Finished entries', ); + + for (const [index, entry] of successfulEntries.entries()) { + const [finishedMigration] = storage.onSuccess.mock.calls[index]?.arguments ?? []; + assert.strictEqual(finishedMigration?.name, entry.name); + assert.strictEqual(finishedMigration?.status, entry.status); + } + + assert.strictEqual(storage.end.mock.calls.length, 1, 'Storage end should always be called'); } function assertPreconditionsFailed( @@ -994,3 +1052,23 @@ function assertPreconditionsFailed( ); assert.strictEqual(entries?.length, 0, 'Finished entries length'); } + +function assertErrorEqualEnough(actual?: Error | SerializedError, expected?: Error) { + if (expected === undefined) { + assert.strictEqual(actual, undefined); + return; + } + + const { + cause: actualCause, + stack: actualStack, + ...actualError + } = actual instanceof Error ? toSerializedError(actual) : actual ?? {}; + const { cause: expectedCause, stack: expectedStack, ...expectedError } = toSerializedError(expected); + // @ts-expect-error Ignore + const { stack: actualCauseStack, ...actualCauseRest } = actualCause ?? {}; + // @ts-expect-error Ignore + const { stack: expectedCauseStack, ...expectedCauseRest } = expectedCause ?? {}; + assert.deepStrictEqual(actualError, expectedError); + assert.deepStrictEqual(actualCauseRest, expectedCauseRest); +} diff --git a/packages/cli/src/errors.ts b/packages/cli/src/errors.ts index b867021..8582050 100644 --- a/packages/cli/src/errors.ts +++ b/packages/cli/src/errors.ts @@ -23,6 +23,7 @@ export class EmigrateError extends Error { public code?: string, ) { super(message, options); + this.name = this.constructor.name; } } From 94ad9feae95ea5cc0728220211d3cc0fe503a35f Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 26 Jan 2024 15:05:06 +0100 Subject: [PATCH 081/136] feat(types): simplify the EmigrateReporter interface by removing the "remove" specific methods --- .changeset/eleven-files-love.md | 5 +++++ packages/types/src/index.ts | 29 +++++++---------------------- 2 files changed, 12 insertions(+), 22 deletions(-) create mode 100644 .changeset/eleven-files-love.md diff --git a/.changeset/eleven-files-love.md b/.changeset/eleven-files-love.md new file mode 100644 index 0000000..c4fbcd7 --- /dev/null +++ b/.changeset/eleven-files-love.md @@ -0,0 +1,5 @@ +--- +'@emigrate/types': minor +--- + +Remove the "remove" command specific reporter methods. So instead of using `onMigrationRemoveStart`, `onMigrationRemoveSuccess` and `onMigrationRemoveError` the `onMigrationStart`, `onMigrationSuccess` and `onMigrationError` methods should be used and the reporter can still format the output differently depending on the current command (which it receives in the `onInit` method). This is a BREAKING CHANGE. diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 89a546a..9461bd9 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -272,36 +272,20 @@ export type EmigrateReporter = Partial<{ * This is only called when the command is 'new'. */ onNewMigration(migration: MigrationMetadata, content: string): Awaitable; - /** - * Called when a migration is about to be removed from the migration history. - * - * This is only called when the command is 'remove'. - */ - onMigrationRemoveStart(migration: MigrationMetadata): Awaitable; - /** - * Called when a migration is successfully removed from the migration history. - * - * This is only called when the command is 'remove'. - */ - onMigrationRemoveSuccess(migration: SuccessfulMigrationMetadata): Awaitable; - /** - * Called when a migration couldn't be removed from the migration history. - * - * This is only called when the command is 'remove'. - */ - onMigrationRemoveError(migration: FailedMigrationMetadata, error: Error): Awaitable; /** * Called when a migration is about to be executed. * - * Will only be called for each migration when the command is "up". + * Will be called for each migration when the command is "up", + * or before removing each migration from the history when the command is "remove". * - * @param migration Information about the migration that is about to be executed. + * @param migration Information about the migration that is about to be executed/removed. */ onMigrationStart(migration: MigrationMetadata): Awaitable; /** * Called when a migration has been successfully executed. * - * Will be called after a successful migration when the command is "up" + * Will be called after a successful migration when the command is "up", + * or after a successful removal of a migration from the history when the command is "remove", * or for each successful migration from the history when the command is "list". * * @param migration Information about the migration that was executed. @@ -310,7 +294,8 @@ export type EmigrateReporter = Partial<{ /** * Called when a migration has failed. * - * Will be called after a failed migration when the command is "up" + * Will be called after a failed migration when the command is "up", + * or after a failed removal of a migration from the history when the command is "remove", * or for each failed migration from the history when the command is "list" (will be at most one in this case). * * @param migration Information about the migration that failed. From 86e0d52e5c7bcd538c10e52c573fc66055460041 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 26 Jan 2024 15:05:43 +0100 Subject: [PATCH 082/136] feat(reporter-pino): adapt to the new Reporter interface --- .changeset/tame-apples-lick.md | 5 ++++ packages/reporter-pino/src/index.ts | 36 +++++++++-------------------- 2 files changed, 16 insertions(+), 25 deletions(-) create mode 100644 .changeset/tame-apples-lick.md diff --git a/.changeset/tame-apples-lick.md b/.changeset/tame-apples-lick.md new file mode 100644 index 0000000..ef6ad0a --- /dev/null +++ b/.changeset/tame-apples-lick.md @@ -0,0 +1,5 @@ +--- +'@emigrate/reporter-pino': minor +--- + +Adapt to the new Reporter interface, i.e. the removal of the "remove" command related methods diff --git a/packages/reporter-pino/src/index.ts b/packages/reporter-pino/src/index.ts index 942c55d..a6c519c 100644 --- a/packages/reporter-pino/src/index.ts +++ b/packages/reporter-pino/src/index.ts @@ -104,27 +104,14 @@ class PinoReporter implements Required { ); } - onMigrationRemoveStart(migration: MigrationMetadata): Awaitable { - this.#logger.debug({ migration: migration.relativeFilePath }, `Removing migration: ${migration.name}`); - } - - onMigrationRemoveSuccess(migration: MigrationMetadataFinished): Awaitable { - this.#logger.info({ migration: migration.relativeFilePath }, `Successfully removed migration: ${migration.name}`); - } - - onMigrationRemoveError(migration: MigrationMetadataFinished, error: Error): Awaitable { - this.#logger.error( - { migration: migration.relativeFilePath, [this.errorKey]: error }, - `Failed to remove migration: ${migration.name}`, - ); - } - onMigrationStart(migration: MigrationMetadata): Awaitable { - this.#logger.info({ migration: migration.relativeFilePath }, `${migration.name} (running)`); + const status = this.#command === 'up' ? 'running' : 'removing'; + this.#logger.info({ migration: migration.relativeFilePath }, `${migration.name} (${status})`); } onMigrationSuccess(migration: MigrationMetadataFinished): Awaitable { - this.#logger.info({ migration: migration.relativeFilePath }, `${migration.name} (${migration.status})`); + const status = this.#command === 'up' ? 'done' : 'removed'; + this.#logger.info({ migration: migration.relativeFilePath }, `${migration.name} (${status})`); } onMigrationError(migration: MigrationMetadataFinished, error: Error): Awaitable { @@ -174,16 +161,15 @@ class PinoReporter implements Required { } } + const result = + this.#command === 'remove' + ? { removed: done, failed, skipped, pending, total } + : { done, failed, skipped, pending, total }; + if (error) { - this.#logger.error( - { result: { failed, done, skipped, pending, total }, [this.errorKey]: error }, - `Emigrate "${this.#command}" failed`, - ); + this.#logger.error({ result, [this.errorKey]: error }, `Emigrate "${this.#command}" failed`); } else { - this.#logger.info( - { result: { failed, done, skipped, pending, total } }, - `Emigrate "${this.#command}" finished successfully`, - ); + this.#logger.info({ result }, `Emigrate "${this.#command}" finished successfully`); } } } From 1f139fd975b7b8a0ee5d3a0d070dc5dd58508547 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 26 Jan 2024 15:11:02 +0100 Subject: [PATCH 083/136] feat(remove): rework the "remove" command to be more similar to "up" and "list" The old reporter methods related to the "remove" command is not used anymore and instead the shared `onMigrationStart`, `onMigrationSuccess` and `onMigrationError` methods are used. Some preparation has also been made to support for removing multiple migrations at once in the future, similar to how the `--from` and `--to` CLI options work for the "up" command. --- .changeset/thin-pillows-obey.md | 5 + packages/cli/src/array-map-async.ts | 5 + packages/cli/src/cli.ts | 3 +- packages/cli/src/commands/list.ts | 6 + packages/cli/src/commands/remove.test.ts | 306 +++++++++++++++++++++++ packages/cli/src/commands/remove.ts | 157 +++++++----- packages/cli/src/commands/up.test.ts | 119 +++------ packages/cli/src/commands/up.ts | 15 +- packages/cli/src/errors.ts | 11 + packages/cli/src/migration-runner.ts | 53 ++-- packages/cli/src/reporters/default.ts | 64 ++--- packages/cli/src/test-utils.ts | 58 +++++ 12 files changed, 593 insertions(+), 209 deletions(-) create mode 100644 .changeset/thin-pillows-obey.md create mode 100644 packages/cli/src/array-map-async.ts create mode 100644 packages/cli/src/commands/remove.test.ts diff --git a/.changeset/thin-pillows-obey.md b/.changeset/thin-pillows-obey.md new file mode 100644 index 0000000..2f94c63 --- /dev/null +++ b/.changeset/thin-pillows-obey.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Completely rework how the "remove" command is run, this is to make it more similar to the "up" and "list" command as now it will also use the `onMigrationStart`, `onMigrationSuccess` and `onMigrationError` reporter methods when reporting the command progress. It's also in preparation for adding `--from` and `--to` CLI options for the "remove" command, similar to how the same options work for the "up" command. diff --git a/packages/cli/src/array-map-async.ts b/packages/cli/src/array-map-async.ts new file mode 100644 index 0000000..e602c5a --- /dev/null +++ b/packages/cli/src/array-map-async.ts @@ -0,0 +1,5 @@ +export async function* arrayMapAsync(iterable: AsyncIterable, mapper: (item: T) => U): AsyncIterable { + for await (const item of iterable) { + yield mapper(item); + } +} diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index d6a2e81..bd74870 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -457,8 +457,7 @@ Options: For example if you want to use Dotenv to load environment variables -r, --reporter The reporter to use for reporting the removal process -s, --storage The storage to use to get the migration history (required) - -f, --force Force removal of the migration history entry even if the migration file does not exist - or it's in a non-failed state + -f, --force Force removal of the migration history entry even if the migration is not in a failed state --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) diff --git a/packages/cli/src/commands/list.ts b/packages/cli/src/commands/list.ts index 8d40265..0dcdcf9 100644 --- a/packages/cli/src/commands/list.ts +++ b/packages/cli/src/commands/list.ts @@ -62,6 +62,12 @@ export default async function listCommand({ async execute() { throw new Error('Unexpected execute call'); }, + async onSuccess() { + throw new Error('Unexpected onSuccess call'); + }, + async onError() { + throw new Error('Unexpected onError call'); + }, }); return error ? 1 : 0; diff --git a/packages/cli/src/commands/remove.test.ts b/packages/cli/src/commands/remove.test.ts new file mode 100644 index 0000000..a283551 --- /dev/null +++ b/packages/cli/src/commands/remove.test.ts @@ -0,0 +1,306 @@ +import { describe, it } from 'node:test'; +import assert from 'node:assert'; +import { type EmigrateReporter, type Storage, type Plugin, type MigrationMetadataFinished } from '@emigrate/types'; +import { deserializeError } from 'serialize-error'; +import { version } from '../get-package-info.js'; +import { + BadOptionError, + MigrationNotRunError, + MigrationRemovalError, + OptionNeededError, + StorageInitError, +} from '../errors.js'; +import { + getErrorCause, + getMockedReporter, + getMockedStorage, + toEntry, + toMigrations, + type Mocked, +} from '../test-utils.js'; +import removeCommand from './remove.js'; + +describe('remove', () => { + it("returns 1 and finishes with an error when the storage couldn't be initialized", async () => { + const { reporter, run } = getRemoveCommand([]); + + const exitCode = await run('some_migration.js'); + + assert.strictEqual(exitCode, 1, 'Exit code'); + assertPreconditionsFailed(reporter, StorageInitError.fromError(new Error('No storage configured'))); + }); + + it('returns 1 and finishes with an error when the given migration has not been executed', async () => { + const storage = getMockedStorage(['some_other_migration.js']); + const { reporter, run } = getRemoveCommand(['some_migration.js'], storage); + + const exitCode = await run('some_migration.js'); + + assert.strictEqual(exitCode, 1, 'Exit code'); + assertPreconditionsFulfilled( + reporter, + storage, + [ + { + name: 'some_migration.js', + status: 'failed', + error: new MigrationNotRunError('Migration "some_migration.js" is not in the migration history'), + }, + ], + new MigrationNotRunError('Migration "some_migration.js" is not in the migration history'), + ); + }); + + it('returns 1 and finishes with an error when the given migration is not in a failed state in the history', async () => { + const storage = getMockedStorage(['1_old_migration.js', '2_some_migration.js', '3_new_migration.js']); + const { reporter, run } = getRemoveCommand(['2_some_migration.js'], storage); + + const exitCode = await run('2_some_migration.js'); + + assert.strictEqual(exitCode, 1, 'Exit code'); + assertPreconditionsFulfilled( + reporter, + storage, + [ + { + name: '2_some_migration.js', + status: 'failed', + error: OptionNeededError.fromOption( + 'force', + 'The migration "2_some_migration.js" is not in a failed state. Use the "force" option to force its removal', + ), + }, + ], + OptionNeededError.fromOption( + 'force', + 'The migration "2_some_migration.js" is not in a failed state. Use the "force" option to force its removal', + ), + ); + }); + + it('returns 1 and finishes with an error when the given migration does not exist at all', async () => { + const storage = getMockedStorage(['some_migration.js']); + const { reporter, run } = getRemoveCommand(['some_migration.js'], storage); + + const exitCode = await run('some_other_migration.js'); + + assert.strictEqual(exitCode, 1, 'Exit code'); + assertPreconditionsFulfilled( + reporter, + storage, + [], + BadOptionError.fromOption('name', 'The migration: "migrations/some_other_migration.js" was not found'), + ); + }); + + it('returns 0, removes the migration from the history and finishes without an error when the given migration is in a failed state', async () => { + const storage = getMockedStorage([toEntry('some_migration.js', 'failed')]); + const { reporter, run } = getRemoveCommand(['some_migration.js'], storage); + + const exitCode = await run('some_migration.js'); + + assert.strictEqual(exitCode, 0, 'Exit code'); + assertPreconditionsFulfilled(reporter, storage, [{ name: 'some_migration.js', status: 'done', started: true }]); + }); + + it('returns 0, removes the migration from the history and finishes without an error when the given migration is not in a failed state but "force" is true', async () => { + const storage = getMockedStorage(['1_old_migration.js', '2_some_migration.js', '3_new_migration.js']); + const { reporter, run } = getRemoveCommand(['2_some_migration.js'], storage); + + const exitCode = await run('2_some_migration.js', { force: true }); + + assert.strictEqual(exitCode, 0, 'Exit code'); + assertPreconditionsFulfilled(reporter, storage, [{ name: '2_some_migration.js', status: 'done', started: true }]); + }); + + it('returns 1 and finishes with an error when the removal of the migration crashes', async () => { + const storage = getMockedStorage([toEntry('some_migration.js', 'failed')]); + storage.remove.mock.mockImplementation(async () => { + throw new Error('Some error'); + }); + const { reporter, run } = getRemoveCommand(['some_migration.js'], storage); + + const exitCode = await run('some_migration.js'); + + assert.strictEqual(exitCode, 1, 'Exit code'); + assertPreconditionsFulfilled( + reporter, + storage, + [ + { + name: 'some_migration.js', + status: 'failed', + error: new Error('Some error'), + started: true, + }, + ], + new MigrationRemovalError('Failed to remove migration: migrations/some_migration.js', { + cause: new Error('Some error'), + }), + ); + }); +}); + +function getRemoveCommand(migrationFiles: string[], storage?: Mocked, plugins?: Plugin[]) { + const reporter = getMockedReporter(); + + const run = async ( + name: string, + options?: Omit[0], 'cwd' | 'directory' | 'storage' | 'reporter' | 'plugins'>, + ) => { + return removeCommand( + { + cwd: '/emigrate', + directory: 'migrations', + storage: { + async initializeStorage() { + if (!storage) { + throw new Error('No storage configured'); + } + + return storage; + }, + }, + reporter, + plugins: plugins ?? [], + async getMigrations(cwd, directory) { + return toMigrations(cwd, directory, migrationFiles); + }, + ...options, + }, + name, + ); + }; + + return { + reporter, + storage, + run, + }; +} + +function assertPreconditionsFailed(reporter: Mocked>, finishedError?: Error) { + assert.strictEqual(reporter.onInit.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ + { + command: 'remove', + cwd: '/emigrate', + version, + dry: false, + color: undefined, + directory: 'migrations', + }, + ]); + assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 0, 'Collected call'); + assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 0, 'Locked call'); + assert.strictEqual(reporter.onMigrationStart.mock.calls.length, 0, 'Started migrations'); + assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, 0, 'Successful migrations'); + assert.strictEqual(reporter.onMigrationError.mock.calls.length, 0, 'Failed migrations'); + assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0, 'Total pending and skipped'); + assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); + const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; + assert.deepStrictEqual(error, finishedError, 'Finished error'); + const cause = getErrorCause(error); + const expectedCause = finishedError?.cause; + assert.deepStrictEqual( + cause, + expectedCause ? deserializeError(expectedCause) : expectedCause, + 'Finished error cause', + ); + assert.strictEqual(entries?.length, 0, 'Finished entries length'); +} + +function assertPreconditionsFulfilled( + reporter: Mocked>, + storage: Mocked, + expected: Array<{ name: string; status: MigrationMetadataFinished['status']; started?: boolean; error?: Error }>, + finishedError?: Error, +) { + assert.strictEqual(reporter.onInit.mock.calls.length, 1); + assert.deepStrictEqual(reporter.onInit.mock.calls[0]?.arguments, [ + { + command: 'remove', + cwd: '/emigrate', + version, + dry: false, + color: undefined, + directory: 'migrations', + }, + ]); + + let started = 0; + let done = 0; + let failed = 0; + let skipped = 0; + let pending = 0; + let failedAndStarted = 0; + const failedEntries: typeof expected = []; + const successfulEntries: typeof expected = []; + + for (const entry of expected) { + if (entry.started) { + started++; + } + + // eslint-disable-next-line default-case + switch (entry.status) { + case 'done': { + done++; + + if (entry.started) { + successfulEntries.push(entry); + } + + break; + } + + case 'failed': { + failed++; + failedEntries.push(entry); + + if (entry.started) { + failedAndStarted++; + } + + break; + } + + case 'skipped': { + skipped++; + break; + } + + case 'pending': { + pending++; + break; + } + } + } + + assert.strictEqual(reporter.onCollectedMigrations.mock.calls.length, 1, 'Collected call'); + assert.strictEqual(storage.lock.mock.calls.length, 0, 'Storage lock never called'); + assert.strictEqual(storage.unlock.mock.calls.length, 0, 'Storage unlock never called'); + assert.strictEqual(reporter.onLockedMigrations.mock.calls.length, 0, 'Locked call'); + assert.strictEqual(reporter.onMigrationStart.mock.calls.length, started, 'Started migrations'); + assert.strictEqual(reporter.onMigrationSuccess.mock.calls.length, successfulEntries.length, 'Successful migrations'); + assert.strictEqual(storage.remove.mock.calls.length, started, 'Storage remove called'); + assert.strictEqual(reporter.onMigrationError.mock.calls.length, failedEntries.length, 'Failed migrations'); + assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0, 'Total pending and skipped'); + assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); + const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; + assert.deepStrictEqual(error, finishedError, 'Finished error'); + const cause = getErrorCause(error); + const expectedCause = finishedError?.cause; + assert.deepStrictEqual( + cause, + expectedCause ? deserializeError(expectedCause) : expectedCause, + 'Finished error cause', + ); + assert.strictEqual(entries?.length, expected.length, 'Finished entries length'); + assert.deepStrictEqual( + entries.map((entry) => `${entry.name} (${entry.status})`), + expected.map((entry) => `${entry.name} (${entry.status})`), + 'Finished entries', + ); + assert.strictEqual(storage.end.mock.calls.length, 1, 'Storage end called once'); +} diff --git a/packages/cli/src/commands/remove.ts b/packages/cli/src/commands/remove.ts index cd2a42d..6b3d977 100644 --- a/packages/cli/src/commands/remove.ts +++ b/packages/cli/src/commands/remove.ts @@ -1,29 +1,44 @@ -import process from 'node:process'; +import path from 'node:path'; import { getOrLoadReporter, getOrLoadStorage } from '@emigrate/plugin-tools'; -import { type MigrationHistoryEntry, type MigrationMetadataFinished } from '@emigrate/types'; +import { type MigrationMetadata, isFinishedMigration } from '@emigrate/types'; import { BadOptionError, MigrationNotRunError, + MigrationRemovalError, MissingArgumentsError, MissingOptionError, OptionNeededError, StorageInitError, + toError, } from '../errors.js'; import { type Config } from '../types.js'; -import { getMigration } from '../get-migration.js'; -import { getDuration } from '../get-duration.js'; import { exec } from '../exec.js'; import { version } from '../get-package-info.js'; +import { collectMigrations } from '../collect-migrations.js'; +import { migrationRunner } from '../migration-runner.js'; +import { arrayMapAsync } from '../array-map-async.js'; +import { type GetMigrationsFunction } from '../get-migrations.js'; type ExtraFlags = { cwd: string; force?: boolean; + getMigrations?: GetMigrationsFunction; }; +type RemovableMigrationMetadata = MigrationMetadata & { originalStatus?: 'done' | 'failed' }; + const lazyDefaultReporter = async () => import('../reporters/default.js'); export default async function removeCommand( - { directory, reporter: reporterConfig, storage: storageConfig, color, cwd, force = false }: Config & ExtraFlags, + { + directory, + reporter: reporterConfig, + storage: storageConfig, + color, + cwd, + force = false, + getMigrations, + }: Config & ExtraFlags, name: string, ) { if (!directory) { @@ -59,71 +74,79 @@ export default async function removeCommand( return 1; } - const [migrationFile, fileError] = await exec(async () => getMigration(cwd, directory, name, !force)); + try { + const collectedMigrations = arrayMapAsync( + collectMigrations(cwd, directory, storage.getHistory(), getMigrations), + (migration) => { + if (isFinishedMigration(migration)) { + if (migration.status === 'failed') { + const { status, duration, error, ...pendingMigration } = migration; + const removableMigration: RemovableMigrationMetadata = { ...pendingMigration, originalStatus: status }; - if (fileError) { - await reporter.onFinished?.([], fileError); + return removableMigration; + } - await storage.end(); + if (migration.status === 'done') { + const { status, duration, ...pendingMigration } = migration; + const removableMigration: RemovableMigrationMetadata = { ...pendingMigration, originalStatus: status }; + + return removableMigration; + } + + throw new Error(`Unexpected migration status: ${migration.status}`); + } + + return migration as RemovableMigrationMetadata; + }, + ); + + if (!name.includes(path.sep)) { + name = path.join(directory, name); + } + + const error = await migrationRunner({ + dry: false, + lock: false, + name, + reporter, + storage, + migrations: collectedMigrations, + migrationFilter(migration) { + return migration.relativeFilePath === name; + }, + async validate(migration) { + if (migration.originalStatus === 'done' && !force) { + throw OptionNeededError.fromOption( + 'force', + `The migration "${migration.name}" is not in a failed state. Use the "force" option to force its removal`, + ); + } + + if (!migration.originalStatus) { + throw MigrationNotRunError.fromMetadata(migration); + } + }, + async execute(migration) { + try { + await storage.remove(migration); + } catch (error) { + throw MigrationRemovalError.fromMetadata(migration, toError(error)); + } + }, + async onSuccess() { + // No-op + }, + async onError() { + // No-op + }, + }); + + return error ? 1 : 0; + } catch (error) { + await reporter.onFinished?.([], toError(error)); return 1; + } finally { + await storage.end(); } - - const finishedMigrations: MigrationMetadataFinished[] = []; - let historyEntry: MigrationHistoryEntry | undefined; - let removalError: Error | undefined; - - for await (const migrationHistoryEntry of storage.getHistory()) { - if (migrationHistoryEntry.name !== migrationFile.name) { - continue; - } - - if (migrationHistoryEntry.status === 'done' && !force) { - removalError = OptionNeededError.fromOption( - 'force', - `The migration "${migrationFile.name}" is not in a failed state. Use the "force" option to force its removal`, - ); - } else { - historyEntry = migrationHistoryEntry; - } - } - - await reporter.onMigrationRemoveStart?.(migrationFile); - - const start = process.hrtime(); - - if (historyEntry) { - try { - await storage.remove(migrationFile); - - const duration = getDuration(start); - const finishedMigration: MigrationMetadataFinished = { ...migrationFile, status: 'done', duration }; - - await reporter.onMigrationRemoveSuccess?.(finishedMigration); - - finishedMigrations.push(finishedMigration); - } catch (error) { - removalError = error instanceof Error ? error : new Error(String(error)); - } - } else if (!removalError) { - removalError = MigrationNotRunError.fromMetadata(migrationFile); - } - - if (removalError) { - const duration = getDuration(start); - const finishedMigration: MigrationMetadataFinished = { - ...migrationFile, - status: 'failed', - error: removalError, - duration, - }; - await reporter.onMigrationRemoveError?.(finishedMigration, removalError); - finishedMigrations.push(finishedMigration); - } - - await reporter.onFinished?.(finishedMigrations, removalError); - - await storage.end(); - - return removalError ? 1 : 0; } diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index 17f1b39..869af10 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -1,8 +1,7 @@ -import { describe, it, mock, type Mock } from 'node:test'; +import { describe, it, mock } from 'node:test'; import assert from 'node:assert'; import { type EmigrateReporter, - type MigrationHistoryEntry, type Storage, type Plugin, type SerializedError, @@ -19,14 +18,16 @@ import { StorageInitError, toSerializedError, } from '../errors.js'; -import { toEntries, toEntry, toMigrations } from '../test-utils.js'; +import { + type Mocked, + toEntry, + toMigrations, + getMockedReporter, + getMockedStorage, + getErrorCause, +} from '../test-utils.js'; import upCommand from './up.js'; -type Mocked = { - // @ts-expect-error - This is a mock - [K in keyof T]: Mock; -}; - describe('up', () => { it("returns 1 and finishes with an error when the storage couldn't be initialized", async () => { const { reporter, run } = getUpCommand(['some_migration.js']); @@ -38,7 +39,7 @@ describe('up', () => { }); it('returns 0 and finishes without an error when there are no migrations to run', async () => { - const storage = getStorage([]); + const storage = getMockedStorage([]); const { reporter, run } = getUpCommand([], storage); const exitCode = await run(); @@ -48,7 +49,7 @@ describe('up', () => { }); it('returns 0 and finishes without an error when all migrations have already been run', async () => { - const storage = getStorage(['my_migration.js']); + const storage = getMockedStorage(['my_migration.js']); const { reporter, run } = getUpCommand(['my_migration.js'], storage); const exitCode = await run(); @@ -58,7 +59,7 @@ describe('up', () => { }); it('returns 0 and finishes without an error when all migrations have already been run even when the history responds without file extensions', async () => { - const storage = getStorage(['my_migration']); + const storage = getMockedStorage(['my_migration']); const { reporter, run } = getUpCommand(['my_migration.js'], storage); const exitCode = await run(); @@ -71,7 +72,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['some_already_run_migration.js']); + const storage = getMockedStorage(['some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], storage, @@ -96,7 +97,7 @@ describe('up', () => { }); it('returns 1 and finishes with an error when a pending migration throw when run', async () => { - const storage = getStorage(['some_already_run_migration.js']); + const storage = getMockedStorage(['some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'fail.js', 'some_other_migration.js'], storage, @@ -132,7 +133,7 @@ describe('up', () => { describe('each migration file extension needs a corresponding loader plugin', () => { it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin', async () => { - const storage = getStorage([]); + const storage = getMockedStorage([]); const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], storage); const exitCode = await run(); @@ -155,7 +156,7 @@ describe('up', () => { }); it('returns 1 and finishes with an error when there are migration file extensions without a corresponding loader plugin in dry-run mode as well', async () => { - const storage = getStorage([]); + const storage = getMockedStorage([]); const { reporter, run } = getUpCommand(['some_other.js', 'some_file.sql'], storage); const exitCode = await run({ dry: true }); @@ -181,7 +182,7 @@ describe('up', () => { describe('failed migrations in the history are blocking', () => { it('returns 1 and finishes with an error when there are failed migrations in the history', async () => { const failedEntry = toEntry('some_failed_migration.js', 'failed'); - const storage = getStorage([failedEntry]); + const storage = getMockedStorage([failedEntry]); const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], storage); const exitCode = await run(); @@ -211,7 +212,7 @@ describe('up', () => { it('returns 1 and finishes with an error when there are failed migrations in the history in dry-run mode as well', async () => { const failedEntry = toEntry('some_failed_migration.js', 'failed'); - const storage = getStorage([failedEntry]); + const storage = getMockedStorage([failedEntry]); const { reporter, run } = getUpCommand([failedEntry.name, 'some_file.js'], storage); const exitCode = await run({ dry: true }); @@ -241,7 +242,7 @@ describe('up', () => { it('returns 0 and finishes without an error when the failed migrations in the history are not part of the current set of migrations', async () => { const failedEntry = toEntry('some_failed_migration.js', 'failed'); - const storage = getStorage([failedEntry]); + const storage = getMockedStorage([failedEntry]); const { reporter, run } = getUpCommand([], storage); const exitCode = await run(); @@ -255,7 +256,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['some_already_run_migration.js']); + const storage = getMockedStorage(['some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], storage, @@ -281,7 +282,7 @@ describe('up', () => { describe('limiting which pending migrations to run', () => { it('returns 0 and finishes without an error with the given number of pending migrations are validated and listed successfully in dry-mode', async () => { - const storage = getStorage(['some_already_run_migration.js']); + const storage = getMockedStorage(['some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['some_already_run_migration.js', 'some_migration.js', 'some_other_migration.js'], storage, @@ -300,7 +301,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -334,7 +335,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -368,7 +369,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], storage, @@ -396,7 +397,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], storage, @@ -430,7 +431,7 @@ describe('up', () => { }); it('returns 0 and finishes without an error when pending migrations after given "from" parameter are validated and listed successfully in dry-mode', async () => { - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '3_some_other_migration.js'], storage, @@ -449,7 +450,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -483,7 +484,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], storage, @@ -517,7 +518,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( ['1_some_already_run_migration.js', '2_some_migration.js', '4_some_other_migration.js'], storage, @@ -542,7 +543,7 @@ describe('up', () => { }); it('returns 0 and finishes without an error when pending migrations after given "to" parameter are validated and listed successfully in dry-mode', async () => { - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -567,7 +568,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -607,7 +608,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -651,7 +652,7 @@ describe('up', () => { const migration = mock.fn(async () => { // Success }); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -703,7 +704,7 @@ describe('up', () => { }, { times: 1 }, ); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -762,7 +763,7 @@ describe('up', () => { }, { times: 1 }, ); - const storage = getStorage(['1_some_already_run_migration.js']); + const storage = getMockedStorage(['1_some_already_run_migration.js']); const { reporter, run } = getUpCommand( [ '1_some_already_run_migration.js', @@ -812,56 +813,8 @@ describe('up', () => { }); }); -function getErrorCause(error: Error | undefined): Error | SerializedError | undefined { - if (error?.cause instanceof Error) { - return error.cause; - } - - if (typeof error?.cause === 'object' && error.cause !== null) { - return error.cause as unknown as SerializedError; - } - - return undefined; -} - -async function noop() { - // noop -} - -function getStorage(historyEntries: Array) { - const storage: Mocked = { - lock: mock.fn(async (migrations) => migrations), - unlock: mock.fn(async () => { - // void - }), - getHistory: mock.fn(async function* () { - yield* toEntries(historyEntries); - }), - remove: mock.fn(), - onSuccess: mock.fn(), - onError: mock.fn(), - end: mock.fn(), - }; - - return storage; -} - function getUpCommand(migrationFiles: string[], storage?: Mocked, plugins?: Plugin[]) { - const reporter: Mocked> = { - onFinished: mock.fn(noop), - onInit: mock.fn(noop), - onAbort: mock.fn(noop), - onCollectedMigrations: mock.fn(noop), - onLockedMigrations: mock.fn(noop), - onNewMigration: mock.fn(noop), - onMigrationRemoveStart: mock.fn(noop), - onMigrationRemoveSuccess: mock.fn(noop), - onMigrationRemoveError: mock.fn(noop), - onMigrationStart: mock.fn(noop), - onMigrationSuccess: mock.fn(noop), - onMigrationError: mock.fn(noop), - onMigrationSkip: mock.fn(noop), - }; + const reporter = getMockedReporter(); const run = async ( options?: Omit< diff --git a/packages/cli/src/commands/up.ts b/packages/cli/src/commands/up.ts index 5488f2a..e0faba4 100644 --- a/packages/cli/src/commands/up.ts +++ b/packages/cli/src/commands/up.ts @@ -1,7 +1,14 @@ import path from 'node:path'; import { getOrLoadPlugins, getOrLoadReporter, getOrLoadStorage } from '@emigrate/plugin-tools'; import { isFinishedMigration, type LoaderPlugin } from '@emigrate/types'; -import { BadOptionError, MigrationLoadError, MissingOptionError, StorageInitError, toError } from '../errors.js'; +import { + BadOptionError, + MigrationLoadError, + MissingOptionError, + StorageInitError, + toError, + toSerializedError, +} from '../errors.js'; import { type Config } from '../types.js'; import { withLeadingPeriod } from '../with-leading-period.js'; import { type GetMigrationsFunction } from '../get-migrations.js'; @@ -138,6 +145,12 @@ export default async function upCommand({ await migrationFunction(); }, + async onSuccess(migration) { + await storage.onSuccess(migration); + }, + async onError(migration, error) { + await storage.onError(migration, toSerializedError(error)); + }, }); return error ? 1 : 0; diff --git a/packages/cli/src/errors.ts b/packages/cli/src/errors.ts index 8582050..5e276bb 100644 --- a/packages/cli/src/errors.ts +++ b/packages/cli/src/errors.ts @@ -137,6 +137,16 @@ export class MigrationNotRunError extends EmigrateError { } } +export class MigrationRemovalError extends EmigrateError { + static fromMetadata(metadata: MigrationMetadata, cause?: Error) { + return new MigrationRemovalError(`Failed to remove migration: ${metadata.relativeFilePath}`, { cause }); + } + + constructor(message: string | undefined, options?: ErrorOptions) { + super(message, options, 'ERR_MIGRATION_REMOVE'); + } +} + export class StorageInitError extends EmigrateError { static fromError(error: Error) { return new StorageInitError('Could not initialize storage', { cause: error }); @@ -182,6 +192,7 @@ errorConstructors.set('MigrationHistoryError', MigrationHistoryError as unknown errorConstructors.set('MigrationLoadError', MigrationLoadError as unknown as ErrorConstructor); errorConstructors.set('MigrationRunError', MigrationRunError as unknown as ErrorConstructor); errorConstructors.set('MigrationNotRunError', MigrationNotRunError as unknown as ErrorConstructor); +errorConstructors.set('MigrationRemovalError', MigrationRemovalError as unknown as ErrorConstructor); errorConstructors.set('StorageInitError', StorageInitError as unknown as ErrorConstructor); errorConstructors.set('CommandAbortError', CommandAbortError as unknown as ErrorConstructor); errorConstructors.set('ExecutionDesertedError', ExecutionDesertedError as unknown as ErrorConstructor); diff --git a/packages/cli/src/migration-runner.ts b/packages/cli/src/migration-runner.ts index a8ee424..1aeea3f 100644 --- a/packages/cli/src/migration-runner.ts +++ b/packages/cli/src/migration-runner.ts @@ -9,28 +9,34 @@ import { type FailedMigrationMetadata, type SuccessfulMigrationMetadata, } from '@emigrate/types'; -import { toError, EmigrateError, MigrationRunError, toSerializedError, BadOptionError } from './errors.js'; +import { toError, EmigrateError, MigrationRunError, BadOptionError } from './errors.js'; import { exec } from './exec.js'; import { getDuration } from './get-duration.js'; -type MigrationRunnerParameters = { +type MigrationRunnerParameters = { dry: boolean; + lock?: boolean; limit?: number; + name?: string; from?: string; to?: string; abortSignal?: AbortSignal; abortRespite?: number; reporter: EmigrateReporter; storage: Storage; - migrations: AsyncIterable; - migrationFilter?: (migration: MigrationMetadata | MigrationMetadataFinished) => boolean; - validate: (migration: MigrationMetadata) => Promise; - execute: (migration: MigrationMetadata) => Promise; + migrations: AsyncIterable; + migrationFilter?: (migration: T) => boolean; + validate: (migration: T) => Promise; + execute: (migration: T) => Promise; + onSuccess: (migration: SuccessfulMigrationMetadata) => Promise; + onError: (migration: FailedMigrationMetadata, error: Error) => Promise; }; -export const migrationRunner = async ({ +export const migrationRunner = async ({ dry, + lock = true, limit, + name, from, to, abortSignal, @@ -40,8 +46,10 @@ export const migrationRunner = async ({ migrations, validate, execute, + onSuccess, + onError, migrationFilter = () => true, -}: MigrationRunnerParameters): Promise => { +}: MigrationRunnerParameters): Promise => { const collectedMigrations: Array = []; const validatedMigrations: Array = []; const migrationsToLock: MigrationMetadata[] = []; @@ -64,10 +72,15 @@ export const migrationRunner = async ({ { once: true }, ); + let nameFound = false; let fromFound = false; let toFound = false; for await (const migration of migrations) { + if (name && migration.relativeFilePath === name) { + nameFound = true; + } + if (from && migration.relativeFilePath === from) { fromFound = true; } @@ -129,7 +142,9 @@ export const migrationRunner = async ({ let optionError: Error | undefined; - if (from && !fromFound) { + if (name && !nameFound) { + optionError = BadOptionError.fromOption('name', `The migration: "${name}" was not found`); + } else if (from && !fromFound) { optionError = BadOptionError.fromOption('from', `The "from" migration: "${from}" was not found`); } else if (to && !toFound) { optionError = BadOptionError.fromOption('to', `The "to" migration: "${to}" was not found`); @@ -151,9 +166,10 @@ export const migrationRunner = async ({ migrationsToLock.length = 0; } - const [lockedMigrations, lockError] = dry - ? [migrationsToLock] - : await exec(async () => storage.lock(migrationsToLock), { abortSignal, abortRespite }); + const [lockedMigrations, lockError] = + dry || !lock + ? [migrationsToLock] + : await exec(async () => storage.lock(migrationsToLock), { abortSignal, abortRespite }); if (lockError) { for (const migration of migrationsToLock) { @@ -168,7 +184,7 @@ export const migrationRunner = async ({ migrationsToLock.length = 0; skip = true; - } else { + } else if (lock) { for (const migration of migrationsToLock) { const isLocked = lockedMigrations.some((lockedMigration) => lockedMigration.name === migration.name); @@ -231,7 +247,7 @@ export const migrationRunner = async ({ const start = hrtime(); - const [, migrationError] = await exec(async () => execute(migration), { abortSignal, abortRespite }); + const [, migrationError] = await exec(async () => execute(migration as T), { abortSignal, abortRespite }); const duration = getDuration(start); @@ -242,7 +258,7 @@ export const migrationRunner = async ({ duration, error: migrationError, }; - await storage.onError(finishedMigration, toSerializedError(migrationError)); + await onError(finishedMigration, migrationError); await reporter.onMigrationError?.(finishedMigration, migrationError); finishedMigrations.push(finishedMigration); skip = true; @@ -252,15 +268,14 @@ export const migrationRunner = async ({ status: 'done', duration, }; - await storage.onSuccess(finishedMigration); + await onSuccess(finishedMigration); await reporter.onMigrationSuccess?.(finishedMigration); finishedMigrations.push(finishedMigration); } } - const [, unlockError] = dry - ? [] - : await exec(async () => storage.unlock(lockedMigrations ?? []), { abortSignal, abortRespite }); + const [, unlockError] = + dry || !lock ? [] : await exec(async () => storage.unlock(lockedMigrations ?? []), { abortSignal, abortRespite }); // eslint-disable-next-line unicorn/no-array-callback-reference const firstFailed = finishedMigrations.find(isFailedMigration); diff --git a/packages/cli/src/reporters/default.ts b/packages/cli/src/reporters/default.ts index 1caeda7..c1bc4d1 100644 --- a/packages/cli/src/reporters/default.ts +++ b/packages/cli/src/reporters/default.ts @@ -13,6 +13,7 @@ import { } from '@emigrate/types'; type Status = ReturnType; +type Command = ReporterInitParameters['command']; const interactive = isInteractive(); const spinner = interactive ? elegantSpinner() : () => figures.pointerSmall; @@ -30,11 +31,16 @@ const getTitle = ({ command, version, dry, cwd }: ReporterInitParameters) => { }; const getMigrationStatus = ( + command: Command, migration: MigrationMetadata | MigrationMetadataFinished, activeMigration?: MigrationMetadata, ) => { if ('status' in migration) { - return migration.status; + return command === 'remove' && migration.status === 'done' ? 'removed' : migration.status; + } + + if (command === 'remove' && migration.name === activeMigration?.name) { + return 'removing'; } return migration.name === activeMigration?.name ? 'running' : 'pending'; @@ -42,6 +48,10 @@ const getMigrationStatus = ( const getIcon = (status: Status) => { switch (status) { + case 'removing': { + return cyan(spinner()); + } + case 'running': { return cyan(spinner()); } @@ -50,6 +60,10 @@ const getIcon = (status: Status) => { return gray(figures.pointerSmall); } + case 'removed': { + return green(figures.tick); + } + case 'done': { return green(figures.tick); } @@ -89,20 +103,19 @@ const getName = (name: string, status?: Status) => { }; const getMigrationText = ( + command: Command, migration: MigrationMetadata | MigrationMetadataFinished, activeMigration?: MigrationMetadata, ) => { const pathWithoutName = migration.relativeFilePath.slice(0, -migration.name.length); const nameWithoutExtension = migration.name.slice(0, -migration.extension.length); - const status = getMigrationStatus(migration, activeMigration); + const status = getMigrationStatus(command, migration, activeMigration); const parts = [' ', getIcon(status)]; parts.push(`${dim(pathWithoutName)}${getName(nameWithoutExtension, status)}${dim(migration.extension)}`); - if ('status' in migration) { - parts.push(gray`(${migration.status})`); - } else if (migration.name === activeMigration?.name) { - parts.push(gray`(running)`); + if ('status' in migration || migration.name === activeMigration?.name) { + parts.push(gray`(${status})`); } if ('duration' in migration && migration.duration) { @@ -319,19 +332,6 @@ class DefaultFancyReporter implements Required { this.#migrations = [migration]; } - onMigrationRemoveStart(migration: MigrationMetadata): Awaitable { - this.#migrations = [migration]; - this.#activeMigration = migration; - } - - onMigrationRemoveSuccess(migration: MigrationMetadataFinished): Awaitable { - this.#finishMigration(migration); - } - - onMigrationRemoveError(migration: MigrationMetadataFinished, _error: Error): Awaitable { - this.#finishMigration(migration); - } - onMigrationStart(migration: MigrationMetadata): void | PromiseLike { this.#activeMigration = migration; } @@ -376,7 +376,9 @@ class DefaultFancyReporter implements Required { const parts = [ getTitle(this.#parameters), getHeaderMessage(this.#parameters.command, this.#migrations, this.#lockedMigrations), - this.#migrations?.map((migration) => getMigrationText(migration, this.#activeMigration)).join('\n') ?? '', + this.#migrations + ?.map((migration) => getMigrationText(this.#parameters.command, migration, this.#activeMigration)) + .join('\n') ?? '', getAbortMessage(this.#abortReason), getSummary(this.#parameters.command, this.#migrations), getError(this.#error), @@ -441,35 +443,23 @@ class DefaultReporter implements Required { } onNewMigration(migration: MigrationMetadata, _content: string): Awaitable { - console.log(getMigrationText(migration)); - } - - onMigrationRemoveStart(migration: MigrationMetadata): Awaitable { - console.log(getMigrationText(migration)); - } - - onMigrationRemoveSuccess(migration: MigrationMetadataFinished): Awaitable { - console.log(getMigrationText(migration)); - } - - onMigrationRemoveError(migration: MigrationMetadataFinished, _error: Error): Awaitable { - console.error(getMigrationText(migration)); + console.log(getMigrationText(this.#parameters.command, migration)); } onMigrationStart(migration: MigrationMetadata): void | PromiseLike { - console.log(getMigrationText(migration, migration)); + console.log(getMigrationText(this.#parameters.command, migration, migration)); } onMigrationSuccess(migration: MigrationMetadataFinished): void | PromiseLike { - console.log(getMigrationText(migration)); + console.log(getMigrationText(this.#parameters.command, migration)); } onMigrationError(migration: MigrationMetadataFinished, _error: Error): void | PromiseLike { - console.error(getMigrationText(migration)); + console.error(getMigrationText(this.#parameters.command, migration)); } onMigrationSkip(migration: MigrationMetadataFinished): void | PromiseLike { - console.log(getMigrationText(migration)); + console.log(getMigrationText(this.#parameters.command, migration)); } onFinished(migrations: MigrationMetadataFinished[], error?: Error | undefined): void | PromiseLike { diff --git a/packages/cli/src/test-utils.ts b/packages/cli/src/test-utils.ts index 2e1b7cc..b6228d2 100644 --- a/packages/cli/src/test-utils.ts +++ b/packages/cli/src/test-utils.ts @@ -1,11 +1,69 @@ +import { mock, type Mock } from 'node:test'; import path from 'node:path'; import { + type SerializedError, + type EmigrateReporter, type FailedMigrationHistoryEntry, type MigrationHistoryEntry, type MigrationMetadata, type NonFailedMigrationHistoryEntry, + type Storage, } from '@emigrate/types'; +export type Mocked = { + // @ts-expect-error - This is a mock + [K in keyof T]: Mock; +}; + +export async function noop() { + // noop +} + +export function getErrorCause(error: Error | undefined): Error | SerializedError | undefined { + if (error?.cause instanceof Error) { + return error.cause; + } + + if (typeof error?.cause === 'object' && error.cause !== null) { + return error.cause as unknown as SerializedError; + } + + return undefined; +} + +export function getMockedStorage(historyEntries: Array) { + const storage: Mocked = { + lock: mock.fn(async (migrations) => migrations), + unlock: mock.fn(async () => { + // void + }), + getHistory: mock.fn(async function* () { + yield* toEntries(historyEntries); + }), + remove: mock.fn(), + onSuccess: mock.fn(), + onError: mock.fn(), + end: mock.fn(), + }; + + return storage; +} + +export function getMockedReporter(): Mocked> { + return { + onFinished: mock.fn(noop), + onInit: mock.fn(noop), + onAbort: mock.fn(noop), + onCollectedMigrations: mock.fn(noop), + onLockedMigrations: mock.fn(noop), + onNewMigration: mock.fn(noop), + onMigrationStart: mock.fn(noop), + onMigrationSuccess: mock.fn(noop), + onMigrationError: mock.fn(noop), + onMigrationSkip: mock.fn(noop), + }; +} + export function toMigration(cwd: string, directory: string, name: string): MigrationMetadata { return { name, From 2f6b4d23e0b3b2efd9ea343cb2347775850ff72e Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 26 Jan 2024 15:11:43 +0100 Subject: [PATCH 084/136] fix(reporter-default): don't dim decimal points in durations in the default reporter --- .changeset/purple-eagles-speak.md | 5 +++++ packages/cli/src/reporters/default.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/purple-eagles-speak.md diff --git a/.changeset/purple-eagles-speak.md b/.changeset/purple-eagles-speak.md new file mode 100644 index 0000000..9d1a6f7 --- /dev/null +++ b/.changeset/purple-eagles-speak.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Don't dim decimal points in durations in the default reporter diff --git a/packages/cli/src/reporters/default.ts b/packages/cli/src/reporters/default.ts index c1bc4d1..aba377f 100644 --- a/packages/cli/src/reporters/default.ts +++ b/packages/cli/src/reporters/default.ts @@ -21,7 +21,7 @@ const spinner = interactive ? elegantSpinner() : () => figures.pointerSmall; const formatDuration = (duration: number): string => { const pretty = prettyMs(duration); - return yellow(pretty.replaceAll(/([^\s\d]+)/g, dim('$1'))); + return yellow(pretty.replaceAll(/([^\s\d.]+)/g, dim('$1'))); }; const getTitle = ({ command, version, dry, cwd }: ReporterInitParameters) => { From 0faebbe647782cd60ab189bb16eb095bf9ecd111 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 26 Jan 2024 15:21:44 +0100 Subject: [PATCH 085/136] docs(cli): document the relative file path support for the "remove" command --- .changeset/odd-foxes-mix.md | 5 +++++ docs/src/content/docs/commands/remove.mdx | 16 +++++++++------- packages/cli/README.md | 18 ++++++++++++++++++ packages/cli/src/cli.ts | 5 +++-- 4 files changed, 35 insertions(+), 9 deletions(-) create mode 100644 .changeset/odd-foxes-mix.md diff --git a/.changeset/odd-foxes-mix.md b/.changeset/odd-foxes-mix.md new file mode 100644 index 0000000..feb3220 --- /dev/null +++ b/.changeset/odd-foxes-mix.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Add support for passing the relative path to a migration file to remove from the history using the "remove" command diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index 421b7de..fde9919 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -13,22 +13,22 @@ The `remove` command is used to remove a migration from the history. This is use ```bash - npx emigrate remove [options] + npx emigrate remove [options] ``` ```bash - pnpm emigrate remove [options] + pnpm emigrate remove [options] ``` ```bash - yarn emigrate remove [options] + yarn emigrate remove [options] ``` ```bash - bunx --bun emigrate remove [options] + bunx --bun emigrate remove [options] ``` @@ -44,16 +44,18 @@ The `remove` command is used to remove a migration from the history. This is use ``` ```bash - deno task emigrate remove [options] + deno task emigrate remove [options] ``` ## Arguments -### `` +### `` -The name of the migration file to remove, including the extension, e.g. `20200101000000_some_migration.js`. +The name of the migration file to remove, including the extension, e.g. `20200101000000_some_migration.js`, or a relative file path to a migration file to remove, e.g: `migrations/20200101000000_some_migration.js`. + +Using relative file paths is useful in terminals that support autocomplete, and also when you copy and use the relative migration file path from the output of the `list` command. ## Options diff --git a/packages/cli/README.md b/packages/cli/README.md index 0769765..e1cf709 100644 --- a/packages/cli/README.md +++ b/packages/cli/README.md @@ -20,6 +20,24 @@ bun add @emigrate/cli ## Usage +```text +Usage: emigrate / + +Options: + + -h, --help Show this help message and exit + -v, --version Print version number and exit + +Commands: + + up Run all pending migrations (or do a dry run) + new Create a new migration file + list List all migrations and their status + remove Remove entries from the migration history +``` + +### `emigrate up` + ```text Usage: emigrate up [options] diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index bd74870..c4c031e 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -440,14 +440,14 @@ const remove: Action = async (args) => { allowPositionals: true, }); - const usage = `Usage: emigrate remove [options] + const usage = `Usage: emigrate remove [options] Remove entries from the migration history. This is useful if you want to retry a migration that has failed. Arguments: - name The name of the migration file to remove from the history (required) + name/path The name of or relative path to the migration file to remove from the history (required) Options: @@ -466,6 +466,7 @@ Examples: emigrate remove -d migrations -s fs 20231122120529381_some_migration_file.js emigrate remove --directory ./migrations --storage postgres 20231122120529381_some_migration_file.sql emigrate remove -i dotenv/config -d ./migrations -s postgres 20231122120529381_some_migration_file.sql + emigrate remove -i dotenv/config -d ./migrations -s postgres migrations/20231122120529381_some_migration_file.sql `; if (values.help) { From 69bd88afdbbfd73c9ebd7fb60af076175c0eadae Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 26 Jan 2024 15:32:58 +0100 Subject: [PATCH 086/136] chore: allow many parameters in test files --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index e195014..3a58112 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,8 @@ { "files": "packages/**/*.test.ts", "rules": { - "@typescript-eslint/no-floating-promises": 0 + "@typescript-eslint/no-floating-promises": 0, + "max-params": 0 } } ] From ef45be9233c47ac9e0259bac03345bc43ddfd1d5 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 5 Feb 2024 14:12:39 +0100 Subject: [PATCH 087/136] fix(reporters): show number of skipped migrations correctly in command output --- .changeset/thick-days-look.md | 6 ++++ packages/cli/src/migration-runner.ts | 5 +--- packages/cli/src/reporters/default.ts | 4 --- packages/reporter-pino/src/index.ts | 41 +++++++++++++++++---------- 4 files changed, 33 insertions(+), 23 deletions(-) create mode 100644 .changeset/thick-days-look.md diff --git a/.changeset/thick-days-look.md b/.changeset/thick-days-look.md new file mode 100644 index 0000000..4cea0e8 --- /dev/null +++ b/.changeset/thick-days-look.md @@ -0,0 +1,6 @@ +--- +'@emigrate/reporter-pino': patch +'@emigrate/cli': patch +--- + +Show number of skipped migrations correctly in the command output diff --git a/packages/cli/src/migration-runner.ts b/packages/cli/src/migration-runner.ts index 1aeea3f..645bea2 100644 --- a/packages/cli/src/migration-runner.ts +++ b/packages/cli/src/migration-runner.ts @@ -50,7 +50,6 @@ export const migrationRunner = async true, }: MigrationRunnerParameters): Promise => { - const collectedMigrations: Array = []; const validatedMigrations: Array = []; const migrationsToLock: MigrationMetadata[] = []; @@ -93,8 +92,6 @@ export const migrationRunner = async lockedMigration.name === migration.name); @@ -284,8 +283,6 @@ const getHeaderMessage = ( failedCount += 1; } else if (migration.status === 'skipped') { skippedCount += 1; - } else { - unlockableCount += 1; } } } @@ -293,7 +290,6 @@ const getHeaderMessage = ( const parts = [ bold(`${lockedMigrations.length} of ${migrations.length}`), dim(statusText), - unlockableCount > 0 ? yellow(`(${unlockableCount} locked)`) : '', skippedCount > 0 ? yellowBright(`(${skippedCount} skipped)`) : '', failedCount > 0 ? redBright(`(${failedCount} failed)`) : '', ].filter(Boolean); diff --git a/packages/reporter-pino/src/index.ts b/packages/reporter-pino/src/index.ts index a6c519c..1e2a141 100644 --- a/packages/reporter-pino/src/index.ts +++ b/packages/reporter-pino/src/index.ts @@ -69,29 +69,40 @@ class PinoReporter implements Required { const migrations = this.#migrations ?? []; if (migrations.length === 0) { - this.#logger.info('No pending migrations found'); + this.#logger.info('No migrations found'); return; } + const statusText = this.#command === 'list' ? 'migrations are pending' : 'pending migrations to run'; + if (migrations.length === lockedMigrations.length) { - this.#logger.info( - { migrationCount: lockedMigrations.length }, - `${lockedMigrations.length} pending migrations to run`, - ); + this.#logger.info({ migrationCount: lockedMigrations.length }, `${lockedMigrations.length} ${statusText}`); return; } - const nonLockedMigrations = migrations.filter( - (migration) => !lockedMigrations.some((lockedMigration) => lockedMigration.name === migration.name), - ); - const failedMigrations = nonLockedMigrations.filter( - (migration) => 'status' in migration && migration.status === 'failed', - ); - const unlockableCount = this.#command === 'up' ? nonLockedMigrations.length - failedMigrations.length : 0; + let skippedCount = 0; + let failedCount = 0; + + for (const migration of migrations) { + const isLocked = lockedMigrations.some((lockedMigration) => lockedMigration.name === migration.name); + + if (isLocked) { + continue; + } + + if ('status' in migration) { + if (migration.status === 'failed') { + failedCount += 1; + } else if (migration.status === 'skipped') { + skippedCount += 1; + } + } + } + const parts = [ - `${lockedMigrations.length} of ${migrations.length} pending migrations to run`, - unlockableCount > 0 ? `(${unlockableCount} locked)` : '', - failedMigrations.length > 0 ? `(${failedMigrations.length} failed)` : '', + `${lockedMigrations.length} of ${migrations.length} ${statusText}`, + skippedCount > 0 ? `(${skippedCount} skipped)` : '', + failedCount > 0 ? `(${failedCount} failed)` : '', ].filter(Boolean); this.#logger.info({ migrationCount: lockedMigrations.length }, parts.join(' ')); From f6761fe434feaa1e43a79a14c4c3b9a325c899a3 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 5 Feb 2024 14:17:14 +0100 Subject: [PATCH 088/136] chore: add missing docs changeset --- .changeset/rude-eels-tap.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/rude-eels-tap.md diff --git a/.changeset/rude-eels-tap.md b/.changeset/rude-eels-tap.md new file mode 100644 index 0000000..880aecd --- /dev/null +++ b/.changeset/rude-eels-tap.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': minor +--- + +Document the changes to the "remove" command, specifically that it also accepts relative file paths now From f8a5cc728d91432108de7fec180e112cdbb8a84b Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 5 Feb 2024 14:41:03 +0100 Subject: [PATCH 089/136] fix(storage): make sure the storage initialization crashes when db connection can't be established --- .changeset/tasty-bulldogs-guess.md | 6 ++++++ packages/mysql/src/index.ts | 2 ++ packages/postgres/src/index.ts | 14 +++++++------- 3 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 .changeset/tasty-bulldogs-guess.md diff --git a/.changeset/tasty-bulldogs-guess.md b/.changeset/tasty-bulldogs-guess.md new file mode 100644 index 0000000..eb34947 --- /dev/null +++ b/.changeset/tasty-bulldogs-guess.md @@ -0,0 +1,6 @@ +--- +'@emigrate/postgres': patch +'@emigrate/mysql': patch +--- + +Make sure the storage initialization crashes when a database connection can't be established diff --git a/packages/mysql/src/index.ts b/packages/mysql/src/index.ts index 46a1f55..de253c9 100644 --- a/packages/mysql/src/index.ts +++ b/packages/mysql/src/index.ts @@ -171,6 +171,8 @@ export const createMysqlStorage = ({ table = defaultTable, connection }: MysqlSt async initializeStorage() { const pool = getPool(connection); + await pool.query('SELECT 1'); + try { await initializeTable(pool, table); } catch (error) { diff --git a/packages/postgres/src/index.ts b/packages/postgres/src/index.ts index bcbe9e1..b6e3e4c 100644 --- a/packages/postgres/src/index.ts +++ b/packages/postgres/src/index.ts @@ -32,12 +32,12 @@ export type PostgresLoaderOptions = { connection: ConnectionOptions | string; }; -const getPool = (connection: ConnectionOptions | string) => { - if (typeof connection === 'string') { - return postgres(connection); - } +const getPool = async (connection: ConnectionOptions | string): Promise => { + const sql = typeof connection === 'string' ? postgres(connection) : postgres(connection); - return postgres(connection); + await sql`SELECT 1`; + + return sql; }; const lockMigration = async (sql: Sql, table: string, migration: MigrationMetadata) => { @@ -122,7 +122,7 @@ export const createPostgresStorage = ({ }: PostgresStorageOptions): EmigrateStorage => { return { async initializeStorage() { - const sql = getPool(connection); + const sql = await getPool(connection); try { await initializeTable(sql, table); @@ -211,7 +211,7 @@ export const createPostgresLoader = ({ connection }: PostgresLoaderOptions): Loa loadableExtensions: ['.sql'], async loadMigration(migration) { return async () => { - const sql = getPool(connection); + const sql = await getPool(connection); try { // @ts-expect-error The "simple" option is not documented, but it exists From ff89dd4f86ed1e56f215b58d4d2f41f3fa075ac5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 5 Feb 2024 13:50:43 +0000 Subject: [PATCH 090/136] chore(release): version packages --- .changeset/cuddly-peaches-look.md | 5 ----- .changeset/eleven-files-love.md | 5 ----- .changeset/odd-foxes-mix.md | 5 ----- .changeset/plenty-insects-accept.md | 5 ----- .changeset/purple-eagles-speak.md | 5 ----- .changeset/rude-eels-tap.md | 5 ----- .changeset/sharp-cows-joke.md | 5 ----- .changeset/tame-apples-lick.md | 5 ----- .changeset/tasty-bulldogs-guess.md | 6 ------ .changeset/thick-days-look.md | 6 ------ .changeset/thin-pillows-obey.md | 5 ----- .changeset/tricky-turkeys-refuse.md | 5 ----- .changeset/twelve-hairs-relate.md | 5 ----- docs/CHANGELOG.md | 7 +++++++ docs/package.json | 2 +- packages/cli/CHANGELOG.md | 19 +++++++++++++++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 9 +++++++++ packages/mysql/package.json | 2 +- packages/plugin-generate-js/CHANGELOG.md | 8 ++++++++ packages/plugin-generate-js/package.json | 2 +- packages/plugin-tools/CHANGELOG.md | 7 +++++++ packages/plugin-tools/package.json | 2 +- packages/postgres/CHANGELOG.md | 9 +++++++++ packages/postgres/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 12 ++++++++++++ packages/reporter-pino/package.json | 2 +- packages/storage-fs/CHANGELOG.md | 7 +++++++ packages/storage-fs/package.json | 2 +- packages/types/CHANGELOG.md | 6 ++++++ packages/types/package.json | 2 +- 31 files changed, 93 insertions(+), 76 deletions(-) delete mode 100644 .changeset/cuddly-peaches-look.md delete mode 100644 .changeset/eleven-files-love.md delete mode 100644 .changeset/odd-foxes-mix.md delete mode 100644 .changeset/plenty-insects-accept.md delete mode 100644 .changeset/purple-eagles-speak.md delete mode 100644 .changeset/rude-eels-tap.md delete mode 100644 .changeset/sharp-cows-joke.md delete mode 100644 .changeset/tame-apples-lick.md delete mode 100644 .changeset/tasty-bulldogs-guess.md delete mode 100644 .changeset/thick-days-look.md delete mode 100644 .changeset/thin-pillows-obey.md delete mode 100644 .changeset/tricky-turkeys-refuse.md delete mode 100644 .changeset/twelve-hairs-relate.md diff --git a/.changeset/cuddly-peaches-look.md b/.changeset/cuddly-peaches-look.md deleted file mode 100644 index 26aa479..0000000 --- a/.changeset/cuddly-peaches-look.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Only include files when collecting migrations, i.e. it should be possible to have folders inside your migrations folder. diff --git a/.changeset/eleven-files-love.md b/.changeset/eleven-files-love.md deleted file mode 100644 index c4fbcd7..0000000 --- a/.changeset/eleven-files-love.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/types': minor ---- - -Remove the "remove" command specific reporter methods. So instead of using `onMigrationRemoveStart`, `onMigrationRemoveSuccess` and `onMigrationRemoveError` the `onMigrationStart`, `onMigrationSuccess` and `onMigrationError` methods should be used and the reporter can still format the output differently depending on the current command (which it receives in the `onInit` method). This is a BREAKING CHANGE. diff --git a/.changeset/odd-foxes-mix.md b/.changeset/odd-foxes-mix.md deleted file mode 100644 index feb3220..0000000 --- a/.changeset/odd-foxes-mix.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Add support for passing the relative path to a migration file to remove from the history using the "remove" command diff --git a/.changeset/plenty-insects-accept.md b/.changeset/plenty-insects-accept.md deleted file mode 100644 index c28ddad..0000000 --- a/.changeset/plenty-insects-accept.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -When the `--from` or `--to` CLI options are used the given migration name (or path to migration file) must exist. This is a BREAKING CHANGE from before. The reasoning is that by forcing the migrations to exist you avoid accidentally running migrations you don't intend to, because a simple typo could have the effect that many unwanted migrations is executed so it's better to show an error if that's the case. diff --git a/.changeset/purple-eagles-speak.md b/.changeset/purple-eagles-speak.md deleted file mode 100644 index 9d1a6f7..0000000 --- a/.changeset/purple-eagles-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Don't dim decimal points in durations in the default reporter diff --git a/.changeset/rude-eels-tap.md b/.changeset/rude-eels-tap.md deleted file mode 100644 index 880aecd..0000000 --- a/.changeset/rude-eels-tap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': minor ---- - -Document the changes to the "remove" command, specifically that it also accepts relative file paths now diff --git a/.changeset/sharp-cows-joke.md b/.changeset/sharp-cows-joke.md deleted file mode 100644 index db9d413..0000000 --- a/.changeset/sharp-cows-joke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Set Emigrate error instance names from their respective constructor's name for consistency and correct error deserialization. diff --git a/.changeset/tame-apples-lick.md b/.changeset/tame-apples-lick.md deleted file mode 100644 index ef6ad0a..0000000 --- a/.changeset/tame-apples-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/reporter-pino': minor ---- - -Adapt to the new Reporter interface, i.e. the removal of the "remove" command related methods diff --git a/.changeset/tasty-bulldogs-guess.md b/.changeset/tasty-bulldogs-guess.md deleted file mode 100644 index eb34947..0000000 --- a/.changeset/tasty-bulldogs-guess.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@emigrate/postgres': patch -'@emigrate/mysql': patch ---- - -Make sure the storage initialization crashes when a database connection can't be established diff --git a/.changeset/thick-days-look.md b/.changeset/thick-days-look.md deleted file mode 100644 index 4cea0e8..0000000 --- a/.changeset/thick-days-look.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@emigrate/reporter-pino': patch -'@emigrate/cli': patch ---- - -Show number of skipped migrations correctly in the command output diff --git a/.changeset/thin-pillows-obey.md b/.changeset/thin-pillows-obey.md deleted file mode 100644 index 2f94c63..0000000 --- a/.changeset/thin-pillows-obey.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Completely rework how the "remove" command is run, this is to make it more similar to the "up" and "list" command as now it will also use the `onMigrationStart`, `onMigrationSuccess` and `onMigrationError` reporter methods when reporting the command progress. It's also in preparation for adding `--from` and `--to` CLI options for the "remove" command, similar to how the same options work for the "up" command. diff --git a/.changeset/tricky-turkeys-refuse.md b/.changeset/tricky-turkeys-refuse.md deleted file mode 100644 index 9e57a25..0000000 --- a/.changeset/tricky-turkeys-refuse.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': minor ---- - -Document the changes to the "up" command's `--from` and `--to` options, specifically that they can take relative file paths and that the given migration must exist. diff --git a/.changeset/twelve-hairs-relate.md b/.changeset/twelve-hairs-relate.md deleted file mode 100644 index 46e52ba..0000000 --- a/.changeset/twelve-hairs-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Add support for passing relative paths to migration files as the `--from` and `--to` CLI options. This is very useful from terminals that support autocomplete for file paths. It also makes it possible to copy the path to a migration file from Emigrate's output and use that as either `--from` and `--to` directly. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index aa71ff8..25808b5 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/docs +## 0.3.0 + +### Minor Changes + +- f6761fe: Document the changes to the "remove" command, specifically that it also accepts relative file paths now +- 9109238: Document the changes to the "up" command's `--from` and `--to` options, specifically that they can take relative file paths and that the given migration must exist. + ## 0.2.0 ### Minor Changes diff --git a/docs/package.json b/docs/package.json index c70d3a0..8cde013 100644 --- a/docs/package.json +++ b/docs/package.json @@ -2,7 +2,7 @@ "name": "@emigrate/docs", "private": true, "type": "module", - "version": "0.2.0", + "version": "0.3.0", "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index ea9622a..3805a52 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,24 @@ # @emigrate/cli +## 0.17.0 + +### Minor Changes + +- 0faebbe: Add support for passing the relative path to a migration file to remove from the history using the "remove" command +- 9109238: When the `--from` or `--to` CLI options are used the given migration name (or path to migration file) must exist. This is a BREAKING CHANGE from before. The reasoning is that by forcing the migrations to exist you avoid accidentally running migrations you don't intend to, because a simple typo could have the effect that many unwanted migrations is executed so it's better to show an error if that's the case. +- 1f139fd: Completely rework how the "remove" command is run, this is to make it more similar to the "up" and "list" command as now it will also use the `onMigrationStart`, `onMigrationSuccess` and `onMigrationError` reporter methods when reporting the command progress. It's also in preparation for adding `--from` and `--to` CLI options for the "remove" command, similar to how the same options work for the "up" command. +- 9109238: Add support for passing relative paths to migration files as the `--from` and `--to` CLI options. This is very useful from terminals that support autocomplete for file paths. It also makes it possible to copy the path to a migration file from Emigrate's output and use that as either `--from` and `--to` directly. + +### Patch Changes + +- f1b9098: Only include files when collecting migrations, i.e. it should be possible to have folders inside your migrations folder. +- 2f6b4d2: Don't dim decimal points in durations in the default reporter +- f2d4bb3: Set Emigrate error instance names from their respective constructor's name for consistency and correct error deserialization. +- ef45be9: Show number of skipped migrations correctly in the command output +- Updated dependencies [94ad9fe] + - @emigrate/types@0.12.0 + - @emigrate/plugin-tools@0.9.5 + ## 0.16.2 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index dbc092e..0d38d82 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.16.2", + "version": "0.17.0", "publishConfig": { "access": "public" }, diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index 3231cc3..6683fd2 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,14 @@ # @emigrate/mysql +## 0.2.5 + +### Patch Changes + +- f8a5cc7: Make sure the storage initialization crashes when a database connection can't be established +- Updated dependencies [94ad9fe] + - @emigrate/types@0.12.0 + - @emigrate/plugin-tools@0.9.5 + ## 0.2.4 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 6f7e1f4..8065ec2 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.2.4", + "version": "0.2.5", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-generate-js/CHANGELOG.md b/packages/plugin-generate-js/CHANGELOG.md index 12f2bed..5763e69 100644 --- a/packages/plugin-generate-js/CHANGELOG.md +++ b/packages/plugin-generate-js/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-generate-js +## 0.3.5 + +### Patch Changes + +- Updated dependencies [94ad9fe] + - @emigrate/types@0.12.0 + - @emigrate/plugin-tools@0.9.5 + ## 0.3.4 ### Patch Changes diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index 472c930..353c65d 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-generate-js", - "version": "0.3.4", + "version": "0.3.5", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-tools/CHANGELOG.md b/packages/plugin-tools/CHANGELOG.md index 17a97f6..f4d7120 100644 --- a/packages/plugin-tools/CHANGELOG.md +++ b/packages/plugin-tools/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/plugin-tools +## 0.9.5 + +### Patch Changes + +- Updated dependencies [94ad9fe] + - @emigrate/types@0.12.0 + ## 0.9.4 ### Patch Changes diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index b1098ad..9fcb5c2 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-tools", - "version": "0.9.4", + "version": "0.9.5", "publishConfig": { "access": "public" }, diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index a2955b8..16a4e5d 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,14 @@ # @emigrate/postgres +## 0.2.5 + +### Patch Changes + +- f8a5cc7: Make sure the storage initialization crashes when a database connection can't be established +- Updated dependencies [94ad9fe] + - @emigrate/types@0.12.0 + - @emigrate/plugin-tools@0.9.5 + ## 0.2.4 ### Patch Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 9cfd051..8e0f028 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.2.4", + "version": "0.2.5", "publishConfig": { "access": "public" }, diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index 4d18577..cdd9baa 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,17 @@ # @emigrate/reporter-pino +## 0.6.0 + +### Minor Changes + +- 86e0d52: Adapt to the new Reporter interface, i.e. the removal of the "remove" command related methods + +### Patch Changes + +- ef45be9: Show number of skipped migrations correctly in the command output +- Updated dependencies [94ad9fe] + - @emigrate/types@0.12.0 + ## 0.5.0 ### Minor Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 71cefec..0e5d88a 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.5.0", + "version": "0.6.0", "publishConfig": { "access": "public" }, diff --git a/packages/storage-fs/CHANGELOG.md b/packages/storage-fs/CHANGELOG.md index f3548d4..d10b390 100644 --- a/packages/storage-fs/CHANGELOG.md +++ b/packages/storage-fs/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/storage-fs +## 0.4.5 + +### Patch Changes + +- Updated dependencies [94ad9fe] + - @emigrate/types@0.12.0 + ## 0.4.4 ### Patch Changes diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index d763f26..964d713 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/storage-fs", - "version": "0.4.4", + "version": "0.4.5", "publishConfig": { "access": "public" }, diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 78f9264..cb9b699 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/types +## 0.12.0 + +### Minor Changes + +- 94ad9fe: Remove the "remove" command specific reporter methods. So instead of using `onMigrationRemoveStart`, `onMigrationRemoveSuccess` and `onMigrationRemoveError` the `onMigrationStart`, `onMigrationSuccess` and `onMigrationError` methods should be used and the reporter can still format the output differently depending on the current command (which it receives in the `onInit` method). This is a BREAKING CHANGE. + ## 0.11.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index 116b525..a73d7e5 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/types", - "version": "0.11.0", + "version": "0.12.0", "publishConfig": { "access": "public" }, From db656c2310db49bb088410a3b03e27a418754327 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 5 Feb 2024 15:05:32 +0100 Subject: [PATCH 091/136] chore: enable NPM provenance --- .changeset/wicked-experts-greet.md | 12 ++++++++++++ .github/workflows/release.yaml | 1 + packages/cli/package.json | 3 ++- packages/mysql/package.json | 3 ++- packages/plugin-tools/package.json | 3 ++- packages/postgres/package.json | 3 ++- packages/reporter-pino/package.json | 3 ++- packages/storage-fs/package.json | 3 ++- packages/tsconfig/package.json | 3 ++- packages/types/package.json | 3 ++- 10 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 .changeset/wicked-experts-greet.md diff --git a/.changeset/wicked-experts-greet.md b/.changeset/wicked-experts-greet.md new file mode 100644 index 0000000..a04b226 --- /dev/null +++ b/.changeset/wicked-experts-greet.md @@ -0,0 +1,12 @@ +--- +'@emigrate/reporter-pino': patch +'@emigrate/plugin-tools': patch +'@emigrate/storage-fs': patch +'@emigrate/postgres': patch +'@emigrate/tsconfig': patch +'@emigrate/mysql': patch +'@emigrate/types': patch +'@emigrate/cli': patch +--- + +Enable NPM provenance diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index b984a29..a06c061 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -16,6 +16,7 @@ jobs: packages: write pull-requests: write actions: read + id-token: write steps: - name: Checkout Repo uses: actions/checkout@v4 diff --git a/packages/cli/package.json b/packages/cli/package.json index 0d38d82..95d1ff1 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -2,7 +2,8 @@ "name": "@emigrate/cli", "version": "0.17.0", "publishConfig": { - "access": "public" + "access": "public", + "provenance": true }, "description": "", "type": "module", diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 8065ec2..64c5f32 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -2,7 +2,8 @@ "name": "@emigrate/mysql", "version": "0.2.5", "publishConfig": { - "access": "public" + "access": "public", + "provenance": true }, "description": "A MySQL plugin for Emigrate. Uses a MySQL database for storing migration history. Can load and generate .sql migration files.", "main": "dist/index.js", diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index 9fcb5c2..c3b90a9 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -2,7 +2,8 @@ "name": "@emigrate/plugin-tools", "version": "0.9.5", "publishConfig": { - "access": "public" + "access": "public", + "provenance": true }, "description": "", "main": "dist/index.js", diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 8e0f028..ad77bce 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -2,7 +2,8 @@ "name": "@emigrate/postgres", "version": "0.2.5", "publishConfig": { - "access": "public" + "access": "public", + "provenance": true }, "description": "A PostgreSQL plugin for Emigrate. Uses a PostgreSQL database for storing migration history. Can load and generate .sql migration files.", "main": "dist/index.js", diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 0e5d88a..7787828 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -2,7 +2,8 @@ "name": "@emigrate/reporter-pino", "version": "0.6.0", "publishConfig": { - "access": "public" + "access": "public", + "provenance": true }, "description": "A Pino reporter for Emigrate for logging the migration process.", "main": "dist/index.js", diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index 964d713..88683f0 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -2,7 +2,8 @@ "name": "@emigrate/storage-fs", "version": "0.4.5", "publishConfig": { - "access": "public" + "access": "public", + "provenance": true }, "description": "A storage plugin for Emigrate for storing the migration history in a file", "main": "dist/index.js", diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index 0a21b5e..4baf381 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -2,7 +2,8 @@ "name": "@emigrate/tsconfig", "version": "1.0.1", "publishConfig": { - "access": "public" + "access": "public", + "provenance": true }, "files": [ "base.json", diff --git a/packages/types/package.json b/packages/types/package.json index a73d7e5..3d42554 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -2,7 +2,8 @@ "name": "@emigrate/types", "version": "0.12.0", "publishConfig": { - "access": "public" + "access": "public", + "provenance": true }, "description": "Common Emigrate TypeScript types to ease plugin development.", "main": "dist/index.js", From 543b7f6f77c1a7326642324d369d671e16893074 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 5 Feb 2024 15:09:29 +0100 Subject: [PATCH 092/136] fix(bun): import setTimeout/setInterval from "node:timers" for .unref() to correctly work --- .changeset/late-suits-destroy.md | 5 +++++ packages/cli/src/cli.ts | 1 + packages/cli/src/exec.ts | 1 + packages/cli/src/reporters/default.ts | 1 + 4 files changed, 8 insertions(+) create mode 100644 .changeset/late-suits-destroy.md diff --git a/.changeset/late-suits-destroy.md b/.changeset/late-suits-destroy.md new file mode 100644 index 0000000..68dabbf --- /dev/null +++ b/.changeset/late-suits-destroy.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Use setTimeout/setInterval from "node:timers" so that .unref() correctly works with Bun diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index c4c031e..daf7976 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -1,6 +1,7 @@ #!/usr/bin/env node import process from 'node:process'; import { parseArgs } from 'node:util'; +import { setTimeout } from 'node:timers'; import importFromEsm from 'import-from-esm'; import { CommandAbortError, ShowUsageError } from './errors.js'; import { getConfig } from './get-config.js'; diff --git a/packages/cli/src/exec.ts b/packages/cli/src/exec.ts index 3f39d1a..887f737 100644 --- a/packages/cli/src/exec.ts +++ b/packages/cli/src/exec.ts @@ -1,3 +1,4 @@ +import { setTimeout } from 'node:timers'; import prettyMs from 'pretty-ms'; import { ExecutionDesertedError, toError } from './errors.js'; import { DEFAULT_RESPITE_SECONDS } from './defaults.js'; diff --git a/packages/cli/src/reporters/default.ts b/packages/cli/src/reporters/default.ts index a522a0a..1db53a3 100644 --- a/packages/cli/src/reporters/default.ts +++ b/packages/cli/src/reporters/default.ts @@ -1,3 +1,4 @@ +import { setInterval } from 'node:timers'; import { black, blueBright, bold, cyan, dim, faint, gray, green, red, redBright, yellow, yellowBright } from 'ansis'; import logUpdate from 'log-update'; import elegantSpinner from 'elegant-spinner'; From f720aae83d6b4a185f807e59a98e4b89482b021a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 5 Feb 2024 14:12:56 +0000 Subject: [PATCH 093/136] chore(release): version packages --- .changeset/late-suits-destroy.md | 5 ----- .changeset/wicked-experts-greet.md | 12 ------------ packages/cli/CHANGELOG.md | 10 ++++++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 9 +++++++++ packages/mysql/package.json | 2 +- packages/plugin-generate-js/CHANGELOG.md | 8 ++++++++ packages/plugin-generate-js/package.json | 2 +- packages/plugin-tools/CHANGELOG.md | 8 ++++++++ packages/plugin-tools/package.json | 2 +- packages/postgres/CHANGELOG.md | 9 +++++++++ packages/postgres/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 8 ++++++++ packages/reporter-pino/package.json | 2 +- packages/storage-fs/CHANGELOG.md | 8 ++++++++ packages/storage-fs/package.json | 2 +- packages/tsconfig/CHANGELOG.md | 6 ++++++ packages/tsconfig/package.json | 2 +- packages/types/CHANGELOG.md | 6 ++++++ packages/types/package.json | 2 +- 20 files changed, 81 insertions(+), 26 deletions(-) delete mode 100644 .changeset/late-suits-destroy.md delete mode 100644 .changeset/wicked-experts-greet.md diff --git a/.changeset/late-suits-destroy.md b/.changeset/late-suits-destroy.md deleted file mode 100644 index 68dabbf..0000000 --- a/.changeset/late-suits-destroy.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Use setTimeout/setInterval from "node:timers" so that .unref() correctly works with Bun diff --git a/.changeset/wicked-experts-greet.md b/.changeset/wicked-experts-greet.md deleted file mode 100644 index a04b226..0000000 --- a/.changeset/wicked-experts-greet.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -'@emigrate/reporter-pino': patch -'@emigrate/plugin-tools': patch -'@emigrate/storage-fs': patch -'@emigrate/postgres': patch -'@emigrate/tsconfig': patch -'@emigrate/mysql': patch -'@emigrate/types': patch -'@emigrate/cli': patch ---- - -Enable NPM provenance diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 3805a52..726baee 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,15 @@ # @emigrate/cli +## 0.17.1 + +### Patch Changes + +- 543b7f6: Use setTimeout/setInterval from "node:timers" so that .unref() correctly works with Bun +- db656c2: Enable NPM provenance +- Updated dependencies [db656c2] + - @emigrate/plugin-tools@0.9.6 + - @emigrate/types@0.12.1 + ## 0.17.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 95d1ff1..9b9ec0d 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.17.0", + "version": "0.17.1", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index 6683fd2..4a2a3ee 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,14 @@ # @emigrate/mysql +## 0.2.6 + +### Patch Changes + +- db656c2: Enable NPM provenance +- Updated dependencies [db656c2] + - @emigrate/plugin-tools@0.9.6 + - @emigrate/types@0.12.1 + ## 0.2.5 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 64c5f32..32e5988 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.2.5", + "version": "0.2.6", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/plugin-generate-js/CHANGELOG.md b/packages/plugin-generate-js/CHANGELOG.md index 5763e69..04b0a8e 100644 --- a/packages/plugin-generate-js/CHANGELOG.md +++ b/packages/plugin-generate-js/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-generate-js +## 0.3.6 + +### Patch Changes + +- Updated dependencies [db656c2] + - @emigrate/plugin-tools@0.9.6 + - @emigrate/types@0.12.1 + ## 0.3.5 ### Patch Changes diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index 353c65d..936e097 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-generate-js", - "version": "0.3.5", + "version": "0.3.6", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-tools/CHANGELOG.md b/packages/plugin-tools/CHANGELOG.md index f4d7120..f169f02 100644 --- a/packages/plugin-tools/CHANGELOG.md +++ b/packages/plugin-tools/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-tools +## 0.9.6 + +### Patch Changes + +- db656c2: Enable NPM provenance +- Updated dependencies [db656c2] + - @emigrate/types@0.12.1 + ## 0.9.5 ### Patch Changes diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index c3b90a9..6237b13 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-tools", - "version": "0.9.5", + "version": "0.9.6", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index 16a4e5d..67dbb5a 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,14 @@ # @emigrate/postgres +## 0.2.6 + +### Patch Changes + +- db656c2: Enable NPM provenance +- Updated dependencies [db656c2] + - @emigrate/plugin-tools@0.9.6 + - @emigrate/types@0.12.1 + ## 0.2.5 ### Patch Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index ad77bce..2c40b67 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.2.5", + "version": "0.2.6", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index cdd9baa..f048fb2 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/reporter-pino +## 0.6.1 + +### Patch Changes + +- db656c2: Enable NPM provenance +- Updated dependencies [db656c2] + - @emigrate/types@0.12.1 + ## 0.6.0 ### Minor Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 7787828..6c0269a 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.6.0", + "version": "0.6.1", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/storage-fs/CHANGELOG.md b/packages/storage-fs/CHANGELOG.md index d10b390..788ac24 100644 --- a/packages/storage-fs/CHANGELOG.md +++ b/packages/storage-fs/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/storage-fs +## 0.4.6 + +### Patch Changes + +- db656c2: Enable NPM provenance +- Updated dependencies [db656c2] + - @emigrate/types@0.12.1 + ## 0.4.5 ### Patch Changes diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index 88683f0..0f15617 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/storage-fs", - "version": "0.4.5", + "version": "0.4.6", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/tsconfig/CHANGELOG.md b/packages/tsconfig/CHANGELOG.md index f7aa1e7..b4e6ba7 100644 --- a/packages/tsconfig/CHANGELOG.md +++ b/packages/tsconfig/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/tsconfig +## 1.0.2 + +### Patch Changes + +- db656c2: Enable NPM provenance + ## 1.0.1 ### Patch Changes diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index 4baf381..7ae8cf1 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/tsconfig", - "version": "1.0.1", + "version": "1.0.2", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index cb9b699..df62e7e 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/types +## 0.12.1 + +### Patch Changes + +- db656c2: Enable NPM provenance + ## 0.12.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index 3d42554..666a252 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/types", - "version": "0.12.0", + "version": "0.12.1", "publishConfig": { "access": "public", "provenance": true From 61cbcbd69191b35ec85b30513d15541c5251601f Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 5 Feb 2024 15:46:56 +0100 Subject: [PATCH 094/136] fix(cli): force exiting after 10 seconds should not change the exit code If all migrations have been run successfully we want the exit code to be 0 even though we had to force exit the process. This is because on some platforms (e.g. Bun) all handles are not cleaned up the same as in NodeJS, so lets be forgiving. --- .changeset/wicked-months-kneel.md | 5 +++++ packages/cli/src/cli.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/wicked-months-kneel.md diff --git a/.changeset/wicked-months-kneel.md b/.changeset/wicked-months-kneel.md new file mode 100644 index 0000000..a93d580 --- /dev/null +++ b/.changeset/wicked-months-kneel.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Force exiting after 10 seconds should not change the exit code, i.e. if all migrations have run successfully the exit code should be 0 diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index daf7976..2ba0513 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -602,5 +602,5 @@ await main(process.argv.slice(2), controller.signal); setTimeout(() => { console.error('Process did not exit within 10 seconds, forcing exit'); - process.exit(1); + process.exit(process.exitCode); }, 10_000).unref(); From 4e8ac5294ddf3a1a5aa32026215bc6b80120902c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 5 Feb 2024 14:49:22 +0000 Subject: [PATCH 095/136] chore(release): version packages --- .changeset/wicked-months-kneel.md | 5 ----- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/wicked-months-kneel.md diff --git a/.changeset/wicked-months-kneel.md b/.changeset/wicked-months-kneel.md deleted file mode 100644 index a93d580..0000000 --- a/.changeset/wicked-months-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Force exiting after 10 seconds should not change the exit code, i.e. if all migrations have run successfully the exit code should be 0 diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 726baee..5610be2 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/cli +## 0.17.2 + +### Patch Changes + +- 61cbcbd: Force exiting after 10 seconds should not change the exit code, i.e. if all migrations have run successfully the exit code should be 0 + ## 0.17.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 9b9ec0d..75feef4 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.17.1", + "version": "0.17.2", "publishConfig": { "access": "public", "provenance": true From 18382ce96145113d0a9ad93af9381778dc029cb0 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 6 Feb 2024 09:15:16 +0100 Subject: [PATCH 096/136] feat(reporters): add built-in "json" reporter and rename "default" to "pretty" --- .changeset/famous-elephants-fail.md | 5 +++ .changeset/slimy-tomatoes-taste.md | 5 +++ packages/cli/src/cli.ts | 8 ++-- packages/cli/src/commands/list.ts | 5 +-- packages/cli/src/commands/new.ts | 5 +-- packages/cli/src/commands/remove.ts | 5 +-- packages/cli/src/commands/up.ts | 4 +- packages/cli/src/reporters/get.ts | 14 +++++++ packages/cli/src/reporters/index.ts | 2 + packages/cli/src/reporters/json.ts | 60 +++++++++++++++++++++++++++++ packages/cli/src/types.ts | 5 ++- 11 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 .changeset/famous-elephants-fail.md create mode 100644 .changeset/slimy-tomatoes-taste.md create mode 100644 packages/cli/src/reporters/get.ts create mode 100644 packages/cli/src/reporters/index.ts create mode 100644 packages/cli/src/reporters/json.ts diff --git a/.changeset/famous-elephants-fail.md b/.changeset/famous-elephants-fail.md new file mode 100644 index 0000000..b97a70a --- /dev/null +++ b/.changeset/famous-elephants-fail.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Add a built-in "json" reporter for outputting a single JSON object diff --git a/.changeset/slimy-tomatoes-taste.md b/.changeset/slimy-tomatoes-taste.md new file mode 100644 index 0000000..1f3b288 --- /dev/null +++ b/.changeset/slimy-tomatoes-taste.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Rename the "default" reporter to "pretty" and make it possible to specify it using the `--reporter` CLI option or in the configuration file diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 2ba0513..377cffd 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -104,7 +104,7 @@ Options: -p, --plugin The plugin(s) to use (can be specified multiple times) - -r, --reporter The reporter to use for reporting the migration progress + -r, --reporter The reporter to use for reporting the migration progress (default: pretty) -l, --limit Limit the number of migrations to run @@ -261,7 +261,7 @@ Options: -h, --help Show this help message and exit -d, --directory The directory where the migration files are located (required) - -r, --reporter The reporter to use for reporting the migration file creation progress + -r, --reporter The reporter to use for reporting the migration file creation progress (default: pretty) -p, --plugin The plugin(s) to use (can be specified multiple times) -t, --template A template file to use as contents for the new migration file (if the extension option is not provided the template file's extension will be used) @@ -358,7 +358,7 @@ Options: -d, --directory The directory where the migration files are located (required) -i, --import Additional modules/packages to import before listing the migrations (can be specified multiple times) For example if you want to use Dotenv to load environment variables - -r, --reporter The reporter to use for reporting the migrations + -r, --reporter The reporter to use for reporting the migrations (default: pretty) -s, --storage The storage to use to get the migration history (required) --color Force color output (this option is passed to the reporter) --no-color Disable color output (this option is passed to the reporter) @@ -456,7 +456,7 @@ Options: -d, --directory The directory where the migration files are located (required) -i, --import Additional modules/packages to import before removing the migration (can be specified multiple times) For example if you want to use Dotenv to load environment variables - -r, --reporter The reporter to use for reporting the removal process + -r, --reporter The reporter to use for reporting the removal process (default: pretty) -s, --storage The storage to use to get the migration history (required) -f, --force Force removal of the migration history entry even if the migration is not in a failed state --color Force color output (this option is passed to the reporter) diff --git a/packages/cli/src/commands/list.ts b/packages/cli/src/commands/list.ts index 0dcdcf9..ec8fc22 100644 --- a/packages/cli/src/commands/list.ts +++ b/packages/cli/src/commands/list.ts @@ -5,8 +5,7 @@ import { exec } from '../exec.js'; import { migrationRunner } from '../migration-runner.js'; import { collectMigrations } from '../collect-migrations.js'; import { version } from '../get-package-info.js'; - -const lazyDefaultReporter = async () => import('../reporters/default.js'); +import { getStandardReporter } from '../reporters/get.js'; type ExtraFlags = { cwd: string; @@ -29,7 +28,7 @@ export default async function listCommand({ throw BadOptionError.fromOption('storage', 'No storage found, please specify a storage using the storage option'); } - const reporter = await getOrLoadReporter([reporterConfig ?? lazyDefaultReporter]); + const reporter = getStandardReporter(reporterConfig) ?? (await getOrLoadReporter([reporterConfig])); if (!reporter) { throw BadOptionError.fromOption( diff --git a/packages/cli/src/commands/new.ts b/packages/cli/src/commands/new.ts index 81351b8..c921808 100644 --- a/packages/cli/src/commands/new.ts +++ b/packages/cli/src/commands/new.ts @@ -15,8 +15,7 @@ import { type Config } from '../types.js'; import { withLeadingPeriod } from '../with-leading-period.js'; import { version } from '../get-package-info.js'; import { getDuration } from '../get-duration.js'; - -const lazyDefaultReporter = async () => import('../reporters/default.js'); +import { getStandardReporter } from '../reporters/get.js'; type ExtraFlags = { cwd: string; @@ -38,7 +37,7 @@ export default async function newCommand( throw MissingOptionError.fromOption(['extension', 'template', 'plugin']); } - const reporter = await getOrLoadReporter([reporterConfig ?? lazyDefaultReporter]); + const reporter = getStandardReporter(reporterConfig) ?? (await getOrLoadReporter([reporterConfig])); if (!reporter) { throw BadOptionError.fromOption( diff --git a/packages/cli/src/commands/remove.ts b/packages/cli/src/commands/remove.ts index 6b3d977..de5490c 100644 --- a/packages/cli/src/commands/remove.ts +++ b/packages/cli/src/commands/remove.ts @@ -18,6 +18,7 @@ import { collectMigrations } from '../collect-migrations.js'; import { migrationRunner } from '../migration-runner.js'; import { arrayMapAsync } from '../array-map-async.js'; import { type GetMigrationsFunction } from '../get-migrations.js'; +import { getStandardReporter } from '../reporters/get.js'; type ExtraFlags = { cwd: string; @@ -27,8 +28,6 @@ type ExtraFlags = { type RemovableMigrationMetadata = MigrationMetadata & { originalStatus?: 'done' | 'failed' }; -const lazyDefaultReporter = async () => import('../reporters/default.js'); - export default async function removeCommand( { directory, @@ -55,7 +54,7 @@ export default async function removeCommand( throw BadOptionError.fromOption('storage', 'No storage found, please specify a storage using the storage option'); } - const reporter = await getOrLoadReporter([reporterConfig ?? lazyDefaultReporter]); + const reporter = getStandardReporter(reporterConfig) ?? (await getOrLoadReporter([reporterConfig])); if (!reporter) { throw BadOptionError.fromOption( diff --git a/packages/cli/src/commands/up.ts b/packages/cli/src/commands/up.ts index e0faba4..e47897b 100644 --- a/packages/cli/src/commands/up.ts +++ b/packages/cli/src/commands/up.ts @@ -16,6 +16,7 @@ import { exec } from '../exec.js'; import { migrationRunner } from '../migration-runner.js'; import { collectMigrations } from '../collect-migrations.js'; import { version } from '../get-package-info.js'; +import { getStandardReporter } from '../reporters/get.js'; type ExtraFlags = { cwd: string; @@ -29,7 +30,6 @@ type ExtraFlags = { abortRespite?: number; }; -const lazyDefaultReporter = async () => import('../reporters/default.js'); const lazyPluginLoaderJs = async () => import('../plugin-loader-js.js'); export default async function upCommand({ @@ -58,7 +58,7 @@ export default async function upCommand({ throw BadOptionError.fromOption('storage', 'No storage found, please specify a storage using the storage option'); } - const reporter = await getOrLoadReporter([reporterConfig ?? lazyDefaultReporter]); + const reporter = getStandardReporter(reporterConfig) ?? (await getOrLoadReporter([reporterConfig])); if (!reporter) { throw BadOptionError.fromOption( diff --git a/packages/cli/src/reporters/get.ts b/packages/cli/src/reporters/get.ts new file mode 100644 index 0000000..c3935c3 --- /dev/null +++ b/packages/cli/src/reporters/get.ts @@ -0,0 +1,14 @@ +import { type Config } from '../types.js'; +import * as reporters from './index.js'; + +export const getStandardReporter = (reporter?: Config['reporter']) => { + if (!reporter) { + return reporters.pretty; + } + + if (typeof reporter === 'string' && reporter in reporters) { + return reporters[reporter as keyof typeof reporters]; + } + + return; // eslint-disable-line no-useless-return +}; diff --git a/packages/cli/src/reporters/index.ts b/packages/cli/src/reporters/index.ts new file mode 100644 index 0000000..c1784a9 --- /dev/null +++ b/packages/cli/src/reporters/index.ts @@ -0,0 +1,2 @@ +export { default as pretty } from './default.js'; +export { default as json } from './json.js'; diff --git a/packages/cli/src/reporters/json.ts b/packages/cli/src/reporters/json.ts new file mode 100644 index 0000000..4a3dcc3 --- /dev/null +++ b/packages/cli/src/reporters/json.ts @@ -0,0 +1,60 @@ +import { type ReporterInitParameters, type EmigrateReporter, type MigrationMetadataFinished } from '@emigrate/types'; +import { toSerializedError } from '../errors.js'; + +class JsonReporter implements EmigrateReporter { + #parameters!: ReporterInitParameters; + #startTime!: number; + + onInit(parameters: ReporterInitParameters): void { + this.#startTime = Date.now(); + this.#parameters = parameters; + } + + onFinished(migrations: MigrationMetadataFinished[], error?: Error | undefined): void { + const { command, version } = this.#parameters; + + let numberDoneMigrations = 0; + let numberSkippedMigrations = 0; + let numberFailedMigrations = 0; + let numberPendingMigrations = 0; + + for (const migration of migrations) { + // eslint-disable-next-line unicorn/prefer-switch + if (migration.status === 'done') { + numberDoneMigrations++; + } else if (migration.status === 'skipped') { + numberSkippedMigrations++; + } else if (migration.status === 'failed') { + numberFailedMigrations++; + } else { + numberPendingMigrations++; + } + } + + const result = { + command, + version, + numberTotalMigrations: migrations.length, + numberDoneMigrations, + numberSkippedMigrations, + numberFailedMigrations, + numberPendingMigrations, + success: !error, + startTime: this.#startTime, + endTime: Date.now(), + error: error ? toSerializedError(error) : undefined, + migrations: migrations.map((migration) => ({ + name: migration.filePath, + status: migration.status, + duration: 'duration' in migration ? migration.duration : 0, + error: 'error' in migration ? toSerializedError(migration.error) : undefined, + })), + }; + + console.log(JSON.stringify(result, undefined, 2)); + } +} + +const jsonReporter = new JsonReporter() as EmigrateReporter; + +export default jsonReporter; diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts index 7d6b400..c45b744 100644 --- a/packages/cli/src/types.ts +++ b/packages/cli/src/types.ts @@ -1,4 +1,7 @@ import { type EmigrateStorage, type Awaitable, type Plugin, type EmigrateReporter } from '@emigrate/types'; +import type * as reporters from './reporters/index.js'; + +export type StandardReporter = keyof typeof reporters; export type EmigratePlugin = Plugin; @@ -6,7 +9,7 @@ type StringOrModule = string | T | (() => Awaitable) | (() => Awaitable<{ export type Config = { storage?: StringOrModule; - reporter?: StringOrModule; + reporter?: StandardReporter | StringOrModule; plugins?: Array>; directory?: string; template?: string; From b62c6928461657ad8adb97c8f237d59d93477229 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 6 Feb 2024 09:17:22 +0100 Subject: [PATCH 097/136] docs(reporters): add "json" reporter and rename "default" to "pretty" --- .changeset/cyan-cows-cheer.md | 5 + .changeset/pink-bobcats-prove.md | 5 + docs/astro.config.mjs | 8 +- docs/src/content/docs/commands/list.mdx | 3 + docs/src/content/docs/commands/new.mdx | 3 + docs/src/content/docs/commands/remove.mdx | 3 + docs/src/content/docs/commands/up.mdx | 3 + .../docs/plugins/reporters/default.mdx | 23 ---- .../content/docs/plugins/reporters/index.mdx | 5 +- .../content/docs/plugins/reporters/json.mdx | 102 ++++++++++++++++++ .../content/docs/plugins/reporters/pino.mdx | 26 ++++- .../content/docs/plugins/reporters/pretty.mdx | 90 ++++++++++++++++ .../content/docs/reference/configuration.mdx | 7 +- 13 files changed, 249 insertions(+), 34 deletions(-) create mode 100644 .changeset/cyan-cows-cheer.md create mode 100644 .changeset/pink-bobcats-prove.md delete mode 100644 docs/src/content/docs/plugins/reporters/default.mdx create mode 100644 docs/src/content/docs/plugins/reporters/json.mdx create mode 100644 docs/src/content/docs/plugins/reporters/pretty.mdx diff --git a/.changeset/cyan-cows-cheer.md b/.changeset/cyan-cows-cheer.md new file mode 100644 index 0000000..ed85812 --- /dev/null +++ b/.changeset/cyan-cows-cheer.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': minor +--- + +Add documentation for the built-in "json" reporter diff --git a/.changeset/pink-bobcats-prove.md b/.changeset/pink-bobcats-prove.md new file mode 100644 index 0000000..fbefd77 --- /dev/null +++ b/.changeset/pink-bobcats-prove.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': minor +--- + +The "default" reporter is now named "pretty" diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 679de7d..d4df70c 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -171,8 +171,12 @@ export default defineConfig({ link: '/plugins/reporters/', }, { - label: 'Default Reporter', - link: '/plugins/reporters/default/', + label: 'Pretty Reporter (default)', + link: '/plugins/reporters/pretty/', + }, + { + label: 'JSON Reporter', + link: '/plugins/reporters/json/', }, { label: 'Pino Reporter', diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/commands/list.mdx index 8e1fb92..059bf8e 100644 --- a/docs/src/content/docs/commands/list.mdx +++ b/docs/src/content/docs/commands/list.mdx @@ -86,6 +86,9 @@ In case you have both a `emigrate-storage-somedb` and a `somedb` package install ### `-r`, `--reporter ` +**type:** `"pretty" | "json" | string` +**default:** `"pretty"` + The reporter to use for listing the migrations. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/commands/new.mdx index 671b918..cb89f33 100644 --- a/docs/src/content/docs/commands/new.mdx +++ b/docs/src/content/docs/commands/new.mdx @@ -101,6 +101,9 @@ In case you have both a `emigrate-plugin-someplugin` and a `someplugin` package ### `-r`, `--reporter ` +**type:** `"pretty" | "json" | string` +**default:** `"pretty"` + The reporter to use for listing the migrations. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/commands/remove.mdx index fde9919..d6adb9f 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/commands/remove.mdx @@ -95,6 +95,9 @@ In case you have both a `emigrate-storage-somedb` and a `somedb` package install ### `-r`, `--reporter ` +**type:** `"pretty" | "json" | string` +**default:** `"pretty"` + The reporter to use for listing the migrations. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/commands/up.mdx index cc12ad1..3829882 100644 --- a/docs/src/content/docs/commands/up.mdx +++ b/docs/src/content/docs/commands/up.mdx @@ -147,6 +147,9 @@ In case you have both a `emigrate-plugin-someplugin` and a `someplugin` package ### `-r`, `--reporter ` +**type:** `"pretty" | "json" | string` +**default:** `"pretty"` + The reporter to use for reporting the migration progress. The name can be either a path to a module or a package name. For package names Emigrate will automatically prefix the given name with these prefixes in order: diff --git a/docs/src/content/docs/plugins/reporters/default.mdx b/docs/src/content/docs/plugins/reporters/default.mdx deleted file mode 100644 index 8a76ff2..0000000 --- a/docs/src/content/docs/plugins/reporters/default.mdx +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Default Reporter ---- - -Emigrate's default reporter. The default reporter recognizes if the current terminal is an interactive shell (or if it's a CI environment), if that's the case _no_ animations will be shown. - -## Usage - -By default, Emigrate uses the default reporter. - -## Example output - -```bash - -Emigrate up v0.10.0 /Users/joakim/dev/@aboviq/test-emigrate (dry run) - - 1 pending migrations to run - - β€Ί migration-folder/20231218135441244_create_some_table.sql (pending) - - 1 pending (1 total) - -``` diff --git a/docs/src/content/docs/plugins/reporters/index.mdx b/docs/src/content/docs/plugins/reporters/index.mdx index be0a1ec..bdc8aca 100644 --- a/docs/src/content/docs/plugins/reporters/index.mdx +++ b/docs/src/content/docs/plugins/reporters/index.mdx @@ -20,6 +20,7 @@ Or set it up in your configuration file, see - + + + diff --git a/docs/src/content/docs/plugins/reporters/json.mdx b/docs/src/content/docs/plugins/reporters/json.mdx new file mode 100644 index 0000000..a1118fd --- /dev/null +++ b/docs/src/content/docs/plugins/reporters/json.mdx @@ -0,0 +1,102 @@ +--- +title: JSON Reporter +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; + +An Emigrate reporter that outputs a JSON object. + +The reporter is included by default and does not need to be installed separately. + +## Usage + +### Via CLI + + + + ```bash + npx emigrate --reporter json + ``` + + + ```bash + pnpm emigrate --reporter json + ``` + + + ```bash + yarn emigrate --reporter json + ``` + + + ```bash + bunx --bun emigrate --reporter json + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash + deno task emigrate --reporter json + ``` + + + +See for instance the Reporter Option for the `up` command for more information. + +### Via configuration file + + + + ```js title="emigrate.config.js" + /** @type {import('@emigrate/cli').EmigrateConfig} */ + export default { + reporter: 'json', + }; + ``` + + + ```ts title="emigrate.config.ts" + import { type EmigrateConfig } from '@emigrate/cli'; + + const config: EmigrateConfig = { + reporter: 'json', + }; + + export default config; + ``` + + + +See Reporter Configuration for more information. + +## Example output + +```json +{ + "command": "up", + "version": "0.17.2", + "numberTotalMigrations": 1, + "numberDoneMigrations": 0, + "numberSkippedMigrations": 0, + "numberFailedMigrations": 0, + "numberPendingMigrations": 1, + "success": true, + "startTime": 1707206599968, + "endTime": 1707206600005, + "migrations": [ + { + "name": "/your/project/migrations/20240206075446123_some_other_table.sql", + "status": "pending", + "duration": 0 + } + ] +} +``` diff --git a/docs/src/content/docs/plugins/reporters/pino.mdx b/docs/src/content/docs/plugins/reporters/pino.mdx index 2ee3c19..e76d6ff 100644 --- a/docs/src/content/docs/plugins/reporters/pino.mdx +++ b/docs/src/content/docs/plugins/reporters/pino.mdx @@ -91,11 +91,27 @@ See for instance the Reporter Opti ### Via configuration file -```js title="emigrate.config.js" {2} -export default { - reporter: 'pino', -}; -``` + + + ```js title="emigrate.config.js" + /** @type {import('@emigrate/cli').EmigrateConfig} */ + export default { + reporter: 'pino', + }; + ``` + + + ```ts title="emigrate.config.ts" + import { type EmigrateConfig } from '@emigrate/cli'; + + const config: EmigrateConfig = { + reporter: 'pino', + }; + + export default config; + ``` + + See Reporter Configuration for more information. diff --git a/docs/src/content/docs/plugins/reporters/pretty.mdx b/docs/src/content/docs/plugins/reporters/pretty.mdx new file mode 100644 index 0000000..1f0cbe0 --- /dev/null +++ b/docs/src/content/docs/plugins/reporters/pretty.mdx @@ -0,0 +1,90 @@ +--- +title: Pretty Reporter (default) +--- + +import { Tabs, TabItem } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; + +Emigrate's default reporter. It recognizes if the current terminal is an interactive shell (or if it's a CI environment), if that's the case _no_ animations will be shown. + +The reporter is included by default and does not need to be installed separately. + +## Usage + +By default, Emigrate uses the "pretty" reporter, but it can also be explicitly set by using the `--reporter` flag. + + + + ```bash + npx emigrate --reporter pretty + ``` + + + ```bash + pnpm emigrate --reporter pretty + ``` + + + ```bash + yarn emigrate --reporter pretty + ``` + + + ```bash + bunx --bun emigrate --reporter pretty + ``` + + + ```json title="package.json" {3} + { + "scripts": { + "emigrate": "emigrate" + } + } + ``` + + ```bash + deno task emigrate --reporter pretty + ``` + + + +Or by setting it in the configuration file. + + + + ```js title="emigrate.config.js" + /** @type {import('@emigrate/cli').EmigrateConfig} */ + export default { + reporter: 'pretty', + }; + ``` + + + ```ts title="emigrate.config.ts" + import { type EmigrateConfig } from '@emigrate/cli'; + + const config: EmigrateConfig = { + reporter: 'pretty', + }; + + export default config; + ``` + + + +See Reporter Configuration for more information. + +## Example output + +```bash + +Emigrate up v0.17.2 /your/working/directory (dry run) + + 1 pending migrations to run + + β€Ί migration-folder/20231218135441244_create_some_table.sql (pending) + + 1 pending (1 total) + +``` diff --git a/docs/src/content/docs/reference/configuration.mdx b/docs/src/content/docs/reference/configuration.mdx index 524e4d9..1f48e0f 100644 --- a/docs/src/content/docs/reference/configuration.mdx +++ b/docs/src/content/docs/reference/configuration.mdx @@ -45,9 +45,9 @@ Set the directory where your migrations are located, relative to the project roo ### `reporter` -**type:** `string | EmigrateReporter | Promise | (() => Promise)` +**type:** `"pretty" | "json" | string | EmigrateReporter | Promise | (() => Promise)` -**default:** `"default"` - the default reporter +**default:** `"pretty"` - the default reporter Set the reporter to use for the different commands. Specifying a reporter is most useful in a CI or production environment where you either ship logs or want to have a machine-readable format. @@ -64,6 +64,9 @@ export default { up: { reporter: 'json', }, + new: { + reporter: 'pretty', // Not really necessary, as it's the default + }, }; ``` From e7ec75d9e15134cca4a99c9e6d07e6a04f2ba3ce Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Tue, 6 Feb 2024 09:29:53 +0100 Subject: [PATCH 098/136] docs(faq): add note on using Emigrate for existing databases --- .changeset/shy-nails-refuse.md | 5 +++++ docs/src/content/docs/intro/faq.mdx | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .changeset/shy-nails-refuse.md diff --git a/.changeset/shy-nails-refuse.md b/.changeset/shy-nails-refuse.md new file mode 100644 index 0000000..0099677 --- /dev/null +++ b/.changeset/shy-nails-refuse.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': minor +--- + +Add note in FAQ on using Emigrate for existing databases diff --git a/docs/src/content/docs/intro/faq.mdx b/docs/src/content/docs/intro/faq.mdx index a97574c..ac120b1 100644 --- a/docs/src/content/docs/intro/faq.mdx +++ b/docs/src/content/docs/intro/faq.mdx @@ -3,11 +3,13 @@ title: "FAQ" description: "Frequently asked questions about Emigrate." --- +import Link from '@components/Link.astro'; + ## Why no `down` migrations? > Always forward never backwards. -Many other migration tools support `down` migrations, but in all the years we have been +Many other migration tools support `down` (or undo) migrations, but in all the years we have been doing migrations we have never needed to rollback a migration in production, in that case we would just write a new migration to fix the problem. @@ -17,3 +19,7 @@ and in such case you just revert the migration manually and fix the `up` migrati The benefit of this is that you don't have to worry about writing `down` migrations, and you can focus on writing the `up` migrations. This way you will only ever have to write `down` migrations when they are really necessary instead of for every migration (which makes it the exception rather than the rule, which is closer to the truth). + +## Can I use Emigrate with my existing database? + +Yes, you can use Emigrate with an existing database. See the Baseline guide for more information. From 198aa545ebd4d3937ae34a8a99139c2e323b5c3f Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 9 Feb 2024 13:10:02 +0100 Subject: [PATCH 099/136] fix(mysql): unreference all connections so that the process can exit cleanly In a NodeJS environment it will just work as before, but in a Bun environment it will make the "forced exit" error message disappear and remove the 10 s waiting period when migrations are done. --- .changeset/spotty-singers-shake.md | 5 +++++ packages/mysql/src/index.ts | 10 ++++++++++ 2 files changed, 15 insertions(+) create mode 100644 .changeset/spotty-singers-shake.md diff --git a/.changeset/spotty-singers-shake.md b/.changeset/spotty-singers-shake.md new file mode 100644 index 0000000..6fe0f77 --- /dev/null +++ b/.changeset/spotty-singers-shake.md @@ -0,0 +1,5 @@ +--- +'@emigrate/mysql': patch +--- + +Unreference all connections automatically so that they don't hinder the process from exiting. This is especially needed in Bun environments as it seems to handle sockets differently regarding this matter than NodeJS. diff --git a/packages/mysql/src/index.ts b/packages/mysql/src/index.ts index de253c9..6c009e9 100644 --- a/packages/mysql/src/index.ts +++ b/packages/mysql/src/index.ts @@ -171,6 +171,12 @@ export const createMysqlStorage = ({ table = defaultTable, connection }: MysqlSt async initializeStorage() { const pool = getPool(connection); + pool.on('connection', (connection) => { + // @ts-expect-error stream is not in the types but it's there + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + connection.stream.unref(); + }); + await pool.query('SELECT 1'); try { @@ -268,6 +274,10 @@ export const createMysqlLoader = ({ connection }: MysqlLoaderOptions): LoaderPlu const contents = await fs.readFile(migration.filePath, 'utf8'); const conn = await getConnection(connection); + // @ts-expect-error the connection is not in the types but it's there + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + conn.connection.stream.unref(); + try { await conn.query(contents); } finally { From c838ffb7f3ad281743675bc3612c6dc9979a6e0e Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 9 Feb 2024 13:50:16 +0100 Subject: [PATCH 100/136] fix(typescript): load config written in TypeScript without the `typescript` package when using Bun, Deno or `tsx` --- .changeset/breezy-sheep-yawn.md | 5 ++ .changeset/cool-spies-behave.md | 5 ++ .changeset/tidy-shrimps-hide.md | 5 ++ docs/src/content/docs/guides/typescript.mdx | 12 ++- packages/cli/package.json | 4 +- packages/cli/src/cli.ts | 83 +++++++++++++++------ packages/cli/src/deno.d.ts | 6 ++ packages/cli/src/get-config.ts | 11 ++- pnpm-lock.yaml | 33 +++++++- 9 files changed, 132 insertions(+), 32 deletions(-) create mode 100644 .changeset/breezy-sheep-yawn.md create mode 100644 .changeset/cool-spies-behave.md create mode 100644 .changeset/tidy-shrimps-hide.md create mode 100644 packages/cli/src/deno.d.ts diff --git a/.changeset/breezy-sheep-yawn.md b/.changeset/breezy-sheep-yawn.md new file mode 100644 index 0000000..1fc9664 --- /dev/null +++ b/.changeset/breezy-sheep-yawn.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': minor +--- + +Make it possible to write the Emigrate configuration file in TypeScript and load it using `tsx` in a NodeJS environment by importing packages provided using the `--import` CLI option before loading the configuration file. This makes it possible to run Emigrate in production with a configuration file written in TypeScript without having the `typescript` package installed. diff --git a/.changeset/cool-spies-behave.md b/.changeset/cool-spies-behave.md new file mode 100644 index 0000000..8efe0e7 --- /dev/null +++ b/.changeset/cool-spies-behave.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': patch +--- + +Add note on how to write Emigrate's config using TypeScript in a production environment without having `typescript` installed. diff --git a/.changeset/tidy-shrimps-hide.md b/.changeset/tidy-shrimps-hide.md new file mode 100644 index 0000000..3d86eaf --- /dev/null +++ b/.changeset/tidy-shrimps-hide.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Don't use the `typescript` package for loading an Emigrate configuration file written in TypeScript in a Bun or Deno environment diff --git a/docs/src/content/docs/guides/typescript.mdx b/docs/src/content/docs/guides/typescript.mdx index 8e580a4..267846a 100644 --- a/docs/src/content/docs/guides/typescript.mdx +++ b/docs/src/content/docs/guides/typescript.mdx @@ -7,14 +7,14 @@ import { Tabs, TabItem } from '@astrojs/starlight/components'; import Link from '@components/Link.astro'; :::tip[Using Bun or Deno?] -If you are using [Bun](https://bun.sh) or [Deno](https://deno.land) you are already good to go as they both support TypeScript out of the box. +If you are using [Bun](https://bun.sh) or [Deno](https://deno.land) you are already good to go as they both support TypeScript out of the box! ::: -You have at least the two following options to support running TypeScript migration files in NodeJS. +If you're using NodeJS you have at least the two following options to support running TypeScript migration files in NodeJS. ## Using `tsx` -If you want to be able to write and run migration files written in TypeScript the easiest way is to install the [`tsx`](https://github.com/privatenumber/tsx) package. +If you want to be able to write and run migration files written in TypeScript an easy way is to install the [`tsx`](https://github.com/privatenumber/tsx) package. ### Installing `tsx` @@ -67,9 +67,13 @@ Using the `--import` flag y +:::note +This method is necessary if you want to write your configuration file in TypeScript without having `typescript` installed in your production environment, as `tsx` must be loaded before the configuration file is loaded. +::: + #### Via configuration file -You can also directly import `tsx` in your configuration file. +You can also directly import `tsx` in your configuration file (will only work if you're not using TypeScript for your configuration file). ```js title="emigrate.config.js" {1} import 'tsx'; diff --git a/packages/cli/package.json b/packages/cli/package.json index 75feef4..9f0c34f 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -36,7 +36,9 @@ "immigration" ], "devDependencies": { - "@emigrate/tsconfig": "workspace:*" + "@emigrate/tsconfig": "workspace:*", + "@types/bun": "1.0.5", + "bun-types": "1.0.26" }, "author": "Aboviq AB (https://www.aboviq.com)", "homepage": "https://github.com/aboviq/emigrate/tree/main/packages/cli#readme", diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 377cffd..8bb797e 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -24,7 +24,6 @@ const importAll = async (cwd: string, modules: string[]) => { }; const up: Action = async (args, abortSignal) => { - const config = await getConfig('up'); const { values } = parseArgs({ args, options: { @@ -143,6 +142,14 @@ Examples: } const cwd = process.cwd(); + + if (values.import) { + await importAll(cwd, values.import); + } + + const forceImportTypeScriptAsIs = values.import?.some((module) => module === 'tsx' || module.startsWith('tsx/')); + + const config = await getConfig('up', forceImportTypeScriptAsIs); const { directory = config.directory, storage = config.storage, @@ -151,7 +158,6 @@ Examples: from, to, limit: limitString, - import: imports = [], 'abort-respite': abortRespiteString, 'no-execution': noExecution, } = values; @@ -177,8 +183,6 @@ Examples: return; } - await importAll(cwd, imports); - try { const { default: upCommand } = await import('./commands/up.js'); process.exitCode = await upCommand({ @@ -209,7 +213,6 @@ Examples: }; const newMigration: Action = async (args) => { - const config = await getConfig('new'); const { values, positionals } = parseArgs({ args, options: { @@ -239,6 +242,12 @@ const newMigration: Action = async (args) => { multiple: true, default: [], }, + import: { + type: 'string', + short: 'i', + multiple: true, + default: [], + }, color: { type: 'boolean', }, @@ -260,14 +269,24 @@ Arguments: Options: -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + + -i, --import Additional modules/packages to import before creating the migration (can be specified multiple times) + For example if you want to use Dotenv to load environment variables or when using TypeScript + -r, --reporter The reporter to use for reporting the migration file creation progress (default: pretty) + -p, --plugin The plugin(s) to use (can be specified multiple times) + -t, --template A template file to use as contents for the new migration file (if the extension option is not provided the template file's extension will be used) + -x, --extension The extension to use for the new migration file (if no template or plugin is provided an empty migration file will be created with the given extension) + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) One of the --template, --extension or the --plugin options must be specified @@ -287,6 +306,14 @@ Examples: } const cwd = process.cwd(); + + if (values.import) { + await importAll(cwd, values.import); + } + + const forceImportTypeScriptAsIs = values.import?.some((module) => module === 'tsx' || module.startsWith('tsx/')); + + const config = await getConfig('new', forceImportTypeScriptAsIs); const { directory = config.directory, template = config.template, @@ -312,7 +339,6 @@ Examples: }; const list: Action = async (args) => { - const config = await getConfig('list'); const { values } = parseArgs({ args, options: { @@ -355,12 +381,18 @@ List all migrations and their status. This command does not run any migrations. Options: -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before listing the migrations (can be specified multiple times) For example if you want to use Dotenv to load environment variables + -r, --reporter The reporter to use for reporting the migrations (default: pretty) + -s, --storage The storage to use to get the migration history (required) + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) Examples: @@ -376,14 +408,15 @@ Examples: } const cwd = process.cwd(); - const { - directory = config.directory, - storage = config.storage, - reporter = config.reporter, - import: imports = [], - } = values; - await importAll(cwd, imports); + if (values.import) { + await importAll(cwd, values.import); + } + + const forceImportTypeScriptAsIs = values.import?.some((module) => module === 'tsx' || module.startsWith('tsx/')); + + const config = await getConfig('list', forceImportTypeScriptAsIs); + const { directory = config.directory, storage = config.storage, reporter = config.reporter } = values; try { const { default: listCommand } = await import('./commands/list.js'); @@ -401,7 +434,6 @@ Examples: }; const remove: Action = async (args) => { - const config = await getConfig('remove'); const { values, positionals } = parseArgs({ args, options: { @@ -453,13 +485,20 @@ Arguments: Options: -h, --help Show this help message and exit + -d, --directory The directory where the migration files are located (required) + -i, --import Additional modules/packages to import before removing the migration (can be specified multiple times) For example if you want to use Dotenv to load environment variables + -r, --reporter The reporter to use for reporting the removal process (default: pretty) + -s, --storage The storage to use to get the migration history (required) + -f, --force Force removal of the migration history entry even if the migration is not in a failed state + --color Force color output (this option is passed to the reporter) + --no-color Disable color output (this option is passed to the reporter) Examples: @@ -477,15 +516,15 @@ Examples: } const cwd = process.cwd(); - const { - directory = config.directory, - storage = config.storage, - reporter = config.reporter, - force, - import: imports = [], - } = values; - await importAll(cwd, imports); + if (values.import) { + await importAll(cwd, values.import); + } + + const forceImportTypeScriptAsIs = values.import?.some((module) => module === 'tsx' || module.startsWith('tsx/')); + + const config = await getConfig('remove', forceImportTypeScriptAsIs); + const { directory = config.directory, storage = config.storage, reporter = config.reporter, force } = values; try { const { default: removeCommand } = await import('./commands/remove.js'); diff --git a/packages/cli/src/deno.d.ts b/packages/cli/src/deno.d.ts new file mode 100644 index 0000000..bc23737 --- /dev/null +++ b/packages/cli/src/deno.d.ts @@ -0,0 +1,6 @@ +declare global { + // eslint-disable-next-line @typescript-eslint/naming-convention + const Deno: any; +} + +export {}; diff --git a/packages/cli/src/get-config.ts b/packages/cli/src/get-config.ts index 0d9dbd4..4db33a7 100644 --- a/packages/cli/src/get-config.ts +++ b/packages/cli/src/get-config.ts @@ -1,11 +1,16 @@ -import { cosmiconfig } from 'cosmiconfig'; +import process from 'node:process'; +import { cosmiconfig, defaultLoaders } from 'cosmiconfig'; import { type Config, type EmigrateConfig } from './types.js'; const commands = ['up', 'list', 'new', 'remove'] as const; type Command = (typeof commands)[number]; +const canImportTypeScriptAsIs = Boolean(process.isBun) || typeof Deno !== 'undefined'; -export const getConfig = async (command: Command): Promise => { - const explorer = cosmiconfig('emigrate'); +export const getConfig = async (command: Command, forceImportTypeScriptAsIs = false): Promise => { + const explorer = cosmiconfig('emigrate', { + // eslint-disable-next-line @typescript-eslint/naming-convention + loaders: forceImportTypeScriptAsIs || canImportTypeScriptAsIs ? { '.ts': defaultLoaders['.js'] } : undefined, + }); const result = await explorer.search(); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2910926..de45949 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -108,6 +108,12 @@ importers: '@emigrate/tsconfig': specifier: workspace:* version: link:../tsconfig + '@types/bun': + specifier: 1.0.5 + version: 1.0.5 + bun-types: + specifier: 1.0.26 + version: 1.0.26 packages/mysql: dependencies: @@ -1759,6 +1765,12 @@ packages: '@babel/types': 7.23.6 dev: false + /@types/bun@1.0.5: + resolution: {integrity: sha512-c14fs5QLLanldcZpX/GjIEKeo++NDzOlixUZ7IUWzN7AoBTisYyWxaxdXNhpAP5I1mPcd92Zagq8sdgTnUXWjg==} + dependencies: + bun-types: 1.0.26 + dev: true + /@types/debug@4.1.12: resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} dependencies: @@ -1858,7 +1870,12 @@ packages: resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} dependencies: undici-types: 5.26.5 - dev: false + + /@types/node@20.11.17: + resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} + dependencies: + undici-types: 5.26.5 + dev: true /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1886,6 +1903,12 @@ packages: resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} dev: false + /@types/ws@8.5.10: + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + dependencies: + '@types/node': 20.10.4 + dev: true + /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3): resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} engines: {node: ^16.0.0 || >=18.0.0} @@ -2646,6 +2669,13 @@ packages: semver: 7.5.4 dev: false + /bun-types@1.0.26: + resolution: {integrity: sha512-VcSj+SCaWIcMb0uSGIAtr8P92zq9q+unavcQmx27fk6HulCthXHBVrdGuXxAZbFtv7bHVjizRzR2mk9r/U8Nkg==} + dependencies: + '@types/node': 20.11.17 + '@types/ws': 8.5.10 + dev: true + /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} @@ -8603,7 +8633,6 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - dev: false /unherit@3.0.1: resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} From 0360d0b82ffab3e2df537428a18b958960a0cf78 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 9 Feb 2024 13:01:02 +0000 Subject: [PATCH 101/136] chore(release): version packages --- .changeset/breezy-sheep-yawn.md | 5 ----- .changeset/cool-spies-behave.md | 5 ----- .changeset/cyan-cows-cheer.md | 5 ----- .changeset/famous-elephants-fail.md | 5 ----- .changeset/pink-bobcats-prove.md | 5 ----- .changeset/shy-nails-refuse.md | 5 ----- .changeset/slimy-tomatoes-taste.md | 5 ----- .changeset/spotty-singers-shake.md | 5 ----- .changeset/tidy-shrimps-hide.md | 5 ----- docs/CHANGELOG.md | 12 ++++++++++++ docs/package.json | 2 +- packages/cli/CHANGELOG.md | 12 ++++++++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 6 ++++++ packages/mysql/package.json | 2 +- 15 files changed, 33 insertions(+), 48 deletions(-) delete mode 100644 .changeset/breezy-sheep-yawn.md delete mode 100644 .changeset/cool-spies-behave.md delete mode 100644 .changeset/cyan-cows-cheer.md delete mode 100644 .changeset/famous-elephants-fail.md delete mode 100644 .changeset/pink-bobcats-prove.md delete mode 100644 .changeset/shy-nails-refuse.md delete mode 100644 .changeset/slimy-tomatoes-taste.md delete mode 100644 .changeset/spotty-singers-shake.md delete mode 100644 .changeset/tidy-shrimps-hide.md diff --git a/.changeset/breezy-sheep-yawn.md b/.changeset/breezy-sheep-yawn.md deleted file mode 100644 index 1fc9664..0000000 --- a/.changeset/breezy-sheep-yawn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Make it possible to write the Emigrate configuration file in TypeScript and load it using `tsx` in a NodeJS environment by importing packages provided using the `--import` CLI option before loading the configuration file. This makes it possible to run Emigrate in production with a configuration file written in TypeScript without having the `typescript` package installed. diff --git a/.changeset/cool-spies-behave.md b/.changeset/cool-spies-behave.md deleted file mode 100644 index 8efe0e7..0000000 --- a/.changeset/cool-spies-behave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': patch ---- - -Add note on how to write Emigrate's config using TypeScript in a production environment without having `typescript` installed. diff --git a/.changeset/cyan-cows-cheer.md b/.changeset/cyan-cows-cheer.md deleted file mode 100644 index ed85812..0000000 --- a/.changeset/cyan-cows-cheer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': minor ---- - -Add documentation for the built-in "json" reporter diff --git a/.changeset/famous-elephants-fail.md b/.changeset/famous-elephants-fail.md deleted file mode 100644 index b97a70a..0000000 --- a/.changeset/famous-elephants-fail.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Add a built-in "json" reporter for outputting a single JSON object diff --git a/.changeset/pink-bobcats-prove.md b/.changeset/pink-bobcats-prove.md deleted file mode 100644 index fbefd77..0000000 --- a/.changeset/pink-bobcats-prove.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': minor ---- - -The "default" reporter is now named "pretty" diff --git a/.changeset/shy-nails-refuse.md b/.changeset/shy-nails-refuse.md deleted file mode 100644 index 0099677..0000000 --- a/.changeset/shy-nails-refuse.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': minor ---- - -Add note in FAQ on using Emigrate for existing databases diff --git a/.changeset/slimy-tomatoes-taste.md b/.changeset/slimy-tomatoes-taste.md deleted file mode 100644 index 1f3b288..0000000 --- a/.changeset/slimy-tomatoes-taste.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': minor ---- - -Rename the "default" reporter to "pretty" and make it possible to specify it using the `--reporter` CLI option or in the configuration file diff --git a/.changeset/spotty-singers-shake.md b/.changeset/spotty-singers-shake.md deleted file mode 100644 index 6fe0f77..0000000 --- a/.changeset/spotty-singers-shake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/mysql': patch ---- - -Unreference all connections automatically so that they don't hinder the process from exiting. This is especially needed in Bun environments as it seems to handle sockets differently regarding this matter than NodeJS. diff --git a/.changeset/tidy-shrimps-hide.md b/.changeset/tidy-shrimps-hide.md deleted file mode 100644 index 3d86eaf..0000000 --- a/.changeset/tidy-shrimps-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Don't use the `typescript` package for loading an Emigrate configuration file written in TypeScript in a Bun or Deno environment diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 25808b5..676bea6 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,17 @@ # @emigrate/docs +## 0.4.0 + +### Minor Changes + +- b62c692: Add documentation for the built-in "json" reporter +- b62c692: The "default" reporter is now named "pretty" +- e7ec75d: Add note in FAQ on using Emigrate for existing databases + +### Patch Changes + +- c838ffb: Add note on how to write Emigrate's config using TypeScript in a production environment without having `typescript` installed. + ## 0.3.0 ### Minor Changes diff --git a/docs/package.json b/docs/package.json index 8cde013..2313a81 100644 --- a/docs/package.json +++ b/docs/package.json @@ -2,7 +2,7 @@ "name": "@emigrate/docs", "private": true, "type": "module", - "version": "0.3.0", + "version": "0.4.0", "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 5610be2..dd7de8e 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,17 @@ # @emigrate/cli +## 0.18.0 + +### Minor Changes + +- c838ffb: Make it possible to write the Emigrate configuration file in TypeScript and load it using `tsx` in a NodeJS environment by importing packages provided using the `--import` CLI option before loading the configuration file. This makes it possible to run Emigrate in production with a configuration file written in TypeScript without having the `typescript` package installed. +- 18382ce: Add a built-in "json" reporter for outputting a single JSON object +- 18382ce: Rename the "default" reporter to "pretty" and make it possible to specify it using the `--reporter` CLI option or in the configuration file + +### Patch Changes + +- c838ffb: Don't use the `typescript` package for loading an Emigrate configuration file written in TypeScript in a Bun or Deno environment + ## 0.17.2 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 9f0c34f..27817a8 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.17.2", + "version": "0.18.0", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index 4a2a3ee..3742eba 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/mysql +## 0.2.7 + +### Patch Changes + +- 198aa54: Unreference all connections automatically so that they don't hinder the process from exiting. This is especially needed in Bun environments as it seems to handle sockets differently regarding this matter than NodeJS. + ## 0.2.6 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 32e5988..310f6c5 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.2.6", + "version": "0.2.7", "publishConfig": { "access": "public", "provenance": true From 0c597fd7a880a2ec05ed6bd7d3341dd38860dc16 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 9 Feb 2024 14:04:52 +0100 Subject: [PATCH 102/136] docs(cli): add a main page for Emigrate's CLI --- .changeset/popular-points-exist.md | 5 ++ docs/astro.config.mjs | 37 +++++++----- docs/src/content/docs/commands/index.mdx | 73 ++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 14 deletions(-) create mode 100644 .changeset/popular-points-exist.md create mode 100644 docs/src/content/docs/commands/index.mdx diff --git a/.changeset/popular-points-exist.md b/.changeset/popular-points-exist.md new file mode 100644 index 0000000..8496b79 --- /dev/null +++ b/.changeset/popular-points-exist.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': minor +--- + +Add a separate page for the Emigrate CLI itself, with all the commands as sub pages diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index d4df70c..17b41c2 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -78,23 +78,32 @@ export default defineConfig({ ], }, { - label: 'Commands', + label: 'Command Line Interface', items: [ { - label: 'emigrate up', - link: '/commands/up/', + label: 'Introduction', + link: '/commands/', }, { - label: 'emigrate list', - link: '/commands/list/', - }, - { - label: 'emigrate new', - link: '/commands/new/', - }, - { - label: 'emigrate remove', - link: '/commands/remove/', + label: 'Commands', + items: [ + { + label: 'emigrate up', + link: '/commands/up/', + }, + { + label: 'emigrate list', + link: '/commands/list/', + }, + { + label: 'emigrate new', + link: '/commands/new/', + }, + { + label: 'emigrate remove', + link: '/commands/remove/', + }, + ], }, ], }, @@ -106,7 +115,7 @@ export default defineConfig({ link: '/guides/typescript/', }, { - label: 'Baseline', + label: 'Baseline existing database', link: '/guides/baseline/', }, ], diff --git a/docs/src/content/docs/commands/index.mdx b/docs/src/content/docs/commands/index.mdx new file mode 100644 index 0000000..c01c189 --- /dev/null +++ b/docs/src/content/docs/commands/index.mdx @@ -0,0 +1,73 @@ +--- +title: "CLI Introduction" +description: "Some basic information about the Emigrate CLI." +--- + +import { Tabs, TabItem, LinkCard } from '@astrojs/starlight/components'; +import Link from '@components/Link.astro'; + +Emigrate comes with a CLI that you can use to manage your migrations. The CLI is a powerful tool that allows you to create, run, and manage migrations. + +### Installing the Emigrate CLI + + + + ```bash + npm install @emigrate/cli + ``` + + + ```bash + pnpm add @emigrate/cli + ``` + + + ```bash + yarn add @emigrate/cli + ``` + + + ```bash + bun add @emigrate/cli + ``` + + + ```json title="package.json" {3,6} + { + "scripts": { + "emigrate": "emigrate" + }, + "dependencies": { + "@emigrate/cli": "*" + } + } + ``` + + + +### Existing commands + + + + + + + + + From 1d33d65135f314ba1999ee1791dab4ce1846e09e Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 9 Feb 2024 14:35:32 +0100 Subject: [PATCH 103/136] docs(cli): change URL path from /commands/ to /cli/ --- .changeset/funny-elephants-live.md | 5 +++++ docs/CHANGELOG.md | 2 +- docs/astro.config.mjs | 10 +++++----- docs/src/content/docs/{commands => cli}/index.mdx | 0 docs/src/content/docs/{commands => cli}/list.mdx | 0 docs/src/content/docs/{commands => cli}/new.mdx | 0 docs/src/content/docs/{commands => cli}/remove.mdx | 2 +- docs/src/content/docs/{commands => cli}/up.mdx | 0 docs/src/content/docs/guides/baseline.mdx | 10 +++++----- docs/src/content/docs/guides/typescript.mdx | 2 +- docs/src/content/docs/plugins/generators/index.mdx | 2 +- docs/src/content/docs/plugins/generators/js.mdx | 2 +- docs/src/content/docs/plugins/generators/mysql.mdx | 2 +- docs/src/content/docs/plugins/generators/postgres.mdx | 2 +- docs/src/content/docs/plugins/reporters/json.mdx | 2 +- docs/src/content/docs/plugins/reporters/pino.mdx | 2 +- docs/src/content/docs/plugins/reporters/pretty.mdx | 2 +- 17 files changed, 25 insertions(+), 20 deletions(-) create mode 100644 .changeset/funny-elephants-live.md rename docs/src/content/docs/{commands => cli}/index.mdx (100%) rename docs/src/content/docs/{commands => cli}/list.mdx (100%) rename docs/src/content/docs/{commands => cli}/new.mdx (100%) rename docs/src/content/docs/{commands => cli}/remove.mdx (97%) rename docs/src/content/docs/{commands => cli}/up.mdx (100%) diff --git a/.changeset/funny-elephants-live.md b/.changeset/funny-elephants-live.md new file mode 100644 index 0000000..f629de9 --- /dev/null +++ b/.changeset/funny-elephants-live.md @@ -0,0 +1,5 @@ +--- +'@emigrate/docs': major +--- + +Rename the URL path "/commands/" to "/cli/" to make it more clear that those pages are the documentation for the CLI. This change is a BREAKING CHANGE because it changes the URL path of the pages. diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 676bea6..c36d9a8 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -30,4 +30,4 @@ ### Minor Changes - cbc35bd: Add first version of the [Baseline guide](https://emigrate.dev/guides/baseline) -- cbc35bd: Document the new --limit, --from and --to options for the ["up" command](https://emigrate.dev/commands/up/) +- cbc35bd: Document the new --limit, --from and --to options for the ["up" command](https://emigrate.dev/cli/up/) diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 17b41c2..a35ee37 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -82,26 +82,26 @@ export default defineConfig({ items: [ { label: 'Introduction', - link: '/commands/', + link: '/cli/', }, { label: 'Commands', items: [ { label: 'emigrate up', - link: '/commands/up/', + link: '/cli/up/', }, { label: 'emigrate list', - link: '/commands/list/', + link: '/cli/list/', }, { label: 'emigrate new', - link: '/commands/new/', + link: '/cli/new/', }, { label: 'emigrate remove', - link: '/commands/remove/', + link: '/cli/remove/', }, ], }, diff --git a/docs/src/content/docs/commands/index.mdx b/docs/src/content/docs/cli/index.mdx similarity index 100% rename from docs/src/content/docs/commands/index.mdx rename to docs/src/content/docs/cli/index.mdx diff --git a/docs/src/content/docs/commands/list.mdx b/docs/src/content/docs/cli/list.mdx similarity index 100% rename from docs/src/content/docs/commands/list.mdx rename to docs/src/content/docs/cli/list.mdx diff --git a/docs/src/content/docs/commands/new.mdx b/docs/src/content/docs/cli/new.mdx similarity index 100% rename from docs/src/content/docs/commands/new.mdx rename to docs/src/content/docs/cli/new.mdx diff --git a/docs/src/content/docs/commands/remove.mdx b/docs/src/content/docs/cli/remove.mdx similarity index 97% rename from docs/src/content/docs/commands/remove.mdx rename to docs/src/content/docs/cli/remove.mdx index d6adb9f..6590d17 100644 --- a/docs/src/content/docs/commands/remove.mdx +++ b/docs/src/content/docs/cli/remove.mdx @@ -55,7 +55,7 @@ The `remove` command is used to remove a migration from the history. This is use The name of the migration file to remove, including the extension, e.g. `20200101000000_some_migration.js`, or a relative file path to a migration file to remove, e.g: `migrations/20200101000000_some_migration.js`. -Using relative file paths is useful in terminals that support autocomplete, and also when you copy and use the relative migration file path from the output of the `list` command. +Using relative file paths is useful in terminals that support autocomplete, and also when you copy and use the relative migration file path from the output of the `list` command. ## Options diff --git a/docs/src/content/docs/commands/up.mdx b/docs/src/content/docs/cli/up.mdx similarity index 100% rename from docs/src/content/docs/commands/up.mdx rename to docs/src/content/docs/cli/up.mdx diff --git a/docs/src/content/docs/guides/baseline.mdx b/docs/src/content/docs/guides/baseline.mdx index 2e2df5e..62381f0 100644 --- a/docs/src/content/docs/guides/baseline.mdx +++ b/docs/src/content/docs/guides/baseline.mdx @@ -113,8 +113,8 @@ CREATE TABLE public.posts ( ### Log the baseline migration -For new environments this baseline migration will automatically be run when you run `emigrate up`. -For any existing environments you will need to run `emigrate up` with the `--no-execution` flag to prevent the migration from being executed and only log the migration: +For new environments this baseline migration will automatically be run when you run `emigrate up`. +For any existing environments you will need to run `emigrate up` with the `--no-execution` flag to prevent the migration from being executed and only log the migration: @@ -155,7 +155,7 @@ For any existing environments you will need to run `emigrate up` with the -In case you have already added more migration files to your migration directory you can limit the "up" command to just log the baseline migration by specifying the `--to` option: +In case you have already added more migration files to your migration directory you can limit the "up" command to just log the baseline migration by specifying the `--to` option: @@ -198,7 +198,7 @@ In case you have already added more migration files to your migration directory ### Verify the baseline migration status -You can verify the status of the baseline migration by running the `emigrate list` command: +You can verify the status of the baseline migration by running the `emigrate list` command: @@ -251,5 +251,5 @@ Emigrate list v0.14.1 /your/project/path ### Happy migrating! -You can now start adding new migrations to your migration directory and run `emigrate up` to apply them to your database. +You can now start adding new migrations to your migration directory and run `emigrate up` to apply them to your database. Which should be part of your CD pipeline to ensure that your database schema is always up to date in each environment. diff --git a/docs/src/content/docs/guides/typescript.mdx b/docs/src/content/docs/guides/typescript.mdx index 267846a..7214f5c 100644 --- a/docs/src/content/docs/guides/typescript.mdx +++ b/docs/src/content/docs/guides/typescript.mdx @@ -47,7 +47,7 @@ After installing `tsx` you can load it in two ways. #### Via CLI -Using the `--import` flag you can load `tsx` before running your migration files. +Using the `--import` flag you can load `tsx` before running your migration files. diff --git a/docs/src/content/docs/plugins/generators/index.mdx b/docs/src/content/docs/plugins/generators/index.mdx index de8c0da..69be705 100644 --- a/docs/src/content/docs/plugins/generators/index.mdx +++ b/docs/src/content/docs/plugins/generators/index.mdx @@ -22,5 +22,5 @@ The generator is responsible for generating migration files in a specific format :::note -Instead of having to install a generator plugin, you can also use the much simpler `--template` option to specify a custom template file for new migrations. +Instead of having to install a generator plugin, you can also use the much simpler `--template` option to specify a custom template file for new migrations. ::: diff --git a/docs/src/content/docs/plugins/generators/js.mdx b/docs/src/content/docs/plugins/generators/js.mdx index b77c6be..e45a8d3 100644 --- a/docs/src/content/docs/plugins/generators/js.mdx +++ b/docs/src/content/docs/plugins/generators/js.mdx @@ -79,4 +79,4 @@ A generator plugin for generating new m -For more information see the `new` command's documentation. +For more information see the `new` command's documentation. diff --git a/docs/src/content/docs/plugins/generators/mysql.mdx b/docs/src/content/docs/plugins/generators/mysql.mdx index d36e7d3..9793eaf 100644 --- a/docs/src/content/docs/plugins/generators/mysql.mdx +++ b/docs/src/content/docs/plugins/generators/mysql.mdx @@ -79,4 +79,4 @@ The MySQL generator creates new migration files with the `.sql` extension. In th -For more information see the `new` command's documentation. +For more information see the `new` command's documentation. diff --git a/docs/src/content/docs/plugins/generators/postgres.mdx b/docs/src/content/docs/plugins/generators/postgres.mdx index 748c511..524d632 100644 --- a/docs/src/content/docs/plugins/generators/postgres.mdx +++ b/docs/src/content/docs/plugins/generators/postgres.mdx @@ -79,4 +79,4 @@ The PostgreSQL generator creates new migration files with the `.sql` extension. -For more information see the `new` command's documentation. +For more information see the `new` command's documentation. diff --git a/docs/src/content/docs/plugins/reporters/json.mdx b/docs/src/content/docs/plugins/reporters/json.mdx index a1118fd..f9a5d4f 100644 --- a/docs/src/content/docs/plugins/reporters/json.mdx +++ b/docs/src/content/docs/plugins/reporters/json.mdx @@ -49,7 +49,7 @@ The reporter is included by default and does not need to be installed separately -See for instance the Reporter Option for the `up` command for more information. +See for instance the Reporter Option for the `up` command for more information. ### Via configuration file diff --git a/docs/src/content/docs/plugins/reporters/pino.mdx b/docs/src/content/docs/plugins/reporters/pino.mdx index e76d6ff..46adc8a 100644 --- a/docs/src/content/docs/plugins/reporters/pino.mdx +++ b/docs/src/content/docs/plugins/reporters/pino.mdx @@ -87,7 +87,7 @@ The `@emigrate/reporter-` prefix is optional when using this reporter. -See for instance the Reporter Option for the `up` command for more information. +See for instance the Reporter Option for the `up` command for more information. ### Via configuration file diff --git a/docs/src/content/docs/plugins/reporters/pretty.mdx b/docs/src/content/docs/plugins/reporters/pretty.mdx index 1f0cbe0..c81cb77 100644 --- a/docs/src/content/docs/plugins/reporters/pretty.mdx +++ b/docs/src/content/docs/plugins/reporters/pretty.mdx @@ -11,7 +11,7 @@ The reporter is included by default and does not need to be installed separately ## Usage -By default, Emigrate uses the "pretty" reporter, but it can also be explicitly set by using the `--reporter` flag. +By default, Emigrate uses the "pretty" reporter, but it can also be explicitly set by using the `--reporter` flag. From 98e3ed5c1b564ffaa20a6f9e38472a3a2a6f3471 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 12 Feb 2024 03:05:23 +0000 Subject: [PATCH 104/136] chore(deps): bump pnpm/action-setup from 2.4.0 to 3.0.0 Bumps [pnpm/action-setup](https://github.com/pnpm/action-setup) from 2.4.0 to 3.0.0. - [Release notes](https://github.com/pnpm/action-setup/releases) - [Commits](https://github.com/pnpm/action-setup/compare/v2.4.0...v3.0.0) --- updated-dependencies: - dependency-name: pnpm/action-setup dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yaml | 2 +- .github/workflows/release.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e8c3a14..a71605b 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ jobs: with: fetch-depth: 2 - - uses: pnpm/action-setup@v2.4.0 + - uses: pnpm/action-setup@v3.0.0 with: version: 8.3.1 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index a06c061..898def5 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -25,7 +25,7 @@ jobs: persist-credentials: false fetch-depth: 0 - - uses: pnpm/action-setup@v2.4.0 + - uses: pnpm/action-setup@v3.0.0 with: version: 8.3.1 From 17feb2d2c271d81ce682d18b9ca1b4424522e09a Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 12 Feb 2024 13:30:08 +0100 Subject: [PATCH 105/136] fix(mysql): only unreference connections in a Bun environment as it has problems with Node for some reason --- .changeset/sharp-houses-smell.md | 5 +++++ packages/mysql/package.json | 4 +++- packages/mysql/src/index.ts | 20 ++++++++++++-------- pnpm-lock.yaml | 6 ++++++ 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 .changeset/sharp-houses-smell.md diff --git a/.changeset/sharp-houses-smell.md b/.changeset/sharp-houses-smell.md new file mode 100644 index 0000000..a2cd931 --- /dev/null +++ b/.changeset/sharp-houses-smell.md @@ -0,0 +1,5 @@ +--- +'@emigrate/mysql': patch +--- + +Only unreference connections in a Bun environment as it crashes Node for some reason, without even throwing an error that is diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 310f6c5..67cd832 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -43,7 +43,9 @@ "mysql2": "3.6.5" }, "devDependencies": { - "@emigrate/tsconfig": "workspace:*" + "@emigrate/tsconfig": "workspace:*", + "@types/bun": "1.0.5", + "bun-types": "1.0.26" }, "volta": { "extends": "../../package.json" diff --git a/packages/mysql/src/index.ts b/packages/mysql/src/index.ts index 6c009e9..cc659e6 100644 --- a/packages/mysql/src/index.ts +++ b/packages/mysql/src/index.ts @@ -171,11 +171,13 @@ export const createMysqlStorage = ({ table = defaultTable, connection }: MysqlSt async initializeStorage() { const pool = getPool(connection); - pool.on('connection', (connection) => { - // @ts-expect-error stream is not in the types but it's there - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - connection.stream.unref(); - }); + if (process.isBun) { + pool.on('connection', (connection) => { + // @ts-expect-error stream is not in the types but it's there + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + connection.stream.unref(); + }); + } await pool.query('SELECT 1'); @@ -274,9 +276,11 @@ export const createMysqlLoader = ({ connection }: MysqlLoaderOptions): LoaderPlu const contents = await fs.readFile(migration.filePath, 'utf8'); const conn = await getConnection(connection); - // @ts-expect-error the connection is not in the types but it's there - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - conn.connection.stream.unref(); + if (process.isBun) { + // @ts-expect-error the connection is not in the types but it's there + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + conn.connection.stream.unref(); + } try { await conn.query(contents); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index de45949..fd9a40c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -130,6 +130,12 @@ importers: '@emigrate/tsconfig': specifier: workspace:* version: link:../tsconfig + '@types/bun': + specifier: 1.0.5 + version: 1.0.5 + bun-types: + specifier: 1.0.26 + version: 1.0.26 packages/plugin-generate-js: dependencies: From 10653224357a8fb890e49336c7281ad3ab91e00e Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 12 Feb 2024 13:35:06 +0100 Subject: [PATCH 106/136] fix(pino): show correct statuses for the "list" and "new" commands --- .changeset/tender-timers-remember.md | 5 +++++ packages/reporter-pino/src/index.ts | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 .changeset/tender-timers-remember.md diff --git a/.changeset/tender-timers-remember.md b/.changeset/tender-timers-remember.md new file mode 100644 index 0000000..96fffba --- /dev/null +++ b/.changeset/tender-timers-remember.md @@ -0,0 +1,5 @@ +--- +'@emigrate/reporter-pino': patch +--- + +Show correct status for migrations for the "list" and "new" commands diff --git a/packages/reporter-pino/src/index.ts b/packages/reporter-pino/src/index.ts index 1e2a141..8a23570 100644 --- a/packages/reporter-pino/src/index.ts +++ b/packages/reporter-pino/src/index.ts @@ -116,12 +116,26 @@ class PinoReporter implements Required { } onMigrationStart(migration: MigrationMetadata): Awaitable { - const status = this.#command === 'up' ? 'running' : 'removing'; + let status = 'running'; + + if (this.#command === 'remove') { + status = 'removing'; + } else if (this.#command === 'new') { + status = 'creating'; + } + this.#logger.info({ migration: migration.relativeFilePath }, `${migration.name} (${status})`); } onMigrationSuccess(migration: MigrationMetadataFinished): Awaitable { - const status = this.#command === 'up' ? 'done' : 'removed'; + let status = 'done'; + + if (this.#command === 'remove') { + status = 'removed'; + } else if (this.#command === 'new') { + status = 'created'; + } + this.#logger.info({ migration: migration.relativeFilePath }, `${migration.name} (${status})`); } From ae9e8b1b045f86122436e7cf8d4caffd657e5ebb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 12 Feb 2024 12:48:26 +0000 Subject: [PATCH 107/136] chore(release): version packages --- .changeset/funny-elephants-live.md | 5 ----- .changeset/popular-points-exist.md | 5 ----- .changeset/sharp-houses-smell.md | 5 ----- .changeset/tender-timers-remember.md | 5 ----- docs/CHANGELOG.md | 10 ++++++++++ docs/package.json | 2 +- packages/mysql/CHANGELOG.md | 6 ++++++ packages/mysql/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 6 ++++++ packages/reporter-pino/package.json | 2 +- 10 files changed, 25 insertions(+), 23 deletions(-) delete mode 100644 .changeset/funny-elephants-live.md delete mode 100644 .changeset/popular-points-exist.md delete mode 100644 .changeset/sharp-houses-smell.md delete mode 100644 .changeset/tender-timers-remember.md diff --git a/.changeset/funny-elephants-live.md b/.changeset/funny-elephants-live.md deleted file mode 100644 index f629de9..0000000 --- a/.changeset/funny-elephants-live.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': major ---- - -Rename the URL path "/commands/" to "/cli/" to make it more clear that those pages are the documentation for the CLI. This change is a BREAKING CHANGE because it changes the URL path of the pages. diff --git a/.changeset/popular-points-exist.md b/.changeset/popular-points-exist.md deleted file mode 100644 index 8496b79..0000000 --- a/.changeset/popular-points-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/docs': minor ---- - -Add a separate page for the Emigrate CLI itself, with all the commands as sub pages diff --git a/.changeset/sharp-houses-smell.md b/.changeset/sharp-houses-smell.md deleted file mode 100644 index a2cd931..0000000 --- a/.changeset/sharp-houses-smell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/mysql': patch ---- - -Only unreference connections in a Bun environment as it crashes Node for some reason, without even throwing an error that is diff --git a/.changeset/tender-timers-remember.md b/.changeset/tender-timers-remember.md deleted file mode 100644 index 96fffba..0000000 --- a/.changeset/tender-timers-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/reporter-pino': patch ---- - -Show correct status for migrations for the "list" and "new" commands diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index c36d9a8..ba66044 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,15 @@ # @emigrate/docs +## 1.0.0 + +### Major Changes + +- 1d33d65: Rename the URL path "/commands/" to "/cli/" to make it more clear that those pages are the documentation for the CLI. This change is a BREAKING CHANGE because it changes the URL path of the pages. + +### Minor Changes + +- 0c597fd: Add a separate page for the Emigrate CLI itself, with all the commands as sub pages + ## 0.4.0 ### Minor Changes diff --git a/docs/package.json b/docs/package.json index 2313a81..d445425 100644 --- a/docs/package.json +++ b/docs/package.json @@ -2,7 +2,7 @@ "name": "@emigrate/docs", "private": true, "type": "module", - "version": "0.4.0", + "version": "1.0.0", "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index 3742eba..3830c42 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/mysql +## 0.2.8 + +### Patch Changes + +- 17feb2d: Only unreference connections in a Bun environment as it crashes Node for some reason, without even throwing an error that is + ## 0.2.7 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 67cd832..f3837fb 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.2.7", + "version": "0.2.8", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index f048fb2..280f20c 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/reporter-pino +## 0.6.2 + +### Patch Changes + +- 1065322: Show correct status for migrations for the "list" and "new" commands + ## 0.6.1 ### Patch Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 6c0269a..b417d19 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.6.1", + "version": "0.6.2", "publishConfig": { "access": "public", "provenance": true From 57a099169e127868d40a41aaa0a10e431d6a9fed Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 12 Feb 2024 20:56:02 +0100 Subject: [PATCH 108/136] fix(cli): cleanup AbortSignal event listeners to avoid MaxListenersExceededWarning --- .changeset/blue-candles-boil.md | 5 ++++ packages/cli/src/exec.ts | 51 ++++++++++++++++++++++----------- 2 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 .changeset/blue-candles-boil.md diff --git a/.changeset/blue-candles-boil.md b/.changeset/blue-candles-boil.md new file mode 100644 index 0000000..5d2de1d --- /dev/null +++ b/.changeset/blue-candles-boil.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Cleanup AbortSignal listeners when they are not needed to avoid MaxListenersExceededWarning when migrating many migrations at once diff --git a/packages/cli/src/exec.ts b/packages/cli/src/exec.ts index 887f737..cac2a28 100644 --- a/packages/cli/src/exec.ts +++ b/packages/cli/src/exec.ts @@ -28,6 +28,8 @@ export const exec = async >( const aborter = options.abortSignal ? getAborter(options.abortSignal, options.abortRespite) : undefined; const result = await Promise.race(aborter ? [aborter, fn()] : [fn()]); + aborter?.cancel(); + return [result, undefined]; } catch (error) { return [undefined, toError(error)]; @@ -40,27 +42,44 @@ export const exec = async >( * @param signal The abort signal to listen to * @param respite The time in milliseconds to wait before rejecting */ -const getAborter = async (signal: AbortSignal, respite = DEFAULT_RESPITE_SECONDS * 1000): Promise => { - return new Promise((_, reject) => { - if (signal.aborted) { - setTimeout( +const getAborter = ( + signal: AbortSignal, + respite = DEFAULT_RESPITE_SECONDS * 1000, +): PromiseLike & { cancel: () => void } => { + const cleanups: Array<() => void> = []; + + const aborter = new Promise((_, reject) => { + const abortListener = () => { + const timer = setTimeout( reject, respite, ExecutionDesertedError.fromReason(`Deserted after ${prettyMs(respite)}`, toError(signal.reason)), - ).unref(); + ); + timer.unref(); + cleanups.push(() => { + clearTimeout(timer); + }); + }; + + if (signal.aborted) { + abortListener(); return; } - signal.addEventListener( - 'abort', - () => { - setTimeout( - reject, - respite, - ExecutionDesertedError.fromReason(`Deserted after ${prettyMs(respite)}`, toError(signal.reason)), - ).unref(); - }, - { once: true }, - ); + signal.addEventListener('abort', abortListener, { once: true }); + + cleanups.push(() => { + signal.removeEventListener('abort', abortListener); + }); }); + + const cancel = () => { + for (const cleanup of cleanups) { + cleanup(); + } + + cleanups.length = 0; + }; + + return Object.assign(aborter, { cancel }); }; From 6c4e441eff9d026a023161c2ed87c71b9a1438b9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 12 Feb 2024 19:59:59 +0000 Subject: [PATCH 109/136] chore(release): version packages --- .changeset/blue-candles-boil.md | 5 ----- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/blue-candles-boil.md diff --git a/.changeset/blue-candles-boil.md b/.changeset/blue-candles-boil.md deleted file mode 100644 index 5d2de1d..0000000 --- a/.changeset/blue-candles-boil.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Cleanup AbortSignal listeners when they are not needed to avoid MaxListenersExceededWarning when migrating many migrations at once diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index dd7de8e..cdf27d5 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/cli +## 0.18.1 + +### Patch Changes + +- 57a0991: Cleanup AbortSignal listeners when they are not needed to avoid MaxListenersExceededWarning when migrating many migrations at once + ## 0.18.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 27817a8..bda6434 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.18.0", + "version": "0.18.1", "publishConfig": { "access": "public", "provenance": true From 6763f338ce587a854fbfc6e4c39fbac949fd0d11 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 13 Feb 2024 12:06:01 +0000 Subject: [PATCH 110/136] chore(deps): bump the commitlint group with 2 updates Bumps the commitlint group with 2 updates: [@commitlint/cli](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/cli) and [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/HEAD/@commitlint/config-conventional). Updates `@commitlint/cli` from 18.4.3 to 18.6.1 - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/cli/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v18.6.1/@commitlint/cli) Updates `@commitlint/config-conventional` from 18.4.3 to 18.6.1 - [Release notes](https://github.com/conventional-changelog/commitlint/releases) - [Changelog](https://github.com/conventional-changelog/commitlint/blob/master/@commitlint/config-conventional/CHANGELOG.md) - [Commits](https://github.com/conventional-changelog/commitlint/commits/v18.6.1/@commitlint/config-conventional) --- updated-dependencies: - dependency-name: "@commitlint/cli" dependency-type: direct:production update-type: version-update:semver-minor dependency-group: commitlint - dependency-name: "@commitlint/config-conventional" dependency-type: direct:production update-type: version-update:semver-minor dependency-group: commitlint ... Signed-off-by: dependabot[bot] --- package.json | 4 +- pnpm-lock.yaml | 321 ++++++++++++++++++++++++++++--------------------- 2 files changed, 185 insertions(+), 140 deletions(-) diff --git a/package.json b/package.json index 3a58112..a7e1419 100644 --- a/package.json +++ b/package.json @@ -71,8 +71,8 @@ }, "dependencies": { "@changesets/cli": "2.27.1", - "@commitlint/cli": "18.4.3", - "@commitlint/config-conventional": "18.4.3", + "@commitlint/cli": "18.6.1", + "@commitlint/config-conventional": "18.6.1", "@types/node": "20.10.4", "glob": "10.3.10", "husky": "8.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd9a40c..8371ed7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,11 +12,11 @@ importers: specifier: 2.27.1 version: 2.27.1 '@commitlint/cli': - specifier: 18.4.3 - version: 18.4.3(typescript@5.3.3) + specifier: 18.6.1 + version: 18.6.1(@types/node@20.10.4)(typescript@5.3.3) '@commitlint/config-conventional': - specifier: 18.4.3 - version: 18.4.3 + specifier: 18.6.1 + version: 18.6.1 '@types/node': specifier: 20.10.4 version: 20.10.4 @@ -46,7 +46,7 @@ importers: version: 5.3.3 xo: specifier: 0.56.0 - version: 0.56.0(webpack@5.89.0) + version: 0.56.0(webpack@5.90.1) docs: dependencies: @@ -786,45 +786,47 @@ packages: prettier: 2.8.8 dev: false - /@commitlint/cli@18.4.3(typescript@5.3.3): - resolution: {integrity: sha512-zop98yfB3A6NveYAZ3P1Mb6bIXuCeWgnUfVNkH4yhIMQpQfzFwseadazOuSn0OOfTt0lWuFauehpm9GcqM5lww==} + /@commitlint/cli@18.6.1(@types/node@20.10.4)(typescript@5.3.3): + resolution: {integrity: sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==} engines: {node: '>=v18'} hasBin: true dependencies: - '@commitlint/format': 18.4.3 - '@commitlint/lint': 18.4.3 - '@commitlint/load': 18.4.3(typescript@5.3.3) - '@commitlint/read': 18.4.3 - '@commitlint/types': 18.4.3 + '@commitlint/format': 18.6.1 + '@commitlint/lint': 18.6.1 + '@commitlint/load': 18.6.1(@types/node@20.10.4)(typescript@5.3.3) + '@commitlint/read': 18.6.1 + '@commitlint/types': 18.6.1 execa: 5.1.1 lodash.isfunction: 3.0.9 resolve-from: 5.0.0 resolve-global: 1.0.0 yargs: 17.7.2 transitivePeerDependencies: + - '@types/node' - typescript dev: false - /@commitlint/config-conventional@18.4.3: - resolution: {integrity: sha512-729eRRaNta7JZF07qf6SAGSghoDEp9mH7yHU0m7ff0q89W97wDrWCyZ3yoV3mcQJwbhlmVmZPTkPcm7qiAu8WA==} + /@commitlint/config-conventional@18.6.1: + resolution: {integrity: sha512-ftpfAOQyI+IHvut0cRF4EFM39PWCqde+uOXCjH9NpK6FpqfhncAbEvP0E7OIpFsrDX0aS7k81tzH5Yz7prcNxA==} engines: {node: '>=v18'} dependencies: + '@commitlint/types': 18.6.1 conventional-changelog-conventionalcommits: 7.0.2 dev: false - /@commitlint/config-validator@18.4.3: - resolution: {integrity: sha512-FPZZmTJBARPCyef9ohRC9EANiQEKSWIdatx5OlgeHKu878dWwpyeFauVkhzuBRJFcCA4Uvz/FDtlDKs008IHcA==} + /@commitlint/config-validator@18.6.1: + resolution: {integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.3 + '@commitlint/types': 18.6.1 ajv: 8.12.0 dev: false - /@commitlint/ensure@18.4.3: - resolution: {integrity: sha512-MI4fwD9TWDVn4plF5+7JUyLLbkOdzIRBmVeNlk4dcGlkrVA+/l5GLcpN66q9LkFsFv6G2X31y89ApA3hqnqIFg==} + /@commitlint/ensure@18.6.1: + resolution: {integrity: sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.3 + '@commitlint/types': 18.6.1 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -832,119 +834,118 @@ packages: lodash.upperfirst: 4.3.1 dev: false - /@commitlint/execute-rule@18.4.3: - resolution: {integrity: sha512-t7FM4c+BdX9WWZCPrrbV5+0SWLgT3kCq7e7/GhHCreYifg3V8qyvO127HF796vyFql75n4TFF+5v1asOOWkV1Q==} + /@commitlint/execute-rule@18.6.1: + resolution: {integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==} engines: {node: '>=v18'} dev: false - /@commitlint/format@18.4.3: - resolution: {integrity: sha512-8b+ItXYHxAhRAXFfYki5PpbuMMOmXYuzLxib65z2XTqki59YDQJGpJ/wB1kEE5MQDgSTQWtKUrA8n9zS/1uIDQ==} + /@commitlint/format@18.6.1: + resolution: {integrity: sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.3 + '@commitlint/types': 18.6.1 chalk: 4.1.2 dev: false - /@commitlint/is-ignored@18.4.3: - resolution: {integrity: sha512-ZseOY9UfuAI32h9w342Km4AIaTieeFskm2ZKdrG7r31+c6zGBzuny9KQhwI9puc0J3GkUquEgKJblCl7pMnjwg==} + /@commitlint/is-ignored@18.6.1: + resolution: {integrity: sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.3 - semver: 7.5.4 + '@commitlint/types': 18.6.1 + semver: 7.6.0 dev: false - /@commitlint/lint@18.4.3: - resolution: {integrity: sha512-18u3MRgEXNbnYkMOWoncvq6QB8/90m9TbERKgdPqVvS+zQ/MsuRhdvHYCIXGXZxUb0YI4DV2PC4bPneBV/fYuA==} + /@commitlint/lint@18.6.1: + resolution: {integrity: sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==} engines: {node: '>=v18'} dependencies: - '@commitlint/is-ignored': 18.4.3 - '@commitlint/parse': 18.4.3 - '@commitlint/rules': 18.4.3 - '@commitlint/types': 18.4.3 + '@commitlint/is-ignored': 18.6.1 + '@commitlint/parse': 18.6.1 + '@commitlint/rules': 18.6.1 + '@commitlint/types': 18.6.1 dev: false - /@commitlint/load@18.4.3(typescript@5.3.3): - resolution: {integrity: sha512-v6j2WhvRQJrcJaj5D+EyES2WKTxPpxENmNpNG3Ww8MZGik3jWRXtph0QTzia5ZJyPh2ib5aC/6BIDymkUUM58Q==} + /@commitlint/load@18.6.1(@types/node@20.10.4)(typescript@5.3.3): + resolution: {integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==} engines: {node: '>=v18'} dependencies: - '@commitlint/config-validator': 18.4.3 - '@commitlint/execute-rule': 18.4.3 - '@commitlint/resolve-extends': 18.4.3 - '@commitlint/types': 18.4.3 - '@types/node': 18.19.3 + '@commitlint/config-validator': 18.6.1 + '@commitlint/execute-rule': 18.6.1 + '@commitlint/resolve-extends': 18.6.1 + '@commitlint/types': 18.6.1 chalk: 4.1.2 cosmiconfig: 8.3.6(typescript@5.3.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.3.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.10.4)(cosmiconfig@8.3.6)(typescript@5.3.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 resolve-from: 5.0.0 transitivePeerDependencies: + - '@types/node' - typescript dev: false - /@commitlint/message@18.4.3: - resolution: {integrity: sha512-ddJ7AztWUIoEMAXoewx45lKEYEOeOlBVWjk8hDMUGpprkuvWULpaXczqdjwVtjrKT3JhhN+gMs8pm5G3vB2how==} + /@commitlint/message@18.6.1: + resolution: {integrity: sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==} engines: {node: '>=v18'} dev: false - /@commitlint/parse@18.4.3: - resolution: {integrity: sha512-eoH7CXM9L+/Me96KVcfJ27EIIbA5P9sqw3DqjJhRYuhaULIsPHFs5S5GBDCqT0vKZQDx0DgxhMpW6AQbnKrFtA==} + /@commitlint/parse@18.6.1: + resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 18.4.3 + '@commitlint/types': 18.6.1 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 dev: false - /@commitlint/read@18.4.3: - resolution: {integrity: sha512-H4HGxaYA6OBCimZAtghL+B+SWu8ep4X7BwgmedmqWZRHxRLcX2q0bWBtUm5FsMbluxbOfrJwOs/Z0ah4roP/GQ==} + /@commitlint/read@18.6.1: + resolution: {integrity: sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==} engines: {node: '>=v18'} dependencies: - '@commitlint/top-level': 18.4.3 - '@commitlint/types': 18.4.3 - fs-extra: 11.2.0 + '@commitlint/top-level': 18.6.1 + '@commitlint/types': 18.6.1 git-raw-commits: 2.0.11 minimist: 1.2.8 dev: false - /@commitlint/resolve-extends@18.4.3: - resolution: {integrity: sha512-30sk04LZWf8+SDgJrbJCjM90gTg2LxsD9cykCFeFu+JFHvBFq5ugzp2eO/DJGylAdVaqxej3c7eTSE64hR/lnw==} + /@commitlint/resolve-extends@18.6.1: + resolution: {integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==} engines: {node: '>=v18'} dependencies: - '@commitlint/config-validator': 18.4.3 - '@commitlint/types': 18.4.3 + '@commitlint/config-validator': 18.6.1 + '@commitlint/types': 18.6.1 import-fresh: 3.3.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 resolve-global: 1.0.0 dev: false - /@commitlint/rules@18.4.3: - resolution: {integrity: sha512-8KIeukDf45BiY+Lul1T0imSNXF0sMrlLG6JpLLKolkmYVQ6PxxoNOriwyZ3UTFFpaVbPy0rcITaV7U9JCAfDTA==} + /@commitlint/rules@18.6.1: + resolution: {integrity: sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==} engines: {node: '>=v18'} dependencies: - '@commitlint/ensure': 18.4.3 - '@commitlint/message': 18.4.3 - '@commitlint/to-lines': 18.4.3 - '@commitlint/types': 18.4.3 + '@commitlint/ensure': 18.6.1 + '@commitlint/message': 18.6.1 + '@commitlint/to-lines': 18.6.1 + '@commitlint/types': 18.6.1 execa: 5.1.1 dev: false - /@commitlint/to-lines@18.4.3: - resolution: {integrity: sha512-fy1TAleik4Zfru1RJ8ZU6cOSvgSVhUellxd3WZV1D5RwHZETt1sZdcA4mQN2y3VcIZsUNKkW0Mq8CM9/L9harQ==} + /@commitlint/to-lines@18.6.1: + resolution: {integrity: sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==} engines: {node: '>=v18'} dev: false - /@commitlint/top-level@18.4.3: - resolution: {integrity: sha512-E6fJPBLPFL5R8+XUNSYkj4HekIOuGMyJo3mIx2PkYc3clel+pcWQ7TConqXxNWW4x1ugigiIY2RGot55qUq1hw==} + /@commitlint/top-level@18.6.1: + resolution: {integrity: sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==} engines: {node: '>=v18'} dependencies: find-up: 5.0.0 dev: false - /@commitlint/types@18.4.3: - resolution: {integrity: sha512-cvzx+vtY/I2hVBZHCLrpoh+sA0hfuzHwDc+BAFPimYLjJkpHnghQM+z8W/KyLGkygJh3BtI3xXXq+dKjnSWEmA==} + /@commitlint/types@18.6.1: + resolution: {integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==} engines: {node: '>=v18'} dependencies: chalk: 4.1.2 @@ -1484,7 +1485,7 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 dev: false /@jridgewell/sourcemap-codec@1.4.15: @@ -1498,6 +1499,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: false + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + /@manypkg/find-root@1.1.0: resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} dependencies: @@ -1786,7 +1794,7 @@ packages: /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: - '@types/eslint': 8.44.9 + '@types/eslint': 8.56.2 '@types/estree': 1.0.5 dev: false @@ -1797,8 +1805,8 @@ packages: '@types/json-schema': 7.0.15 dev: false - /@types/eslint@8.44.9: - resolution: {integrity: sha512-6yBxcvwnnYoYT1Uk2d+jvIfsuP4mb2EdIxFnrPABj5a/838qe5bGkNLFOiipX4ULQ7XVQvTxOh7jO+BTAiqsEw==} + /@types/eslint@8.56.2: + resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -1866,12 +1874,6 @@ packages: resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} dev: false - /@types/node@18.19.3: - resolution: {integrity: sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==} - dependencies: - undici-types: 5.26.5 - dev: false - /@types/node@20.10.4: resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} dependencies: @@ -2179,12 +2181,12 @@ packages: event-target-shim: 5.0.1 dev: false - /acorn-import-assertions@1.9.0(acorn@8.11.2): + /acorn-import-assertions@1.9.0(acorn@8.11.3): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.11.2 + acorn: 8.11.3 dev: false /acorn-jsx@5.3.2(acorn@8.11.2): @@ -2201,6 +2203,12 @@ packages: hasBin: true dev: false + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + /ajv-keywords@3.5.2(ajv@6.12.6): resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -2646,6 +2654,17 @@ packages: update-browserslist-db: 1.0.13(browserslist@4.22.2) dev: false + /browserslist@4.22.3: + resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001587 + electron-to-chromium: 1.4.667 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.22.3) + dev: false + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} dev: false @@ -2730,6 +2749,10 @@ packages: resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} dev: false + /caniuse-lite@1.0.30001587: + resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==} + dev: false + /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} dev: false @@ -2839,7 +2862,7 @@ packages: engines: {node: '>=18'} dependencies: slice-ansi: 5.0.0 - string-width: 7.0.0 + string-width: 7.1.0 dev: false /cliui@6.0.0: @@ -2988,7 +3011,7 @@ packages: engines: {node: '>= 0.6'} dev: false - /cosmiconfig-typescript-loader@5.0.0(@types/node@18.19.3)(cosmiconfig@8.3.6)(typescript@5.3.3): + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.4)(cosmiconfig@8.3.6)(typescript@5.3.3): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} peerDependencies: @@ -2996,7 +3019,7 @@ packages: cosmiconfig: '>=8.2' typescript: '>=4' dependencies: - '@types/node': 18.19.3 + '@types/node': 20.10.4 cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.21.0 typescript: 5.3.3 @@ -3316,6 +3339,10 @@ packages: resolution: {integrity: sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==} dev: false + /electron-to-chromium@1.4.667: + resolution: {integrity: sha512-66L3pLlWhTNVUhnmSA5+qDM3fwnXsM6KAqE36e2w4KN0g6pkEtlT5bs41FQtQwVwKnfhNBXiWRLPs30HSxd7Kw==} + dev: false + /elegant-spinner@3.0.0: resolution: {integrity: sha512-nWUuor3FWTGYAch7SY0unb5qLzs7eAc24ic9PBh+eQctFNQ4IDWJqBpBgsL4SrrGHHN0mJoL7CpWZby5t2KjFg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -3453,7 +3480,7 @@ packages: /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.1 dev: false /es-to-primitive@1.2.1: @@ -3531,6 +3558,11 @@ packages: engines: {node: '>=6'} dev: false + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: false + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -3604,7 +3636,7 @@ packages: - supports-color dev: false - /eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.89.0): + /eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1): resolution: {integrity: sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA==} engines: {node: '>= 6'} peerDependencies: @@ -3616,14 +3648,14 @@ packages: enhanced-resolve: 0.9.1 eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0) find-root: 1.1.0 - hasown: 2.0.0 + hasown: 2.0.1 interpret: 1.4.0 is-core-module: 2.13.1 is-regex: 1.1.4 lodash: 4.17.21 resolve: 2.0.0-next.5 semver: 5.7.2 - webpack: 5.89.0 + webpack: 5.90.1 transitivePeerDependencies: - supports-color dev: false @@ -3653,7 +3685,7 @@ packages: debug: 3.2.7 eslint: 8.53.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.89.0) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1) transitivePeerDependencies: - supports-color dev: false @@ -4023,7 +4055,7 @@ packages: human-signals: 4.3.1 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.1.0 + npm-run-path: 5.2.0 onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 @@ -4038,7 +4070,7 @@ packages: human-signals: 5.0.0 is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 5.1.0 + npm-run-path: 5.2.0 onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 @@ -4228,15 +4260,6 @@ packages: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false - /fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - dev: false - /fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -4552,6 +4575,13 @@ packages: function-bind: 1.1.2 dev: false + /hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + /hast-util-from-html@2.0.1: resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} dependencies: @@ -5028,7 +5058,7 @@ packages: /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - hasown: 2.0.0 + hasown: 2.0.1 dev: false /is-date-object@1.0.5: @@ -5416,14 +5446,6 @@ packages: graceful-fs: 4.2.11 dev: false - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - dev: false - /jsonparse@1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} @@ -6522,7 +6544,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.5.4 + semver: 7.6.0 validate-npm-package-license: 3.0.4 dev: false @@ -6563,8 +6585,8 @@ packages: path-key: 3.1.1 dev: false - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + /npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 @@ -7690,6 +7712,14 @@ packages: lru-cache: 6.0.0 dev: false + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + /seq-queue@0.0.5: resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} dev: false @@ -7701,8 +7731,8 @@ packages: type-fest: 2.19.0 dev: false - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 dev: false @@ -8036,6 +8066,15 @@ packages: strip-ansi: 7.1.0 dev: false + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: false + /string.prototype.padend@3.1.5: resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} engines: {node: '>= 0.4'} @@ -8284,8 +8323,8 @@ packages: engines: {node: '>=8'} dev: false - /terser-webpack-plugin@5.3.9(webpack@5.89.0): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + /terser-webpack-plugin@5.3.10(webpack@5.90.1): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -8300,21 +8339,21 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.22 jest-worker: 27.5.1 schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.26.0 - webpack: 5.89.0 + serialize-javascript: 6.0.2 + terser: 5.27.0 + webpack: 5.90.1 dev: false - /terser@5.26.0: - resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} + /terser@5.27.0: + resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} engines: {node: '>=10'} hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.11.2 + acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 dev: false @@ -8773,11 +8812,6 @@ packages: engines: {node: '>= 4.0.0'} dev: false - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: false - /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -8794,6 +8828,17 @@ packages: picocolors: 1.0.0 dev: false + /update-browserslist-db@1.0.13(browserslist@4.22.3): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.3 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -8938,8 +8983,8 @@ packages: engines: {node: '>=10.13.0'} dev: false - /webpack@5.89.0: - resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + /webpack@5.90.1: + resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -8953,9 +8998,9 @@ packages: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/wasm-edit': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.22.2 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.22.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.4.1 @@ -8969,7 +9014,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.89.0) + terser-webpack-plugin: 5.3.10(webpack@5.90.1) watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -9086,7 +9131,7 @@ packages: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} dev: false - /xo@0.56.0(webpack@5.89.0): + /xo@0.56.0(webpack@5.90.1): resolution: {integrity: sha512-ohzSqgQ8POgZ3KNaEK/gxDovb6h3cglxv8+xi9Dn7gmRe8g4qotpOZpMs5ACJhvkJDmJOhiKbk6Uq6Mx1Di9DA==} engines: {node: '>=16'} hasBin: true @@ -9107,7 +9152,7 @@ packages: eslint-config-xo: 0.43.1(eslint@8.53.0) eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3) eslint-formatter-pretty: 5.0.0 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.89.0) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1) eslint-plugin-ava: 14.0.0(eslint@8.53.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.53.0) eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0) @@ -9132,7 +9177,7 @@ packages: slash: 5.1.0 to-absolute-glob: 3.0.0 typescript: 5.3.3 - webpack: 5.89.0 + webpack: 5.90.1 transitivePeerDependencies: - '@types/eslint' - eslint-import-resolver-typescript @@ -9205,7 +9250,7 @@ packages: engines: {node: '>=12'} dependencies: cliui: 8.0.1 - escalade: 3.1.1 + escalade: 3.1.2 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 From 41522094dd6390e5cb5a82f30826ac130422e967 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 19 Feb 2024 09:25:56 +0100 Subject: [PATCH 111/136] fix(cli): handle the case where the config is returned as an object with a nested `default` property --- .changeset/old-pigs-dance.md | 5 +++++ packages/cli/src/get-config.ts | 14 +++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .changeset/old-pigs-dance.md diff --git a/.changeset/old-pigs-dance.md b/.changeset/old-pigs-dance.md new file mode 100644 index 0000000..95a0442 --- /dev/null +++ b/.changeset/old-pigs-dance.md @@ -0,0 +1,5 @@ +--- +'@emigrate/cli': patch +--- + +Handle the case where the config is returned as an object with a nested `default` property diff --git a/packages/cli/src/get-config.ts b/packages/cli/src/get-config.ts index 4db33a7..f70fac9 100644 --- a/packages/cli/src/get-config.ts +++ b/packages/cli/src/get-config.ts @@ -6,6 +6,18 @@ const commands = ['up', 'list', 'new', 'remove'] as const; type Command = (typeof commands)[number]; const canImportTypeScriptAsIs = Boolean(process.isBun) || typeof Deno !== 'undefined'; +const getEmigrateConfig = (config: any): EmigrateConfig => { + if ('default' in config && typeof config.default === 'object' && config.default !== null) { + return config.default as EmigrateConfig; + } + + if (typeof config === 'object' && config !== null) { + return config as EmigrateConfig; + } + + return {}; +}; + export const getConfig = async (command: Command, forceImportTypeScriptAsIs = false): Promise => { const explorer = cosmiconfig('emigrate', { // eslint-disable-next-line @typescript-eslint/naming-convention @@ -18,7 +30,7 @@ export const getConfig = async (command: Command, forceImportTypeScriptAsIs = fa return {}; } - const config = result.config as EmigrateConfig; + const config = getEmigrateConfig(result.config); const commandConfig = config[command]; From d1bd8fc74f2c073824afec5a0a4de5da9268e326 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 19 Feb 2024 09:59:34 +0000 Subject: [PATCH 112/136] chore(release): version packages --- .changeset/old-pigs-dance.md | 5 ----- packages/cli/CHANGELOG.md | 6 ++++++ packages/cli/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/old-pigs-dance.md diff --git a/.changeset/old-pigs-dance.md b/.changeset/old-pigs-dance.md deleted file mode 100644 index 95a0442..0000000 --- a/.changeset/old-pigs-dance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/cli': patch ---- - -Handle the case where the config is returned as an object with a nested `default` property diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index cdf27d5..8d872a9 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/cli +## 0.18.2 + +### Patch Changes + +- 4152209: Handle the case where the config is returned as an object with a nested `default` property + ## 0.18.1 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index bda6434..a7c0579 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.18.1", + "version": "0.18.2", "publishConfig": { "access": "public", "provenance": true From 520fdd94ef8123007f080d1c8d98ee6143025ae4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Mar 2024 09:22:09 +0000 Subject: [PATCH 113/136] chore(deps): bump changesets/action from 1.4.5 to 1.4.6 Bumps [changesets/action](https://github.com/changesets/action) from 1.4.5 to 1.4.6. - [Release notes](https://github.com/changesets/action/releases) - [Changelog](https://github.com/changesets/action/blob/main/CHANGELOG.md) - [Commits](https://github.com/changesets/action/compare/v1.4.5...v1.4.6) --- updated-dependencies: - dependency-name: changesets/action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 898def5..adc6786 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -39,7 +39,7 @@ jobs: run: pnpm install - name: Create Release Pull Request - uses: changesets/action@v1.4.5 + uses: changesets/action@v1.4.6 with: publish: pnpm run release commit: 'chore(release): version packages' From 081ab34cb4f47f675f578d619cc130c9c8ea2d98 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 4 Apr 2024 14:43:38 +0200 Subject: [PATCH 114/136] fix(reporter-pino): make sure the Pino reporter outputs logs in Bun environments --- .changeset/afraid-rules-wait.md | 5 +++++ packages/reporter-pino/package.json | 4 +++- packages/reporter-pino/src/index.ts | 1 + pnpm-lock.yaml | 6 ++++++ 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 .changeset/afraid-rules-wait.md diff --git a/.changeset/afraid-rules-wait.md b/.changeset/afraid-rules-wait.md new file mode 100644 index 0000000..2365b49 --- /dev/null +++ b/.changeset/afraid-rules-wait.md @@ -0,0 +1,5 @@ +--- +'@emigrate/reporter-pino': patch +--- + +Make sure Pino outputs logs in Bun environments diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index b417d19..0ac7a26 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -40,7 +40,9 @@ "pino": "8.16.2" }, "devDependencies": { - "@emigrate/tsconfig": "workspace:*" + "@emigrate/tsconfig": "workspace:*", + "@types/bun": "1.0.5", + "bun-types": "1.0.26" }, "volta": { "extends": "../../package.json" diff --git a/packages/reporter-pino/src/index.ts b/packages/reporter-pino/src/index.ts index 8a23570..690b628 100644 --- a/packages/reporter-pino/src/index.ts +++ b/packages/reporter-pino/src/index.ts @@ -52,6 +52,7 @@ class PinoReporter implements Required { scope: command, version, }, + transport: process.isBun ? { target: 'pino/file', options: { destination: 1 } } : undefined, }); this.#logger.info({ parameters }, `Emigrate "${command}" initialized${parameters.dry ? ' (dry-run)' : ''}`); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8371ed7..d6a9a95 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -191,6 +191,12 @@ importers: '@emigrate/tsconfig': specifier: workspace:* version: link:../tsconfig + '@types/bun': + specifier: 1.0.5 + version: 1.0.5 + bun-types: + specifier: 1.0.26 + version: 1.0.26 packages/storage-fs: dependencies: From e396266f3d35f5d04f84ee5a099071bee27880df Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 4 Apr 2024 12:44:51 +0000 Subject: [PATCH 115/136] chore(release): version packages --- .changeset/afraid-rules-wait.md | 5 ----- packages/reporter-pino/CHANGELOG.md | 6 ++++++ packages/reporter-pino/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/afraid-rules-wait.md diff --git a/.changeset/afraid-rules-wait.md b/.changeset/afraid-rules-wait.md deleted file mode 100644 index 2365b49..0000000 --- a/.changeset/afraid-rules-wait.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/reporter-pino': patch ---- - -Make sure Pino outputs logs in Bun environments diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index 280f20c..765a84b 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/reporter-pino +## 0.6.3 + +### Patch Changes + +- 081ab34: Make sure Pino outputs logs in Bun environments + ## 0.6.2 ### Patch Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 0ac7a26..0205002 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.6.2", + "version": "0.6.3", "publishConfig": { "access": "public", "provenance": true From aef2d7c861964d018aff72b7c9b90faf13c1ddfc Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Wed, 29 May 2024 15:06:10 +0200 Subject: [PATCH 116/136] fix(mysql): handle table initialization better in clustered database environments The CREATE TABLE IF NOT EXISTS yields more locks than checking if the table exists using a SELECT first before running CREATE TABLE. This makes more sense as the table usually already exists, so we optimize for the happy path. --- .changeset/thirty-beds-fetch.md | 5 +++++ packages/mysql/src/index.ts | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 .changeset/thirty-beds-fetch.md diff --git a/.changeset/thirty-beds-fetch.md b/.changeset/thirty-beds-fetch.md new file mode 100644 index 0000000..9819f69 --- /dev/null +++ b/.changeset/thirty-beds-fetch.md @@ -0,0 +1,5 @@ +--- +'@emigrate/mysql': patch +--- + +Avoid "CREATE TABLE IF NOT EXISTS" as it's too locking in a clustered database when running it concurrently diff --git a/packages/mysql/src/index.ts b/packages/mysql/src/index.ts index cc659e6..2a1354e 100644 --- a/packages/mysql/src/index.ts +++ b/packages/mysql/src/index.ts @@ -156,9 +156,26 @@ const deleteMigration = async (pool: Pool, table: string, migration: MigrationMe }; const initializeTable = async (pool: Pool, table: string) => { + const [result] = await pool.execute({ + sql: ` + SELECT + 1 as table_exists + FROM + information_schema.tables + WHERE + table_schema = DATABASE() + AND table_name = ? + `, + values: [table], + }); + + if (result[0]?.['table_exists']) { + return; + } + // This table definition is compatible with the one used by the immigration-mysql package await pool.execute(` - CREATE TABLE IF NOT EXISTS ${escapeId(table)} ( + CREATE TABLE ${escapeId(table)} ( name varchar(255) not null primary key, status varchar(32), date datetime not null From 44426042cf58cbf47088ac90d4ff9696b78894c6 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Wed, 29 May 2024 15:56:21 +0200 Subject: [PATCH 117/136] feat(mysql,postgres): automatically create the database if it doesn't exist (fixes #147) --- .changeset/seven-wasps-happen.md | 6 +++ packages/mysql/src/index.ts | 65 +++++++++++++++++++++++++++++++- packages/postgres/src/index.ts | 60 +++++++++++++++++++++++++++++ 3 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 .changeset/seven-wasps-happen.md diff --git a/.changeset/seven-wasps-happen.md b/.changeset/seven-wasps-happen.md new file mode 100644 index 0000000..366e79d --- /dev/null +++ b/.changeset/seven-wasps-happen.md @@ -0,0 +1,6 @@ +--- +'@emigrate/postgres': minor +'@emigrate/mysql': minor +--- + +Automatically create the database if it doesn't exist, and the user have the permissions to do so diff --git a/packages/mysql/src/index.ts b/packages/mysql/src/index.ts index 2a1354e..5b97560 100644 --- a/packages/mysql/src/index.ts +++ b/packages/mysql/src/index.ts @@ -9,6 +9,7 @@ import { type Pool, type ResultSetHeader, type RowDataPacket, + type Connection, } from 'mysql2/promise'; import { getTimestampPrefix, sanitizeMigrationName } from '@emigrate/plugin-tools'; import { @@ -155,6 +156,66 @@ const deleteMigration = async (pool: Pool, table: string, migration: MigrationMe return result.affectedRows === 1; }; +const getDatabaseName = (config: ConnectionOptions | string) => { + if (typeof config === 'string') { + const uri = new URL(config); + + return uri.pathname.replace(/^\//u, ''); + } + + return config.database ?? ''; +}; + +const setDatabaseName = (config: T, databaseName: string): T => { + if (typeof config === 'string') { + const uri = new URL(config); + + uri.pathname = `/${databaseName}`; + + return uri.toString() as T; + } + + if (typeof config === 'object') { + return { + ...config, + database: databaseName, + }; + } + + throw new Error('Invalid connection config'); +}; + +const initializeDatabase = async (config: ConnectionOptions | string) => { + let connection: Connection | undefined; + + try { + connection = await getConnection(config); + await connection.query('SELECT 1'); + await connection.end(); + } catch (error) { + await connection?.end(); + + // The ER_BAD_DB_ERROR error code is thrown when the database does not exist but the user might have the permissions to create it + // Otherwise the error code is ER_DBACCESS_DENIED_ERROR + if (error && typeof error === 'object' && 'code' in error && error.code === 'ER_BAD_DB_ERROR') { + const databaseName = getDatabaseName(config); + + const informationSchemaConfig = setDatabaseName(config, 'information_schema'); + + const informationSchemaConnection = await getConnection(informationSchemaConfig); + try { + await informationSchemaConnection.query(`CREATE DATABASE ${escapeId(databaseName)}`); + // Any database creation error here will be propagated + } finally { + await informationSchemaConnection.end(); + } + } else { + // In this case we don't know how to handle the error, so we rethrow it + throw error; + } + } +}; + const initializeTable = async (pool: Pool, table: string) => { const [result] = await pool.execute({ sql: ` @@ -186,6 +247,8 @@ const initializeTable = async (pool: Pool, table: string) => { export const createMysqlStorage = ({ table = defaultTable, connection }: MysqlStorageOptions): EmigrateStorage => { return { async initializeStorage() { + await initializeDatabase(connection); + const pool = getPool(connection); if (process.isBun) { @@ -196,8 +259,6 @@ export const createMysqlStorage = ({ table = defaultTable, connection }: MysqlSt }); } - await pool.query('SELECT 1'); - try { await initializeTable(pool, table); } catch (error) { diff --git a/packages/postgres/src/index.ts b/packages/postgres/src/index.ts index b6e3e4c..44af95b 100644 --- a/packages/postgres/src/index.ts +++ b/packages/postgres/src/index.ts @@ -92,6 +92,64 @@ const deleteMigration = async (sql: Sql, table: string, migration: MigrationMeta return result.count === 1; }; +const getDatabaseName = (config: ConnectionOptions | string) => { + if (typeof config === 'string') { + const uri = new URL(config); + + return uri.pathname.replace(/^\//u, ''); + } + + return config.database ?? ''; +}; + +const setDatabaseName = (config: T, databaseName: string): T => { + if (typeof config === 'string') { + const uri = new URL(config); + + uri.pathname = `/${databaseName}`; + + return uri.toString() as T; + } + + if (typeof config === 'object') { + return { + ...config, + database: databaseName, + }; + } + + throw new Error('Invalid connection config'); +}; + +const initializeDatabase = async (config: ConnectionOptions | string) => { + let sql: Sql | undefined; + + try { + sql = await getPool(config); + await sql.end(); + } catch (error) { + await sql?.end(); + + // The error code 3D000 means that the database does not exist, but the user might have the permissions to create it + if (error && typeof error === 'object' && 'code' in error && error.code === '3D000') { + const databaseName = getDatabaseName(config); + + const postgresConfig = setDatabaseName(config, 'postgres'); + + const postgresSql = await getPool(postgresConfig); + try { + await postgresSql`CREATE DATABASE ${postgresSql(databaseName)}`; + // Any database creation error here will be propagated + } finally { + await postgresSql.end(); + } + } else { + // In this case we don't know how to handle the error, so we rethrow it + throw error; + } + } +}; + const initializeTable = async (sql: Sql, table: string) => { const [row] = await sql>` SELECT 1 as exists @@ -122,6 +180,8 @@ export const createPostgresStorage = ({ }: PostgresStorageOptions): EmigrateStorage => { return { async initializeStorage() { + await initializeDatabase(connection); + const sql = await getPool(connection); try { From f300f147faf2dcad2fbc82984dab22fdd50fbde8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 29 May 2024 14:20:01 +0000 Subject: [PATCH 118/136] chore(release): version packages --- .changeset/seven-wasps-happen.md | 6 ------ .changeset/thirty-beds-fetch.md | 5 ----- packages/mysql/CHANGELOG.md | 10 ++++++++++ packages/mysql/package.json | 2 +- packages/postgres/CHANGELOG.md | 6 ++++++ packages/postgres/package.json | 2 +- 6 files changed, 18 insertions(+), 13 deletions(-) delete mode 100644 .changeset/seven-wasps-happen.md delete mode 100644 .changeset/thirty-beds-fetch.md diff --git a/.changeset/seven-wasps-happen.md b/.changeset/seven-wasps-happen.md deleted file mode 100644 index 366e79d..0000000 --- a/.changeset/seven-wasps-happen.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@emigrate/postgres': minor -'@emigrate/mysql': minor ---- - -Automatically create the database if it doesn't exist, and the user have the permissions to do so diff --git a/.changeset/thirty-beds-fetch.md b/.changeset/thirty-beds-fetch.md deleted file mode 100644 index 9819f69..0000000 --- a/.changeset/thirty-beds-fetch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/mysql': patch ---- - -Avoid "CREATE TABLE IF NOT EXISTS" as it's too locking in a clustered database when running it concurrently diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index 3830c42..3720b66 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,15 @@ # @emigrate/mysql +## 0.3.0 + +### Minor Changes + +- 4442604: Automatically create the database if it doesn't exist, and the user have the permissions to do so + +### Patch Changes + +- aef2d7c: Avoid "CREATE TABLE IF NOT EXISTS" as it's too locking in a clustered database when running it concurrently + ## 0.2.8 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index f3837fb..8c92a2d 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.2.8", + "version": "0.3.0", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index 67dbb5a..7ddd588 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/postgres +## 0.3.0 + +### Minor Changes + +- 4442604: Automatically create the database if it doesn't exist, and the user have the permissions to do so + ## 0.2.6 ### Patch Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 2c40b67..ccd8997 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.2.6", + "version": "0.3.0", "publishConfig": { "access": "public", "provenance": true From ca154fadeb87ada6610bb7c8b8b10dc6dc73d4e5 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 30 May 2024 10:09:32 +0200 Subject: [PATCH 119/136] fix: exclude tsbuildinfo files from published packages for smaller bundles --- .changeset/pretty-actors-prove.md | 11 +++++++++++ packages/cli/package.json | 3 ++- packages/mysql/package.json | 3 ++- packages/plugin-tools/package.json | 3 ++- packages/postgres/package.json | 3 ++- packages/reporter-pino/package.json | 3 ++- packages/storage-fs/package.json | 3 ++- packages/types/package.json | 3 ++- 8 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 .changeset/pretty-actors-prove.md diff --git a/.changeset/pretty-actors-prove.md b/.changeset/pretty-actors-prove.md new file mode 100644 index 0000000..01d20d3 --- /dev/null +++ b/.changeset/pretty-actors-prove.md @@ -0,0 +1,11 @@ +--- +'@emigrate/reporter-pino': patch +'@emigrate/plugin-tools': patch +'@emigrate/storage-fs': patch +'@emigrate/postgres': patch +'@emigrate/mysql': patch +'@emigrate/types': patch +'@emigrate/cli': patch +--- + +Minimize package size by excluding \*.tsbuildinfo files diff --git a/packages/cli/package.json b/packages/cli/package.json index a7c0579..1c49194 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -19,7 +19,8 @@ "emigrate": "dist/cli.js" }, "files": [ - "dist" + "dist", + "!dist/*.tsbuildinfo" ], "scripts": { "build": "tsc --pretty", diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 8c92a2d..4073107 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -16,7 +16,8 @@ } }, "files": [ - "dist" + "dist", + "!dist/*.tsbuildinfo" ], "scripts": { "build": "tsc --pretty", diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index 6237b13..484a8e1 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -16,7 +16,8 @@ } }, "files": [ - "dist" + "dist", + "!dist/*.tsbuildinfo" ], "scripts": { "build": "tsc --pretty", diff --git a/packages/postgres/package.json b/packages/postgres/package.json index ccd8997..5bd9f7e 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -16,7 +16,8 @@ } }, "files": [ - "dist" + "dist", + "!dist/*.tsbuildinfo" ], "scripts": { "build": "tsc --pretty", diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index 0205002..acf5b50 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -16,7 +16,8 @@ } }, "files": [ - "dist" + "dist", + "!dist/*.tsbuildinfo" ], "scripts": { "build": "tsc --pretty", diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index 0f15617..be03133 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -16,7 +16,8 @@ } }, "files": [ - "dist" + "dist", + "!dist/*.tsbuildinfo" ], "scripts": { "build": "tsc --pretty", diff --git a/packages/types/package.json b/packages/types/package.json index 666a252..1c4ed5b 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -16,7 +16,8 @@ } }, "files": [ - "dist" + "dist", + "!dist/*.tsbuildinfo" ], "scripts": { "build": "tsc --pretty", From cf620a191d699072ef3486d5960af391f1d8e4ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 30 May 2024 08:13:02 +0000 Subject: [PATCH 120/136] chore(release): version packages --- .changeset/pretty-actors-prove.md | 11 ----------- packages/cli/CHANGELOG.md | 9 +++++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 9 +++++++++ packages/mysql/package.json | 2 +- packages/plugin-generate-js/CHANGELOG.md | 8 ++++++++ packages/plugin-generate-js/package.json | 2 +- packages/plugin-tools/CHANGELOG.md | 8 ++++++++ packages/plugin-tools/package.json | 2 +- packages/postgres/CHANGELOG.md | 9 +++++++++ packages/postgres/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 8 ++++++++ packages/reporter-pino/package.json | 2 +- packages/storage-fs/CHANGELOG.md | 8 ++++++++ packages/storage-fs/package.json | 2 +- packages/types/CHANGELOG.md | 6 ++++++ packages/types/package.json | 2 +- 17 files changed, 73 insertions(+), 19 deletions(-) delete mode 100644 .changeset/pretty-actors-prove.md diff --git a/.changeset/pretty-actors-prove.md b/.changeset/pretty-actors-prove.md deleted file mode 100644 index 01d20d3..0000000 --- a/.changeset/pretty-actors-prove.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -'@emigrate/reporter-pino': patch -'@emigrate/plugin-tools': patch -'@emigrate/storage-fs': patch -'@emigrate/postgres': patch -'@emigrate/mysql': patch -'@emigrate/types': patch -'@emigrate/cli': patch ---- - -Minimize package size by excluding \*.tsbuildinfo files diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 8d872a9..2743465 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,14 @@ # @emigrate/cli +## 0.18.3 + +### Patch Changes + +- ca154fa: Minimize package size by excluding \*.tsbuildinfo files +- Updated dependencies [ca154fa] + - @emigrate/plugin-tools@0.9.7 + - @emigrate/types@0.12.2 + ## 0.18.2 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 1c49194..61b513e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.18.2", + "version": "0.18.3", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index 3720b66..c18a11d 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,14 @@ # @emigrate/mysql +## 0.3.1 + +### Patch Changes + +- ca154fa: Minimize package size by excluding \*.tsbuildinfo files +- Updated dependencies [ca154fa] + - @emigrate/plugin-tools@0.9.7 + - @emigrate/types@0.12.2 + ## 0.3.0 ### Minor Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 4073107..afa751d 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.3.0", + "version": "0.3.1", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/plugin-generate-js/CHANGELOG.md b/packages/plugin-generate-js/CHANGELOG.md index 04b0a8e..1809ad4 100644 --- a/packages/plugin-generate-js/CHANGELOG.md +++ b/packages/plugin-generate-js/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-generate-js +## 0.3.7 + +### Patch Changes + +- Updated dependencies [ca154fa] + - @emigrate/plugin-tools@0.9.7 + - @emigrate/types@0.12.2 + ## 0.3.6 ### Patch Changes diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index 936e097..da3d174 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-generate-js", - "version": "0.3.6", + "version": "0.3.7", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-tools/CHANGELOG.md b/packages/plugin-tools/CHANGELOG.md index f169f02..6028801 100644 --- a/packages/plugin-tools/CHANGELOG.md +++ b/packages/plugin-tools/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-tools +## 0.9.7 + +### Patch Changes + +- ca154fa: Minimize package size by excluding \*.tsbuildinfo files +- Updated dependencies [ca154fa] + - @emigrate/types@0.12.2 + ## 0.9.6 ### Patch Changes diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index 484a8e1..46dc18d 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-tools", - "version": "0.9.6", + "version": "0.9.7", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index 7ddd588..726b5cb 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,14 @@ # @emigrate/postgres +## 0.3.1 + +### Patch Changes + +- ca154fa: Minimize package size by excluding \*.tsbuildinfo files +- Updated dependencies [ca154fa] + - @emigrate/plugin-tools@0.9.7 + - @emigrate/types@0.12.2 + ## 0.3.0 ### Minor Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 5bd9f7e..5b870b0 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.3.0", + "version": "0.3.1", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index 765a84b..fff8c18 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/reporter-pino +## 0.6.4 + +### Patch Changes + +- ca154fa: Minimize package size by excluding \*.tsbuildinfo files +- Updated dependencies [ca154fa] + - @emigrate/types@0.12.2 + ## 0.6.3 ### Patch Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index acf5b50..a2ed264 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.6.3", + "version": "0.6.4", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/storage-fs/CHANGELOG.md b/packages/storage-fs/CHANGELOG.md index 788ac24..299c68a 100644 --- a/packages/storage-fs/CHANGELOG.md +++ b/packages/storage-fs/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/storage-fs +## 0.4.7 + +### Patch Changes + +- ca154fa: Minimize package size by excluding \*.tsbuildinfo files +- Updated dependencies [ca154fa] + - @emigrate/types@0.12.2 + ## 0.4.6 ### Patch Changes diff --git a/packages/storage-fs/package.json b/packages/storage-fs/package.json index be03133..8bc1a05 100644 --- a/packages/storage-fs/package.json +++ b/packages/storage-fs/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/storage-fs", - "version": "0.4.6", + "version": "0.4.7", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index df62e7e..dd9ade2 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/types +## 0.12.2 + +### Patch Changes + +- ca154fa: Minimize package size by excluding \*.tsbuildinfo files + ## 0.12.1 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 1c4ed5b..6b4e32d 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/types", - "version": "0.12.1", + "version": "0.12.2", "publishConfig": { "access": "public", "provenance": true From 57498db2487e179b0989a6712bf285fcdb505edb Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Mon, 24 Jun 2024 15:50:50 +0200 Subject: [PATCH 121/136] fix(mysql): close database connections gracefully when using Bun --- .changeset/gentle-yaks-cough.md | 5 +++++ packages/mysql/package.json | 4 ++-- packages/mysql/src/index.ts | 40 ++++++++++++++++++--------------- pnpm-lock.yaml | 27 ++++++++++++++++++---- 4 files changed, 52 insertions(+), 24 deletions(-) create mode 100644 .changeset/gentle-yaks-cough.md diff --git a/.changeset/gentle-yaks-cough.md b/.changeset/gentle-yaks-cough.md new file mode 100644 index 0000000..87769ca --- /dev/null +++ b/.changeset/gentle-yaks-cough.md @@ -0,0 +1,5 @@ +--- +'@emigrate/mysql': patch +--- + +Unreference all connections when run using Bun, to not keep the process open unnecessarily long diff --git a/packages/mysql/package.json b/packages/mysql/package.json index afa751d..e162e75 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -45,8 +45,8 @@ }, "devDependencies": { "@emigrate/tsconfig": "workspace:*", - "@types/bun": "1.0.5", - "bun-types": "1.0.26" + "@types/bun": "1.1.2", + "bun-types": "1.1.8" }, "volta": { "extends": "../../package.json" diff --git a/packages/mysql/src/index.ts b/packages/mysql/src/index.ts index 5b97560..22b8271 100644 --- a/packages/mysql/src/index.ts +++ b/packages/mysql/src/index.ts @@ -41,9 +41,11 @@ export type MysqlLoaderOptions = { connection: ConnectionOptions | string; }; -const getConnection = async (connection: ConnectionOptions | string) => { - if (typeof connection === 'string') { - const uri = new URL(connection); +const getConnection = async (options: ConnectionOptions | string) => { + let connection: Connection; + + if (typeof options === 'string') { + const uri = new URL(options); // client side connectTimeout is unstable in mysql2 library // it throws an error you can't catch and crashes node @@ -51,17 +53,25 @@ const getConnection = async (connection: ConnectionOptions | string) => { uri.searchParams.set('connectTimeout', '0'); uri.searchParams.set('multipleStatements', 'true'); - return createConnection(uri.toString()); + connection = await createConnection(uri.toString()); + } else { + connection = await createConnection({ + ...options, + // client side connectTimeout is unstable in mysql2 library + // it throws an error you can't catch and crashes node + // best to leave this at 0 (disabled) + connectTimeout: 0, + multipleStatements: true, + }); } - return createConnection({ - ...connection, - // client side connectTimeout is unstable in mysql2 library - // it throws an error you can't catch and crashes node - // best to leave this at 0 (disabled) - connectTimeout: 0, - multipleStatements: true, - }); + if (process.isBun) { + // @ts-expect-error the connection is not in the types but it's there + // eslint-disable-next-line @typescript-eslint/no-unsafe-call + connection.connection.stream.unref(); + } + + return connection; }; const getPool = (connection: PoolOptions | string) => { @@ -354,12 +364,6 @@ export const createMysqlLoader = ({ connection }: MysqlLoaderOptions): LoaderPlu const contents = await fs.readFile(migration.filePath, 'utf8'); const conn = await getConnection(connection); - if (process.isBun) { - // @ts-expect-error the connection is not in the types but it's there - // eslint-disable-next-line @typescript-eslint/no-unsafe-call - conn.connection.stream.unref(); - } - try { await conn.query(contents); } finally { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d6a9a95..e880a00 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -131,11 +131,11 @@ importers: specifier: workspace:* version: link:../tsconfig '@types/bun': - specifier: 1.0.5 - version: 1.0.5 + specifier: 1.1.2 + version: 1.1.2 bun-types: - specifier: 1.0.26 - version: 1.0.26 + specifier: 1.1.8 + version: 1.1.8 packages/plugin-generate-js: dependencies: @@ -1791,6 +1791,12 @@ packages: bun-types: 1.0.26 dev: true + /@types/bun@1.1.2: + resolution: {integrity: sha512-pRBDD3EDqPf83qe95i3EpYu5G2J8bbb78a3736vnCm2K8YWtEE5cvJUq2jkKvJhW07YTfQtbImywIwRhWL8z3Q==} + dependencies: + bun-types: 1.1.8 + dev: true + /@types/debug@4.1.12: resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} dependencies: @@ -1891,6 +1897,12 @@ packages: undici-types: 5.26.5 dev: true + /@types/node@20.12.14: + resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: false @@ -2707,6 +2719,13 @@ packages: '@types/ws': 8.5.10 dev: true + /bun-types@1.1.8: + resolution: {integrity: sha512-dwhfuUKSGK8hm5Llcvb5+ejRh+4mIt8ibObJVKhZBsi0ScpXmt+AlaS1eDW6uRXCHj084Qt0kIqAJ08/7ZGC9Q==} + dependencies: + '@types/node': 20.12.14 + '@types/ws': 8.5.10 + dev: true + /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} From 31693ddb3c60029f50f719171ab74893eecb7e88 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 25 Jun 2024 06:23:35 +0000 Subject: [PATCH 122/136] chore(release): version packages --- .changeset/gentle-yaks-cough.md | 5 ----- packages/mysql/CHANGELOG.md | 6 ++++++ packages/mysql/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/gentle-yaks-cough.md diff --git a/.changeset/gentle-yaks-cough.md b/.changeset/gentle-yaks-cough.md deleted file mode 100644 index 87769ca..0000000 --- a/.changeset/gentle-yaks-cough.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/mysql': patch ---- - -Unreference all connections when run using Bun, to not keep the process open unnecessarily long diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index c18a11d..a80e9ae 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/mysql +## 0.3.2 + +### Patch Changes + +- 57498db: Unreference all connections when run using Bun, to not keep the process open unnecessarily long + ## 0.3.1 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index e162e75..66fa554 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.3.1", + "version": "0.3.2", "publishConfig": { "access": "public", "provenance": true From 0ff9f60d5972a04b67d1f4e60abb6c6e618341d2 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 27 Jun 2024 10:52:52 +0200 Subject: [PATCH 123/136] chore(deps): upgrade all action dependencies Closes #70, #128, #135, #145 --- .github/workflows/ci.yaml | 2 +- .github/workflows/deploy.yaml | 5 +++-- .github/workflows/release.yaml | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a71605b..8278d67 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ jobs: with: fetch-depth: 2 - - uses: pnpm/action-setup@v3.0.0 + - uses: pnpm/action-setup@v4.0.0 with: version: 8.3.1 diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index fd1fd6d..bbae087 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -10,6 +10,7 @@ on: # Allow this job to clone the repo and create a page deployment permissions: + actions: read contents: read pages: write id-token: write @@ -29,7 +30,7 @@ jobs: echo $ASTRO_SITE echo $ASTRO_BASE - name: Install, build, and upload your site output - uses: withastro/action@v1 + uses: withastro/action@v2 with: path: ./docs # The root location of your Astro project inside the repository. (optional) node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 18. (optional) @@ -44,4 +45,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v1 + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index adc6786..aebd63b 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -25,7 +25,7 @@ jobs: persist-credentials: false fetch-depth: 0 - - uses: pnpm/action-setup@v3.0.0 + - uses: pnpm/action-setup@v4.0.0 with: version: 8.3.1 @@ -39,7 +39,7 @@ jobs: run: pnpm install - name: Create Release Pull Request - uses: changesets/action@v1.4.6 + uses: changesets/action@v1.4.7 with: publish: pnpm run release commit: 'chore(release): version packages' From 2cefa2508b072cfde1b730af7ccc946ce9cd43cb Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 27 Jun 2024 11:12:21 +0200 Subject: [PATCH 124/136] chore(deps): upgrade PNPM to v9.4.0 --- .github/workflows/deploy.yaml | 2 +- package.json | 3 +- pnpm-lock.yaml | 10457 ++++++++++++++++++-------------- 3 files changed, 5785 insertions(+), 4677 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index bbae087..4de2b27 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -34,7 +34,7 @@ jobs: with: path: ./docs # The root location of your Astro project inside the repository. (optional) node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 18. (optional) - package-manager: pnpm@8.10.2 # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) + package-manager: pnpm@9.4.0 # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) deploy: needs: build diff --git a/package.json b/package.json index a7e1419..a82612b 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,9 @@ "license": "MIT", "volta": { "node": "20.9.0", - "pnpm": "8.10.2" + "pnpm": "9.4.0" }, + "packageManager": "pnpm@9.4.0", "engines": { "node": ">=18" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e880a00..56721e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -218,34 +218,4621 @@ importers: packages: - /@aashutoshrathi/word-wrap@1.2.6: + '@aashutoshrathi/word-wrap@1.2.6': resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} - dev: false - /@alloc/quick-lru@5.2.0: + '@alloc/quick-lru@5.2.0': resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - dev: false - /@ampproject/remapping@2.2.1: + '@ampproject/remapping@2.2.1': resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} + + '@astrojs/compiler@2.3.2': + resolution: {integrity: sha512-jkY7bCVxl27KeZsSxIZ+pqACe+g8VQUdTiSJRj/sXYdIaZlW3ZMq4qF2M17P/oDt3LBq0zLNwQr4Cb7fSpRGxQ==} + + '@astrojs/internal-helpers@0.2.1': + resolution: {integrity: sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==} + + '@astrojs/markdown-remark@4.0.1': + resolution: {integrity: sha512-RU4ESnqvyLpj8WZs0n5elS6idaDdtIIm7mIpMaRNPCebpxMjfcfdwcmBwz83ktAj5d2eO5bC3z92TcGdli+lRw==} + + '@astrojs/mdx@2.0.1': + resolution: {integrity: sha512-lWbiNoVV/6DO8hAf6eZmcN28hY/herif9eglw2PXZ5lEPoRu175BvBtuNTt9rH9YA/Ldm5mkNXhvMWNEnMqJkw==} + engines: {node: '>=18.14.1'} + peerDependencies: + astro: ^4.0.0 + + '@astrojs/prism@3.0.0': + resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} + engines: {node: '>=18.14.1'} + + '@astrojs/sitemap@3.0.3': + resolution: {integrity: sha512-+GRKp1yho9dpHBcMcU6JpbL41k0yYZghOkNsMRb8QIRflbGHvd787tdv9oIZ5NJj0SqAuOlqp2UpqLkJXuAe2A==} + + '@astrojs/starlight-tailwind@2.0.1': + resolution: {integrity: sha512-niMgFcR7NHcsBVy8UAN3F2gqhmoN5v83st5Hu4YzvUL+6SNwjQmIipXppXdN9+iVneRjPr6PLGzDfI+wnjSBWQ==} + peerDependencies: + '@astrojs/starlight': '>=0.9.0' + '@astrojs/tailwind': ^5.0.0 + tailwindcss: ^3.3.3 + + '@astrojs/starlight@0.15.0': + resolution: {integrity: sha512-epLRrGP9+5gIP/ZXeRtkY/tA00yzY8iBBqYRGxkoj44fokCiDg+iKCnE9BXooAK08ELyizD8nwenUmVzDTDRXA==} + peerDependencies: + astro: ^4.0.0 + + '@astrojs/tailwind@5.0.3': + resolution: {integrity: sha512-p+uFa1PNuV8RxhGkPUFgVq8CUbmS3xr0u5k1An2xKECLotRh7vsrGcPUijHvYOt42URohcg8rIq0CxNoVMhReg==} + peerDependencies: + astro: ^3.0.0 || ^4.0.0 + tailwindcss: ^3.0.24 + + '@astrojs/telemetry@3.0.4': + resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} + engines: {node: '>=18.14.1'} + + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.23.5': + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.23.6': + resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.23.6': + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.23.6': + resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.23.6': + resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.23.3': + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.23.4': + resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.23.2': + resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.22.15': + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.6': + resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.23.6': + resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} + engines: {node: '>=6.9.0'} + + '@changesets/apply-release-plan@7.0.0': + resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + + '@changesets/assemble-release-plan@6.0.0': + resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.1': + resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + hasBin: true + + '@changesets/config@3.0.0': + resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.0.0': + resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + + '@changesets/get-release-plan@4.0.0': + resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.0': + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + + '@changesets/logger@0.1.0': + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.0': + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + + '@changesets/read@0.6.0': + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.0': + resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + + '@commitlint/cli@18.6.1': + resolution: {integrity: sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-conventional@18.6.1': + resolution: {integrity: sha512-ftpfAOQyI+IHvut0cRF4EFM39PWCqde+uOXCjH9NpK6FpqfhncAbEvP0E7OIpFsrDX0aS7k81tzH5Yz7prcNxA==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@18.6.1': + resolution: {integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==} + engines: {node: '>=v18'} + + '@commitlint/ensure@18.6.1': + resolution: {integrity: sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@18.6.1': + resolution: {integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==} + engines: {node: '>=v18'} + + '@commitlint/format@18.6.1': + resolution: {integrity: sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@18.6.1': + resolution: {integrity: sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==} + engines: {node: '>=v18'} + + '@commitlint/lint@18.6.1': + resolution: {integrity: sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==} + engines: {node: '>=v18'} + + '@commitlint/load@18.6.1': + resolution: {integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==} + engines: {node: '>=v18'} + + '@commitlint/message@18.6.1': + resolution: {integrity: sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==} + engines: {node: '>=v18'} + + '@commitlint/parse@18.6.1': + resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==} + engines: {node: '>=v18'} + + '@commitlint/read@18.6.1': + resolution: {integrity: sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@18.6.1': + resolution: {integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==} + engines: {node: '>=v18'} + + '@commitlint/rules@18.6.1': + resolution: {integrity: sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@18.6.1': + resolution: {integrity: sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==} + engines: {node: '>=v18'} + + '@commitlint/top-level@18.6.1': + resolution: {integrity: sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==} + engines: {node: '>=v18'} + + '@commitlint/types@18.6.1': + resolution: {integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==} + engines: {node: '>=v18'} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@esbuild/aix-ppc64@0.19.11': + resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.19.11': + resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.9': + resolution: {integrity: sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.19.11': + resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.9': + resolution: {integrity: sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.19.11': + resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.9': + resolution: {integrity: sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.19.11': + resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.9': + resolution: {integrity: sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.11': + resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.9': + resolution: {integrity: sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.19.11': + resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.9': + resolution: {integrity: sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.11': + resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.9': + resolution: {integrity: sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.19.11': + resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.9': + resolution: {integrity: sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.19.11': + resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.9': + resolution: {integrity: sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.19.11': + resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.9': + resolution: {integrity: sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.19.11': + resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.9': + resolution: {integrity: sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.19.11': + resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.9': + resolution: {integrity: sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.19.11': + resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.9': + resolution: {integrity: sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.11': + resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.9': + resolution: {integrity: sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.19.11': + resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.9': + resolution: {integrity: sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.19.11': + resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.9': + resolution: {integrity: sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.19.11': + resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.9': + resolution: {integrity: sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.19.11': + resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.9': + resolution: {integrity: sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.19.11': + resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.9': + resolution: {integrity: sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.19.11': + resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.9': + resolution: {integrity: sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.19.11': + resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.9': + resolution: {integrity: sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.19.11': + resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.9': + resolution: {integrity: sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.3': + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.53.0': + resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@expressive-code/core@0.29.4': + resolution: {integrity: sha512-XBdMPO4BBgPxE+txtNdjkDmLwGxJpU+QqLQ/WrHWPcj1lTXcoFQTUqFO4Eav+hv/Yn+lEjiv792RrcUe2o0anA==} + + '@expressive-code/plugin-frames@0.29.4': + resolution: {integrity: sha512-GE3sB7JTqjhTz7LrCm+mL9x+bIdud76AVqJa/brJgqpYFcl5aJcHtyR0PSZQqTXHL3sBIj8w0wbh+ieVM43JnQ==} + + '@expressive-code/plugin-shiki@0.29.4': + resolution: {integrity: sha512-vOM2JFVEClg3EAWHVd+ma8y/EsINqzCrQP1PS9sZgn2KASE3C6JBkNRXzUXKGkjDn0dsWJVYYvIsH+4xNpygZA==} + + '@expressive-code/plugin-text-markers@0.29.4': + resolution: {integrity: sha512-U8rouNRrLzAo11Ihoi4iqEH7FD+VEUb6Pe7xJxlFJ7HRhgaFIcuHyYyn6jA1WmGP5k9BFLhYBk53+oKvlmEkKw==} + + '@humanwhocodes/config-array@0.11.13': + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.1': + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.20': + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + + '@jridgewell/trace-mapping@0.3.22': + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@mdx-js/mdx@3.0.0': + resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pagefind/darwin-arm64@1.0.4': + resolution: {integrity: sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==} + cpu: [arm64] + os: [darwin] + + '@pagefind/darwin-x64@1.0.4': + resolution: {integrity: sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==} + cpu: [x64] + os: [darwin] + + '@pagefind/default-ui@1.0.4': + resolution: {integrity: sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==} + + '@pagefind/linux-arm64@1.0.4': + resolution: {integrity: sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==} + cpu: [arm64] + os: [linux] + + '@pagefind/linux-x64@1.0.4': + resolution: {integrity: sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==} + cpu: [x64] + os: [linux] + + '@pagefind/windows-x64@1.0.4': + resolution: {integrity: sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==} + cpu: [x64] + os: [win32] + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/utils@2.4.2': + resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rollup/rollup-android-arm-eabi@4.9.0': + resolution: {integrity: sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.9.0': + resolution: {integrity: sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.9.0': + resolution: {integrity: sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.9.0': + resolution: {integrity: sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.9.0': + resolution: {integrity: sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.9.0': + resolution: {integrity: sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.9.0': + resolution: {integrity: sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.9.0': + resolution: {integrity: sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.9.0': + resolution: {integrity: sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.9.0': + resolution: {integrity: sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.9.0': + resolution: {integrity: sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.9.0': + resolution: {integrity: sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.9.0': + resolution: {integrity: sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw==} + cpu: [x64] + os: [win32] + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.7': + resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.4': + resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + + '@types/bun@1.0.5': + resolution: {integrity: sha512-c14fs5QLLanldcZpX/GjIEKeo++NDzOlixUZ7IUWzN7AoBTisYyWxaxdXNhpAP5I1mPcd92Zagq8sdgTnUXWjg==} + + '@types/bun@1.1.2': + resolution: {integrity: sha512-pRBDD3EDqPf83qe95i3EpYu5G2J8bbb78a3736vnCm2K8YWtEE5cvJUq2jkKvJhW07YTfQtbImywIwRhWL8z3Q==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.44.7': + resolution: {integrity: sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==} + + '@types/eslint@8.56.2': + resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + + '@types/estree-jsx@1.0.3': + resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/hast@2.3.8': + resolution: {integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==} + + '@types/hast@3.0.3': + resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mdast@4.0.3': + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + + '@types/mdx@2.0.10': + resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/nlcst@1.0.4': + resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@17.0.45': + resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + + '@types/node@20.10.4': + resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} + + '@types/node@20.11.17': + resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} + + '@types/node@20.12.14': + resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/parse5@6.0.3': + resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} + + '@types/sax@1.2.7': + resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + + '@types/semver@7.5.5': + resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@types/ws@8.5.10': + resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + + '@typescript-eslint/eslint-plugin@6.10.0': + resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.10.0': + resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.10.0': + resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.10.0': + resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.10.0': + resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.10.0': + resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.10.0': + resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.10.0': + resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@webassemblyjs/ast@1.11.6': + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.11.6': + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.11.6': + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.11.6': + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + + '@webassemblyjs/wasm-gen@1.11.6': + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + + '@webassemblyjs/wasm-opt@1.11.6': + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + + '@webassemblyjs/wasm-parser@1.11.6': + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + + '@webassemblyjs/wast-printer@1.11.6': + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-escapes@6.2.0: + resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} + engines: {node: '>=14.16'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + ansis@2.0.3: + resolution: {integrity: sha512-tcSGX0mhuDFHsgRrT56xnZ9v2X+TOeKhJ75YopI5OBgyT7tGaG5m6BmeC+6KHjiucfBvUHehQMecHbULIAkFPA==} + engines: {node: '>=12.13'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + + array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.find@2.2.2: + resolution: {integrity: sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + astro-expressive-code@0.29.4: + resolution: {integrity: sha512-FoOp0gq+BOss92Tqm1tmUJwVsmCE9odEfura/an27l2tc6LU9Ki2NX3N6TWpvl95NLKQZeFpBl26ZB2yhjrt2Q==} + peerDependencies: + astro: ^3.0.0-beta || ^4.0.0-beta + + astro@4.0.5: + resolution: {integrity: sha512-OTiTEiXYdXTkVJXNNKIWdYG1z2wpTST+92Qcldm36x91Pe4fKpLxeuRloy5cW175oHi8lvXytgG3Gl3VBP18RQ==} + engines: {node: '>=18.14.1', npm: '>=6.14.0'} + hasBin: true + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + autoprefixer@10.4.16: + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcp-47-match@2.0.3: + resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + + bcp-47@2.1.0: + resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + big-integer@1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + + browserslist@4.22.2: + resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.22.3: + resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + builtins@5.0.1: + resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + + bun-types@1.0.26: + resolution: {integrity: sha512-VcSj+SCaWIcMb0uSGIAtr8P92zq9q+unavcQmx27fk6HulCthXHBVrdGuXxAZbFtv7bHVjizRzR2mk9r/U8Nkg==} + + bun-types@1.1.8: + resolution: {integrity: sha512-dwhfuUKSGK8hm5Llcvb5+ejRh+4mIt8ibObJVKhZBsi0ScpXmt+AlaS1eDW6uRXCHj084Qt0kIqAJ08/7ZGC9Q==} + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + call-bind@1.0.5: + resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + caniuse-lite@1.0.30001570: + resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} + + caniuse-lite@1.0.30001587: + resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + + collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + cosmiconfig-typescript-loader@5.0.0: + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-selector-parser@3.0.3: + resolution: {integrity: sha512-HAcgYSBFKo1jnglINdHeBPIscPOCOh8vCDCaOV5xkwMSlGPEnfdynxBuWkgZMwXltMKgFbDcr4EPmDpSWi34MA==} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + + csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + + csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + + csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.1: + resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} + engines: {node: '>= 0.4'} + + define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + + deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + + devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + direction@2.0.1: + resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} + hasBin: true + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} + engines: {node: '>=4'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.4.613: + resolution: {integrity: sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==} + + electron-to-chromium@1.4.667: + resolution: {integrity: sha512-66L3pLlWhTNVUhnmSA5+qDM3fwnXsM6KAqE36e2w4KN0g6pkEtlT5bs41FQtQwVwKnfhNBXiWRLPs30HSxd7Kw==} + + elegant-spinner@3.0.0: + resolution: {integrity: sha512-nWUuor3FWTGYAch7SY0unb5qLzs7eAc24ic9PBh+eQctFNQ4IDWJqBpBgsL4SrrGHHN0mJoL7CpWZby5t2KjFg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhance-visitors@1.0.0: + resolution: {integrity: sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==} + engines: {node: '>=4.0.0'} + + enhanced-resolve@0.9.1: + resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} + engines: {node: '>=0.6'} + + enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-editor@1.1.0: + resolution: {integrity: sha512-7AXskzN6T7Q9TFcKAGJprUbpQa4i1VsAetO9rdBqbGMGlragTziBgWt4pVYJMBWHQlLoX0buy6WFikzPH4Qjpw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.22.3: + resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + es-set-tostringtag@2.0.2: + resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild@0.19.11: + resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.9: + resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + eslint-config-prettier@8.10.0: + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-config-xo-typescript@1.0.1: + resolution: {integrity: sha512-vPQssnRSUgBFOEfB/KY12CXwltwFSn4RSCfa+w7gjBC2PFQ7Yfgmyei+1XUZ3K+8LRGef2NMJUcxts7PldhDjg==} + engines: {node: '>=16'} + peerDependencies: + '@typescript-eslint/eslint-plugin': '>=6.0.0' + '@typescript-eslint/parser': '>=6.0.0' + eslint: '>=8.0.0' + typescript: '>=4.7' + + eslint-config-xo@0.43.1: + resolution: {integrity: sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=8.27.0' + + eslint-formatter-pretty@5.0.0: + resolution: {integrity: sha512-Uick451FoL22/wXqyScX3inW8ZlD/GQO7eFXj3bqb6N/ZtuuF00/CwSNIKLbFCJPrX5V4EdQBSgJ/UVnmLRnug==} + engines: {node: '>=14.16'} + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-webpack@0.13.8: + resolution: {integrity: sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA==} + engines: {node: '>= 6'} + peerDependencies: + eslint-plugin-import: '>=1.4.0' + webpack: '>=1.11.0' + + eslint-module-utils@2.8.0: + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-ava@14.0.0: + resolution: {integrity: sha512-XmKT6hppaipwwnLVwwvQliSU6AF1QMHiNoLD5JQfzhUhf0jY7CO0O624fQrE+Y/fTb9vbW8r77nKf7M/oHulxw==} + engines: {node: '>=14.17 <15 || >=16.4'} + peerDependencies: + eslint: '>=8.26.0' + + eslint-plugin-es-x@7.3.0: + resolution: {integrity: sha512-W9zIs+k00I/I13+Bdkl/zG1MEO07G97XjUSQuH117w620SJ6bHtLUmoMvkGA2oYnI/gNdr+G7BONLyYnFaLLEQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-eslint-comments@3.2.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.27.5: + resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-n@16.3.0: + resolution: {integrity: sha512-/XZLH5CUXGK3laz3xYFNza8ZxLCq8ZNW6MsVw5z3d5hc2AwZzi0fPiySFZHQTdVDOHGs2cGv91aqzWmgBdq2gQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-no-use-extend-native@0.5.0: + resolution: {integrity: sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==} + engines: {node: '>=6.0.0'} + + eslint-plugin-prettier@5.0.1: + resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-unicorn@48.0.1: + resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.44.0' + + eslint-rule-docs@1.1.235: + resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.53.0: + resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + esm-utils@4.2.1: + resolution: {integrity: sha512-a7t8pDmZ5MeYfo2pM5EcqeU+BqKobUFKnWkM17JOhTlR88OSosLa9Ak4bgm+htoF15HRf7tfrXNR62UogmIODg==} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + espurify@2.1.1: + resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==} + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + + estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + expressive-code@0.29.4: + resolution: {integrity: sha512-MA0cdWkFsIPQ/DAiPgL49y1mZiOXOuxiBXlZ28SrtItNeoh3/NwUhZ21z5BwlaC7b6nkXfkI4E+HWguuIpEhSA==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + + fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + + figures@6.0.1: + resolution: {integrity: sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==} + engines: {node: '>=18'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-cache-dir@4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + + flat-cache@3.1.1: + resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} + engines: {node: '>=12.0.0'} + + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + flattie@1.1.0: + resolution: {integrity: sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw==} + engines: {node: '>=8'} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-intrinsic@1.2.2: + resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + + get-set-props@0.1.0: + resolution: {integrity: sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==} + engines: {node: '>=0.10.0'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.2: + resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + + hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + + hasown@2.0.1: + resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} + engines: {node: '>= 0.4'} + + hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + + hast-util-from-parse5@7.1.2: + resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + + hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + + hast-util-has-property@3.0.0: + resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + + hast-util-parse-selector@3.1.1: + resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + + hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + + hast-util-raw@7.2.3: + resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + + hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + + hast-util-select@6.0.2: + resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} + + hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + + hast-util-to-html@8.0.4: + resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + + hast-util-to-html@9.0.0: + resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + + hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + + hast-util-to-parse5@7.1.0: + resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + + hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + + hast-util-to-string@3.0.0: + resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + + hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + + hastscript@7.2.0: + resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + + hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + + html-void-elements@2.0.1: + resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} + + html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + husky@8.0.3: + resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} + engines: {node: '>=14'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-from-esm@1.3.3: + resolution: {integrity: sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==} + engines: {node: '>=16.20'} + + import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + + import-modules@2.1.0: + resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + + internal-slot@1.0.6: + resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + + is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + + is-get-set-prop@1.0.0: + resolution: {integrity: sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ==} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-js-type@2.0.0: + resolution: {integrity: sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw==} + + is-negated-glob@1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} + engines: {node: '>=0.10.0'} + + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj-prop@1.0.0: + resolution: {integrity: sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w==} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + is-proto-prop@2.0.0: + resolution: {integrity: sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-types@1.0.0: + resolution: {integrity: sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==} + engines: {node: '>=0.10.0'} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + + line-column-path@3.0.0: + resolution: {integrity: sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lint-staged@15.2.0: + resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} + engines: {node: '>=18.12.0'} + hasBin: true + + listr2@8.0.0: + resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} + engines: {node: '>=18.0.0'} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + + log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + + long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + + lru-cache@10.0.1: + resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} + engines: {node: 14 || >=16.14} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + + magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + + markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + + mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + + mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + + mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + + mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + + mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + + mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + + mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + + mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + + mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + + mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + + mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + + mdast-util-mdx-jsx@3.0.0: + resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@4.0.0: + resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + + mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + memory-fs@0.2.0: + resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micro-spelling-correcter@1.1.1: + resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} + + micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + + micromark-extension-directive@3.0.0: + resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + + micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + + micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + + micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + + micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + + micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + + micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + + micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + mixme@0.5.9: + resolution: {integrity: sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==} + engines: {node: '>= 8.0.0'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + mysql2@3.6.5: + resolution: {integrity: sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==} + engines: {node: '>= 8.0'} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + needle@2.9.1: + resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} + engines: {node: '>= 4.4.x'} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + + nlcst-to-string@3.1.1: + resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + + node-abi@3.52.0: + resolution: {integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==} + engines: {node: '>=10'} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + not@0.1.0: + resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} + + npm-run-all@4.1.5: + resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} + engines: {node: '>= 4'} + hasBin: true + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.2.0: + resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + obj-props@1.4.0: + resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + + object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open-editor@4.1.1: + resolution: {integrity: sha512-SYtGeZ9Zkzj/naoZaEF9LzwDYEGwuqQ4Fx5E3xdVRN98LFJjvMhG/ElByFEOVOiXepGra/Wi1fA4i/E1fXSBsw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-queue@7.4.1: + resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} + engines: {node: '>=12'} + + p-timeout@5.1.0: + resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} + engines: {node: '>=12'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pagefind@1.0.4: + resolution: {integrity: sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==} + hasBin: true + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-latin@5.0.1: + resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + + parse-ms@3.0.0: + resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} + engines: {node: '>=12'} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.3.1: + resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} + engines: {node: '>=0.10'} + hasBin: true + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino@8.16.2: + resolution: {integrity: sha512-2advCDGVEvkKu9TTVSa/kWW7Z3htI/sBKEZpqiHk6ive0i/7f5b1rsU8jn0aimxqfnSz5bj/nOYkwhBUn5xxvg==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + plur@4.0.0: + resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} + engines: {node: '>=10'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.0.1: + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.32: + resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} + engines: {node: ^10 || ^12 || >=14} + + postgres@3.4.3: + resolution: {integrity: sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==} + engines: {node: '>=12'} + + prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + + preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} + engines: {node: '>=10'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.1.1: + resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@8.0.0: + resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} + engines: {node: '>=14.16'} + + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + + probe-image-size@7.2.3: + resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==} + + process-warning@2.3.2: + resolution: {integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + property-information@6.4.0: + resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} + + proto-props@2.0.0: + resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} + engines: {node: '>=4'} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-stream@4.4.2: + resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + regenerator-runtime@0.14.0: + resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + rehype-parse@9.0.0: + resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + + rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + + rehype-stringify@10.0.0: + resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + + rehype@13.0.1: + resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + + remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + + remark-expressive-code@0.29.4: + resolution: {integrity: sha512-7PX6TgPKFDfrixlBugCXYQGb6HWWGCyMcLBSpUZG8aiJvbFEaERYTMhj3WPKc2haAqliCcMjzGV4Kdbl+ci0yA==} + + remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + + remark-mdx@3.0.0: + resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@11.0.0: + resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} + + remark-smartypants@2.0.0: + resolution: {integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-global@1.0.0: + resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + retext-latin@3.1.0: + resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + + retext-smartypants@5.2.0: + resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + + retext-stringify@3.1.0: + resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + + retext@8.1.0: + resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rollup@4.9.0: + resolution: {integrity: sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sax@1.3.0: + resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + + serialize-error@11.0.3: + resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} + engines: {node: '>=14.16'} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + server-destroy@1.0.1: + resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.1.1: + resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + + shiki@0.14.6: + resolution: {integrity: sha512-R4koBBlQP33cC8cpzX0hAoOURBHJILp4Aaduh2eYi+Vj8ZBqtK/5SWNEHBS3qwUMu8dqOtI/ftno3ESfNeVW9g==} + + shikiji@0.6.13: + resolution: {integrity: sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + sitemap@7.1.1: + resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} + engines: {node: '>=12.0.0', npm: '>=5.6.0'} + hasBin: true + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + + slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + + smartwrap@2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + + sonic-boom@3.7.0: + resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} + + source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.16: + resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + stream-parser@0.3.1: + resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + + stream-transform@2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + + streamx@2.15.6: + resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + + string-width@7.0.0: + resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} + engines: {node: '>=18'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + string.prototype.padend@3.1.5: + resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + + string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + + sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.8.5: + resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} + engines: {node: ^14.18.0 || >=16.0.0} + + tailwindcss@3.3.6: + resolution: {integrity: sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==} + engines: {node: '>=14.0.0'} + hasBin: true + + tapable@0.1.10: + resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} + engines: {node: '>=0.6'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.27.0: + resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} + engines: {node: '>=10'} + hasBin: true + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + thread-stream@2.4.1: + resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-absolute-glob@3.0.0: + resolution: {integrity: sha512-loO/XEWTRqpfcpI7+Jr2RR2Umaaozx1t6OSVWtMi0oy5F/Fxg3IC+D/TToDnxyAGs7uZBGT/6XmyDUxgsObJXA==} + engines: {node: '>=0.10.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trough@2.1.0: + resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} + + ts-api-utils@1.0.3: + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tsconfck@3.0.0: + resolution: {integrity: sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsx@4.7.0: + resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + engines: {node: '>=18.0.0'} + hasBin: true + + tty-table@4.2.3: + resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} + engines: {node: '>=8.0.0'} + hasBin: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + turbo-darwin-64@1.10.16: + resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@1.10.16: + resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@1.10.16: + resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@1.10.16: + resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} + cpu: [arm64] + os: [linux] + + turbo-windows-64@1.10.16: + resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@1.10.16: + resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} + cpu: [arm64] + os: [win32] + + turbo@1.10.16: + resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + unherit@3.0.1: + resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-modify-children@3.1.1: + resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + + unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-remove@4.0.0: + resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-children@2.0.2: + resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-or-path@2.1.0: + resolution: {integrity: sha512-dsBD6GbytSMj9YDb3jVzSRENwFh50oUORnWBeSHfo0Lnwv2KMm/J4npyGy1P9rivUPsUGLjTA53XqAFqpe0nww==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + vfile-location@4.1.0: + resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + + vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + vite@5.0.9: + resolution: {integrity: sha512-wVqMd5kp28QWGgfYPDfrj771VyHTJ4UDlCteLH7bJDGDEamaz5hV8IX6h1brSGgnnyf9lI2RnzXq/JmD0c2wwg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitefu@0.2.5: + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + + vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + + vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.90.1: + resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + + which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + + which-pm@2.1.1: + resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} + engines: {node: '>=8.15'} + + which-typed-array@1.1.13: + resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xo@0.56.0: + resolution: {integrity: sha512-ohzSqgQ8POgZ3KNaEK/gxDovb6h3cglxv8+xi9Dn7gmRe8g4qotpOZpMs5ACJhvkJDmJOhiKbk6Uq6Mx1Di9DA==} + engines: {node: '>=16'} + hasBin: true + peerDependencies: + webpack: '>=1.11.0' + peerDependenciesMeta: + webpack: + optional: true + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.2.1': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 - dev: false - /@astrojs/compiler@2.3.2: - resolution: {integrity: sha512-jkY7bCVxl27KeZsSxIZ+pqACe+g8VQUdTiSJRj/sXYdIaZlW3ZMq4qF2M17P/oDt3LBq0zLNwQr4Cb7fSpRGxQ==} - dev: false + '@astrojs/compiler@2.3.2': {} - /@astrojs/internal-helpers@0.2.1: - resolution: {integrity: sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==} - dev: false + '@astrojs/internal-helpers@0.2.1': {} - /@astrojs/markdown-remark@4.0.1: - resolution: {integrity: sha512-RU4ESnqvyLpj8WZs0n5elS6idaDdtIIm7mIpMaRNPCebpxMjfcfdwcmBwz83ktAj5d2eO5bC3z92TcGdli+lRw==} + '@astrojs/markdown-remark@4.0.1': dependencies: '@astrojs/prism': 3.0.0 github-slugger: 2.0.0 @@ -263,13 +4850,8 @@ packages: vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: false - /@astrojs/mdx@2.0.1(astro@4.0.5): - resolution: {integrity: sha512-lWbiNoVV/6DO8hAf6eZmcN28hY/herif9eglw2PXZ5lEPoRu175BvBtuNTt9rH9YA/Ldm5mkNXhvMWNEnMqJkw==} - engines: {node: '>=18.14.1'} - peerDependencies: - astro: ^4.0.0 + '@astrojs/mdx@2.0.1(astro@4.0.5)': dependencies: '@astrojs/markdown-remark': 4.0.1 '@mdx-js/mdx': 3.0.0 @@ -289,38 +4871,23 @@ packages: vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: false - /@astrojs/prism@3.0.0: - resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} - engines: {node: '>=18.14.1'} + '@astrojs/prism@3.0.0': dependencies: prismjs: 1.29.0 - dev: false - /@astrojs/sitemap@3.0.3: - resolution: {integrity: sha512-+GRKp1yho9dpHBcMcU6JpbL41k0yYZghOkNsMRb8QIRflbGHvd787tdv9oIZ5NJj0SqAuOlqp2UpqLkJXuAe2A==} + '@astrojs/sitemap@3.0.3': dependencies: sitemap: 7.1.1 zod: 3.22.4 - dev: false - /@astrojs/starlight-tailwind@2.0.1(@astrojs/starlight@0.15.0)(@astrojs/tailwind@5.0.3)(tailwindcss@3.3.6): - resolution: {integrity: sha512-niMgFcR7NHcsBVy8UAN3F2gqhmoN5v83st5Hu4YzvUL+6SNwjQmIipXppXdN9+iVneRjPr6PLGzDfI+wnjSBWQ==} - peerDependencies: - '@astrojs/starlight': '>=0.9.0' - '@astrojs/tailwind': ^5.0.0 - tailwindcss: ^3.3.3 + '@astrojs/starlight-tailwind@2.0.1(@astrojs/starlight@0.15.0)(@astrojs/tailwind@5.0.3)(tailwindcss@3.3.6)': dependencies: '@astrojs/starlight': 0.15.0(astro@4.0.5) '@astrojs/tailwind': 5.0.3(astro@4.0.5)(tailwindcss@3.3.6) tailwindcss: 3.3.6 - dev: false - /@astrojs/starlight@0.15.0(astro@4.0.5): - resolution: {integrity: sha512-epLRrGP9+5gIP/ZXeRtkY/tA00yzY8iBBqYRGxkoj44fokCiDg+iKCnE9BXooAK08ELyizD8nwenUmVzDTDRXA==} - peerDependencies: - astro: ^4.0.0 + '@astrojs/starlight@0.15.0(astro@4.0.5)': dependencies: '@astrojs/mdx': 2.0.1(astro@4.0.5) '@astrojs/sitemap': 3.0.3 @@ -343,13 +4910,8 @@ packages: vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: false - /@astrojs/tailwind@5.0.3(astro@4.0.5)(tailwindcss@3.3.6): - resolution: {integrity: sha512-p+uFa1PNuV8RxhGkPUFgVq8CUbmS3xr0u5k1An2xKECLotRh7vsrGcPUijHvYOt42URohcg8rIq0CxNoVMhReg==} - peerDependencies: - astro: ^3.0.0 || ^4.0.0 - tailwindcss: ^3.0.24 + '@astrojs/tailwind@5.0.3(astro@4.0.5)(tailwindcss@3.3.6)': dependencies: astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) autoprefixer: 10.4.16(postcss@8.4.32) @@ -358,11 +4920,8 @@ packages: tailwindcss: 3.3.6 transitivePeerDependencies: - ts-node - dev: false - /@astrojs/telemetry@3.0.4: - resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} - engines: {node: '>=18.14.1'} + '@astrojs/telemetry@3.0.4': dependencies: ci-info: 3.9.0 debug: 4.3.4 @@ -373,24 +4932,15 @@ packages: which-pm-runs: 1.1.0 transitivePeerDependencies: - supports-color - dev: false - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - dev: false - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/compat-data@7.23.5': {} - /@babel/core@7.23.6: - resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} - engines: {node: '>=6.9.0'} + '@babel/core@7.23.6': dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.23.5 @@ -409,68 +4959,42 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: false - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} - engines: {node: '>=6.9.0'} + '@babel/generator@7.23.6': dependencies: '@babel/types': 7.23.6 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 jsesc: 2.5.2 - dev: false - /@babel/helper-annotate-as-pure@7.22.5: - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.22.5': dependencies: '@babel/types': 7.23.6 - dev: false - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.23.6': dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 browserslist: 4.22.2 lru-cache: 5.1.1 semver: 6.3.1 - dev: false - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/helper-environment-visitor@7.22.20': {} - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} + '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.22.15 '@babel/types': 7.23.6 - dev: false - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.23.6 - dev: false - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.22.15': dependencies: '@babel/types': 7.23.6 - dev: false - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.6)': dependencies: '@babel/core': 7.23.6 '@babel/helper-environment-visitor': 7.22.20 @@ -478,85 +5002,47 @@ packages: '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - dev: false - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/helper-plugin-utils@7.22.5': {} - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.22.5': dependencies: '@babel/types': 7.23.6 - dev: false - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.22.6': dependencies: '@babel/types': 7.23.6 - dev: false - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/helper-string-parser@7.23.4': {} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - dev: false + '@babel/helper-validator-option@7.23.5': {} - /@babel/helpers@7.23.6: - resolution: {integrity: sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.23.6': dependencies: '@babel/template': 7.22.15 '@babel/traverse': 7.23.6 '@babel/types': 7.23.6 transitivePeerDependencies: - supports-color - dev: false - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.23.4': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - dev: false - /@babel/parser@7.23.6: - resolution: {integrity: sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.23.6': dependencies: '@babel/types': 7.23.6 - dev: false - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.6)': dependencies: '@babel/core': 7.23.6 '@babel/helper-plugin-utils': 7.22.5 - dev: false - /@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.6): - resolution: {integrity: sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-jsx@7.23.4(@babel/core@7.23.6)': dependencies: '@babel/core': 7.23.6 '@babel/helper-annotate-as-pure': 7.22.5 @@ -564,27 +5050,18 @@ packages: '@babel/helper-plugin-utils': 7.22.5 '@babel/plugin-syntax-jsx': 7.23.3(@babel/core@7.23.6) '@babel/types': 7.23.6 - dev: false - /@babel/runtime@7.23.2: - resolution: {integrity: sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==} - engines: {node: '>=6.9.0'} + '@babel/runtime@7.23.2': dependencies: regenerator-runtime: 0.14.0 - dev: false - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} + '@babel/template@7.22.15': dependencies: '@babel/code-frame': 7.23.5 '@babel/parser': 7.23.6 '@babel/types': 7.23.6 - dev: false - /@babel/traverse@7.23.6: - resolution: {integrity: sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.23.6': dependencies: '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.6 @@ -598,19 +5075,14 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color - dev: false - /@babel/types@7.23.6: - resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} - engines: {node: '>=6.9.0'} + '@babel/types@7.23.6': dependencies: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - dev: false - /@changesets/apply-release-plan@7.0.0: - resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + '@changesets/apply-release-plan@7.0.0': dependencies: '@babel/runtime': 7.23.2 '@changesets/config': 3.0.0 @@ -625,10 +5097,8 @@ packages: prettier: 2.8.8 resolve-from: 5.0.0 semver: 7.5.4 - dev: false - /@changesets/assemble-release-plan@6.0.0: - resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + '@changesets/assemble-release-plan@6.0.0': dependencies: '@babel/runtime': 7.23.2 '@changesets/errors': 0.2.0 @@ -636,17 +5106,12 @@ packages: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 semver: 7.5.4 - dev: false - /@changesets/changelog-git@0.2.0: - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@changesets/changelog-git@0.2.0': dependencies: '@changesets/types': 6.0.0 - dev: false - /@changesets/cli@2.27.1: - resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} - hasBin: true + '@changesets/cli@2.27.1': dependencies: '@babel/runtime': 7.23.2 '@changesets/apply-release-plan': 7.0.0 @@ -680,10 +5145,8 @@ packages: spawndamnit: 2.0.0 term-size: 2.2.1 tty-table: 4.2.3 - dev: false - /@changesets/config@3.0.0: - resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + '@changesets/config@3.0.0': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.0.0 @@ -692,26 +5155,20 @@ packages: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.5 - dev: false - /@changesets/errors@0.2.0: - resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + '@changesets/errors@0.2.0': dependencies: extendable-error: 0.1.7 - dev: false - /@changesets/get-dependents-graph@2.0.0: - resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + '@changesets/get-dependents-graph@2.0.0': dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 chalk: 2.4.2 fs-extra: 7.0.1 semver: 7.5.4 - dev: false - /@changesets/get-release-plan@4.0.0: - resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + '@changesets/get-release-plan@4.0.0': dependencies: '@babel/runtime': 7.23.2 '@changesets/assemble-release-plan': 6.0.0 @@ -720,14 +5177,10 @@ packages: '@changesets/read': 0.6.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - dev: false - /@changesets/get-version-range-type@0.4.0: - resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - dev: false + '@changesets/get-version-range-type@0.4.0': {} - /@changesets/git@3.0.0: - resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + '@changesets/git@3.0.0': dependencies: '@babel/runtime': 7.23.2 '@changesets/errors': 0.2.0 @@ -736,33 +5189,25 @@ packages: is-subdir: 1.2.0 micromatch: 4.0.5 spawndamnit: 2.0.0 - dev: false - /@changesets/logger@0.1.0: - resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + '@changesets/logger@0.1.0': dependencies: chalk: 2.4.2 - dev: false - /@changesets/parse@0.4.0: - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.0': dependencies: '@changesets/types': 6.0.0 js-yaml: 3.14.1 - dev: false - /@changesets/pre@2.0.0: - resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + '@changesets/pre@2.0.0': dependencies: '@babel/runtime': 7.23.2 '@changesets/errors': 0.2.0 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - dev: false - /@changesets/read@0.6.0: - resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + '@changesets/read@0.6.0': dependencies: '@babel/runtime': 7.23.2 '@changesets/git': 3.0.0 @@ -772,30 +5217,20 @@ packages: chalk: 2.4.2 fs-extra: 7.0.1 p-filter: 2.1.0 - dev: false - /@changesets/types@4.1.0: - resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - dev: false + '@changesets/types@4.1.0': {} - /@changesets/types@6.0.0: - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} - dev: false + '@changesets/types@6.0.0': {} - /@changesets/write@0.3.0: - resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + '@changesets/write@0.3.0': dependencies: '@babel/runtime': 7.23.2 '@changesets/types': 6.0.0 fs-extra: 7.0.1 human-id: 1.0.2 prettier: 2.8.8 - dev: false - /@commitlint/cli@18.6.1(@types/node@20.10.4)(typescript@5.3.3): - resolution: {integrity: sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==} - engines: {node: '>=v18'} - hasBin: true + '@commitlint/cli@18.6.1(@types/node@20.10.4)(typescript@5.3.3)': dependencies: '@commitlint/format': 18.6.1 '@commitlint/lint': 18.6.1 @@ -810,27 +5245,18 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: false - /@commitlint/config-conventional@18.6.1: - resolution: {integrity: sha512-ftpfAOQyI+IHvut0cRF4EFM39PWCqde+uOXCjH9NpK6FpqfhncAbEvP0E7OIpFsrDX0aS7k81tzH5Yz7prcNxA==} - engines: {node: '>=v18'} + '@commitlint/config-conventional@18.6.1': dependencies: '@commitlint/types': 18.6.1 conventional-changelog-conventionalcommits: 7.0.2 - dev: false - /@commitlint/config-validator@18.6.1: - resolution: {integrity: sha512-05uiToBVfPhepcQWE1ZQBR/Io3+tb3gEotZjnI4tTzzPk16NffN6YABgwFQCLmzZefbDcmwWqJWc2XT47q7Znw==} - engines: {node: '>=v18'} + '@commitlint/config-validator@18.6.1': dependencies: '@commitlint/types': 18.6.1 ajv: 8.12.0 - dev: false - /@commitlint/ensure@18.6.1: - resolution: {integrity: sha512-BPm6+SspyxQ7ZTsZwXc7TRQL5kh5YWt3euKmEIBZnocMFkJevqs3fbLRb8+8I/cfbVcAo4mxRlpTPfz8zX7SnQ==} - engines: {node: '>=v18'} + '@commitlint/ensure@18.6.1': dependencies: '@commitlint/types': 18.6.1 lodash.camelcase: 4.3.0 @@ -838,42 +5264,27 @@ packages: lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - dev: false - /@commitlint/execute-rule@18.6.1: - resolution: {integrity: sha512-7s37a+iWyJiGUeMFF6qBlyZciUkF8odSAnHijbD36YDctLhGKoYltdvuJ/AFfRm6cBLRtRk9cCVPdsEFtt/2rg==} - engines: {node: '>=v18'} - dev: false + '@commitlint/execute-rule@18.6.1': {} - /@commitlint/format@18.6.1: - resolution: {integrity: sha512-K8mNcfU/JEFCharj2xVjxGSF+My+FbUHoqR+4GqPGrHNqXOGNio47ziiR4HQUPKtiNs05o8/WyLBoIpMVOP7wg==} - engines: {node: '>=v18'} + '@commitlint/format@18.6.1': dependencies: '@commitlint/types': 18.6.1 chalk: 4.1.2 - dev: false - /@commitlint/is-ignored@18.6.1: - resolution: {integrity: sha512-MOfJjkEJj/wOaPBw5jFjTtfnx72RGwqYIROABudOtJKW7isVjFe9j0t8xhceA02QebtYf4P/zea4HIwnXg8rvA==} - engines: {node: '>=v18'} + '@commitlint/is-ignored@18.6.1': dependencies: '@commitlint/types': 18.6.1 semver: 7.6.0 - dev: false - /@commitlint/lint@18.6.1: - resolution: {integrity: sha512-8WwIFo3jAuU+h1PkYe5SfnIOzp+TtBHpFr4S8oJWhu44IWKuVx6GOPux3+9H1iHOan/rGBaiacicZkMZuluhfQ==} - engines: {node: '>=v18'} + '@commitlint/lint@18.6.1': dependencies: '@commitlint/is-ignored': 18.6.1 '@commitlint/parse': 18.6.1 '@commitlint/rules': 18.6.1 '@commitlint/types': 18.6.1 - dev: false - /@commitlint/load@18.6.1(@types/node@20.10.4)(typescript@5.3.3): - resolution: {integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==} - engines: {node: '>=v18'} + '@commitlint/load@18.6.1(@types/node@20.10.4)(typescript@5.3.3)': dependencies: '@commitlint/config-validator': 18.6.1 '@commitlint/execute-rule': 18.6.1 @@ -889,35 +5300,23 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: false - /@commitlint/message@18.6.1: - resolution: {integrity: sha512-VKC10UTMLcpVjMIaHHsY1KwhuTQtdIKPkIdVEwWV+YuzKkzhlI3aNy6oo1eAN6b/D2LTtZkJe2enHmX0corYRw==} - engines: {node: '>=v18'} - dev: false + '@commitlint/message@18.6.1': {} - /@commitlint/parse@18.6.1: - resolution: {integrity: sha512-eS/3GREtvVJqGZrwAGRwR9Gdno3YcZ6Xvuaa+vUF8j++wsmxrA2En3n0ccfVO2qVOLJC41ni7jSZhQiJpMPGOQ==} - engines: {node: '>=v18'} + '@commitlint/parse@18.6.1': dependencies: '@commitlint/types': 18.6.1 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - dev: false - /@commitlint/read@18.6.1: - resolution: {integrity: sha512-ia6ODaQFzXrVul07ffSgbZGFajpe8xhnDeLIprLeyfz3ivQU1dIoHp7yz0QIorZ6yuf4nlzg4ZUkluDrGN/J/w==} - engines: {node: '>=v18'} + '@commitlint/read@18.6.1': dependencies: '@commitlint/top-level': 18.6.1 '@commitlint/types': 18.6.1 git-raw-commits: 2.0.11 minimist: 1.2.8 - dev: false - /@commitlint/resolve-extends@18.6.1: - resolution: {integrity: sha512-ifRAQtHwK+Gj3Bxj/5chhc4L2LIc3s30lpsyW67yyjsETR6ctHAHRu1FSpt0KqahK5xESqoJ92v6XxoDRtjwEQ==} - engines: {node: '>=v18'} + '@commitlint/resolve-extends@18.6.1': dependencies: '@commitlint/config-validator': 18.6.1 '@commitlint/types': 18.6.1 @@ -925,466 +5324,170 @@ packages: lodash.mergewith: 4.6.2 resolve-from: 5.0.0 resolve-global: 1.0.0 - dev: false - /@commitlint/rules@18.6.1: - resolution: {integrity: sha512-kguM6HxZDtz60v/zQYOe0voAtTdGybWXefA1iidjWYmyUUspO1zBPQEmJZ05/plIAqCVyNUTAiRPWIBKLCrGew==} - engines: {node: '>=v18'} + '@commitlint/rules@18.6.1': dependencies: '@commitlint/ensure': 18.6.1 '@commitlint/message': 18.6.1 '@commitlint/to-lines': 18.6.1 '@commitlint/types': 18.6.1 execa: 5.1.1 - dev: false - /@commitlint/to-lines@18.6.1: - resolution: {integrity: sha512-Gl+orGBxYSNphx1+83GYeNy5N0dQsHBQ9PJMriaLQDB51UQHCVLBT/HBdOx5VaYksivSf5Os55TLePbRLlW50Q==} - engines: {node: '>=v18'} - dev: false + '@commitlint/to-lines@18.6.1': {} - /@commitlint/top-level@18.6.1: - resolution: {integrity: sha512-HyiHQZUTf0+r0goTCDs/bbVv/LiiQ7AVtz6KIar+8ZrseB9+YJAIo8HQ2IC2QT1y3N1lbW6OqVEsTHjbT6hGSw==} - engines: {node: '>=v18'} + '@commitlint/top-level@18.6.1': dependencies: find-up: 5.0.0 - dev: false - /@commitlint/types@18.6.1: - resolution: {integrity: sha512-gwRLBLra/Dozj2OywopeuHj2ac26gjGkz2cZ+86cTJOdtWfiRRr4+e77ZDAGc6MDWxaWheI+mAV5TLWWRwqrFg==} - engines: {node: '>=v18'} + '@commitlint/types@18.6.1': dependencies: chalk: 4.1.2 - dev: false - /@ctrl/tinycolor@3.6.1: - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} - engines: {node: '>=10'} - dev: false + '@ctrl/tinycolor@3.6.1': {} - /@esbuild/aix-ppc64@0.19.11: - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [aix] - requiresBuild: true - dev: false + '@esbuild/aix-ppc64@0.19.11': optional: true - /@esbuild/android-arm64@0.19.11: - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-arm64@0.19.11': optional: true - /@esbuild/android-arm64@0.19.9: - resolution: {integrity: sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-arm64@0.19.9': optional: true - /@esbuild/android-arm@0.19.11: - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-arm@0.19.11': optional: true - /@esbuild/android-arm@0.19.9: - resolution: {integrity: sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-arm@0.19.9': optional: true - /@esbuild/android-x64@0.19.11: - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-x64@0.19.11': optional: true - /@esbuild/android-x64@0.19.9: - resolution: {integrity: sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: false + '@esbuild/android-x64@0.19.9': optional: true - /@esbuild/darwin-arm64@0.19.11: - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@esbuild/darwin-arm64@0.19.11': optional: true - /@esbuild/darwin-arm64@0.19.9: - resolution: {integrity: sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@esbuild/darwin-arm64@0.19.9': optional: true - /@esbuild/darwin-x64@0.19.11: - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@esbuild/darwin-x64@0.19.11': optional: true - /@esbuild/darwin-x64@0.19.9: - resolution: {integrity: sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@esbuild/darwin-x64@0.19.9': optional: true - /@esbuild/freebsd-arm64@0.19.11: - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false + '@esbuild/freebsd-arm64@0.19.11': optional: true - /@esbuild/freebsd-arm64@0.19.9: - resolution: {integrity: sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: false + '@esbuild/freebsd-arm64@0.19.9': optional: true - /@esbuild/freebsd-x64@0.19.11: - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false + '@esbuild/freebsd-x64@0.19.11': optional: true - /@esbuild/freebsd-x64@0.19.9: - resolution: {integrity: sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: false + '@esbuild/freebsd-x64@0.19.9': optional: true - /@esbuild/linux-arm64@0.19.11: - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-arm64@0.19.11': optional: true - /@esbuild/linux-arm64@0.19.9: - resolution: {integrity: sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-arm64@0.19.9': optional: true - /@esbuild/linux-arm@0.19.11: - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-arm@0.19.11': optional: true - /@esbuild/linux-arm@0.19.9: - resolution: {integrity: sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-arm@0.19.9': optional: true - /@esbuild/linux-ia32@0.19.11: - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-ia32@0.19.11': optional: true - /@esbuild/linux-ia32@0.19.9: - resolution: {integrity: sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-ia32@0.19.9': optional: true - /@esbuild/linux-loong64@0.19.11: - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-loong64@0.19.11': optional: true - /@esbuild/linux-loong64@0.19.9: - resolution: {integrity: sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-loong64@0.19.9': optional: true - /@esbuild/linux-mips64el@0.19.11: - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-mips64el@0.19.11': optional: true - /@esbuild/linux-mips64el@0.19.9: - resolution: {integrity: sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-mips64el@0.19.9': optional: true - /@esbuild/linux-ppc64@0.19.11: - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-ppc64@0.19.11': optional: true - /@esbuild/linux-ppc64@0.19.9: - resolution: {integrity: sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-ppc64@0.19.9': optional: true - /@esbuild/linux-riscv64@0.19.11: - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-riscv64@0.19.11': optional: true - /@esbuild/linux-riscv64@0.19.9: - resolution: {integrity: sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-riscv64@0.19.9': optional: true - /@esbuild/linux-s390x@0.19.11: - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-s390x@0.19.11': optional: true - /@esbuild/linux-s390x@0.19.9: - resolution: {integrity: sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-s390x@0.19.9': optional: true - /@esbuild/linux-x64@0.19.11: - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-x64@0.19.11': optional: true - /@esbuild/linux-x64@0.19.9: - resolution: {integrity: sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@esbuild/linux-x64@0.19.9': optional: true - /@esbuild/netbsd-x64@0.19.11: - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false + '@esbuild/netbsd-x64@0.19.11': optional: true - /@esbuild/netbsd-x64@0.19.9: - resolution: {integrity: sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: false + '@esbuild/netbsd-x64@0.19.9': optional: true - /@esbuild/openbsd-x64@0.19.11: - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: false + '@esbuild/openbsd-x64@0.19.11': optional: true - /@esbuild/openbsd-x64@0.19.9: - resolution: {integrity: sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: false + '@esbuild/openbsd-x64@0.19.9': optional: true - /@esbuild/sunos-x64@0.19.11: - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: false + '@esbuild/sunos-x64@0.19.11': optional: true - /@esbuild/sunos-x64@0.19.9: - resolution: {integrity: sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: false + '@esbuild/sunos-x64@0.19.9': optional: true - /@esbuild/win32-arm64@0.19.11: - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-arm64@0.19.11': optional: true - /@esbuild/win32-arm64@0.19.9: - resolution: {integrity: sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-arm64@0.19.9': optional: true - /@esbuild/win32-ia32@0.19.11: - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-ia32@0.19.11': optional: true - /@esbuild/win32-ia32@0.19.9: - resolution: {integrity: sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-ia32@0.19.9': optional: true - /@esbuild/win32-x64@0.19.11: - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-x64@0.19.11': optional: true - /@esbuild/win32-x64@0.19.9: - resolution: {integrity: sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@esbuild/win32-x64@0.19.9': optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.53.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.53.0)': dependencies: eslint: 8.53.0 eslint-visitor-keys: 3.4.3 - dev: false - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: false + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.3: - resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.3': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -1397,132 +5500,89 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: false - /@eslint/js@8.53.0: - resolution: {integrity: sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + '@eslint/js@8.53.0': {} - /@expressive-code/core@0.29.4: - resolution: {integrity: sha512-XBdMPO4BBgPxE+txtNdjkDmLwGxJpU+QqLQ/WrHWPcj1lTXcoFQTUqFO4Eav+hv/Yn+lEjiv792RrcUe2o0anA==} + '@expressive-code/core@0.29.4': dependencies: '@ctrl/tinycolor': 3.6.1 hast-util-to-html: 8.0.4 hastscript: 7.2.0 postcss: 8.4.32 postcss-nested: 6.0.1(postcss@8.4.32) - dev: false - /@expressive-code/plugin-frames@0.29.4: - resolution: {integrity: sha512-GE3sB7JTqjhTz7LrCm+mL9x+bIdud76AVqJa/brJgqpYFcl5aJcHtyR0PSZQqTXHL3sBIj8w0wbh+ieVM43JnQ==} + '@expressive-code/plugin-frames@0.29.4': dependencies: '@expressive-code/core': 0.29.4 hastscript: 7.2.0 - dev: false - /@expressive-code/plugin-shiki@0.29.4: - resolution: {integrity: sha512-vOM2JFVEClg3EAWHVd+ma8y/EsINqzCrQP1PS9sZgn2KASE3C6JBkNRXzUXKGkjDn0dsWJVYYvIsH+4xNpygZA==} + '@expressive-code/plugin-shiki@0.29.4': dependencies: '@expressive-code/core': 0.29.4 shiki: 0.14.6 - dev: false - /@expressive-code/plugin-text-markers@0.29.4: - resolution: {integrity: sha512-U8rouNRrLzAo11Ihoi4iqEH7FD+VEUb6Pe7xJxlFJ7HRhgaFIcuHyYyn6jA1WmGP5k9BFLhYBk53+oKvlmEkKw==} + '@expressive-code/plugin-text-markers@0.29.4': dependencies: '@expressive-code/core': 0.29.4 hastscript: 7.2.0 unist-util-visit-parents: 5.1.3 - dev: false - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.13': dependencies: '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: false - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: false + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: false + '@humanwhocodes/object-schema@2.0.1': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: false + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.20 - dev: false - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: false + '@jridgewell/resolve-uri@3.1.1': {} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: false + '@jridgewell/set-array@1.1.2': {} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + '@jridgewell/source-map@0.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 - dev: false - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: false + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + '@jridgewell/trace-mapping@0.3.20': dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - /@jridgewell/trace-mapping@0.3.22: - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + '@jridgewell/trace-mapping@0.3.22': dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - /@manypkg/find-root@1.1.0: - resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.23.2 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 - dev: false - /@manypkg/get-packages@1.1.3: - resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + '@manypkg/get-packages@1.1.3': dependencies: '@babel/runtime': 7.23.2 '@changesets/types': 4.1.0 @@ -1530,10 +5590,8 @@ packages: fs-extra: 8.1.0 globby: 11.1.0 read-yaml-file: 1.1.0 - dev: false - /@mdx-js/mdx@3.0.0: - resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} + '@mdx-js/mdx@3.0.0': dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.3 @@ -1560,83 +5618,40 @@ packages: vfile: 6.0.1 transitivePeerDependencies: - supports-color - dev: false - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: false - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: false + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 - dev: false - /@pagefind/darwin-arm64@1.0.4: - resolution: {integrity: sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@pagefind/darwin-arm64@1.0.4': optional: true - /@pagefind/darwin-x64@1.0.4: - resolution: {integrity: sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@pagefind/darwin-x64@1.0.4': optional: true - /@pagefind/default-ui@1.0.4: - resolution: {integrity: sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==} - dev: false + '@pagefind/default-ui@1.0.4': {} - /@pagefind/linux-arm64@1.0.4: - resolution: {integrity: sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@pagefind/linux-arm64@1.0.4': optional: true - /@pagefind/linux-x64@1.0.4: - resolution: {integrity: sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@pagefind/linux-x64@1.0.4': optional: true - /@pagefind/windows-x64@1.0.4: - resolution: {integrity: sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@pagefind/windows-x64@1.0.4': optional: true - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: false + '@pkgjs/parseargs@0.11.0': optional: true - /@pkgr/utils@2.4.2: - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@pkgr/utils@2.4.2': dependencies: cross-spawn: 7.0.3 fast-glob: 3.3.2 @@ -1644,307 +5659,165 @@ packages: open: 9.1.0 picocolors: 1.0.0 tslib: 2.6.2 - dev: false - /@rollup/rollup-android-arm-eabi@4.9.0: - resolution: {integrity: sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: false + '@rollup/rollup-android-arm-eabi@4.9.0': optional: true - /@rollup/rollup-android-arm64@4.9.0: - resolution: {integrity: sha512-im6hUEyQ7ZfoZdNvtwgEJvBWZYauC9KVKq1w58LG2Zfz6zMd8gRrbN+xCVoqA2hv/v6fm9lp5LFGJ3za8EQH3A==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: false + '@rollup/rollup-android-arm64@4.9.0': optional: true - /@rollup/rollup-darwin-arm64@4.9.0: - resolution: {integrity: sha512-u7aTMskN6Dmg1lCT0QJ+tINRt+ntUrvVkhbPfFz4bCwRZvjItx2nJtwJnJRlKMMaQCHRjrNqHRDYvE4mBm3DlQ==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + '@rollup/rollup-darwin-arm64@4.9.0': optional: true - /@rollup/rollup-darwin-x64@4.9.0: - resolution: {integrity: sha512-8FvEl3w2ExmpcOmX5RJD0yqXcVSOqAJJUJ29Lca29Ik+3zPS1yFimr2fr5JSZ4Z5gt8/d7WqycpgkX9nocijSw==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + '@rollup/rollup-darwin-x64@4.9.0': optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.9.0: - resolution: {integrity: sha512-lHoKYaRwd4gge+IpqJHCY+8Vc3hhdJfU6ukFnnrJasEBUvVlydP8PuwndbWfGkdgSvZhHfSEw6urrlBj0TSSfg==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: false + '@rollup/rollup-linux-arm-gnueabihf@4.9.0': optional: true - /@rollup/rollup-linux-arm64-gnu@4.9.0: - resolution: {integrity: sha512-JbEPfhndYeWHfOSeh4DOFvNXrj7ls9S/2omijVsao+LBPTPayT1uKcK3dHW3MwDJ7KO11t9m2cVTqXnTKpeaiw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@rollup/rollup-linux-arm64-gnu@4.9.0': optional: true - /@rollup/rollup-linux-arm64-musl@4.9.0: - resolution: {integrity: sha512-ahqcSXLlcV2XUBM3/f/C6cRoh7NxYA/W7Yzuv4bDU1YscTFw7ay4LmD7l6OS8EMhTNvcrWGkEettL1Bhjf+B+w==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + '@rollup/rollup-linux-arm64-musl@4.9.0': optional: true - /@rollup/rollup-linux-riscv64-gnu@4.9.0: - resolution: {integrity: sha512-uwvOYNtLw8gVtrExKhdFsYHA/kotURUmZYlinH2VcQxNCQJeJXnkmWgw2hI9Xgzhgu7J9QvWiq9TtTVwWMDa+w==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: false + '@rollup/rollup-linux-riscv64-gnu@4.9.0': optional: true - /@rollup/rollup-linux-x64-gnu@4.9.0: - resolution: {integrity: sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@rollup/rollup-linux-x64-gnu@4.9.0': optional: true - /@rollup/rollup-linux-x64-musl@4.9.0: - resolution: {integrity: sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + '@rollup/rollup-linux-x64-musl@4.9.0': optional: true - /@rollup/rollup-win32-arm64-msvc@4.9.0: - resolution: {integrity: sha512-9jPgMvTKXARz4inw6jezMLA2ihDBvgIU9Ml01hjdVpOcMKyxFBJrn83KVQINnbeqDv0+HdO1c09hgZ8N0s820Q==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + '@rollup/rollup-win32-arm64-msvc@4.9.0': optional: true - /@rollup/rollup-win32-ia32-msvc@4.9.0: - resolution: {integrity: sha512-WE4pT2kTXQN2bAv40Uog0AsV7/s9nT9HBWXAou8+++MBCnY51QS02KYtm6dQxxosKi1VIz/wZIrTQO5UP2EW+Q==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: false + '@rollup/rollup-win32-ia32-msvc@4.9.0': optional: true - /@rollup/rollup-win32-x64-msvc@4.9.0: - resolution: {integrity: sha512-aPP5Q5AqNGuT0tnuEkK/g4mnt3ZhheiXrDIiSVIHN9mcN21OyXDVbEMqmXPE7e2OplNLDkcvV+ZoGJa2ZImFgw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + '@rollup/rollup-win32-x64-msvc@4.9.0': optional: true - /@types/acorn@4.0.6: - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + '@types/acorn@4.0.6': dependencies: '@types/estree': 1.0.5 - dev: false - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.23.6 '@babel/types': 7.23.6 '@types/babel__generator': 7.6.7 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.4 - dev: false - /@types/babel__generator@7.6.7: - resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} + '@types/babel__generator@7.6.7': dependencies: '@babel/types': 7.23.6 - dev: false - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.23.6 '@babel/types': 7.23.6 - dev: false - /@types/babel__traverse@7.20.4: - resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} + '@types/babel__traverse@7.20.4': dependencies: '@babel/types': 7.23.6 - dev: false - /@types/bun@1.0.5: - resolution: {integrity: sha512-c14fs5QLLanldcZpX/GjIEKeo++NDzOlixUZ7IUWzN7AoBTisYyWxaxdXNhpAP5I1mPcd92Zagq8sdgTnUXWjg==} + '@types/bun@1.0.5': dependencies: bun-types: 1.0.26 - dev: true - /@types/bun@1.1.2: - resolution: {integrity: sha512-pRBDD3EDqPf83qe95i3EpYu5G2J8bbb78a3736vnCm2K8YWtEE5cvJUq2jkKvJhW07YTfQtbImywIwRhWL8z3Q==} + '@types/bun@1.1.2': dependencies: bun-types: 1.1.8 - dev: true - /@types/debug@4.1.12: - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 - dev: false - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.2 '@types/estree': 1.0.5 - dev: false - /@types/eslint@8.44.7: - resolution: {integrity: sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==} + '@types/eslint@8.44.7': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - dev: false - /@types/eslint@8.56.2: - resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + '@types/eslint@8.56.2': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - dev: false - /@types/estree-jsx@1.0.3: - resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} + '@types/estree-jsx@1.0.3': dependencies: '@types/estree': 1.0.5 - dev: false - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: false + '@types/estree@1.0.5': {} - /@types/hast@2.3.8: - resolution: {integrity: sha512-aMIqAlFd2wTIDZuvLbhUT+TGvMxrNC8ECUIVtH6xxy0sQLs3iu6NO8Kp/VT5je7i5ufnebXzdV1dNDMnvaH6IQ==} + '@types/hast@2.3.8': dependencies: '@types/unist': 2.0.10 - dev: false - /@types/hast@3.0.3: - resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} + '@types/hast@3.0.3': dependencies: '@types/unist': 3.0.2 - dev: false - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false + '@types/json-schema@7.0.15': {} - /@types/json5@0.0.29: - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: false + '@types/json5@0.0.29': {} - /@types/mdast@4.0.3: - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + '@types/mdast@4.0.3': dependencies: '@types/unist': 3.0.2 - dev: false - /@types/mdx@2.0.10: - resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} - dev: false + '@types/mdx@2.0.10': {} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: false + '@types/minimist@1.2.5': {} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: false + '@types/ms@0.7.34': {} - /@types/nlcst@1.0.4: - resolution: {integrity: sha512-ABoYdNQ/kBSsLvZAekMhIPMQ3YUZvavStpKYs7BjLLuKVmIMA0LUgZ7b54zzuWJRbHF80v1cNf4r90Vd6eMQDg==} + '@types/nlcst@1.0.4': dependencies: '@types/unist': 2.0.10 - dev: false - /@types/node@12.20.55: - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - dev: false + '@types/node@12.20.55': {} - /@types/node@17.0.45: - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - dev: false + '@types/node@17.0.45': {} - /@types/node@20.10.4: - resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} + '@types/node@20.10.4': dependencies: undici-types: 5.26.5 - /@types/node@20.11.17: - resolution: {integrity: sha512-QmgQZGWu1Yw9TDyAP9ZzpFJKynYNeOvwMJmaxABfieQoVoiVOS6MN1WSpqpRcbeA5+RW82kraAVxCCJg+780Qw==} + '@types/node@20.11.17': dependencies: undici-types: 5.26.5 - dev: true - /@types/node@20.12.14: - resolution: {integrity: sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==} + '@types/node@20.12.14': dependencies: undici-types: 5.26.5 - dev: true - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: false + '@types/normalize-package-data@2.4.4': {} - /@types/parse5@6.0.3: - resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} - dev: false + '@types/parse5@6.0.3': {} - /@types/sax@1.2.7: - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} + '@types/sax@1.2.7': dependencies: '@types/node': 20.10.4 - dev: false - /@types/semver@7.5.5: - resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} - dev: false + '@types/semver@7.5.5': {} - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - dev: false + '@types/unist@2.0.10': {} - /@types/unist@3.0.2: - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - dev: false + '@types/unist@3.0.2': {} - /@types/ws@8.5.10: - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} + '@types/ws@8.5.10': dependencies: '@types/node': 20.10.4 - dev: true - /@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3): - resolution: {integrity: sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) @@ -1962,17 +5835,8 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.3.3): - resolution: {integrity: sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.3.3)': dependencies: '@typescript-eslint/scope-manager': 6.10.0 '@typescript-eslint/types': 6.10.0 @@ -1983,25 +5847,13 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/scope-manager@6.10.0: - resolution: {integrity: sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@6.10.0': dependencies: '@typescript-eslint/types': 6.10.0 '@typescript-eslint/visitor-keys': 6.10.0 - dev: false - /@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.3.3): - resolution: {integrity: sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.3.3)': dependencies: '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.3.3) '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.3.3) @@ -2011,21 +5863,10 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/types@6.10.0: - resolution: {integrity: sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: false + '@typescript-eslint/types@6.10.0': {} - /@typescript-eslint/typescript-estree@6.10.0(typescript@5.3.3): - resolution: {integrity: sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.10.0(typescript@5.3.3)': dependencies: '@typescript-eslint/types': 6.10.0 '@typescript-eslint/visitor-keys': 6.10.0 @@ -2037,13 +5878,8 @@ packages: typescript: 5.3.3 transitivePeerDependencies: - supports-color - dev: false - /@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.3.3): - resolution: {integrity: sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.3.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) '@types/json-schema': 7.0.15 @@ -2056,78 +5892,51 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: false - /@typescript-eslint/visitor-keys@6.10.0: - resolution: {integrity: sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@6.10.0': dependencies: '@typescript-eslint/types': 6.10.0 eslint-visitor-keys: 3.4.3 - dev: false - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: false + '@ungap/structured-clone@1.2.0': {} - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + '@webassemblyjs/ast@1.11.6': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: false - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: false + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: false + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: false + '@webassemblyjs/helper-buffer@1.11.6': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: false - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: false + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + '@webassemblyjs/helper-wasm-section@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 - dev: false - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - dev: false - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - dev: false - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: false + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + '@webassemblyjs/wasm-edit@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 @@ -2137,29 +5946,23 @@ packages: '@webassemblyjs/wasm-opt': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 - dev: false - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + '@webassemblyjs/wasm-gen@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: false - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + '@webassemblyjs/wasm-opt@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - dev: false - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + '@webassemblyjs/wasm-parser@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 @@ -2167,244 +5970,143 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: false - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + '@webassemblyjs/wast-printer@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - dev: false - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: false + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: false + '@xtuc/long@4.2.2': {} - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: false - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - dev: false - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 + acorn-import-assertions@1.9.0(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: false - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.2): dependencies: acorn: 8.11.2 - dev: false - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false + acorn@8.11.2: {} - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false + acorn@8.11.3: {} - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: false - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: false - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: false - /ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-align@3.0.1: dependencies: string-width: 4.2.3 - dev: false - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: false + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - dev: false - /ansi-escapes@6.2.0: - resolution: {integrity: sha512-kzRaCqXnpzWs+3z5ABPQiVke+iq0KXkHo8xiWV4RPTi5Yli0l97BEQuhXV1s7+aSU/fu1kUuxgS4MsQ0fRuygw==} - engines: {node: '>=14.16'} + ansi-escapes@6.2.0: dependencies: type-fest: 3.13.1 - dev: false - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: false + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: false + ansi-regex@6.0.1: {} - /ansi-sequence-parser@1.1.1: - resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} - dev: false + ansi-sequence-parser@1.1.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - dev: false - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - dev: false - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: false + ansi-styles@6.2.1: {} - /ansis@2.0.3: - resolution: {integrity: sha512-tcSGX0mhuDFHsgRrT56xnZ9v2X+TOeKhJ75YopI5OBgyT7tGaG5m6BmeC+6KHjiucfBvUHehQMecHbULIAkFPA==} - engines: {node: '>=12.13'} - dev: false + ansis@2.0.3: {} - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false + any-promise@1.3.0: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - dev: false - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: false + arg@5.0.2: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - dev: false - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: false + argparse@2.0.1: {} - /array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.0: dependencies: call-bind: 1.0.5 is-array-buffer: 3.0.2 - dev: false - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: false + array-ify@1.0.0: {} - /array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 get-intrinsic: 1.2.2 is-string: 1.0.7 - dev: false - /array-iterate@2.0.1: - resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} - dev: false + array-iterate@2.0.1: {} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false + array-union@2.1.0: {} - /array.prototype.find@2.2.2: - resolution: {integrity: sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==} + array.prototype.find@2.2.2: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 - dev: false - /array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 - dev: false - /array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + array.prototype.flatmap@1.3.2: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 es-shim-unscopables: 1.0.2 - dev: false - /arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} + arraybuffer.prototype.slice@1.0.2: dependencies: array-buffer-byte-length: 1.0.0 call-bind: 1.0.5 @@ -2413,36 +6115,19 @@ packages: get-intrinsic: 1.2.2 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - dev: false - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: false + arrify@1.0.1: {} - /arrify@3.0.0: - resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} - engines: {node: '>=12'} - dev: false + arrify@3.0.0: {} - /astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - dev: false + astring@1.8.6: {} - /astro-expressive-code@0.29.4(astro@4.0.5): - resolution: {integrity: sha512-FoOp0gq+BOss92Tqm1tmUJwVsmCE9odEfura/an27l2tc6LU9Ki2NX3N6TWpvl95NLKQZeFpBl26ZB2yhjrt2Q==} - peerDependencies: - astro: ^3.0.0-beta || ^4.0.0-beta + astro-expressive-code@0.29.4(astro@4.0.5): dependencies: astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) remark-expressive-code: 0.29.4 - dev: false - /astro@4.0.5(@types/node@20.10.4)(typescript@5.3.3): - resolution: {integrity: sha512-OTiTEiXYdXTkVJXNNKIWdYG1z2wpTST+92Qcldm36x91Pe4fKpLxeuRloy5cW175oHi8lvXytgG3Gl3VBP18RQ==} - engines: {node: '>=18.14.1', npm: '>=6.14.0'} - hasBin: true + astro@4.0.5(@types/node@20.10.4)(typescript@5.3.3): dependencies: '@astrojs/compiler': 2.3.2 '@astrojs/internal-helpers': 0.2.1 @@ -2517,19 +6202,10 @@ packages: - supports-color - terser - typescript - dev: false - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - dev: false + atomic-sleep@1.0.0: {} - /autoprefixer@10.4.16(postcss@8.4.32): - resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 + autoprefixer@10.4.16(postcss@8.4.32): dependencies: browserslist: 4.22.2 caniuse-lite: 1.0.30001570 @@ -2538,85 +6214,50 @@ packages: picocolors: 1.0.0 postcss: 8.4.32 postcss-value-parser: 4.2.0 - dev: false - /available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: false + available-typed-arrays@1.0.5: {} - /b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - dev: false + b4a@1.6.4: {} - /bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - dev: false + bail@2.0.2: {} - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false + balanced-match@1.0.2: {} - /base-64@1.0.0: - resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} - dev: false + base-64@1.0.0: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false + base64-js@1.5.1: {} - /bcp-47-match@2.0.3: - resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} - dev: false + bcp-47-match@2.0.3: {} - /bcp-47@2.1.0: - resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + bcp-47@2.1.0: dependencies: is-alphabetical: 2.0.1 is-alphanumerical: 2.0.1 is-decimal: 2.0.1 - dev: false - /better-path-resolve@1.0.0: - resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} - engines: {node: '>=4'} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 - dev: false - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: false + big-integer@1.6.51: {} - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: false + binary-extensions@2.2.0: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false - /bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + bl@5.1.0: dependencies: buffer: 6.0.3 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: false + boolbase@1.0.0: {} - /boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} + boxen@7.1.1: dependencies: ansi-align: 3.0.1 camelcase: 7.0.1 @@ -2626,207 +6267,124 @@ packages: type-fest: 2.19.0 widest-line: 4.0.1 wrap-ansi: 8.1.0 - dev: false - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.51 - dev: false - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - dev: false - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - dev: false - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - dev: false - /breakword@1.0.6: - resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + breakword@1.0.6: dependencies: wcwidth: 1.0.1 - dev: false - /browserslist@4.22.2: - resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.22.2: dependencies: caniuse-lite: 1.0.30001570 electron-to-chromium: 1.4.613 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) - dev: false - /browserslist@4.22.3: - resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.22.3: dependencies: caniuse-lite: 1.0.30001587 electron-to-chromium: 1.4.667 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.3) - dev: false - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: false + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false - /builtin-modules@3.3.0: - resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} - engines: {node: '>=6'} - dev: false + builtin-modules@3.3.0: {} - /builtins@5.0.1: - resolution: {integrity: sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==} + builtins@5.0.1: dependencies: semver: 7.5.4 - dev: false - /bun-types@1.0.26: - resolution: {integrity: sha512-VcSj+SCaWIcMb0uSGIAtr8P92zq9q+unavcQmx27fk6HulCthXHBVrdGuXxAZbFtv7bHVjizRzR2mk9r/U8Nkg==} + bun-types@1.0.26: dependencies: '@types/node': 20.11.17 '@types/ws': 8.5.10 - dev: true - /bun-types@1.1.8: - resolution: {integrity: sha512-dwhfuUKSGK8hm5Llcvb5+ejRh+4mIt8ibObJVKhZBsi0ScpXmt+AlaS1eDW6uRXCHj084Qt0kIqAJ08/7ZGC9Q==} + bun-types@1.1.8: dependencies: '@types/node': 20.12.14 '@types/ws': 8.5.10 - dev: true - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} + bundle-name@3.0.0: dependencies: run-applescript: 5.0.0 - dev: false - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} + call-bind@1.0.5: dependencies: function-bind: 1.1.2 get-intrinsic: 1.2.2 set-function-length: 1.1.1 - dev: false - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: false + callsites@3.1.0: {} - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: false + camelcase-css@2.0.1: {} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: false - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: false + camelcase@5.3.1: {} - /camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - dev: false + camelcase@7.0.1: {} - /caniuse-lite@1.0.30001570: - resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} - dev: false + caniuse-lite@1.0.30001570: {} - /caniuse-lite@1.0.30001587: - resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==} - dev: false + caniuse-lite@1.0.30001587: {} - /ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - dev: false + ccount@2.0.1: {} - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - dev: false - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - dev: false - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false + chalk@5.3.0: {} - /character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - dev: false + character-entities-html4@2.1.0: {} - /character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - dev: false + character-entities-legacy@3.0.0: {} - /character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: false + character-entities@2.0.2: {} - /character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - dev: false + character-reference-invalid@2.0.1: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: false + chardet@0.7.0: {} - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -2837,616 +6395,332 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: false - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false + chownr@1.1.4: {} - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: false + chrome-trace-event@1.0.3: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: false + ci-info@3.9.0: {} - /ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} - dev: false + ci-info@4.0.0: {} - /clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} + clean-regexp@1.0.0: dependencies: escape-string-regexp: 1.0.5 - dev: false - /cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - dev: false + cli-boxes@3.0.0: {} - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + cli-cursor@4.0.0: dependencies: restore-cursor: 4.0.0 - dev: false - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: false + cli-spinners@2.9.2: {} - /cli-truncate@4.0.0: - resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} - engines: {node: '>=18'} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 string-width: 7.1.0 - dev: false - /cliui@6.0.0: - resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@6.0.0: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: false - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: false - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - dev: false + clone@1.0.4: {} - /clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - dev: false + clsx@2.0.0: {} - /collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - dev: false + collapse-white-space@2.1.0: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - dev: false - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - dev: false - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: false + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false + color-name@1.1.4: {} - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-string@1.9.1: dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - dev: false - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} + color@4.2.3: dependencies: color-convert: 2.0.1 color-string: 1.9.1 - dev: false - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: false + colorette@2.0.20: {} - /comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - dev: false + comma-separated-tokens@2.0.3: {} - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: false + commander@11.1.0: {} - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: false + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: false + commander@4.1.1: {} - /common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - dev: false + common-ancestor-path@1.0.1: {} - /common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - dev: false + common-path-prefix@3.0.0: {} - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: false - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: false + concat-map@0.0.1: {} - /confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - dev: false + confusing-browser-globals@1.0.11: {} - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 - dev: false - /conventional-changelog-conventionalcommits@7.0.2: - resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} - engines: {node: '>=16'} + conventional-changelog-conventionalcommits@7.0.2: dependencies: compare-func: 2.0.0 - dev: false - /conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true + conventional-commits-parser@5.0.0: dependencies: JSONStream: 1.3.5 is-text-path: 2.0.0 meow: 12.1.1 split2: 4.2.0 - dev: false - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: false + convert-source-map@2.0.0: {} - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - dev: false + cookie@0.6.0: {} - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.4)(cosmiconfig@8.3.6)(typescript@5.3.3): - resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} - engines: {node: '>=v16'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=8.2' - typescript: '>=4' + cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.4)(cosmiconfig@8.3.6)(typescript@5.3.3): dependencies: '@types/node': 20.10.4 cosmiconfig: 8.3.6(typescript@5.3.3) jiti: 1.21.0 typescript: 5.3.3 - dev: false - /cosmiconfig@8.3.6(typescript@5.3.3): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@8.3.6(typescript@5.3.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 typescript: 5.3.3 - dev: false - /cosmiconfig@9.0.0(typescript@5.3.3): - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@9.0.0(typescript@5.3.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 typescript: 5.3.3 - dev: false - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 shebang-command: 1.2.0 which: 1.3.1 - dev: false - /cross-spawn@6.0.5: - resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} - engines: {node: '>=4.8'} + cross-spawn@6.0.5: dependencies: nice-try: 1.0.5 path-key: 2.0.1 semver: 5.7.2 shebang-command: 1.2.0 which: 1.3.1 - dev: false - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - dev: false - /css-selector-parser@3.0.3: - resolution: {integrity: sha512-HAcgYSBFKo1jnglINdHeBPIscPOCOh8vCDCaOV5xkwMSlGPEnfdynxBuWkgZMwXltMKgFbDcr4EPmDpSWi34MA==} - dev: false + css-selector-parser@3.0.3: {} - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: false + cssesc@3.0.0: {} - /csv-generate@3.4.3: - resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} - dev: false + csv-generate@3.4.3: {} - /csv-parse@4.16.3: - resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} - dev: false + csv-parse@4.16.3: {} - /csv-stringify@5.6.5: - resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} - dev: false + csv-stringify@5.6.5: {} - /csv@5.5.3: - resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} - engines: {node: '>= 0.1.90'} + csv@5.5.3: dependencies: csv-generate: 3.4.3 csv-parse: 4.16.3 csv-stringify: 5.6.5 stream-transform: 2.1.3 - dev: false - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: false + dargs@7.0.0: {} - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - dev: false - /debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@3.2.7: dependencies: ms: 2.1.2 - dev: false - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - dev: false - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: false - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - dev: false + decamelize@1.2.0: {} - /decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 - dev: false - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + decompress-response@6.0.0: dependencies: mimic-response: 3.1.0 - dev: false - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: false + deep-extend@0.6.0: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: false + deep-is@0.1.4: {} - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} + default-browser-id@3.0.0: dependencies: bplist-parser: 0.2.0 untildify: 4.0.0 - dev: false - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} + default-browser@4.0.0: dependencies: bundle-name: 3.0.0 default-browser-id: 3.0.0 execa: 7.2.0 titleize: 3.0.0 - dev: false - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - dev: false - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} + define-data-property@1.1.1: dependencies: get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: false - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - dev: false + define-lazy-prop@2.0.0: {} - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - dev: false + define-lazy-prop@3.0.0: {} - /define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: dependencies: define-data-property: 1.1.1 has-property-descriptors: 1.0.1 object-keys: 1.1.1 - dev: false - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - dev: false + denque@2.1.0: {} - /dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - dev: false + dequal@2.0.3: {} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: false + detect-indent@6.1.0: {} - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false + detect-libc@2.0.2: {} - /deterministic-object-hash@2.0.2: - resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} - engines: {node: '>=18'} + deterministic-object-hash@2.0.2: dependencies: base-64: 1.0.0 - dev: false - /devalue@4.3.2: - resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} - dev: false + devalue@4.3.2: {} - /devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + devlop@1.1.0: dependencies: dequal: 2.0.3 - dev: false - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: false + didyoumean@1.2.2: {} - /diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - dev: false + diff@5.1.0: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: false - /direction@2.0.1: - resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==} - hasBin: true - dev: false + direction@2.0.1: {} - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: false + dlv@1.1.3: {} - /doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + doctrine@2.1.0: dependencies: esutils: 2.0.3 - dev: false - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: false - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: false - /dset@3.1.3: - resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} - engines: {node: '>=4'} - dev: false + dset@3.1.3: {} - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: false + eastasianwidth@0.2.0: {} - /electron-to-chromium@1.4.613: - resolution: {integrity: sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==} - dev: false + electron-to-chromium@1.4.613: {} - /electron-to-chromium@1.4.667: - resolution: {integrity: sha512-66L3pLlWhTNVUhnmSA5+qDM3fwnXsM6KAqE36e2w4KN0g6pkEtlT5bs41FQtQwVwKnfhNBXiWRLPs30HSxd7Kw==} - dev: false + electron-to-chromium@1.4.667: {} - /elegant-spinner@3.0.0: - resolution: {integrity: sha512-nWUuor3FWTGYAch7SY0unb5qLzs7eAc24ic9PBh+eQctFNQ4IDWJqBpBgsL4SrrGHHN0mJoL7CpWZby5t2KjFg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + elegant-spinner@3.0.0: {} - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: false + emoji-regex@10.3.0: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: false + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false + emoji-regex@9.2.2: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - dev: false - /enhance-visitors@1.0.0: - resolution: {integrity: sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==} - engines: {node: '>=4.0.0'} + enhance-visitors@1.0.0: dependencies: lodash: 4.17.21 - dev: false - /enhanced-resolve@0.9.1: - resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} - engines: {node: '>=0.6'} + enhanced-resolve@0.9.1: dependencies: graceful-fs: 4.2.11 memory-fs: 0.2.0 tapable: 0.1.10 - dev: false - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.15.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: false - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - dev: false - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: false + entities@4.5.0: {} - /env-editor@1.1.0: - resolution: {integrity: sha512-7AXskzN6T7Q9TFcKAGJprUbpQa4i1VsAetO9rdBqbGMGlragTziBgWt4pVYJMBWHQlLoX0buy6WFikzPH4Qjpw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + env-editor@1.1.0: {} - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: false + env-paths@2.2.1: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - dev: false - /es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} - engines: {node: '>= 0.4'} + es-abstract@1.22.3: dependencies: array-buffer-byte-length: 1.0.0 arraybuffer.prototype.slice: 1.0.2 @@ -3487,41 +6761,26 @@ packages: typed-array-length: 1.0.4 unbox-primitive: 1.0.2 which-typed-array: 1.1.13 - dev: false - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - dev: false + es-module-lexer@1.4.1: {} - /es-set-tostringtag@2.0.2: - resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.0.2: dependencies: get-intrinsic: 1.2.2 has-tostringtag: 1.0.0 hasown: 2.0.0 - dev: false - /es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.1 - dev: false - /es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.2.1: dependencies: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: false - /esbuild@0.19.11: - resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.11: optionalDependencies: '@esbuild/aix-ppc64': 0.19.11 '@esbuild/android-arm': 0.19.11 @@ -3546,13 +6805,8 @@ packages: '@esbuild/win32-arm64': 0.19.11 '@esbuild/win32-ia32': 0.19.11 '@esbuild/win32-x64': 0.19.11 - dev: false - /esbuild@0.19.9: - resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true + esbuild@0.19.9: optionalDependencies: '@esbuild/android-arm': 0.19.9 '@esbuild/android-arm64': 0.19.9 @@ -3576,70 +6830,34 @@ packages: '@esbuild/win32-arm64': 0.19.9 '@esbuild/win32-ia32': 0.19.9 '@esbuild/win32-x64': 0.19.9 - dev: false - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: false + escalade@3.1.1: {} - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - dev: false + escalade@3.1.2: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: false + escape-string-regexp@1.0.5: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: false + escape-string-regexp@4.0.0: {} - /escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - dev: false + escape-string-regexp@5.0.0: {} - /eslint-config-prettier@8.10.0(eslint@8.53.0): - resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@8.10.0(eslint@8.53.0): dependencies: eslint: 8.53.0 - dev: false - /eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3): - resolution: {integrity: sha512-vPQssnRSUgBFOEfB/KY12CXwltwFSn4RSCfa+w7gjBC2PFQ7Yfgmyei+1XUZ3K+8LRGef2NMJUcxts7PldhDjg==} - engines: {node: '>=16'} - peerDependencies: - '@typescript-eslint/eslint-plugin': '>=6.0.0' - '@typescript-eslint/parser': '>=6.0.0' - eslint: '>=8.0.0' - typescript: '>=4.7' + eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3): dependencies: '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3) '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) eslint: 8.53.0 typescript: 5.3.3 - dev: false - /eslint-config-xo@0.43.1(eslint@8.53.0): - resolution: {integrity: sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=8.27.0' + eslint-config-xo@0.43.1(eslint@8.53.0): dependencies: confusing-browser-globals: 1.0.11 eslint: 8.53.0 - dev: false - /eslint-formatter-pretty@5.0.0: - resolution: {integrity: sha512-Uick451FoL22/wXqyScX3inW8ZlD/GQO7eFXj3bqb6N/ZtuuF00/CwSNIKLbFCJPrX5V4EdQBSgJ/UVnmLRnug==} - engines: {node: '>=14.16'} + eslint-formatter-pretty@5.0.0: dependencies: '@types/eslint': 8.44.7 ansi-escapes: 4.3.2 @@ -3649,24 +6867,16 @@ packages: plur: 4.0.0 string-width: 4.2.3 supports-hyperlinks: 2.3.0 - dev: false - /eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 is-core-module: 2.13.1 resolve: 1.22.8 transitivePeerDependencies: - supports-color - dev: false - /eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1): - resolution: {integrity: sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA==} - engines: {node: '>= 6'} - peerDependencies: - eslint-plugin-import: '>=1.4.0' - webpack: '>=1.11.0' + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1): dependencies: array.prototype.find: 2.2.2 debug: 3.2.7 @@ -3683,28 +6893,8 @@ packages: webpack: 5.90.1 transitivePeerDependencies: - supports-color - dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0): - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0): dependencies: '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) debug: 3.2.7 @@ -3713,13 +6903,8 @@ packages: eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1) transitivePeerDependencies: - supports-color - dev: false - /eslint-plugin-ava@14.0.0(eslint@8.53.0): - resolution: {integrity: sha512-XmKT6hppaipwwnLVwwvQliSU6AF1QMHiNoLD5JQfzhUhf0jY7CO0O624fQrE+Y/fTb9vbW8r77nKf7M/oHulxw==} - engines: {node: '>=14.17 <15 || >=16.4'} - peerDependencies: - eslint: '>=8.26.0' + eslint-plugin-ava@14.0.0(eslint@8.53.0): dependencies: enhance-visitors: 1.0.0 eslint: 8.53.0 @@ -3730,39 +6915,20 @@ packages: micro-spelling-correcter: 1.1.1 pkg-dir: 5.0.0 resolve-from: 5.0.0 - dev: false - /eslint-plugin-es-x@7.3.0(eslint@8.53.0): - resolution: {integrity: sha512-W9zIs+k00I/I13+Bdkl/zG1MEO07G97XjUSQuH117w620SJ6bHtLUmoMvkGA2oYnI/gNdr+G7BONLyYnFaLLEQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' + eslint-plugin-es-x@7.3.0(eslint@8.53.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) '@eslint-community/regexpp': 4.10.0 eslint: 8.53.0 - dev: false - /eslint-plugin-eslint-comments@3.2.0(eslint@8.53.0): - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' + eslint-plugin-eslint-comments@3.2.0(eslint@8.53.0): dependencies: escape-string-regexp: 1.0.5 eslint: 8.53.0 ignore: 5.2.4 - dev: false - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0): - resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true + eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0): dependencies: '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) array-includes: 3.1.7 @@ -3785,13 +6951,8 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - dev: false - /eslint-plugin-n@16.3.0(eslint@8.53.0): - resolution: {integrity: sha512-/XZLH5CUXGK3laz3xYFNza8ZxLCq8ZNW6MsVw5z3d5hc2AwZzi0fPiySFZHQTdVDOHGs2cGv91aqzWmgBdq2gQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - eslint: '>=7.0.0' + eslint-plugin-n@16.3.0(eslint@8.53.0): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) builtins: 5.0.1 @@ -3803,44 +6964,23 @@ packages: minimatch: 3.1.2 resolve: 1.22.8 semver: 7.5.4 - dev: false - /eslint-plugin-no-use-extend-native@0.5.0: - resolution: {integrity: sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==} - engines: {node: '>=6.0.0'} + eslint-plugin-no-use-extend-native@0.5.0: dependencies: is-get-set-prop: 1.0.0 is-js-type: 2.0.0 is-obj-prop: 1.0.0 is-proto-prop: 2.0.0 - dev: false - /eslint-plugin-prettier@5.0.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@3.1.1): - resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + eslint-plugin-prettier@5.0.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@3.1.1): dependencies: eslint: 8.53.0 eslint-config-prettier: 8.10.0(eslint@8.53.0) prettier: 3.1.1 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 - dev: false - /eslint-plugin-unicorn@48.0.1(eslint@8.53.0): - resolution: {integrity: sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==} - engines: {node: '>=16'} - peerDependencies: - eslint: '>=8.44.0' + eslint-plugin-unicorn@48.0.1(eslint@8.53.0): dependencies: '@babel/helper-validator-identifier': 7.22.20 '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) @@ -3858,52 +6998,29 @@ packages: regjsparser: 0.10.0 semver: 7.5.4 strip-indent: 3.0.0 - dev: false - /eslint-rule-docs@1.1.235: - resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} - dev: false + eslint-rule-docs@1.1.235: {} - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: false - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: false - /eslint-utils@3.0.0(eslint@8.53.0): - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' + eslint-utils@3.0.0(eslint@8.53.0): dependencies: eslint: 8.53.0 eslint-visitor-keys: 2.1.0 - dev: false - /eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - dev: false + eslint-visitor-keys@2.1.0: {} - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false + eslint-visitor-keys@3.4.3: {} - /eslint@8.53.0: - resolution: {integrity: sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.53.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) '@eslint-community/regexpp': 4.10.0 @@ -3945,120 +7062,71 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: false - /esm-utils@4.2.1: - resolution: {integrity: sha512-a7t8pDmZ5MeYfo2pM5EcqeU+BqKobUFKnWkM17JOhTlR88OSosLa9Ak4bgm+htoF15HRf7tfrXNR62UogmIODg==} + esm-utils@4.2.1: dependencies: import-meta-resolve: 4.0.0 url-or-path: 2.1.0 - dev: false - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.2 acorn-jsx: 5.3.2(acorn@8.11.2) eslint-visitor-keys: 3.4.3 - dev: false - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: false + esprima@4.0.1: {} - /espurify@2.1.1: - resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==} - dev: false + espurify@2.1.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: false - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: false - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: false + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: false + estraverse@5.3.0: {} - /estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + estree-util-attach-comments@3.0.0: dependencies: '@types/estree': 1.0.5 - dev: false - /estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + estree-util-build-jsx@3.0.1: dependencies: '@types/estree-jsx': 1.0.3 devlop: 1.1.0 estree-util-is-identifier-name: 3.0.0 estree-walker: 3.0.3 - dev: false - /estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - dev: false + estree-util-is-identifier-name@3.0.0: {} - /estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + estree-util-to-js@2.0.0: dependencies: '@types/estree-jsx': 1.0.3 astring: 1.8.6 source-map: 0.7.4 - dev: false - /estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + estree-util-visit@2.0.0: dependencies: '@types/estree-jsx': 1.0.3 '@types/unist': 3.0.2 - dev: false - /estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.5 - dev: false - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: false + esutils@2.0.3: {} - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false + event-target-shim@5.0.1: {} - /eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - dev: false + eventemitter3@5.0.1: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - dev: false + events@3.3.0: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4069,11 +7137,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: false - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.2.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4084,11 +7149,8 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: false - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -4099,356 +7161,209 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: false - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - dev: false + expand-template@2.0.3: {} - /expressive-code@0.29.4: - resolution: {integrity: sha512-MA0cdWkFsIPQ/DAiPgL49y1mZiOXOuxiBXlZ28SrtItNeoh3/NwUhZ21z5BwlaC7b6nkXfkI4E+HWguuIpEhSA==} + expressive-code@0.29.4: dependencies: '@expressive-code/core': 0.29.4 '@expressive-code/plugin-frames': 0.29.4 '@expressive-code/plugin-shiki': 0.29.4 '@expressive-code/plugin-text-markers': 0.29.4 - dev: false - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - dev: false - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false + extend@3.0.2: {} - /extendable-error@0.1.7: - resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} - dev: false + extendable-error@0.1.7: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: false - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: false + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: false + fast-diff@1.3.0: {} - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - dev: false + fast-fifo@1.3.2: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 - dev: false - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: false + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: false + fast-levenshtein@2.0.6: {} - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} - engines: {node: '>=6'} - dev: false + fast-redact@3.3.0: {} - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + fastq@1.15.0: dependencies: reusify: 1.0.4 - dev: false - /figures@6.0.1: - resolution: {integrity: sha512-0oY/olScYD4IhQ8u//gCPA4F3mlTn2dacYmiDm/mbDQvpmLjV4uH+zhsQ5IyXRyvqkvtUkXkNdGvg5OFJTCsuQ==} - engines: {node: '>=18'} + figures@6.0.1: dependencies: is-unicode-supported: 2.0.0 - dev: false - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.1.1 - dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - dev: false - /find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} + find-cache-dir@4.0.0: dependencies: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 - dev: false - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: false + find-root@1.1.0: {} - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: false - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: false - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-up@6.3.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 - dev: false - /find-yarn-workspace-root2@1.2.16: - resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + find-yarn-workspace-root2@1.2.16: dependencies: micromatch: 4.0.5 pkg-dir: 4.2.0 - dev: false - /flat-cache@3.1.1: - resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} - engines: {node: '>=12.0.0'} + flat-cache@3.1.1: dependencies: flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 - dev: false - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: false + flatted@3.2.9: {} - /flattie@1.1.0: - resolution: {integrity: sha512-xU99gDEnciIwJdGcBmNHnzTJ/w5AT+VFJOu6sTB6WM8diOYNA3Sa+K1DiEBQ7XH4QikQq3iFW1U+jRVcotQnBw==} - engines: {node: '>=8'} - dev: false + flattie@1.1.0: {} - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: false - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: false - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: false + fraction.js@4.3.7: {} - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false + fs-constants@1.0.0: {} - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: false - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: false - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: false + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: false + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: false + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 functions-have-names: 1.2.3 - dev: false - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: false + functions-have-names@1.2.3: {} - /generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + generate-function@2.3.1: dependencies: is-property: 1.0.2 - dev: false - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: false + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: false + get-caller-file@2.0.5: {} - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: false + get-east-asian-width@1.2.0: {} - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + get-intrinsic@1.2.2: dependencies: function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 - dev: false - /get-set-props@0.1.0: - resolution: {integrity: sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==} - engines: {node: '>=0.10.0'} - dev: false + get-set-props@0.1.0: {} - /get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - dev: false + get-stdin@9.0.0: {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: false + get-stream@6.0.1: {} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: false + get-stream@8.0.1: {} - /get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.0: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 - dev: false - /get-tsconfig@4.7.2: - resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + get-tsconfig@4.7.2: dependencies: resolve-pkg-maps: 1.0.0 - dev: false - /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true + git-raw-commits@2.0.11: dependencies: dargs: 7.0.0 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: false - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - dev: false + github-from-package@0.0.0: {} - /github-slugger@2.0.0: - resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} - dev: false + github-slugger@2.0.0: {} - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: false - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: false - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: false + glob-to-regexp@0.4.1: {} - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 path-scurry: 1.10.1 - dev: false - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + glob@7.1.6: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4456,10 +7371,8 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4467,37 +7380,22 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false - /global-dirs@0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} + global-dirs@0.1.1: dependencies: ini: 1.3.8 - dev: false - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: false + globals@11.12.0: {} - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} + globals@13.23.0: dependencies: type-fest: 0.20.2 - dev: false - /globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.3: dependencies: define-properties: 1.2.1 - dev: false - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -4505,110 +7403,63 @@ packages: ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 - dev: false - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globby@13.2.2: dependencies: dir-glob: 3.0.1 fast-glob: 3.3.2 ignore: 5.2.4 merge2: 1.4.1 slash: 4.0.0 - dev: false - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.2 - dev: false - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - dev: false + graceful-fs@4.2.11: {} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: false + grapheme-splitter@1.0.4: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: false + graphemer@1.4.0: {} - /gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} + gray-matter@4.0.3: dependencies: js-yaml: 3.14.1 kind-of: 6.0.3 section-matter: 1.0.0 strip-bom-string: 1.0.0 - dev: false - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: false + hard-rejection@2.1.0: {} - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: false + has-bigints@1.0.2: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: false + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: false + has-flag@4.0.0: {} - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + has-property-descriptors@1.0.1: dependencies: get-intrinsic: 1.2.2 - dev: false - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: false + has-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: false + has-symbols@1.0.3: {} - /has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.0: dependencies: has-symbols: 1.0.3 - dev: false - /has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - dev: false + has@1.0.4: {} - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} + hasown@2.0.0: dependencies: function-bind: 1.1.2 - dev: false - /hasown@2.0.1: - resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} - engines: {node: '>= 0.4'} + hasown@2.0.1: dependencies: function-bind: 1.1.2 - dev: false - /hast-util-from-html@2.0.1: - resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + hast-util-from-html@2.0.1: dependencies: '@types/hast': 3.0.3 devlop: 1.1.0 @@ -4616,10 +7467,8 @@ packages: parse5: 7.1.2 vfile: 6.0.1 vfile-message: 4.0.2 - dev: false - /hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} + hast-util-from-parse5@7.1.2: dependencies: '@types/hast': 2.3.8 '@types/unist': 2.0.10 @@ -4628,10 +7477,8 @@ packages: vfile: 5.3.7 vfile-location: 4.1.0 web-namespaces: 2.0.1 - dev: false - /hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + hast-util-from-parse5@8.0.1: dependencies: '@types/hast': 3.0.3 '@types/unist': 3.0.2 @@ -4641,28 +7488,20 @@ packages: vfile: 6.0.1 vfile-location: 5.0.2 web-namespaces: 2.0.1 - dev: false - /hast-util-has-property@3.0.0: - resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} + hast-util-has-property@3.0.0: dependencies: '@types/hast': 3.0.3 - dev: false - /hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} + hast-util-parse-selector@3.1.1: dependencies: '@types/hast': 2.3.8 - dev: false - /hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + hast-util-parse-selector@4.0.0: dependencies: '@types/hast': 3.0.3 - dev: false - /hast-util-raw@7.2.3: - resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==} + hast-util-raw@7.2.3: dependencies: '@types/hast': 2.3.8 '@types/parse5': 6.0.3 @@ -4675,10 +7514,8 @@ packages: vfile: 5.3.7 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-raw@9.0.1: - resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + hast-util-raw@9.0.1: dependencies: '@types/hast': 3.0.3 '@types/unist': 3.0.2 @@ -4693,10 +7530,8 @@ packages: vfile: 6.0.1 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-select@6.0.2: - resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} + hast-util-select@6.0.2: dependencies: '@types/hast': 3.0.3 '@types/unist': 3.0.2 @@ -4714,10 +7549,8 @@ packages: space-separated-tokens: 2.0.2 unist-util-visit: 5.0.0 zwitch: 2.0.4 - dev: false - /hast-util-to-estree@3.1.0: - resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + hast-util-to-estree@3.1.0: dependencies: '@types/estree': 1.0.5 '@types/estree-jsx': 1.0.3 @@ -4737,10 +7570,8 @@ packages: zwitch: 2.0.4 transitivePeerDependencies: - supports-color - dev: false - /hast-util-to-html@8.0.4: - resolution: {integrity: sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==} + hast-util-to-html@8.0.4: dependencies: '@types/hast': 2.3.8 '@types/unist': 2.0.10 @@ -4753,10 +7584,8 @@ packages: space-separated-tokens: 2.0.2 stringify-entities: 4.0.3 zwitch: 2.0.4 - dev: false - /hast-util-to-html@9.0.0: - resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + hast-util-to-html@9.0.0: dependencies: '@types/hast': 3.0.3 '@types/unist': 3.0.2 @@ -4770,10 +7599,8 @@ packages: space-separated-tokens: 2.0.2 stringify-entities: 4.0.3 zwitch: 2.0.4 - dev: false - /hast-util-to-jsx-runtime@2.3.0: - resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + hast-util-to-jsx-runtime@2.3.0: dependencies: '@types/estree': 1.0.5 '@types/hast': 3.0.3 @@ -4792,10 +7619,8 @@ packages: vfile-message: 4.0.2 transitivePeerDependencies: - supports-color - dev: false - /hast-util-to-parse5@7.1.0: - resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==} + hast-util-to-parse5@7.1.0: dependencies: '@types/hast': 2.3.8 comma-separated-tokens: 2.0.3 @@ -4803,10 +7628,8 @@ packages: space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + hast-util-to-parse5@8.0.0: dependencies: '@types/hast': 3.0.3 comma-separated-tokens: 2.0.3 @@ -4815,721 +7638,386 @@ packages: space-separated-tokens: 2.0.2 web-namespaces: 2.0.1 zwitch: 2.0.4 - dev: false - /hast-util-to-string@3.0.0: - resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} + hast-util-to-string@3.0.0: dependencies: '@types/hast': 3.0.3 - dev: false - /hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - dev: false + hast-util-whitespace@2.0.1: {} - /hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.3 - dev: false - /hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + hastscript@7.2.0: dependencies: '@types/hast': 2.3.8 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 3.1.1 property-information: 6.4.0 space-separated-tokens: 2.0.2 - dev: false - /hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + hastscript@8.0.0: dependencies: '@types/hast': 3.0.3 comma-separated-tokens: 2.0.3 hast-util-parse-selector: 4.0.0 property-information: 6.4.0 space-separated-tokens: 2.0.2 - dev: false - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - dev: false + hosted-git-info@2.8.9: {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: false - /html-escaper@3.0.3: - resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} - dev: false + html-escaper@3.0.3: {} - /html-void-elements@2.0.1: - resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==} - dev: false + html-void-elements@2.0.1: {} - /html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - dev: false + html-void-elements@3.0.0: {} - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: false + http-cache-semantics@4.1.1: {} - /human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - dev: false + human-id@1.0.2: {} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: false + human-signals@2.1.0: {} - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: false + human-signals@4.3.1: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: false + human-signals@5.0.0: {} - /husky@8.0.3: - resolution: {integrity: sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==} - engines: {node: '>=14'} - hasBin: true - dev: false + husky@8.0.3: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: false - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: false - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false + ieee754@1.2.1: {} - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: false + ignore@5.2.4: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: false - /import-from-esm@1.3.3: - resolution: {integrity: sha512-U3Qt/CyfFpTUv6LOP2jRTLYjphH6zg3okMfHbyqRa/W2w6hr8OsJWVggNlR4jxuojQy81TgTJTxgSkyoteRGMQ==} - engines: {node: '>=16.20'} + import-from-esm@1.3.3: dependencies: debug: 4.3.4 import-meta-resolve: 4.0.0 transitivePeerDependencies: - supports-color - dev: false - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} - dev: false + import-meta-resolve@4.0.0: {} - /import-modules@2.1.0: - resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} - engines: {node: '>=8'} - dev: false + import-modules@2.1.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: false + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: false + indent-string@4.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - dev: false - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: false + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false + ini@1.3.8: {} - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false + inline-style-parser@0.1.1: {} - /inline-style-parser@0.2.2: - resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} - dev: false + inline-style-parser@0.2.2: {} - /internal-slot@1.0.6: - resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==} - engines: {node: '>= 0.4'} + internal-slot@1.0.6: dependencies: get-intrinsic: 1.2.2 hasown: 2.0.0 side-channel: 1.0.4 - dev: false - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - dev: false + interpret@1.4.0: {} - /irregular-plurals@3.5.0: - resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} - engines: {node: '>=8'} - dev: false + irregular-plurals@3.5.0: {} - /is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} + is-absolute@1.0.0: dependencies: is-relative: 1.0.0 is-windows: 1.0.2 - dev: false - /is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - dev: false + is-alphabetical@2.0.1: {} - /is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-alphanumerical@2.0.1: dependencies: is-alphabetical: 2.0.1 is-decimal: 2.0.1 - dev: false - /is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.2: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-typed-array: 1.1.12 - dev: false - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: false + is-arrayish@0.2.1: {} - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false + is-arrayish@0.3.2: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: false - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - dev: false - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: false - /is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - dev: false + is-buffer@2.0.5: {} - /is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} + is-builtin-module@3.2.1: dependencies: builtin-modules: 3.3.0 - dev: false - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: false + is-callable@1.2.7: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.1 - dev: false - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - dev: false + is-decimal@2.0.1: {} - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: false + is-docker@2.2.1: {} - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: false + is-docker@3.0.0: {} - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false + is-extendable@0.1.1: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: false + is-extglob@2.1.1: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: false + is-fullwidth-code-point@3.0.0: {} - /is-fullwidth-code-point@4.0.0: - resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} - engines: {node: '>=12'} - dev: false + is-fullwidth-code-point@4.0.0: {} - /is-fullwidth-code-point@5.0.0: - resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} - engines: {node: '>=18'} + is-fullwidth-code-point@5.0.0: dependencies: get-east-asian-width: 1.2.0 - dev: false - /is-get-set-prop@1.0.0: - resolution: {integrity: sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ==} + is-get-set-prop@1.0.0: dependencies: get-set-props: 0.1.0 lowercase-keys: 1.0.1 - dev: false - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: false - /is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - dev: false + is-hexadecimal@2.0.1: {} - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - dev: false - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: false + is-interactive@2.0.0: {} - /is-js-type@2.0.0: - resolution: {integrity: sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw==} + is-js-type@2.0.0: dependencies: js-types: 1.0.0 - dev: false - /is-negated-glob@1.0.0: - resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} - engines: {node: '>=0.10.0'} - dev: false + is-negated-glob@1.0.0: {} - /is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - dev: false + is-negative-zero@2.0.2: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: false + is-number@7.0.0: {} - /is-obj-prop@1.0.0: - resolution: {integrity: sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w==} + is-obj-prop@1.0.0: dependencies: lowercase-keys: 1.0.1 obj-props: 1.4.0 - dev: false - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: false + is-obj@2.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: false + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: false + is-plain-obj@1.1.0: {} - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false + is-plain-obj@4.1.0: {} - /is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - dev: false + is-property@1.0.2: {} - /is-proto-prop@2.0.0: - resolution: {integrity: sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==} + is-proto-prop@2.0.0: dependencies: lowercase-keys: 1.0.1 proto-props: 2.0.0 - dev: false - /is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + is-reference@3.0.2: dependencies: '@types/estree': 1.0.5 - dev: false - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.5 has-tostringtag: 1.0.0 - dev: false - /is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} + is-relative@1.0.0: dependencies: is-unc-path: 1.0.0 - dev: false - /is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.2: dependencies: call-bind: 1.0.5 - dev: false - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: false + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.0 - dev: false - /is-subdir@1.2.0: - resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} - engines: {node: '>=4'} + is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 - dev: false - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: false - /is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 - dev: false - /is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.12: dependencies: which-typed-array: 1.1.13 - dev: false - /is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} + is-unc-path@1.0.0: dependencies: unc-path-regex: 0.1.2 - dev: false - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - dev: false + is-unicode-supported@0.1.0: {} - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: false + is-unicode-supported@1.3.0: {} - /is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} - engines: {node: '>=18'} - dev: false + is-unicode-supported@2.0.0: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.5 - dev: false - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: false + is-windows@1.0.2: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: false - /is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 - dev: false - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: false + isexe@2.0.0: {} - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: false - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: '@types/node': 20.10.4 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: false - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: false + jiti@1.21.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false + js-tokens@4.0.0: {} - /js-types@1.0.0: - resolution: {integrity: sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==} - engines: {node: '>=0.10.0'} - dev: false + js-types@1.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: false - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - dev: false - /jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - dev: false + jsesc@0.5.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: false + jsesc@2.5.2: {} - /jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - dev: false + jsesc@3.0.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: false + json-buffer@3.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: false + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: false + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: false + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: false + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: false + json-stable-stringify-without-jsonify@1.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: false - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: false + json5@2.2.3: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: false + jsonc-parser@3.2.0: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - dev: false - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: false + jsonparse@1.3.1: {} - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: false - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: false + kind-of@6.0.3: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: false + kleur@3.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: false + kleur@4.1.5: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: false - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: false + lilconfig@2.1.0: {} - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: false + lilconfig@3.0.0: {} - /line-column-path@3.0.0: - resolution: {integrity: sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + line-column-path@3.0.0: dependencies: type-fest: 2.19.0 - dev: false - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false + lines-and-columns@1.2.4: {} - /lint-staged@15.2.0: - resolution: {integrity: sha512-TFZzUEV00f+2YLaVPWBWGAMq7So6yQx+GG8YRMDeOEIf95Zn5RyiLMsEiX4KTNl9vq/w+NqRJkLA1kPIo15ufQ==} - engines: {node: '>=18.12.0'} - hasBin: true + lint-staged@15.2.0: dependencies: chalk: 5.3.0 commander: 11.1.0 @@ -5543,11 +8031,8 @@ packages: yaml: 2.3.4 transitivePeerDependencies: - supports-color - dev: false - /listr2@8.0.0: - resolution: {integrity: sha512-u8cusxAcyqAiQ2RhYvV7kRKNLgUvtObIbhOX2NCXqvp1UU32xIg5CT22ykS2TPKJXZWJwtK3IKLiqAGlGNE+Zg==} - engines: {node: '>=18.0.0'} + listr2@8.0.0: dependencies: cli-truncate: 4.0.0 colorette: 2.0.20 @@ -5555,213 +8040,121 @@ packages: log-update: 6.0.0 rfdc: 1.3.0 wrap-ansi: 9.0.0 - dev: false - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: false - /load-yaml-file@0.2.0: - resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} - engines: {node: '>=6'} + load-yaml-file@0.2.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - dev: false - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: false + loader-runner@4.3.0: {} - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: false - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: false - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: false - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: false + lodash-es@4.17.21: {} - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: false + lodash.camelcase@4.3.0: {} - /lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} - dev: false + lodash.isfunction@3.0.9: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: false + lodash.isplainobject@4.0.6: {} - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: false + lodash.kebabcase@4.1.1: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: false + lodash.merge@4.6.2: {} - /lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - dev: false + lodash.mergewith@4.6.2: {} - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: false + lodash.snakecase@4.1.1: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: false + lodash.startcase@4.4.0: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: false + lodash.uniq@4.5.0: {} - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: false + lodash.upperfirst@4.3.1: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - dev: false - /log-symbols@5.1.0: - resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} - engines: {node: '>=12'} + log-symbols@5.1.0: dependencies: chalk: 5.3.0 is-unicode-supported: 1.3.0 - dev: false - /log-update@6.0.0: - resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} - engines: {node: '>=18'} + log-update@6.0.0: dependencies: ansi-escapes: 6.2.0 cli-cursor: 4.0.0 slice-ansi: 7.1.0 strip-ansi: 7.1.0 wrap-ansi: 9.0.0 - dev: false - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - dev: false + long@5.2.3: {} - /longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - dev: false + longest-streak@3.1.0: {} - /lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - dev: false + lowercase-keys@1.0.1: {} - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - dev: false + lru-cache@10.0.1: {} - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 yallist: 2.1.2 - dev: false - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: false - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: false - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: false + lru-cache@7.18.3: {} - /lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} - dev: false + lru-cache@8.0.5: {} - /magic-string@0.30.5: - resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} - engines: {node: '>=12'} + magic-string@0.30.5: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: false + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: false + map-obj@4.3.0: {} - /markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} - dev: false + markdown-extensions@2.0.0: {} - /markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - dev: false + markdown-table@3.0.3: {} - /mdast-util-definitions@6.0.0: - resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + mdast-util-definitions@6.0.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - dev: false - /mdast-util-directive@3.0.0: - resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + mdast-util-directive@3.0.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -5773,19 +8166,15 @@ packages: unist-util-visit-parents: 6.0.1 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + mdast-util-find-and-replace@3.0.1: dependencies: '@types/mdast': 4.0.3 escape-string-regexp: 5.0.0 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: false - /mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + mdast-util-from-markdown@2.0.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -5801,20 +8190,16 @@ packages: unist-util-stringify-position: 4.0.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + mdast-util-gfm-autolink-literal@2.0.0: dependencies: '@types/mdast': 4.0.3 ccount: 2.0.1 devlop: 1.1.0 mdast-util-find-and-replace: 3.0.1 micromark-util-character: 2.0.1 - dev: false - /mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + mdast-util-gfm-footnote@2.0.0: dependencies: '@types/mdast': 4.0.3 devlop: 1.1.0 @@ -5823,20 +8208,16 @@ packages: micromark-util-normalize-identifier: 2.0.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + mdast-util-gfm-strikethrough@2.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + mdast-util-gfm-table@2.0.0: dependencies: '@types/mdast': 4.0.3 devlop: 1.1.0 @@ -5845,10 +8226,8 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + mdast-util-gfm-task-list-item@2.0.0: dependencies: '@types/mdast': 4.0.3 devlop: 1.1.0 @@ -5856,10 +8235,8 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + mdast-util-gfm@3.0.0: dependencies: mdast-util-from-markdown: 2.0.0 mdast-util-gfm-autolink-literal: 2.0.0 @@ -5870,10 +8247,8 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-mdx-expression@2.0.0: - resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + mdast-util-mdx-expression@2.0.0: dependencies: '@types/estree-jsx': 1.0.3 '@types/hast': 3.0.3 @@ -5883,10 +8258,8 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-mdx-jsx@3.0.0: - resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} + mdast-util-mdx-jsx@3.0.0: dependencies: '@types/estree-jsx': 1.0.3 '@types/hast': 3.0.3 @@ -5903,10 +8276,8 @@ packages: vfile-message: 4.0.2 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + mdast-util-mdx@3.0.0: dependencies: mdast-util-from-markdown: 2.0.0 mdast-util-mdx-expression: 2.0.0 @@ -5915,10 +8286,8 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + mdast-util-mdxjs-esm@2.0.1: dependencies: '@types/estree-jsx': 1.0.3 '@types/hast': 3.0.3 @@ -5928,17 +8297,13 @@ packages: mdast-util-to-markdown: 2.1.0 transitivePeerDependencies: - supports-color - dev: false - /mdast-util-phrasing@4.0.0: - resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} + mdast-util-phrasing@4.0.0: dependencies: '@types/mdast': 4.0.3 unist-util-is: 6.0.0 - dev: false - /mdast-util-to-hast@13.0.2: - resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + mdast-util-to-hast@13.0.2: dependencies: '@types/hast': 3.0.3 '@types/mdast': 4.0.3 @@ -5948,10 +8313,8 @@ packages: trim-lines: 3.0.1 unist-util-position: 5.0.0 unist-util-visit: 5.0.0 - dev: false - /mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + mdast-util-to-markdown@2.1.0: dependencies: '@types/mdast': 4.0.3 '@types/unist': 3.0.2 @@ -5961,31 +8324,18 @@ packages: micromark-util-decode-string: 2.0.0 unist-util-visit: 5.0.0 zwitch: 2.0.4 - dev: false - /mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + mdast-util-to-string@4.0.0: dependencies: '@types/mdast': 4.0.3 - dev: false - /memory-fs@0.2.0: - resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} - dev: false + memory-fs@0.2.0: {} - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - dev: false + memorystream@0.3.1: {} - /meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - dev: false + meow@12.1.1: {} - /meow@6.1.1: - resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} - engines: {node: '>=8'} + meow@6.1.1: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -5998,11 +8348,8 @@ packages: trim-newlines: 3.0.1 type-fest: 0.13.1 yargs-parser: 18.1.3 - dev: false - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + meow@8.1.2: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -6015,23 +8362,14 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: false - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false + merge2@1.4.1: {} - /micro-spelling-correcter@1.1.1: - resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} - dev: false + micro-spelling-correcter@1.1.1: {} - /micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + micromark-core-commonmark@2.0.0: dependencies: decode-named-character-reference: 1.0.2 devlop: 1.1.0 @@ -6049,10 +8387,8 @@ packages: micromark-util-subtokenize: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-extension-directive@3.0.0: - resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + micromark-extension-directive@3.0.0: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.0 @@ -6061,19 +8397,15 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 parse-entities: 4.0.1 - dev: false - /micromark-extension-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + micromark-extension-gfm-autolink-literal@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-sanitize-uri: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-footnote@2.0.0: - resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + micromark-extension-gfm-footnote@2.0.0: dependencies: devlop: 1.1.0 micromark-core-commonmark: 2.0.0 @@ -6083,10 +8415,8 @@ packages: micromark-util-sanitize-uri: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + micromark-extension-gfm-strikethrough@2.0.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 @@ -6094,36 +8424,28 @@ packages: micromark-util-resolve-all: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-table@2.0.0: - resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + micromark-extension-gfm-table@2.0.0: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + micromark-extension-gfm-tagfilter@2.0.0: dependencies: micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm-task-list-item@2.0.1: - resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + micromark-extension-gfm-task-list-item@2.0.1: dependencies: devlop: 1.1.0 micromark-factory-space: 2.0.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + micromark-extension-gfm@3.0.0: dependencies: micromark-extension-gfm-autolink-literal: 2.0.0 micromark-extension-gfm-footnote: 2.0.0 @@ -6133,10 +8455,8 @@ packages: micromark-extension-gfm-task-list-item: 2.0.1 micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-extension-mdx-expression@3.0.0: - resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + micromark-extension-mdx-expression@3.0.0: dependencies: '@types/estree': 1.0.5 devlop: 1.1.0 @@ -6146,10 +8466,8 @@ packages: micromark-util-events-to-acorn: 2.0.2 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-extension-mdx-jsx@3.0.0: - resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + micromark-extension-mdx-jsx@3.0.0: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -6161,16 +8479,12 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 vfile-message: 4.0.2 - dev: false - /micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + micromark-extension-mdx-md@2.0.0: dependencies: micromark-util-types: 2.0.0 - dev: false - /micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + micromark-extension-mdxjs-esm@3.0.0: dependencies: '@types/estree': 1.0.5 devlop: 1.1.0 @@ -6181,10 +8495,8 @@ packages: micromark-util-types: 2.0.0 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 - dev: false - /micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + micromark-extension-mdxjs@3.0.0: dependencies: acorn: 8.11.2 acorn-jsx: 5.3.2(acorn@8.11.2) @@ -6194,27 +8506,21 @@ packages: micromark-extension-mdxjs-esm: 3.0.0 micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + micromark-factory-destination@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + micromark-factory-label@2.0.0: dependencies: devlop: 1.1.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-mdx-expression@2.0.1: - resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + micromark-factory-mdx-expression@2.0.1: dependencies: '@types/estree': 1.0.5 devlop: 1.1.0 @@ -6224,82 +8530,60 @@ packages: micromark-util-types: 2.0.0 unist-util-position-from-estree: 2.0.0 vfile-message: 4.0.2 - dev: false - /micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + micromark-factory-space@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + micromark-factory-title@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + micromark-factory-whitespace@2.0.0: dependencies: micromark-factory-space: 2.0.0 micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-character@2.0.1: - resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + micromark-util-character@2.0.1: dependencies: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + micromark-util-chunked@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + micromark-util-classify-character@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + micromark-util-combine-extensions@2.0.0: dependencies: micromark-util-chunked: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + micromark-util-decode-numeric-character-reference@2.0.1: dependencies: micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + micromark-util-decode-string@2.0.0: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 2.0.1 micromark-util-decode-numeric-character-reference: 2.0.1 micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - dev: false + micromark-util-encode@2.0.0: {} - /micromark-util-events-to-acorn@2.0.2: - resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + micromark-util-events-to-acorn@2.0.2: dependencies: '@types/acorn': 4.0.6 '@types/estree': 1.0.5 @@ -6309,51 +8593,35 @@ packages: micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 vfile-message: 4.0.2 - dev: false - /micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - dev: false + micromark-util-html-tag-name@2.0.0: {} - /micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + micromark-util-normalize-identifier@2.0.0: dependencies: micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + micromark-util-resolve-all@2.0.0: dependencies: micromark-util-types: 2.0.0 - dev: false - /micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + micromark-util-sanitize-uri@2.0.0: dependencies: micromark-util-character: 2.0.1 micromark-util-encode: 2.0.0 micromark-util-symbol: 2.0.0 - dev: false - /micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + micromark-util-subtokenize@2.0.0: dependencies: devlop: 1.1.0 micromark-util-chunked: 2.0.0 micromark-util-symbol: 2.0.0 micromark-util-types: 2.0.0 - dev: false - /micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - dev: false + micromark-util-symbol@2.0.0: {} - /micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - dev: false + micromark-util-types@2.0.0: {} - /micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + micromark@4.0.0: dependencies: '@types/debug': 4.1.12 debug: 4.3.4 @@ -6374,105 +8642,55 @@ packages: micromark-util-types: 2.0.0 transitivePeerDependencies: - supports-color - dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - dev: false - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: false - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: false + mime@3.0.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: false + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: false + mimic-fn@4.0.0: {} - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false + mimic-response@3.1.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: false + min-indent@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - dev: false - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: false - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: false - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: false + minimist@1.2.8: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: false + minipass@7.0.4: {} - /mixme@0.5.9: - resolution: {integrity: sha512-VC5fg6ySUscaWUpI4gxCBTQMH2RdUpNrk+MsbpCYtIvf9SBJdiUey4qE7BXviJsJR4nDQxCZ+3yaYNW3guz/Pw==} - engines: {node: '>= 8.0.0'} - dev: false + mixme@0.5.9: {} - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: false + mkdirp-classic@0.5.3: {} - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - dev: false + ms@2.1.2: {} - /mysql2@3.6.5: - resolution: {integrity: sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==} - engines: {node: '>= 8.0'} + mysql2@3.6.5: dependencies: denque: 2.1.0 generate-function: 2.3.1 @@ -6482,115 +8700,68 @@ packages: named-placeholders: 1.1.3 seq-queue: 0.0.5 sqlstring: 2.3.3 - dev: false - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + mz@2.7.0: dependencies: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: false - /named-placeholders@1.1.3: - resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} - engines: {node: '>=12.0.0'} + named-placeholders@1.1.3: dependencies: lru-cache: 7.18.3 - dev: false - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false + nanoid@3.3.7: {} - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: false + napi-build-utils@1.0.2: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: false + natural-compare@1.4.0: {} - /needle@2.9.1: - resolution: {integrity: sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==} - engines: {node: '>= 4.4.x'} - hasBin: true + needle@2.9.1: dependencies: debug: 3.2.7 iconv-lite: 0.4.24 sax: 1.3.0 transitivePeerDependencies: - supports-color - dev: false - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: false + neo-async@2.6.2: {} - /nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - dev: false + nice-try@1.0.5: {} - /nlcst-to-string@3.1.1: - resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + nlcst-to-string@3.1.1: dependencies: '@types/nlcst': 1.0.4 - dev: false - /node-abi@3.52.0: - resolution: {integrity: sha512-JJ98b02z16ILv7859irtXn4oUaFWADtvkzy2c0IAatNVX2Mc9Yoh8z6hZInn3QwvMEYhHuQloYi+TTQy67SIdQ==} - engines: {node: '>=10'} + node-abi@3.52.0: dependencies: semver: 7.5.4 - dev: false - /node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - dev: false + node-addon-api@6.1.0: {} - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: false + node-releases@2.0.14: {} - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - dev: false - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 semver: 7.6.0 validate-npm-package-license: 3.0.4 - dev: false - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - dev: false + normalize-path@3.0.0: {} - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: false + normalize-range@0.1.2: {} - /not@0.1.0: - resolution: {integrity: sha512-5PDmaAsVfnWUgTUbJ3ERwn7u79Z0dYxN9ErxCpVJJqe2RK0PJ3z+iFUxuqjwtlDDegXvtWoxD/3Fzxox7tFGWA==} - dev: false + not@0.1.0: {} - /npm-run-all@4.1.5: - resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} - engines: {node: '>= 4'} - hasBin: true + npm-run-all@4.1.5: dependencies: ansi-styles: 3.2.1 chalk: 2.4.2 @@ -6601,128 +8772,77 @@ packages: read-pkg: 3.0.0 shell-quote: 1.8.1 string.prototype.padend: 3.1.5 - dev: false - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: false - /npm-run-path@5.2.0: - resolution: {integrity: sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.2.0: dependencies: path-key: 4.0.0 - dev: false - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 - dev: false - /obj-props@1.4.0: - resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} - engines: {node: '>=0.10.0'} - dev: false + obj-props@1.4.0: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false + object-assign@4.1.1: {} - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: false + object-hash@3.0.0: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: false + object-inspect@1.13.1: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: false + object-keys@1.1.1: {} - /object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.4: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: false - /object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} + object.values@1.1.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: false - /on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - dev: false + on-exit-leak-free@2.1.2: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - dev: false - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: false - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: false - /open-editor@4.1.1: - resolution: {integrity: sha512-SYtGeZ9Zkzj/naoZaEF9LzwDYEGwuqQ4Fx5E3xdVRN98LFJjvMhG/ElByFEOVOiXepGra/Wi1fA4i/E1fXSBsw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + open-editor@4.1.1: dependencies: env-editor: 1.1.0 execa: 5.1.1 line-column-path: 3.0.0 open: 8.4.2 - dev: false - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 is-docker: 2.2.1 is-wsl: 2.2.0 - dev: false - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} + open@9.1.0: dependencies: default-browser: 4.0.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 - dev: false - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -6730,11 +8850,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: false - /ora@7.0.1: - resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} - engines: {node: '>=16'} + ora@7.0.1: dependencies: chalk: 5.3.0 cli-cursor: 4.0.0 @@ -6745,116 +8862,67 @@ packages: stdin-discarder: 0.1.0 string-width: 6.1.0 strip-ansi: 7.1.0 - dev: false - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: false + os-tmpdir@1.0.2: {} - /outdent@0.5.0: - resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} - dev: false + outdent@0.5.0: {} - /p-filter@2.1.0: - resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} - engines: {node: '>=8'} + p-filter@2.1.0: dependencies: p-map: 2.1.0 - dev: false - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: false - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - dev: false - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - dev: false - /p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} + p-limit@5.0.0: dependencies: yocto-queue: 1.0.0 - dev: false - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: false - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: false - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: false - /p-map@2.1.0: - resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} - engines: {node: '>=6'} - dev: false + p-map@2.1.0: {} - /p-queue@7.4.1: - resolution: {integrity: sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==} - engines: {node: '>=12'} + p-queue@7.4.1: dependencies: eventemitter3: 5.0.1 p-timeout: 5.1.0 - dev: false - /p-timeout@5.1.0: - resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} - engines: {node: '>=12'} - dev: false + p-timeout@5.1.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: false + p-try@2.2.0: {} - /pagefind@1.0.4: - resolution: {integrity: sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==} - hasBin: true + pagefind@1.0.4: optionalDependencies: '@pagefind/darwin-arm64': 1.0.4 '@pagefind/darwin-x64': 1.0.4 '@pagefind/linux-arm64': 1.0.4 '@pagefind/linux-x64': 1.0.4 '@pagefind/windows-x64': 1.0.4 - dev: false - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: false - /parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.1: dependencies: '@types/unist': 2.0.10 character-entities: 2.0.2 @@ -6864,165 +8932,88 @@ packages: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 is-hexadecimal: 2.0.1 - dev: false - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: false - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: false - /parse-latin@5.0.1: - resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + parse-latin@5.0.1: dependencies: nlcst-to-string: 3.1.1 unist-util-modify-children: 3.1.1 unist-util-visit-children: 2.0.2 - dev: false - /parse-ms@3.0.0: - resolution: {integrity: sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==} - engines: {node: '>=12'} - dev: false + parse-ms@3.0.0: {} - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false + parse5@6.0.1: {} - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + parse5@7.1.2: dependencies: entities: 4.5.0 - dev: false - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: false + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: false + path-is-absolute@1.0.1: {} - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: false + path-key@2.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: false + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: false + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: false + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.0.1 minipass: 7.0.4 - dev: false - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: false + path-to-regexp@6.2.1: {} - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + path-type@3.0.0: dependencies: pify: 3.0.0 - dev: false - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: false + path-type@4.0.0: {} - /periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + periscopic@3.1.0: dependencies: '@types/estree': 1.0.5 estree-walker: 3.0.3 is-reference: 3.0.2 - dev: false - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: false + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: false + picomatch@2.3.1: {} - /pidtree@0.3.1: - resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} - engines: {node: '>=0.10'} - hasBin: true - dev: false + pidtree@0.3.1: {} - /pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - dev: false + pidtree@0.6.0: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false + pify@2.3.0: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: false + pify@3.0.0: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: false + pify@4.0.1: {} - /pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + pino-abstract-transport@1.1.0: dependencies: readable-stream: 4.4.2 split2: 4.2.0 - dev: false - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - dev: false + pino-std-serializers@6.2.2: {} - /pino@8.16.2: - resolution: {integrity: sha512-2advCDGVEvkKu9TTVSa/kWW7Z3htI/sBKEZpqiHk6ive0i/7f5b1rsU8jn0aimxqfnSz5bj/nOYkwhBUn5xxvg==} - hasBin: true + pino@8.16.2: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.3.0 @@ -7035,125 +9026,66 @@ packages: safe-stable-stringify: 2.4.3 sonic-boom: 3.7.0 thread-stream: 2.4.1 - dev: false - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: false + pirates@4.0.6: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: false - /pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} + pkg-dir@5.0.0: dependencies: find-up: 5.0.0 - dev: false - /pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} + pkg-dir@7.0.0: dependencies: find-up: 6.3.0 - dev: false - /plur@4.0.0: - resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==} - engines: {node: '>=10'} + plur@4.0.0: dependencies: irregular-plurals: 3.5.0 - dev: false - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: false + pluralize@8.0.0: {} - /postcss-import@15.1.0(postcss@8.4.32): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 + postcss-import@15.1.0(postcss@8.4.32): dependencies: postcss: 8.4.32 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - dev: false - /postcss-js@4.0.1(postcss@8.4.32): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 + postcss-js@4.0.1(postcss@8.4.32): dependencies: camelcase-css: 2.0.1 postcss: 8.4.32 - dev: false - /postcss-load-config@4.0.2(postcss@8.4.32): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true + postcss-load-config@4.0.2(postcss@8.4.32): dependencies: lilconfig: 3.0.0 postcss: 8.4.32 yaml: 2.3.4 - dev: false - /postcss-nested@6.0.1(postcss@8.4.32): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + postcss-nested@6.0.1(postcss@8.4.32): dependencies: postcss: 8.4.32 postcss-selector-parser: 6.0.13 - dev: false - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} + postcss-selector-parser@6.0.13: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - dev: false - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: false + postcss-value-parser@4.2.0: {} - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.32: dependencies: nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 - dev: false - /postgres@3.4.3: - resolution: {integrity: sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==} - engines: {node: '>=12'} - dev: false + postgres@3.4.3: {} - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true + prebuild-install@7.1.1: dependencies: detect-libc: 2.0.2 expand-template: 2.0.3 @@ -7167,283 +9099,174 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: false - /preferred-pm@3.1.2: - resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} - engines: {node: '>=10'} + preferred-pm@3.1.2: dependencies: find-up: 5.0.0 find-yarn-workspace-root2: 1.2.16 path-exists: 4.0.0 which-pm: 2.0.0 - dev: false - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: false + prelude-ls@1.2.1: {} - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: false - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: false + prettier@2.8.8: {} - /prettier@3.1.1: - resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} - engines: {node: '>=14'} - hasBin: true - dev: false + prettier@3.1.1: {} - /pretty-ms@8.0.0: - resolution: {integrity: sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==} - engines: {node: '>=14.16'} + pretty-ms@8.0.0: dependencies: parse-ms: 3.0.0 - dev: false - /prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - dev: false + prismjs@1.29.0: {} - /probe-image-size@7.2.3: - resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==} + probe-image-size@7.2.3: dependencies: lodash.merge: 4.6.2 needle: 2.9.1 stream-parser: 0.3.1 transitivePeerDependencies: - supports-color - dev: false - /process-warning@2.3.2: - resolution: {integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==} - dev: false + process-warning@2.3.2: {} - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false + process@0.11.10: {} - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: false - /property-information@6.4.0: - resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} - dev: false + property-information@6.4.0: {} - /proto-props@2.0.0: - resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} - engines: {node: '>=4'} - dev: false + proto-props@2.0.0: {} - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: false + pseudomap@1.0.2: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: false - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: false + punycode@2.3.1: {} - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: false + queue-microtask@1.2.3: {} - /queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - dev: false + queue-tick@1.0.1: {} - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: false + quick-format-unescaped@4.0.4: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: false + quick-lru@4.0.1: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: false - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + rc@1.2.8: dependencies: deep-extend: 0.6.0 ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: false - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-cache@1.0.0: dependencies: pify: 2.3.0 - dev: false - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: false - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: false - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: false - /read-yaml-file@1.1.0: - resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} - engines: {node: '>=6'} + read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 js-yaml: 3.14.1 pify: 4.0.1 strip-bom: 3.0.0 - dev: false - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - dev: false - /readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-stream@4.4.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 events: 3.3.0 process: 0.11.10 string_decoder: 1.3.0 - dev: false - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: false - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - dev: false + real-require@0.2.0: {} - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: false - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: false + regenerator-runtime@0.14.0: {} - /regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - dev: false + regexp-tree@0.1.27: {} - /regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.1: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 set-function-name: 2.0.1 - dev: false - /regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true + regjsparser@0.10.0: dependencies: jsesc: 0.5.0 - dev: false - /rehype-parse@9.0.0: - resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + rehype-parse@9.0.0: dependencies: '@types/hast': 3.0.3 hast-util-from-html: 2.0.1 unified: 11.0.4 - dev: false - /rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + rehype-raw@7.0.0: dependencies: '@types/hast': 3.0.3 hast-util-raw: 9.0.1 vfile: 6.0.1 - dev: false - /rehype-stringify@10.0.0: - resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + rehype-stringify@10.0.0: dependencies: '@types/hast': 3.0.3 hast-util-to-html: 9.0.0 unified: 11.0.4 - dev: false - /rehype@13.0.1: - resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + rehype@13.0.1: dependencies: '@types/hast': 3.0.3 rehype-parse: 9.0.0 rehype-stringify: 10.0.0 unified: 11.0.4 - dev: false - /remark-directive@3.0.0: - resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + remark-directive@3.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-directive: 3.0.0 @@ -7451,18 +9274,14 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: false - /remark-expressive-code@0.29.4: - resolution: {integrity: sha512-7PX6TgPKFDfrixlBugCXYQGb6HWWGCyMcLBSpUZG8aiJvbFEaERYTMhj3WPKc2haAqliCcMjzGV4Kdbl+ci0yA==} + remark-expressive-code@0.29.4: dependencies: expressive-code: 0.29.4 hast-util-to-html: 8.0.4 unist-util-visit: 4.1.2 - dev: false - /remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + remark-gfm@4.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-gfm: 3.0.0 @@ -7472,19 +9291,15 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: false - /remark-mdx@3.0.0: - resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} + remark-mdx@3.0.0: dependencies: mdast-util-mdx: 3.0.0 micromark-extension-mdxjs: 3.0.0 transitivePeerDependencies: - supports-color - dev: false - /remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-from-markdown: 2.0.0 @@ -7492,151 +9307,96 @@ packages: unified: 11.0.4 transitivePeerDependencies: - supports-color - dev: false - /remark-rehype@11.0.0: - resolution: {integrity: sha512-vx8x2MDMcxuE4lBmQ46zYUDfcFMmvg80WYX+UNLeG6ixjdCCLcw1lrgAukwBTuOFsS78eoAedHGn9sNM0w7TPw==} + remark-rehype@11.0.0: dependencies: '@types/hast': 3.0.3 '@types/mdast': 4.0.3 mdast-util-to-hast: 13.0.2 unified: 11.0.4 vfile: 6.0.1 - dev: false - /remark-smartypants@2.0.0: - resolution: {integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + remark-smartypants@2.0.0: dependencies: retext: 8.1.0 retext-smartypants: 5.2.0 unist-util-visit: 4.1.2 - dev: false - /remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + remark-stringify@11.0.0: dependencies: '@types/mdast': 4.0.3 mdast-util-to-markdown: 2.1.0 unified: 11.0.4 - dev: false - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - dev: false + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: false + require-from-string@2.0.2: {} - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: false + require-main-filename@2.0.0: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: false + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: false + resolve-from@5.0.0: {} - /resolve-global@1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} + resolve-global@1.0.0: dependencies: global-dirs: 0.1.1 - dev: false - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: false + resolve-pkg-maps@1.0.0: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false - /resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true + resolve@2.0.0-next.5: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: false - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + restore-cursor@4.0.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - dev: false - /retext-latin@3.1.0: - resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + retext-latin@3.1.0: dependencies: '@types/nlcst': 1.0.4 parse-latin: 5.0.1 unherit: 3.0.1 unified: 10.1.2 - dev: false - /retext-smartypants@5.2.0: - resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + retext-smartypants@5.2.0: dependencies: '@types/nlcst': 1.0.4 nlcst-to-string: 3.1.1 unified: 10.1.2 unist-util-visit: 4.1.2 - dev: false - /retext-stringify@3.1.0: - resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + retext-stringify@3.1.0: dependencies: '@types/nlcst': 1.0.4 nlcst-to-string: 3.1.1 unified: 10.1.2 - dev: false - /retext@8.1.0: - resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + retext@8.1.0: dependencies: '@types/nlcst': 1.0.4 retext-latin: 3.1.0 retext-stringify: 3.1.0 unified: 10.1.2 - dev: false - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: false + reusify@1.0.4: {} - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - dev: false + rfdc@1.3.0: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: false - /rollup@4.9.0: - resolution: {integrity: sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.9.0: optionalDependencies: '@rollup/rollup-android-arm-eabi': 4.9.0 '@rollup/rollup-android-arm64': 4.9.0 @@ -7652,147 +9412,87 @@ packages: '@rollup/rollup-win32-ia32-msvc': 4.9.0 '@rollup/rollup-win32-x64-msvc': 4.9.0 fsevents: 2.3.3 - dev: false - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} + run-applescript@5.0.0: dependencies: execa: 5.1.1 - dev: false - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: false - /safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.0.1: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 has-symbols: 1.0.3 isarray: 2.0.5 - dev: false - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: false + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-regex-test@1.0.0: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-regex: 1.1.4 - dev: false - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: false + safe-stable-stringify@2.4.3: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: false + safer-buffer@2.1.2: {} - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: false + sax@1.3.0: {} - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: false - /section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} + section-matter@1.0.0: dependencies: extend-shallow: 2.0.1 kind-of: 6.0.3 - dev: false - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: false + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: false + semver@6.3.1: {} - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: false - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - dev: false - /seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - dev: false + seq-queue@0.0.5: {} - /serialize-error@11.0.3: - resolution: {integrity: sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==} - engines: {node: '>=14.16'} + serialize-error@11.0.3: dependencies: type-fest: 2.19.0 - dev: false - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: false - /server-destroy@1.0.1: - resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} - dev: false + server-destroy@1.0.1: {} - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false + set-blocking@2.0.0: {} - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} + set-function-length@1.1.1: dependencies: define-data-property: 1.1.1 get-intrinsic: 1.2.2 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: false - /set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} + set-function-name@2.0.1: dependencies: define-data-property: 1.1.1 functions-have-names: 1.2.3 has-property-descriptors: 1.0.1 - dev: false - /sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - requiresBuild: true + sharp@0.32.6: dependencies: color: 4.2.3 detect-libc: 2.0.2 @@ -7802,136 +9502,80 @@ packages: simple-get: 4.0.1 tar-fs: 3.0.4 tunnel-agent: 0.6.0 - dev: false - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 - dev: false - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: false - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: false + shebang-regex@1.0.0: {} - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: false + shebang-regex@3.0.0: {} - /shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - dev: false + shell-quote@1.8.1: {} - /shiki@0.14.6: - resolution: {integrity: sha512-R4koBBlQP33cC8cpzX0hAoOURBHJILp4Aaduh2eYi+Vj8ZBqtK/5SWNEHBS3qwUMu8dqOtI/ftno3ESfNeVW9g==} + shiki@0.14.6: dependencies: ansi-sequence-parser: 1.1.1 jsonc-parser: 3.2.0 vscode-oniguruma: 1.7.0 vscode-textmate: 8.0.0 - dev: false - /shikiji@0.6.13: - resolution: {integrity: sha512-4T7X39csvhT0p7GDnq9vysWddf2b6BeioiN3Ymhnt3xcy9tXmDcnsEFVxX18Z4YcQgEE/w48dLJ4pPPUcG9KkA==} + shikiji@0.6.13: dependencies: hast-util-to-html: 9.0.0 - dev: false - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + side-channel@1.0.4: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 object-inspect: 1.13.1 - dev: false - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - dev: false + signal-exit@4.1.0: {} - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: false + simple-concat@1.0.1: {} - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-get@4.0.1: dependencies: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: false - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 - dev: false - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: false + sisteransi@1.0.5: {} - /sitemap@7.1.1: - resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} - hasBin: true + sitemap@7.1.1: dependencies: '@types/node': 17.0.45 '@types/sax': 1.2.7 arg: 5.0.2 sax: 1.3.0 - dev: false - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: false + slash@3.0.0: {} - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: false + slash@4.0.0: {} - /slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - dev: false + slash@5.1.0: {} - /slice-ansi@5.0.0: - resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} - engines: {node: '>=12'} + slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 4.0.0 - dev: false - /slice-ansi@7.1.0: - resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} - engines: {node: '>=18'} + slice-ansi@7.1.0: dependencies: ansi-styles: 6.2.1 is-fullwidth-code-point: 5.0.0 - dev: false - /smartwrap@2.0.2: - resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} - engines: {node: '>=6'} - hasBin: true + smartwrap@2.0.2: dependencies: array.prototype.flat: 1.3.2 breakword: 1.0.6 @@ -7939,281 +9583,170 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 yargs: 15.4.1 - dev: false - /sonic-boom@3.7.0: - resolution: {integrity: sha512-IudtNvSqA/ObjN97tfgNmOKyDOs4dNcg4cUUsHDebqsgb8wGBBwb31LIgShNO8fye0dFI52X1+tFoKKI6Rq1Gg==} + sonic-boom@3.7.0: dependencies: atomic-sleep: 1.0.0 - dev: false - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: false + source-map-js@1.0.2: {} - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: false - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - dev: false + source-map@0.6.1: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false + source-map@0.7.4: {} - /space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - dev: false + space-separated-tokens@2.0.2: {} - /spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@2.0.0: dependencies: cross-spawn: 5.1.0 signal-exit: 3.0.7 - dev: false - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.16 - dev: false - /spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} - dev: false + spdx-exceptions@2.3.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.16 - dev: false - /spdx-license-ids@3.0.16: - resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} - dev: false + spdx-license-ids@3.0.16: {} - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: false - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - dev: false + split2@4.2.0: {} - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: false + sprintf-js@1.0.3: {} - /sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} - dev: false + sqlstring@2.3.3: {} - /stdin-discarder@0.1.0: - resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + stdin-discarder@0.1.0: dependencies: bl: 5.1.0 - dev: false - /stream-parser@0.3.1: - resolution: {integrity: sha512-bJ/HgKq41nlKvlhccD5kaCr/P+Hu0wPNKPJOH7en+YrJu/9EgqUF+88w5Jb6KNcjOFMhfX4B2asfeAtIGuHObQ==} + stream-parser@0.3.1: dependencies: debug: 2.6.9 transitivePeerDependencies: - supports-color - dev: false - /stream-transform@2.1.3: - resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + stream-transform@2.1.3: dependencies: mixme: 0.5.9 - dev: false - /streamx@2.15.6: - resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==} + streamx@2.15.6: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - dev: false - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: false + string-argv@0.3.2: {} - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - dev: false - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: false - /string-width@6.1.0: - resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} - engines: {node: '>=16'} + string-width@6.1.0: dependencies: eastasianwidth: 0.2.0 emoji-regex: 10.3.0 strip-ansi: 7.1.0 - dev: false - /string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} - engines: {node: '>=18'} + string-width@7.0.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: false - /string-width@7.1.0: - resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} - engines: {node: '>=18'} + string-width@7.1.0: dependencies: emoji-regex: 10.3.0 get-east-asian-width: 1.2.0 strip-ansi: 7.1.0 - dev: false - /string.prototype.padend@3.1.5: - resolution: {integrity: sha512-DOB27b/2UTTD+4myKUFh+/fXWcu/UDyASIXfg+7VzoCNNGOfWvoyU/x5pvVHr++ztyt/oSYI1BcWBBG/hmlNjA==} - engines: {node: '>= 0.4'} + string.prototype.padend@3.1.5: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: false - /string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.8: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: false - /string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trimend@1.0.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: false - /string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.7: dependencies: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 - dev: false - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - dev: false - /stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + stringify-entities@4.0.3: dependencies: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 - dev: false - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - dev: false - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: false - /strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - dev: false + strip-bom-string@1.0.0: {} - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: false + strip-bom@3.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: false + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: false + strip-final-newline@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: false - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: false + strip-json-comments@2.0.1: {} - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: false + strip-json-comments@3.1.1: {} - /style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + style-to-object@0.4.4: dependencies: inline-style-parser: 0.1.1 - dev: false - /style-to-object@1.0.5: - resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + style-to-object@1.0.5: dependencies: inline-style-parser: 0.2.2 - dev: false - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true + sucrase@3.34.0: dependencies: '@jridgewell/gen-mapping': 0.3.3 commander: 4.1.1 @@ -8222,54 +9755,32 @@ packages: mz: 2.7.0 pirates: 4.0.6 ts-interface-checker: 0.1.13 - dev: false - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - dev: false - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - dev: false - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - dev: false - /supports-hyperlinks@2.3.0: - resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} - engines: {node: '>=8'} + supports-hyperlinks@2.3.0: dependencies: has-flag: 4.0.0 supports-color: 7.2.0 - dev: false - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: false + supports-preserve-symlinks-flag@1.0.0: {} - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.5: dependencies: '@pkgr/utils': 2.4.2 tslib: 2.6.2 - dev: false - /tailwindcss@3.3.6: - resolution: {integrity: sha512-AKjF7qbbLvLaPieoKeTjG1+FyNZT6KaJMJPFeQyLfIp7l82ggH1fbHJSsYIvnbTFQOlkh+gBYpyby5GT1LIdLw==} - engines: {node: '>=14.0.0'} - hasBin: true + tailwindcss@3.3.6: dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -8295,74 +9806,41 @@ packages: sucrase: 3.34.0 transitivePeerDependencies: - ts-node - dev: false - /tapable@0.1.10: - resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} - engines: {node: '>=0.6'} - dev: false + tapable@0.1.10: {} - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: false + tapable@2.2.1: {} - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.1: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: false - /tar-fs@3.0.4: - resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + tar-fs@3.0.4: dependencies: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 3.1.6 - dev: false - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + tar-stream@2.2.0: dependencies: bl: 4.1.0 end-of-stream: 1.4.4 fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: false - /tar-stream@3.1.6: - resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + tar-stream@3.1.6: dependencies: b4a: 1.6.4 fast-fifo: 1.3.2 streamx: 2.15.6 - dev: false - /term-size@2.2.1: - resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} - engines: {node: '>=8'} - dev: false + term-size@2.2.1: {} - /terser-webpack-plugin@5.3.10(webpack@5.90.1): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(webpack@5.90.1): dependencies: '@jridgewell/trace-mapping': 0.3.22 jest-worker: 27.5.1 @@ -8370,156 +9848,86 @@ packages: serialize-javascript: 6.0.2 terser: 5.27.0 webpack: 5.90.1 - dev: false - /terser@5.27.0: - resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} - engines: {node: '>=10'} - hasBin: true + terser@5.27.0: dependencies: '@jridgewell/source-map': 0.3.5 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 - dev: false - /text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - dev: false + text-extensions@2.4.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: false + text-table@0.2.0: {} - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 - dev: false - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + thenify@3.3.1: dependencies: any-promise: 1.3.0 - dev: false - /thread-stream@2.4.1: - resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + thread-stream@2.4.1: dependencies: real-require: 0.2.0 - dev: false - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through2@4.0.2: dependencies: readable-stream: 3.6.2 - dev: false - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: false + through@2.3.8: {} - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: false + titleize@3.0.0: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: false - /to-absolute-glob@3.0.0: - resolution: {integrity: sha512-loO/XEWTRqpfcpI7+Jr2RR2Umaaozx1t6OSVWtMi0oy5F/Fxg3IC+D/TToDnxyAGs7uZBGT/6XmyDUxgsObJXA==} - engines: {node: '>=0.10.0'} + to-absolute-glob@3.0.0: dependencies: is-absolute: 1.0.0 is-negated-glob: 1.0.0 - dev: false - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: false + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - dev: false - /trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - dev: false + trim-lines@3.0.1: {} - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: false + trim-newlines@3.0.1: {} - /trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - dev: false + trough@2.1.0: {} - /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.0.3(typescript@5.3.3): dependencies: typescript: 5.3.3 - dev: false - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: false + ts-interface-checker@0.1.13: {} - /tsconfck@3.0.0(typescript@5.3.3): - resolution: {integrity: sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==} - engines: {node: ^18 || >=20} - hasBin: true - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true + tsconfck@3.0.0(typescript@5.3.3): dependencies: typescript: 5.3.3 - dev: false - /tsconfig-paths@3.14.2: - resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + tsconfig-paths@3.14.2: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: false - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false + tslib@2.6.2: {} - /tsx@4.7.0: - resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} - engines: {node: '>=18.0.0'} - hasBin: true + tsx@4.7.0: dependencies: esbuild: 0.19.11 get-tsconfig: 4.7.2 optionalDependencies: fsevents: 2.3.3 - dev: false - /tty-table@4.2.3: - resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} - engines: {node: '>=8.0.0'} - hasBin: true + tty-table@4.2.3: dependencies: chalk: 4.1.2 csv: 5.5.3 @@ -8528,65 +9936,30 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 yargs: 17.7.2 - dev: false - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 - dev: false - /turbo-darwin-64@1.10.16: - resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: false + turbo-darwin-64@1.10.16: optional: true - /turbo-darwin-arm64@1.10.16: - resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: false + turbo-darwin-arm64@1.10.16: optional: true - /turbo-linux-64@1.10.16: - resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: false + turbo-linux-64@1.10.16: optional: true - /turbo-linux-arm64@1.10.16: - resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: false + turbo-linux-arm64@1.10.16: optional: true - /turbo-windows-64@1.10.16: - resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false + turbo-windows-64@1.10.16: optional: true - /turbo-windows-arm64@1.10.16: - resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: false + turbo-windows-arm64@1.10.16: optional: true - /turbo@1.10.16: - resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} - hasBin: true + turbo@1.10.16: optionalDependencies: turbo-darwin-64: 1.10.16 turbo-darwin-arm64: 1.10.16 @@ -8594,122 +9967,70 @@ packages: turbo-linux-arm64: 1.10.16 turbo-windows-64: 1.10.16 turbo-windows-arm64: 1.10.16 - dev: false - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: false - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - dev: false + type-fest@0.13.1: {} - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: false + type-fest@0.18.1: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: false + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: false + type-fest@0.21.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: false + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: false + type-fest@0.8.1: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: false + type-fest@2.19.0: {} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: false + type-fest@3.13.1: {} - /typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.0: dependencies: call-bind: 1.0.5 get-intrinsic: 1.2.2 is-typed-array: 1.1.12 - dev: false - /typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.0: dependencies: call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: false - /typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.0: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.5 for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: false - /typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typed-array-length@1.0.4: dependencies: call-bind: 1.0.5 for-each: 0.3.3 is-typed-array: 1.1.12 - dev: false - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - dev: false + typescript@5.3.3: {} - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.5 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: false - /unc-path-regex@0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} - dev: false + unc-path-regex@0.1.2: {} - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /unherit@3.0.1: - resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} - dev: false + unherit@3.0.1: {} - /unified@10.1.2: - resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + unified@10.1.2: dependencies: '@types/unist': 2.0.10 bail: 2.0.2 @@ -8718,10 +10039,8 @@ packages: is-plain-obj: 4.1.0 trough: 2.1.0 vfile: 5.3.7 - dev: false - /unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + unified@11.0.4: dependencies: '@types/unist': 3.0.2 bail: 2.0.2 @@ -8730,233 +10049,140 @@ packages: is-plain-obj: 4.1.0 trough: 2.1.0 vfile: 6.0.1 - dev: false - /unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + unist-util-is@5.2.1: dependencies: '@types/unist': 2.0.10 - dev: false - /unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + unist-util-is@6.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-modify-children@3.1.1: - resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + unist-util-modify-children@3.1.1: dependencies: '@types/unist': 2.0.10 array-iterate: 2.0.1 - dev: false - /unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + unist-util-position-from-estree@2.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + unist-util-position@4.0.4: dependencies: '@types/unist': 2.0.10 - dev: false - /unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + unist-util-position@5.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + unist-util-remove-position@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-visit: 5.0.0 - dev: false - /unist-util-remove@4.0.0: - resolution: {integrity: sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg==} + unist-util-remove@4.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: false - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.10 - dev: false - /unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.2 - dev: false - /unist-util-visit-children@2.0.2: - resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + unist-util-visit-children@2.0.2: dependencies: '@types/unist': 2.0.10 - dev: false - /unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + unist-util-visit-parents@5.1.3: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 - dev: false - /unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + unist-util-visit-parents@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 - dev: false - /unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + unist-util-visit@4.1.2: dependencies: '@types/unist': 2.0.10 unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 - dev: false - /unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + unist-util-visit@5.0.0: dependencies: '@types/unist': 3.0.2 unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 - dev: false - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: false + universalify@0.1.2: {} - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: false + untildify@4.0.0: {} - /update-browserslist-db@1.0.13(browserslist@4.22.2): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.22.2): dependencies: browserslist: 4.22.2 escalade: 3.1.1 picocolors: 1.0.0 - dev: false - /update-browserslist-db@1.0.13(browserslist@4.22.3): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.22.3): dependencies: browserslist: 4.22.3 escalade: 3.1.1 picocolors: 1.0.0 - dev: false - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: false - /url-or-path@2.1.0: - resolution: {integrity: sha512-dsBD6GbytSMj9YDb3jVzSRENwFh50oUORnWBeSHfo0Lnwv2KMm/J4npyGy1P9rivUPsUGLjTA53XqAFqpe0nww==} - dev: false + url-or-path@2.1.0: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false + util-deprecate@1.0.2: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: false - /vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} + vfile-location@4.1.0: dependencies: '@types/unist': 2.0.10 vfile: 5.3.7 - dev: false - /vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + vfile-location@5.0.2: dependencies: '@types/unist': 3.0.2 vfile: 6.0.1 - dev: false - /vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + vfile-message@3.1.4: dependencies: '@types/unist': 2.0.10 unist-util-stringify-position: 3.0.3 - dev: false - /vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + vfile-message@4.0.2: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 - dev: false - /vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + vfile@5.3.7: dependencies: '@types/unist': 2.0.10 is-buffer: 2.0.5 unist-util-stringify-position: 3.0.3 vfile-message: 3.1.4 - dev: false - /vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + vfile@6.0.1: dependencies: '@types/unist': 3.0.2 unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - dev: false - /vite@5.0.9(@types/node@20.10.4): - resolution: {integrity: sha512-wVqMd5kp28QWGgfYPDfrj771VyHTJ4UDlCteLH7bJDGDEamaz5hV8IX6h1brSGgnnyf9lI2RnzXq/JmD0c2wwg==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.0.9(@types/node@20.10.4): dependencies: '@types/node': 20.10.4 esbuild: 0.19.9 @@ -8964,59 +10190,29 @@ packages: rollup: 4.9.0 optionalDependencies: fsevents: 2.3.3 - dev: false - /vitefu@0.2.5(vite@5.0.9): - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - vite: - optional: true + vitefu@0.2.5(vite@5.0.9): dependencies: vite: 5.0.9(@types/node@20.10.4) - dev: false - /vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - dev: false + vscode-oniguruma@1.7.0: {} - /vscode-textmate@8.0.0: - resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - dev: false + vscode-textmate@8.0.0: {} - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: false - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - dev: false - /web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - dev: false + web-namespaces@2.0.1: {} - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: false + webpack-sources@3.2.3: {} - /webpack@5.90.1: - resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.90.1: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -9046,125 +10242,76 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: false - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: false - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: false + which-module@2.0.1: {} - /which-pm-runs@1.1.0: - resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} - engines: {node: '>=4'} - dev: false + which-pm-runs@1.1.0: {} - /which-pm@2.0.0: - resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} - engines: {node: '>=8.15'} + which-pm@2.0.0: dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 - dev: false - /which-pm@2.1.1: - resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} - engines: {node: '>=8.15'} + which-pm@2.1.1: dependencies: load-yaml-file: 0.2.0 path-exists: 4.0.0 - dev: false - /which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.13: dependencies: available-typed-arrays: 1.0.5 call-bind: 1.0.5 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: false - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: false - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: false - /widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} + widest-line@4.0.1: dependencies: string-width: 5.1.2 - dev: false - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: false - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: false - /wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + wrap-ansi@9.0.0: dependencies: ansi-styles: 6.2.1 string-width: 7.0.0 strip-ansi: 7.1.0 - dev: false - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: false + wrappy@1.0.2: {} - /xo@0.56.0(webpack@5.90.1): - resolution: {integrity: sha512-ohzSqgQ8POgZ3KNaEK/gxDovb6h3cglxv8+xi9Dn7gmRe8g4qotpOZpMs5ACJhvkJDmJOhiKbk6Uq6Mx1Di9DA==} - engines: {node: '>=16'} - hasBin: true - peerDependencies: - webpack: '>=1.11.0' - peerDependenciesMeta: - webpack: - optional: true + xo@0.56.0(webpack@5.90.1): dependencies: '@eslint/eslintrc': 2.1.3 '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3) @@ -9207,55 +10354,29 @@ packages: - '@types/eslint' - eslint-import-resolver-typescript - supports-color - dev: false - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: false + y18n@4.0.3: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: false + y18n@5.0.8: {} - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: false + yallist@2.1.2: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: false + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false + yallist@4.0.0: {} - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: false + yaml@2.3.4: {} - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - dev: false - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: false + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: false + yargs-parser@21.1.1: {} - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + yargs@15.4.1: dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -9268,11 +10389,8 @@ packages: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 - dev: false - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -9281,22 +10399,11 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: false - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: false + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: false + yocto-queue@1.0.0: {} - /zod@3.22.4: - resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} - dev: false + zod@3.22.4: {} - /zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - dev: false + zwitch@2.0.4: {} From be5c4d28b67f35f03c322b15ac00c2e10fe26dc1 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 27 Jun 2024 11:47:40 +0200 Subject: [PATCH 125/136] chore(deps): make sure the correct PNPM version is used --- .github/workflows/ci.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8278d67..07f53e4 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -21,8 +21,6 @@ jobs: fetch-depth: 2 - uses: pnpm/action-setup@v4.0.0 - with: - version: 8.3.1 - name: Setup Node.js environment uses: actions/setup-node@v4 From 4d124025951a1594f63c5bd33e28c0a3efb42c42 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 27 Jun 2024 11:55:33 +0200 Subject: [PATCH 126/136] chore(deps): make sure the correct PNPM version is used (everywhere) --- .github/workflows/deploy.yaml | 2 -- .github/workflows/release.yaml | 2 -- 2 files changed, 4 deletions(-) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 4de2b27..0a658f4 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -33,8 +33,6 @@ jobs: uses: withastro/action@v2 with: path: ./docs # The root location of your Astro project inside the repository. (optional) - node-version: 20 # The specific version of Node that should be used to build your site. Defaults to 18. (optional) - package-manager: pnpm@9.4.0 # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) deploy: needs: build diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index aebd63b..0947b01 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -26,8 +26,6 @@ jobs: fetch-depth: 0 - uses: pnpm/action-setup@v4.0.0 - with: - version: 8.3.1 - name: Setup Node.js environment uses: actions/setup-node@v4 From ef848a05536efadd2ae51de7a40c3765d4068a54 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 27 Jun 2024 13:27:34 +0200 Subject: [PATCH 127/136] chore(deps): re-add the specific PNPM version for the deploy workflow --- .github/workflows/deploy.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 0a658f4..2b7b97e 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -33,6 +33,7 @@ jobs: uses: withastro/action@v2 with: path: ./docs # The root location of your Astro project inside the repository. (optional) + package-manager: pnpm@9.4.0 # The Node package manager that should be used to install dependencies and build your site. Automatically detected based on your lockfile. (optional) deploy: needs: build From d7792860846dc9a7123aecfc627407e67e047dfb Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 27 Jun 2024 13:18:31 +0200 Subject: [PATCH 128/136] chore(deps): upgrade TypeScript to v5.5 and enable isolatedDeclarations --- .changeset/purple-garlics-perform.md | 10 + package.json | 4 +- packages/cli/src/collect-migrations.ts | 4 +- packages/cli/src/commands/list.ts | 2 +- packages/cli/src/commands/new.ts | 2 +- packages/cli/src/commands/remove.ts | 2 +- packages/cli/src/errors.ts | 28 +- packages/cli/src/get-duration.ts | 2 +- packages/cli/src/get-migrations.ts | 2 +- packages/cli/src/get-package-info.ts | 5 +- packages/cli/src/index.ts | 2 +- packages/cli/src/reporters/default.ts | 2 +- packages/cli/src/reporters/get.ts | 5 +- packages/cli/src/reporters/json.ts | 2 +- packages/cli/src/test-utils.ts | 8 +- packages/cli/src/with-leading-period.ts | 2 +- packages/cli/tsconfig.json | 7 +- packages/mysql/src/index.ts | 47 +- packages/mysql/tsconfig.json | 7 +- packages/plugin-generate-js/tsconfig.json | 7 +- packages/plugin-tools/src/index.ts | 4 +- packages/plugin-tools/tsconfig.json | 7 +- packages/postgres/src/index.ts | 47 +- packages/postgres/tsconfig.json | 7 +- packages/reporter-pino/src/index.ts | 4 +- packages/reporter-pino/tsconfig.json | 7 +- packages/storage-fs/tsconfig.json | 7 +- packages/tsconfig/base.json | 5 +- packages/tsconfig/build.json | 3 +- packages/types/tsconfig.json | 7 +- pnpm-lock.yaml | 722 ++++++++++++---------- 31 files changed, 512 insertions(+), 458 deletions(-) create mode 100644 .changeset/purple-garlics-perform.md diff --git a/.changeset/purple-garlics-perform.md b/.changeset/purple-garlics-perform.md new file mode 100644 index 0000000..d89ce52 --- /dev/null +++ b/.changeset/purple-garlics-perform.md @@ -0,0 +1,10 @@ +--- +'@emigrate/reporter-pino': patch +'@emigrate/plugin-tools': patch +'@emigrate/postgres': patch +'@emigrate/tsconfig': patch +'@emigrate/mysql': patch +'@emigrate/cli': patch +--- + +Upgrade TypeScript to v5.5 and enable [isolatedDeclarations](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/#isolated-declarations) diff --git a/package.json b/package.json index a82612b..b549f80 100644 --- a/package.json +++ b/package.json @@ -80,9 +80,9 @@ "lint-staged": "15.2.0", "npm-run-all": "4.1.5", "prettier": "3.1.1", - "tsx": "4.7.0", + "tsx": "4.15.7", "turbo": "1.10.16", - "typescript": "5.3.3", + "typescript": "5.5.2", "xo": "0.56.0" } } diff --git a/packages/cli/src/collect-migrations.ts b/packages/cli/src/collect-migrations.ts index 0c1886a..465dddc 100644 --- a/packages/cli/src/collect-migrations.ts +++ b/packages/cli/src/collect-migrations.ts @@ -1,12 +1,12 @@ import { type MigrationHistoryEntry, type MigrationMetadata, type MigrationMetadataFinished } from '@emigrate/types'; import { toMigrationMetadata } from './to-migration-metadata.js'; -import { getMigrations as getMigrationsOriginal } from './get-migrations.js'; +import { getMigrations as getMigrationsOriginal, type GetMigrationsFunction } from './get-migrations.js'; export async function* collectMigrations( cwd: string, directory: string, history: AsyncIterable, - getMigrations = getMigrationsOriginal, + getMigrations: GetMigrationsFunction = getMigrationsOriginal, ): AsyncIterable { const allMigrations = await getMigrations(cwd, directory); const seen = new Set(); diff --git a/packages/cli/src/commands/list.ts b/packages/cli/src/commands/list.ts index ec8fc22..4a81477 100644 --- a/packages/cli/src/commands/list.ts +++ b/packages/cli/src/commands/list.ts @@ -17,7 +17,7 @@ export default async function listCommand({ storage: storageConfig, color, cwd, -}: Config & ExtraFlags) { +}: Config & ExtraFlags): Promise { if (!directory) { throw MissingOptionError.fromOption('directory'); } diff --git a/packages/cli/src/commands/new.ts b/packages/cli/src/commands/new.ts index c921808..ece271a 100644 --- a/packages/cli/src/commands/new.ts +++ b/packages/cli/src/commands/new.ts @@ -24,7 +24,7 @@ type ExtraFlags = { export default async function newCommand( { directory, template, reporter: reporterConfig, plugins = [], cwd, extension, color }: Config & ExtraFlags, name: string, -) { +): Promise { if (!directory) { throw MissingOptionError.fromOption('directory'); } diff --git a/packages/cli/src/commands/remove.ts b/packages/cli/src/commands/remove.ts index de5490c..aa598fd 100644 --- a/packages/cli/src/commands/remove.ts +++ b/packages/cli/src/commands/remove.ts @@ -39,7 +39,7 @@ export default async function removeCommand( getMigrations, }: Config & ExtraFlags, name: string, -) { +): Promise { if (!directory) { throw MissingOptionError.fromOption('directory'); } diff --git a/packages/cli/src/errors.ts b/packages/cli/src/errors.ts index 5e276bb..f72dab3 100644 --- a/packages/cli/src/errors.ts +++ b/packages/cli/src/errors.ts @@ -8,7 +8,7 @@ import { serializeError, errorConstructors, deserializeError } from 'serialize-e const formatter = new Intl.ListFormat('en', { style: 'long', type: 'disjunction' }); -export const toError = (error: unknown) => (error instanceof Error ? error : new Error(String(error))); +export const toError = (error: unknown): Error => (error instanceof Error ? error : new Error(String(error))); export const toSerializedError = (error: unknown) => { const errorInstance = toError(error); @@ -30,7 +30,7 @@ export class EmigrateError extends Error { export class ShowUsageError extends EmigrateError {} export class MissingOptionError extends ShowUsageError { - static fromOption(option: string | string[]) { + static fromOption(option: string | string[]): MissingOptionError { return new MissingOptionError( `Missing required option: ${Array.isArray(option) ? formatter.format(option) : option}`, undefined, @@ -48,7 +48,7 @@ export class MissingOptionError extends ShowUsageError { } export class MissingArgumentsError extends ShowUsageError { - static fromArgument(argument: string) { + static fromArgument(argument: string): MissingArgumentsError { return new MissingArgumentsError(`Missing required argument: ${argument}`, undefined, argument); } @@ -62,7 +62,7 @@ export class MissingArgumentsError extends ShowUsageError { } export class OptionNeededError extends ShowUsageError { - static fromOption(option: string, message: string) { + static fromOption(option: string, message: string): OptionNeededError { return new OptionNeededError(message, undefined, option); } @@ -76,7 +76,7 @@ export class OptionNeededError extends ShowUsageError { } export class BadOptionError extends ShowUsageError { - static fromOption(option: string, message: string) { + static fromOption(option: string, message: string): BadOptionError { return new BadOptionError(message, undefined, option); } @@ -96,7 +96,7 @@ export class UnexpectedError extends EmigrateError { } export class MigrationHistoryError extends EmigrateError { - static fromHistoryEntry(entry: FailedMigrationHistoryEntry) { + static fromHistoryEntry(entry: FailedMigrationHistoryEntry): MigrationHistoryError { return new MigrationHistoryError(`Migration ${entry.name} is in a failed state, it should be fixed and removed`, { cause: deserializeError(entry.error), }); @@ -108,7 +108,7 @@ export class MigrationHistoryError extends EmigrateError { } export class MigrationLoadError extends EmigrateError { - static fromMetadata(metadata: MigrationMetadata, cause?: Error) { + static fromMetadata(metadata: MigrationMetadata, cause?: Error): MigrationLoadError { return new MigrationLoadError(`Failed to load migration file: ${metadata.relativeFilePath}`, { cause }); } @@ -118,7 +118,7 @@ export class MigrationLoadError extends EmigrateError { } export class MigrationRunError extends EmigrateError { - static fromMetadata(metadata: FailedMigrationMetadata) { + static fromMetadata(metadata: FailedMigrationMetadata): MigrationRunError { return new MigrationRunError(`Failed to run migration: ${metadata.relativeFilePath}`, { cause: metadata.error }); } @@ -128,7 +128,7 @@ export class MigrationRunError extends EmigrateError { } export class MigrationNotRunError extends EmigrateError { - static fromMetadata(metadata: MigrationMetadata, cause?: Error) { + static fromMetadata(metadata: MigrationMetadata, cause?: Error): MigrationNotRunError { return new MigrationNotRunError(`Migration "${metadata.name}" is not in the migration history`, { cause }); } @@ -138,7 +138,7 @@ export class MigrationNotRunError extends EmigrateError { } export class MigrationRemovalError extends EmigrateError { - static fromMetadata(metadata: MigrationMetadata, cause?: Error) { + static fromMetadata(metadata: MigrationMetadata, cause?: Error): MigrationRemovalError { return new MigrationRemovalError(`Failed to remove migration: ${metadata.relativeFilePath}`, { cause }); } @@ -148,7 +148,7 @@ export class MigrationRemovalError extends EmigrateError { } export class StorageInitError extends EmigrateError { - static fromError(error: Error) { + static fromError(error: Error): StorageInitError { return new StorageInitError('Could not initialize storage', { cause: error }); } @@ -158,11 +158,11 @@ export class StorageInitError extends EmigrateError { } export class CommandAbortError extends EmigrateError { - static fromSignal(signal: NodeJS.Signals) { + static fromSignal(signal: NodeJS.Signals): CommandAbortError { return new CommandAbortError(`Command aborted due to signal: ${signal}`); } - static fromReason(reason: string, cause?: unknown) { + static fromReason(reason: string, cause?: unknown): CommandAbortError { return new CommandAbortError(`Command aborted: ${reason}`, { cause }); } @@ -172,7 +172,7 @@ export class CommandAbortError extends EmigrateError { } export class ExecutionDesertedError extends EmigrateError { - static fromReason(reason: string, cause?: Error) { + static fromReason(reason: string, cause?: Error): ExecutionDesertedError { return new ExecutionDesertedError(`Execution deserted: ${reason}`, { cause }); } diff --git a/packages/cli/src/get-duration.ts b/packages/cli/src/get-duration.ts index 9d29d2f..eb4944a 100644 --- a/packages/cli/src/get-duration.ts +++ b/packages/cli/src/get-duration.ts @@ -1,6 +1,6 @@ import process from 'node:process'; -export const getDuration = (start: [number, number]) => { +export const getDuration = (start: [number, number]): number => { const [seconds, nanoseconds] = process.hrtime(start); return seconds * 1000 + nanoseconds / 1_000_000; }; diff --git a/packages/cli/src/get-migrations.ts b/packages/cli/src/get-migrations.ts index fb6033d..929fabd 100644 --- a/packages/cli/src/get-migrations.ts +++ b/packages/cli/src/get-migrations.ts @@ -39,6 +39,6 @@ export const getMigrations = async (cwd: string, directory: string): Promise { throw new UnexpectedError(`Could not read package info from: ${packageInfoPath}`); }; -export const { version } = await getPackageInfo(); +const packageInfo = await getPackageInfo(); + +// eslint-disable-next-line prefer-destructuring +export const version: string = packageInfo.version; diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 921446e..1133356 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -1,5 +1,5 @@ export * from './types.js'; -export const emigrate = () => { +export const emigrate = (): void => { // console.log('Done!'); }; diff --git a/packages/cli/src/reporters/default.ts b/packages/cli/src/reporters/default.ts index 1db53a3..4e23196 100644 --- a/packages/cli/src/reporters/default.ts +++ b/packages/cli/src/reporters/default.ts @@ -471,6 +471,6 @@ class DefaultReporter implements Required { } } -const reporterDefault = interactive ? new DefaultFancyReporter() : new DefaultReporter(); +const reporterDefault: EmigrateReporter = interactive ? new DefaultFancyReporter() : new DefaultReporter(); export default reporterDefault; diff --git a/packages/cli/src/reporters/get.ts b/packages/cli/src/reporters/get.ts index c3935c3..b6461f6 100644 --- a/packages/cli/src/reporters/get.ts +++ b/packages/cli/src/reporters/get.ts @@ -1,7 +1,8 @@ +import type { EmigrateReporter } from '@emigrate/types'; import { type Config } from '../types.js'; import * as reporters from './index.js'; -export const getStandardReporter = (reporter?: Config['reporter']) => { +export const getStandardReporter = (reporter?: Config['reporter']): EmigrateReporter | undefined => { if (!reporter) { return reporters.pretty; } @@ -10,5 +11,5 @@ export const getStandardReporter = (reporter?: Config['reporter']) => { return reporters[reporter as keyof typeof reporters]; } - return; // eslint-disable-line no-useless-return + return undefined; }; diff --git a/packages/cli/src/reporters/json.ts b/packages/cli/src/reporters/json.ts index 4a3dcc3..1b6273b 100644 --- a/packages/cli/src/reporters/json.ts +++ b/packages/cli/src/reporters/json.ts @@ -55,6 +55,6 @@ class JsonReporter implements EmigrateReporter { } } -const jsonReporter = new JsonReporter() as EmigrateReporter; +const jsonReporter: EmigrateReporter = new JsonReporter(); export default jsonReporter; diff --git a/packages/cli/src/test-utils.ts b/packages/cli/src/test-utils.ts index b6228d2..38e2afc 100644 --- a/packages/cli/src/test-utils.ts +++ b/packages/cli/src/test-utils.ts @@ -15,7 +15,7 @@ export type Mocked = { [K in keyof T]: Mock; }; -export async function noop() { +export async function noop(): Promise { // noop } @@ -31,8 +31,8 @@ export function getErrorCause(error: Error | undefined): Error | SerializedError return undefined; } -export function getMockedStorage(historyEntries: Array) { - const storage: Mocked = { +export function getMockedStorage(historyEntries: Array): Mocked { + return { lock: mock.fn(async (migrations) => migrations), unlock: mock.fn(async () => { // void @@ -45,8 +45,6 @@ export function getMockedStorage(historyEntries: Array> { diff --git a/packages/cli/src/with-leading-period.ts b/packages/cli/src/with-leading-period.ts index 7bc6340..e69a900 100644 --- a/packages/cli/src/with-leading-period.ts +++ b/packages/cli/src/with-leading-period.ts @@ -1 +1 @@ -export const withLeadingPeriod = (string: string) => (string.startsWith('.') ? string : `.${string}`); +export const withLeadingPeriod = (string: string): string => (string.startsWith('.') ? string : `.${string}`); diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 1cfcebb..91e2c12 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "@emigrate/tsconfig/build.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "extends": "@emigrate/tsconfig/build.json" } diff --git a/packages/mysql/src/index.ts b/packages/mysql/src/index.ts index 22b8271..2d4b254 100644 --- a/packages/mysql/src/index.ts +++ b/packages/mysql/src/index.ts @@ -13,7 +13,9 @@ import { } from 'mysql2/promise'; import { getTimestampPrefix, sanitizeMigrationName } from '@emigrate/plugin-tools'; import { + type Awaitable, type MigrationMetadata, + type MigrationFunction, type EmigrateStorage, type LoaderPlugin, type Storage, @@ -345,17 +347,6 @@ export const createMysqlStorage = ({ table = defaultTable, connection }: MysqlSt }; }; -export const { initializeStorage } = createMysqlStorage({ - table: process.env['MYSQL_TABLE'], - connection: process.env['MYSQL_URL'] ?? { - host: process.env['MYSQL_HOST'], - port: process.env['MYSQL_PORT'] ? Number.parseInt(process.env['MYSQL_PORT'], 10) : undefined, - user: process.env['MYSQL_USER'], - password: process.env['MYSQL_PASSWORD'], - database: process.env['MYSQL_DATABASE'], - }, -}); - export const createMysqlLoader = ({ connection }: MysqlLoaderOptions): LoaderPlugin => { return { loadableExtensions: ['.sql'], @@ -374,7 +365,16 @@ export const createMysqlLoader = ({ connection }: MysqlLoaderOptions): LoaderPlu }; }; -export const { loadableExtensions, loadMigration } = createMysqlLoader({ +export const generateMigration: GenerateMigrationFunction = async (name) => { + return { + filename: `${getTimestampPrefix()}_${sanitizeMigrationName(name)}.sql`, + content: `-- Migration: ${name} +`, + }; +}; + +const storage = createMysqlStorage({ + table: process.env['MYSQL_TABLE'], connection: process.env['MYSQL_URL'] ?? { host: process.env['MYSQL_HOST'], port: process.env['MYSQL_PORT'] ? Number.parseInt(process.env['MYSQL_PORT'], 10) : undefined, @@ -384,13 +384,22 @@ export const { loadableExtensions, loadMigration } = createMysqlLoader({ }, }); -export const generateMigration: GenerateMigrationFunction = async (name) => { - return { - filename: `${getTimestampPrefix()}_${sanitizeMigrationName(name)}.sql`, - content: `-- Migration: ${name} -`, - }; -}; +const loader = createMysqlLoader({ + connection: process.env['MYSQL_URL'] ?? { + host: process.env['MYSQL_HOST'], + port: process.env['MYSQL_PORT'] ? Number.parseInt(process.env['MYSQL_PORT'], 10) : undefined, + user: process.env['MYSQL_USER'], + password: process.env['MYSQL_PASSWORD'], + database: process.env['MYSQL_DATABASE'], + }, +}); + +// eslint-disable-next-line prefer-destructuring +export const initializeStorage: () => Promise = storage.initializeStorage; +// eslint-disable-next-line prefer-destructuring +export const loadableExtensions: string[] = loader.loadableExtensions; +// eslint-disable-next-line prefer-destructuring +export const loadMigration: (migration: MigrationMetadata) => Awaitable = loader.loadMigration; const defaultExport: EmigrateStorage & LoaderPlugin & GeneratorPlugin = { initializeStorage, diff --git a/packages/mysql/tsconfig.json b/packages/mysql/tsconfig.json index 1cfcebb..91e2c12 100644 --- a/packages/mysql/tsconfig.json +++ b/packages/mysql/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "@emigrate/tsconfig/build.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "extends": "@emigrate/tsconfig/build.json" } diff --git a/packages/plugin-generate-js/tsconfig.json b/packages/plugin-generate-js/tsconfig.json index 1cfcebb..91e2c12 100644 --- a/packages/plugin-generate-js/tsconfig.json +++ b/packages/plugin-generate-js/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "@emigrate/tsconfig/build.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "extends": "@emigrate/tsconfig/build.json" } diff --git a/packages/plugin-tools/src/index.ts b/packages/plugin-tools/src/index.ts index 033fabb..89b1dc7 100644 --- a/packages/plugin-tools/src/index.ts +++ b/packages/plugin-tools/src/index.ts @@ -204,7 +204,7 @@ const load = async ( * * @returns A timestamp string in the format YYYYMMDDHHmmssmmm */ -export const getTimestampPrefix = () => new Date().toISOString().replaceAll(/[-:ZT.]/g, ''); +export const getTimestampPrefix = (): string => new Date().toISOString().replaceAll(/[-:ZT.]/g, ''); /** * A utility function to sanitize a migration name so that it can be used as a filename @@ -212,7 +212,7 @@ export const getTimestampPrefix = () => new Date().toISOString().replaceAll(/[-: * @param name A migration name to sanitize * @returns A sanitized migration name that can be used as a filename */ -export const sanitizeMigrationName = (name: string) => +export const sanitizeMigrationName = (name: string): string => name .replaceAll(/[\W/\\:|*?'"<>_]+/g, '_') .trim() diff --git a/packages/plugin-tools/tsconfig.json b/packages/plugin-tools/tsconfig.json index 1cfcebb..91e2c12 100644 --- a/packages/plugin-tools/tsconfig.json +++ b/packages/plugin-tools/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "@emigrate/tsconfig/build.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "extends": "@emigrate/tsconfig/build.json" } diff --git a/packages/postgres/src/index.ts b/packages/postgres/src/index.ts index 44af95b..b3300b5 100644 --- a/packages/postgres/src/index.ts +++ b/packages/postgres/src/index.ts @@ -11,6 +11,8 @@ import { type GeneratorPlugin, type SerializedError, type MigrationHistoryEntry, + type Awaitable, + type MigrationFunction, } from '@emigrate/types'; const defaultTable = 'migrations'; @@ -255,17 +257,6 @@ export const createPostgresStorage = ({ }; }; -export const { initializeStorage } = createPostgresStorage({ - table: process.env['POSTGRES_TABLE'], - connection: process.env['POSTGRES_URL'] ?? { - host: process.env['POSTGRES_HOST'], - port: process.env['POSTGRES_PORT'] ? Number.parseInt(process.env['POSTGRES_PORT'], 10) : undefined, - user: process.env['POSTGRES_USER'], - password: process.env['POSTGRES_PASSWORD'], - database: process.env['POSTGRES_DB'], - }, -}); - export const createPostgresLoader = ({ connection }: PostgresLoaderOptions): LoaderPlugin => { return { loadableExtensions: ['.sql'], @@ -284,7 +275,16 @@ export const createPostgresLoader = ({ connection }: PostgresLoaderOptions): Loa }; }; -export const { loadableExtensions, loadMigration } = createPostgresLoader({ +export const generateMigration: GenerateMigrationFunction = async (name) => { + return { + filename: `${getTimestampPrefix()}_${sanitizeMigrationName(name)}.sql`, + content: `-- Migration: ${name} +`, + }; +}; + +const storage = createPostgresStorage({ + table: process.env['POSTGRES_TABLE'], connection: process.env['POSTGRES_URL'] ?? { host: process.env['POSTGRES_HOST'], port: process.env['POSTGRES_PORT'] ? Number.parseInt(process.env['POSTGRES_PORT'], 10) : undefined, @@ -294,13 +294,22 @@ export const { loadableExtensions, loadMigration } = createPostgresLoader({ }, }); -export const generateMigration: GenerateMigrationFunction = async (name) => { - return { - filename: `${getTimestampPrefix()}_${sanitizeMigrationName(name)}.sql`, - content: `-- Migration: ${name} -`, - }; -}; +const loader = createPostgresLoader({ + connection: process.env['POSTGRES_URL'] ?? { + host: process.env['POSTGRES_HOST'], + port: process.env['POSTGRES_PORT'] ? Number.parseInt(process.env['POSTGRES_PORT'], 10) : undefined, + user: process.env['POSTGRES_USER'], + password: process.env['POSTGRES_PASSWORD'], + database: process.env['POSTGRES_DB'], + }, +}); + +// eslint-disable-next-line prefer-destructuring +export const initializeStorage: () => Promise = storage.initializeStorage; +// eslint-disable-next-line prefer-destructuring +export const loadableExtensions: string[] = loader.loadableExtensions; +// eslint-disable-next-line prefer-destructuring +export const loadMigration: (migration: MigrationMetadata) => Awaitable = loader.loadMigration; const defaultExport: EmigrateStorage & LoaderPlugin & GeneratorPlugin = { initializeStorage, diff --git a/packages/postgres/tsconfig.json b/packages/postgres/tsconfig.json index 1cfcebb..91e2c12 100644 --- a/packages/postgres/tsconfig.json +++ b/packages/postgres/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "@emigrate/tsconfig/build.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "extends": "@emigrate/tsconfig/build.json" } diff --git a/packages/reporter-pino/src/index.ts b/packages/reporter-pino/src/index.ts index 690b628..e279efe 100644 --- a/packages/reporter-pino/src/index.ts +++ b/packages/reporter-pino/src/index.ts @@ -204,6 +204,8 @@ export const createPinoReporter = (options: PinoReporterOptions = {}): EmigrateR return new PinoReporter(options); }; -export default createPinoReporter({ +const defaultExport: EmigrateReporter = createPinoReporter({ level: process.env['LOG_LEVEL'], }); + +export default defaultExport; diff --git a/packages/reporter-pino/tsconfig.json b/packages/reporter-pino/tsconfig.json index 1cfcebb..91e2c12 100644 --- a/packages/reporter-pino/tsconfig.json +++ b/packages/reporter-pino/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "@emigrate/tsconfig/build.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "extends": "@emigrate/tsconfig/build.json" } diff --git a/packages/storage-fs/tsconfig.json b/packages/storage-fs/tsconfig.json index 1cfcebb..91e2c12 100644 --- a/packages/storage-fs/tsconfig.json +++ b/packages/storage-fs/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "@emigrate/tsconfig/build.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "extends": "@emigrate/tsconfig/build.json" } diff --git a/packages/tsconfig/base.json b/packages/tsconfig/base.json index 91a38e3..6885f40 100644 --- a/packages/tsconfig/base.json +++ b/packages/tsconfig/base.json @@ -11,6 +11,7 @@ "forceConsistentCasingInFileNames": true, "inlineSources": false, "isolatedModules": true, + "isolatedDeclarations": true, "incremental": true, "module": "NodeNext", "moduleResolution": "NodeNext", @@ -31,5 +32,7 @@ "strict": true, "target": "ES2022", "lib": ["ESNext", "DOM", "DOM.Iterable"] - } + }, + "include": ["${configDir}/src"], + "exclude": ["${configDir}/dist"] } diff --git a/packages/tsconfig/build.json b/packages/tsconfig/build.json index 26aad2e..65f1577 100644 --- a/packages/tsconfig/build.json +++ b/packages/tsconfig/build.json @@ -3,6 +3,7 @@ "display": "Build", "extends": "./base.json", "compilerOptions": { - "noEmit": false + "noEmit": false, + "outDir": "${configDir}/dist" } } diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json index 1cfcebb..91e2c12 100644 --- a/packages/types/tsconfig.json +++ b/packages/types/tsconfig.json @@ -1,8 +1,3 @@ { - "extends": "@emigrate/tsconfig/build.json", - "compilerOptions": { - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] + "extends": "@emigrate/tsconfig/build.json" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 56721e9..c44f6f9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 2.27.1 '@commitlint/cli': specifier: 18.6.1 - version: 18.6.1(@types/node@20.10.4)(typescript@5.3.3) + version: 18.6.1(@types/node@20.10.4)(typescript@5.5.2) '@commitlint/config-conventional': specifier: 18.6.1 version: 18.6.1 @@ -36,32 +36,32 @@ importers: specifier: 3.1.1 version: 3.1.1 tsx: - specifier: 4.7.0 - version: 4.7.0 + specifier: 4.15.7 + version: 4.15.7 turbo: specifier: 1.10.16 version: 1.10.16 typescript: - specifier: 5.3.3 - version: 5.3.3 + specifier: 5.5.2 + version: 5.5.2 xo: specifier: 0.56.0 - version: 0.56.0(webpack@5.90.1) + version: 0.56.0(@types/eslint@8.56.10)(webpack@5.90.1) docs: dependencies: '@astrojs/starlight': specifier: ^0.15.0 - version: 0.15.0(astro@4.0.5) + version: 0.15.0(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2)) '@astrojs/starlight-tailwind': specifier: 2.0.1 - version: 2.0.1(@astrojs/starlight@0.15.0)(@astrojs/tailwind@5.0.3)(tailwindcss@3.3.6) + version: 2.0.1(@astrojs/starlight@0.15.0(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2)))(@astrojs/tailwind@5.0.3(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2))(tailwindcss@3.3.6))(tailwindcss@3.3.6) '@astrojs/tailwind': specifier: ^5.0.3 - version: 5.0.3(astro@4.0.5)(tailwindcss@3.3.6) + version: 5.0.3(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2))(tailwindcss@3.3.6) astro: specifier: ^4.0.1 - version: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) + version: 4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2) sharp: specifier: ^0.32.5 version: 0.32.6 @@ -82,7 +82,7 @@ importers: version: 2.0.3 cosmiconfig: specifier: 9.0.0 - version: 9.0.0(typescript@5.3.3) + version: 9.0.0(typescript@5.5.2) elegant-spinner: specifier: 3.0.0 version: 3.0.0 @@ -510,28 +510,22 @@ packages: resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} - '@esbuild/aix-ppc64@0.19.11': - resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.19.11': - resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.19.9': resolution: {integrity: sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.19.11': - resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [android] '@esbuild/android-arm@0.19.9': @@ -540,10 +534,10 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-x64@0.19.11': - resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm] os: [android] '@esbuild/android-x64@0.19.9': @@ -552,11 +546,11 @@ packages: cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.19.11': - resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] + cpu: [x64] + os: [android] '@esbuild/darwin-arm64@0.19.9': resolution: {integrity: sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==} @@ -564,10 +558,10 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.19.11': - resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.19.9': @@ -576,11 +570,11 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.19.11': - resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] + cpu: [x64] + os: [darwin] '@esbuild/freebsd-arm64@0.19.9': resolution: {integrity: sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==} @@ -588,10 +582,10 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.19.11': - resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} - cpu: [x64] + cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.19.9': @@ -600,11 +594,11 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.19.11': - resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} - cpu: [arm64] - os: [linux] + cpu: [x64] + os: [freebsd] '@esbuild/linux-arm64@0.19.9': resolution: {integrity: sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==} @@ -612,10 +606,10 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.19.11': - resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.19.9': @@ -624,10 +618,10 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.19.11': - resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.19.9': @@ -636,10 +630,10 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.19.11': - resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} - cpu: [loong64] + cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.19.9': @@ -648,10 +642,10 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.19.11': - resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} - cpu: [mips64el] + cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.19.9': @@ -660,10 +654,10 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.19.11': - resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} - cpu: [ppc64] + cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.19.9': @@ -672,10 +666,10 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.19.11': - resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} - cpu: [riscv64] + cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.19.9': @@ -684,10 +678,10 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.19.11': - resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} - cpu: [s390x] + cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.19.9': @@ -696,10 +690,10 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.19.11': - resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} - cpu: [x64] + cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.19.9': @@ -708,11 +702,11 @@ packages: cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.19.11': - resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] - os: [netbsd] + os: [linux] '@esbuild/netbsd-x64@0.19.9': resolution: {integrity: sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==} @@ -720,11 +714,11 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.19.11': - resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] - os: [openbsd] + os: [netbsd] '@esbuild/openbsd-x64@0.19.9': resolution: {integrity: sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==} @@ -732,11 +726,11 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.19.11': - resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] - os: [sunos] + os: [openbsd] '@esbuild/sunos-x64@0.19.9': resolution: {integrity: sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==} @@ -744,11 +738,11 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.19.11': - resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} - cpu: [arm64] - os: [win32] + cpu: [x64] + os: [sunos] '@esbuild/win32-arm64@0.19.9': resolution: {integrity: sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==} @@ -756,10 +750,10 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.19.11': - resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} - cpu: [ia32] + cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.19.9': @@ -768,10 +762,10 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.19.11': - resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} - cpu: [x64] + cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.19.9': @@ -780,6 +774,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -829,16 +829,28 @@ packages: resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.1': resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.1.2': resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.5': - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} '@jridgewell/sourcemap-codec@1.4.15': resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} @@ -846,8 +858,8 @@ packages: '@jridgewell/trace-mapping@0.3.20': resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - '@jridgewell/trace-mapping@0.3.22': - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -1001,8 +1013,8 @@ packages: '@types/eslint@8.44.7': resolution: {integrity: sha512-f5ORu2hcBbKei97U73mf+l9t4zTGl74IqZ0GQk4oVea/VS8tQZYkUveSYojk+frraAVYId0V2WC9O4PTNru2FQ==} - '@types/eslint@8.56.2': - resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + '@types/eslint@8.56.10': + resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} '@types/estree-jsx@1.0.3': resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} @@ -1134,8 +1146,8 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@webassemblyjs/ast@1.11.6': - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} '@webassemblyjs/floating-point-hex-parser@1.11.6': resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} @@ -1143,8 +1155,8 @@ packages: '@webassemblyjs/helper-api-error@1.11.6': resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - '@webassemblyjs/helper-buffer@1.11.6': - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} '@webassemblyjs/helper-numbers@1.11.6': resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} @@ -1152,8 +1164,8 @@ packages: '@webassemblyjs/helper-wasm-bytecode@1.11.6': resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - '@webassemblyjs/helper-wasm-section@1.11.6': - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} '@webassemblyjs/ieee754@1.11.6': resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} @@ -1164,20 +1176,20 @@ packages: '@webassemblyjs/utf8@1.11.6': resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - '@webassemblyjs/wasm-edit@1.11.6': - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} - '@webassemblyjs/wasm-gen@1.11.6': - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} - '@webassemblyjs/wasm-opt@1.11.6': - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} - '@webassemblyjs/wasm-parser@1.11.6': - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} - '@webassemblyjs/wast-printer@1.11.6': - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -1208,8 +1220,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} hasBin: true @@ -1419,8 +1431,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - browserslist@4.22.3: - resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1476,8 +1488,8 @@ packages: caniuse-lite@1.0.30001570: resolution: {integrity: sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==} - caniuse-lite@1.0.30001587: - resolution: {integrity: sha512-HMFNotUmLXn71BQxg8cijvqxnIAofforZOwGsxyXJ0qugTdspUF4sPSJ2vhgprHCB996tIDzEq1ubumPDV8ULA==} + caniuse-lite@1.0.30001638: + resolution: {integrity: sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==} ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -1516,8 +1528,8 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} ci-info@3.9.0: @@ -1840,8 +1852,8 @@ packages: electron-to-chromium@1.4.613: resolution: {integrity: sha512-r4x5+FowKG6q+/Wj0W9nidx7QO31BJwmR2uEo+Qh3YLGQ8SbBAFuDFpTxzly/I2gsbrFwBuIjrMp423L3O5U3w==} - electron-to-chromium@1.4.667: - resolution: {integrity: sha512-66L3pLlWhTNVUhnmSA5+qDM3fwnXsM6KAqE36e2w4KN0g6pkEtlT5bs41FQtQwVwKnfhNBXiWRLPs30HSxd7Kw==} + electron-to-chromium@1.4.812: + resolution: {integrity: sha512-7L8fC2Ey/b6SePDFKR2zHAy4mbdp1/38Yk5TsARO66W3hC5KEaeKMMHoxwtuH+jcu2AYLSn9QX04i95t6Fl1Hg==} elegant-spinner@3.0.0: resolution: {integrity: sha512-nWUuor3FWTGYAch7SY0unb5qLzs7eAc24ic9PBh+eQctFNQ4IDWJqBpBgsL4SrrGHHN0mJoL7CpWZby5t2KjFg==} @@ -1867,8 +1879,8 @@ packages: resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} engines: {node: '>=0.6'} - enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -1897,6 +1909,9 @@ packages: es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-set-tostringtag@2.0.2: resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} engines: {node: '>= 0.4'} @@ -1908,13 +1923,13 @@ packages: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - esbuild@0.19.11: - resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==} + esbuild@0.19.9: + resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==} engines: {node: '>=12'} hasBin: true - esbuild@0.19.9: - resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true @@ -2330,6 +2345,9 @@ packages: get-tsconfig@4.7.2: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} @@ -3609,6 +3627,9 @@ packages: picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} @@ -4339,8 +4360,8 @@ packages: uglify-js: optional: true - terser@5.27.0: - resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} + terser@5.31.1: + resolution: {integrity: sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==} engines: {node: '>=10'} hasBin: true @@ -4422,8 +4443,8 @@ packages: tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - tsx@4.7.0: - resolution: {integrity: sha512-I+t79RYPlEYlHn9a+KzwrvEwhJg35h/1zHsLC2JXvhC2mdynMv6Zxzvhv5EMV6VF5qJlLlkSnMVvdZV3PSIGcg==} + tsx@4.15.7: + resolution: {integrity: sha512-u3H0iSFDZM3za+VxkZ1kywdCeHCn+8/qHQS1MNoO2sONDgD95HlWtt8aB23OzeTmFP9IU4/8bZUdg58Uu5J4cg==} engines: {node: '>=18.0.0'} hasBin: true @@ -4520,8 +4541,8 @@ packages: typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + typescript@5.5.2: + resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} engines: {node: '>=14.17'} hasBin: true @@ -4603,6 +4624,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -4675,8 +4702,8 @@ packages: vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} - watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + watchpack@2.4.1: + resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} engines: {node: '>=10.13.0'} wcwidth@1.0.1: @@ -4851,12 +4878,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/mdx@2.0.1(astro@4.0.5)': + '@astrojs/mdx@2.0.1(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2))': dependencies: '@astrojs/markdown-remark': 4.0.1 '@mdx-js/mdx': 3.0.0 acorn: 8.11.2 - astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) + astro: 4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2) es-module-lexer: 1.4.1 estree-util-visit: 2.0.0 github-slugger: 2.0.0 @@ -4881,21 +4908,21 @@ snapshots: sitemap: 7.1.1 zod: 3.22.4 - '@astrojs/starlight-tailwind@2.0.1(@astrojs/starlight@0.15.0)(@astrojs/tailwind@5.0.3)(tailwindcss@3.3.6)': + '@astrojs/starlight-tailwind@2.0.1(@astrojs/starlight@0.15.0(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2)))(@astrojs/tailwind@5.0.3(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2))(tailwindcss@3.3.6))(tailwindcss@3.3.6)': dependencies: - '@astrojs/starlight': 0.15.0(astro@4.0.5) - '@astrojs/tailwind': 5.0.3(astro@4.0.5)(tailwindcss@3.3.6) + '@astrojs/starlight': 0.15.0(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2)) + '@astrojs/tailwind': 5.0.3(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2))(tailwindcss@3.3.6) tailwindcss: 3.3.6 - '@astrojs/starlight@0.15.0(astro@4.0.5)': + '@astrojs/starlight@0.15.0(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2))': dependencies: - '@astrojs/mdx': 2.0.1(astro@4.0.5) + '@astrojs/mdx': 2.0.1(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2)) '@astrojs/sitemap': 3.0.3 '@pagefind/default-ui': 1.0.4 '@types/hast': 3.0.3 '@types/mdast': 4.0.3 - astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) - astro-expressive-code: 0.29.4(astro@4.0.5) + astro: 4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2) + astro-expressive-code: 0.29.4(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2)) bcp-47: 2.1.0 execa: 8.0.1 hast-util-select: 6.0.2 @@ -4911,9 +4938,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@astrojs/tailwind@5.0.3(astro@4.0.5)(tailwindcss@3.3.6)': + '@astrojs/tailwind@5.0.3(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2))(tailwindcss@3.3.6)': dependencies: - astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) + astro: 4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2) autoprefixer: 10.4.16(postcss@8.4.32) postcss: 8.4.32 postcss-load-config: 4.0.2(postcss@8.4.32) @@ -5230,11 +5257,11 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 - '@commitlint/cli@18.6.1(@types/node@20.10.4)(typescript@5.3.3)': + '@commitlint/cli@18.6.1(@types/node@20.10.4)(typescript@5.5.2)': dependencies: '@commitlint/format': 18.6.1 '@commitlint/lint': 18.6.1 - '@commitlint/load': 18.6.1(@types/node@20.10.4)(typescript@5.3.3) + '@commitlint/load': 18.6.1(@types/node@20.10.4)(typescript@5.5.2) '@commitlint/read': 18.6.1 '@commitlint/types': 18.6.1 execa: 5.1.1 @@ -5284,15 +5311,15 @@ snapshots: '@commitlint/rules': 18.6.1 '@commitlint/types': 18.6.1 - '@commitlint/load@18.6.1(@types/node@20.10.4)(typescript@5.3.3)': + '@commitlint/load@18.6.1(@types/node@20.10.4)(typescript@5.5.2)': dependencies: '@commitlint/config-validator': 18.6.1 '@commitlint/execute-rule': 18.6.1 '@commitlint/resolve-extends': 18.6.1 '@commitlint/types': 18.6.1 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.3.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.10.4)(cosmiconfig@8.3.6)(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.5.2) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.10.4)(cosmiconfig@8.3.6(typescript@5.5.2))(typescript@5.5.2) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -5345,141 +5372,141 @@ snapshots: '@ctrl/tinycolor@3.6.1': {} - '@esbuild/aix-ppc64@0.19.11': - optional: true - - '@esbuild/android-arm64@0.19.11': + '@esbuild/aix-ppc64@0.21.5': optional: true '@esbuild/android-arm64@0.19.9': optional: true - '@esbuild/android-arm@0.19.11': + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm@0.19.9': optional: true - '@esbuild/android-x64@0.19.11': + '@esbuild/android-arm@0.21.5': optional: true '@esbuild/android-x64@0.19.9': optional: true - '@esbuild/darwin-arm64@0.19.11': + '@esbuild/android-x64@0.21.5': optional: true '@esbuild/darwin-arm64@0.19.9': optional: true - '@esbuild/darwin-x64@0.19.11': + '@esbuild/darwin-arm64@0.21.5': optional: true '@esbuild/darwin-x64@0.19.9': optional: true - '@esbuild/freebsd-arm64@0.19.11': + '@esbuild/darwin-x64@0.21.5': optional: true '@esbuild/freebsd-arm64@0.19.9': optional: true - '@esbuild/freebsd-x64@0.19.11': + '@esbuild/freebsd-arm64@0.21.5': optional: true '@esbuild/freebsd-x64@0.19.9': optional: true - '@esbuild/linux-arm64@0.19.11': + '@esbuild/freebsd-x64@0.21.5': optional: true '@esbuild/linux-arm64@0.19.9': optional: true - '@esbuild/linux-arm@0.19.11': + '@esbuild/linux-arm64@0.21.5': optional: true '@esbuild/linux-arm@0.19.9': optional: true - '@esbuild/linux-ia32@0.19.11': + '@esbuild/linux-arm@0.21.5': optional: true '@esbuild/linux-ia32@0.19.9': optional: true - '@esbuild/linux-loong64@0.19.11': + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-loong64@0.19.9': optional: true - '@esbuild/linux-mips64el@0.19.11': + '@esbuild/linux-loong64@0.21.5': optional: true '@esbuild/linux-mips64el@0.19.9': optional: true - '@esbuild/linux-ppc64@0.19.11': + '@esbuild/linux-mips64el@0.21.5': optional: true '@esbuild/linux-ppc64@0.19.9': optional: true - '@esbuild/linux-riscv64@0.19.11': + '@esbuild/linux-ppc64@0.21.5': optional: true '@esbuild/linux-riscv64@0.19.9': optional: true - '@esbuild/linux-s390x@0.19.11': + '@esbuild/linux-riscv64@0.21.5': optional: true '@esbuild/linux-s390x@0.19.9': optional: true - '@esbuild/linux-x64@0.19.11': + '@esbuild/linux-s390x@0.21.5': optional: true '@esbuild/linux-x64@0.19.9': optional: true - '@esbuild/netbsd-x64@0.19.11': + '@esbuild/linux-x64@0.21.5': optional: true '@esbuild/netbsd-x64@0.19.9': optional: true - '@esbuild/openbsd-x64@0.19.11': + '@esbuild/netbsd-x64@0.21.5': optional: true '@esbuild/openbsd-x64@0.19.9': optional: true - '@esbuild/sunos-x64@0.19.11': + '@esbuild/openbsd-x64@0.21.5': optional: true '@esbuild/sunos-x64@0.19.9': optional: true - '@esbuild/win32-arm64@0.19.11': + '@esbuild/sunos-x64@0.21.5': optional: true '@esbuild/win32-arm64@0.19.9': optional: true - '@esbuild/win32-ia32@0.19.11': + '@esbuild/win32-arm64@0.21.5': optional: true '@esbuild/win32-ia32@0.19.9': optional: true - '@esbuild/win32-x64@0.19.11': + '@esbuild/win32-ia32@0.21.5': optional: true '@esbuild/win32-x64@0.19.9': optional: true + '@esbuild/win32-x64@0.21.5': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.53.0)': dependencies: eslint: 8.53.0 @@ -5554,14 +5581,24 @@ snapshots: '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.1': {} + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/set-array@1.1.2': {} - '@jridgewell/source-map@0.3.5': + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 '@jridgewell/sourcemap-codec@1.4.15': {} @@ -5570,9 +5607,9 @@ snapshots: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping@0.3.22': + '@jridgewell/trace-mapping@0.3.25': dependencies: - '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@manypkg/find-root@1.1.0': @@ -5738,7 +5775,7 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: - '@types/eslint': 8.56.2 + '@types/eslint': 8.56.10 '@types/estree': 1.0.5 '@types/eslint@8.44.7': @@ -5746,7 +5783,7 @@ snapshots: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - '@types/eslint@8.56.2': + '@types/eslint@8.56.10': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 @@ -5817,13 +5854,13 @@ snapshots: dependencies: '@types/node': 20.10.4 - '@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.5.2) '@typescript-eslint/scope-manager': 6.10.0 - '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.3.3) + '@typescript-eslint/type-utils': 6.10.0(eslint@8.53.0)(typescript@5.5.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.5.2) '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4 eslint: 8.53.0 @@ -5831,20 +5868,22 @@ snapshots: ignore: 5.2.4 natural-compare: 1.4.0 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.0.3(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.3.3)': + '@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2)': dependencies: '@typescript-eslint/scope-manager': 6.10.0 '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.5.2) '@typescript-eslint/visitor-keys': 6.10.0 debug: 4.3.4 eslint: 8.53.0 - typescript: 5.3.3 + optionalDependencies: + typescript: 5.5.2 transitivePeerDependencies: - supports-color @@ -5853,20 +5892,21 @@ snapshots: '@typescript-eslint/types': 6.10.0 '@typescript-eslint/visitor-keys': 6.10.0 - '@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.3.3)': + '@typescript-eslint/type-utils@6.10.0(eslint@8.53.0)(typescript@5.5.2)': dependencies: - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.5.2) + '@typescript-eslint/utils': 6.10.0(eslint@8.53.0)(typescript@5.5.2) debug: 4.3.4 eslint: 8.53.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.0.3(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@6.10.0': {} - '@typescript-eslint/typescript-estree@6.10.0(typescript@5.3.3)': + '@typescript-eslint/typescript-estree@6.10.0(typescript@5.5.2)': dependencies: '@typescript-eslint/types': 6.10.0 '@typescript-eslint/visitor-keys': 6.10.0 @@ -5874,19 +5914,20 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.0.3(typescript@5.5.2) + optionalDependencies: + typescript: 5.5.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.3.3)': + '@typescript-eslint/utils@6.10.0(eslint@8.53.0)(typescript@5.5.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.53.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.5 '@typescript-eslint/scope-manager': 6.10.0 '@typescript-eslint/types': 6.10.0 - '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.10.0(typescript@5.5.2) eslint: 8.53.0 semver: 7.5.4 transitivePeerDependencies: @@ -5900,7 +5941,7 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@webassemblyjs/ast@1.11.6': + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 @@ -5909,7 +5950,7 @@ snapshots: '@webassemblyjs/helper-api-error@1.11.6': {} - '@webassemblyjs/helper-buffer@1.11.6': {} + '@webassemblyjs/helper-buffer@1.12.1': {} '@webassemblyjs/helper-numbers@1.11.6': dependencies: @@ -5919,12 +5960,12 @@ snapshots: '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - '@webassemblyjs/helper-wasm-section@1.11.6': + '@webassemblyjs/helper-wasm-section@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 '@webassemblyjs/ieee754@1.11.6': dependencies: @@ -5936,44 +5977,44 @@ snapshots: '@webassemblyjs/utf8@1.11.6': {} - '@webassemblyjs/wasm-edit@1.11.6': + '@webassemblyjs/wasm-edit@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 - '@webassemblyjs/wasm-gen@1.11.6': + '@webassemblyjs/wasm-gen@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wasm-opt@1.11.6': + '@webassemblyjs/wasm-opt@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wasm-parser@1.11.6': + '@webassemblyjs/wasm-parser@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - '@webassemblyjs/wast-printer@1.11.6': + '@webassemblyjs/wast-printer@1.12.1': dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 '@xtuc/ieee754@1.2.0': {} @@ -5989,9 +6030,9 @@ snapshots: dependencies: event-target-shim: 5.0.1 - acorn-import-assertions@1.9.0(acorn@8.11.3): + acorn-import-assertions@1.9.0(acorn@8.12.0): dependencies: - acorn: 8.11.3 + acorn: 8.12.0 acorn-jsx@5.3.2(acorn@8.11.2): dependencies: @@ -5999,7 +6040,7 @@ snapshots: acorn@8.11.2: {} - acorn@8.11.3: {} + acorn@8.12.0: {} ajv-keywords@3.5.2(ajv@6.12.6): dependencies: @@ -6122,12 +6163,12 @@ snapshots: astring@1.8.6: {} - astro-expressive-code@0.29.4(astro@4.0.5): + astro-expressive-code@0.29.4(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2)): dependencies: - astro: 4.0.5(@types/node@20.10.4)(typescript@5.3.3) + astro: 4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2) remark-expressive-code: 0.29.4 - astro@4.0.5(@types/node@20.10.4)(typescript@5.3.3): + astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2): dependencies: '@astrojs/compiler': 2.3.2 '@astrojs/internal-helpers': 0.2.1 @@ -6182,11 +6223,11 @@ snapshots: shikiji: 0.6.13 string-width: 7.0.0 strip-ansi: 7.1.0 - tsconfck: 3.0.0(typescript@5.3.3) + tsconfck: 3.0.0(typescript@5.5.2) unist-util-visit: 5.0.0 vfile: 6.0.1 - vite: 5.0.9(@types/node@20.10.4) - vitefu: 0.2.5(vite@5.0.9) + vite: 5.0.9(@types/node@20.12.14)(terser@5.31.1) + vitefu: 0.2.5(vite@5.0.9(@types/node@20.12.14)(terser@5.31.1)) which-pm: 2.1.1 yargs-parser: 21.1.1 zod: 3.22.4 @@ -6296,12 +6337,12 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.2) - browserslist@4.22.3: + browserslist@4.23.1: dependencies: - caniuse-lite: 1.0.30001587 - electron-to-chromium: 1.4.667 + caniuse-lite: 1.0.30001638 + electron-to-chromium: 1.4.812 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.3) + update-browserslist-db: 1.0.16(browserslist@4.23.1) buffer-from@1.1.2: {} @@ -6357,7 +6398,7 @@ snapshots: caniuse-lite@1.0.30001570: {} - caniuse-lite@1.0.30001587: {} + caniuse-lite@1.0.30001638: {} ccount@2.0.1: {} @@ -6398,7 +6439,7 @@ snapshots: chownr@1.1.4: {} - chrome-trace-event@1.0.3: {} + chrome-trace-event@1.0.4: {} ci-info@3.9.0: {} @@ -6503,28 +6544,30 @@ snapshots: cookie@0.6.0: {} - cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.4)(cosmiconfig@8.3.6)(typescript@5.3.3): + cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.4)(cosmiconfig@8.3.6(typescript@5.5.2))(typescript@5.5.2): dependencies: '@types/node': 20.10.4 - cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.5.2) jiti: 1.21.0 - typescript: 5.3.3 + typescript: 5.5.2 - cosmiconfig@8.3.6(typescript@5.3.3): + cosmiconfig@8.3.6(typescript@5.5.2): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.3.3 + optionalDependencies: + typescript: 5.5.2 - cosmiconfig@9.0.0(typescript@5.3.3): + cosmiconfig@9.0.0(typescript@5.5.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 - typescript: 5.3.3 + optionalDependencies: + typescript: 5.5.2 cross-spawn@5.1.0: dependencies: @@ -6676,7 +6719,7 @@ snapshots: electron-to-chromium@1.4.613: {} - electron-to-chromium@1.4.667: {} + electron-to-chromium@1.4.812: {} elegant-spinner@3.0.0: {} @@ -6700,7 +6743,7 @@ snapshots: memory-fs: 0.2.0 tapable: 0.1.10 - enhanced-resolve@5.15.0: + enhanced-resolve@5.17.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -6764,6 +6807,8 @@ snapshots: es-module-lexer@1.4.1: {} + es-module-lexer@1.5.4: {} + es-set-tostringtag@2.0.2: dependencies: get-intrinsic: 1.2.2 @@ -6780,32 +6825,6 @@ snapshots: is-date-object: 1.0.5 is-symbol: 1.0.4 - esbuild@0.19.11: - optionalDependencies: - '@esbuild/aix-ppc64': 0.19.11 - '@esbuild/android-arm': 0.19.11 - '@esbuild/android-arm64': 0.19.11 - '@esbuild/android-x64': 0.19.11 - '@esbuild/darwin-arm64': 0.19.11 - '@esbuild/darwin-x64': 0.19.11 - '@esbuild/freebsd-arm64': 0.19.11 - '@esbuild/freebsd-x64': 0.19.11 - '@esbuild/linux-arm': 0.19.11 - '@esbuild/linux-arm64': 0.19.11 - '@esbuild/linux-ia32': 0.19.11 - '@esbuild/linux-loong64': 0.19.11 - '@esbuild/linux-mips64el': 0.19.11 - '@esbuild/linux-ppc64': 0.19.11 - '@esbuild/linux-riscv64': 0.19.11 - '@esbuild/linux-s390x': 0.19.11 - '@esbuild/linux-x64': 0.19.11 - '@esbuild/netbsd-x64': 0.19.11 - '@esbuild/openbsd-x64': 0.19.11 - '@esbuild/sunos-x64': 0.19.11 - '@esbuild/win32-arm64': 0.19.11 - '@esbuild/win32-ia32': 0.19.11 - '@esbuild/win32-x64': 0.19.11 - esbuild@0.19.9: optionalDependencies: '@esbuild/android-arm': 0.19.9 @@ -6831,6 +6850,32 @@ snapshots: '@esbuild/win32-ia32': 0.19.9 '@esbuild/win32-x64': 0.19.9 + esbuild@0.21.5: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + escalade@3.1.1: {} escalade@3.1.2: {} @@ -6845,12 +6890,12 @@ snapshots: dependencies: eslint: 8.53.0 - eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3): + eslint-config-xo-typescript@1.0.1(@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2))(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2): dependencies: - '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3) - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2) + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.5.2) eslint: 8.53.0 - typescript: 5.3.3 + typescript: 5.5.2 eslint-config-xo@0.43.1(eslint@8.53.0): dependencies: @@ -6876,12 +6921,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1): + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1): dependencies: array.prototype.find: 2.2.2 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0) find-root: 1.1.0 hasown: 2.0.1 interpret: 1.4.0 @@ -6894,13 +6939,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0): dependencies: - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.5.2) eslint: 8.53.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1) transitivePeerDependencies: - supports-color @@ -6928,9 +6974,8 @@ snapshots: eslint: 8.53.0 ignore: 5.2.4 - eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0): + eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0): dependencies: - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) array-includes: 3.1.7 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 @@ -6938,7 +6983,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.53.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0) has: 1.0.4 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -6947,6 +6992,8 @@ snapshots: resolve: 1.22.8 semver: 6.3.1 tsconfig-paths: 3.14.2 + optionalDependencies: + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.5.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -6972,13 +7019,15 @@ snapshots: is-obj-prop: 1.0.0 is-proto-prop: 2.0.0 - eslint-plugin-prettier@5.0.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@3.1.1): + eslint-plugin-prettier@5.0.1(@types/eslint@8.56.10)(eslint-config-prettier@8.10.0(eslint@8.53.0))(eslint@8.53.0)(prettier@3.1.1): dependencies: eslint: 8.53.0 - eslint-config-prettier: 8.10.0(eslint@8.53.0) prettier: 3.1.1 prettier-linter-helpers: 1.0.0 synckit: 0.8.5 + optionalDependencies: + '@types/eslint': 8.56.10 + eslint-config-prettier: 8.10.0(eslint@8.53.0) eslint-plugin-unicorn@48.0.1(eslint@8.53.0): dependencies: @@ -7333,6 +7382,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + get-tsconfig@4.7.5: + dependencies: + resolve-pkg-maps: 1.0.0 + git-raw-commits@2.0.11: dependencies: dargs: 7.0.0 @@ -8994,6 +9047,8 @@ snapshots: picocolors@1.0.0: {} + picocolors@1.0.1: {} + picomatch@2.3.1: {} pidtree@0.3.1: {} @@ -9062,8 +9117,9 @@ snapshots: postcss-load-config@4.0.2(postcss@8.4.32): dependencies: lilconfig: 3.0.0 - postcss: 8.4.32 yaml: 2.3.4 + optionalDependencies: + postcss: 8.4.32 postcss-nested@6.0.1(postcss@8.4.32): dependencies: @@ -9842,17 +9898,17 @@ snapshots: terser-webpack-plugin@5.3.10(webpack@5.90.1): dependencies: - '@jridgewell/trace-mapping': 0.3.22 + '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.27.0 + terser: 5.31.1 webpack: 5.90.1 - terser@5.27.0: + terser@5.31.1: dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.11.3 + '@jridgewell/source-map': 0.3.6 + acorn: 8.12.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -9901,15 +9957,15 @@ snapshots: trough@2.1.0: {} - ts-api-utils@1.0.3(typescript@5.3.3): + ts-api-utils@1.0.3(typescript@5.5.2): dependencies: - typescript: 5.3.3 + typescript: 5.5.2 ts-interface-checker@0.1.13: {} - tsconfck@3.0.0(typescript@5.3.3): - dependencies: - typescript: 5.3.3 + tsconfck@3.0.0(typescript@5.5.2): + optionalDependencies: + typescript: 5.5.2 tsconfig-paths@3.14.2: dependencies: @@ -9920,10 +9976,10 @@ snapshots: tslib@2.6.2: {} - tsx@4.7.0: + tsx@4.15.7: dependencies: - esbuild: 0.19.11 - get-tsconfig: 4.7.2 + esbuild: 0.21.5 + get-tsconfig: 4.7.5 optionalDependencies: fsevents: 2.3.3 @@ -10015,7 +10071,7 @@ snapshots: for-each: 0.3.3 is-typed-array: 1.1.12 - typescript@5.3.3: {} + typescript@5.5.2: {} unbox-primitive@1.0.2: dependencies: @@ -10130,11 +10186,11 @@ snapshots: escalade: 3.1.1 picocolors: 1.0.0 - update-browserslist-db@1.0.13(browserslist@4.22.3): + update-browserslist-db@1.0.16(browserslist@4.23.1): dependencies: - browserslist: 4.22.3 - escalade: 3.1.1 - picocolors: 1.0.0 + browserslist: 4.23.1 + escalade: 3.1.2 + picocolors: 1.0.1 uri-js@4.4.1: dependencies: @@ -10182,24 +10238,25 @@ snapshots: unist-util-stringify-position: 4.0.0 vfile-message: 4.0.2 - vite@5.0.9(@types/node@20.10.4): + vite@5.0.9(@types/node@20.12.14)(terser@5.31.1): dependencies: - '@types/node': 20.10.4 esbuild: 0.19.9 postcss: 8.4.32 rollup: 4.9.0 optionalDependencies: + '@types/node': 20.12.14 fsevents: 2.3.3 + terser: 5.31.1 - vitefu@0.2.5(vite@5.0.9): - dependencies: - vite: 5.0.9(@types/node@20.10.4) + vitefu@0.2.5(vite@5.0.9(@types/node@20.12.14)(terser@5.31.1)): + optionalDependencies: + vite: 5.0.9(@types/node@20.12.14)(terser@5.31.1) vscode-oniguruma@1.7.0: {} vscode-textmate@8.0.0: {} - watchpack@2.4.0: + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -10216,15 +10273,15 @@ snapshots: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.22.3 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.4.1 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + acorn: 8.12.0 + acorn-import-assertions: 1.9.0(acorn@8.12.0) + browserslist: 4.23.1 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.0 + es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -10236,7 +10293,7 @@ snapshots: schema-utils: 3.3.0 tapable: 2.2.1 terser-webpack-plugin: 5.3.10(webpack@5.90.1) - watchpack: 2.4.0 + watchpack: 2.4.1 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -10311,26 +10368,26 @@ snapshots: wrappy@1.0.2: {} - xo@0.56.0(webpack@5.90.1): + xo@0.56.0(@types/eslint@8.56.10)(webpack@5.90.1): dependencies: '@eslint/eslintrc': 2.1.3 - '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3) - '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 6.10.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2) + '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.5.2) arrify: 3.0.0 - cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.5.2) define-lazy-prop: 3.0.0 eslint: 8.53.0 eslint-config-prettier: 8.10.0(eslint@8.53.0) eslint-config-xo: 0.43.1(eslint@8.53.0) - eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.10.0)(@typescript-eslint/parser@6.10.0)(eslint@8.53.0)(typescript@5.3.3) + eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2))(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2) eslint-formatter-pretty: 5.0.0 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1) eslint-plugin-ava: 14.0.0(eslint@8.53.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.53.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0)(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0) eslint-plugin-n: 16.3.0(eslint@8.53.0) eslint-plugin-no-use-extend-native: 0.5.0 - eslint-plugin-prettier: 5.0.1(eslint-config-prettier@8.10.0)(eslint@8.53.0)(prettier@3.1.1) + eslint-plugin-prettier: 5.0.1(@types/eslint@8.56.10)(eslint-config-prettier@8.10.0(eslint@8.53.0))(eslint@8.53.0)(prettier@3.1.1) eslint-plugin-unicorn: 48.0.1(eslint@8.53.0) esm-utils: 4.2.1 find-cache-dir: 4.0.0 @@ -10348,7 +10405,8 @@ snapshots: semver: 7.5.4 slash: 5.1.0 to-absolute-glob: 3.0.0 - typescript: 5.3.3 + typescript: 5.5.2 + optionalDependencies: webpack: 5.90.1 transitivePeerDependencies: - '@types/eslint' From 48181d88b72d0bea4f2aed5766cd026cbfee8503 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Jun 2024 13:41:04 +0000 Subject: [PATCH 129/136] chore(deps): bump turbo from 1.10.16 to 2.0.5 Bumps [turbo](https://github.com/vercel/turbo) from 1.10.16 to 2.0.5. - [Release notes](https://github.com/vercel/turbo/releases) - [Changelog](https://github.com/vercel/turbo/blob/main/release.md) - [Commits](https://github.com/vercel/turbo/compare/v1.10.16...v2.0.5) --- updated-dependencies: - dependency-name: turbo dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 64 +++++++++++++++++++++++++++----------------------- 2 files changed, 36 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index b549f80..48cdaac 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "npm-run-all": "4.1.5", "prettier": "3.1.1", "tsx": "4.15.7", - "turbo": "1.10.16", + "turbo": "2.0.5", "typescript": "5.5.2", "xo": "0.56.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c44f6f9..41668e9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -39,8 +39,8 @@ importers: specifier: 4.15.7 version: 4.15.7 turbo: - specifier: 1.10.16 - version: 1.10.16 + specifier: 2.0.5 + version: 2.0.5 typescript: specifier: 5.5.2 version: 5.5.2 @@ -813,6 +813,7 @@ packages: '@humanwhocodes/config-array@0.11.13': resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -820,6 +821,7 @@ packages: '@humanwhocodes/object-schema@2.0.1': resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + deprecated: Use @eslint/object-schema instead '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -2377,9 +2379,11 @@ packages: glob@7.1.6: resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} @@ -2602,6 +2606,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3971,6 +3976,7 @@ packages: rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rollup@4.9.0: @@ -4456,38 +4462,38 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo-darwin-64@1.10.16: - resolution: {integrity: sha512-+Jk91FNcp9e9NCLYlvDDlp2HwEDp14F9N42IoW3dmHI5ZkGSXzalbhVcrx3DOox3QfiNUHxzWg4d7CnVNCuuMg==} + turbo-darwin-64@2.0.5: + resolution: {integrity: sha512-t/9XpWYIjOhIHUdwiR47SYBGYHkR1zWLxTkTNKZwCSn8BN0cfjPZ1BR6kcwYGxLGBhtl5GBf6A29nq2K7iwAjg==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@1.10.16: - resolution: {integrity: sha512-jqGpFZipIivkRp/i+jnL8npX0VssE6IAVNKtu573LXtssZdV/S+fRGYA16tI46xJGxSAivrZ/IcgZrV6Jk80bw==} + turbo-darwin-arm64@2.0.5: + resolution: {integrity: sha512-//5y4RJvnal8CttOLBwlaBqblcQb1qTlIxLN+I8O3E3rPuvHOupNKB9ZJxYIQ8oWf8ns8Ec8cxQ0GSBLTJIMtA==} cpu: [arm64] os: [darwin] - turbo-linux-64@1.10.16: - resolution: {integrity: sha512-PpqEZHwLoizQ6sTUvmImcRmACyRk9EWLXGlqceogPZsJ1jTRK3sfcF9fC2W56zkSIzuLEP07k5kl+ZxJd8JMcg==} + turbo-linux-64@2.0.5: + resolution: {integrity: sha512-LDtEDU2Gm8p3lKu//aHXZFRKUCVu68BNF9LQ+HmiCKFpNyK7khpMTxIAAUhDqt+AzlrbxtrxcCpCJaWg1JDjHg==} cpu: [x64] os: [linux] - turbo-linux-arm64@1.10.16: - resolution: {integrity: sha512-TMjFYz8to1QE0fKVXCIvG/4giyfnmqcQIwjdNfJvKjBxn22PpbjeuFuQ5kNXshUTRaTJihFbuuCcb5OYFNx4uw==} + turbo-linux-arm64@2.0.5: + resolution: {integrity: sha512-84wdrzntErBNxkHcwHxiTZdaginQAxGPnwLTyZj8lpUYI7okPoxy3jKpUeMHN3adm3iDedl/x0mYSIvVVkmOiA==} cpu: [arm64] os: [linux] - turbo-windows-64@1.10.16: - resolution: {integrity: sha512-+jsf68krs0N66FfC4/zZvioUap/Tq3sPFumnMV+EBo8jFdqs4yehd6+MxIwYTjSQLIcpH8KoNMB0gQYhJRLZzw==} + turbo-windows-64@2.0.5: + resolution: {integrity: sha512-SgaFZ0VW6kHCJogLNuLEleAauAJx2Y48wazZGVRmBpgSUS2AylXesaBMhJaEScYqLz7mIRn6KOgwM8D4wTxI9g==} cpu: [x64] os: [win32] - turbo-windows-arm64@1.10.16: - resolution: {integrity: sha512-sKm3hcMM1bl0B3PLG4ifidicOGfoJmOEacM5JtgBkYM48ncMHjkHfFY7HrJHZHUnXM4l05RQTpLFoOl/uIo2HQ==} + turbo-windows-arm64@2.0.5: + resolution: {integrity: sha512-foUxLOZoru0IRNIxm53fkfM4ubas9P0nTFjIcHtd+E8YHeogt8GqTweNre2e6ri1EHDo71emmuQgpuoFCOXZMg==} cpu: [arm64] os: [win32] - turbo@1.10.16: - resolution: {integrity: sha512-2CEaK4FIuSZiP83iFa9GqMTQhroW2QryckVqUydmg4tx78baftTOS0O+oDAhvo9r9Nit4xUEtC1RAHoqs6ZEtg==} + turbo@2.0.5: + resolution: {integrity: sha512-+6+hcWr4nwuESlKqUc626HMOTd3QT8hUOc9QM45PP1d4nErGkNOgExm4Pcov3in7LTuadMnB0gcd/BuzkEDIPw==} hasBin: true type-check@0.4.0: @@ -9997,32 +10003,32 @@ snapshots: dependencies: safe-buffer: 5.2.1 - turbo-darwin-64@1.10.16: + turbo-darwin-64@2.0.5: optional: true - turbo-darwin-arm64@1.10.16: + turbo-darwin-arm64@2.0.5: optional: true - turbo-linux-64@1.10.16: + turbo-linux-64@2.0.5: optional: true - turbo-linux-arm64@1.10.16: + turbo-linux-arm64@2.0.5: optional: true - turbo-windows-64@1.10.16: + turbo-windows-64@2.0.5: optional: true - turbo-windows-arm64@1.10.16: + turbo-windows-arm64@2.0.5: optional: true - turbo@1.10.16: + turbo@2.0.5: optionalDependencies: - turbo-darwin-64: 1.10.16 - turbo-darwin-arm64: 1.10.16 - turbo-linux-64: 1.10.16 - turbo-linux-arm64: 1.10.16 - turbo-windows-64: 1.10.16 - turbo-windows-arm64: 1.10.16 + turbo-darwin-64: 2.0.5 + turbo-darwin-arm64: 2.0.5 + turbo-linux-64: 2.0.5 + turbo-linux-arm64: 2.0.5 + turbo-windows-64: 2.0.5 + turbo-windows-arm64: 2.0.5 type-check@0.4.0: dependencies: From c151031d414e0db4316df97ff9110e0f442f6e55 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 27 Jun 2024 16:00:32 +0200 Subject: [PATCH 130/136] chore(deps): upgrade Turbo and opt out from telemetry --- .github/workflows/ci.yaml | 1 + docs/package.json | 4 +- pnpm-lock.yaml | 426 +++++++++++++++++++++++++++++++++++++- turbo.json | 2 +- 4 files changed, 423 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 07f53e4..01a8453 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -13,6 +13,7 @@ jobs: env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + DO_NOT_TRACK: 1 steps: - name: Check out code diff --git a/docs/package.json b/docs/package.json index d445425..85c5d1a 100644 --- a/docs/package.json +++ b/docs/package.json @@ -11,6 +11,7 @@ "astro": "astro" }, "dependencies": { + "@astrojs/check": "^0.7.0", "@astrojs/starlight": "^0.15.0", "@astrojs/starlight-tailwind": "2.0.1", "@astrojs/tailwind": "^5.0.3", @@ -20,5 +21,6 @@ }, "volta": { "extends": "../package.json" - } + }, + "packageManager": "pnpm@9.4.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 41668e9..a1844e2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: docs: dependencies: + '@astrojs/check': + specifier: ^0.7.0 + version: 0.7.0(prettier@3.1.1)(typescript@5.5.2) '@astrojs/starlight': specifier: ^0.15.0 version: 0.15.0(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2)) @@ -230,12 +233,33 @@ packages: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} + '@astrojs/check@0.7.0': + resolution: {integrity: sha512-UTqwOeKNu9IYZmJXEeWnQuTdSd/pX58Hl4TUARsMlT97SVDL//kLBE4T/ctxRz6J573N87oE5ddtW/uOOnQTug==} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + '@astrojs/compiler@2.3.2': resolution: {integrity: sha512-jkY7bCVxl27KeZsSxIZ+pqACe+g8VQUdTiSJRj/sXYdIaZlW3ZMq4qF2M17P/oDt3LBq0zLNwQr4Cb7fSpRGxQ==} + '@astrojs/compiler@2.8.1': + resolution: {integrity: sha512-NGfPAgU/9rvDEwsXu82RI1AxiivaxtEYBK9saW1f+2fTHUUqCJQ27HYtb2akG2QxCmFikgZ9zk26BEWgiHho1Q==} + '@astrojs/internal-helpers@0.2.1': resolution: {integrity: sha512-06DD2ZnItMwUnH81LBLco3tWjcZ1lGU9rLCCBaeUCGYe9cI0wKyY2W3kDyoW1I6GmcWgt1fu+D1CTvz+FIKf8A==} + '@astrojs/language-server@2.10.0': + resolution: {integrity: sha512-crHXpqYfA5qWioiuZnZFpTsNItgBlF1f0S9MzDYS7/pfCALkHNJ7K3w9U/j0uMKymsT4hC7BfMaX0DYlfdSzHg==} + hasBin: true + peerDependencies: + prettier: ^3.0.0 + prettier-plugin-astro: '>=0.11.0' + peerDependenciesMeta: + prettier: + optional: true + prettier-plugin-astro: + optional: true + '@astrojs/markdown-remark@4.0.1': resolution: {integrity: sha512-RU4ESnqvyLpj8WZs0n5elS6idaDdtIIm7mIpMaRNPCebpxMjfcfdwcmBwz83ktAj5d2eO5bC3z92TcGdli+lRw==} @@ -510,6 +534,27 @@ packages: resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} + '@emmetio/abbreviation@2.3.3': + resolution: {integrity: sha512-mgv58UrU3rh4YgbE/TzgLQwJ3pFsHHhCLqY20aJq+9comytTXUDNGG/SMtSeMJdkpxgXSXunBGLD8Boka3JyVA==} + + '@emmetio/css-abbreviation@2.1.8': + resolution: {integrity: sha512-s9yjhJ6saOO/uk1V74eifykk2CBYi01STTK3WlXWGOepyKa23ymJ053+DNQjpFcy1ingpaO7AxCcwLvHFY9tuw==} + + '@emmetio/css-parser@0.4.0': + resolution: {integrity: sha512-z7wkxRSZgrQHXVzObGkXG+Vmj3uRlpM11oCZ9pbaz0nFejvCDmAiNDpY75+wgXOcffKpj4rzGtwGaZxfJKsJxw==} + + '@emmetio/html-matcher@1.3.0': + resolution: {integrity: sha512-NTbsvppE5eVyBMuyGfVu2CRrLvo7J4YHb6t9sBFLyY03WYhXET37qA4zOYUjBWFCRHO7pS1B9khERtY0f5JXPQ==} + + '@emmetio/scanner@1.0.4': + resolution: {integrity: sha512-IqRuJtQff7YHHBk4G8YZ45uB9BaAGcwQeVzgj/zj8/UdOhtQpEIupUhSk8dys6spFIWVZVeK20CzGEnqR5SbqA==} + + '@emmetio/stream-reader-utils@0.1.0': + resolution: {integrity: sha512-ZsZ2I9Vzso3Ho/pjZFsmmZ++FWeEd/txqybHTm4OgaZzdS8V9V/YYWQwg5TC38Z7uLWUV1vavpLLbjJtKubR1A==} + + '@emmetio/stream-reader@2.2.0': + resolution: {integrity: sha512-fXVXEyFA5Yv3M3n8sUGT7+fvecGrZP4k6FnWWMSZVQf69kAq0LLpaBQLGcPR30m3zMmKYhECP4k/ZkzvhEW5kw==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -827,6 +872,9 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462': + resolution: {integrity: sha512-etqLfpSJ5zaw76KUNF603be6d6QsiQPmaHr9FKEp4zhLZJzWCCMH6Icak7MtLUFLZLMpL761mZNImi/joBo1ZA==} + '@jridgewell/gen-mapping@0.3.3': resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} engines: {node: '>=6.0.0'} @@ -1148,6 +1196,38 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@volar/kit@2.2.5': + resolution: {integrity: sha512-Bmn0UCaT43xUGGRwcmFG9lKhiCCLjRT4ScSLLPn5C9ltUcSGnIFFDlbZZa1PreHYHq25/4zkXt9Ap32klAh17w==} + peerDependencies: + typescript: '*' + + '@volar/language-core@2.2.5': + resolution: {integrity: sha512-2htyAuxRrAgETmFeUhT4XLELk3LiEcqoW/B8YUXMF6BrGWLMwIR09MFaZYvrA2UhbdAeSyeQ726HaWSWkexUcQ==} + + '@volar/language-server@2.2.5': + resolution: {integrity: sha512-PV/jkUkI+m72HTXwnY7hsGqLY3VNi96ZRoWFRzVC9QG/853bixxjveXPJIiydMJ9I739lO3kcj3hnGrF5Sm+HA==} + + '@volar/language-service@2.2.5': + resolution: {integrity: sha512-a97e/0uCe+uSu23F4zvgvldqJtZe6jugQeEHWjTfhgOEO8+Be0t5CZNNVItQqmPyAsD8eElg0S/cP6uxvCmCSQ==} + + '@volar/snapshot-document@2.2.5': + resolution: {integrity: sha512-MTOvWVKxM7ugKO3Amffkv2pND03fe2JtfygYaputqjVFML7YxtTXj8SPnI2pODLeSwOKzDYL6Q8r5j6Y5AgUzQ==} + + '@volar/source-map@2.2.5': + resolution: {integrity: sha512-wrOEIiZNf4E+PWB0AxyM4tfhkfldPsb3bxg8N6FHrxJH2ohar7aGu48e98bp3pR9HUA7P/pR9VrLmkTrgCCnWQ==} + + '@volar/typescript@2.2.5': + resolution: {integrity: sha512-eSV/n75+ppfEVugMC/salZsI44nXDPAyL6+iTYCNLtiLHGJsnMv9GwiDMujrvAUj/aLQyqRJgYtXRoxop2clCw==} + + '@vscode/emmet-helper@2.9.3': + resolution: {integrity: sha512-rB39LHWWPQYYlYfpv9qCoZOVioPCftKXXqrsyqN1mTWZM6dTnONT63Db+03vgrBbHzJN45IrgS/AGxw9iiqfEw==} + + '@vscode/l10n@0.0.16': + resolution: {integrity: sha512-JT5CvrIYYCrmB+dCana8sUqJEcGB1ZDXNLMQ2+42bW995WmNoenijWMUdZfwmuQUTQcEVVIa2OecZzTYWUW9Cg==} + + '@vscode/l10n@0.0.18': + resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} + '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -1861,6 +1941,9 @@ packages: resolution: {integrity: sha512-nWUuor3FWTGYAch7SY0unb5qLzs7eAc24ic9PBh+eQctFNQ4IDWJqBpBgsL4SrrGHHN0mJoL7CpWZby5t2KjFg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + emmet@2.4.7: + resolution: {integrity: sha512-O5O5QNqtdlnQM2bmKHtJgyChcrFMgQuulI+WdiOw2NArzprUqqxUW6bgYtKvzKgrsYpuLWalOkdhNP+1jluhCA==} + emoji-regex@10.3.0: resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} @@ -2924,6 +3007,9 @@ packages: engines: {node: '>=6'} hasBin: true + jsonc-parser@2.3.1: + resolution: {integrity: sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==} + jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} @@ -3355,6 +3441,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + mysql2@3.6.5: resolution: {integrity: sha512-pS/KqIb0xlXmtmqEuTvBXTmLoQ5LmAz5NW/r8UyQ1ldvnprNEj3P9GbmuQQ2J0A4LO+ynotGi6TbscPa8OUb+w==} engines: {node: '>= 8.0'} @@ -3584,6 +3673,9 @@ packages: parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3917,6 +4009,9 @@ packages: remark-stringify@11.0.0: resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -4547,6 +4642,12 @@ packages: typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + typesafe-path@0.2.2: + resolution: {integrity: sha512-OJabfkAg1WLZSqJAJ0Z6Sdt3utnbzr/jh+NAHoyWHJe8CMSy79Gm085094M9nvTPy22KzTVn5Zq5mbapCI/hPA==} + + typescript-auto-import-cache@0.3.3: + resolution: {integrity: sha512-ojEC7+Ci1ij9eE6hp8Jl9VUNnsEKzztktP5gtYNRMrTmfXVwA1PITYYAkpxCvvupdSYa/Re51B6KMcv1CTZEUA==} + typescript@5.5.2: resolution: {integrity: sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==} engines: {node: '>=14.17'} @@ -4702,12 +4803,95 @@ packages: vite: optional: true + volar-service-css@0.0.45: + resolution: {integrity: sha512-f+AlUI1+kESbcZSVaNJVAnK0c/9Da5StoxzPqA5/8VqUHJWNdubWNnwG5xpFVTfgh6pgTcey3UBhBfHytFaIOg==} + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-emmet@0.0.45: + resolution: {integrity: sha512-9nLXSDkR1vA/3fQkFEsSXAu3XovQxOpTkVG2jilQgfek/K1ZLkaA/WMhN/TtmPmQg4NxE9Ni6mA5udBQ5gVXIA==} + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-html@0.0.45: + resolution: {integrity: sha512-tLTJqfy1v5C4nmeAsfekFIKPl4r4qDMyL0L9MWywr/EApZzPCsbeUGxCqdzxSMC2q7PMCfX2i167txDo+J0LVA==} + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-prettier@0.0.45: + resolution: {integrity: sha512-+mBS2EsDgp/kunKEBnHvhBwIQm5v2ahw4NKpKdg4sTpXy3UxqHt+Fq/wRYQ7Z8LlNVNRVfp75ThjM+w2zaZBAw==} + peerDependencies: + '@volar/language-service': ~2.2.3 + prettier: ^2.2 || ^3.0 + peerDependenciesMeta: + '@volar/language-service': + optional: true + prettier: + optional: true + + volar-service-typescript-twoslash-queries@0.0.45: + resolution: {integrity: sha512-KrPUUvKggZgV9mrDpstCzmf20irgv0ooMv+FGDzIIQUkya+d2+nSS8Mx2h9FvsYgLccUVw5jU3Rhwhd3pv/7qg==} + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + volar-service-typescript@0.0.45: + resolution: {integrity: sha512-i/mMIIAMastJ2kgPo3qvX0Rrl7NyxhIYZ0ug/B4ambZcLPI1vzBgS2fmvyWX3jhBYHh8NmbAotFj+0Y9JtN47A==} + peerDependencies: + '@volar/language-service': ~2.2.3 + peerDependenciesMeta: + '@volar/language-service': + optional: true + + vscode-css-languageservice@6.3.0: + resolution: {integrity: sha512-nU92imtkgzpCL0xikrIb8WvedV553F2BENzgz23wFuok/HLN5BeQmroMy26pUwFxV2eV8oNRmYCUv8iO7kSMhw==} + + vscode-html-languageservice@5.3.0: + resolution: {integrity: sha512-C4Z3KsP5Ih+fjHpiBc5jxmvCl+4iEwvXegIrzu2F5pktbWvQaBT3YkVPk8N+QlSSMk8oCG6PKtZ/Sq2YHb5e8g==} + + vscode-jsonrpc@8.2.0: + resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} + engines: {node: '>=14.0.0'} + + vscode-languageserver-protocol@3.17.5: + resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + + vscode-languageserver-textdocument@1.0.11: + resolution: {integrity: sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==} + + vscode-languageserver-types@3.17.5: + resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + + vscode-languageserver@9.0.1: + resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} + hasBin: true + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + vscode-oniguruma@1.7.0: resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} vscode-textmate@8.0.0: resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + vscode-uri@2.1.2: + resolution: {integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==} + + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + watchpack@2.4.1: resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} engines: {node: '>=10.13.0'} @@ -4861,10 +5045,47 @@ snapshots: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.20 + '@astrojs/check@0.7.0(prettier@3.1.1)(typescript@5.5.2)': + dependencies: + '@astrojs/language-server': 2.10.0(prettier@3.1.1)(typescript@5.5.2) + chokidar: 3.5.3 + fast-glob: 3.3.2 + kleur: 4.1.5 + typescript: 5.5.2 + yargs: 17.7.2 + transitivePeerDependencies: + - prettier + - prettier-plugin-astro + '@astrojs/compiler@2.3.2': {} + '@astrojs/compiler@2.8.1': {} + '@astrojs/internal-helpers@0.2.1': {} + '@astrojs/language-server@2.10.0(prettier@3.1.1)(typescript@5.5.2)': + dependencies: + '@astrojs/compiler': 2.8.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@volar/kit': 2.2.5(typescript@5.5.2) + '@volar/language-core': 2.2.5 + '@volar/language-server': 2.2.5 + '@volar/language-service': 2.2.5 + '@volar/typescript': 2.2.5 + fast-glob: 3.3.2 + volar-service-css: 0.0.45(@volar/language-service@2.2.5) + volar-service-emmet: 0.0.45(@volar/language-service@2.2.5) + volar-service-html: 0.0.45(@volar/language-service@2.2.5) + volar-service-prettier: 0.0.45(@volar/language-service@2.2.5)(prettier@3.1.1) + volar-service-typescript: 0.0.45(@volar/language-service@2.2.5) + volar-service-typescript-twoslash-queries: 0.0.45(@volar/language-service@2.2.5) + vscode-html-languageservice: 5.3.0 + vscode-uri: 3.0.8 + optionalDependencies: + prettier: 3.1.1 + transitivePeerDependencies: + - typescript + '@astrojs/markdown-remark@4.0.1': dependencies: '@astrojs/prism': 3.0.0 @@ -5378,6 +5599,29 @@ snapshots: '@ctrl/tinycolor@3.6.1': {} + '@emmetio/abbreviation@2.3.3': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-abbreviation@2.1.8': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/css-parser@0.4.0': + dependencies: + '@emmetio/stream-reader': 2.2.0 + '@emmetio/stream-reader-utils': 0.1.0 + + '@emmetio/html-matcher@1.3.0': + dependencies: + '@emmetio/scanner': 1.0.4 + + '@emmetio/scanner@1.0.4': {} + + '@emmetio/stream-reader-utils@0.1.0': {} + + '@emmetio/stream-reader@2.2.0': {} + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -5581,6 +5825,13 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462': + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 @@ -5947,6 +6198,66 @@ snapshots: '@ungap/structured-clone@1.2.0': {} + '@volar/kit@2.2.5(typescript@5.5.2)': + dependencies: + '@volar/language-service': 2.2.5 + '@volar/typescript': 2.2.5 + typesafe-path: 0.2.2 + typescript: 5.5.2 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + + '@volar/language-core@2.2.5': + dependencies: + '@volar/source-map': 2.2.5 + + '@volar/language-server@2.2.5': + dependencies: + '@volar/language-core': 2.2.5 + '@volar/language-service': 2.2.5 + '@volar/snapshot-document': 2.2.5 + '@volar/typescript': 2.2.5 + '@vscode/l10n': 0.0.16 + path-browserify: 1.0.1 + request-light: 0.7.0 + vscode-languageserver: 9.0.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + + '@volar/language-service@2.2.5': + dependencies: + '@volar/language-core': 2.2.5 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + + '@volar/snapshot-document@2.2.5': + dependencies: + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.11 + + '@volar/source-map@2.2.5': + dependencies: + muggle-string: 0.4.1 + + '@volar/typescript@2.2.5': + dependencies: + '@volar/language-core': 2.2.5 + path-browserify: 1.0.1 + + '@vscode/emmet-helper@2.9.3': + dependencies: + emmet: 2.4.7 + jsonc-parser: 2.3.1 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 2.1.2 + + '@vscode/l10n@0.0.16': {} + + '@vscode/l10n@0.0.18': {} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 @@ -6729,6 +7040,11 @@ snapshots: elegant-spinner@3.0.0: {} + emmet@2.4.7: + dependencies: + '@emmetio/abbreviation': 2.3.3 + '@emmetio/css-abbreviation': 2.1.8 + emoji-regex@10.3.0: {} emoji-regex@8.0.0: {} @@ -6927,12 +7243,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1): + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1): dependencies: array.prototype.find: 2.2.2 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0) find-root: 1.1.0 hasown: 2.0.1 interpret: 1.4.0 @@ -6945,14 +7261,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1))(eslint@8.53.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.5.2) eslint: 8.53.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1) transitivePeerDependencies: - supports-color @@ -6980,7 +7296,7 @@ snapshots: eslint: 8.53.0 ignore: 5.2.4 - eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0): + eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0): dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 @@ -6989,7 +7305,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.53.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1))(eslint@8.53.0) has: 1.0.4 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -8043,6 +8359,8 @@ snapshots: json5@2.2.3: {} + jsonc-parser@2.3.1: {} + jsonc-parser@3.2.0: {} jsonfile@4.0.0: @@ -8749,6 +9067,8 @@ snapshots: ms@2.1.2: {} + muggle-string@0.4.1: {} + mysql2@3.6.5: dependencies: denque: 2.1.0 @@ -9018,6 +9338,8 @@ snapshots: dependencies: entities: 4.5.0 + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -9390,6 +9712,8 @@ snapshots: mdast-util-to-markdown: 2.1.0 unified: 11.0.4 + request-light@0.7.0: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -10077,6 +10401,12 @@ snapshots: for-each: 0.3.3 is-typed-array: 1.1.12 + typesafe-path@0.2.2: {} + + typescript-auto-import-cache@0.3.3: + dependencies: + semver: 7.6.0 + typescript@5.5.2: {} unbox-primitive@1.0.2: @@ -10258,10 +10588,90 @@ snapshots: optionalDependencies: vite: 5.0.9(@types/node@20.12.14)(terser@5.31.1) + volar-service-css@0.0.45(@volar/language-service@2.2.5): + dependencies: + vscode-css-languageservice: 6.3.0 + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.2.5 + + volar-service-emmet@0.0.45(@volar/language-service@2.2.5): + dependencies: + '@emmetio/css-parser': 0.4.0 + '@emmetio/html-matcher': 1.3.0 + '@vscode/emmet-helper': 2.9.3 + optionalDependencies: + '@volar/language-service': 2.2.5 + + volar-service-html@0.0.45(@volar/language-service@2.2.5): + dependencies: + vscode-html-languageservice: '@johnsoncodehk/vscode-html-languageservice@5.2.0-34a5462' + vscode-languageserver-textdocument: 1.0.11 + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.2.5 + + volar-service-prettier@0.0.45(@volar/language-service@2.2.5)(prettier@3.1.1): + dependencies: + vscode-uri: 3.0.8 + optionalDependencies: + '@volar/language-service': 2.2.5 + prettier: 3.1.1 + + volar-service-typescript-twoslash-queries@0.0.45(@volar/language-service@2.2.5): + optionalDependencies: + '@volar/language-service': 2.2.5 + + volar-service-typescript@0.0.45(@volar/language-service@2.2.5): + dependencies: + path-browserify: 1.0.1 + semver: 7.6.0 + typescript-auto-import-cache: 0.3.3 + vscode-languageserver-textdocument: 1.0.11 + vscode-nls: 5.2.0 + optionalDependencies: + '@volar/language-service': 2.2.5 + + vscode-css-languageservice@6.3.0: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-html-languageservice@5.3.0: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.11 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-jsonrpc@8.2.0: {} + + vscode-languageserver-protocol@3.17.5: + dependencies: + vscode-jsonrpc: 8.2.0 + vscode-languageserver-types: 3.17.5 + + vscode-languageserver-textdocument@1.0.11: {} + + vscode-languageserver-types@3.17.5: {} + + vscode-languageserver@9.0.1: + dependencies: + vscode-languageserver-protocol: 3.17.5 + + vscode-nls@5.2.0: {} + vscode-oniguruma@1.7.0: {} vscode-textmate@8.0.0: {} + vscode-uri@2.1.2: {} + + vscode-uri@3.0.8: {} + watchpack@2.4.1: dependencies: glob-to-regexp: 0.4.1 @@ -10387,10 +10797,10 @@ snapshots: eslint-config-xo: 0.43.1(eslint@8.53.0) eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2))(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2) eslint-formatter-pretty: 5.0.0 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1) eslint-plugin-ava: 14.0.0(eslint@8.53.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.53.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0) eslint-plugin-n: 16.3.0(eslint@8.53.0) eslint-plugin-no-use-extend-native: 0.5.0 eslint-plugin-prettier: 5.0.1(@types/eslint@8.56.10)(eslint-config-prettier@8.10.0(eslint@8.53.0))(eslint@8.53.0)(prettier@3.1.1) diff --git a/turbo.json b/turbo.json index d23e95e..51a9560 100644 --- a/turbo.json +++ b/turbo.json @@ -1,6 +1,6 @@ { "$schema": "https://turborepo.org/schema.json", - "pipeline": { + "tasks": { "build": { "dependsOn": ["^build"], "inputs": ["src/**/*", "!src/**/*.test.ts", "tsconfig.json", "tsconfig.build.json"], From bb9d674cd7a4335db875082f2256de320df95655 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 27 Jun 2024 16:03:07 +0200 Subject: [PATCH 131/136] chore: turn off Turbo's UI as it messes with the terminal and is not as intuitive as it seems --- turbo.json | 1 + 1 file changed, 1 insertion(+) diff --git a/turbo.json b/turbo.json index 51a9560..42f1f9f 100644 --- a/turbo.json +++ b/turbo.json @@ -1,5 +1,6 @@ { "$schema": "https://turborepo.org/schema.json", + "ui": "stream", "tasks": { "build": { "dependsOn": ["^build"], From b3b603b2fc8527f2d79f89f8f53e81d4175b1cea Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 9 Aug 2024 15:49:07 +0200 Subject: [PATCH 132/136] feat: make aggregated GitHub releases instead of one per package And also publish packages with unreleased changes tagged with `next` to NPM --- .github/workflows/release.yaml | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 0947b01..97a67ee 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -37,11 +37,36 @@ jobs: run: pnpm install - name: Create Release Pull Request - uses: changesets/action@v1.4.7 + id: changesets + uses: aboviq/changesets-action@main with: publish: pnpm run release commit: 'chore(release): version packages' title: 'chore(release): version packages' + createGithubReleases: aggregate env: GITHUB_TOKEN: ${{ secrets.PAT_GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Release to @next tag on npm + if: github.ref_name == 'main' && steps.changesets.outputs.published != 'true' + run: | + git checkout main + + CHANGESET_FILE=$(git diff-tree --no-commit-id --name-only HEAD -r ".changeset/*-*-*.md") + if [ -z "$CHANGESET_FILE" ]; then + echo "No changesets found, skipping release to @next tag" + exit 0 + fi + + AFFECTED_PACKAGES=$(sed -n '/---/,/---/p' "$CHANGESET_FILE" | sed '/---/d') + if [ -z "$AFFECTED_PACKAGES" ]; then + echo "No packages affected by changesets, skipping release to @next tag" + exit 0 + fi + + pnpm changeset version --snapshot next + pnpm changeset publish --tag next + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + GITHUB_TOKEN: ${{ secrets.PAT_GITHUB_TOKEN }} From 6eb60177c5df20386ac83403e53c5fecbc9fcf19 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 9 Aug 2024 16:03:34 +0200 Subject: [PATCH 133/136] fix: use another changesets-action version --- .github/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 97a67ee..702a702 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -38,7 +38,7 @@ jobs: - name: Create Release Pull Request id: changesets - uses: aboviq/changesets-action@main + uses: aboviq/changesets-action@v1.5.2 with: publish: pnpm run release commit: 'chore(release): version packages' From 26240f49ff962e820a2857f78b74632c0c126cf7 Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Thu, 24 Apr 2025 15:06:32 +0200 Subject: [PATCH 134/136] fix(mysql): make sure migrations are run in order when run concurrently Now we either lock all or none of the migrations to run, to make sure they are not out of order when multiple instances of Emigrate run concurrently. --- .changeset/bright-poems-approve.md | 5 + .changeset/yellow-walls-tease.md | 5 + .github/workflows/ci.yaml | 25 +- .github/workflows/release.yaml | 2 +- package.json | 3 +- packages/cli/src/commands/remove.test.ts | 15 +- packages/cli/src/commands/up.test.ts | 57 +-- packages/cli/src/test-utils.ts | 22 + packages/mysql/package.json | 8 +- packages/mysql/src/index.test.ts | 92 ++++ packages/mysql/src/index.ts | 116 ++++- packages/mysql/src/tests/database.ts | 45 ++ pnpm-lock.yaml | 625 ++++++++++++++++++++++- 13 files changed, 922 insertions(+), 98 deletions(-) create mode 100644 .changeset/bright-poems-approve.md create mode 100644 .changeset/yellow-walls-tease.md create mode 100644 packages/mysql/src/index.test.ts create mode 100644 packages/mysql/src/tests/database.ts diff --git a/.changeset/bright-poems-approve.md b/.changeset/bright-poems-approve.md new file mode 100644 index 0000000..4045f29 --- /dev/null +++ b/.changeset/bright-poems-approve.md @@ -0,0 +1,5 @@ +--- +'@emigrate/mysql': patch +--- + +Make sure we can initialize multiple running instances of Emigrate using @emigrate/mysql concurrently without issues with creating the history table (for instance in a Kubernetes environment and/or with a Percona cluster). diff --git a/.changeset/yellow-walls-tease.md b/.changeset/yellow-walls-tease.md new file mode 100644 index 0000000..2a0a22f --- /dev/null +++ b/.changeset/yellow-walls-tease.md @@ -0,0 +1,5 @@ +--- +'@emigrate/mysql': patch +--- + +Either lock all or none of the migrations to run to make sure they run in order when multiple instances of Emigrate runs concurrently (for instance in a Kubernetes environment) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 01a8453..b81d6b1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,6 +15,18 @@ jobs: TURBO_TEAM: ${{ secrets.TURBO_TEAM }} DO_NOT_TRACK: 1 + services: + mysql: + image: mysql:8.0 + env: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: emigrate + MYSQL_USER: emigrate + MYSQL_PASSWORD: emigrate + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping -h localhost" --health-interval=10s --health-timeout=5s --health-retries=5 + steps: - name: Check out code uses: actions/checkout@v4 @@ -26,11 +38,22 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20.9.0 + node-version: 22.15.0 cache: 'pnpm' - name: Install dependencies run: pnpm install + - name: Wait for MySQL to be ready + run: | + for i in {1..30}; do + nc -z localhost 3306 && echo "MySQL is up!" && break + echo "Waiting for MySQL..." + sleep 2 + done + - name: Checks + env: + MYSQL_HOST: localhost + MYSQL_PORT: 3306 run: pnpm checks diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 702a702..8b42c24 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -30,7 +30,7 @@ jobs: - name: Setup Node.js environment uses: actions/setup-node@v4 with: - node-version: 20.9.0 + node-version: 22.15.0 cache: 'pnpm' - name: Install Dependencies diff --git a/package.json b/package.json index 48cdaac..a2207a0 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "bugs": "https://github.com/aboviq/emigrate/issues", "license": "MIT", "volta": { - "node": "20.9.0", + "node": "22.15.0", "pnpm": "9.4.0" }, "packageManager": "pnpm@9.4.0", @@ -80,6 +80,7 @@ "lint-staged": "15.2.0", "npm-run-all": "4.1.5", "prettier": "3.1.1", + "testcontainers": "10.24.2", "tsx": "4.15.7", "turbo": "2.0.5", "typescript": "5.5.2", diff --git a/packages/cli/src/commands/remove.test.ts b/packages/cli/src/commands/remove.test.ts index a283551..f37769b 100644 --- a/packages/cli/src/commands/remove.test.ts +++ b/packages/cli/src/commands/remove.test.ts @@ -11,6 +11,7 @@ import { StorageInitError, } from '../errors.js'; import { + assertErrorEqualEnough, getErrorCause, getMockedReporter, getMockedStorage, @@ -199,6 +200,11 @@ function assertPreconditionsFailed(reporter: Mocked>, assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0, 'Total pending and skipped'); assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; + // hackety hack: + if (finishedError) { + finishedError.stack = error?.stack; + } + assert.deepStrictEqual(error, finishedError, 'Finished error'); const cause = getErrorCause(error); const expectedCause = finishedError?.cause; @@ -288,14 +294,7 @@ function assertPreconditionsFulfilled( assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0, 'Total pending and skipped'); assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assert.deepStrictEqual(error, finishedError, 'Finished error'); - const cause = getErrorCause(error); - const expectedCause = finishedError?.cause; - assert.deepStrictEqual( - cause, - expectedCause ? deserializeError(expectedCause) : expectedCause, - 'Finished error cause', - ); + assertErrorEqualEnough(error, finishedError, 'Finished error'); assert.strictEqual(entries?.length, expected.length, 'Finished entries length'); assert.deepStrictEqual( entries.map((entry) => `${entry.name} (${entry.status})`), diff --git a/packages/cli/src/commands/up.test.ts b/packages/cli/src/commands/up.test.ts index 869af10..bc90241 100644 --- a/packages/cli/src/commands/up.test.ts +++ b/packages/cli/src/commands/up.test.ts @@ -1,13 +1,6 @@ import { describe, it, mock } from 'node:test'; import assert from 'node:assert'; -import { - type EmigrateReporter, - type Storage, - type Plugin, - type SerializedError, - type MigrationMetadataFinished, -} from '@emigrate/types'; -import { deserializeError } from 'serialize-error'; +import { type EmigrateReporter, type Storage, type Plugin, type MigrationMetadataFinished } from '@emigrate/types'; import { version } from '../get-package-info.js'; import { BadOptionError, @@ -16,7 +9,6 @@ import { MigrationHistoryError, MigrationRunError, StorageInitError, - toSerializedError, } from '../errors.js'; import { type Mocked, @@ -24,7 +16,7 @@ import { toMigrations, getMockedReporter, getMockedStorage, - getErrorCause, + assertErrorEqualEnough, } from '../test-utils.js'; import upCommand from './up.js'; @@ -930,15 +922,13 @@ function assertPreconditionsFulfilled( for (const [index, entry] of failedEntries.entries()) { if (entry.status === 'failed') { const error = reporter.onMigrationError.mock.calls[index]?.arguments[1]; - assert.deepStrictEqual(error, entry.error, 'Error'); - const cause = entry.error?.cause; - assert.deepStrictEqual(error?.cause, cause ? deserializeError(cause) : cause, 'Error cause'); + assertErrorEqualEnough(error, entry.error, 'Error'); if (entry.started) { const [finishedMigration, error] = storage.onError.mock.calls[index]?.arguments ?? []; assert.strictEqual(finishedMigration?.name, entry.name); assert.strictEqual(finishedMigration?.status, entry.status); - assertErrorEqualEnough(error, entry.error); + assertErrorEqualEnough(error, entry.error, `Entry error (${entry.name})`); } } } @@ -946,15 +936,7 @@ function assertPreconditionsFulfilled( assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, pending + skipped, 'Total pending and skipped'); assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assertErrorEqualEnough(error, finishedError); - - const cause = getErrorCause(error); - const expectedCause = finishedError?.cause; - assert.deepStrictEqual( - cause, - expectedCause ? deserializeError(expectedCause) : expectedCause, - 'Finished error cause', - ); + assertErrorEqualEnough(error, finishedError, 'Finished error'); assert.strictEqual(entries?.length, expected.length, 'Finished entries length'); assert.deepStrictEqual( entries.map((entry) => `${entry.name} (${entry.status})`), @@ -995,33 +977,6 @@ function assertPreconditionsFailed( assert.strictEqual(reporter.onMigrationSkip.mock.calls.length, 0, 'Total pending and skipped'); assert.strictEqual(reporter.onFinished.mock.calls.length, 1, 'Finished called once'); const [entries, error] = reporter.onFinished.mock.calls[0]?.arguments ?? []; - assert.deepStrictEqual(error, finishedError, 'Finished error'); - const cause = getErrorCause(error); - const expectedCause = finishedError?.cause; - assert.deepStrictEqual( - cause, - expectedCause ? deserializeError(expectedCause) : expectedCause, - 'Finished error cause', - ); + assertErrorEqualEnough(error, finishedError, 'Finished error'); assert.strictEqual(entries?.length, 0, 'Finished entries length'); } - -function assertErrorEqualEnough(actual?: Error | SerializedError, expected?: Error) { - if (expected === undefined) { - assert.strictEqual(actual, undefined); - return; - } - - const { - cause: actualCause, - stack: actualStack, - ...actualError - } = actual instanceof Error ? toSerializedError(actual) : actual ?? {}; - const { cause: expectedCause, stack: expectedStack, ...expectedError } = toSerializedError(expected); - // @ts-expect-error Ignore - const { stack: actualCauseStack, ...actualCauseRest } = actualCause ?? {}; - // @ts-expect-error Ignore - const { stack: expectedCauseStack, ...expectedCauseRest } = expectedCause ?? {}; - assert.deepStrictEqual(actualError, expectedError); - assert.deepStrictEqual(actualCauseRest, expectedCauseRest); -} diff --git a/packages/cli/src/test-utils.ts b/packages/cli/src/test-utils.ts index 38e2afc..0ede3fe 100644 --- a/packages/cli/src/test-utils.ts +++ b/packages/cli/src/test-utils.ts @@ -1,5 +1,6 @@ import { mock, type Mock } from 'node:test'; import path from 'node:path'; +import assert from 'node:assert'; import { type SerializedError, type EmigrateReporter, @@ -9,6 +10,7 @@ import { type NonFailedMigrationHistoryEntry, type Storage, } from '@emigrate/types'; +import { toSerializedError } from './errors.js'; export type Mocked = { // @ts-expect-error - This is a mock @@ -110,3 +112,23 @@ export function toEntries( ): MigrationHistoryEntry[] { return names.map((name) => (typeof name === 'string' ? toEntry(name, status) : name)); } + +export function assertErrorEqualEnough(actual?: Error | SerializedError, expected?: Error, message?: string): void { + if (expected === undefined) { + assert.strictEqual(actual, undefined); + return; + } + + const { + cause: actualCause, + stack: actualStack, + ...actualError + } = actual instanceof Error ? toSerializedError(actual) : actual ?? {}; + const { cause: expectedCause, stack: expectedStack, ...expectedError } = toSerializedError(expected); + // @ts-expect-error Ignore + const { stack: actualCauseStack, ...actualCauseRest } = actualCause ?? {}; + // @ts-expect-error Ignore + const { stack: expectedCauseStack, ...expectedCauseRest } = expectedCause ?? {}; + assert.deepStrictEqual(actualError, expectedError, message); + assert.deepStrictEqual(actualCauseRest, expectedCauseRest, message ? `${message} (cause)` : undefined); +} diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 66fa554..4e75919 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -17,12 +17,16 @@ }, "files": [ "dist", - "!dist/*.tsbuildinfo" + "!dist/*.tsbuildinfo", + "!dist/**/*.test.js", + "!dist/tests/*" ], "scripts": { "build": "tsc --pretty", "build:watch": "tsc --pretty --watch", - "lint": "xo --cwd=../.. $(pwd)" + "lint": "xo --cwd=../.. $(pwd)", + "test-disabled": "glob -c \"node --import tsx --test-reporter spec --test\" \"./src/**/*.test.ts\"", + "test:watch": "glob -c \"node --watch --import tsx --test-reporter spec --test\" \"./src/**/*.test.ts\"" }, "keywords": [ "emigrate", diff --git a/packages/mysql/src/index.test.ts b/packages/mysql/src/index.test.ts new file mode 100644 index 0000000..240e3ff --- /dev/null +++ b/packages/mysql/src/index.test.ts @@ -0,0 +1,92 @@ +import assert from 'node:assert'; +import path from 'node:path'; +import { before, after, describe, it } from 'node:test'; +import type { MigrationMetadata } from '@emigrate/types'; +import { startDatabase, stopDatabase } from './tests/database.js'; +import { createMysqlStorage } from './index.js'; + +let db: { port: number; host: string }; + +describe('emigrate-mysql', async () => { + before( + async () => { + db = await startDatabase(); + }, + { timeout: 60_000 }, + ); + + after( + async () => { + await stopDatabase(); + }, + { timeout: 10_000 }, + ); + + describe('migration locks', async () => { + it('either locks none or all of the given migrations', async () => { + const { initializeStorage } = createMysqlStorage({ + table: 'migrations', + connection: { + host: db.host, + user: 'emigrate', + password: 'emigrate', + database: 'emigrate', + port: db.port, + }, + }); + + const [storage1, storage2] = await Promise.all([initializeStorage(), initializeStorage()]); + + const migrations = toMigrations('/emigrate', 'migrations', [ + '2023-10-01-01-test.js', + '2023-10-01-02-test.js', + '2023-10-01-03-test.js', + '2023-10-01-04-test.js', + '2023-10-01-05-test.js', + '2023-10-01-06-test.js', + '2023-10-01-07-test.js', + '2023-10-01-08-test.js', + '2023-10-01-09-test.js', + '2023-10-01-10-test.js', + '2023-10-01-11-test.js', + '2023-10-01-12-test.js', + '2023-10-01-13-test.js', + '2023-10-01-14-test.js', + '2023-10-01-15-test.js', + '2023-10-01-16-test.js', + '2023-10-01-17-test.js', + '2023-10-01-18-test.js', + '2023-10-01-19-test.js', + '2023-10-01-20-test.js', + ]); + + const [locked1, locked2] = await Promise.all([storage1.lock(migrations), storage2.lock(migrations)]); + + assert.strictEqual( + locked1.length === 0 || locked2.length === 0, + true, + 'One of the processes should have no locks', + ); + assert.strictEqual( + locked1.length === 20 || locked2.length === 20, + true, + 'One of the processes should have all locks', + ); + }); + }); +}); + +function toMigration(cwd: string, directory: string, name: string): MigrationMetadata { + return { + name, + filePath: `${cwd}/${directory}/${name}`, + relativeFilePath: `${directory}/${name}`, + extension: path.extname(name), + directory, + cwd, + }; +} + +function toMigrations(cwd: string, directory: string, names: string[]): MigrationMetadata[] { + return names.map((name) => toMigration(cwd, directory, name)); +} diff --git a/packages/mysql/src/index.ts b/packages/mysql/src/index.ts index 2d4b254..8dc1b87 100644 --- a/packages/mysql/src/index.ts +++ b/packages/mysql/src/index.ts @@ -1,5 +1,6 @@ import process from 'node:process'; import fs from 'node:fs/promises'; +import { setTimeout } from 'node:timers/promises'; import { createConnection, createPool, @@ -54,6 +55,7 @@ const getConnection = async (options: ConnectionOptions | string) => { // best to leave this at 0 (disabled) uri.searchParams.set('connectTimeout', '0'); uri.searchParams.set('multipleStatements', 'true'); + uri.searchParams.set('flags', '-FOUND_ROWS'); connection = await createConnection(uri.toString()); } else { @@ -64,6 +66,7 @@ const getConnection = async (options: ConnectionOptions | string) => { // best to leave this at 0 (disabled) connectTimeout: 0, multipleStatements: true, + flags: ['-FOUND_ROWS'], }); } @@ -84,6 +87,7 @@ const getPool = (connection: PoolOptions | string) => { // it throws an error you can't catch and crashes node // best to leave this at 0 (disabled) uri.searchParams.set('connectTimeout', '0'); + uri.searchParams.set('flags', '-FOUND_ROWS'); return createPool(uri.toString()); } @@ -94,6 +98,7 @@ const getPool = (connection: PoolOptions | string) => { // it throws an error you can't catch and crashes node // best to leave this at 0 (disabled) connectTimeout: 0, + flags: ['-FOUND_ROWS'], }); }; @@ -104,8 +109,8 @@ type HistoryEntry = { error?: SerializedError; }; -const lockMigration = async (pool: Pool, table: string, migration: MigrationMetadata) => { - const [result] = await pool.execute({ +const lockMigration = async (connection: Connection, table: string, migration: MigrationMetadata) => { + const [result] = await connection.execute({ sql: ` INSERT INTO ${escapeId(table)} (name, status, date) VALUES (?, ?, NOW()) @@ -228,8 +233,10 @@ const initializeDatabase = async (config: ConnectionOptions | string) => { } }; -const initializeTable = async (pool: Pool, table: string) => { - const [result] = await pool.execute({ +const lockWaitTimeout = 10; // seconds + +const isHistoryTableExisting = async (connection: Connection, table: string) => { + const [result] = await connection.execute({ sql: ` SELECT 1 as table_exists @@ -242,24 +249,70 @@ const initializeTable = async (pool: Pool, table: string) => { values: [table], }); - if (result[0]?.['table_exists']) { + return result[0]?.['table_exists'] === 1; +}; + +const initializeTable = async (config: ConnectionOptions | string, table: string) => { + const connection = await getConnection(config); + + if (await isHistoryTableExisting(connection, table)) { + await connection.end(); return; } - // This table definition is compatible with the one used by the immigration-mysql package - await pool.execute(` - CREATE TABLE ${escapeId(table)} ( - name varchar(255) not null primary key, - status varchar(32), - date datetime not null - ) Engine=InnoDB; - `); + const lockName = `emigrate_init_table_lock_${table}`; + + const [lockResult] = await connection.query(`SELECT GET_LOCK(?, ?) AS got_lock`, [ + lockName, + lockWaitTimeout, + ]); + const didGetLock = lockResult[0]?.['got_lock'] === 1; + + if (didGetLock) { + try { + // This table definition is compatible with the one used by the immigration-mysql package + await connection.execute(` + CREATE TABLE IF NOT EXISTS ${escapeId(table)} ( + name varchar(255) not null primary key, + status varchar(32), + date datetime not null + ) Engine=InnoDB; + `); + } finally { + await connection.query(`SELECT RELEASE_LOCK(?)`, [lockName]); + await connection.end(); + } + + return; + } + + // Didn't get the lock, wait to see if the table was created by another process + const maxWait = lockWaitTimeout * 1000; // milliseconds + const checkInterval = 250; // milliseconds + const start = Date.now(); + + try { + while (Date.now() - start < maxWait) { + // eslint-disable-next-line no-await-in-loop + if (await isHistoryTableExisting(connection, table)) { + return; + } + + // eslint-disable-next-line no-await-in-loop + await setTimeout(checkInterval); + } + + throw new Error(`Timeout waiting for table ${table} to be created by other process`); + } finally { + await connection.end(); + } }; export const createMysqlStorage = ({ table = defaultTable, connection }: MysqlStorageOptions): EmigrateStorage => { return { async initializeStorage() { await initializeDatabase(connection); + await initializeTable(connection, table); const pool = getPool(connection); @@ -271,24 +324,35 @@ export const createMysqlStorage = ({ table = defaultTable, connection }: MysqlSt }); } - try { - await initializeTable(pool, table); - } catch (error) { - await pool.end(); - throw error; - } - const storage: Storage = { async lock(migrations) { - const lockedMigrations: MigrationMetadata[] = []; + const connection = await pool.getConnection(); - for await (const migration of migrations) { - if (await lockMigration(pool, table, migration)) { - lockedMigrations.push(migration); + try { + await connection.beginTransaction(); + const lockedMigrations: MigrationMetadata[] = []; + + for await (const migration of migrations) { + if (await lockMigration(connection, table, migration)) { + lockedMigrations.push(migration); + } } - } - return lockedMigrations; + if (lockedMigrations.length === migrations.length) { + await connection.commit(); + + return lockedMigrations; + } + + await connection.rollback(); + + return []; + } catch (error) { + await connection.rollback(); + throw error; + } finally { + connection.release(); + } }, async unlock(migrations) { for await (const migration of migrations) { diff --git a/packages/mysql/src/tests/database.ts b/packages/mysql/src/tests/database.ts new file mode 100644 index 0000000..2270969 --- /dev/null +++ b/packages/mysql/src/tests/database.ts @@ -0,0 +1,45 @@ +/* eslint @typescript-eslint/naming-convention:0, import/no-extraneous-dependencies: 0 */ +import process from 'node:process'; +import { GenericContainer, type StartedTestContainer } from 'testcontainers'; + +let container: StartedTestContainer | undefined; + +export const startDatabase = async (): Promise<{ port: number; host: string }> => { + if (process.env['CI']) { + return { + port: process.env['MYSQL_PORT'] ? Number.parseInt(process.env['MYSQL_PORT'], 10) : 3306, + // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing + host: process.env['MYSQL_HOST'] || 'localhost', + }; + } + + if (!container) { + console.log('Starting MySQL container...'); + const containerSetup = new GenericContainer('mysql:8.2') + .withEnvironment({ + MYSQL_ROOT_PASSWORD: 'admin', + MYSQL_USER: 'emigrate', + MYSQL_PASSWORD: 'emigrate', + MYSQL_DATABASE: 'emigrate', + }) + .withTmpFs({ '/var/lib/mysql': 'rw' }) + .withCommand(['--sql-mode=NO_ENGINE_SUBSTITUTION', '--default-authentication-plugin=mysql_native_password']) + .withExposedPorts(3306) + .withReuse(); + + container = await containerSetup.start(); + + console.log('MySQL container started'); + } + + return { port: container.getMappedPort(3306), host: container.getHost() }; +}; + +export const stopDatabase = async (): Promise => { + if (container) { + console.log('Stopping MySQL container...'); + await container.stop(); + console.log('MySQL container stopped'); + container = undefined; + } +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1844e2..d818d13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,6 +35,9 @@ importers: prettier: specifier: 3.1.1 version: 3.1.1 + testcontainers: + specifier: 10.24.2 + version: 10.24.2 tsx: specifier: 4.15.7 version: 4.15.7 @@ -409,6 +412,9 @@ packages: resolution: {integrity: sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==} engines: {node: '>=6.9.0'} + '@balena/dockerignore@1.0.2': + resolution: {integrity: sha512-wMue2Sy4GAVTk6Ic4tJVcnfdau+gx2EnG7S+uAEe+TWJFqE4YoWN4/H8MSLj4eYJKxGg26lZwboEniNiNwZQ6Q==} + '@changesets/apply-release-plan@7.0.0': resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} @@ -855,6 +861,19 @@ packages: '@expressive-code/plugin-text-markers@0.29.4': resolution: {integrity: sha512-U8rouNRrLzAo11Ihoi4iqEH7FD+VEUb6Pe7xJxlFJ7HRhgaFIcuHyYyn6jA1WmGP5k9BFLhYBk53+oKvlmEkKw==} + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@grpc/grpc-js@1.13.3': + resolution: {integrity: sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==} + engines: {node: '>=12.10.0'} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + '@humanwhocodes/config-array@0.11.13': resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} @@ -911,6 +930,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@js-sdsl/ordered-map@4.4.2': + resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -968,6 +990,36 @@ packages: resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@protobufjs/aspromise@1.1.2': + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + + '@protobufjs/base64@1.1.2': + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + + '@protobufjs/codegen@2.0.4': + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + + '@protobufjs/eventemitter@1.1.0': + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + + '@protobufjs/fetch@1.1.0': + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + + '@protobufjs/float@1.0.2': + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + + '@protobufjs/inquire@1.1.0': + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + + '@protobufjs/path@1.1.2': + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + + '@protobufjs/pool@1.1.0': + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + + '@protobufjs/utf8@1.1.0': + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@rollup/rollup-android-arm-eabi@4.9.0': resolution: {integrity: sha512-+1ge/xmaJpm1KVBuIH38Z94zj9fBD+hp+/5WLaHgyY8XLq1ibxk/zj6dTXaqM2cAbYKq8jYlhHd6k05If1W5xA==} cpu: [arm] @@ -1057,6 +1109,12 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/docker-modem@3.0.6': + resolution: {integrity: sha512-yKpAGEuKRSS8wwx0joknWxsmLha78wNMe9R2S3UNsVOkZded8UqOrV8KoeDXoXsjndxwyF3eIhyClGbO1SEhEg==} + + '@types/dockerode@3.3.38': + resolution: {integrity: sha512-nnrcfUe2iR+RyOuz0B4bZgQwD9djQa9ADEjp7OAgBs10pYT0KSCtplJjcmBDJz0qaReX5T7GbE5i4VplvzUHvA==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -1105,6 +1163,9 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} + '@types/node@18.19.86': + resolution: {integrity: sha512-fifKayi175wLyKyc5qUfyENhQ1dCNI1UNjp653d8kuYcPQN5JhX3dGuP/XmvPTg/xRBn1VTLpbmi+H/Mr7tLfQ==} + '@types/node@20.10.4': resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} @@ -1126,6 +1187,15 @@ packages: '@types/semver@7.5.5': resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==} + '@types/ssh2-streams@0.1.12': + resolution: {integrity: sha512-Sy8tpEmCce4Tq0oSOYdfqaBpA3hDM8SoxoFh5vzFsu2oL+znzGz8oVWW7xb4K920yYMUY+PIG31qZnFMfPWNCg==} + + '@types/ssh2@0.5.52': + resolution: {integrity: sha512-lbLLlXxdCZOSJMCInKH2+9V/77ET2J6NPQHpFI0kda61Dd1KglJs+fPQBchizmzYSOJBgdTajhPqBO1xxLywvg==} + + '@types/ssh2@1.15.5': + resolution: {integrity: sha512-N1ASjp/nXH3ovBHddRJpli4ozpk6UdDYIX4RJWFa9L1YKnzdhTlVmiGHm4DZnj/jLbqZpes4aeR30EFGQtvhQQ==} + '@types/unist@2.0.10': resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} @@ -1289,6 +1359,7 @@ packages: acorn-import-assertions@1.9.0: resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + deprecated: package has been renamed to acorn-import-attributes peerDependencies: acorn: ^8 @@ -1367,6 +1438,14 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + arg@5.0.2: resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} @@ -1416,6 +1495,9 @@ packages: resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} engines: {node: '>=12'} + asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + astring@1.8.6: resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} hasBin: true @@ -1430,6 +1512,12 @@ packages: engines: {node: '>=18.14.1', npm: '>=6.14.0'} hasBin: true + async-lock@1.4.1: + resolution: {integrity: sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==} + + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} + atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} @@ -1454,6 +1542,36 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + bare-events@2.5.4: + resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} + + bare-fs@4.1.2: + resolution: {integrity: sha512-8wSeOia5B7LwD4+h465y73KOdj5QHsbbuoUfPBi+pXgFJIPuG7SsiOdJuijWMyfid49eD+WivpfY7KT8gbAzBA==} + engines: {bare: '>=1.16.0'} + peerDependencies: + bare-buffer: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + + bare-os@3.6.1: + resolution: {integrity: sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==} + engines: {bare: '>=1.14.0'} + + bare-path@3.0.0: + resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} + + bare-stream@2.6.5: + resolution: {integrity: sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==} + peerDependencies: + bare-buffer: '*' + bare-events: '*' + peerDependenciesMeta: + bare-buffer: + optional: true + bare-events: + optional: true + base-64@1.0.0: resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} @@ -1466,6 +1584,9 @@ packages: bcp-47@2.1.0: resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==} + bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -1518,6 +1639,10 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -1527,6 +1652,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buildcheck@0.0.6: + resolution: {integrity: sha512-8f9ZJCUXyT1M35Jx7MkBgmBMo3oHTTBIPLiY9xyL0pl3T5RwcPEY8cUHr5LBNfu/fk6c2T4DJZuVM/8ZZT2D2A==} + engines: {node: '>=10.0.0'} + builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} @@ -1544,6 +1673,10 @@ packages: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} + byline@5.0.0: + resolution: {integrity: sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==} + engines: {node: '>=0.10.0'} + call-bind@1.0.5: resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} @@ -1706,6 +1839,10 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -1732,6 +1869,9 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig-typescript-loader@5.0.0: resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} @@ -1758,6 +1898,19 @@ packages: typescript: optional: true + cpu-features@0.0.10: + resolution: {integrity: sha512-9IkYqtX3YHPCzoVg1Py+o9057a3i0fp7S530UWokCSaFVTc7CwXPRiOjRjBQQ18ZCNafx78YfnG+HALxtVmOGA==} + engines: {node: '>=10.0.0'} + + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} @@ -1819,6 +1972,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -1912,6 +2074,18 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + docker-compose@0.24.8: + resolution: {integrity: sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==} + engines: {node: '>= 6.0.0'} + + docker-modem@5.0.6: + resolution: {integrity: sha512-ens7BiayssQz/uAxGzH8zGXCtiV24rRWXdjNha5V4zSOcxmAZsfGVm/PPFbwQdqEkDnhG+SyR9E3zSHUbOKXBQ==} + engines: {node: '>= 8.0'} + + dockerode@4.0.6: + resolution: {integrity: sha512-FbVf3Z8fY/kALB9s+P9epCpWhfi/r0N2DgYYcYpsAUlaTxPjdsitsFobnltb+lyCgAIvf9C+4PSWlTnHlJMf1w==} + engines: {node: '>= 8.0'} + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -2407,6 +2581,10 @@ packages: get-intrinsic@1.2.2: resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} + get-port@7.1.0: + resolution: {integrity: sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==} + engines: {node: '>=16'} + get-set-props@0.1.0: resolution: {integrity: sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==} engines: {node: '>=0.10.0'} @@ -2933,6 +3111,9 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -3035,6 +3216,10 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3413,6 +3598,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -3435,12 +3624,20 @@ packages: mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + muggle-string@0.4.1: resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} @@ -3455,6 +3652,9 @@ packages: resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} engines: {node: '>=12.0.0'} + nan@2.22.2: + resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3870,6 +4070,9 @@ packages: probe-image-size@7.2.3: resolution: {integrity: sha512-HubhG4Rb2UH8YtV4ba0Vp5bQ7L78RTONYu/ujmCu5nBI8wGv24s4E9xSKBi0N1MowRpxk76pFCpJtW0KPzOK0w==} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-warning@2.3.2: resolution: {integrity: sha512-n9wh8tvBe5sFmsqlg+XQhaQLumwpqoAUruLwjCopgTmUBjJ/fjtBsJzKleCaIGBOMXYEhp1YfKl4d7rJ5ZKJGA==} @@ -3881,6 +4084,13 @@ packages: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + + properties-reader@2.3.0: + resolution: {integrity: sha512-z597WicA7nDZxK12kZqHr2TcvwNU1GCfA5UwfDY/HDp3hXPoPlb5rlEx9bwGTiJnc0OqbBTkU975jDToth8Gxw==} + engines: {node: '>=14'} + property-information@6.4.0: resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} @@ -3888,6 +4098,10 @@ packages: resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} engines: {node: '>=4'} + protobufjs@7.5.0: + resolution: {integrity: sha512-Z2E/kOY1QjoMlCytmexzYfDm/w5fKAiRwpSzGtdnXW1zC88Z2yXazHHrOtwCzn+7wSxyE8PYM4rvVcMphF9sOA==} + engines: {node: '>=12.0.0'} + pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} @@ -3937,6 +4151,9 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3945,6 +4162,9 @@ packages: resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -4062,6 +4282,10 @@ packages: retext@8.1.0: resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -4090,6 +4314,9 @@ packages: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -4273,6 +4500,9 @@ packages: spdx-license-ids@3.0.16: resolution: {integrity: sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==} + split-ca@1.0.1: + resolution: {integrity: sha512-Q5thBSxp5t8WPTTJQS59LrGqOZqOsrhDGDVm8azCqIBjSBd7nd9o2PM+mDulQQkh8h//4U6hFZnc/mul8t5pWQ==} + split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} @@ -4287,6 +4517,13 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} + ssh-remote-port-forward@1.0.4: + resolution: {integrity: sha512-x0LV1eVDwjf1gmG7TTnfqIzf+3VPRz7vrNIjX6oYLbeCrf/PeVY6hkT68Mg+q02qXxQhrLjB0jfgvhevoCRmLQ==} + + ssh2@1.16.0: + resolution: {integrity: sha512-r1X4KsBGedJqo7h8F5c4Ybpcr5RjyP+aWIG007uBPRjmdQWfEiVLzSK71Zji1B9sKxwaCvD8y8cwSkYrlLiRRg==} + engines: {node: '>=10.16.0'} + stdin-discarder@0.1.0: resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4300,6 +4537,9 @@ packages: streamx@2.15.6: resolution: {integrity: sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==} + streamx@2.22.0: + resolution: {integrity: sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -4338,6 +4578,9 @@ packages: string.prototype.trimstart@1.0.7: resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -4431,9 +4674,15 @@ packages: tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + tar-fs@3.0.4: resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + tar-fs@3.0.8: + resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -4466,6 +4715,12 @@ packages: engines: {node: '>=10'} hasBin: true + testcontainers@10.24.2: + resolution: {integrity: sha512-Don3EXEQuSw14+nFG9pj48fL9ck/jXDfR9Rb0K3acOyn/gg97+gsnfZaLzpdejl9GcPJVKxACNRe3SYVC2uWqg==} + + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-extensions@2.4.0: resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} engines: {node: '>=8'} @@ -4497,6 +4752,10 @@ packages: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} + tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + to-absolute-glob@3.0.0: resolution: {integrity: sha512-loO/XEWTRqpfcpI7+Jr2RR2Umaaozx1t6OSVWtMi0oy5F/Fxg3IC+D/TToDnxyAGs7uZBGT/6XmyDUxgsObJXA==} engines: {node: '>=0.10.0'} @@ -4591,6 +4850,9 @@ packages: resolution: {integrity: sha512-+6+hcWr4nwuESlKqUc626HMOTd3QT8hUOc9QM45PP1d4nErGkNOgExm4Pcov3in7LTuadMnB0gcd/BuzkEDIPw==} hasBin: true + tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -4663,6 +4925,10 @@ packages: undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} + engines: {node: '>=14.0'} + unherit@3.0.1: resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} @@ -4746,6 +5012,10 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -5028,6 +5298,10 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod@3.22.4: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} @@ -5336,6 +5610,8 @@ snapshots: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 + '@balena/dockerignore@1.0.2': {} + '@changesets/apply-release-plan@7.0.0': dependencies: '@babel/runtime': 7.23.2 @@ -5804,6 +6080,20 @@ snapshots: hastscript: 7.2.0 unist-util-visit-parents: 5.1.3 + '@fastify/busboy@2.1.1': {} + + '@grpc/grpc-js@1.13.3': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@js-sdsl/ordered-map': 4.4.2 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.2.3 + protobufjs: 7.5.0 + yargs: 17.7.2 + '@humanwhocodes/config-array@0.11.13': dependencies: '@humanwhocodes/object-schema': 2.0.1 @@ -5869,6 +6159,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + '@js-sdsl/ordered-map@4.4.2': {} + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.23.2 @@ -5954,6 +6246,29 @@ snapshots: picocolors: 1.0.0 tslib: 2.6.2 + '@protobufjs/aspromise@1.1.2': {} + + '@protobufjs/base64@1.1.2': {} + + '@protobufjs/codegen@2.0.4': {} + + '@protobufjs/eventemitter@1.1.0': {} + + '@protobufjs/fetch@1.1.0': + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + + '@protobufjs/float@1.0.2': {} + + '@protobufjs/inquire@1.1.0': {} + + '@protobufjs/path@1.1.2': {} + + '@protobufjs/pool@1.1.0': {} + + '@protobufjs/utf8@1.1.0': {} + '@rollup/rollup-android-arm-eabi@4.9.0': optional: true @@ -6030,6 +6345,17 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/docker-modem@3.0.6': + dependencies: + '@types/node': 20.10.4 + '@types/ssh2': 1.15.5 + + '@types/dockerode@3.3.38': + dependencies: + '@types/docker-modem': 3.0.6 + '@types/node': 20.10.4 + '@types/ssh2': 1.15.5 + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.10 @@ -6081,6 +6407,10 @@ snapshots: '@types/node@17.0.45': {} + '@types/node@18.19.86': + dependencies: + undici-types: 5.26.5 + '@types/node@20.10.4': dependencies: undici-types: 5.26.5 @@ -6103,6 +6433,19 @@ snapshots: '@types/semver@7.5.5': {} + '@types/ssh2-streams@0.1.12': + dependencies: + '@types/node': 20.10.4 + + '@types/ssh2@0.5.52': + dependencies: + '@types/node': 20.10.4 + '@types/ssh2-streams': 0.1.12 + + '@types/ssh2@1.15.5': + dependencies: + '@types/node': 18.19.86 + '@types/unist@2.0.10': {} '@types/unist@3.0.2': {} @@ -6416,6 +6759,26 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + archiver-utils@5.0.2: + dependencies: + glob: 10.3.10 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.4.2 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.4.2 + readdir-glob: 1.1.3 + tar-stream: 3.1.6 + zip-stream: 6.0.1 + arg@5.0.2: {} argparse@1.0.10: @@ -6478,6 +6841,10 @@ snapshots: arrify@3.0.0: {} + asn1@0.2.6: + dependencies: + safer-buffer: 2.1.2 + astring@1.8.6: {} astro-expressive-code@0.29.4(astro@4.0.5(@types/node@20.12.14)(terser@5.31.1)(typescript@5.5.2)): @@ -6561,6 +6928,10 @@ snapshots: - terser - typescript + async-lock@1.4.1: {} + + async@3.2.6: {} + atomic-sleep@1.0.0: {} autoprefixer@10.4.16(postcss@8.4.32): @@ -6581,6 +6952,31 @@ snapshots: balanced-match@1.0.2: {} + bare-events@2.5.4: + optional: true + + bare-fs@4.1.2: + dependencies: + bare-events: 2.5.4 + bare-path: 3.0.0 + bare-stream: 2.6.5(bare-events@2.5.4) + optional: true + + bare-os@3.6.1: + optional: true + + bare-path@3.0.0: + dependencies: + bare-os: 3.6.1 + optional: true + + bare-stream@2.6.5(bare-events@2.5.4): + dependencies: + streamx: 2.22.0 + optionalDependencies: + bare-events: 2.5.4 + optional: true + base-64@1.0.0: {} base64-js@1.5.1: {} @@ -6593,6 +6989,10 @@ snapshots: is-alphanumerical: 2.0.1 is-decimal: 2.0.1 + bcrypt-pbkdf@1.0.2: + dependencies: + tweetnacl: 0.14.5 + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -6661,6 +7061,8 @@ snapshots: node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) + buffer-crc32@1.0.0: {} + buffer-from@1.1.2: {} buffer@5.7.1: @@ -6673,6 +7075,9 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buildcheck@0.0.6: + optional: true + builtin-modules@3.3.0: {} builtins@5.0.1: @@ -6693,6 +7098,8 @@ snapshots: dependencies: run-applescript: 5.0.0 + byline@5.0.0: {} + call-bind@1.0.5: dependencies: function-bind: 1.1.2 @@ -6838,6 +7245,14 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.4.2 + concat-map@0.0.1: {} confusing-browser-globals@1.0.11: {} @@ -6861,6 +7276,8 @@ snapshots: cookie@0.6.0: {} + core-util-is@1.0.3: {} + cosmiconfig-typescript-loader@5.0.0(@types/node@20.10.4)(cosmiconfig@8.3.6(typescript@5.5.2))(typescript@5.5.2): dependencies: '@types/node': 20.10.4 @@ -6886,6 +7303,19 @@ snapshots: optionalDependencies: typescript: 5.5.2 + cpu-features@0.0.10: + dependencies: + buildcheck: 0.0.6 + nan: 2.22.2 + optional: true + + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.4.2 + cross-spawn@5.1.0: dependencies: lru-cache: 4.1.5 @@ -6937,6 +7367,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.4.0: + dependencies: + ms: 2.1.3 + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 @@ -7018,6 +7452,31 @@ snapshots: dlv@1.1.3: {} + docker-compose@0.24.8: + dependencies: + yaml: 2.3.4 + + docker-modem@5.0.6: + dependencies: + debug: 4.4.0 + readable-stream: 3.6.2 + split-ca: 1.0.1 + ssh2: 1.16.0 + transitivePeerDependencies: + - supports-color + + dockerode@4.0.6: + dependencies: + '@balena/dockerignore': 1.0.2 + '@grpc/grpc-js': 1.13.3 + '@grpc/proto-loader': 0.7.15 + docker-modem: 5.0.6 + protobufjs: 7.5.0 + tar-fs: 2.1.2 + uuid: 10.0.0 + transitivePeerDependencies: + - supports-color + doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -7243,12 +7702,12 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1): + eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1): dependencies: array.prototype.find: 2.2.2 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0) find-root: 1.1.0 hasown: 2.0.1 interpret: 1.4.0 @@ -7261,14 +7720,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1))(eslint@8.53.0): + eslint-module-utils@2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 6.10.0(eslint@8.53.0)(typescript@5.5.2) eslint: 8.53.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1) transitivePeerDependencies: - supports-color @@ -7296,7 +7755,7 @@ snapshots: eslint: 8.53.0 ignore: 5.2.4 - eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0): + eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0): dependencies: array-includes: 3.1.7 array.prototype.flat: 1.3.2 @@ -7305,7 +7764,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.53.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1))(eslint@8.53.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0) has: 1.0.4 is-core-module: 2.13.1 is-glob: 4.0.3 @@ -7687,6 +8146,8 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.0 + get-port@7.1.0: {} + get-set-props@0.1.0: {} get-stdin@9.0.0: {} @@ -8304,6 +8765,8 @@ snapshots: dependencies: is-inside-container: 1.0.0 + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -8379,6 +8842,10 @@ snapshots: kleur@4.1.5: {} + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -9045,6 +9512,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 @@ -9063,10 +9534,14 @@ snapshots: mkdirp-classic@0.5.3: {} + mkdirp@1.0.4: {} + ms@2.0.0: {} ms@2.1.2: {} + ms@2.1.3: {} + muggle-string@0.4.1: {} mysql2@3.6.5: @@ -9090,6 +9565,9 @@ snapshots: dependencies: lru-cache: 7.18.3 + nan@2.22.2: + optional: true + nanoid@3.3.7: {} napi-build-utils@1.0.2: {} @@ -9515,6 +9993,8 @@ snapshots: transitivePeerDependencies: - supports-color + process-nextick-args@2.0.1: {} + process-warning@2.3.2: {} process@0.11.10: {} @@ -9524,10 +10004,35 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + + properties-reader@2.3.0: + dependencies: + mkdirp: 1.0.4 + property-information@6.4.0: {} proto-props@2.0.0: {} + protobufjs@7.5.0: + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.10.4 + long: 5.2.3 + pseudomap@1.0.2: {} pump@3.0.0: @@ -9586,6 +10091,16 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -9600,6 +10115,10 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -9774,6 +10293,8 @@ snapshots: retext-stringify: 3.1.0 unified: 10.1.2 + retry@0.12.0: {} + reusify@1.0.4: {} rfdc@1.3.0: {} @@ -9814,6 +10335,8 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-regex-test@1.0.0: @@ -10006,6 +10529,8 @@ snapshots: spdx-license-ids@3.0.16: {} + split-ca@1.0.1: {} + split2@3.2.2: dependencies: readable-stream: 3.6.2 @@ -10016,6 +10541,19 @@ snapshots: sqlstring@2.3.3: {} + ssh-remote-port-forward@1.0.4: + dependencies: + '@types/ssh2': 0.5.52 + ssh2: 1.16.0 + + ssh2@1.16.0: + dependencies: + asn1: 0.2.6 + bcrypt-pbkdf: 1.0.2 + optionalDependencies: + cpu-features: 0.0.10 + nan: 2.22.2 + stdin-discarder@0.1.0: dependencies: bl: 5.1.0 @@ -10035,6 +10573,14 @@ snapshots: fast-fifo: 1.3.2 queue-tick: 1.0.1 + streamx@2.22.0: + dependencies: + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + optionalDependencies: + bare-events: 2.5.4 + optional: true + string-argv@0.3.2: {} string-width@4.2.3: @@ -10091,6 +10637,10 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.22.3 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -10204,12 +10754,29 @@ snapshots: pump: 3.0.0 tar-stream: 2.2.0 + tar-fs@2.1.2: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + tar-fs@3.0.4: dependencies: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 3.1.6 + tar-fs@3.0.8: + dependencies: + pump: 3.0.0 + tar-stream: 3.1.6 + optionalDependencies: + bare-fs: 4.1.2 + bare-path: 3.0.0 + transitivePeerDependencies: + - bare-buffer + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -10242,6 +10809,32 @@ snapshots: commander: 2.20.3 source-map-support: 0.5.21 + testcontainers@10.24.2: + dependencies: + '@balena/dockerignore': 1.0.2 + '@types/dockerode': 3.3.38 + archiver: 7.0.1 + async-lock: 1.4.1 + byline: 5.0.0 + debug: 4.4.0 + docker-compose: 0.24.8 + dockerode: 4.0.6 + get-port: 7.1.0 + proper-lockfile: 4.1.2 + properties-reader: 2.3.0 + ssh-remote-port-forward: 1.0.4 + tar-fs: 3.0.8 + tmp: 0.2.3 + undici: 5.29.0 + transitivePeerDependencies: + - bare-buffer + - supports-color + + text-decoder@1.2.3: + dependencies: + b4a: 1.6.4 + optional: true + text-extensions@2.4.0: {} text-table@0.2.0: {} @@ -10270,6 +10863,8 @@ snapshots: dependencies: os-tmpdir: 1.0.2 + tmp@0.2.3: {} + to-absolute-glob@3.0.0: dependencies: is-absolute: 1.0.0 @@ -10354,6 +10949,8 @@ snapshots: turbo-windows-64: 2.0.5 turbo-windows-arm64: 2.0.5 + tweetnacl@0.14.5: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -10420,6 +11017,10 @@ snapshots: undici-types@5.26.5: {} + undici@5.29.0: + dependencies: + '@fastify/busboy': 2.1.1 + unherit@3.0.1: {} unified@10.1.2: @@ -10536,6 +11137,8 @@ snapshots: util-deprecate@1.0.2: {} + uuid@10.0.0: {} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -10797,10 +11400,10 @@ snapshots: eslint-config-xo: 0.43.1(eslint@8.53.0) eslint-config-xo-typescript: 1.0.1(@typescript-eslint/eslint-plugin@6.10.0(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2))(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0)(typescript@5.5.2) eslint-formatter-pretty: 5.0.0 - eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5)(webpack@5.90.1) + eslint-import-resolver-webpack: 0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1) eslint-plugin-ava: 14.0.0(eslint@8.53.0) eslint-plugin-eslint-comments: 3.2.0(eslint@8.53.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8)(eslint@8.53.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint-import-resolver-webpack@0.13.8(eslint-plugin-import@2.27.5(@typescript-eslint/parser@6.10.0(eslint@8.53.0)(typescript@5.5.2))(eslint@8.53.0))(webpack@5.90.1))(eslint@8.53.0) eslint-plugin-n: 16.3.0(eslint@8.53.0) eslint-plugin-no-use-extend-native: 0.5.0 eslint-plugin-prettier: 5.0.1(@types/eslint@8.56.10)(eslint-config-prettier@8.10.0(eslint@8.53.0))(eslint@8.53.0)(prettier@3.1.1) @@ -10878,6 +11481,12 @@ snapshots: yocto-queue@1.0.0: {} + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.4.2 + zod@3.22.4: {} zwitch@2.0.4: {} From fa3fb20dc5133b15bb21513a0f037cf71983ebd2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 24 Apr 2025 14:04:30 +0000 Subject: [PATCH 135/136] chore(release): version packages --- .changeset/bright-poems-approve.md | 5 ----- .changeset/purple-garlics-perform.md | 10 ---------- .changeset/yellow-walls-tease.md | 5 ----- packages/cli/CHANGELOG.md | 9 +++++++++ packages/cli/package.json | 2 +- packages/mysql/CHANGELOG.md | 11 +++++++++++ packages/mysql/package.json | 2 +- packages/plugin-generate-js/CHANGELOG.md | 8 ++++++++ packages/plugin-generate-js/package.json | 2 +- packages/plugin-tools/CHANGELOG.md | 7 +++++++ packages/plugin-tools/package.json | 2 +- packages/postgres/CHANGELOG.md | 9 +++++++++ packages/postgres/package.json | 2 +- packages/reporter-pino/CHANGELOG.md | 7 +++++++ packages/reporter-pino/package.json | 2 +- packages/tsconfig/CHANGELOG.md | 6 ++++++ packages/tsconfig/package.json | 2 +- 17 files changed, 64 insertions(+), 27 deletions(-) delete mode 100644 .changeset/bright-poems-approve.md delete mode 100644 .changeset/purple-garlics-perform.md delete mode 100644 .changeset/yellow-walls-tease.md diff --git a/.changeset/bright-poems-approve.md b/.changeset/bright-poems-approve.md deleted file mode 100644 index 4045f29..0000000 --- a/.changeset/bright-poems-approve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/mysql': patch ---- - -Make sure we can initialize multiple running instances of Emigrate using @emigrate/mysql concurrently without issues with creating the history table (for instance in a Kubernetes environment and/or with a Percona cluster). diff --git a/.changeset/purple-garlics-perform.md b/.changeset/purple-garlics-perform.md deleted file mode 100644 index d89ce52..0000000 --- a/.changeset/purple-garlics-perform.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@emigrate/reporter-pino': patch -'@emigrate/plugin-tools': patch -'@emigrate/postgres': patch -'@emigrate/tsconfig': patch -'@emigrate/mysql': patch -'@emigrate/cli': patch ---- - -Upgrade TypeScript to v5.5 and enable [isolatedDeclarations](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/#isolated-declarations) diff --git a/.changeset/yellow-walls-tease.md b/.changeset/yellow-walls-tease.md deleted file mode 100644 index 2a0a22f..0000000 --- a/.changeset/yellow-walls-tease.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@emigrate/mysql': patch ---- - -Either lock all or none of the migrations to run to make sure they run in order when multiple instances of Emigrate runs concurrently (for instance in a Kubernetes environment) diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 2743465..a84474c 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,14 @@ # @emigrate/cli +## 0.18.4 + +### Patch Changes + +- d779286: Upgrade TypeScript to v5.5 and enable [isolatedDeclarations](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/#isolated-declarations) +- Updated dependencies [d779286] + - @emigrate/plugin-tools@0.9.8 + - @emigrate/types@0.12.2 + ## 0.18.3 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 61b513e..dbcc08e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/cli", - "version": "0.18.3", + "version": "0.18.4", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/mysql/CHANGELOG.md b/packages/mysql/CHANGELOG.md index a80e9ae..80a297f 100644 --- a/packages/mysql/CHANGELOG.md +++ b/packages/mysql/CHANGELOG.md @@ -1,5 +1,16 @@ # @emigrate/mysql +## 0.3.3 + +### Patch Changes + +- 26240f4: Make sure we can initialize multiple running instances of Emigrate using @emigrate/mysql concurrently without issues with creating the history table (for instance in a Kubernetes environment and/or with a Percona cluster). +- d779286: Upgrade TypeScript to v5.5 and enable [isolatedDeclarations](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/#isolated-declarations) +- 26240f4: Either lock all or none of the migrations to run to make sure they run in order when multiple instances of Emigrate runs concurrently (for instance in a Kubernetes environment) +- Updated dependencies [d779286] + - @emigrate/plugin-tools@0.9.8 + - @emigrate/types@0.12.2 + ## 0.3.2 ### Patch Changes diff --git a/packages/mysql/package.json b/packages/mysql/package.json index 4e75919..db38ba1 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/mysql", - "version": "0.3.2", + "version": "0.3.3", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/plugin-generate-js/CHANGELOG.md b/packages/plugin-generate-js/CHANGELOG.md index 1809ad4..ecf920b 100644 --- a/packages/plugin-generate-js/CHANGELOG.md +++ b/packages/plugin-generate-js/CHANGELOG.md @@ -1,5 +1,13 @@ # @emigrate/plugin-generate-js +## 0.3.8 + +### Patch Changes + +- Updated dependencies [d779286] + - @emigrate/plugin-tools@0.9.8 + - @emigrate/types@0.12.2 + ## 0.3.7 ### Patch Changes diff --git a/packages/plugin-generate-js/package.json b/packages/plugin-generate-js/package.json index da3d174..60fcd93 100644 --- a/packages/plugin-generate-js/package.json +++ b/packages/plugin-generate-js/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-generate-js", - "version": "0.3.7", + "version": "0.3.8", "publishConfig": { "access": "public" }, diff --git a/packages/plugin-tools/CHANGELOG.md b/packages/plugin-tools/CHANGELOG.md index 6028801..e43be5b 100644 --- a/packages/plugin-tools/CHANGELOG.md +++ b/packages/plugin-tools/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/plugin-tools +## 0.9.8 + +### Patch Changes + +- d779286: Upgrade TypeScript to v5.5 and enable [isolatedDeclarations](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/#isolated-declarations) + - @emigrate/types@0.12.2 + ## 0.9.7 ### Patch Changes diff --git a/packages/plugin-tools/package.json b/packages/plugin-tools/package.json index 46dc18d..5a23e3d 100644 --- a/packages/plugin-tools/package.json +++ b/packages/plugin-tools/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/plugin-tools", - "version": "0.9.7", + "version": "0.9.8", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/postgres/CHANGELOG.md b/packages/postgres/CHANGELOG.md index 726b5cb..c4244a0 100644 --- a/packages/postgres/CHANGELOG.md +++ b/packages/postgres/CHANGELOG.md @@ -1,5 +1,14 @@ # @emigrate/postgres +## 0.3.2 + +### Patch Changes + +- d779286: Upgrade TypeScript to v5.5 and enable [isolatedDeclarations](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/#isolated-declarations) +- Updated dependencies [d779286] + - @emigrate/plugin-tools@0.9.8 + - @emigrate/types@0.12.2 + ## 0.3.1 ### Patch Changes diff --git a/packages/postgres/package.json b/packages/postgres/package.json index 5b870b0..4b18fdf 100644 --- a/packages/postgres/package.json +++ b/packages/postgres/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/postgres", - "version": "0.3.1", + "version": "0.3.2", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/reporter-pino/CHANGELOG.md b/packages/reporter-pino/CHANGELOG.md index fff8c18..d6a1641 100644 --- a/packages/reporter-pino/CHANGELOG.md +++ b/packages/reporter-pino/CHANGELOG.md @@ -1,5 +1,12 @@ # @emigrate/reporter-pino +## 0.6.5 + +### Patch Changes + +- d779286: Upgrade TypeScript to v5.5 and enable [isolatedDeclarations](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/#isolated-declarations) + - @emigrate/types@0.12.2 + ## 0.6.4 ### Patch Changes diff --git a/packages/reporter-pino/package.json b/packages/reporter-pino/package.json index a2ed264..1028873 100644 --- a/packages/reporter-pino/package.json +++ b/packages/reporter-pino/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/reporter-pino", - "version": "0.6.4", + "version": "0.6.5", "publishConfig": { "access": "public", "provenance": true diff --git a/packages/tsconfig/CHANGELOG.md b/packages/tsconfig/CHANGELOG.md index b4e6ba7..b61fbe9 100644 --- a/packages/tsconfig/CHANGELOG.md +++ b/packages/tsconfig/CHANGELOG.md @@ -1,5 +1,11 @@ # @emigrate/tsconfig +## 1.0.3 + +### Patch Changes + +- d779286: Upgrade TypeScript to v5.5 and enable [isolatedDeclarations](https://devblogs.microsoft.com/typescript/announcing-typescript-5-5/#isolated-declarations) + ## 1.0.2 ### Patch Changes diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index 7ae8cf1..ecb4e6b 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -1,6 +1,6 @@ { "name": "@emigrate/tsconfig", - "version": "1.0.2", + "version": "1.0.3", "publishConfig": { "access": "public", "provenance": true From 52844d7a091c0f76449f73e50f1b23bc6eb7114c Mon Sep 17 00:00:00 2001 From: Joakim Carlstein Date: Fri, 25 Apr 2025 09:22:40 +0200 Subject: [PATCH 136/136] ci(mysql): add @emigrate/mysql integration tests to GitHub Actions --- .github/workflows/ci.yaml | 23 ------- .github/workflows/integration.yaml | 62 +++++++++++++++++++ package.json | 5 +- packages/mysql/package.json | 4 +- .../{index.test.ts => index.integration.ts} | 11 ++++ packages/mysql/src/tests/database.ts | 6 +- 6 files changed, 84 insertions(+), 27 deletions(-) create mode 100644 .github/workflows/integration.yaml rename packages/mysql/src/{index.test.ts => index.integration.ts} (91%) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index b81d6b1..0a83e79 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,18 +15,6 @@ jobs: TURBO_TEAM: ${{ secrets.TURBO_TEAM }} DO_NOT_TRACK: 1 - services: - mysql: - image: mysql:8.0 - env: - MYSQL_ROOT_PASSWORD: root - MYSQL_DATABASE: emigrate - MYSQL_USER: emigrate - MYSQL_PASSWORD: emigrate - ports: - - 3306:3306 - options: --health-cmd="mysqladmin ping -h localhost" --health-interval=10s --health-timeout=5s --health-retries=5 - steps: - name: Check out code uses: actions/checkout@v4 @@ -44,16 +32,5 @@ jobs: - name: Install dependencies run: pnpm install - - name: Wait for MySQL to be ready - run: | - for i in {1..30}; do - nc -z localhost 3306 && echo "MySQL is up!" && break - echo "Waiting for MySQL..." - sleep 2 - done - - name: Checks - env: - MYSQL_HOST: localhost - MYSQL_PORT: 3306 run: pnpm checks diff --git a/.github/workflows/integration.yaml b/.github/workflows/integration.yaml new file mode 100644 index 0000000..388e546 --- /dev/null +++ b/.github/workflows/integration.yaml @@ -0,0 +1,62 @@ +name: Integration Tests + +on: + push: + branches: ['main', 'changeset-release/main'] + pull_request: + +jobs: + mysql_integration: + name: Emigrate MySQL integration tests + timeout-minutes: 15 + runs-on: ubuntu-latest + env: + TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} + TURBO_TEAM: ${{ secrets.TURBO_TEAM }} + DO_NOT_TRACK: 1 + + services: + mysql: + image: mysql:8.0 + env: + MYSQL_ROOT_PASSWORD: root + MYSQL_DATABASE: emigrate + MYSQL_USER: emigrate + MYSQL_PASSWORD: emigrate + ports: + - 3306:3306 + options: --health-cmd="mysqladmin ping -h localhost" --health-interval=10s --health-timeout=5s --health-retries=5 + + steps: + - name: Check out code + uses: actions/checkout@v4 + with: + fetch-depth: 2 + + - uses: pnpm/action-setup@v4.0.0 + + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + node-version: 22.15.0 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Wait for MySQL to be ready + run: | + for i in {1..30}; do + nc -z localhost 3306 && echo "MySQL is up!" && break + echo "Waiting for MySQL..." + sleep 2 + done + + - name: Build package + run: pnpm build --filter @emigrate/mysql + + - name: Integration Tests + env: + MYSQL_HOST: '127.0.0.1' + MYSQL_PORT: 3306 + run: pnpm --filter @emigrate/mysql integration diff --git a/package.json b/package.json index a2207a0..7667a61 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,10 @@ }, "overrides": [ { - "files": "packages/**/*.test.ts", + "files": [ + "packages/**/*.test.ts", + "packages/**/*.integration.ts" + ], "rules": { "@typescript-eslint/no-floating-promises": 0, "max-params": 0 diff --git a/packages/mysql/package.json b/packages/mysql/package.json index db38ba1..7e9aca7 100644 --- a/packages/mysql/package.json +++ b/packages/mysql/package.json @@ -25,8 +25,8 @@ "build": "tsc --pretty", "build:watch": "tsc --pretty --watch", "lint": "xo --cwd=../.. $(pwd)", - "test-disabled": "glob -c \"node --import tsx --test-reporter spec --test\" \"./src/**/*.test.ts\"", - "test:watch": "glob -c \"node --watch --import tsx --test-reporter spec --test\" \"./src/**/*.test.ts\"" + "integration": "glob -c \"node --import tsx --test-reporter spec --test\" \"./src/**/*.integration.ts\"", + "integration:watch": "glob -c \"node --watch --import tsx --test-reporter spec --test\" \"./src/**/*.integration.ts\"" }, "keywords": [ "emigrate", diff --git a/packages/mysql/src/index.test.ts b/packages/mysql/src/index.integration.ts similarity index 91% rename from packages/mysql/src/index.test.ts rename to packages/mysql/src/index.integration.ts index 240e3ff..d8d6cd0 100644 --- a/packages/mysql/src/index.test.ts +++ b/packages/mysql/src/index.integration.ts @@ -7,6 +7,8 @@ import { createMysqlStorage } from './index.js'; let db: { port: number; host: string }; +const toEnd = new Set<{ end: () => Promise }>(); + describe('emigrate-mysql', async () => { before( async () => { @@ -17,6 +19,12 @@ describe('emigrate-mysql', async () => { after( async () => { + for (const storage of toEnd) { + // eslint-disable-next-line no-await-in-loop + await storage.end(); + } + + toEnd.clear(); await stopDatabase(); }, { timeout: 10_000 }, @@ -37,6 +45,9 @@ describe('emigrate-mysql', async () => { const [storage1, storage2] = await Promise.all([initializeStorage(), initializeStorage()]); + toEnd.add(storage1); + toEnd.add(storage2); + const migrations = toMigrations('/emigrate', 'migrations', [ '2023-10-01-01-test.js', '2023-10-01-02-test.js', diff --git a/packages/mysql/src/tests/database.ts b/packages/mysql/src/tests/database.ts index 2270969..38b534f 100644 --- a/packages/mysql/src/tests/database.ts +++ b/packages/mysql/src/tests/database.ts @@ -6,11 +6,15 @@ let container: StartedTestContainer | undefined; export const startDatabase = async (): Promise<{ port: number; host: string }> => { if (process.env['CI']) { - return { + const config = { port: process.env['MYSQL_PORT'] ? Number.parseInt(process.env['MYSQL_PORT'], 10) : 3306, // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing host: process.env['MYSQL_HOST'] || 'localhost', }; + + console.log(`Connecting to MySQL from environment variables: ${JSON.stringify(config)}`); + + return config; } if (!container) {