From 76d7189c5cba910690f0e99c4adce3878cfb1892 Mon Sep 17 00:00:00 2001 From: Kfir Strikovsky Date: Thu, 19 Feb 2026 16:24:23 +0200 Subject: [PATCH 1/5] make appConfig not global and migrate to bun tests --- bunfig.toml | 2 + docs/AGENTS.md | 4 +- docs/commands.md | 2 + docs/testing.md | 10 +- package.json | 5 +- src/cli/commands/dashboard/open.ts | 5 +- src/cli/commands/project/create.ts | 208 +++++++++++++++-------------- src/cli/commands/project/deploy.ts | 4 +- src/cli/commands/project/eject.ts | 88 ++++++------ src/cli/commands/project/link.ts | 7 +- src/cli/types.ts | 2 + src/cli/utils/runCommand.ts | 13 +- src/cli/utils/urls.ts | 13 +- src/core/clients/base44-client.ts | 2 +- src/core/config.ts | 5 +- src/core/project/api.ts | 8 +- src/core/project/app-config.ts | 73 +++++----- src/core/project/schema.ts | 4 +- tests/cli/testkit/Base44APIMock.ts | 4 - tests/cli/testkit/CLITestkit.ts | 17 ++- tests/core/agents.spec.ts | 16 +-- tests/core/connectors.spec.ts | 17 ++- vitest.config.ts | 18 --- 23 files changed, 263 insertions(+), 264 deletions(-) create mode 100644 bunfig.toml delete mode 100644 vitest.config.ts diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 00000000..6360a2fd --- /dev/null +++ b/bunfig.toml @@ -0,0 +1,2 @@ +[test] +timeout = 30000 diff --git a/docs/AGENTS.md b/docs/AGENTS.md index 18bf73c6..ebf9d693 100644 --- a/docs/AGENTS.md +++ b/docs/AGENTS.md @@ -11,7 +11,7 @@ The Base44 CLI (`base44` npm package) is a TypeScript command-line tool for crea - **JSON5** - Parsing JSONC/JSON5 config files (supports comments and trailing commas) - **TypeScript** - Primary language, strict types - **Biome** - Linting and formatting (replaces ESLint) -- **Vitest** - Test runner +- **Bun Test** - Test runner ## Architecture @@ -45,7 +45,7 @@ bun run build # Bundle to dist/index.js + copy templates bun run typecheck # tsc --noEmit bun run dev # Run bin/dev.ts (no build needed, Bun runs TS directly) bun run start # Run bin/run.js (requires build first) -bun run test # Run tests with vitest (use `bun run test`, not `bun test`) +bun test # Run tests bun run lint # Biome - lint and format check bun run lint:fix # Biome - auto-fix ``` diff --git a/docs/commands.md b/docs/commands.md index 96e20000..babf4f7d 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -79,10 +79,12 @@ await runCommand(myAction, { fullBanner: true, requireAuth: true }, context); export interface CLIContext { errorReporter: ErrorReporter; isNonInteractive: boolean; + appConfig?: AppConfig; // Set by runCommand when requireAppConfig is true } ``` - Created once in `runCLI()` at startup +- `appConfig` is set automatically by `runCommand()` when `requireAppConfig` is `true` (the default). Use `context.appConfig` to access the resolved app config instead of calling `getAppConfig()`. - `isNonInteractive` is `true` when stdin/stdout are not a TTY (e.g., CI, piped output, AI agents). Use it to skip interactive prompts, browser opens, and animations. - Passed to `createProgram(context)`, which passes it to each command factory - Commands pass it to `runCommand()` for error reporting integration diff --git a/docs/testing.md b/docs/testing.md index d1711034..679b6214 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -1,6 +1,6 @@ # Writing Tests -**Keywords:** test, vitest, testkit, setupCLITests, fixture, mock, Given/When/Then, BASE44_CLI_TEST_OVERRIDES, build before test, MSW +**Keywords:** test, bun test, testkit, setupCLITests, fixture, mock, Given/When/Then, BASE44_CLI_TEST_OVERRIDES, build before test, MSW ## Table of Contents @@ -17,7 +17,7 @@ **Build before testing**: Tests import the bundled `dist/index.js`, so always run: ```bash -bun run build && bun run test +bun run build && bun test ``` ## How Testing Works @@ -27,7 +27,7 @@ Tests use **MSW (Mock Service Worker)** to intercept HTTP requests. The testkit This means: - **`vi.mock()` won't work** with path aliases like `@/some/path.js` (they're resolved in the bundle) - Use the **`BASE44_CLI_TEST_OVERRIDES` env var** for mocking behavior instead (see below) -- Always `bun run build` before `bun run test` to ensure the bundle is fresh +- Always `bun run build` before `bun test` to ensure the bundle is fresh - Tests always run with `isNonInteractive: true` (no TTY), so browser opens and animations are skipped ## Test Structure @@ -57,7 +57,7 @@ tests/ ## Writing a Test ```typescript -import { describe, it } from "vitest"; +import { describe, it } from "vitest"; // Bun's vitest compat layer provides these import { setupCLITests, fixture } from "./testkit/index.js"; describe(" command", () => { @@ -320,7 +320,7 @@ function getTestOverride(): MyType | undefined { ## Testing Rules -1. **Build first** -- Always `bun run build` before `bun run test` +1. **Build first** -- Always `bun run build` before `bun test` 2. **Use fixtures** -- Don't create project structures in tests; use `tests/fixtures/` 3. **Fixtures need `.app.jsonc`** -- Add `base44/.app.jsonc` with `{ "id": "test-app-id" }` 4. **Interactive prompts can't be tested** -- Only test via non-interactive flags diff --git a/package.json b/package.json index 2e3094d1..6b01f7c8 100644 --- a/package.json +++ b/package.json @@ -19,8 +19,8 @@ "clean": "rm -rf dist && mkdir -p dist", "lint": "biome check src tests", "lint:fix": "biome check --write src tests", - "test": "vitest run", - "test:watch": "vitest", + "test": "bun test", + "test:watch": "bun test --watch", "knip": "knip", "knip:fix": "knip --fix" }, @@ -73,7 +73,6 @@ "tar": "^7.5.4", "tmp-promise": "^3.0.3", "typescript": "^5.7.2", - "vitest": "^4.0.16", "zod": "^4.3.5" }, "engines": { diff --git a/src/cli/commands/dashboard/open.ts b/src/cli/commands/dashboard/open.ts index b679a969..b68eb7f4 100644 --- a/src/cli/commands/dashboard/open.ts +++ b/src/cli/commands/dashboard/open.ts @@ -6,8 +6,9 @@ import type { RunCommandResult } from "@/cli/utils/runCommand.js"; async function openDashboard( isNonInteractive: boolean, + appId: string, ): Promise { - const dashboardUrl = getDashboardUrl(); + const dashboardUrl = getDashboardUrl(appId); if (!isNonInteractive) { await open(dashboardUrl); @@ -21,7 +22,7 @@ export function getDashboardOpenCommand(context: CLIContext): Command { .description("Open the app dashboard in your browser") .action(async () => { await runCommand( - () => openDashboard(context.isNonInteractive), + () => openDashboard(context.isNonInteractive, context.appConfig!.id), { requireAuth: true }, context, ); diff --git a/src/cli/commands/project/create.ts b/src/cli/commands/project/create.ts index 20c3a4e5..8b31cdf5 100644 --- a/src/cli/commands/project/create.ts +++ b/src/cli/commands/project/create.ts @@ -20,7 +20,7 @@ import { createProjectFiles, listTemplates, readProjectConfig, - setAppConfig, + withAppConfig, } from "@/core/project/index.js"; const DEFAULT_TEMPLATE_ID = "backend-only"; @@ -163,120 +163,130 @@ async function executeCreate({ }, ); - // Set app config in cache for sync access to getDashboardUrl and getAppClient - setAppConfig({ id: projectId, projectRoot: resolvedPath }); + return await withAppConfig( + { id: projectId, projectRoot: resolvedPath }, + async () => { + const { project, entities } = await readProjectConfig(resolvedPath); + let finalAppUrl: string | undefined; - const { project, entities } = await readProjectConfig(resolvedPath); - let finalAppUrl: string | undefined; + if (entities.length > 0) { + let shouldPushEntities: boolean; - if (entities.length > 0) { - let shouldPushEntities: boolean; + if (isInteractive) { + const result = await confirm({ + message: + "Set up the backend data now? (This pushes the data models used by the template to Base44)", + }); + shouldPushEntities = !isCancel(result) && result; + } else { + shouldPushEntities = !!deploy; + } - if (isInteractive) { - const result = await confirm({ - message: - "Set up the backend data now? (This pushes the data models used by the template to Base44)", - }); - shouldPushEntities = !isCancel(result) && result; - } else { - shouldPushEntities = !!deploy; - } + if (shouldPushEntities) { + await runTask( + `Pushing ${entities.length} data models to Base44...`, + async () => { + await pushEntities(entities); + }, + { + successMessage: theme.colors.base44Orange( + "Data models pushed successfully", + ), + errorMessage: "Failed to push data models", + }, + ); + } + } - if (shouldPushEntities) { - await runTask( - `Pushing ${entities.length} data models to Base44...`, - async () => { - await pushEntities(entities); - }, - { - successMessage: theme.colors.base44Orange( - "Data models pushed successfully", - ), - errorMessage: "Failed to push data models", - }, - ); - } - } + if (project.site) { + const { installCommand, buildCommand, outputDirectory } = project.site; - if (project.site) { - const { installCommand, buildCommand, outputDirectory } = project.site; + let shouldDeploy: boolean; - let shouldDeploy: boolean; + if (isInteractive) { + const result = await confirm({ + message: + "Would you like to deploy the site now? (Hosted on Base44)", + }); + shouldDeploy = !isCancel(result) && result; + } else { + shouldDeploy = !!deploy; + } - if (isInteractive) { - const result = await confirm({ - message: "Would you like to deploy the site now? (Hosted on Base44)", - }); - shouldDeploy = !isCancel(result) && result; - } else { - shouldDeploy = !!deploy; - } + if (shouldDeploy && installCommand && buildCommand && outputDirectory) { + const { appUrl } = await runTask( + "Installing dependencies...", + async (updateMessage) => { + await execa({ + cwd: resolvedPath, + shell: true, + })`${installCommand}`; - if (shouldDeploy && installCommand && buildCommand && outputDirectory) { - const { appUrl } = await runTask( - "Installing dependencies...", - async (updateMessage) => { - await execa({ cwd: resolvedPath, shell: true })`${installCommand}`; + updateMessage("Building project..."); + await execa({ cwd: resolvedPath, shell: true })`${buildCommand}`; - updateMessage("Building project..."); - await execa({ cwd: resolvedPath, shell: true })`${buildCommand}`; + updateMessage("Deploying site..."); + return await deploySite(join(resolvedPath, outputDirectory)); + }, + { + successMessage: theme.colors.base44Orange( + "Site deployed successfully", + ), + errorMessage: "Failed to deploy site", + }, + ); - updateMessage("Deploying site..."); - return await deploySite(join(resolvedPath, outputDirectory)); - }, - { - successMessage: theme.colors.base44Orange( - "Site deployed successfully", - ), - errorMessage: "Failed to deploy site", - }, - ); + finalAppUrl = appUrl; + } + } - finalAppUrl = appUrl; - } - } + // Add AI agent skills (--no-skills flag sets skills to false, otherwise defaults to true) + const shouldAddSkills = skills; - // Add AI agent skills (--no-skills flag sets skills to false, otherwise defaults to true) - const shouldAddSkills = skills; + if (shouldAddSkills) { + try { + await runTask( + "Installing AI agent skills...", + async () => { + await execa( + "npx", + ["-y", "skills", "add", "base44/skills", "-y"], + { + cwd: resolvedPath, + shell: true, + }, + ); + }, + { + successMessage: theme.colors.base44Orange( + "AI agent skills added successfully", + ), + errorMessage: + "Failed to add AI agent skills - you can add them later with: npx skills add base44/skills", + }, + ); + } catch { + // Skills installation is non-critical (e.g., user may not have git installed) + // The error message is already shown by runTask, so we just continue + } + } - if (shouldAddSkills) { - try { - await runTask( - "Installing AI agent skills...", - async () => { - await execa("npx", ["-y", "skills", "add", "base44/skills", "-y"], { - cwd: resolvedPath, - shell: true, - }); - }, - { - successMessage: theme.colors.base44Orange( - "AI agent skills added successfully", - ), - errorMessage: - "Failed to add AI agent skills - you can add them later with: npx skills add base44/skills", - }, + log.message( + `${theme.styles.header("Project")}: ${theme.colors.base44Orange(name)}`, + ); + log.message( + `${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl(projectId))}`, ); - } catch { - // Skills installation is non-critical (e.g., user may not have git installed) - // The error message is already shown by runTask, so we just continue - } - } - - log.message( - `${theme.styles.header("Project")}: ${theme.colors.base44Orange(name)}`, - ); - log.message( - `${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl(projectId))}`, - ); - if (finalAppUrl) { - log.message( - `${theme.styles.header("Site")}: ${theme.colors.links(finalAppUrl)}`, - ); - } + if (finalAppUrl) { + log.message( + `${theme.styles.header("Site")}: ${theme.colors.links(finalAppUrl)}`, + ); + } - return { outroMessage: "Your project is set up and ready to use" }; + return { outroMessage: "Your project is set up and ready to use" }; + }, + ); } export function getCreateCommand(context: CLIContext): Command { diff --git a/src/cli/commands/project/deploy.ts b/src/cli/commands/project/deploy.ts index da58b570..e3f7dc82 100644 --- a/src/cli/commands/project/deploy.ts +++ b/src/cli/commands/project/deploy.ts @@ -22,6 +22,7 @@ interface DeployOptions { yes?: boolean; projectRoot?: string; isNonInteractive?: boolean; + appId: string; } export async function deployAction( @@ -109,7 +110,7 @@ export async function deployAction( } log.message( - `${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl())}`, + `${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl(options.appId!))}`, ); if (result.appUrl) { log.message( @@ -132,6 +133,7 @@ export function getDeployCommand(context: CLIContext): Command { deployAction({ ...options, isNonInteractive: context.isNonInteractive, + appId: context.appConfig!.id, }), { requireAuth: true }, context, diff --git a/src/cli/commands/project/eject.ts b/src/cli/commands/project/eject.ts index b0dda5cd..d0db7599 100644 --- a/src/cli/commands/project/eject.ts +++ b/src/cli/commands/project/eject.ts @@ -17,7 +17,7 @@ import { isDirEmpty, listProjects, readProjectConfig, - setAppConfig, + withAppConfig, writeAppConfig, writeFile, } from "@/core/index.js"; @@ -98,7 +98,7 @@ async function eject(options: EjectOptions): Promise { const resolvedPath = resolve(selectedPath); - await runTask( + const newProjectId = await runTask( "Downloading your project's code...", async (updateMessage) => { await createProjectFilesForExistingProject({ @@ -109,20 +109,20 @@ async function eject(options: EjectOptions): Promise { updateMessage("Creating a new project..."); const newProjectName = `${selectedProject.name} Copy`; - const { projectId: newProjectId } = await createProject( + const { projectId: createdId } = await createProject( newProjectName, selectedProject.userDescription ?? undefined, ); updateMessage("Linking the project..."); - await writeAppConfig(resolvedPath, newProjectId); + await writeAppConfig(resolvedPath, createdId); await writeFile( `${resolvedPath}/.env.local`, - `VITE_BASE44_APP_ID=${newProjectId}`, + `VITE_BASE44_APP_ID=${createdId}`, ); - setAppConfig({ id: newProjectId, projectRoot: resolvedPath }); + return createdId; }, { successMessage: theme.colors.base44Orange("Project pulled successfully"), @@ -130,40 +130,52 @@ async function eject(options: EjectOptions): Promise { }, ); - const { project } = await readProjectConfig(resolvedPath); - const installCommand = project.site?.installCommand; - const buildCommand = project.site?.buildCommand; - - // Only offer deploy if the project has build commands configured - if (installCommand && buildCommand) { - const shouldDeploy = options.yes - ? true - : await confirm({ - message: "Would you like to deploy your project now?", - }); - - if (!isCancel(shouldDeploy) && shouldDeploy) { - await runTask( - "Installing dependencies...", - async (updateMessage) => { - await execa({ cwd: resolvedPath, shell: true })`${installCommand}`; - - updateMessage("Building project..."); - await execa({ cwd: resolvedPath, shell: true })`${buildCommand}`; - }, - { - successMessage: theme.colors.base44Orange( - "Project built successfully", - ), - errorMessage: "Failed to build project", - }, - ); + return await withAppConfig( + { id: newProjectId, projectRoot: resolvedPath }, + async () => { + const { project } = await readProjectConfig(resolvedPath); + const installCommand = project.site?.installCommand; + const buildCommand = project.site?.buildCommand; + + // Only offer deploy if the project has build commands configured + if (installCommand && buildCommand) { + const shouldDeploy = options.yes + ? true + : await confirm({ + message: "Would you like to deploy your project now?", + }); + + if (!isCancel(shouldDeploy) && shouldDeploy) { + await runTask( + "Installing dependencies...", + async (updateMessage) => { + await execa({ + cwd: resolvedPath, + shell: true, + })`${installCommand}`; + + updateMessage("Building project..."); + await execa({ cwd: resolvedPath, shell: true })`${buildCommand}`; + }, + { + successMessage: theme.colors.base44Orange( + "Project built successfully", + ), + errorMessage: "Failed to build project", + }, + ); - await deployAction({ yes: true, projectRoot: resolvedPath }); - } - } + await deployAction({ + yes: true, + projectRoot: resolvedPath, + appId: newProjectId, + }); + } + } - return { outroMessage: "Your new project is set and ready to use" }; + return { outroMessage: "Your new project is set and ready to use" }; + }, + ); } export function getEjectCommand(context: CLIContext): Command { diff --git a/src/cli/commands/project/link.ts b/src/cli/commands/project/link.ts index 67b8d72c..e426aeb3 100644 --- a/src/cli/commands/project/link.ts +++ b/src/cli/commands/project/link.ts @@ -22,7 +22,6 @@ import { createProject, findProjectRoot, listProjects, - setAppConfig, writeAppConfig, } from "@/core/project/index.js"; @@ -204,7 +203,6 @@ async function link(options: LinkOptions): Promise { "Linking project...", async () => { await writeAppConfig(projectRoot.root, projectId); - setAppConfig({ id: projectId, projectRoot: projectRoot.root }); }, { successMessage: "Project linked successfully", @@ -233,14 +231,11 @@ async function link(options: LinkOptions): Promise { await writeAppConfig(projectRoot.root, projectId); - // Set app config in cache for sync access to getDashboardUrl - setAppConfig({ id: projectId, projectRoot: projectRoot.root }); - finalProjectId = projectId; } log.message( - `${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl(finalProjectId))}`, + `${theme.styles.header("Dashboard")}: ${theme.colors.links(getDashboardUrl(finalProjectId!))}`, ); return { outroMessage: "Project linked" }; } diff --git a/src/cli/types.ts b/src/cli/types.ts index 124ac9de..dffb764c 100644 --- a/src/cli/types.ts +++ b/src/cli/types.ts @@ -1,6 +1,8 @@ +import type { AppConfig } from "@/core/project/app-config.js"; import type { ErrorReporter } from "./telemetry/error-reporter.js"; export interface CLIContext { errorReporter: ErrorReporter; isNonInteractive: boolean; + appConfig?: AppConfig; } diff --git a/src/cli/utils/runCommand.ts b/src/cli/utils/runCommand.ts index f7352145..6c5935d5 100644 --- a/src/cli/utils/runCommand.ts +++ b/src/cli/utils/runCommand.ts @@ -6,7 +6,7 @@ import { theme } from "@/cli/utils/theme.js"; import { printUpgradeNotificationIfAvailable } from "@/cli/utils/upgradeNotification.js"; import { isLoggedIn, readAuth } from "@/core/auth/index.js"; import { isCLIError } from "@/core/errors.js"; -import { initAppConfig } from "@/core/project/index.js"; +import { resolveAppConfig, withAppConfig } from "@/core/project/index.js"; interface RunCommandOptions { /** @@ -23,7 +23,7 @@ interface RunCommandOptions { requireAuth?: boolean; /** * Initialize app config before running this command. - * Reads .app.jsonc and caches the appId for sync access via getAppConfig(). + * Reads .app.jsonc and makes appConfig available via context.appConfig and getAppConfig(). * @default true */ requireAppConfig?: boolean; @@ -97,12 +97,17 @@ export async function runCommand( } // Initialize app config unless explicitly disabled + let outroMessage: string | undefined; + if (options?.requireAppConfig !== false) { - const appConfig = await initAppConfig(); + const appConfig = await resolveAppConfig(); + context.appConfig = appConfig; context.errorReporter.setContext({ appId: appConfig.id }); + ({ outroMessage } = await withAppConfig(appConfig, commandFn)); + } else { + ({ outroMessage } = await commandFn()); } - const { outroMessage } = await commandFn(); outro(outroMessage || ""); } catch (error) { // Display error message diff --git a/src/cli/utils/urls.ts b/src/cli/utils/urls.ts index c86fd43a..4539a866 100644 --- a/src/cli/utils/urls.ts +++ b/src/cli/utils/urls.ts @@ -1,14 +1,5 @@ import { getBase44ApiUrl } from "@/core/config.js"; -import { getAppConfig } from "@/core/project/index.js"; -/** - * Gets the dashboard URL for a project. - * - * @param projectId - Optional project ID. If not provided, uses cached appId from getAppConfig(). - * @returns The dashboard URL - * @throws Error if no projectId provided and app config is not initialized - */ -export function getDashboardUrl(projectId?: string): string { - const id = projectId ?? getAppConfig().id; - return `${getBase44ApiUrl()}/apps/${id}/editor/workspace/overview`; +export function getDashboardUrl(projectId: string): string { + return `${getBase44ApiUrl()}/apps/${projectId}/editor/workspace/overview`; } diff --git a/src/core/clients/base44-client.ts b/src/core/clients/base44-client.ts index 8effb6e0..576e5e44 100644 --- a/src/core/clients/base44-client.ts +++ b/src/core/clients/base44-client.ts @@ -112,7 +112,7 @@ export const base44Client = ky.create({ /** * Returns an HTTP client scoped to the current app. - * Requires app config to be initialized first via initAppConfig() or setAppConfig(). + * Requires app config to be set via withAppConfig() scope. * Use this for API calls to app-specific endpoints (entities, functions, etc.). * * @throws {Error} If app config is not initialized. diff --git a/src/core/config.ts b/src/core/config.ts index 426252e2..bb70786f 100644 --- a/src/core/config.ts +++ b/src/core/config.ts @@ -16,7 +16,10 @@ import { const __dirname = dirname(fileURLToPath(import.meta.url)); function getBase44GlobalDir(): string { - return join(homedir(), ".base44"); + // Use process.env.HOME directly because Bun's os.homedir() caches + // the initial value and ignores subsequent process.env.HOME changes. + const home = process.env.HOME || homedir(); + return join(home, ".base44"); } export function getAuthFilePath(): string { diff --git a/src/core/project/api.ts b/src/core/project/api.ts index ed6157f6..86457fd4 100644 --- a/src/core/project/api.ts +++ b/src/core/project/api.ts @@ -76,10 +76,10 @@ export async function downloadProject(projectId: string, projectPath: string) { throw await ApiError.fromHttpError(error, "downloading project"); } - const nodeStream = Readable.fromWeb( - response.body as import("node:stream/web").ReadableStream, - ); + // Use arrayBuffer + Readable.from instead of Readable.fromWeb + // because Bun's Readable.fromWeb has stream compat issues with the tar package. + const buffer = Buffer.from(await response.arrayBuffer()); await makeDirectory(projectPath); - await pipeline(nodeStream, extract({ cwd: projectPath })); + await pipeline(Readable.from(buffer), extract({ cwd: projectPath })); } diff --git a/src/core/project/app-config.ts b/src/core/project/app-config.ts index ead6ef61..4648fa09 100644 --- a/src/core/project/app-config.ts +++ b/src/core/project/app-config.ts @@ -7,40 +7,41 @@ import { SchemaValidationError, } from "@/core/errors.js"; import { findProjectRoot } from "@/core/project/config.js"; -import type { AppConfig } from "@/core/project/schema.js"; -import { AppConfigSchema } from "@/core/project/schema.js"; +import type { AppConfigFile } from "@/core/project/schema.js"; +import { AppConfigFileSchema } from "@/core/project/schema.js"; import { readJsonFile, writeFile } from "@/core/utils/fs.js"; -interface CachedAppConfig { - id: string; - projectRoot: string; -} +export type AppConfig = { id: string; projectRoot: string }; -let cache: CachedAppConfig | null = null; +// Not concurrent-safe; fine for a sequential CLI. +let _current: AppConfig | null = null; -function loadFromTestOverrides(): boolean { - const appConfig = getTestOverrides()?.appConfig; - if (appConfig?.id && appConfig.projectRoot) { - cache = { id: appConfig.id, projectRoot: appConfig.projectRoot }; - return true; +/** + * Execute a function with app config in scope. + * Any code that calls getAppConfig() inside `fn` will get this config. + * Automatically cleans up when fn completes (or throws). + */ +export async function withAppConfig( + config: AppConfig, + fn: () => Promise, +): Promise { + const prev = _current; + _current = config; + try { + return await fn(); + } finally { + _current = prev; } - return false; } /** - * Initialize app config by reading from .app.jsonc. - * Returns the cached config, reading from disk only on first call. - * @returns The app config with id and projectRoot - * @throws Error if no project found or .app.jsonc missing + * Read app config from disk (or test overrides). Pure function, no caching. + * Use withAppConfig() to make the result available to getAppConfig(). */ -export async function initAppConfig(): Promise { - // Check for test overrides first - if (loadFromTestOverrides()) { - return cache!; - } - - if (cache) { - return cache; +export async function resolveAppConfig(): Promise { + const testOverride = getTestOverrides()?.appConfig; + if (testOverride?.id && testOverride.projectRoot) { + return { id: testOverride.id, projectRoot: testOverride.projectRoot }; } const projectRoot = await findProjectRoot(); @@ -68,25 +69,19 @@ export async function initAppConfig(): Promise { ); } - cache = { projectRoot: projectRoot.root, id: config.id }; - return cache; + return { projectRoot: projectRoot.root, id: config.id }; } /** - * Get the cached app config. - * @throws ConfigInvalidError if not initialized - call initAppConfig() or setAppConfig() first + * Get the current app config. Must be called inside withAppConfig(). */ -export function getAppConfig(): CachedAppConfig { - if (!cache) { +export function getAppConfig(): AppConfig { + if (!_current) { throw new ConfigInvalidError( "App config not initialized. Ensure the command uses requireAppConfig option.", ); } - return cache; -} - -export function setAppConfig(config: CachedAppConfig): void { - cache = config; + return _current; } function generateAppConfigContent(id: string): string { @@ -122,7 +117,9 @@ export async function appConfigExists(projectRoot: string): Promise { return configPath !== null; } -async function readAppConfig(projectRoot: string): Promise { +async function readAppConfig( + projectRoot: string, +): Promise { const configPath = await findAppConfigPath(projectRoot); if (!configPath) { @@ -130,7 +127,7 @@ async function readAppConfig(projectRoot: string): Promise { } const parsed = await readJsonFile(configPath); - const result = AppConfigSchema.safeParse(parsed); + const result = AppConfigFileSchema.safeParse(parsed); if (!result.success) { throw new SchemaValidationError( diff --git a/src/core/project/schema.ts b/src/core/project/schema.ts index 60bf4a01..517a6fab 100644 --- a/src/core/project/schema.ts +++ b/src/core/project/schema.ts @@ -35,11 +35,11 @@ export const ProjectConfigSchema = z.object({ export type ProjectConfig = z.infer; -export const AppConfigSchema = z.object({ +export const AppConfigFileSchema = z.object({ id: z.string().min(1, "id cannot be empty"), }); -export type AppConfig = z.infer; +export type AppConfigFile = z.infer; export const CreateProjectResponseSchema = z.looseObject({ id: z.string(), diff --git a/tests/cli/testkit/Base44APIMock.ts b/tests/cli/testkit/Base44APIMock.ts index a8987f8e..240c6f97 100644 --- a/tests/cli/testkit/Base44APIMock.ts +++ b/tests/cli/testkit/Base44APIMock.ts @@ -75,10 +75,6 @@ interface ConnectorSetResponse { other_user_email?: string; } -interface ConnectorOAuthStatusResponse { - status: "ACTIVE" | "FAILED" | "PENDING"; -} - interface ConnectorRemoveResponse { status: "removed"; integration_type: string; diff --git a/tests/cli/testkit/CLITestkit.ts b/tests/cli/testkit/CLITestkit.ts index e81ad96a..1adda9c3 100644 --- a/tests/cli/testkit/CLITestkit.ts +++ b/tests/cli/testkit/CLITestkit.ts @@ -11,6 +11,15 @@ import { CLIResultMatcher } from "./CLIResultMatcher.js"; const __dirname = dirname(fileURLToPath(import.meta.url)); const DIST_INDEX_PATH = join(__dirname, "../../../dist/cli/index.js"); +let _programModule: ProgramModule | null = null; + +async function loadProgram(): Promise { + if (!_programModule) { + _programModule = (await import(DIST_INDEX_PATH)) as ProgramModule; + } + return _programModule; +} + /** Type for CLIContext */ interface CLIContext { errorReporter: { @@ -125,13 +134,7 @@ export class CLITestkit { // Apply all API mocks before running this.api.apply(); - // Reset module state to ensure test isolation - vi.resetModules(); - - // Import CLI module fresh after reset - const { createProgram, CLIExitError } = (await import( - DIST_INDEX_PATH - )) as ProgramModule; + const { createProgram, CLIExitError } = await loadProgram(); // Create a mock context for tests (telemetry is disabled via env var anyway) const mockContext: CLIContext = { diff --git a/tests/core/agents.spec.ts b/tests/core/agents.spec.ts index 81c94868..72b78db1 100644 --- a/tests/core/agents.spec.ts +++ b/tests/core/agents.spec.ts @@ -3,18 +3,10 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; import { pushAgents } from "../../src/core/resources/agent/api.js"; import type { AgentConfig } from "../../src/core/resources/agent/index.js"; -// Mock the HTTP client const mockPut = vi.fn(); -vi.mock("../../src/core/clients/index.js", async (importOriginal) => { - const actual = - await importOriginal(); - return { - ...actual, - getAppClient: () => ({ - put: mockPut, - }), - }; -}); +vi.mock("../../src/core/clients/index.js", () => ({ + getAppClient: () => ({ put: mockPut }), +})); /** * Creates a ky HTTPError for testing error handling. @@ -31,7 +23,7 @@ function createHTTPError(status: number, body: unknown): HTTPError { describe("pushAgents", () => { beforeEach(() => { - vi.clearAllMocks(); + vi.resetAllMocks(); }); it("returns empty result without API call when no agents provided", async () => { diff --git a/tests/core/connectors.spec.ts b/tests/core/connectors.spec.ts index 9b3ba90c..426703a0 100644 --- a/tests/core/connectors.spec.ts +++ b/tests/core/connectors.spec.ts @@ -3,7 +3,6 @@ import { tmpdir } from "node:os"; import { join, resolve } from "node:path"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { InvalidInputError } from "../../src/core/errors.js"; -import * as api from "../../src/core/resources/connector/api.js"; import { readAllConnectors, writeConnectors, @@ -11,7 +10,17 @@ import { import { pushConnectors } from "../../src/core/resources/connector/push.js"; import type { ConnectorResource } from "../../src/core/resources/connector/schema.js"; -vi.mock("../../src/core/resources/connector/api.js"); +const mockListConnectors = vi.fn(); +const mockSetConnector = vi.fn(); +const mockRemoveConnector = vi.fn(); +const mockGetOAuthStatus = vi.fn(); + +vi.mock("../../src/core/resources/connector/api.js", () => ({ + listConnectors: mockListConnectors, + setConnector: mockSetConnector, + removeConnector: mockRemoveConnector, + getOAuthStatus: mockGetOAuthStatus, +})); const FIXTURES_DIR = resolve(__dirname, "../fixtures"); @@ -287,10 +296,6 @@ describe("writeConnectors", () => { }); }); -const mockListConnectors = vi.mocked(api.listConnectors); -const mockSetConnector = vi.mocked(api.setConnector); -const mockRemoveConnector = vi.mocked(api.removeConnector); - describe("pushConnectors", () => { beforeEach(() => { vi.resetAllMocks(); diff --git a/vitest.config.ts b/vitest.config.ts deleted file mode 100644 index 46a91b01..00000000 --- a/vitest.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from "vitest/config"; -import { resolve } from "path"; - -export default defineConfig({ - test: { - environment: "node", - globals: true, - include: ["tests/**/*.spec.ts"], - testTimeout: 30000, - mockReset: true, - silent: true, // Suppress stdout/stderr from tests (CLI output is very noisy) - }, - resolve: { - alias: { - "@": resolve(__dirname, "./src"), - }, - }, -}); From 5aaca3d13ca9bb62a722232bb6fa5b7afd75d259 Mon Sep 17 00:00:00 2001 From: Kfir Strikovsky Date: Thu, 19 Feb 2026 16:30:24 +0200 Subject: [PATCH 2/5] update bun lock --- bun.lock | 173 ------------------------------------------------------- 1 file changed, 173 deletions(-) diff --git a/bun.lock b/bun.lock index bb0b4810..b031d29d 100644 --- a/bun.lock +++ b/bun.lock @@ -42,7 +42,6 @@ "tar": "^7.5.4", "tmp-promise": "^3.0.3", "typescript": "^5.7.2", - "vitest": "^4.0.16", "zod": "^4.3.5", }, }, @@ -78,58 +77,6 @@ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], - - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], - - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], - "@inquirer/ansi": ["@inquirer/ansi@1.0.2", "", {}, "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ=="], "@inquirer/confirm": ["@inquirer/confirm@5.1.21", "", { "dependencies": { "@inquirer/core": "^10.3.2", "@inquirer/type": "^3.0.10" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ=="], @@ -142,8 +89,6 @@ "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - "@jsdevtools/ono": ["@jsdevtools/ono@7.1.3", "", {}, "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="], "@mswjs/interceptors": ["@mswjs/interceptors@0.41.2", "", { "dependencies": { "@open-draft/deferred-promise": "^2.2.0", "@open-draft/logger": "^0.3.0", "@open-draft/until": "^2.0.0", "is-node-process": "^1.2.0", "outvariant": "^1.4.3", "strict-event-emitter": "^0.5.1" } }, "sha512-7G0Uf0yK3f2bjElBLGHIQzgRgMESczOMyYVasq1XK8P5HaXtlW4eQhz9MBL+TQILZLaruq+ClGId+hH0w4jvWw=="], @@ -204,84 +149,26 @@ "@posthog/core": ["@posthog/core@1.10.0", "", { "dependencies": { "cross-spawn": "^7.0.6" } }, "sha512-Xk3JQ+cdychsvftrV3G9ZrN9W329lbyFW0pGJXFGKFQf8qr4upw2SgNg9BVorjSrfhoXZRnJGt/uNF4nGFBL5A=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.57.1", "", { "os": "android", "cpu": "arm" }, "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg=="], - - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.57.1", "", { "os": "android", "cpu": "arm64" }, "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w=="], - - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.57.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg=="], - - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.57.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w=="], - - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.57.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug=="], - - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.57.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q=="], - - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.57.1", "", { "os": "linux", "cpu": "arm" }, "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw=="], - - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.57.1", "", { "os": "linux", "cpu": "arm" }, "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw=="], - - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.57.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g=="], - - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.57.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q=="], - - "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA=="], - - "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw=="], - - "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.57.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w=="], - - "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.57.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw=="], - - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A=="], - - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw=="], - - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.57.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg=="], - - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.57.1", "", { "os": "linux", "cpu": "x64" }, "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg=="], - - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.57.1", "", { "os": "linux", "cpu": "x64" }, "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw=="], - - "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.57.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw=="], - - "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.57.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ=="], - - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.57.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ=="], - - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.57.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew=="], - - "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ=="], - - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA=="], - "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], - "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], "@types/bun": ["@types/bun@1.3.9", "", { "dependencies": { "bun-types": "1.3.9" } }, "sha512-KQ571yULOdWJiMH+RIWIOZ7B2RXQGpL1YQrBtLIV3FqDcCu6FsbFUBwhdKUlCKUpS3PJDsHlJ1QKlpxoVR+xtw=="], - "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], - "@types/common-tags": ["@types/common-tags@1.8.4", "", {}, "sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg=="], "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], "@types/cors": ["@types/cors@2.8.19", "", { "dependencies": { "@types/node": "*" } }, "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg=="], - "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], - "@types/deno": ["@types/deno@2.5.0", "", {}, "sha512-g8JS38vmc0S87jKsFzre+0ZyMOUDHPVokEJymSCRlL57h6f/FdKPWBXgdFh3Z8Ees9sz11qt9VWELU9Y9ZkiVw=="], "@types/ejs": ["@types/ejs@3.1.5", "", {}, "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg=="], - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], - "@types/express": ["@types/express@5.0.6", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^5.0.0", "@types/serve-static": "^2" } }, "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA=="], "@types/express-serve-static-core": ["@types/express-serve-static-core@5.1.1", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A=="], @@ -310,20 +197,6 @@ "@vercel/detect-agent": ["@vercel/detect-agent@1.1.0", "", {}, "sha512-Zfq6FbIcYl9gaAmVu6ROsqUiCNwpEj3Ljz/tMX5fl12Z95OFOxzf7vlO03WE5JBU/ri1tBDFHnW41dihMINOPQ=="], - "@vitest/expect": ["@vitest/expect@4.0.18", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.0.18", "@vitest/utils": "4.0.18", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" } }, "sha512-8sCWUyckXXYvx4opfzVY03EOiYVxyNrHS5QxX3DAIi5dpJAAkyJezHCP77VMX4HKA2LDT/Jpfo8i2r5BE3GnQQ=="], - - "@vitest/mocker": ["@vitest/mocker@4.0.18", "", { "dependencies": { "@vitest/spy": "4.0.18", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-HhVd0MDnzzsgevnOWCBj5Otnzobjy5wLBe4EdeeFGv8luMsGcYqDuFRMcttKWZA5vVO8RFjexVovXvAM4JoJDQ=="], - - "@vitest/pretty-format": ["@vitest/pretty-format@4.0.18", "", { "dependencies": { "tinyrainbow": "^3.0.3" } }, "sha512-P24GK3GulZWC5tz87ux0m8OADrQIUVDPIjjj65vBXYG17ZeU3qD7r+MNZ1RNv4l8CGU2vtTRqixrOi9fYk/yKw=="], - - "@vitest/runner": ["@vitest/runner@4.0.18", "", { "dependencies": { "@vitest/utils": "4.0.18", "pathe": "^2.0.3" } }, "sha512-rpk9y12PGa22Jg6g5M3UVVnTS7+zycIGk9ZNGN+m6tZHKQb7jrP7/77WfZy13Y/EUDd52NDsLRQhYKtv7XfPQw=="], - - "@vitest/snapshot": ["@vitest/snapshot@4.0.18", "", { "dependencies": { "@vitest/pretty-format": "4.0.18", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-PCiV0rcl7jKQjbgYqjtakly6T1uwv/5BQ9SwBLekVg/EaYeQFPiXcgrC2Y7vDMA8dM1SUEAEV82kgSQIlXNMvA=="], - - "@vitest/spy": ["@vitest/spy@4.0.18", "", {}, "sha512-cbQt3PTSD7P2OARdVW3qWER5EGq7PHlvE+QfzSC0lbwO+xnt7+XH06ZzFjFRgzUX//JmpxrCu92VdwvEPlWSNw=="], - - "@vitest/utils": ["@vitest/utils@4.0.18", "", { "dependencies": { "@vitest/pretty-format": "4.0.18", "tinyrainbow": "^3.0.3" } }, "sha512-msMRKLMVLWygpK3u2Hybgi4MNjcYJvwTb0Ru09+fOyCXIgT5raYP041DRRdiJiI3k/2U6SEbAETB3YtBrUkCFA=="], - "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], @@ -332,8 +205,6 @@ "argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="], - "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], - "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], @@ -354,8 +225,6 @@ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], - "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], - "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], @@ -408,28 +277,20 @@ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], - "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], - "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="], - "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], "execa": ["execa@9.6.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA=="], - "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], - "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], @@ -458,8 +319,6 @@ "front-matter": ["front-matter@4.0.2", "", { "dependencies": { "js-yaml": "^3.13.1" } }, "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg=="], - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], @@ -552,8 +411,6 @@ "lodash.kebabcase": ["lodash.kebabcase@4.1.1", "", {}, "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g=="], - "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], - "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], @@ -592,8 +449,6 @@ "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], @@ -614,14 +469,10 @@ "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], - "posthog-node": ["posthog-node@5.21.2", "", { "dependencies": { "@posthog/core": "1.10.0" } }, "sha512-Jehlu0KguL1LLyUczCt86OtA5INmeStK3zcgbv1BSyMcNxs0HP3GQogBrYhwhqHsk6JopiFFVpJyZEoXOUMhGw=="], "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], @@ -648,8 +499,6 @@ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], - "rollup": ["rollup@4.57.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.57.1", "@rollup/rollup-android-arm64": "4.57.1", "@rollup/rollup-darwin-arm64": "4.57.1", "@rollup/rollup-darwin-x64": "4.57.1", "@rollup/rollup-freebsd-arm64": "4.57.1", "@rollup/rollup-freebsd-x64": "4.57.1", "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", "@rollup/rollup-linux-arm-musleabihf": "4.57.1", "@rollup/rollup-linux-arm64-gnu": "4.57.1", "@rollup/rollup-linux-arm64-musl": "4.57.1", "@rollup/rollup-linux-loong64-gnu": "4.57.1", "@rollup/rollup-linux-loong64-musl": "4.57.1", "@rollup/rollup-linux-ppc64-gnu": "4.57.1", "@rollup/rollup-linux-ppc64-musl": "4.57.1", "@rollup/rollup-linux-riscv64-gnu": "4.57.1", "@rollup/rollup-linux-riscv64-musl": "4.57.1", "@rollup/rollup-linux-s390x-gnu": "4.57.1", "@rollup/rollup-linux-x64-gnu": "4.57.1", "@rollup/rollup-linux-x64-musl": "4.57.1", "@rollup/rollup-openbsd-x64": "4.57.1", "@rollup/rollup-openharmony-arm64": "4.57.1", "@rollup/rollup-win32-arm64-msvc": "4.57.1", "@rollup/rollup-win32-ia32-msvc": "4.57.1", "@rollup/rollup-win32-x64-gnu": "4.57.1", "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A=="], - "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="], @@ -676,8 +525,6 @@ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], - "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], - "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], @@ -686,16 +533,10 @@ "smol-toml": ["smol-toml@1.6.0", "", {}, "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw=="], - "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], - "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="], - "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], - "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], - "strict-event-emitter": ["strict-event-emitter@0.5.1", "", {}, "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -710,14 +551,8 @@ "tar": ["tar@7.5.7", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ=="], - "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], - - "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], - "tinyrainbow": ["tinyrainbow@3.0.3", "", {}, "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q=="], - "tldts": ["tldts@7.0.23", "", { "dependencies": { "tldts-core": "^7.0.23" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw=="], "tldts-core": ["tldts-core@7.0.23", "", {}, "sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ=="], @@ -750,16 +585,10 @@ "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - "vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], - - "vitest": ["vitest@4.0.18", "", { "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", "@vitest/pretty-format": "4.0.18", "@vitest/runner": "4.0.18", "@vitest/snapshot": "4.0.18", "@vitest/spy": "4.0.18", "@vitest/utils": "4.0.18", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^3.10.0", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.0.18", "@vitest/browser-preview": "4.0.18", "@vitest/browser-webdriverio": "4.0.18", "@vitest/ui": "4.0.18", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ=="], - "walk-up-path": ["walk-up-path@4.0.0", "", {}, "sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], - "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], @@ -798,8 +627,6 @@ "npm-run-path/unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], - "postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], - "router/path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], "string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], From dfb19d8c1223151b02ae43260466a9573508122d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 19 Feb 2026 14:34:43 +0000 Subject: [PATCH 3/5] docs: update README to match CLI (command table, install, or quick start) --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index cd048a80..5b1045bb 100644 --- a/README.md +++ b/README.md @@ -52,13 +52,14 @@ The CLI will guide you through project setup. For step-by-step tutorials, see th | [`whoami`](https://docs.base44.com/developers/references/cli/commands/whoami) | Display the current authenticated user | | [`agents pull`](https://docs.base44.com/developers/references/cli/commands/agents-pull) | Pull agents from Base44 to local files | | [`agents push`](https://docs.base44.com/developers/references/cli/commands/agents-push) | Push local agents to Base44 | +| [`connectors pull`](https://docs.base44.com/developers/references/cli/commands/connectors-pull) | Pull connectors from Base44 to local files | +| [`connectors push`](https://docs.base44.com/developers/references/cli/commands/connectors-push) | Push local connectors to Base44 | +| [`eject`](https://docs.base44.com/developers/references/cli/commands/eject) | Download the code for an existing Base44 project | | [`entities push`](https://docs.base44.com/developers/references/cli/commands/entities-push) | Push local entity schemas to Base44 | | [`functions deploy`](https://docs.base44.com/developers/references/cli/commands/functions-deploy) | Deploy local functions to Base44 | | [`site deploy`](https://docs.base44.com/developers/references/cli/commands/site-deploy) | Deploy built site files to Base44 hosting | | [`site open`](https://docs.base44.com/developers/references/cli/commands/site-open) | Open the published site in your browser | - - - +| [`types generate`](https://docs.base44.com/developers/references/cli/commands/types-generate) | Generate TypeScript types from project resources | ## AI agent skills From 4026e8aab3fee5e195a70e7ca776c8693991f0e3 Mon Sep 17 00:00:00 2001 From: Kfir Strikovsky Date: Thu, 19 Feb 2026 16:45:06 +0200 Subject: [PATCH 4/5] update imports --- tests/cli/agents_pull.spec.ts | 2 +- tests/cli/agents_push.spec.ts | 2 +- tests/cli/authorization.spec.ts | 2 +- tests/cli/connectors_pull.spec.ts | 2 +- tests/cli/connectors_push.spec.ts | 2 +- tests/cli/create.spec.ts | 2 +- tests/cli/dashboard_open.spec.ts | 2 +- tests/cli/deploy.spec.ts | 2 +- tests/cli/eject.spec.ts | 2 +- tests/cli/entities_push.spec.ts | 2 +- tests/cli/functions_deploy.spec.ts | 2 +- tests/cli/link.spec.ts | 2 +- tests/cli/login.spec.ts | 2 +- tests/cli/logout.spec.ts | 2 +- tests/cli/site_deploy.spec.ts | 2 +- tests/cli/site_open.spec.ts | 2 +- tests/cli/testkit/CLITestkit.ts | 2 +- tests/cli/testkit/index.ts | 2 +- tests/cli/types_generate.spec.ts | 2 +- tests/cli/version-check.spec.ts | 2 +- tests/cli/whoami.spec.ts | 2 +- tests/core/agents.spec.ts | 2 +- tests/core/connectors.spec.ts | 4 ++-- tests/core/errors.spec.ts | 2 +- tests/core/project.spec.ts | 2 +- 25 files changed, 26 insertions(+), 26 deletions(-) diff --git a/tests/cli/agents_pull.spec.ts b/tests/cli/agents_pull.spec.ts index f1d346f9..6ecc28ce 100644 --- a/tests/cli/agents_pull.spec.ts +++ b/tests/cli/agents_pull.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("agents pull command", () => { diff --git a/tests/cli/agents_push.spec.ts b/tests/cli/agents_push.spec.ts index 8b8906b6..34a4cce3 100644 --- a/tests/cli/agents_push.spec.ts +++ b/tests/cli/agents_push.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("agents push command", () => { diff --git a/tests/cli/authorization.spec.ts b/tests/cli/authorization.spec.ts index 7463499c..eb8d2c80 100644 --- a/tests/cli/authorization.spec.ts +++ b/tests/cli/authorization.spec.ts @@ -1,5 +1,5 @@ import { HttpResponse, http } from "msw"; -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, mswServer, setupCLITests } from "./testkit/index.js"; const BASE_URL = "https://app.base44.com"; diff --git a/tests/cli/connectors_pull.spec.ts b/tests/cli/connectors_pull.spec.ts index 1d1f33d6..2861c3bb 100644 --- a/tests/cli/connectors_pull.spec.ts +++ b/tests/cli/connectors_pull.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("connectors pull command", () => { diff --git a/tests/cli/connectors_push.spec.ts b/tests/cli/connectors_push.spec.ts index 2b35ee7f..4c9d9812 100644 --- a/tests/cli/connectors_push.spec.ts +++ b/tests/cli/connectors_push.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("connectors push command", () => { diff --git a/tests/cli/create.spec.ts b/tests/cli/create.spec.ts index 10fa5b42..dc444c52 100644 --- a/tests/cli/create.spec.ts +++ b/tests/cli/create.spec.ts @@ -1,5 +1,5 @@ import { join } from "node:path"; -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; describe("create command", () => { diff --git a/tests/cli/dashboard_open.spec.ts b/tests/cli/dashboard_open.spec.ts index d99b6225..41a0af4d 100644 --- a/tests/cli/dashboard_open.spec.ts +++ b/tests/cli/dashboard_open.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("dashboard open command", () => { diff --git a/tests/cli/deploy.spec.ts b/tests/cli/deploy.spec.ts index 6f429625..da68ae04 100644 --- a/tests/cli/deploy.spec.ts +++ b/tests/cli/deploy.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("deploy command (unified)", () => { diff --git a/tests/cli/eject.spec.ts b/tests/cli/eject.spec.ts index 75dfa57b..1a837e9a 100644 --- a/tests/cli/eject.spec.ts +++ b/tests/cli/eject.spec.ts @@ -3,7 +3,7 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import JSON5 from "json5"; import { create as tarCreate } from "tar"; -import { describe, expect, it } from "vitest"; +import { describe, expect, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; /** diff --git a/tests/cli/entities_push.spec.ts b/tests/cli/entities_push.spec.ts index 57e4bfad..40b16f1b 100644 --- a/tests/cli/entities_push.spec.ts +++ b/tests/cli/entities_push.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("entities push command", () => { diff --git a/tests/cli/functions_deploy.spec.ts b/tests/cli/functions_deploy.spec.ts index 00c4612d..6570830d 100644 --- a/tests/cli/functions_deploy.spec.ts +++ b/tests/cli/functions_deploy.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("functions deploy command", () => { diff --git a/tests/cli/link.spec.ts b/tests/cli/link.spec.ts index 80cc1d18..6f2a8677 100644 --- a/tests/cli/link.spec.ts +++ b/tests/cli/link.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("link command", () => { diff --git a/tests/cli/login.spec.ts b/tests/cli/login.spec.ts index 17bddb8e..f13d5242 100644 --- a/tests/cli/login.spec.ts +++ b/tests/cli/login.spec.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; describe("login command", () => { diff --git a/tests/cli/logout.spec.ts b/tests/cli/logout.spec.ts index 4e847ac3..d8335d92 100644 --- a/tests/cli/logout.spec.ts +++ b/tests/cli/logout.spec.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; describe("logout command", () => { diff --git a/tests/cli/site_deploy.spec.ts b/tests/cli/site_deploy.spec.ts index 4de0417f..dc0e1148 100644 --- a/tests/cli/site_deploy.spec.ts +++ b/tests/cli/site_deploy.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("site deploy command", () => { diff --git a/tests/cli/site_open.spec.ts b/tests/cli/site_open.spec.ts index cd10a4e4..80d94f75 100644 --- a/tests/cli/site_open.spec.ts +++ b/tests/cli/site_open.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("site open command", () => { diff --git a/tests/cli/testkit/CLITestkit.ts b/tests/cli/testkit/CLITestkit.ts index 1adda9c3..4a9d7515 100644 --- a/tests/cli/testkit/CLITestkit.ts +++ b/tests/cli/testkit/CLITestkit.ts @@ -3,7 +3,7 @@ import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import type { Command } from "commander"; import { dir } from "tmp-promise"; -import { vi } from "vitest"; +import { vi } from "bun:test"; import { Base44APIMock } from "./Base44APIMock.js"; import type { CLIResult } from "./CLIResultMatcher.js"; import { CLIResultMatcher } from "./CLIResultMatcher.js"; diff --git a/tests/cli/testkit/index.ts b/tests/cli/testkit/index.ts index 24ff6c6f..219025c1 100644 --- a/tests/cli/testkit/index.ts +++ b/tests/cli/testkit/index.ts @@ -1,6 +1,6 @@ import { resolve } from "node:path"; import { setupServer } from "msw/node"; -import { afterAll, afterEach, beforeAll, beforeEach } from "vitest"; +import { afterAll, afterEach, beforeAll, beforeEach } from "bun:test"; import type { CLIResult, CLIResultMatcher } from "./CLIResultMatcher.js"; import { CLITestkit } from "./CLITestkit.js"; diff --git a/tests/cli/types_generate.spec.ts b/tests/cli/types_generate.spec.ts index 4fb3ee4d..f0c64eed 100644 --- a/tests/cli/types_generate.spec.ts +++ b/tests/cli/types_generate.spec.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; describe("types generate command", () => { diff --git a/tests/cli/version-check.spec.ts b/tests/cli/version-check.spec.ts index 66cb8708..abda5727 100644 --- a/tests/cli/version-check.spec.ts +++ b/tests/cli/version-check.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; describe("upgrade notification", () => { diff --git a/tests/cli/whoami.spec.ts b/tests/cli/whoami.spec.ts index 793ed92b..cd2ef525 100644 --- a/tests/cli/whoami.spec.ts +++ b/tests/cli/whoami.spec.ts @@ -1,4 +1,4 @@ -import { describe, it } from "vitest"; +import { describe, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; describe("whoami command", () => { diff --git a/tests/core/agents.spec.ts b/tests/core/agents.spec.ts index 72b78db1..37b97cec 100644 --- a/tests/core/agents.spec.ts +++ b/tests/core/agents.spec.ts @@ -1,5 +1,5 @@ import { HTTPError } from "ky"; -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "bun:test"; import { pushAgents } from "../../src/core/resources/agent/api.js"; import type { AgentConfig } from "../../src/core/resources/agent/index.js"; diff --git a/tests/core/connectors.spec.ts b/tests/core/connectors.spec.ts index 426703a0..b877d13c 100644 --- a/tests/core/connectors.spec.ts +++ b/tests/core/connectors.spec.ts @@ -1,7 +1,7 @@ import { mkdtemp, readdir, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join, resolve } from "node:path"; -import { beforeEach, describe, expect, it, vi } from "vitest"; +import { beforeEach, describe, expect, it, vi } from "bun:test"; import { InvalidInputError } from "../../src/core/errors.js"; import { readAllConnectors, @@ -305,7 +305,7 @@ describe("pushConnectors", () => { it("returns empty results when no local or upstream connectors", async () => { const result = await pushConnectors([]); expect(result.results).toEqual([]); - expect(mockListConnectors).toHaveBeenCalledOnce(); + expect(mockListConnectors).toHaveBeenCalledTimes(1); }); it("syncs local connectors", async () => { diff --git a/tests/core/errors.spec.ts b/tests/core/errors.spec.ts index edb35a01..c291ea2f 100644 --- a/tests/core/errors.spec.ts +++ b/tests/core/errors.spec.ts @@ -1,4 +1,4 @@ -import { describe, expect, it } from "vitest"; +import { describe, expect, it } from "bun:test"; import { ApiError, AuthExpiredError, diff --git a/tests/core/project.spec.ts b/tests/core/project.spec.ts index 83214b76..ddb33083 100644 --- a/tests/core/project.spec.ts +++ b/tests/core/project.spec.ts @@ -1,5 +1,5 @@ import { resolve } from "node:path"; -import { describe, expect, it } from "vitest"; +import { describe, expect, it } from "bun:test"; import { readProjectConfig } from "@/core/project/index.js"; const FIXTURES_DIR = resolve(__dirname, "../fixtures"); From dc402c2dab301e87a4308e8f3a2f8dbe8c79ac30 Mon Sep 17 00:00:00 2001 From: Kfir Strikovsky Date: Thu, 19 Feb 2026 16:46:47 +0200 Subject: [PATCH 5/5] lint --- tests/cli/agents_pull.spec.ts | 2 +- tests/cli/agents_push.spec.ts | 2 +- tests/cli/authorization.spec.ts | 2 +- tests/cli/connectors_pull.spec.ts | 2 +- tests/cli/connectors_push.spec.ts | 2 +- tests/cli/create.spec.ts | 2 +- tests/cli/dashboard_open.spec.ts | 2 +- tests/cli/deploy.spec.ts | 2 +- tests/cli/eject.spec.ts | 2 +- tests/cli/entities_push.spec.ts | 2 +- tests/cli/functions_deploy.spec.ts | 2 +- tests/cli/link.spec.ts | 2 +- tests/cli/login.spec.ts | 2 +- tests/cli/logout.spec.ts | 2 +- tests/cli/site_deploy.spec.ts | 2 +- tests/cli/site_open.spec.ts | 2 +- tests/cli/testkit/CLITestkit.ts | 2 +- tests/cli/testkit/index.ts | 2 +- tests/cli/types_generate.spec.ts | 2 +- tests/cli/version-check.spec.ts | 2 +- tests/cli/whoami.spec.ts | 2 +- tests/core/agents.spec.ts | 2 +- tests/core/connectors.spec.ts | 2 +- tests/core/errors.spec.ts | 2 +- tests/core/project.spec.ts | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/tests/cli/agents_pull.spec.ts b/tests/cli/agents_pull.spec.ts index 6ecc28ce..f185f9db 100644 --- a/tests/cli/agents_pull.spec.ts +++ b/tests/cli/agents_pull.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("agents pull command", () => { const t = setupCLITests(); diff --git a/tests/cli/agents_push.spec.ts b/tests/cli/agents_push.spec.ts index 34a4cce3..ba43c2f5 100644 --- a/tests/cli/agents_push.spec.ts +++ b/tests/cli/agents_push.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("agents push command", () => { const t = setupCLITests(); diff --git a/tests/cli/authorization.spec.ts b/tests/cli/authorization.spec.ts index eb8d2c80..5284b595 100644 --- a/tests/cli/authorization.spec.ts +++ b/tests/cli/authorization.spec.ts @@ -1,6 +1,6 @@ import { HttpResponse, http } from "msw"; -import { describe, it } from "bun:test"; import { fixture, mswServer, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; const BASE_URL = "https://app.base44.com"; const APP_ID = "test-app-id"; diff --git a/tests/cli/connectors_pull.spec.ts b/tests/cli/connectors_pull.spec.ts index 2861c3bb..6cf8c809 100644 --- a/tests/cli/connectors_pull.spec.ts +++ b/tests/cli/connectors_pull.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("connectors pull command", () => { const t = setupCLITests(); diff --git a/tests/cli/connectors_push.spec.ts b/tests/cli/connectors_push.spec.ts index 4c9d9812..56c5a9a9 100644 --- a/tests/cli/connectors_push.spec.ts +++ b/tests/cli/connectors_push.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("connectors push command", () => { const t = setupCLITests(); diff --git a/tests/cli/create.spec.ts b/tests/cli/create.spec.ts index dc444c52..29ed02cf 100644 --- a/tests/cli/create.spec.ts +++ b/tests/cli/create.spec.ts @@ -1,6 +1,6 @@ import { join } from "node:path"; -import { describe, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("create command", () => { const t = setupCLITests(); diff --git a/tests/cli/dashboard_open.spec.ts b/tests/cli/dashboard_open.spec.ts index 41a0af4d..51f269a9 100644 --- a/tests/cli/dashboard_open.spec.ts +++ b/tests/cli/dashboard_open.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("dashboard open command", () => { const t = setupCLITests(); diff --git a/tests/cli/deploy.spec.ts b/tests/cli/deploy.spec.ts index da68ae04..fb3f2a36 100644 --- a/tests/cli/deploy.spec.ts +++ b/tests/cli/deploy.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("deploy command (unified)", () => { const t = setupCLITests(); diff --git a/tests/cli/eject.spec.ts b/tests/cli/eject.spec.ts index 1a837e9a..6282681a 100644 --- a/tests/cli/eject.spec.ts +++ b/tests/cli/eject.spec.ts @@ -3,8 +3,8 @@ import { tmpdir } from "node:os"; import { join } from "node:path"; import JSON5 from "json5"; import { create as tarCreate } from "tar"; -import { describe, expect, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, expect, it } from "bun:test"; /** * Creates a tar.gz buffer from a fixture directory. diff --git a/tests/cli/entities_push.spec.ts b/tests/cli/entities_push.spec.ts index 40b16f1b..2c57cb1d 100644 --- a/tests/cli/entities_push.spec.ts +++ b/tests/cli/entities_push.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("entities push command", () => { const t = setupCLITests(); diff --git a/tests/cli/functions_deploy.spec.ts b/tests/cli/functions_deploy.spec.ts index 6570830d..6e4d057a 100644 --- a/tests/cli/functions_deploy.spec.ts +++ b/tests/cli/functions_deploy.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("functions deploy command", () => { const t = setupCLITests(); diff --git a/tests/cli/link.spec.ts b/tests/cli/link.spec.ts index 6f2a8677..de9b4c66 100644 --- a/tests/cli/link.spec.ts +++ b/tests/cli/link.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("link command", () => { const t = setupCLITests(); diff --git a/tests/cli/login.spec.ts b/tests/cli/login.spec.ts index f13d5242..3ac87c29 100644 --- a/tests/cli/login.spec.ts +++ b/tests/cli/login.spec.ts @@ -1,5 +1,5 @@ -import { describe, expect, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; +import { describe, expect, it } from "bun:test"; describe("login command", () => { const t = setupCLITests(); diff --git a/tests/cli/logout.spec.ts b/tests/cli/logout.spec.ts index d8335d92..686c8b15 100644 --- a/tests/cli/logout.spec.ts +++ b/tests/cli/logout.spec.ts @@ -1,5 +1,5 @@ -import { describe, expect, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; +import { describe, expect, it } from "bun:test"; describe("logout command", () => { const t = setupCLITests(); diff --git a/tests/cli/site_deploy.spec.ts b/tests/cli/site_deploy.spec.ts index dc0e1148..3ffd6771 100644 --- a/tests/cli/site_deploy.spec.ts +++ b/tests/cli/site_deploy.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("site deploy command", () => { const t = setupCLITests(); diff --git a/tests/cli/site_open.spec.ts b/tests/cli/site_open.spec.ts index 80d94f75..3042c163 100644 --- a/tests/cli/site_open.spec.ts +++ b/tests/cli/site_open.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("site open command", () => { const t = setupCLITests(); diff --git a/tests/cli/testkit/CLITestkit.ts b/tests/cli/testkit/CLITestkit.ts index 4a9d7515..cb7650e7 100644 --- a/tests/cli/testkit/CLITestkit.ts +++ b/tests/cli/testkit/CLITestkit.ts @@ -3,10 +3,10 @@ import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import type { Command } from "commander"; import { dir } from "tmp-promise"; -import { vi } from "bun:test"; import { Base44APIMock } from "./Base44APIMock.js"; import type { CLIResult } from "./CLIResultMatcher.js"; import { CLIResultMatcher } from "./CLIResultMatcher.js"; +import { vi } from "bun:test"; const __dirname = dirname(fileURLToPath(import.meta.url)); const DIST_INDEX_PATH = join(__dirname, "../../../dist/cli/index.js"); diff --git a/tests/cli/testkit/index.ts b/tests/cli/testkit/index.ts index 219025c1..ed079fb6 100644 --- a/tests/cli/testkit/index.ts +++ b/tests/cli/testkit/index.ts @@ -1,8 +1,8 @@ import { resolve } from "node:path"; import { setupServer } from "msw/node"; -import { afterAll, afterEach, beforeAll, beforeEach } from "bun:test"; import type { CLIResult, CLIResultMatcher } from "./CLIResultMatcher.js"; import { CLITestkit } from "./CLITestkit.js"; +import { afterAll, afterEach, beforeAll, beforeEach } from "bun:test"; const FIXTURES_DIR = resolve(__dirname, "../../fixtures"); diff --git a/tests/cli/types_generate.spec.ts b/tests/cli/types_generate.spec.ts index f0c64eed..9a937cd9 100644 --- a/tests/cli/types_generate.spec.ts +++ b/tests/cli/types_generate.spec.ts @@ -1,5 +1,5 @@ -import { describe, expect, it } from "bun:test"; import { fixture, setupCLITests } from "./testkit/index.js"; +import { describe, expect, it } from "bun:test"; describe("types generate command", () => { const t = setupCLITests(); diff --git a/tests/cli/version-check.spec.ts b/tests/cli/version-check.spec.ts index abda5727..8b469ef6 100644 --- a/tests/cli/version-check.spec.ts +++ b/tests/cli/version-check.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("upgrade notification", () => { const t = setupCLITests(); diff --git a/tests/cli/whoami.spec.ts b/tests/cli/whoami.spec.ts index cd2ef525..9052a78d 100644 --- a/tests/cli/whoami.spec.ts +++ b/tests/cli/whoami.spec.ts @@ -1,5 +1,5 @@ -import { describe, it } from "bun:test"; import { setupCLITests } from "./testkit/index.js"; +import { describe, it } from "bun:test"; describe("whoami command", () => { const t = setupCLITests(); diff --git a/tests/core/agents.spec.ts b/tests/core/agents.spec.ts index 37b97cec..2ee00a78 100644 --- a/tests/core/agents.spec.ts +++ b/tests/core/agents.spec.ts @@ -1,7 +1,7 @@ import { HTTPError } from "ky"; -import { beforeEach, describe, expect, it, vi } from "bun:test"; import { pushAgents } from "../../src/core/resources/agent/api.js"; import type { AgentConfig } from "../../src/core/resources/agent/index.js"; +import { beforeEach, describe, expect, it, vi } from "bun:test"; const mockPut = vi.fn(); vi.mock("../../src/core/clients/index.js", () => ({ diff --git a/tests/core/connectors.spec.ts b/tests/core/connectors.spec.ts index b877d13c..a72fe300 100644 --- a/tests/core/connectors.spec.ts +++ b/tests/core/connectors.spec.ts @@ -1,7 +1,6 @@ import { mkdtemp, readdir, readFile, rm, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join, resolve } from "node:path"; -import { beforeEach, describe, expect, it, vi } from "bun:test"; import { InvalidInputError } from "../../src/core/errors.js"; import { readAllConnectors, @@ -9,6 +8,7 @@ import { } from "../../src/core/resources/connector/config.js"; import { pushConnectors } from "../../src/core/resources/connector/push.js"; import type { ConnectorResource } from "../../src/core/resources/connector/schema.js"; +import { beforeEach, describe, expect, it, vi } from "bun:test"; const mockListConnectors = vi.fn(); const mockSetConnector = vi.fn(); diff --git a/tests/core/errors.spec.ts b/tests/core/errors.spec.ts index c291ea2f..ee00ff90 100644 --- a/tests/core/errors.spec.ts +++ b/tests/core/errors.spec.ts @@ -1,4 +1,3 @@ -import { describe, expect, it } from "bun:test"; import { ApiError, AuthExpiredError, @@ -16,6 +15,7 @@ import { isUserError, SchemaValidationError, } from "../../src/core/errors.js"; +import { describe, expect, it } from "bun:test"; describe("CLIError base class", () => { it("has correct properties on UserError subclass", () => { diff --git a/tests/core/project.spec.ts b/tests/core/project.spec.ts index ddb33083..958651fd 100644 --- a/tests/core/project.spec.ts +++ b/tests/core/project.spec.ts @@ -1,6 +1,6 @@ import { resolve } from "node:path"; -import { describe, expect, it } from "bun:test"; import { readProjectConfig } from "@/core/project/index.js"; +import { describe, expect, it } from "bun:test"; const FIXTURES_DIR = resolve(__dirname, "../fixtures");