From 2c23a175af0e8cadca0a960c85bc4ce2d31ae4f5 Mon Sep 17 00:00:00 2001 From: Corentin THOMASSET Date: Sat, 31 Aug 2024 19:07:37 +0200 Subject: [PATCH] feat(cli): added enclosed cli (#66) --- README.md | 23 ++ packages/cli/README.md | 61 ++++ packages/cli/bin/enclosed.mjs | 4 + packages/cli/build.config.ts | 11 + packages/cli/eslint.config.js | 21 ++ packages/cli/package.json | 55 ++++ packages/cli/src/cli.ts | 16 ++ packages/cli/src/config/config.command.ts | 93 ++++++ packages/cli/src/config/config.constants.ts | 8 + packages/cli/src/config/config.models.ts | 74 +++++ packages/cli/src/config/config.usecases.ts | 6 + .../src/create-note/create-note.command.ts | 79 +++++ packages/cli/src/shared/cli.models.ts | 21 ++ packages/cli/src/shared/http.models.ts | 9 + packages/cli/tsconfig.json | 19 ++ packages/lib/README.md | 39 +++ packages/lib/build.config.ts | 2 +- packages/lib/package.json | 5 +- packages/lib/src/notes/notes.services.ts | 36 +-- packages/lib/src/notes/notes.usecases.ts | 5 +- pnpm-lock.yaml | 270 ++++++++++++++++++ 21 files changed, 830 insertions(+), 27 deletions(-) create mode 100644 packages/cli/README.md create mode 100755 packages/cli/bin/enclosed.mjs create mode 100644 packages/cli/build.config.ts create mode 100644 packages/cli/eslint.config.js create mode 100644 packages/cli/package.json create mode 100644 packages/cli/src/cli.ts create mode 100644 packages/cli/src/config/config.command.ts create mode 100644 packages/cli/src/config/config.constants.ts create mode 100644 packages/cli/src/config/config.models.ts create mode 100644 packages/cli/src/config/config.usecases.ts create mode 100644 packages/cli/src/create-note/create-note.command.ts create mode 100644 packages/cli/src/shared/cli.models.ts create mode 100644 packages/cli/src/shared/http.models.ts create mode 100644 packages/cli/tsconfig.json create mode 100644 packages/lib/README.md diff --git a/README.md b/README.md index bfaa2f29..e4bc6551 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ A live instance is available at [enclosed.cc](https://enclosed.cc). - **Responsive Design**: Works on all devices, from desktops to mobile phones. - **Open Source**: The source code is available under the Apache 2.0 License. - **Self-Hostable**: Run your instance of Enclosed for private note sharing. +- **CLI**: A command-line interface for creating notes from the terminal. ## Self host @@ -107,6 +108,26 @@ You can configure the application using environment variables. Here are the avai This ensures that the note remains securely encrypted during transmission and storage, with decryption only possible by those with the correct link and (if applicable) password. +## CLI + +The Enclosed CLI allows you to create notes from the terminal. You can install it globally using npm, yarn, or pnpm. + +```bash +# with npm +npm install -g @enclosed/cli + +# with yarn +yarn global add @enclosed/cli + +# with pnpm +pnpm add -g @enclosed/cli +``` + + +```bash + + + ## Project Structure This project is organized as a monorepo using `pnpm` workspaces. The structure is as follows: @@ -114,6 +135,8 @@ This project is organized as a monorepo using `pnpm` workspaces. The structure i - **[packages/app-client](./packages/app-client/)**: Frontend application built with SolidJS. - **[packages/app-server](./packages/app-server/)**: Backend application using HonoJS. - **[packages/deploy-cloudflare](./packages/deploy-cloudflare/)**: Cloudflare Pages build scripts and configuration. +- **[packages/lib](./packages/lib/)**: Core functionalities of Enclosed. +- **[packages/cli](./packages/cli/)**: Command-line interface for Enclosed. ## Contributing diff --git a/packages/cli/README.md b/packages/cli/README.md new file mode 100644 index 00000000..01b3b20c --- /dev/null +++ b/packages/cli/README.md @@ -0,0 +1,61 @@ +# Enclosed CLI + +This package contains the CLI for [Enclosed](https://enclosed.cc), an open-source project that aims to provide a simple and secure way to share e2e encrypted notes. + +## Getting Started + +To install the CLI, run the following command: + +### Create a note + +```bash +# Basic usage +enclosed create "Hello, World!" + +# Using stdin +cat file.txt | enclosed create + +# With full options +enclosed create --deleteAfterReading --password "password" --ttl 3600 "Hello, World!" +``` + +### Configure the enclosed instance to use + +```bash +# By default, the CLI uses the public instance at enclosed.cc +enclosed config set instance-url https://enclosed.cc +``` + +## Usage + +```bash +enclosed [options] +``` + +### Create a note + +```bash +# Basic usage +enclosed create "Hello, World!" + +# Using stdin +cat file.txt | enclosed create + +# With full options +enclosed create --deleteAfterReading --password "password" --ttl 3600 "Hello, World!" +``` + +### Configure the enclosed instance to use + +```bash +# By default, the CLI uses the public instance at enclosed.cc +enclosed config set instance-url https://enclosed.cc +``` + +## License + +This project is licensed under the Apache 2.0 License. See the [LICENSE](./LICENSE) file for more information. + +## Credits and Acknowledgements + +This project is crafted with ❤️ by [Corentin Thomasset](https://corentin.tech). diff --git a/packages/cli/bin/enclosed.mjs b/packages/cli/bin/enclosed.mjs new file mode 100755 index 00000000..f40a5494 --- /dev/null +++ b/packages/cli/bin/enclosed.mjs @@ -0,0 +1,4 @@ +#!/usr/bin/env node +'use strict' + +import '../dist/cli.mjs' \ No newline at end of file diff --git a/packages/cli/build.config.ts b/packages/cli/build.config.ts new file mode 100644 index 00000000..bd172e4f --- /dev/null +++ b/packages/cli/build.config.ts @@ -0,0 +1,11 @@ +import { defineBuildConfig } from 'unbuild'; + +export default defineBuildConfig({ + entries: [ + 'src/cli', + ], + clean: true, + rollup: { + emitCJS: true, + }, +}); diff --git a/packages/cli/eslint.config.js b/packages/cli/eslint.config.js new file mode 100644 index 00000000..e0175daf --- /dev/null +++ b/packages/cli/eslint.config.js @@ -0,0 +1,21 @@ +import antfu from '@antfu/eslint-config'; + +export default antfu({ + stylistic: { + semi: true, + }, + + rules: { + // To allow export on top of files + 'ts/no-use-before-define': ['error', { allowNamedExports: true, functions: false }], + 'curly': ['error', 'all'], + 'vitest/consistent-test-it': ['error', { fn: 'test' }], + 'ts/consistent-type-definitions': ['error', 'type'], + 'style/brace-style': ['error', '1tbs', { allowSingleLine: false }], + 'unused-imports/no-unused-vars': ['error', { + argsIgnorePattern: '^_', + varsIgnorePattern: '^_', + caughtErrorsIgnorePattern: '^_', + }], + }, +}); diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 00000000..b5ba4a34 --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,55 @@ +{ + "name": "@enclosed/cli", + "type": "module", + "version": "0.0.2", + "packageManager": "pnpm@9.9.0", + "description": "Enclosed cli to create secure notes.", + "author": "Corentin Thomasset (https://corentin.tech)", + "license": "Apache-2.0", + "repository": { + "type": "git", + "url": "https://github.com/CorentinTh/enclosed" + }, + "main": "./dist/cli.cjs", + "module": "./dist/cli.mjs", + "bin": { + "enclosed": "./bin/enclosed.mjs" + }, + "files": [ + "dist" + ], + "engines": { + "node": ">=22.0.0" + }, + "scripts": { + "dev": "tsx ./src/cli.ts", + "build": "unbuild", + "lint": "eslint .", + "lint:fix": "eslint --fix .", + "test": "pnpm run test:unit", + "test:unit": "vitest run", + "test:unit:watch": "vitest watch", + "prepublishOnly": "pnpm run build", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@enclosed/lib": "workspace:*", + "citty": "^0.1.6", + "conf": "^13.0.1", + "lodash-es": "^4.17.21", + "ora": "^8.1.0", + "picocolors": "^1.0.1", + "tsx": "^4.17.0", + "zod": "^3.23.8" + }, + "devDependencies": { + "@antfu/eslint-config": "^2.27.0", + "@types/lodash-es": "^4.17.12", + "@vitest/coverage-v8": "^2.0.5", + "dotenv": "^16.4.5", + "eslint": "^9.9.0", + "typescript": "^5.5.4", + "unbuild": "^2.0.0", + "vitest": "^2.0.5" + } +} diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts new file mode 100644 index 00000000..6e861a97 --- /dev/null +++ b/packages/cli/src/cli.ts @@ -0,0 +1,16 @@ +import { defineCommand, runMain } from 'citty'; +import { createNoteCommand } from './create-note/create-note.command'; +import { configCommand } from './config/config.command'; + +const main = defineCommand({ + meta: { + name: 'enclosed', + description: 'Create and view private and secure notes', + }, + subCommands: { + create: createNoteCommand, + config: configCommand, + }, +}); + +runMain(main); diff --git a/packages/cli/src/config/config.command.ts b/packages/cli/src/config/config.command.ts new file mode 100644 index 00000000..bb42c677 --- /dev/null +++ b/packages/cli/src/config/config.command.ts @@ -0,0 +1,93 @@ +import { defineCommand } from 'citty'; +import picocolors from 'picocolors'; +import { keys, map } from 'lodash-es'; +import { configDefinition } from './config.constants'; +import { deleteConfig, getConfig, resetConfig, setConfig } from './config.models'; + +const keysList = keys(configDefinition).join(', '); + +export const configCommand = defineCommand({ + meta: { + name: 'config', + description: 'Manage cli configuration', + }, + subCommands: { + set: defineCommand({ + meta: { + name: 'set', + description: `Set a configuration value`, + }, + args: { + key: { + description: `Configuration key (${keysList})`, + type: 'positional', + }, + value: { + description: 'Configuration value', + type: 'positional', + }, + }, + run: async ({ args }) => { + const { key, value } = args; + + setConfig({ + key: String(key), + value: String(value), + }); + }, + }), + + get: defineCommand({ + meta: { + name: 'get', + description: `Get a configuration value`, + }, + args: { + key: { + description: `Configuration key (${keysList})`, + type: 'positional', + + }, + }, + run: async ({ args }) => { + const { key } = args; + + const value = getConfig({ key: String(key) }); + + if (value) { + // eslint-disable-next-line no-console + console.log(value ?? ''); + } + }, + }), + + delete: defineCommand({ + meta: { + name: 'delete', + description: `Delete a configuration value`, + }, + args: { + key: { + description: `Configuration key (${keysList})`, + type: 'positional', + }, + }, + run: async ({ args }) => { + const { key } = args; + + deleteConfig({ key: String(key) }); + }, + }), + + reset: defineCommand({ + meta: { + name: 'reset', + description: `Reset the whole configuration`, + }, + run: async () => { + resetConfig(); + }, + }), + + }, +}); diff --git a/packages/cli/src/config/config.constants.ts b/packages/cli/src/config/config.constants.ts new file mode 100644 index 00000000..76225be9 --- /dev/null +++ b/packages/cli/src/config/config.constants.ts @@ -0,0 +1,8 @@ +import { z } from 'zod'; + +export const configDefinition = { + 'instance-url': { + description: 'Instance URL', + schema: z.string().url(), + }, +} as const; diff --git a/packages/cli/src/config/config.models.ts b/packages/cli/src/config/config.models.ts new file mode 100644 index 00000000..7e2d9465 --- /dev/null +++ b/packages/cli/src/config/config.models.ts @@ -0,0 +1,74 @@ +import Conf from 'conf'; +import picocolors from 'picocolors'; +import { configDefinition } from './config.constants'; + +export { createConfigBindings, setConfig, getConfig, deleteConfig, resetConfig }; + +type ConfigKey = keyof typeof configDefinition | (string & {}); +const config = new Conf>({ projectName: 'enclosed' }); + +function setConfig({ key, value }: { key: ConfigKey ; value: string }) { + const definition = configDefinition[key as keyof typeof configDefinition]; + + if (!definition) { + console.error(picocolors.red(`Invalid configuration key: ${key}`)); + return; + } + + const { schema } = definition; + + const parsedValue = schema.safeParse(value); + + if (!parsedValue.success) { + const errorMessage = parsedValue.error.errors.map(({ message }) => message).join('\n'); + console.error(picocolors.red(`Invalid value for ${key}: ${errorMessage}`)); + return; + } + + config.set(key, value); +} + +function getConfig({ key }: { key: ConfigKey }) { + const definition = configDefinition[key as keyof typeof configDefinition]; + + if (!definition) { + throw new Error(`Invalid configuration key: ${key}`); + } + + const value = config.get(key); + + if (!value) { + return; + } + + const { schema } = definition; + + const parsedValue = schema.safeParse(value); + + if (!parsedValue.success) { + const errorMessage = parsedValue.error.errors.map(({ message }) => message).join('\n'); + console.error(picocolors.red(`Invalid value for ${key}: ${errorMessage}`)); + return; + } + + return parsedValue.data; +} + +function deleteConfig({ key }: { key: ConfigKey }) { + config.delete(key); +} + +function resetConfig() { + config.clear(); +} + +function createConfigBindings({ key }: { key: ConfigKey }) { + return { + get: () => { + return getConfig({ key }); + }, + set: (value: string) => { + setConfig({ key, value }); + }, + }; +} diff --git a/packages/cli/src/config/config.usecases.ts b/packages/cli/src/config/config.usecases.ts new file mode 100644 index 00000000..28b491f7 --- /dev/null +++ b/packages/cli/src/config/config.usecases.ts @@ -0,0 +1,6 @@ +import { createConfigBindings } from './config.models'; + +export const { + get: getInstanceUrl, + set: setInstanceUrl, +} = createConfigBindings({ key: 'instance-url' }); diff --git a/packages/cli/src/create-note/create-note.command.ts b/packages/cli/src/create-note/create-note.command.ts new file mode 100644 index 00000000..36ae9529 --- /dev/null +++ b/packages/cli/src/create-note/create-note.command.ts @@ -0,0 +1,79 @@ +import { defineCommand, showUsage } from 'citty'; +import { createNote } from '@enclosed/lib'; +import ora from 'ora'; +import pc from 'picocolors'; +import { looksLikeRateLimitError } from '../shared/http.models'; +import { readFromStdin } from '../shared/cli.models'; +import { getInstanceUrl } from '../config/config.usecases'; + +const ONE_HOUR_IN_SECONDS = 60 * 60; + +export const createNoteCommand = defineCommand({ + meta: { + name: 'create', + description: 'Create a new note', + }, + args: { + content: { + description: 'Note content (leave empty to read from stdin)', + type: 'positional', + required: false, + }, + password: { + description: 'Password to protect the note (default is no password)', + valueHint: 'password', + default: '', + alias: 'p', + type: 'string', + }, + ttl: { + description: `Note time-to-live in seconds (default: ${ONE_HOUR_IN_SECONDS}s = 1 hour)`, + default: String(ONE_HOUR_IN_SECONDS), + valueHint: 'seconds', + alias: 't', + type: 'string', + }, + deleteAfterReading: { + description: 'Delete note after reading (default: false)', + alias: 'd', + type: 'boolean', + default: false, + }, + }, + run: async ({ args }) => { + const { password, content: rawContent, deleteAfterReading, ttl: ttlInSeconds } = args; + + const content = rawContent ?? await readFromStdin(); + + if (!content) { + await showUsage(createNoteCommand); + return; + } + + const spinner = ora('Creating note').start(); + + try { + const { noteUrl } = await createNote({ + content: String(content), + password, + deleteAfterReading, + ttlInSeconds: Number(ttlInSeconds), + clientBaseUrl: getInstanceUrl(), + }); + + spinner.succeed('Note created successfully'); + + // eslint-disable-next-line no-console + console.log(`\nNote url: ${pc.green(noteUrl)}`); + } catch (error) { + spinner.fail('Failed to create note'); + + if (looksLikeRateLimitError({ error })) { + console.error(pc.red('Rate limit exceeded. Try again later.')); + return; + } + + console.error(error); + } + }, +}); diff --git a/packages/cli/src/shared/cli.models.ts b/packages/cli/src/shared/cli.models.ts new file mode 100644 index 00000000..12d13e3c --- /dev/null +++ b/packages/cli/src/shared/cli.models.ts @@ -0,0 +1,21 @@ +import process from 'node:process'; + +export { readFromStdin }; + +function readFromStdin(): Promise { + return new Promise((resolve) => { + let data = ''; + + process.stdin.resume(); + + process.stdin.setEncoding('utf8'); + + process.stdin.on('data', (chunk) => { + data += chunk; + }); + + process.stdin.on('end', () => { + resolve(data); + }); + }); +} diff --git a/packages/cli/src/shared/http.models.ts b/packages/cli/src/shared/http.models.ts new file mode 100644 index 00000000..3c66b037 --- /dev/null +++ b/packages/cli/src/shared/http.models.ts @@ -0,0 +1,9 @@ +import { get } from 'lodash-es'; + +export { looksLikeRateLimitError }; + +function looksLikeRateLimitError({ error }: { error: unknown }): boolean { + const status = get(error, 'response.status'); + + return status === 429; +} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 00000000..4950fdab --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["ESNext"], + "moduleDetection": "force", + "rootDir": ".", + "module": "ESNext", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "strict": true, + "strictNullChecks": true, + "noEmit": true, + "esModuleInterop": true, + "isolatedModules": true, + "verbatimModuleSyntax": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true + } +} diff --git a/packages/lib/README.md b/packages/lib/README.md new file mode 100644 index 00000000..bc4e8ef5 --- /dev/null +++ b/packages/lib/README.md @@ -0,0 +1,39 @@ +### Enclosed lib + +This package contains the core functionalities of [Enclosed](https://enclosed.cc/), an open-source project that aims to provide a simple and secure way to share e2e encrypted notes. + +## Installation + +```bash +# with npm +npm install @enclosed/lib + +# with yarn +yarn add @enclosed/lib + +# with pnpm +pnpm add @enclosed/lib +``` + +## Usage + +```javascript +import { createNote } from '@enclosed/lib'; + +const { noteUrl } = await createNote({ + content: 'Hello, World!', + password: 'password', + ttlInSeconds: 3600, + deleteAfterReading: true, +}); + +console.log(noteUrl); +``` + +## License + +This project is licensed under the Apache 2.0 License. See the [LICENSE](./LICENSE) file for more information. + +## Credits and Acknowledgements + +This project is crafted with ❤️ by [Corentin Thomasset](https://corentin.tech). diff --git a/packages/lib/build.config.ts b/packages/lib/build.config.ts index 5eb30780..e302e960 100644 --- a/packages/lib/build.config.ts +++ b/packages/lib/build.config.ts @@ -5,7 +5,7 @@ export default defineBuildConfig({ 'src/index.node', 'src/index.web', ], - + clean: true, declaration: true, sourcemap: true, rollup: { diff --git a/packages/lib/package.json b/packages/lib/package.json index dd0ccb95..41c5e924 100644 --- a/packages/lib/package.json +++ b/packages/lib/package.json @@ -1,7 +1,7 @@ { "name": "@enclosed/lib", "type": "module", - "version": "0.0.0", + "version": "0.0.2", "packageManager": "pnpm@9.9.0", "description": "Enclosed lib to create secure notes.", "author": "Corentin Thomasset (https://corentin.tech)", @@ -71,7 +71,8 @@ "test": "pnpm run test:unit", "test:unit": "vitest run", "test:unit:watch": "vitest watch", - "typecheck": "tsc --noEmit" + "typecheck": "tsc --noEmit", + "prepublishOnly": "pnpm run build" }, "dependencies": { "ofetch": "^1.3.4" diff --git a/packages/lib/src/notes/notes.services.ts b/packages/lib/src/notes/notes.services.ts index 7b79c64d..79e637b0 100644 --- a/packages/lib/src/notes/notes.services.ts +++ b/packages/lib/src/notes/notes.services.ts @@ -15,27 +15,21 @@ async function storeNote({ deleteAfterReading: boolean; noteCreationApiUrl: string; }): Promise<{ noteId: string }> { - try { - const { noteId } = await ofetch<{ noteId: string }>( - noteCreationApiUrl, - { - method: 'POST', - body: { - content, - isPasswordProtected, - ttlInSeconds, - deleteAfterReading, - }, + const { noteId } = await ofetch<{ noteId: string }>( + noteCreationApiUrl, + { + method: 'POST', + body: { + content, + isPasswordProtected, + ttlInSeconds, + deleteAfterReading, }, - ); - - return { noteId }; - } catch (baseError) { - const error = new Error('Failed to store note'); - Object.assign(error, { - cause: baseError, - }); + onResponseError: async ({ response }) => { + throw Object.assign(new Error('Failed to create note'), { response }); + }, + }, + ); - throw error; - } + return { noteId }; } diff --git a/packages/lib/src/notes/notes.usecases.ts b/packages/lib/src/notes/notes.usecases.ts index a2d5c0c3..2c91e3bb 100644 --- a/packages/lib/src/notes/notes.usecases.ts +++ b/packages/lib/src/notes/notes.usecases.ts @@ -4,7 +4,6 @@ export { createEnclosedLib }; const ONE_HOUR_IN_SECONDS = 60 * 60; const BASE_URL = 'https://enclosed.cc'; -const DEFAULT_NOTE_CREATION_API_URL = 'https://enclosed.cc/api/notes'; function createEnclosedLib({ encryptNote, @@ -19,8 +18,8 @@ function createEnclosedLib({ password, ttlInSeconds = ONE_HOUR_IN_SECONDS, deleteAfterReading = false, - noteCreationApiUrl = DEFAULT_NOTE_CREATION_API_URL, clientBaseUrl = BASE_URL, + noteCreationApiUrl = new URL('/api/notes', clientBaseUrl).toString(), createNoteUrl = createNoteUrlImpl, storeNote = params => storeNoteImpl({ ...params, noteCreationApiUrl }), }: { @@ -47,4 +46,4 @@ function createEnclosedLib({ }; }, }; -} +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9cc0c35..f7d4dc3d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -148,6 +148,58 @@ importers: specifier: ^8.1.4 version: 8.1.5 + packages/cli: + dependencies: + '@enclosed/lib': + specifier: workspace:* + version: link:../lib + citty: + specifier: ^0.1.6 + version: 0.1.6 + conf: + specifier: ^13.0.1 + version: 13.0.1 + lodash-es: + specifier: ^4.17.21 + version: 4.17.21 + ora: + specifier: ^8.1.0 + version: 8.1.0 + picocolors: + specifier: ^1.0.1 + version: 1.0.1 + tsx: + specifier: ^4.17.0 + version: 4.19.0 + zod: + specifier: ^3.23.8 + version: 3.23.8 + devDependencies: + '@antfu/eslint-config': + specifier: ^2.27.0 + version: 2.27.3(@typescript-eslint/utils@8.3.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(@vue/compiler-sfc@3.4.38)(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)(vitest@2.0.5(@types/node@22.5.1)(jsdom@25.0.0)(terser@5.31.6)) + '@types/lodash-es': + specifier: ^4.17.12 + version: 4.17.12 + '@vitest/coverage-v8': + specifier: ^2.0.5 + version: 2.0.5(vitest@2.0.5(@types/node@22.5.1)(jsdom@25.0.0)(terser@5.31.6)) + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + eslint: + specifier: ^9.9.0 + version: 9.9.1(jiti@1.21.6) + typescript: + specifier: ^5.5.4 + version: 5.5.4 + unbuild: + specifier: ^2.0.0 + version: 2.0.0(typescript@5.5.4) + vitest: + specifier: ^2.0.5 + version: 2.0.5(@types/node@22.5.1)(jsdom@25.0.0)(terser@5.31.6) + packages/deploy-cloudflare: {} packages/lib: @@ -1750,9 +1802,20 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1798,6 +1861,9 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + atomically@2.0.3: + resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==} + autoprefixer@10.4.20: resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} @@ -1926,6 +1992,14 @@ packages: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + clipboardy@4.0.0: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} @@ -1982,6 +2056,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + conf@13.0.1: + resolution: {integrity: sha512-l9Uwc9eOnz39oADzGO2cSBDi7siv8lwO+31ocQ2nOJijnDiW3pxqm9VV10DPYUO28wW83DjABoUqY1nfHRR2hQ==} + engines: {node: '>=18'} + confbox@0.1.7: resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} @@ -2079,6 +2157,10 @@ packages: date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + debounce-fn@6.0.0: + resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} + engines: {node: '>=18'} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -2146,6 +2228,10 @@ packages: domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dot-prop@9.0.0: + resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==} + engines: {node: '>=18'} + dotenv@16.4.5: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} @@ -2159,6 +2245,9 @@ packages: electron-to-chromium@1.5.13: resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2173,6 +2262,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -2437,6 +2530,9 @@ packages: resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} engines: {node: '>=6'} + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} @@ -2508,6 +2604,10 @@ packages: 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-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -2710,6 +2810,10 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} @@ -2731,6 +2835,14 @@ packages: resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + 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-what@4.1.16: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} @@ -2820,6 +2932,12 @@ packages: 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-schema-typed@8.0.1: + resolution: {integrity: sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2884,6 +3002,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + loupe@3.1.1: resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} @@ -2953,6 +3075,10 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -3083,10 +3209,18 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@8.1.0: + resolution: {integrity: sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==} + engines: {node: '>=18'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3455,6 +3589,10 @@ packages: 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'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -3473,6 +3611,10 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3657,6 +3799,10 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} engines: {node: '>=4', npm: '>=6'} @@ -3669,6 +3815,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3692,6 +3842,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + stubborn-fs@1.2.5: + resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==} + stylehacks@7.0.3: resolution: {integrity: sha512-4DqtecvI/Nd+2BCvW9YEF6lhBN5UM50IJ1R3rnEAhBwbCKf4VehRf+uqvnVArnBayjYD/WtT3g0G/HSRxWfTRg==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0} @@ -3828,6 +3981,10 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@4.26.0: + resolution: {integrity: sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==} + engines: {node: '>=16'} + typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} @@ -3836,6 +3993,10 @@ packages: ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + uint8array-extras@1.4.0: + resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==} + engines: {node: '>=18'} + ulid-workers@2.1.0: resolution: {integrity: sha512-D4+5fwPt5FEoGdMQtx5YwRHUZ4SDWSypraDZiXT3Y8U7T0C6h99dXhpWJQScNckoVRU+zi+BDuoBKHAffrn9vg==} @@ -4077,6 +4238,9 @@ packages: resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} engines: {node: '>=18'} + when-exit@2.1.3: + resolution: {integrity: sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -5678,6 +5842,10 @@ snapshots: transitivePeerDependencies: - supports-color + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -5685,6 +5853,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -5718,6 +5893,11 @@ snapshots: atomic-sleep@1.0.0: {} + atomically@2.0.3: + dependencies: + stubborn-fs: 1.2.5 + when-exit: 2.1.3 + autoprefixer@10.4.20(postcss@8.4.41): dependencies: browserslist: 4.23.3 @@ -5862,6 +6042,12 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + + cli-spinners@2.9.2: {} + clipboardy@4.0.0: dependencies: execa: 8.0.1 @@ -5909,6 +6095,18 @@ snapshots: concat-map@0.0.1: {} + conf@13.0.1: + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + atomically: 2.0.3 + debounce-fn: 6.0.0 + dot-prop: 9.0.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.1 + semver: 7.6.3 + uint8array-extras: 1.4.0 + confbox@0.1.7: {} consola@3.2.3: {} @@ -6020,6 +6218,10 @@ snapshots: date-fns@3.6.0: {} + debounce-fn@6.0.0: + dependencies: + mimic-function: 5.0.1 + debug@3.2.7: dependencies: ms: 2.1.3 @@ -6070,6 +6272,10 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dot-prop@9.0.0: + dependencies: + type-fest: 4.26.0 + dotenv@16.4.5: {} duplexer@0.1.2: {} @@ -6078,6 +6284,8 @@ snapshots: electron-to-chromium@1.5.13: {} + emoji-regex@10.4.0: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -6089,6 +6297,8 @@ snapshots: entities@4.5.0: {} + env-paths@3.0.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 @@ -6527,6 +6737,8 @@ snapshots: fast-redact@3.5.0: {} + fast-uri@3.0.1: {} + fastq@1.17.1: dependencies: reusify: 1.0.4 @@ -6590,6 +6802,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.2.0: {} + get-func-name@2.0.2: {} get-port-please@3.1.2: {} @@ -6791,6 +7005,8 @@ snapshots: dependencies: is-docker: 3.0.0 + is-interactive@2.0.0: {} + is-module@1.0.0: {} is-number@7.0.0: {} @@ -6805,6 +7021,10 @@ snapshots: is-stream@3.0.0: {} + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.0.0: {} + is-what@4.1.16: {} is-wsl@3.1.0: @@ -6898,6 +7118,10 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + + json-schema-typed@8.0.1: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -6972,6 +7196,11 @@ snapshots: lodash@4.17.21: {} + log-symbols@6.0.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -7046,6 +7275,8 @@ snapshots: mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} + min-indent@1.0.1: {} miniflare@3.20240821.0: @@ -7177,6 +7408,10 @@ snapshots: dependencies: mimic-fn: 4.0.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -7186,6 +7421,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@8.1.0: + dependencies: + chalk: 5.3.0 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.0.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -7530,6 +7777,8 @@ snapshots: require-directory@2.1.1: {} + require-from-string@2.0.2: {} + requires-port@1.0.0: {} resolve-from@4.0.0: {} @@ -7544,6 +7793,11 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + reusify@1.0.4: {} rollup-plugin-dts@6.1.1(rollup@3.29.4)(typescript@5.5.4): @@ -7732,6 +7986,8 @@ snapshots: std-env@3.7.0: {} + stdin-discarder@0.2.2: {} + stoppable@1.1.0: {} string-width@4.2.3: @@ -7746,6 +8002,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -7766,6 +8028,8 @@ snapshots: strip-json-comments@3.1.1: {} + stubborn-fs@1.2.5: {} + stylehacks@7.0.3(postcss@8.4.41): dependencies: browserslist: 4.23.3 @@ -7890,10 +8154,14 @@ snapshots: type-fest@0.8.1: {} + type-fest@4.26.0: {} + typescript@5.5.4: {} ufo@1.5.4: {} + uint8array-extras@1.4.0: {} + ulid-workers@2.1.0: {} unbuild@2.0.0(typescript@5.5.4): @@ -8170,6 +8438,8 @@ snapshots: tr46: 5.0.0 webidl-conversions: 7.0.0 + when-exit@2.1.3: {} + which@2.0.2: dependencies: isexe: 2.0.0