diff --git a/packages/shared-lib-blitz-next/package.json b/packages/shared-lib-blitz-next/package.json index eb3970cf..cfcff754 100644 --- a/packages/shared-lib-blitz-next/package.json +++ b/packages/shared-lib-blitz-next/package.json @@ -43,7 +43,7 @@ "@willbooster/eslint-config-ts": "10.5.1", "@willbooster/prettier-config": "9.1.2", "blitz": "2.0.0-beta.34", - "build-ts": "11.0.6", + "build-ts": "11.0.9", "eslint": "8.52.0", "eslint-config-prettier": "9.0.0", "eslint-import-resolver-typescript": "3.6.1", diff --git a/packages/shared-lib-node/package.json b/packages/shared-lib-node/package.json index c42d06ce..d60bf35b 100644 --- a/packages/shared-lib-node/package.json +++ b/packages/shared-lib-node/package.json @@ -47,7 +47,7 @@ "@typescript-eslint/parser": "6.9.0", "@willbooster/eslint-config-ts": "10.5.1", "@willbooster/prettier-config": "9.1.2", - "build-ts": "11.0.6", + "build-ts": "11.0.9", "eslint": "8.52.0", "eslint-config-prettier": "9.0.0", "eslint-import-resolver-typescript": "3.6.1", diff --git a/packages/shared-lib-node/src/env.ts b/packages/shared-lib-node/src/env.ts index f2ada47e..9cd6a831 100644 --- a/packages/shared-lib-node/src/env.ts +++ b/packages/shared-lib-node/src/env.ts @@ -1,15 +1,8 @@ +import fs from 'node:fs'; import path from 'node:path'; import { config } from 'dotenv'; - -interface Options { - env?: (string | number)[]; - cascadeEnv?: string; - cascadeNodeEnv?: boolean; - autoCascadeEnv?: boolean; - checkEnv?: string; - verbose?: boolean; -} +import type { ArgumentsCamelCase, InferredOptionTypes } from 'yargs'; export const yargsOptionsBuilderForEnv = { env: { @@ -30,18 +23,34 @@ export const yargsOptionsBuilderForEnv = { type: 'boolean', default: true, }, + 'include-root-env': { + description: 'Include .env files in root directory if the project is in a monorepo and --env option is not used.', + type: 'boolean', + default: true, + }, 'check-env': { description: 'Check whether the keys of the loaded .env files are same with the given .env file.', type: 'string', default: '.env.example', }, + verbose: { + description: 'Whether to show verbose information', + type: 'boolean', + alias: 'v', + }, } as const; +export type EnvReaderOptions = Partial>>; + /** - * This function loads environment variables from `.env` files. + * This function reads environment variables from `.env` files. Note it does not assign them in `process.env`. * */ -export function loadEnvironmentVariables(argv: Options, cwd: string, orgCwd?: string): Record { - let envPaths = (argv.env ?? []).map((envPath) => path.resolve(orgCwd ?? cwd, envPath.toString())); +export function readEnvironmentVariables( + argv: EnvReaderOptions, + cwd: string, + cacheEnabled = true +): Record { + let envPaths = (argv.env ?? []).map((envPath) => path.resolve(cwd, envPath.toString())); const cascade = argv.cascadeEnv ?? (argv.cascadeNodeEnv @@ -50,7 +59,15 @@ export function loadEnvironmentVariables(argv: Options, cwd: string, orgCwd?: st ? process.env.WB_ENV || process.env.NODE_ENV || 'development' : undefined); if (typeof cascade === 'string') { - if (envPaths.length === 0) envPaths.push(path.join(cwd, '.env')); + if (envPaths.length === 0) { + envPaths.push(path.join(cwd, '.env')); + if (argv.includeRootEnv) { + const rootPath = path.resolve(cwd, '..', '..'); + if (fs.existsSync(path.join(rootPath, 'package.json'))) { + envPaths.push(path.join(rootPath, '.env')); + } + } + } envPaths = envPaths.flatMap((envPath) => cascade ? [`${envPath}.${cascade}.local`, `${envPath}.local`, `${envPath}.${cascade}`, envPath] @@ -60,13 +77,13 @@ export function loadEnvironmentVariables(argv: Options, cwd: string, orgCwd?: st envPaths = envPaths.map((envPath) => path.relative(cwd, envPath)); if (argv.verbose) { console.info(`WB_ENV: ${process.env.WB_ENV}, NODE_ENV: ${process.env.NODE_ENV}`); - console.info('Loading env files:', envPaths); + console.info('Reading env files:', envPaths); } let envVars: Record = {}; const orgEnvVars = { ...process.env }; for (const envPath of envPaths) { - envVars = { ...config({ path: path.join(cwd, envPath) }).parsed, ...envVars }; + envVars = { ...readEnvFile(path.join(cwd, envPath), cacheEnabled), ...envVars }; let count = 0; for (const [key, value] of Object.entries(envVars)) { if (orgEnvVars[key] !== value) { @@ -75,12 +92,12 @@ export function loadEnvironmentVariables(argv: Options, cwd: string, orgCwd?: st } } if (count > 0) { - console.info(`Loaded ${count} environment variables:`, envPath); + console.info(`Read ${count} environment variables:`, envPath); } } if (argv.checkEnv) { - const exampleKeys = Object.keys(config({ path: path.join(cwd, argv.checkEnv) }).parsed || {}); + const exampleKeys = Object.keys(readEnvFile(path.join(cwd, argv.checkEnv), cacheEnabled) || {}); const missingKeys = exampleKeys.filter((key) => !(key in envVars)); if (missingKeys.length > 0) { throw new Error(`Missing environment variables in [${envPaths.join(', ')}]: [${missingKeys.join(', ')}]`); @@ -89,6 +106,32 @@ export function loadEnvironmentVariables(argv: Options, cwd: string, orgCwd?: st return envVars; } +/** + * This function read environment variables from `.env` files and assign them in `process.env`. + * */ +export function readAndApplyEnvironmentVariables( + argv: EnvReaderOptions, + cwd: string, + cacheEnabled = true +): Record { + const envVars = readEnvironmentVariables(argv, cwd, cacheEnabled); + Object.assign(process.env, envVars); + return envVars; +} + +const cachedEnvVars = new Map>(); + +function readEnvFile(filePath: string, cacheEnabled = true): Record { + const cached = cacheEnabled && cachedEnvVars.get(filePath); + if (cached) return cached; + + const parsed = config({ path: path.resolve(filePath), processEnv: {} }).parsed ?? {}; + if (cacheEnabled) { + cachedEnvVars.set(filePath, parsed); + } + return parsed; +} + /** * This function removes environment variables related to npm and yarn from the given environment variables. * */ diff --git a/packages/shared-lib-node/src/index.ts b/packages/shared-lib-node/src/index.ts index 0e6bf274..19110a4a 100644 --- a/packages/shared-lib-node/src/index.ts +++ b/packages/shared-lib-node/src/index.ts @@ -1,4 +1,10 @@ -export { loadEnvironmentVariables, removeNpmAndYarnEnvironmentVariables, yargsOptionsBuilderForEnv } from './env.js'; +export { + readEnvironmentVariables, + readAndApplyEnvironmentVariables, + removeNpmAndYarnEnvironmentVariables, + yargsOptionsBuilderForEnv, +} from './env.js'; +export type { EnvReaderOptions } from './env.js'; export { existsAsync } from './exists.js'; export { calculateHashFromFiles, canSkipSeed, updateHashFromFiles } from './hash.js'; export { spawnAsync } from './spawn.js'; diff --git a/packages/shared-lib-node/tests/env.test.ts b/packages/shared-lib-node/tests/env.test.ts index d0c98f7d..9f527a13 100644 --- a/packages/shared-lib-node/tests/env.test.ts +++ b/packages/shared-lib-node/tests/env.test.ts @@ -1,47 +1,46 @@ import { beforeEach, describe, expect, it } from 'vitest'; -import { loadEnvironmentVariables } from '../src/env.js'; +import { readAndApplyEnvironmentVariables } from '../src/env.js'; -describe('loadEnvironmentVariables()', () => { +describe('readAndApplyEnvironmentVariables()', () => { beforeEach(() => { process.env.WB_ENV = ''; process.env.NODE_ENV = ''; }); it('should load no env vars with empty options', () => { - const envVars = loadEnvironmentVariables({}, 'test-fixtures/app1'); + const envVars = readAndApplyEnvironmentVariables({}, 'test-fixtures/app1'); expect(envVars).toEqual({}); }); it('should load env vars with --auto-cascade-env', () => { - const envVars = loadEnvironmentVariables({ autoCascadeEnv: true }, 'test-fixtures/app1'); + const envVars = readAndApplyEnvironmentVariables({ autoCascadeEnv: true }, 'test-fixtures/app1'); expect(envVars).toEqual({ NAME: 'app1', ENV: 'development1' }); }); it('should load env vars with --cascade-env=production', () => { - const envVars = loadEnvironmentVariables({ cascadeEnv: 'production', env: ['.env'] }, 'test-fixtures/app1'); + const envVars = readAndApplyEnvironmentVariables({ cascadeEnv: 'production', env: ['.env'] }, 'test-fixtures/app1'); expect(envVars).toEqual({ NAME: 'app1', ENV: 'production1' }); }); it('should load env vars with --cascade-node-env and NODE_ENV=""', () => { process.env.NODE_ENV = ''; - const envVars = loadEnvironmentVariables({ cascadeNodeEnv: true, env: ['.env'] }, 'test-fixtures/app1'); + const envVars = readAndApplyEnvironmentVariables({ cascadeNodeEnv: true, env: ['.env'] }, 'test-fixtures/app1'); expect(envVars).toEqual({ NAME: 'app1', ENV: 'development1' }); }); it('should load env vars with --cascade-node-env and NODE_ENV=test', () => { process.env.NODE_ENV = 'test'; - const envVars = loadEnvironmentVariables({ cascadeNodeEnv: true, env: ['.env'] }, 'test-fixtures/app1'); + const envVars = readAndApplyEnvironmentVariables({ cascadeNodeEnv: true, env: ['.env'] }, 'test-fixtures/app1'); expect(envVars).toEqual({ NAME: 'app1', ENV: 'test1' }); }); it('should load env vars with --env=test-fixtures/app2/.env --auto-cascade-env, WB_ENV=test and NODE_ENV=production', () => { process.env.WB_ENV = 'test'; process.env.NODE_ENV = 'production'; - const envVars = loadEnvironmentVariables( - { autoCascadeEnv: true, env: ['.env'] }, - 'test-fixtures/app1', - 'test-fixtures/app2' + const envVars = readAndApplyEnvironmentVariables( + { autoCascadeEnv: true, env: ['../app2/.env'] }, + 'test-fixtures/app1' ); expect(envVars).toEqual({ NAME: 'app2', ENV: 'test2' }); }); diff --git a/packages/shared-lib-react/package.json b/packages/shared-lib-react/package.json index 8b781175..95bf7f59 100644 --- a/packages/shared-lib-react/package.json +++ b/packages/shared-lib-react/package.json @@ -35,14 +35,14 @@ "devDependencies": { "@babel/core": "7.23.2", "@mdx-js/react": "3.0.0", - "@storybook/addon-actions": "7.5.1", - "@storybook/addon-docs": "7.5.1", - "@storybook/addon-essentials": "7.5.1", - "@storybook/addon-interactions": "7.5.1", - "@storybook/addon-links": "7.5.1", + "@storybook/addon-actions": "7.5.2", + "@storybook/addon-docs": "7.5.2", + "@storybook/addon-essentials": "7.5.2", + "@storybook/addon-interactions": "7.5.2", + "@storybook/addon-links": "7.5.2", "@storybook/builder-webpack4": "6.5.16", "@storybook/manager-webpack4": "6.5.16", - "@storybook/react": "7.5.1", + "@storybook/react": "7.5.2", "@storybook/testing-library": "0.2.2", "@types/eslint": "8.44.6", "@types/micromatch": "4.0.4", @@ -53,7 +53,7 @@ "@willbooster/eslint-config-ts-react": "10.1.9", "@willbooster/prettier-config": "9.1.2", "babel-loader": "9.1.3", - "build-ts": "11.0.6", + "build-ts": "11.0.9", "eslint": "8.52.0", "eslint-config-prettier": "9.0.0", "eslint-import-resolver-typescript": "3.6.1", diff --git a/packages/shared-lib/package.json b/packages/shared-lib/package.json index d3b379dc..b5997bd4 100644 --- a/packages/shared-lib/package.json +++ b/packages/shared-lib/package.json @@ -42,7 +42,7 @@ "@typescript-eslint/parser": "6.9.0", "@willbooster/eslint-config-ts": "10.5.1", "@willbooster/prettier-config": "9.1.2", - "build-ts": "11.0.6", + "build-ts": "11.0.9", "eslint": "8.52.0", "eslint-config-prettier": "9.0.0", "eslint-import-resolver-typescript": "3.6.1", diff --git a/packages/wb/package.json b/packages/wb/package.json index e97e57ef..94881530 100644 --- a/packages/wb/package.json +++ b/packages/wb/package.json @@ -39,7 +39,8 @@ "@typescript-eslint/parser": "6.9.0", "@willbooster/eslint-config-ts": "10.5.1", "@willbooster/prettier-config": "9.1.2", - "build-ts": "11.0.6", + "at-decorators": "1.2.2", + "build-ts": "11.0.9", "eslint": "8.52.0", "eslint-config-prettier": "9.0.0", "eslint-import-resolver-typescript": "3.6.1", diff --git a/packages/wb/src/commands/buildIfNeeded.ts b/packages/wb/src/commands/buildIfNeeded.ts index 6a5996e5..5d9a4142 100644 --- a/packages/wb/src/commands/buildIfNeeded.ts +++ b/packages/wb/src/commands/buildIfNeeded.ts @@ -8,7 +8,9 @@ import { ignoreEnoentAsync } from '@willbooster/shared-lib/src'; import chalk from 'chalk'; import type { ArgumentsCamelCase, CommandModule, InferredOptionTypes } from 'yargs'; -import { project } from '../project.js'; +import type { Project } from '../project.js'; +import { findSelfProject } from '../project.js'; +import type { sharedOptionsBuilder } from '../sharedOptionsBuilder.js'; const builder = { command: { @@ -28,22 +30,42 @@ export const buildIfNeededCommand: CommandModule>>): boolean { + console.info(chalk.green(`Run '${argv.command}'`)); + if (!argv.dryRun) { + const ret = child_process.spawnSync(argv.command ?? '', { + cwd: project.dirPath, + shell: true, + stdio: 'inherit', + }); + if (ret.status !== 0) { + process.exitCode = ret.status ?? 1; + return false; + } + } + return true; +} + export async function buildIfNeeded( // Test code requires Partial<...> - argv: Partial>> + argv: Partial>>, + projectPathForTesting?: string ): Promise { + const project = await findSelfProject(argv, projectPathForTesting); + if (!project) return true; + if (!fs.existsSync(path.join(project.rootDirPath, '.git'))) { - build(argv); + build(project, argv); return true; } - const [canSkip, cacheFilePath, contentHash] = await canSkipBuild(argv); + const [canSkip, cacheFilePath, contentHash] = await canSkipBuild(project, argv); if (canSkip) { console.info(chalk.green(`Skip to run '${argv.command}' 💫`)); return false; } - if (!build(argv)) return; + if (!build(project, argv)) return; if (!argv.dryRun) { await fs.promises.writeFile(cacheFilePath, contentHash, 'utf8'); @@ -51,25 +73,10 @@ export async function buildIfNeeded( return true; } -function build(argv: Partial>>): boolean { - console.info(chalk.green(`Run '${argv.command}'`)); - if (!argv.dryRun) { - const ret = child_process.spawnSync(argv.command ?? '', { - cwd: project.dirPath, - shell: true, - stdio: 'inherit', - }); - if (ret.status !== 0) { - process.exitCode = ret.status ?? 1; - return false; - } - } - return true; -} - const ignoringEnvVarNames = new Set(['CI', 'PWDEBUG', 'TMPDIR']); export async function canSkipBuild( + project: Project, argv: Partial>> ): Promise<[boolean, string, string]> { const cacheDirectoryPath = path.resolve(project.dirPath, 'node_modules', '.cache', 'build'); @@ -82,13 +89,13 @@ export async function canSkipBuild( hash.update(commitHash); const environmentJson = JSON.stringify( - Object.entries(process.env) + Object.entries(project.env) .filter(([key]) => !ignoringEnvVarNames.has(key)) .sort(([key1], [key2]) => key1.localeCompare(key2)) ); hash.update(environmentJson); - await updateHashWithDiffResult(argv, hash); + await updateHashWithDiffResult(project, argv, hash); const contentHash = hash.digest('hex'); const cachedContentHash = await ignoreEnoentAsync(() => fs.promises.readFile(cacheFilePath, 'utf8')); @@ -112,6 +119,7 @@ const includeSuffix = [ const excludePatterns = ['test/', 'tests/', '__tests__/', 'test-fixtures/', 'package.json']; async function updateHashWithDiffResult( + project: Project, argv: Partial>>, hash: Hash ): Promise { @@ -125,7 +133,7 @@ async function updateHashWithDiffResult( .trim() .split('\n') .map((filePath) => - process.env.WB_ENV === 'test' ? filePath.replace(/packages\/scripts\/test-fixtures\/[^/]+\//, '') : filePath + project.env.WB_ENV === 'test' ? filePath.replace(/packages\/scripts\/test-fixtures\/[^/]+\//, '') : filePath ); const filteredFilePaths = filePaths.filter( (filePath) => diff --git a/packages/wb/src/commands/commandUtils.ts b/packages/wb/src/commands/commandUtils.ts new file mode 100644 index 00000000..d76d51e9 --- /dev/null +++ b/packages/wb/src/commands/commandUtils.ts @@ -0,0 +1,9 @@ +import type { Project } from '../project.js'; + +export function* prepareForRunningCommand(commandName: string, projects: Project[]): Generator { + for (const project of projects) { + console.info(`Running "${commandName}" for ${project.name} ...`); + + yield project; + } +} diff --git a/packages/wb/src/commands/optimizeForDockerBuild.ts b/packages/wb/src/commands/optimizeForDockerBuild.ts index 6b3b4e9b..601ec46c 100644 --- a/packages/wb/src/commands/optimizeForDockerBuild.ts +++ b/packages/wb/src/commands/optimizeForDockerBuild.ts @@ -5,7 +5,9 @@ import path from 'node:path'; import type { PackageJson } from 'type-fest'; import type { CommandModule, InferredOptionTypes } from 'yargs'; -import { project } from '../project.js'; +import { findAllProjects } from '../project.js'; + +import { prepareForRunningCommand } from './commandUtils.js'; const builder = { outside: { @@ -20,25 +22,15 @@ export const optimizeForDockerBuildCommand: CommandModule> describe: 'Apply migration to DB without initializing it', builder, async handler(argv) { - await runWithSpawn(prismaScripts.deploy(), argv); + const allProjects = await findPrismaProjects(argv); + for (const project of prepareForRunningCommand('prisma deploy', allProjects)) { + await runWithSpawn(prismaScripts.deploy(project), project, argv); + } }, }; @@ -51,7 +58,10 @@ const deployForceCommand: CommandModule describe: 'Apply migration to DB with initializing it', builder, async handler(argv) { - await runWithSpawn(prismaScripts.migrate(), argv); + const allProjects = await findPrismaProjects(argv); + for (const project of prepareForRunningCommand('prisma migrate', allProjects)) { + await runWithSpawn(prismaScripts.migrate(project), project, argv); + } }, }; @@ -78,7 +94,10 @@ const migrateDevCommand: CommandModule> describe: 'Reset DB', builder, async handler(argv) { - await runWithSpawn(prismaScripts.reset(), argv); + const allProjects = await findPrismaProjects(argv); + for (const project of prepareForRunningCommand('prisma reset', allProjects)) { + await runWithSpawn(prismaScripts.reset(project), project, argv); + } }, }; @@ -104,9 +126,13 @@ const restoreCommand: CommandModule { + const projects = await findAllProjects(argv); + if (!projects) return []; + + return projects.all.filter( + (project) => project.packageJson.dependencies?.['prisma'] || project.packageJson.devDependencies?.['prisma'] + ); +} diff --git a/packages/wb/src/commands/retry.ts b/packages/wb/src/commands/retry.ts index 8bd678ca..2c4b60c8 100644 --- a/packages/wb/src/commands/retry.ts +++ b/packages/wb/src/commands/retry.ts @@ -1,7 +1,9 @@ import chalk from 'chalk'; import type { CommandModule, InferredOptionTypes } from 'yargs'; +import { findSelfProject } from '../project.js'; import { runWithSpawn } from '../scripts/run.js'; +import type { sharedOptionsBuilder } from '../sharedOptionsBuilder.js'; const builder = { retry: { @@ -12,11 +14,14 @@ const builder = { }, } as const; -export const retryCommand: CommandModule> = { +export const retryCommand: CommandModule> = { command: 'retry', describe: 'Retry the given command until it succeeds', builder, async handler(argv) { + const project = findSelfProject(argv); + if (!project) return; + const cmdAndArgs = argv._.slice(1); let lastStatus = 0; for (let i = 0; i < argv.retry; i++) { @@ -24,7 +29,7 @@ export const retryCommand: CommandModule> = { @@ -20,51 +22,62 @@ export const setupCommand: CommandModule -export async function setup(argv: Partial>>): Promise { - const dirents = await fs.readdir(project.dirPath, { withFileTypes: true }); - if (dirents.some((d) => d.isFile() && d.name.includes('-version'))) { - await runWithSpawn('asdf install', argv); - } - if (dirents.some((d) => d.isFile() && d.name === 'pyproject.toml')) { - await runWithSpawnInParallel('poetry config virtualenvs.in-project true', argv); - await runWithSpawnInParallel('poetry config virtualenvs.prefer-active-python true', argv); - const [, version] = child_process.execSync('asdf current python').toString().trim().split(/\s+/); - await runWithSpawnInParallel(`poetry env use ${version}`, argv); - await promisePool.promiseAll(); - await runWithSpawn('poetry run pip install --upgrade pip', argv); - await runWithSpawn('poetry install --ansi', argv); - } +export async function setup( + argv: Partial>>, + projectPathForTesting?: string +): Promise { + const projects = await findAllProjects(argv, projectPathForTesting); + if (!projects) return; + + for (const project of prepareForRunningCommand('setup', projects.all)) { + const dirents = await fs.readdir(project.dirPath, { withFileTypes: true }); + if (project === projects.root) { + if (os.platform() === 'darwin') { + const packages = ['pstree']; + if (project.hasDockerfile) { + packages.push('expect'); + } + await runWithSpawnInParallel(`brew install ${packages.join(' ')}`, project, argv); + } - if (os.platform() === 'darwin') { - const packages = ['pstree']; - if (project.hasDockerfile) { - packages.push('expect'); + if (dirents.some((d) => d.isFile() && d.name.includes('-version'))) { + await runWithSpawn('asdf install', project, argv); + } } - await runWithSpawnInParallel(`brew install ${packages.join(' ')}`, argv); - } - const deps = project.packageJson.dependencies ?? {}; - const devDeps = project.packageJson.devDependencies || {}; - const scripts = project.packageJson.scripts ?? {}; - const newDeps: string[] = []; - const newDevDeps: string[] = []; - if (deps['blitz'] || deps['next']) { - newDeps.push('pm2'); - newDevDeps.push('concurrently', 'open-cli', 'vitest', 'wait-on'); - } else if (devDeps['@remix-run/dev']) { - newDeps.push('pm2'); - newDevDeps.push('concurrently', 'open-cli', 'vitest', 'wait-on'); - } else if (deps['express'] || deps['fastify']) { - newDeps.push('pm2'); - newDevDeps.push('concurrently', 'vitest', 'wait-on'); - } - if (newDeps.length > 0) { - await runWithSpawn(`yarn add ${newDeps.join(' ')}`, argv); - } - if (newDevDeps.length > 0) { - await runWithSpawn(`yarn add -D ${newDevDeps.join(' ')}`, argv); - } - if (scripts['gen-code']) { - await runWithSpawn('yarn gen-code', argv); + if (dirents.some((d) => d.isFile() && d.name === 'pyproject.toml')) { + await runWithSpawnInParallel('poetry config virtualenvs.in-project true', project, argv); + await runWithSpawnInParallel('poetry config virtualenvs.prefer-active-python true', project, argv); + const [, version] = child_process.execSync('asdf current python').toString().trim().split(/\s+/); + await runWithSpawnInParallel(`poetry env use ${version}`, project, argv); + await promisePool.promiseAll(); + await runWithSpawn('poetry run pip install --upgrade pip', project, argv); + await runWithSpawn('poetry install --ansi', project, argv); + } + + const deps = project.packageJson.dependencies ?? {}; + const devDeps = project.packageJson.devDependencies || {}; + const scripts = project.packageJson.scripts ?? {}; + const newDeps: string[] = []; + const newDevDeps: string[] = []; + if (deps['blitz'] || deps['next']) { + newDeps.push('pm2'); + newDevDeps.push('concurrently', 'open-cli', 'vitest', 'wait-on'); + } else if (devDeps['@remix-run/dev']) { + newDeps.push('pm2'); + newDevDeps.push('concurrently', 'open-cli', 'vitest', 'wait-on'); + } else if (deps['express'] || deps['fastify']) { + newDeps.push('pm2'); + newDevDeps.push('concurrently', 'vitest', 'wait-on'); + } + if (newDeps.length > 0) { + await runWithSpawn(`yarn add ${newDeps.join(' ')}`, project, argv); + } + if (newDevDeps.length > 0) { + await runWithSpawn(`yarn add -D ${newDevDeps.join(' ')}`, project, argv); + } + if (scripts['gen-code']) { + await runWithSpawn('yarn gen-code', project, argv); + } } } diff --git a/packages/wb/src/commands/start.ts b/packages/wb/src/commands/start.ts index 968584e0..97b070dd 100644 --- a/packages/wb/src/commands/start.ts +++ b/packages/wb/src/commands/start.ts @@ -1,7 +1,7 @@ -import { loadEnvironmentVariables } from '@willbooster/shared-lib-node/src'; import type { CommandModule, InferredOptionTypes } from 'yargs'; -import { project } from '../project.js'; +import type { Project } from '../project.js'; +import { findAllProjects } from '../project.js'; import { normalizeArgs, scriptOptionsBuilder } from '../scripts/builder.js'; import type { BaseExecutionScripts } from '../scripts/execution/baseExecutionScripts.js'; import { blitzScripts } from '../scripts/execution/blitzScripts.js'; @@ -28,59 +28,62 @@ export const startCommand: CommandModule, - deps: Partial>, - env: string -): string { - process.env.WB_ENV ||= env; - let prefix = `WB_ENV=${process.env.WB_ENV} `; +function configureEnvironmentVariables(project: Project, deps: Partial>, wbEnv: string): string { + project.env.WB_ENV ||= wbEnv; + let prefix = `WB_ENV=${project.env.WB_ENV} `; if (deps['next']) { - process.env.NEXT_PUBLIC_WB_ENV = process.env.WB_ENV; - prefix += `NEXT_PUBLIC_WB_ENV=${process.env.WB_ENV} `; + project.env.NEXT_PUBLIC_WB_ENV = project.env.WB_ENV; + prefix += `NEXT_PUBLIC_WB_ENV=${project.env.WB_ENV} `; } - loadEnvironmentVariables(argv, project.dirPath); return prefix; } diff --git a/packages/wb/src/commands/test.ts b/packages/wb/src/commands/test.ts index 1878ff40..f846d0bc 100644 --- a/packages/wb/src/commands/test.ts +++ b/packages/wb/src/commands/test.ts @@ -3,7 +3,8 @@ import path from 'node:path'; import { existsAsync } from '@willbooster/shared-lib-node/src'; import type { ArgumentsCamelCase, CommandModule, InferredOptionTypes } from 'yargs'; -import { project } from '../project.js'; +import type { Project } from '../project.js'; +import { findAllProjects } from '../project.js'; import { promisePool } from '../promisePool.js'; import { dockerScripts } from '../scripts/dockerScripts.js'; import type { BaseExecutionScripts } from '../scripts/execution/baseExecutionScripts.js'; @@ -12,7 +13,8 @@ import { httpServerScripts } from '../scripts/execution/httpServerScripts.js'; import { nextScripts } from '../scripts/execution/nextScripts.js'; import { plainAppScripts } from '../scripts/execution/plainAppScripts.js'; import { remixScripts } from '../scripts/execution/remixScripts.js'; -import { runOnEachWorkspaceIfNeeded, runWithSpawn, runWithSpawnInParallel } from '../scripts/run.js'; +import { runWithSpawn, runWithSpawnInParallel } from '../scripts/run.js'; +import type { sharedOptionsBuilder } from '../sharedOptionsBuilder.js'; const builder = { ci: { @@ -38,7 +40,7 @@ const builder = { }, } as const; -export const testCommand: CommandModule> = { +export const testCommand: CommandModule> = { command: 'test', describe: 'Test project', builder, @@ -47,124 +49,153 @@ export const testCommand: CommandModule>): Promise { - process.env['FORCE_COLOR'] = '3'; - await runOnEachWorkspaceIfNeeded(argv); +export async function test( + argv: ArgumentsCamelCase> +): Promise { + const projects = await findAllProjects(argv); + if (!projects) return; - const deps = project.packageJson.dependencies || {}; - const devDeps = project.packageJson.devDependencies || {}; - let scripts: BaseExecutionScripts; - if (deps['blitz']) { - scripts = blitzScripts; - } else if (deps['next']) { - scripts = nextScripts; - } else if (devDeps['@remix-run/dev']) { - scripts = remixScripts; - } else if ((deps['express'] || deps['fastify']) && !deps['firebase-functions']) { - scripts = httpServerScripts; - } else { - scripts = plainAppScripts; - } + for (const project of projects.all) { + const deps = project.packageJson.dependencies || {}; + const devDeps = project.packageJson.devDependencies || {}; + let scripts: BaseExecutionScripts; + if (deps['blitz']) { + scripts = blitzScripts; + } else if (deps['next']) { + scripts = nextScripts; + } else if (devDeps['@remix-run/dev']) { + scripts = remixScripts; + } else if ((deps['express'] || deps['fastify']) && !deps['firebase-functions']) { + scripts = httpServerScripts; + } else { + scripts = plainAppScripts; + } - const promises: Promise[] = []; - if (argv.ci) { - const unitTestsExistPromise = existsAsync(path.join(project.dirPath, 'tests', 'unit')); - const e2eTestsExistPromise = existsAsync(path.join(project.dirPath, 'tests', 'e2e')); + console.info(`Running "test" for ${project.name} ...`); - await runWithSpawnInParallel(dockerScripts.stopAll(), argv); - if (argv.unit !== false && (await unitTestsExistPromise)) { - await runWithSpawnInParallel(scripts.testUnit(argv), argv, { timeout: argv.unitTimeout }); - } - if (argv.start !== false) { - await runWithSpawnInParallel(scripts.testStart(argv), argv); - } - await promisePool.promiseAll(); - // Check playwright installation because --ci includes --e2e implicitly - if (argv.e2e !== 'none' && (await e2eTestsExistPromise)) { - if (project.hasDockerfile) { - await runWithSpawn(`${scripts.buildDocker()}`, argv); - } - const options = project.hasDockerfile - ? { - startCommand: dockerScripts.stopAndStart(true), - } - : {}; - process.exitCode = await runWithSpawn(scripts.testE2E(argv, options), argv, { exitIfFailed: false }); - await runWithSpawn(dockerScripts.stop(), argv); + if (projects.all.length > 1) { + // Disable interactive mode + project.env['CI'] = '1'; } - return; - } + project.env['FORCE_COLOR'] ||= '3'; + project.env.WB_ENV ||= 'test'; - if (argv.unit || (!argv.start && argv.e2e === undefined)) { - promises.push(runWithSpawn(scripts.testUnit(argv), argv, { timeout: argv.unitTimeout })); - } - if (argv.start) { - promises.push(runWithSpawn(scripts.testStart(argv), argv)); - } - await Promise.all(promises); - // Don't check playwright installation because --e2e is set explicitly - switch (argv.e2e) { - case undefined: - case 'none': { - return; - } - case '': - case 'headless': { - await runWithSpawn(scripts.testE2E(argv, {}), argv); - return; - } - case 'headless-dev': { - await runWithSpawn(scripts.testE2EDev(argv, {}), argv); + const promises: Promise[] = []; + if (argv.ci) { + const unitTestsExistPromise = existsAsync(path.join(project.dirPath, 'tests', 'unit')); + const e2eTestsExistPromise = existsAsync(path.join(project.dirPath, 'tests', 'e2e')); + + await runWithSpawnInParallel(dockerScripts.stopAll(), project, argv); + if (argv.unit !== false && (await unitTestsExistPromise)) { + await runWithSpawnInParallel(scripts.testUnit(project, argv), project, argv, { timeout: argv.unitTimeout }); + } + if (argv.start !== false) { + await runWithSpawnInParallel(scripts.testStart(project, argv), project, argv); + } + await promisePool.promiseAll(); + // Check playwright installation because --ci includes --e2e implicitly + if (argv.e2e !== 'none' && (await e2eTestsExistPromise)) { + if (project.hasDockerfile) { + await runWithSpawn(`${scripts.buildDocker(project)}`, project, argv); + } + const options = project.hasDockerfile + ? { + startCommand: dockerScripts.stopAndStart(project), + } + : {}; + process.exitCode = await runWithSpawn(scripts.testE2E(project, argv, options), project, argv, { + exitIfFailed: false, + }); + await runWithSpawn(dockerScripts.stop(project), project, argv); + } return; } - case 'docker': { - await testOnDocker(argv, scripts); - return; + + if (argv.unit || (!argv.start && argv.e2e === undefined)) { + promises.push(runWithSpawn(scripts.testUnit(project, argv), project, argv, { timeout: argv.unitTimeout })); } - case 'docker-debug': { - await testOnDocker(argv, scripts, 'PWDEBUG=1 '); - return; + if (argv.start) { + promises.push(runWithSpawn(scripts.testStart(project, argv), project, argv)); } - } - if (deps['blitz'] || deps['next'] || devDeps['@remix-run/dev']) { + await Promise.all(promises); + // Don't check playwright installation because --e2e is set explicitly switch (argv.e2e) { - case 'headed': { - await runWithSpawn(scripts.testE2E(argv, { playwrightArgs: 'test tests/e2e --headed' }), argv); + case undefined: + case 'none': { return; } - case 'headed-dev': { - await runWithSpawn(scripts.testE2EDev(argv, { playwrightArgs: 'test tests/e2e --headed' }), argv); + case '': + case 'headless': { + await runWithSpawn(scripts.testE2E(project, argv, {}), project, argv); return; } - case 'debug': { - await runWithSpawn(`PWDEBUG=1 ${scripts.testE2E(argv, {})}`, argv); + case 'headless-dev': { + await runWithSpawn(scripts.testE2EDev(project, argv, {}), project, argv); return; } - case 'generate': { - await runWithSpawn(scripts.testE2E(argv, { playwrightArgs: 'codegen http://localhost:8080' }), argv); + case 'docker': { + await testOnDocker(project, argv, scripts); return; } - case 'trace': { - await runWithSpawn(`playwright show-trace`, argv); + case 'docker-debug': { + await testOnDocker(project, argv, scripts, 'PWDEBUG=1 '); return; } } + if (deps['blitz'] || deps['next'] || devDeps['@remix-run/dev']) { + switch (argv.e2e) { + case 'headed': { + await runWithSpawn( + scripts.testE2E(project, argv, { playwrightArgs: 'test tests/e2e --headed' }), + project, + argv + ); + return; + } + case 'headed-dev': { + await runWithSpawn( + scripts.testE2EDev(project, argv, { playwrightArgs: 'test tests/e2e --headed' }), + project, + argv + ); + return; + } + case 'debug': { + await runWithSpawn(`PWDEBUG=1 ${scripts.testE2E(project, argv, {})}`, project, argv); + return; + } + case 'generate': { + await runWithSpawn( + scripts.testE2E(project, argv, { playwrightArgs: 'codegen http://localhost:8080' }), + project, + argv + ); + return; + } + case 'trace': { + await runWithSpawn(`playwright show-trace`, project, argv); + return; + } + } + } + throw new Error(`Unknown e2e mode: ${argv.e2e}`); } - throw new Error(`Unknown e2e mode: ${argv.e2e}`); } async function testOnDocker( + project: Project, argv: ArgumentsCamelCase>, scripts: BaseExecutionScripts, prefix = '' ): Promise { - await runWithSpawn(`${scripts.buildDocker()}`, argv); + await runWithSpawn(`${scripts.buildDocker(project)}`, project, argv); process.exitCode = await runWithSpawn( - `${prefix}${scripts.testE2E(argv, { - startCommand: dockerScripts.stopAndStart(true), + `${prefix}${scripts.testE2E(project, argv, { + startCommand: dockerScripts.stopAndStart(project), })}`, + project, argv, { exitIfFailed: false } ); - await runWithSpawn(dockerScripts.stop(), argv); + await runWithSpawn(dockerScripts.stop(project), project, argv); } diff --git a/packages/wb/src/commands/typecheck.ts b/packages/wb/src/commands/typecheck.ts index 276579bb..bf3a9a1f 100644 --- a/packages/wb/src/commands/typecheck.ts +++ b/packages/wb/src/commands/typecheck.ts @@ -4,39 +4,56 @@ import chalk from 'chalk'; import type { PackageJson } from 'type-fest'; import type { CommandModule, InferredOptionTypes } from 'yargs'; -import { project } from '../project.js'; +import { findAllProjects } from '../project.js'; import { runWithSpawn } from '../scripts/run.js'; +import type { sharedOptionsBuilder } from '../sharedOptionsBuilder.js'; const builder = {} as const; -export const typeCheckCommand: CommandModule> = { +export const typeCheckCommand: CommandModule< + unknown, + InferredOptionTypes +> = { command: 'typecheck', describe: 'Run type checking. .env-related options are ignored.', builder, async handler(argv) { - const commands: string[] = []; - if (project.packageJson.workspaces) { - commands.push(`yarn workspaces foreach --all --parallel --exclude ${project.name} --verbose run typecheck`); - } else { - if (project.packageJson.dependencies?.typescript || project.packageJson.devDependencies?.typescript) { - commands.push('tsc --noEmit --Pretty'); + const projects = await findAllProjects(argv); + if (!projects) return; + + for (const project of projects.all) { + const commands: string[] = []; + if (!project.packageJson.workspaces) { + if (project.packageJson.dependencies?.typescript || project.packageJson.devDependencies?.typescript) { + commands.push('tsc --noEmit --Pretty'); + } + if (project.packageJson.devDependencies?.pyright) { + commands.push('pyright'); + } } - if (project.packageJson.devDependencies?.pyright) { - commands.push('pyright'); + if (commands.length === 0) continue; + + console.info(`Running "typecheck" for ${project.name} ...`); + + if (projects.all.length > 1) { + // Disable interactive mode + project.env['CI'] = '1'; } - } - process.exitCode = await runWithSpawn(commands.join(' && '), argv); - if (process.exitCode !== 0) { - const packageJson = JSON.parse(await fs.readFile('package.json', 'utf8')) as PackageJson; - const deps = packageJson.dependencies || {}; - if (deps['blitz']) { - console.info(chalk.yellow('Please try "yarn gen-code" if you face unknown type errors.')); + project.env['FORCE_COLOR'] ||= '3'; + + const exitCode = await runWithSpawn(commands.join(' && '), project, argv); + if (exitCode !== 0) { + const packageJson = JSON.parse(await fs.readFile('package.json', 'utf8')) as PackageJson; + const deps = packageJson.dependencies || {}; + if (deps['blitz']) { + console.info(chalk.yellow('Please try "yarn gen-code" if you face unknown type errors.')); + } } } }, }; -export const tcCommand: CommandModule> = { +export const tcCommand: CommandModule> = { ...typeCheckCommand, command: 'tc', }; diff --git a/packages/wb/src/index.ts b/packages/wb/src/index.ts index 281be48a..61d0f67a 100644 --- a/packages/wb/src/index.ts +++ b/packages/wb/src/index.ts @@ -1,6 +1,6 @@ import path from 'node:path'; -import { loadEnvironmentVariables, removeNpmAndYarnEnvironmentVariables } from '@willbooster/shared-lib-node/src'; +import { removeNpmAndYarnEnvironmentVariables } from '@willbooster/shared-lib-node/src'; import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; @@ -12,7 +12,6 @@ import { setupCommand } from './commands/setup.js'; import { startCommand } from './commands/start.js'; import { testCommand } from './commands/test.js'; import { tcCommand, typeCheckCommand } from './commands/typecheck.js'; -import { project } from './project.js'; import { sharedOptionsBuilder } from './sharedOptionsBuilder.js'; await yargs(hideBin(process.argv)) @@ -23,17 +22,9 @@ await yargs(hideBin(process.argv)) if (workingDir) { const dirPath = path.resolve(workingDir); process.chdir(dirPath); - project.dirPath = dirPath; } removeNpmAndYarnEnvironmentVariables(process.env); - - const command = argv._[0].toString(); - if (['start', 'tc', 'typecheck'].includes(command)) return; - if (command === 'test') { - process.env.WB_ENV ||= 'test'; - } - loadEnvironmentVariables(argv, project.dirPath); }) .command(buildIfNeededCommand) .command(optimizeForDockerBuildCommand) diff --git a/packages/wb/src/utils.ts b/packages/wb/src/processUtils.ts similarity index 72% rename from packages/wb/src/utils.ts rename to packages/wb/src/processUtils.ts index c5c0f6da..985a0ec8 100644 --- a/packages/wb/src/utils.ts +++ b/packages/wb/src/processUtils.ts @@ -2,7 +2,7 @@ import { spawnSync } from 'node:child_process'; import killPortProcess from 'kill-port'; -import { project } from './project.js'; +import type { Project } from './project.js'; import { printFinishedAndExitIfNeeded, printStart } from './scripts/run.js'; const killed = new Set(); @@ -28,14 +28,14 @@ async function killPortProcessHandlingErrors(port: number): Promise { } } -export function spawnSyncOnExit(command: string): void { +export function spawnSyncOnExit(script: string, project: Project): void { const killFunc = async (): Promise => { - if (killed.has(command)) return; + if (killed.has(script)) return; - killed.add(command); - printStart(command); - const { status } = spawnSync(command, { cwd: project.dirPath, shell: true, stdio: 'inherit' }); - printFinishedAndExitIfNeeded(command, status, {}); + killed.add(script); + printStart(script, project); + const { status } = spawnSync(script, { cwd: project.dirPath, shell: true, stdio: 'inherit' }); + printFinishedAndExitIfNeeded(script, status, {}); }; for (const signal of ['beforeExit', 'SIGINT', 'SIGTERM', 'SIGQUIT']) { process.on(signal, killFunc); diff --git a/packages/wb/src/project.ts b/packages/wb/src/project.ts index 520394a5..3330387e 100644 --- a/packages/wb/src/project.ts +++ b/packages/wb/src/project.ts @@ -1,31 +1,28 @@ import fs from 'node:fs'; import path from 'node:path'; +import type { EnvReaderOptions } from '@willbooster/shared-lib-node/src'; +import { readEnvironmentVariables } from '@willbooster/shared-lib-node/src'; +import { memoizeOne } from 'at-decorators'; import type { PackageJson } from 'type-fest'; import type { ScriptArgv } from './scripts/builder.js'; -class Project { - private _buildCommand: string | undefined; +export class Project { private _dirPath: string; - private _rootDirPath: string | undefined; - private _dockerfile: string | undefined; - private _hasDockerfile: boolean | undefined; - private _name: string | undefined; - private _nameWithoutNamespace: string | undefined; - private _rootPackageJson: PackageJson | undefined; - private _dockerPackageJson: PackageJson | undefined; - private _packageJson: PackageJson | undefined; private _pathByName = new Map(); + private _argv: EnvReaderOptions; - constructor() { - this._dirPath = process.cwd(); + constructor(dirPath: string, argv: EnvReaderOptions) { + this._dirPath = path.resolve(dirPath); + this._argv = argv; } + @memoizeOne getBuildCommand(argv?: ScriptArgv): string { - return (this._buildCommand ??= this.packageJson.scripts?.build?.includes('buildIfNeeded') + return this.packageJson.scripts?.build?.includes('buildIfNeeded') ? 'yarn build' - : `YARN wb buildIfNeeded ${argv?.verbose ? '--verbose' : ''}`); + : `YARN wb buildIfNeeded ${argv?.verbose ? '--verbose' : ''}`; } get dirPath(): string { @@ -36,56 +33,61 @@ class Project { this._dirPath = path.resolve(newDirPath); } + @memoizeOne get rootDirPath(): string { - return (this._rootDirPath ??= fs.existsSync(path.join(this.dirPath, '..', '..', 'package.json')) + return fs.existsSync(path.join(this.dirPath, '..', '..', 'package.json')) ? path.resolve(this.dirPath, '..', '..') - : this.dirPath); + : this.dirPath; } + @memoizeOne get dockerfile(): string { - return (this._dockerfile ??= fs.readFileSync(this.findFile('Dockerfile'), 'utf8')); + return fs.readFileSync(this.findFile('Dockerfile'), 'utf8'); } + @memoizeOne get hasDockerfile(): boolean { - if (this._hasDockerfile !== undefined) return this._hasDockerfile; - try { - this._hasDockerfile = !!this.findFile('Dockerfile'); + return !!this.findFile('Dockerfile'); } catch { - this._hasDockerfile = false; + return false; } - return this._hasDockerfile; } + @memoizeOne get name(): string { - return (this._name ??= project.rootPackageJson.name || 'unknown'); + return this.rootPackageJson.name || 'unknown'; } + @memoizeOne get nameWithoutNamespace(): string { - if (this._nameWithoutNamespace === undefined) { - const name = project.rootPackageJson.name || 'unknown'; - const index = name.lastIndexOf('/'); - this._nameWithoutNamespace = index === -1 ? name : name.slice(index + 1); - } - return this._nameWithoutNamespace; + const name = this.rootPackageJson.name || 'unknown'; + const index = name.lastIndexOf('/'); + return index === -1 ? name : name.slice(index + 1); } + @memoizeOne + get env(): Record { + return { ...readEnvironmentVariables(this._argv, this.dirPath), ...process.env }; + } + + @memoizeOne get packageJson(): PackageJson { - return (this._packageJson ??= JSON.parse(fs.readFileSync(path.join(this.dirPath, 'package.json'), 'utf8'))); + return JSON.parse(fs.readFileSync(path.join(this.dirPath, 'package.json'), 'utf8')); } + @memoizeOne get rootPackageJson(): PackageJson { - return (this._rootPackageJson ??= - this.rootDirPath === this.dirPath - ? this.packageJson - : JSON.parse(fs.readFileSync(path.join(this.rootDirPath, 'package.json'), 'utf8'))); + return this.rootDirPath === this.dirPath + ? this.packageJson + : JSON.parse(fs.readFileSync(path.join(this.rootDirPath, 'package.json'), 'utf8')); } + @memoizeOne get dockerPackageJson(): PackageJson { - return (this._dockerPackageJson ??= - path.dirname(this.findFile('Dockerfile')) === this.dirPath - ? this.packageJson - : JSON.parse(fs.readFileSync(path.join(path.dirname(this.findFile('Dockerfile')), 'package.json'), 'utf8'))); + return path.dirname(this.findFile('Dockerfile')) === this.dirPath + ? this.packageJson + : JSON.parse(fs.readFileSync(path.join(path.dirname(this.findFile('Dockerfile')), 'package.json'), 'utf8')); } findFile(fileName: string): string { @@ -101,4 +103,63 @@ class Project { } } -export const project = new Project(); +export interface FoundProjects { + root: Project; + self: Project; + all: Project[]; +} + +export function findSelfProject(argv: EnvReaderOptions, dirPath?: string): Project | undefined { + dirPath ??= process.cwd(); + if (!fs.existsSync(path.join(dirPath, 'package.json'))) return; + + return new Project(dirPath, argv); +} + +export async function findAllProjects(argv: EnvReaderOptions, dirPath?: string): Promise { + const rootAndSelfProjects = findRootAndSelfProjects(argv, dirPath); + if (!rootAndSelfProjects) return; + + return { + ...rootAndSelfProjects, + all: + rootAndSelfProjects.root === rootAndSelfProjects.self + ? await getAllProjects(argv, rootAndSelfProjects.root) + : [rootAndSelfProjects.self], + }; +} + +export function findRootAndSelfProjects( + argv: EnvReaderOptions, + dirPath?: string +): Omit | undefined { + dirPath ??= process.cwd(); + if (!fs.existsSync(path.join(dirPath, 'package.json'))) return; + + const thisProject = new Project(dirPath, argv); + let rootProject = thisProject; + if (!thisProject.packageJson.workspaces && path.dirname(dirPath).endsWith('/packages')) { + const rootDirPath = path.resolve(dirPath, '..', '..'); + if (fs.existsSync(path.join(rootDirPath, 'package.json'))) { + rootProject = new Project(rootDirPath, argv); + } + } + return { root: rootProject, self: thisProject }; +} + +async function getAllProjects(argv: EnvReaderOptions, rootProject: Project): Promise { + const allProjects = [rootProject]; + const packageDirPath = path.join(rootProject.dirPath, 'packages'); + if (!fs.existsSync(packageDirPath)) return allProjects; + + const packageDirs = await fs.promises.readdir(packageDirPath, { withFileTypes: true }); + for (const packageDir of packageDirs) { + if (!packageDir.isDirectory()) continue; + + const packageJsonPath = path.join(packageDirPath, 'package.json'); + if (!fs.existsSync(packageJsonPath)) continue; + + allProjects.push(new Project(packageJsonPath, argv)); + } + return allProjects; +} diff --git a/packages/wb/src/scripts/dockerScripts.ts b/packages/wb/src/scripts/dockerScripts.ts index a8c164fd..4f18b60e 100644 --- a/packages/wb/src/scripts/dockerScripts.ts +++ b/packages/wb/src/scripts/dockerScripts.ts @@ -1,14 +1,14 @@ import path from 'node:path'; -import { project } from '../project.js'; -import { spawnSyncOnExit } from '../utils.js'; +import { spawnSyncOnExit } from '../processUtils.js'; +import type { Project } from '../project.js'; /** * A collection of scripts for executing Docker commands. * Note that `YARN zzz` is replaced with `yarn zzz` or `node_modules/.bin/zzz`. */ class DockerScripts { - buildDevImage(): string { + buildDevImage(project: Project): string { // e.g. coding-booster uses `"docker/build/prepare": "touch drill-users.csv",` const prefix = project.dockerPackageJson.scripts?.['docker/build/prepare'] ? 'yarn run docker/build/prepare && ' @@ -17,18 +17,22 @@ class DockerScripts { && ${prefix}YARN wb optimizeForDockerBuild --outside && YARN wb retry -- docker build -t ${project.nameWithoutNamespace} --build-arg ARCH=$([ $(uname -m) = 'arm64' ] && echo arm64 || echo amd64) - --build-arg WB_ENV=${process.env.WB_ENV} + --build-arg WB_ENV=${project.env.WB_ENV} --build-arg WB_VERSION=dev .`; } - stopAndStart(unbuffer = false, additionalOptions = '', additionalArgs = ''): string { - return `${this.stop()} && ${unbuffer ? 'unbuffer ' : ''}${this.start(additionalOptions, additionalArgs)}`; + stopAndStart(project: Project, unbuffer = false, additionalOptions = '', additionalArgs = ''): string { + return `${this.stop(project)} && ${unbuffer ? 'unbuffer ' : ''}${this.start( + project, + additionalOptions, + additionalArgs + )}`; } - start(additionalOptions = '', additionalArgs = ''): string { - spawnSyncOnExit(this.stop()); + start(project: Project, additionalOptions = '', additionalArgs = ''): string { + spawnSyncOnExit(this.stop(project), project); return `docker run --rm -it -p 8080:8080 --name ${project.nameWithoutNamespace} ${additionalOptions} ${project.nameWithoutNamespace} ${additionalArgs}`; } - stop(): string { + stop(project: Project): string { return `true $(docker rm -f $(docker container ls -q -f name=${project.nameWithoutNamespace}) 2> /dev/null)`; } diff --git a/packages/wb/src/scripts/execution/baseExecutionScripts.ts b/packages/wb/src/scripts/execution/baseExecutionScripts.ts index ce99cb25..584d7b36 100644 --- a/packages/wb/src/scripts/execution/baseExecutionScripts.ts +++ b/packages/wb/src/scripts/execution/baseExecutionScripts.ts @@ -1,3 +1,4 @@ +import type { Project } from '../../project.js'; import type { ScriptArgv } from '../builder.js'; import { dockerScripts } from '../dockerScripts.js'; @@ -18,48 +19,57 @@ export interface TestE2EOptions extends TestE2EDevOptions { export abstract class BaseExecutionScripts { protected constructor(private readonly defaultPort = 3000) {} - buildDocker(): string { - return dockerScripts.buildDevImage(); + buildDocker(project: Project): string { + return dockerScripts.buildDevImage(project); } - abstract start(argv: ScriptArgv): string; + abstract start(project: Project, argv: ScriptArgv): string; - abstract startProduction(argv: ScriptArgv, port: number): string; + abstract startProduction(project: Project, argv: ScriptArgv, port: number): string; - startDocker(argv: ScriptArgv): string { - return `${this.buildDocker()} + startDocker(project: Project, argv: ScriptArgv): string { + return `${this.buildDocker(project)} && YARN concurrently --raw --kill-others-on-fail - "${dockerScripts.stopAndStart(false, argv.normalizedDockerArgsText ?? '', argv.normalizedArgsText ?? '')}" - "${this.waitAndOpenApp(argv, 8080)}"`; + "${dockerScripts.stopAndStart( + project, + false, + argv.normalizedDockerArgsText ?? '', + argv.normalizedArgsText ?? '' + )}" + "${this.waitAndOpenApp(project, argv, 8080)}"`; } - testE2E(argv: ScriptArgv, { playwrightArgs, prismaDirectory, startCommand }: TestE2EOptions): string { + testE2E( + project: Project, + argv: ScriptArgv, + { playwrightArgs, prismaDirectory, startCommand }: TestE2EOptions + ): string { // Basically, `playwright` (not `yarn playwright`) should work, // but it doesn't work on a project depending on `artillery-engine-playwright`. // So we use `yarn playwright` instead of `playwright` here. - const env = process.env.WB_ENV; + const env = project.env.WB_ENV; return `WB_ENV=${env} NEXT_PUBLIC_WB_ENV=${env} APP_ENV=${env} PORT=8080 YARN concurrently --kill-others --raw --success first "rm -Rf ${prismaDirectory}/mount && ${startCommand} && exit 1" "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http://127.0.0.1:8080' 'yarn playwright install --with-deps' && yarn playwright ${playwrightArgs}"`; } - testE2EDev(argv: ScriptArgv, { playwrightArgs, startCommand }: TestE2EDevOptions): string { - const env = process.env.WB_ENV; + testE2EDev(project: Project, argv: ScriptArgv, { playwrightArgs, startCommand }: TestE2EDevOptions): string { + const env = project.env.WB_ENV; return `WB_ENV=${env} NEXT_PUBLIC_WB_ENV=${env} APP_ENV=${env} PORT=8080 YARN concurrently --kill-others --raw --success first "${startCommand} && exit 1" "concurrently --kill-others-on-fail --raw 'wait-on -t 600000 -i 2000 http://127.0.0.1:8080' 'yarn playwright install --with-deps' && yarn playwright ${playwrightArgs}"`; } - abstract testStart(argv: ScriptArgv): string; + abstract testStart(project: Project, argv: ScriptArgv): string; - testUnit(_: ScriptArgv): string { + testUnit(project: Project, _2: ScriptArgv): string { // Since this command is referred to from other commands, we have to use "vitest run". - return `WB_ENV=${process.env.WB_ENV} YARN vitest run tests/unit --color --passWithNoTests`; + return `WB_ENV=${project.env.WB_ENV} YARN vitest run tests/unit --color --passWithNoTests`; } - protected waitApp(argv: ScriptArgv, port = this.defaultPort): string { + protected waitApp(project: Project, argv: ScriptArgv, port = this.defaultPort): string { return `wait-on -t 10000 http://127.0.0.1:${port} 2> /dev/null || wait-on -t 10000 -i 500 http://127.0.0.1:${port} 2> /dev/null || wait-on -t 10000 -i 1000 http://127.0.0.1:${port} 2> /dev/null @@ -68,7 +78,11 @@ export abstract class BaseExecutionScripts { || wait-on -t 60000 -i 5000 http://127.0.0.1:${port}`; } - protected waitAndOpenApp(argv: ScriptArgv, port = this.defaultPort): string { - return `${this.waitApp(argv, port)} || wait-on http://127.0.0.1:${port} && open-cli http://localhost:${port}`; + protected waitAndOpenApp(project: Project, argv: ScriptArgv, port = this.defaultPort): string { + return `${this.waitApp( + project, + argv, + port + )} || wait-on http://127.0.0.1:${port} && open-cli http://localhost:${port}`; } } diff --git a/packages/wb/src/scripts/execution/blitzScripts.ts b/packages/wb/src/scripts/execution/blitzScripts.ts index 8b03ee15..0e00673a 100644 --- a/packages/wb/src/scripts/execution/blitzScripts.ts +++ b/packages/wb/src/scripts/execution/blitzScripts.ts @@ -1,4 +1,4 @@ -import { project } from '../../project.js'; +import type { Project } from '../../project.js'; import type { ScriptArgv } from '../builder.js'; import { prismaScripts } from '../prismaScripts.js'; @@ -14,32 +14,33 @@ class BlitzScripts extends BaseExecutionScripts { super(); } - override start(argv: ScriptArgv): string { - const appEnv = process.env.WB_ENV ? `APP_ENV=${process.env.WB_ENV} ` : ''; + override start(project: Project, argv: ScriptArgv): string { + const appEnv = project.env.WB_ENV ? `APP_ENV=${project.env.WB_ENV} ` : ''; return `${appEnv}YARN concurrently --raw --kill-others-on-fail "blitz dev ${argv.normalizedArgsText ?? ''}" - "${this.waitAndOpenApp(argv)}"`; + "${this.waitAndOpenApp(project, argv)}"`; } - override startProduction(argv: ScriptArgv, port: number): string { - const appEnv = process.env.WB_ENV ? `APP_ENV=${process.env.WB_ENV} ` : ''; + override startProduction(project: Project, argv: ScriptArgv, port: number): string { + const appEnv = project.env.WB_ENV ? `APP_ENV=${project.env.WB_ENV} ` : ''; return `${appEnv}NODE_ENV=production YARN concurrently --raw --kill-others-on-fail - "${prismaScripts.reset()} && ${project.getBuildCommand( + "${prismaScripts.reset(project)} && ${project.getBuildCommand( argv )} && PORT=${port} pm2-runtime start ${project.findFile('ecosystem.config.cjs')} ${argv.normalizedArgsText ?? ''}" - "${this.waitAndOpenApp(argv, port)}"`; + "${this.waitAndOpenApp(project, argv, port)}"`; } override testE2E( + project: Project, argv: ScriptArgv, { playwrightArgs = 'test tests/e2e', - startCommand = `${prismaScripts.reset()} && ${project.getBuildCommand( + startCommand = `${prismaScripts.reset(project)} && ${project.getBuildCommand( argv )} && pm2-runtime start ${project.findFile('ecosystem.config.cjs')}`, }: TestE2EOptions ): string { - return super.testE2E(argv, { + return super.testE2E(project, argv, { playwrightArgs, prismaDirectory: 'db', startCommand, @@ -47,14 +48,15 @@ class BlitzScripts extends BaseExecutionScripts { } override testE2EDev( + project: Project, argv: ScriptArgv, { playwrightArgs = 'test tests/e2e', startCommand = 'blitz dev -p 8080' }: TestE2EDevOptions ): string { - return super.testE2EDev(argv, { playwrightArgs, startCommand }); + return super.testE2EDev(project, argv, { playwrightArgs, startCommand }); } - override testStart(argv: ScriptArgv): string { - return `YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(argv)}"`; + override testStart(project: Project, argv: ScriptArgv): string { + return `YARN concurrently --kill-others --raw --success first "blitz dev" "${this.waitApp(project, argv)}"`; } } diff --git a/packages/wb/src/scripts/execution/httpServerScripts.ts b/packages/wb/src/scripts/execution/httpServerScripts.ts index 7c9453b7..6aed0584 100644 --- a/packages/wb/src/scripts/execution/httpServerScripts.ts +++ b/packages/wb/src/scripts/execution/httpServerScripts.ts @@ -1,4 +1,4 @@ -import { project } from '../../project.js'; +import type { Project } from '../../project.js'; import type { ScriptArgv } from '../builder.js'; import { dockerScripts } from '../dockerScripts.js'; @@ -14,47 +14,53 @@ class HttpServerScripts extends BaseExecutionScripts { super(); } - override start(argv: ScriptArgv): string { + override start(project: Project, argv: ScriptArgv): string { return `YARN build-ts run src/index.ts ${argv.watch ? '--watch' : ''} -- ${argv.normalizedArgsText ?? ''}`; } - override startDocker(argv: ScriptArgv): string { - return `${this.buildDocker()} && ${dockerScripts.stopAndStart( + override startDocker(project: Project, argv: ScriptArgv): string { + return `${this.buildDocker(project)} && ${dockerScripts.stopAndStart( + project, false, argv.normalizedDockerArgsText ?? '', argv.normalizedArgsText ?? '' )}`; } - override startProduction(argv: ScriptArgv, port = 8080): string { + override startProduction(project: Project, argv: ScriptArgv, port = 8080): string { return `NODE_ENV=production ${project.getBuildCommand( argv )} && NODE_ENV=production PORT=\${PORT:-${port}} node dist/index.js ${argv.normalizedArgsText ?? ''}`; } override testE2E( + project: Project, argv: ScriptArgv, { startCommand = `if [ -e "prisma" ]; then prisma migrate reset --force --skip-generate; fi && (${this.startProduction( + project, argv )})`, }: TestE2EOptions ): string { - return `NODE_ENV=production WB_ENV=${process.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first + return `NODE_ENV=production WB_ENV=${project.env.WB_ENV} PORT=8080 YARN concurrently --kill-others --raw --success first "${startCommand} && exit 1" "wait-on -t 600000 -i 2000 http://127.0.0.1:8080 && vitest run tests/e2e --color --passWithNoTests"`; } - override testE2EDev(argv: ScriptArgv, { startCommand }: TestE2EDevOptions): string { + override testE2EDev(project: Project, argv: ScriptArgv, { startCommand }: TestE2EDevOptions): string { return `NODE_ENV=production WB_ENV=${ - process.env.WB_ENV + project.env.WB_ENV } PORT=8080 YARN concurrently --kill-others --raw --success first - "${startCommand || this.start(argv)} && exit 1" + "${startCommand || this.start(project, argv)} && exit 1" "wait-on -t 600000 -i 2000 http://127.0.0.1:8080 && vitest run tests/e2e --color --passWithNoTests"`; } - override testStart(argv: ScriptArgv): string { - return `YARN concurrently --kill-others --raw --success first "${this.start(argv)}" "${this.waitApp(argv)}"`; + override testStart(project: Project, argv: ScriptArgv): string { + return `YARN concurrently --kill-others --raw --success first "${this.start(project, argv)}" "${this.waitApp( + project, + argv + )}"`; } } diff --git a/packages/wb/src/scripts/execution/nextScripts.ts b/packages/wb/src/scripts/execution/nextScripts.ts index cd8dc4b9..c2a8f8c2 100644 --- a/packages/wb/src/scripts/execution/nextScripts.ts +++ b/packages/wb/src/scripts/execution/nextScripts.ts @@ -1,4 +1,4 @@ -import { project } from '../../project.js'; +import type { Project } from '../../project.js'; import type { ScriptArgv } from '../builder.js'; import { prismaScripts } from '../prismaScripts.js'; @@ -14,30 +14,31 @@ class NextScripts extends BaseExecutionScripts { super(); } - override start(argv: ScriptArgv): string { + override start(project: Project, argv: ScriptArgv): string { return `YARN concurrently --raw --kill-others-on-fail "next dev ${argv.normalizedArgsText ?? ''}" - "${this.waitAndOpenApp(argv)}"`; + "${this.waitAndOpenApp(project, argv)}"`; } - override startProduction(argv: ScriptArgv, port: number): string { + override startProduction(project: Project, argv: ScriptArgv, port: number): string { return `NODE_ENV=production YARN concurrently --raw --kill-others-on-fail - "${prismaScripts.reset()} && ${project.getBuildCommand( + "${prismaScripts.reset(project)} && ${project.getBuildCommand( argv )} && PORT=${port} pm2-runtime start ${project.findFile('ecosystem.config.cjs')} ${argv.normalizedArgsText ?? ''}" - "${this.waitAndOpenApp(argv, port)}"`; + "${this.waitAndOpenApp(project, argv, port)}"`; } override testE2E( + project: Project, argv: ScriptArgv, { playwrightArgs = 'test tests/e2e', - startCommand = `${prismaScripts.reset()} && ${project.getBuildCommand( + startCommand = `${prismaScripts.reset(project)} && ${project.getBuildCommand( argv )} && pm2-runtime start ${project.findFile('ecosystem.config.cjs')}`, }: TestE2EOptions ): string { - return super.testE2E(argv, { + return super.testE2E(project, argv, { playwrightArgs, prismaDirectory: 'db', startCommand, @@ -45,14 +46,15 @@ class NextScripts extends BaseExecutionScripts { } override testE2EDev( + project: Project, argv: ScriptArgv, { playwrightArgs = 'test tests/e2e', startCommand = 'next dev -p 8080' }: TestE2EDevOptions ): string { - return super.testE2EDev(argv, { playwrightArgs, startCommand }); + return super.testE2EDev(project, argv, { playwrightArgs, startCommand }); } - override testStart(argv: ScriptArgv): string { - return `YARN concurrently --kill-others --raw --success first "next dev" "${this.waitApp(argv)}"`; + override testStart(project: Project, argv: ScriptArgv): string { + return `YARN concurrently --kill-others --raw --success first "next dev" "${this.waitApp(project, argv)}"`; } } diff --git a/packages/wb/src/scripts/execution/plainAppScripts.ts b/packages/wb/src/scripts/execution/plainAppScripts.ts index f83b0d5b..48df8413 100644 --- a/packages/wb/src/scripts/execution/plainAppScripts.ts +++ b/packages/wb/src/scripts/execution/plainAppScripts.ts @@ -1,4 +1,4 @@ -import { project } from '../../project.js'; +import type { Project } from '../../project.js'; import type { ScriptArgv } from '../builder.js'; import { dockerScripts } from '../dockerScripts.js'; @@ -13,33 +13,34 @@ class PlainAppScripts extends BaseExecutionScripts { super(); } - override start(argv: ScriptArgv): string { + override start(project: Project, argv: ScriptArgv): string { return `YARN build-ts run src/index.ts ${argv.watch ? '--watch' : ''} -- ${argv.normalizedArgsText ?? ''}`; } - override startDocker(argv: ScriptArgv): string { - return `${this.buildDocker()} && ${dockerScripts.stopAndStart( + override startDocker(project: Project, argv: ScriptArgv): string { + return `${this.buildDocker(project)} && ${dockerScripts.stopAndStart( + project, false, argv.normalizedDockerArgsText ?? '', argv.normalizedArgsText ?? '' )}`; } - override startProduction(argv: ScriptArgv): string { + override startProduction(project: Project, argv: ScriptArgv): string { return `NODE_ENV=production ${project.getBuildCommand(argv)} && NODE_ENV=production node dist/index.js ${ argv.normalizedArgsText ?? '' }`; } - override testE2E(): string { + override testE2E(_: Project): string { return `echo 'do nothing.'`; } - override testE2EDev(): string { + override testE2EDev(_: Project): string { return `echo 'do nothing.'`; } - override testStart(): string { + override testStart(_: Project): string { return `echo 'do nothing.'`; } } diff --git a/packages/wb/src/scripts/execution/remixScripts.ts b/packages/wb/src/scripts/execution/remixScripts.ts index 7c46892c..5c407406 100644 --- a/packages/wb/src/scripts/execution/remixScripts.ts +++ b/packages/wb/src/scripts/execution/remixScripts.ts @@ -1,4 +1,4 @@ -import { project } from '../../project.js'; +import type { Project } from '../../project.js'; import type { ScriptArgv } from '../builder.js'; import { prismaScripts } from '../prismaScripts.js'; @@ -14,41 +14,43 @@ class RemixScripts extends BaseExecutionScripts { super(); } - override start(argv: ScriptArgv): string { + override start(project: Project, argv: ScriptArgv): string { return `YARN concurrently --raw --kill-others-on-fail "remix dev ${argv.normalizedArgsText ?? ''}" - "${this.waitAndOpenApp(argv)}"`; + "${this.waitAndOpenApp(project, argv)}"`; } - override startProduction(argv: ScriptArgv, port: number): string { + override startProduction(project: Project, argv: ScriptArgv, port: number): string { return `NODE_ENV=production YARN concurrently --raw --kill-others-on-fail - "${prismaScripts.reset()} && ${project.getBuildCommand( + "${prismaScripts.reset(project)} && ${project.getBuildCommand( argv )} && PORT=${port} pm2-runtime start ${project.findFile('ecosystem.config.cjs')} ${argv.normalizedArgsText ?? ''}" - "${this.waitAndOpenApp(argv, port)}"`; + "${this.waitAndOpenApp(project, argv, port)}"`; } override testE2E( + project: Project, argv: ScriptArgv, { playwrightArgs = 'test tests/e2e', - startCommand = `${prismaScripts.reset()} && ${project.getBuildCommand( + startCommand = `${prismaScripts.reset(project)} && ${project.getBuildCommand( argv )} && pm2-runtime start ${project.findFile('ecosystem.config.cjs')}`, }: TestE2EOptions ): string { - return super.testE2E(argv, { playwrightArgs, prismaDirectory: 'prisma', startCommand }); + return super.testE2E(project, argv, { playwrightArgs, prismaDirectory: 'prisma', startCommand }); } override testE2EDev( + project: Project, argv: ScriptArgv, { playwrightArgs = 'test tests/e2e', startCommand = 'remix dev' }: TestE2EDevOptions ): string { - return super.testE2EDev(argv, { playwrightArgs, startCommand }); + return super.testE2EDev(project, argv, { playwrightArgs, startCommand }); } - override testStart(argv: ScriptArgv): string { - return `YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(argv)}"`; + override testStart(project: Project, argv: ScriptArgv): string { + return `YARN concurrently --kill-others --raw --success first "remix dev" "${this.waitApp(project, argv)}"`; } } diff --git a/packages/wb/src/scripts/prismaScripts.ts b/packages/wb/src/scripts/prismaScripts.ts index 622973c3..6d429380 100644 --- a/packages/wb/src/scripts/prismaScripts.ts +++ b/packages/wb/src/scripts/prismaScripts.ts @@ -1,6 +1,6 @@ import path from 'node:path'; -import { project } from '../project.js'; +import type { Project } from '../project.js'; /** * A collection of scripts for executing Prisma commands. @@ -8,18 +8,18 @@ import { project } from '../project.js'; * and `YARN zzz` is replaced with `yarn zzz` or `node_modules/.bin/zzz`. */ class PrismaScripts { - deploy(): string { + deploy(_: Project): string { return 'PRISMA migrate deploy'; } - deployForce(backupPath: string): string { + deployForce(project: Project, backupPath: string): string { const dirName = project.packageJson.dependencies?.['blitz'] ? 'db' : 'prisma'; // Don't skip "migrate deploy" because restored database may be older than the current schema. return `rm -Rf ${dirName}/mount/prod.sqlite3*; PRISMA migrate reset --force && rm -Rf ${dirName}/mount/prod.sqlite3* && litestream restore -o ${dirName}/mount/prod.sqlite3 ${backupPath} && ALLOW_TO_SKIP_SEED=0 PRISMA migrate deploy`; } - litestream(): string { + litestream(_: Project): string { return `node -e ' const { PrismaClient } = require("@prisma/client"); new PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\` @@ -27,28 +27,28 @@ new PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\` '`; } - migrate(): string { - return `PRISMA migrate deploy && PRISMA generate && ${this.seed()}`; + migrate(project: Project): string { + return `PRISMA migrate deploy && PRISMA generate && ${this.seed(project)}`; } - migrateDev(): string { + migrateDev(_: Project): string { return `PRISMA migrate dev`; } - reset(): string { + reset(project: Project): string { // cf. https://www.prisma.io/docs/guides/database/seed-database#integrated-seeding-with-prisma-migrate // Blitz does not trigger seed automatically, so we need to run it manually. - return `PRISMA migrate reset --force --skip-seed && ${this.seed()}`; + return `PRISMA migrate reset --force --skip-seed && ${this.seed(project)}`; // I'm not sure why we need to remove all sqlite files, so I commented out the following line. // return `true $(rm -Rf db/**/*.sqlite* 2> /dev/null) && true $(rm -Rf prisma/**/*.sqlite* 2> /dev/null) && PRISMA migrate reset --force --skip-seed && ${this.seed()}`; } - restore(backupPath: string, outputPath: string): string { + restore(project: Project, backupPath: string, outputPath: string): string { const dirName = project.packageJson.dependencies?.['blitz'] ? 'db' : 'prisma'; return `rm -Rf ${dirName}/restored.sqlite3; GOOGLE_APPLICATION_CREDENTIALS=gcp-sa-key.json litestream restore -o ${outputPath} ${backupPath}`; } - seed(scriptPath?: string): string { + seed(project: Project, scriptPath?: string): string { if (project.packageJson.dependencies?.['blitz']) return `YARN blitz db seed${scriptPath ? ` -f ${scriptPath}` : ''}`; if (scriptPath) return 'YARN build-ts run prisma/seeds.ts'; @@ -56,7 +56,7 @@ new PrismaClient().$queryRaw\`PRAGMA journal_mode = WAL;\` return `if [ -e "prisma/seeds.ts" ]; then YARN build-ts run prisma/seeds.ts; fi`; } - studio(dbUrlOrPath?: string): string { + studio(_: Project, dbUrlOrPath?: string): string { let prefix = ''; if (dbUrlOrPath) { try { diff --git a/packages/wb/src/scripts/run.ts b/packages/wb/src/scripts/run.ts index 8e7491fc..671d651c 100644 --- a/packages/wb/src/scripts/run.ts +++ b/packages/wb/src/scripts/run.ts @@ -5,10 +5,10 @@ import { spawnAsync } from '@willbooster/shared-lib-node/src'; import chalk from 'chalk'; import type { ArgumentsCamelCase, InferredOptionTypes } from 'yargs'; -import { project } from '../project.js'; +import { killPortProcessImmediatelyAndOnExit } from '../processUtils.js'; +import type { Project } from '../project.js'; import { promisePool } from '../promisePool.js'; import type { sharedOptionsBuilder } from '../sharedOptionsBuilder.js'; -import { killPortProcessImmediatelyAndOnExit } from '../utils.js'; interface Options { exitIfFailed?: boolean; @@ -21,13 +21,14 @@ const defaultOptions: Options = { export async function runWithSpawn( script: string, + project: Project, argv: Partial>>, opts: Options = defaultOptions ): Promise { - const [printableScript, runnableScript] = normalizeScript(script); - printStart(printableScript); + const [printableScript, runnableScript] = normalizeScript(script, project); + printStart(printableScript, project); if (argv.verbose) { - printStart(runnableScript, 'Start (raw)', true); + printStart(runnableScript, project, 'Start (raw)', true); } if (argv.dryRun) { printFinishedAndExitIfNeeded(printableScript, 0, opts); @@ -40,6 +41,7 @@ export async function runWithSpawn( } const ret = await spawnAsync(runnableScript, undefined, { cwd: project.dirPath, + env: project.env, shell: true, stdio: 'inherit', timeout: opts?.timeout, @@ -50,38 +52,19 @@ export async function runWithSpawn( return ret.status ?? 1; } -export async function runOnEachWorkspaceIfNeeded( - argv: Partial>> -): Promise { - if (!project.packageJson.workspaces) return; - - const args = process.argv.slice(2); - const index = args.findIndex((arg) => ['-w', '--working-dir', '--workingDir'].includes(arg)); - if (index >= 0) { - args.splice(index, 2); - } - - // Disable interactive mode - process.env['CI'] = '1'; - await runWithSpawn( - ['yarn', 'workspaces', 'foreach', '--all', '--exclude', project.name, '--verbose', 'run', 'wb', ...args].join(' '), - argv - ); - process.exit(0); -} - export function runWithSpawnInParallel( script: string, + project: Project, argv: Partial>>, opts: Options = defaultOptions ): Promise { return promisePool.run(async () => { - const [printableScript, runnableScript] = normalizeScript(script); - printStart(printableScript, 'Start (parallel)', true); + const [printableScript, runnableScript] = normalizeScript(script, project); + printStart(printableScript, project, 'Start (parallel)', true); if (argv.dryRun) { - printStart(printableScript, 'Started (log)'); + printStart(printableScript, project, 'Started (log)'); if (argv.verbose) { - printStart(runnableScript, 'Started (raw)', true); + printStart(runnableScript, project, 'Started (raw)', true); } printFinishedAndExitIfNeeded(printableScript, 0, opts); return; @@ -89,6 +72,7 @@ export function runWithSpawnInParallel( const ret = await spawnAsync(runnableScript, undefined, { cwd: project.dirPath, + env: project.env, shell: true, stdio: 'pipe', timeout: opts?.timeout, @@ -96,9 +80,9 @@ export function runWithSpawnInParallel( killOnExit: true, verbose: argv.verbose, }); - printStart(printableScript, 'Started (log)'); + printStart(printableScript, project, 'Started (log)'); if (argv.verbose) { - printStart(runnableScript, 'Started (raw)', true); + printStart(runnableScript, project, 'Started (raw)', true); } const out = ret.stdout.trim(); if (out) console.info(out); @@ -106,8 +90,8 @@ export function runWithSpawnInParallel( }); } -function normalizeScript(script: string): [string, string] { - const binExists = addBinPathsToEnv(); +function normalizeScript(script: string, project: Project): [string, string] { + const binExists = addBinPathsToEnv(project); const newScript = script .replaceAll('\n', '') .replaceAll(/\s\s+/g, ' ') @@ -116,7 +100,7 @@ function normalizeScript(script: string): [string, string] { return [newScript.replaceAll('YARN ', 'yarn '), newScript.replaceAll('YARN ', binExists ? '' : 'yarn ')]; } -export function printStart(normalizedScript: string, prefix = 'Start', weak = false): void { +export function printStart(normalizedScript: string, project: Project, prefix = 'Start', weak = false): void { console.info( '\n' + (weak ? chalk.gray : chalk.cyan)(chalk.bold(`${prefix}:`), normalizedScript) + @@ -142,7 +126,7 @@ export function printFinishedAndExitIfNeeded( let addedBinPaths = false; let binFound = false; -function addBinPathsToEnv(): boolean { +function addBinPathsToEnv(project: Project): boolean { if (addedBinPaths) return binFound; addedBinPaths = true; @@ -150,7 +134,7 @@ function addBinPathsToEnv(): boolean { for (;;) { const binPath = path.join(currentPath, 'node_modules', '.bin'); if (fs.existsSync(binPath)) { - process.env.PATH = `${binPath}:${process.env.PATH}`; + project.env.PATH = `${binPath}:${project.env.PATH}`; binFound = true; } diff --git a/packages/wb/src/sharedOptionsBuilder.ts b/packages/wb/src/sharedOptionsBuilder.ts index afeb2242..2c4f454e 100644 --- a/packages/wb/src/sharedOptionsBuilder.ts +++ b/packages/wb/src/sharedOptionsBuilder.ts @@ -2,6 +2,7 @@ import { yargsOptionsBuilderForEnv } from '@willbooster/shared-lib-node/src'; export const sharedOptionsBuilder = { ...yargsOptionsBuilderForEnv, + // This option is for debugging mainly. 'working-dir': { description: 'A working directory', type: 'string', @@ -12,9 +13,4 @@ export const sharedOptionsBuilder = { type: 'boolean', alias: 'd', }, - verbose: { - description: 'Whether to show verbose information', - type: 'boolean', - alias: 'v', - }, } as const; diff --git a/packages/wb/tests/buildIfNeeded.test.ts b/packages/wb/tests/buildIfNeeded.test.ts index 0131821c..5ab156bc 100644 --- a/packages/wb/tests/buildIfNeeded.test.ts +++ b/packages/wb/tests/buildIfNeeded.test.ts @@ -5,35 +5,34 @@ import path from 'node:path'; import { describe, expect, it } from 'vitest'; import { buildIfNeeded } from '../src/commands/buildIfNeeded.js'; -import { project } from '../src/project.js'; import { initializeProjectDirectory, tempDir } from './shared.js'; describe('buildIfNeeded', () => { it('app', async () => { - project.dirPath = path.join(tempDir, 'app'); - await initializeProjectDirectory(); + const dirPath = path.join(tempDir, 'app'); + await initializeProjectDirectory(dirPath); - child_process.execSync('git init', { cwd: project.dirPath, stdio: 'inherit' }); - child_process.execSync('git add -A', { cwd: project.dirPath, stdio: 'inherit' }); - child_process.execSync('git config user.email "bot@willbooster.com"', { cwd: project.dirPath, stdio: 'inherit' }); - child_process.execSync('git config user.name "WillBooster Inc."', { cwd: project.dirPath, stdio: 'inherit' }); - child_process.execSync('git add -A', { cwd: project.dirPath, stdio: 'inherit' }); - child_process.execSync('git commit -m .', { cwd: project.dirPath, stdio: 'inherit' }); + child_process.execSync('git init', { cwd: dirPath, stdio: 'inherit' }); + child_process.execSync('git add -A', { cwd: dirPath, stdio: 'inherit' }); + child_process.execSync('git config user.email "bot@willbooster.com"', { cwd: dirPath, stdio: 'inherit' }); + child_process.execSync('git config user.name "WillBooster Inc."', { cwd: dirPath, stdio: 'inherit' }); + child_process.execSync('git add -A', { cwd: dirPath, stdio: 'inherit' }); + child_process.execSync('git commit -m .', { cwd: dirPath, stdio: 'inherit' }); const command = 'echo build'; - expect(await buildIfNeeded({ command })).toBe(true); - expect(await buildIfNeeded({ command })).toBe(false); + expect(await buildIfNeeded({ command }, dirPath)).toBe(true); + expect(await buildIfNeeded({ command }, dirPath)).toBe(false); - await fs.promises.writeFile(path.join(project.dirPath, 'index.js'), `console.log('Hello'); console.log('Hello');`); - expect(await buildIfNeeded({ command })).toBe(true); - expect(await buildIfNeeded({ command })).toBe(false); + await fs.promises.writeFile(path.join(dirPath, 'index.js'), `console.log('Hello'); console.log('Hello');`); + expect(await buildIfNeeded({ command }, dirPath)).toBe(true); + expect(await buildIfNeeded({ command }, dirPath)).toBe(false); - await fs.promises.writeFile(path.join(project.dirPath, 'README.md'), `# test-fixtures/app/`); - expect(await buildIfNeeded({ command })).toBe(false); + await fs.promises.writeFile(path.join(dirPath, 'README.md'), `# test-fixtures/app/`); + expect(await buildIfNeeded({ command }, dirPath)).toBe(false); await fs.promises.writeFile( - path.join(project.dirPath, 'package.json'), + path.join(dirPath, 'package.json'), JSON.stringify( { name: '@test-fixtures/app2', @@ -42,6 +41,6 @@ describe('buildIfNeeded', () => { 2 ) ); - expect(await buildIfNeeded({ command })).toBe(false); + expect(await buildIfNeeded({ command }, dirPath)).toBe(false); }); }, 30_000); diff --git a/packages/wb/tests/setup.test.ts b/packages/wb/tests/setup.test.ts index b70d21e0..60e94bb3 100644 --- a/packages/wb/tests/setup.test.ts +++ b/packages/wb/tests/setup.test.ts @@ -4,7 +4,6 @@ import path from 'node:path'; import { describe, expect, it } from 'vitest'; import { setup } from '../src/commands/setup.js'; -import { project } from '../src/project.js'; import { initializeProjectDirectory, tempDir } from './shared.js'; @@ -12,11 +11,11 @@ describe('setup', () => { it( 'blitz', async () => { - project.dirPath = path.join(tempDir, 'blitz'); - await initializeProjectDirectory(); + const dirPath = path.join(tempDir, 'blitz'); + await initializeProjectDirectory(dirPath); - await setup({}); - const ret = child_process.spawnSync(`yarn start test -w ${project.dirPath} --ci`, { + await setup({}, dirPath); + const ret = child_process.spawnSync(`yarn start test -w ${dirPath} --ci`, { shell: true, stdio: 'inherit', }); diff --git a/packages/wb/tests/shared.ts b/packages/wb/tests/shared.ts index 631aee60..d73e4eb9 100644 --- a/packages/wb/tests/shared.ts +++ b/packages/wb/tests/shared.ts @@ -2,21 +2,22 @@ import fs from 'node:fs'; import os from 'node:os'; import path from 'node:path'; -import { project } from '../src/project.js'; +import { removeNpmAndYarnEnvironmentVariables } from '@willbooster/shared-lib-node/src'; export const tempDir = path.join(os.tmpdir(), 'shared'); -export async function initializeProjectDirectory(): Promise { - await fs.promises.rm(project.dirPath, { recursive: true, force: true }); - await fs.promises.cp(path.join('test-fixtures', path.basename(project.dirPath)), project.dirPath, { +export async function initializeProjectDirectory(dirPath: string): Promise { + await fs.promises.rm(dirPath, { recursive: true, force: true }); + await fs.promises.cp(path.join('test-fixtures', path.basename(dirPath)), dirPath, { force: true, recursive: true, }); - await fs.promises.cp(path.join('..', '..', '.yarn'), path.join(project.dirPath, '.yarn'), { + await fs.promises.cp(path.join('..', '..', '.yarn'), path.join(dirPath, '.yarn'), { force: true, recursive: true, }); - await fs.promises.cp(path.join('..', '..', '.yarnrc.yml'), path.join(project.dirPath, '.yarnrc.yml'), { + await fs.promises.cp(path.join('..', '..', '.yarnrc.yml'), path.join(dirPath, '.yarnrc.yml'), { force: true, }); + removeNpmAndYarnEnvironmentVariables(process.env); } diff --git a/packages/wb/tests/typecheck.test.ts b/packages/wb/tests/typecheck.test.ts index f4feef12..59a2470f 100644 --- a/packages/wb/tests/typecheck.test.ts +++ b/packages/wb/tests/typecheck.test.ts @@ -3,31 +3,30 @@ import path from 'node:path'; import { describe, expect, it } from 'vitest'; -import { project } from '../src/project.js'; - import { initializeProjectDirectory, tempDir } from './shared.js'; describe('typecheck', () => { it( 'monorepo', async () => { - project.dirPath = path.join(tempDir, 'monorepo'); - await initializeProjectDirectory(); + const dirPath = path.join(tempDir, 'monorepo'); + await initializeProjectDirectory(dirPath); // '--no-immutable' avoid blocking 'yarn install' even on CI child_process.spawnSync('yarn --no-immutable', { shell: true, stdio: 'inherit', - cwd: project.dirPath, + cwd: dirPath, }); child_process.spawnSync('yarn build', { shell: true, stdio: 'inherit', }); - const ret = child_process.spawnSync(`node dist/index.js typecheck -w ${project.dirPath}`, { + const ret = child_process.spawnSync(`node dist/index.js typecheck -w ${dirPath}`, { shell: true, stdio: 'inherit', }); + console.log(ret); expect(ret.status).toBe(0); }, 5 * 60 * 1000 diff --git a/packages/wb/tsconfig.json b/packages/wb/tsconfig.json index 3b6f0ef1..18d308ba 100644 --- a/packages/wb/tsconfig.json +++ b/packages/wb/tsconfig.json @@ -12,7 +12,7 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "target": "ESNext", + "target": "ES2022", "typeRoots": ["../../node_modules/@types", "../../@types", "./@types"] }, "include": ["scripts/**/*", "src/**/*", "tests/**/*"] diff --git a/yarn.lock b/yarn.lock index 94dc1347..142f59f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2302,9 +2302,9 @@ __metadata: linkType: hard "@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 + version: 4.9.1 + resolution: "@eslint-community/regexpp@npm:4.9.1" + checksum: d0e1bd1a37cb2cb6bbac88dfe97b62b412d4b6ea3a4bb1c4e1e503be03125063db5d80999cef9728f57b19b49979aa902ac68182bcf5f80dfce6fa9a9d34eee1 languageName: node linkType: hard @@ -2370,7 +2370,7 @@ __metadata: languageName: node linkType: hard -"@gar/promisify@npm:^1.0.1, @gar/promisify@npm:^1.1.3": +"@gar/promisify@npm:^1.0.1": version: 1.1.3 resolution: "@gar/promisify@npm:1.1.3" checksum: 0b3c9958d3cd17f4add3574975e3115ae05dc7f1298a60810414b16f6f558c137b5fb3cd3905df380bacfd955ec13f67c1e6710cbb5c246a7e8d65a8289b2bff @@ -2572,9 +2572,9 @@ __metadata: linkType: hard "@mdn/browser-compat-data@npm:^5.3.7": - version: 5.3.27 - resolution: "@mdn/browser-compat-data@npm:5.3.27" - checksum: e7f1f144ca1b166aad3520b03e62e13d71e9545a8358e4da9f6cee07bc1984a39255f90196e209e6dc2b723312f9765ad7b9622b90f6f837efd14423fa2985bb + version: 5.3.25 + resolution: "@mdn/browser-compat-data@npm:5.3.25" + checksum: 93e40af16755d916c314ad8486ca465283273d01f0d39656658a3d71e70ca58d8ffbb59a9573b0d4467dcffe3984bf5d31544bf091edcb7eba35bbe4c6be02f9 languageName: node linkType: hard @@ -2738,16 +2738,6 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^2.1.0": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" - dependencies: - "@gar/promisify": "npm:^1.1.3" - semver: "npm:^7.3.5" - checksum: c50d087733d0d8df23be24f700f104b19922a28677aa66fdbe06ff6af6431cc4a5bb1e27683cbc661a5dafa9bafdc603e6a0378121506dfcd394b2b6dd76a187 - languageName: node - linkType: hard - "@npmcli/fs@npm:^3.1.0": version: 3.1.0 resolution: "@npmcli/fs@npm:3.1.0" @@ -2819,16 +2809,6 @@ __metadata: languageName: node linkType: hard -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" - dependencies: - mkdirp: "npm:^1.0.4" - rimraf: "npm:^3.0.2" - checksum: 11b2151e6d1de6f6eb23128de5aa8a429fd9097d839a5190cb77aa47a6b627022c42d50fa7c47a00f1c9f8f0c1560092b09b061855d293fa0741a2a94cfb174d - languageName: node - linkType: hard - "@npmcli/name-from-folder@npm:^2.0.0": version: 2.0.0 resolution: "@npmcli/name-from-folder@npm:2.0.0" @@ -2912,13 +2892,13 @@ __metadata: linkType: hard "@octokit/endpoint@npm:^9.0.0": - version: 9.0.2 - resolution: "@octokit/endpoint@npm:9.0.2" + version: 9.0.1 + resolution: "@octokit/endpoint@npm:9.0.1" dependencies: "@octokit/types": "npm:^12.0.0" is-plain-object: "npm:^5.0.0" universal-user-agent: "npm:^6.0.0" - checksum: 325ad5f2f4aaba0ef90436809dad423faf5f373dac5754af050bd117e70b6ded3a370745dfa4c860a8aa8161bc31cd7706f4b647aef8602f23a355d0cfbe3907 + checksum: 757505b1cd634bcd7b71a18c8fe07dfda47790598ddd0d9d13f47d68713070f49953a672ac40ec39787defc2a7e07d08dca97756def7b907118f8f8d4c653f5c languageName: node linkType: hard @@ -2941,13 +2921,13 @@ __metadata: linkType: hard "@octokit/plugin-paginate-rest@npm:^9.0.0": - version: 9.1.2 - resolution: "@octokit/plugin-paginate-rest@npm:9.1.2" + version: 9.0.0 + resolution: "@octokit/plugin-paginate-rest@npm:9.0.0" dependencies: - "@octokit/types": "npm:^12.1.1" + "@octokit/types": "npm:^12.0.0" peerDependencies: "@octokit/core": ">=5" - checksum: e94c70f75faef21a5bb7e57d4b0bce52d5d5621a8136f339ab0cd47a4bc14ff378a13ddbc7a5089601337d244809d1794c6bca38a2ee535f40d1d423823abb49 + checksum: 050861368f71a4ad337c2f242c3878e8ad95331e2ed549732fca916ee4a67ef18477bedd78afb32b2d4229b80083097551671b14c51bd2b2b85c7f101b6ba02d languageName: node linkType: hard @@ -2965,14 +2945,14 @@ __metadata: linkType: hard "@octokit/plugin-throttling@npm:^8.0.0": - version: 8.1.2 - resolution: "@octokit/plugin-throttling@npm:8.1.2" + version: 8.0.1 + resolution: "@octokit/plugin-throttling@npm:8.0.1" dependencies: "@octokit/types": "npm:^12.0.0" bottleneck: "npm:^2.15.3" peerDependencies: "@octokit/core": ^5.0.0 - checksum: 0c1b3fa78e46f8a52fbf67356284deb0e24820cae0dcd8682f6293155460c648d4d51de5e62b2495318f68554acf2542ac028d1329540c3c9178b39264eb0996 + checksum: 4a5d4e8e1122444490e5d90bb3baed832904605a0dff93faf7669f0a7f8b4639eb6c6aaa96018488bb8fb6f1d2736c324f7009ab566c176ed4233088641fb9fa languageName: node linkType: hard @@ -3000,7 +2980,7 @@ __metadata: languageName: node linkType: hard -"@octokit/types@npm:^12.0.0, @octokit/types@npm:^12.1.1": +"@octokit/types@npm:^12.0.0": version: 12.1.1 resolution: "@octokit/types@npm:12.1.1" dependencies: @@ -4079,18 +4059,18 @@ __metadata: languageName: node linkType: hard -"@storybook/addon-actions@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-actions@npm:7.5.1" +"@storybook/addon-actions@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-actions@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/theming": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/theming": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" polished: "npm:^4.2.2" @@ -4107,22 +4087,22 @@ __metadata: optional: true react-dom: optional: true - checksum: 9248c4c9e32a6fedd73a370b4b255ba36cbb8f253da910a7892270cc1010d9eadf3f8154efc4c2b46a8e82f03ee3ee42e7fb845d8d829adc513f686ffa7c7877 + checksum: 9bc4806dbcbedb6fa745ce011c1119ef20414bfd6e53f29d5f2b25753d0e2884b8f65e9529f8f33d625dce62ab1f264d582f1c9e1fa818c0f99b9cffb5dbf426 languageName: node linkType: hard -"@storybook/addon-backgrounds@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-backgrounds@npm:7.5.1" +"@storybook/addon-backgrounds@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-backgrounds@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/theming": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/theming": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" memoizerific: "npm:^1.11.3" ts-dedent: "npm:^2.0.0" peerDependencies: @@ -4133,24 +4113,24 @@ __metadata: optional: true react-dom: optional: true - checksum: 6701e538983007f8c8b6c63f496c3639945d0336e3e14ae1cff885cff84c0b2dab4b8e9d6bdc5a8a8a9d51693796ffed95334b2ca4f6dee8d8a3cf50d02f20b2 + checksum: ba15b33ea3367b8b13c0ce7688ef8a06999ca8b029aa238a3d90ef45e056e29a48008d724cc9c27072c6651eee1b24c611ab9946974306dd2faf9c39540e4167 languageName: node linkType: hard -"@storybook/addon-controls@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-controls@npm:7.5.1" +"@storybook/addon-controls@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-controls@npm:7.5.2" dependencies: - "@storybook/blocks": "npm:7.5.1" - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/core-common": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/node-logger": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/theming": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/blocks": "npm:7.5.2" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/core-common": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/node-logger": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/theming": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" lodash: "npm:^4.17.21" ts-dedent: "npm:^2.0.0" peerDependencies: @@ -4161,29 +4141,29 @@ __metadata: optional: true react-dom: optional: true - checksum: ae4b7cdd547845820ab877ffb529c69cc1123776608bf84c673e7d5a10d6f2a6f3dc4e0e96514bfbbc261cca6274d9e5d931ce9e27b07dfc429953b37c59c707 + checksum: aadb53e36c576bce85998df5536d0f9e4fd07e826d2afad5c83ebab643396b8f9e2a021c67dafa31488f6435136ce09f8a65c74588cd78ed2406520504e6f138 languageName: node linkType: hard -"@storybook/addon-docs@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-docs@npm:7.5.1" +"@storybook/addon-docs@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-docs@npm:7.5.2" dependencies: "@jest/transform": "npm:^29.3.1" "@mdx-js/react": "npm:^2.1.5" - "@storybook/blocks": "npm:7.5.1" - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/csf-plugin": "npm:7.5.1" - "@storybook/csf-tools": "npm:7.5.1" + "@storybook/blocks": "npm:7.5.2" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/csf-plugin": "npm:7.5.2" + "@storybook/csf-tools": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" "@storybook/mdx2-csf": "npm:^1.0.0" - "@storybook/node-logger": "npm:7.5.1" - "@storybook/postinstall": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/react-dom-shim": "npm:7.5.1" - "@storybook/theming": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/node-logger": "npm:7.5.2" + "@storybook/postinstall": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/react-dom-shim": "npm:7.5.2" + "@storybook/theming": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" fs-extra: "npm:^11.1.0" remark-external-links: "npm:^8.0.0" remark-slug: "npm:^6.0.0" @@ -4191,60 +4171,60 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: ae0662ed91f6420110d2707133feb976644bb9536fa9601437a905c4e13f72ef1aec3540e209276ec429356bf8073dd02143ba40aeac9881381802d5429da633 - languageName: node - linkType: hard - -"@storybook/addon-essentials@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-essentials@npm:7.5.1" - dependencies: - "@storybook/addon-actions": "npm:7.5.1" - "@storybook/addon-backgrounds": "npm:7.5.1" - "@storybook/addon-controls": "npm:7.5.1" - "@storybook/addon-docs": "npm:7.5.1" - "@storybook/addon-highlight": "npm:7.5.1" - "@storybook/addon-measure": "npm:7.5.1" - "@storybook/addon-outline": "npm:7.5.1" - "@storybook/addon-toolbars": "npm:7.5.1" - "@storybook/addon-viewport": "npm:7.5.1" - "@storybook/core-common": "npm:7.5.1" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/node-logger": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" + checksum: c4f973b687fc0e5011e000fe20f53a14d7837d596cc8d9872b0261cc2d57d7ef8d9f3de9389c9e3c0e3a7a434af24f9a05aca8dddc6f2cf6f2f5055f54ee95ef + languageName: node + linkType: hard + +"@storybook/addon-essentials@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-essentials@npm:7.5.2" + dependencies: + "@storybook/addon-actions": "npm:7.5.2" + "@storybook/addon-backgrounds": "npm:7.5.2" + "@storybook/addon-controls": "npm:7.5.2" + "@storybook/addon-docs": "npm:7.5.2" + "@storybook/addon-highlight": "npm:7.5.2" + "@storybook/addon-measure": "npm:7.5.2" + "@storybook/addon-outline": "npm:7.5.2" + "@storybook/addon-toolbars": "npm:7.5.2" + "@storybook/addon-viewport": "npm:7.5.2" + "@storybook/core-common": "npm:7.5.2" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/node-logger": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" ts-dedent: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 9abf4a5bc62e1884393ca33a1ac9d3ca69a36bcaca51281dbe59e3c2f61e30acd8ddc3e99150fa5d88d999036f9899c711573ebb439cecda5dc359ab307c18da + checksum: 9c14d331047818bbd2d369de2790206a7769598fa45d24a41f5b985e11f2a389b50be4f4636396e2f19dd19a00c71f54efda05acab8ee86764379aef4c9cd630 languageName: node linkType: hard -"@storybook/addon-highlight@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-highlight@npm:7.5.1" +"@storybook/addon-highlight@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-highlight@npm:7.5.2" dependencies: - "@storybook/core-events": "npm:7.5.1" + "@storybook/core-events": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/preview-api": "npm:7.5.1" - checksum: c15ac6b84c2ca2c91bdce71b8ebcb331cdbd85ade0cd1f7c4e4bc6b2b63d2639daf58405f54728ccae0c48db8d82626312f29ff589b8e24559f6407a4caab1f3 + "@storybook/preview-api": "npm:7.5.2" + checksum: bb97505e425f37cdad2ab8ea3159da6a93fe827cf6e7077c13e325f57ee033321ba9e7c1f08f082bdaf5c872f4ee884697e040d8054113bf73fdad10b2b65b10 languageName: node linkType: hard -"@storybook/addon-interactions@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-interactions@npm:7.5.1" +"@storybook/addon-interactions@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-interactions@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/core-common": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/core-common": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/instrumenter": "npm:7.5.1" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/theming": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/instrumenter": "npm:7.5.2" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/theming": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" jest-mock: "npm:^27.0.6" polished: "npm:^4.2.2" ts-dedent: "npm:^2.2.0" @@ -4256,22 +4236,22 @@ __metadata: optional: true react-dom: optional: true - checksum: 6ac3528e2f4a2eb29a14949e07982ac8246623dc45a9956c86180efcd78d57aeea0e49748d56d5031d145b4e0da989df52b4e6ef04276c3a6844e52e8aec3d12 + checksum: 06feadb68a482698cce2d1cc0ccbe85af5ee9b69183768686ee0ef1fb049c28acd546cb04419e45ee6a43262724eb27a9c930f7ec936222f78ca7e77f83f23d6 languageName: node linkType: hard -"@storybook/addon-links@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-links@npm:7.5.1" +"@storybook/addon-links@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-links@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/csf": "npm:^0.1.0" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/router": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/router": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" prop-types: "npm:^15.7.2" ts-dedent: "npm:^2.0.0" peerDependencies: @@ -4282,21 +4262,21 @@ __metadata: optional: true react-dom: optional: true - checksum: ea438d8e07a3daa338c4be948300ae07ddda85166e128de2e385a9caea0faba3797215a8ce255e4c15a486b5c844de49c7c1a60170c34d96ee00e261e0c19eae + checksum: 20a33a8912e956856cf5f3f2931451fd19deab923729da0ac178f3cd78983faed94e312eaf80ebc76a9423b280a678335d24ff6202b28ec49affb66c7e402449 languageName: node linkType: hard -"@storybook/addon-measure@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-measure@npm:7.5.1" +"@storybook/addon-measure@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-measure@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" tiny-invariant: "npm:^1.3.1" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4306,21 +4286,21 @@ __metadata: optional: true react-dom: optional: true - checksum: 0600db8c5a60a710e65e14cb21b1663f513d2574472f39bb4dc5b654c38982f3b6da7ea7769bfeb892a77303e9c9189b469ed5d46c501921b44c3124eff65e05 + checksum: b05f74e6a3333fd88b0c47c83a6ff2e713869b02577b3c382b063a8398a175be58d4547b5e8da26f24da5406ed6ae6c83139fc2b60e92de51c53c1e6f3927575 languageName: node linkType: hard -"@storybook/addon-outline@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-outline@npm:7.5.1" +"@storybook/addon-outline@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-outline@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" ts-dedent: "npm:^2.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4330,19 +4310,19 @@ __metadata: optional: true react-dom: optional: true - checksum: 0183e8778ea8a5ef8a1fc914e06a9c93156bcce5faf374390c93398b1fc276e075b4e0b9b6690c3bfec09d70611fc8cda13ad3ad2beaf9e041e5c358c774e2d4 + checksum: 1b4e0e0acced77a2cdf8656fcc606ae0ab87ffe634c0b87d031f564c0c94c2f9277b5ad205d702172b04584b3b9b3ebd32d71158354e07d38065b0b3538878c7 languageName: node linkType: hard -"@storybook/addon-toolbars@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-toolbars@npm:7.5.1" +"@storybook/addon-toolbars@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-toolbars@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/theming": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/theming": "npm:7.5.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 @@ -4351,21 +4331,21 @@ __metadata: optional: true react-dom: optional: true - checksum: 3db60ffda02fb77321257a88eee9ae396d2cbe0e4f063b9565adbd646c55a02bad00b282173282a6e41f0ae1a154dcfe5fcaff79399f0670d2fd9d56f567e54e + checksum: 885f32b39e8789cfb94d2f6df0502326e573b3c0296f61c7fb7efd32e8128ea7b3597da9b82b7e8e1093df7327fbb30201820b635f3458c5f4bc87a63c19f755 languageName: node linkType: hard -"@storybook/addon-viewport@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/addon-viewport@npm:7.5.1" +"@storybook/addon-viewport@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/addon-viewport@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/theming": "npm:7.5.1" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/theming": "npm:7.5.2" memoizerific: "npm:^1.11.3" prop-types: "npm:^15.7.2" peerDependencies: @@ -4376,7 +4356,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 2dad5761e5cf951d221084470076f7c587b07f50f064eba16317d31a3f1b80f694f286f1843fb9d4830649d7e57f76290c43de30cdb0856d99515c77c81db155 + checksum: 74c0c95434165ee1395282dcc5c5397bb00bc0c4637793ad936f10cd06701b3e05534d446def741b31240e840325740bf6f6f3bbf2d61d30b8b84bcb6d09ae4a languageName: node linkType: hard @@ -4430,21 +4410,21 @@ __metadata: languageName: node linkType: hard -"@storybook/blocks@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/blocks@npm:7.5.1" +"@storybook/blocks@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/blocks@npm:7.5.2" dependencies: - "@storybook/channels": "npm:7.5.1" - "@storybook/client-logger": "npm:7.5.1" - "@storybook/components": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/channels": "npm:7.5.2" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/components": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/csf": "npm:^0.1.0" - "@storybook/docs-tools": "npm:7.5.1" + "@storybook/docs-tools": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/manager-api": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/theming": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/manager-api": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/theming": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" "@types/lodash": "npm:^4.14.167" color-convert: "npm:^2.0.1" dequal: "npm:^2.0.2" @@ -4460,7 +4440,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 47542bc96d54fa858a98496560c656ae9eaa16ecb9c359d1490b9c7a260c63b065b7f5930f8df7d6b0b8ecdf994997edaf969f73805054b1c4bf9ed120b9a412 + checksum: 51feb0e4f9a2e1ec237a9d4357d874d194ee3e65e8a274314115cb778bb5f498c85ab5a27caf02d6aab6441d06eb4718638e22c682c5c2538072a49c1f9ca2c8 languageName: node linkType: hard @@ -4564,17 +4544,17 @@ __metadata: languageName: node linkType: hard -"@storybook/channels@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/channels@npm:7.5.1" +"@storybook/channels@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/channels@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" qs: "npm:^6.10.0" telejson: "npm:^7.2.0" tiny-invariant: "npm:^1.3.1" - checksum: 25ea5765241ec71c8eb23bd98455054a155d9017a8235729f0b14c1592cc3ce264e0843bdd265a63d900c02c5470635e74ea8b1bff78f86c41ac46be1abfa932 + checksum: f6a9a32d94d28a1f07912383025072c5ba9c7be7759e2abdcfedc1be04ecbe8de58cc12d29e43adfdedfeb944b58e64f109337bd6c4a62caceb742c7d2b7ee96 languageName: node linkType: hard @@ -4619,12 +4599,12 @@ __metadata: languageName: node linkType: hard -"@storybook/client-logger@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/client-logger@npm:7.5.1" +"@storybook/client-logger@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/client-logger@npm:7.5.2" dependencies: "@storybook/global": "npm:^5.0.0" - checksum: aedb53847d282152afc5d8f5c1eef7107d2c6d788322bfa7e672f11079daa9cda3bd2f485291bf9553c86a1c92cff8431961bfce92ea5515b2806fd72da217e7 + checksum: 29ff2e4469125b733c0aa3aa51f927f0c140402be9613d35b378eb0824f7c23ab9a295d1b7c217254a1ff9d1517baa107ada9e601680637ada9fcfec5978bdb7 languageName: node linkType: hard @@ -4647,24 +4627,24 @@ __metadata: languageName: node linkType: hard -"@storybook/components@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/components@npm:7.5.1" +"@storybook/components@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/components@npm:7.5.2" dependencies: "@radix-ui/react-select": "npm:^1.2.2" "@radix-ui/react-toolbar": "npm:^1.0.4" - "@storybook/client-logger": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" "@storybook/csf": "npm:^0.1.0" "@storybook/global": "npm:^5.0.0" - "@storybook/theming": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/theming": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" memoizerific: "npm:^1.11.3" use-resize-observer: "npm:^9.1.0" util-deprecate: "npm:^1.0.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 04699e50746e9953763b5644e9219095daba7ec96b4977b7113ad5e1c794a31fc233bec452eb09d5cc06c92525d0143d2601a6870be190fb9743dcd4d486e423 + checksum: b2779724251938a5ae235c0f93ccdf9fbe535772eee3929f9e7770c8bedecc809cdf9b363e100234083d2c02fe1c4604377c45c12c6afec222895dcf70be8271 languageName: node linkType: hard @@ -4703,13 +4683,13 @@ __metadata: languageName: node linkType: hard -"@storybook/core-client@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/core-client@npm:7.5.1" +"@storybook/core-client@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/core-client@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - checksum: eb89a2ffad9646a4ba96471bbaa605e314cd6afbfe23fa3ddb4a0128e343a5d7dee7c0f5a5a28e2a2bea3c9d96d9505d9139efe05b0d24f863e25ce174eef042 + "@storybook/client-logger": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + checksum: 01ccb726ab15a776be8f9ade5293969f5f75e5f2bf62d795164b7e3e4f283b0136380467de9057761f886a54d1c8083aac6d1268473ce4bbb94fa3d61f075edf languageName: node linkType: hard @@ -4777,13 +4757,13 @@ __metadata: languageName: node linkType: hard -"@storybook/core-common@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/core-common@npm:7.5.1" +"@storybook/core-common@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/core-common@npm:7.5.2" dependencies: - "@storybook/core-events": "npm:7.5.1" - "@storybook/node-logger": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/core-events": "npm:7.5.2" + "@storybook/node-logger": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" "@types/find-cache-dir": "npm:^3.2.1" "@types/node": "npm:^18.0.0" "@types/node-fetch": "npm:^2.6.4" @@ -4804,7 +4784,7 @@ __metadata: pretty-hrtime: "npm:^1.0.3" resolve-from: "npm:^5.0.0" ts-dedent: "npm:^2.0.0" - checksum: 7d0af920e2b6ad591e580f922c51cf433da035b34e7b26c576b84f2d90ea9a8b3e6dfe6b6b89ef6f2909a4dae959db51ac639dc7943839f6c1fce244cb907172 + checksum: 189b80f0b66e36adfe3b0a1c753185001981ea7ae815e4f475ba9733a5f5a6676a64e97fcea94a4a4de9ac32e6deb4c76ad76b6c7547fe97ba1635b7778ac78c languageName: node linkType: hard @@ -4817,39 +4797,39 @@ __metadata: languageName: node linkType: hard -"@storybook/core-events@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/core-events@npm:7.5.1" +"@storybook/core-events@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/core-events@npm:7.5.2" dependencies: ts-dedent: "npm:^2.0.0" - checksum: 5d0b21480b437922527236cce0522c849fe4972bd073e74b322b5c77015ec2b447931ad67ef4ddd4cfdc16a7e6fe42ca12905338099902258c664c5c7238b3e2 + checksum: eb2e2cae5412ce18283cafa0c68f048145b23c79e626d8e76625e24d2a8f8ac171d5fd0d42d47ad4d1bfba278f436d5761cba866faebc04fbdaae55a60d41411 languageName: node linkType: hard -"@storybook/csf-plugin@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/csf-plugin@npm:7.5.1" +"@storybook/csf-plugin@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/csf-plugin@npm:7.5.2" dependencies: - "@storybook/csf-tools": "npm:7.5.1" + "@storybook/csf-tools": "npm:7.5.2" unplugin: "npm:^1.3.1" - checksum: 979060ef98e48d60645a265ad7f4eb7fadf760617612dc70b1c5b7368aa389795da0e7e8817a29b0b055a90e781de23ae24bc18f16679947a988bf327ece2af5 + checksum: 497f1b6086051919deb9350de9a3f3c6dcc9411f247f4729bb5920c7ddc8adffcc0456b9baf096edc5b75fbd3693a4b6662c2e4c9aeb9bee4f19e22fa866fc7a languageName: node linkType: hard -"@storybook/csf-tools@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/csf-tools@npm:7.5.1" +"@storybook/csf-tools@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/csf-tools@npm:7.5.2" dependencies: "@babel/generator": "npm:^7.22.9" "@babel/parser": "npm:^7.22.7" "@babel/traverse": "npm:^7.22.8" "@babel/types": "npm:^7.22.5" "@storybook/csf": "npm:^0.1.0" - "@storybook/types": "npm:7.5.1" + "@storybook/types": "npm:7.5.2" fs-extra: "npm:^11.1.0" recast: "npm:^0.23.1" ts-dedent: "npm:^2.0.0" - checksum: ec0c5100379beeb691b3bad6e9368f2946d1487f748562a3b4e2871af3541db13d26bd2a413b7dcbb756a6af874f161c091035a21fb60263795504636e640a82 + checksum: c1e70e7151b82cc2f5c66d7dbab45c29e1cf31d88ef2060fe32bd8e6e3f3746f2f9cacac9956856aceb23953ed781caeda4c70e3783f3e296dd1578a51d8be0b languageName: node linkType: hard @@ -4880,17 +4860,17 @@ __metadata: languageName: node linkType: hard -"@storybook/docs-tools@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/docs-tools@npm:7.5.1" +"@storybook/docs-tools@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/docs-tools@npm:7.5.2" dependencies: - "@storybook/core-common": "npm:7.5.1" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/core-common": "npm:7.5.2" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" "@types/doctrine": "npm:^0.0.3" doctrine: "npm:^3.0.0" lodash: "npm:^4.17.21" - checksum: 7eccd668ac4fc50730482025044c3ebff96bd07bf9cfbee5212c4b89ebb3e18b3730c217044094bf3cf1114d4d4cabccb92485698b176222ec4a80dd19128a04 + checksum: a314844ab89f7cf88c39d0da1b87058e4f2e0b08e172f636eb8d020ab88f42e5859d5a93068b4eae16d61d20f0f254ed87a85bba0bbcfa38034a9c60d1769126 languageName: node linkType: hard @@ -4901,31 +4881,31 @@ __metadata: languageName: node linkType: hard -"@storybook/instrumenter@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/instrumenter@npm:7.5.1" +"@storybook/instrumenter@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/instrumenter@npm:7.5.2" dependencies: - "@storybook/channels": "npm:7.5.1" - "@storybook/client-logger": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/channels": "npm:7.5.2" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/preview-api": "npm:7.5.1" - checksum: 57af56556fccb03a646c4ef2db546cced728460a29987c6d18e43450e93d864c73302a470f2b790cd1383d265946c1ef07dddb7f55523ebf51f431f9a1ae4bb1 + "@storybook/preview-api": "npm:7.5.2" + checksum: e7d5a92e8ddc66f82cd2be1baad99b1622d37081d21c37cf960c6e2e1360f8a9c4a7e26f1254aa7d881b060a9e1dea578f9b8d321a9cf1114dad45772abb9ea5 languageName: node linkType: hard -"@storybook/manager-api@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/manager-api@npm:7.5.1" +"@storybook/manager-api@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/manager-api@npm:7.5.2" dependencies: - "@storybook/channels": "npm:7.5.1" - "@storybook/client-logger": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/channels": "npm:7.5.2" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/csf": "npm:^0.1.0" "@storybook/global": "npm:^5.0.0" - "@storybook/router": "npm:7.5.1" - "@storybook/theming": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/router": "npm:7.5.2" + "@storybook/theming": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" memoizerific: "npm:^1.11.3" @@ -4936,7 +4916,7 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: ae2ea9081fc660bd7350eafeebe39275f2358f368dffa3f9117f385adc5eed399e0b33a8b26d5ea38e09d0088edcbeebd605d046b8ee87689b42cc77b3825598 + checksum: 13d2a04d2cce0ab35632dd48009a94f1335925fe83670982b0a906bf86881b4282c0a38074d2cffa195077c8025ab056be5d8d3516e6222e671b19bec4d92321 languageName: node linkType: hard @@ -5009,30 +4989,30 @@ __metadata: languageName: node linkType: hard -"@storybook/node-logger@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/node-logger@npm:7.5.1" - checksum: 4977191230f3a34efb644218c1092c293757be358224ce7cca8ad32e1f84f18c51b7bc564728b5b9350d4f1bb0c2feb8b08e22d29741c10e40c7c79c20a56a5d +"@storybook/node-logger@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/node-logger@npm:7.5.2" + checksum: 5ce6fb2d159d5a1f5396aa2e6b2e4d0b8a34f3458c3cdc7a0075eccf81668caffdcdeddab91ef144edfac5e341d9a6a18f77c43ba86076b14f124ce6fe7a863d languageName: node linkType: hard -"@storybook/postinstall@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/postinstall@npm:7.5.1" - checksum: 07793a47dd50b48005d61b9560c2a3647dc3bd73ffc8f14773211d7dd1b09e9a193b069e28304d6f0a46b6e9b1daca0740869e8af78b4642247daaab78bc0e7e +"@storybook/postinstall@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/postinstall@npm:7.5.2" + checksum: 2e7672e9408b2ba23bcaee8708634bced01c8a4e9acd1f4da2c67d241586fda8230450f5360a4699e49c5ba9b1a053e89cb6cc8cb9aa630feb05a7a5e7fa8ca0 languageName: node linkType: hard -"@storybook/preview-api@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/preview-api@npm:7.5.1" +"@storybook/preview-api@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/preview-api@npm:7.5.2" dependencies: - "@storybook/channels": "npm:7.5.1" - "@storybook/client-logger": "npm:7.5.1" - "@storybook/core-events": "npm:7.5.1" + "@storybook/channels": "npm:7.5.2" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/core-events": "npm:7.5.2" "@storybook/csf": "npm:^0.1.0" "@storybook/global": "npm:^5.0.0" - "@storybook/types": "npm:7.5.1" + "@storybook/types": "npm:7.5.2" "@types/qs": "npm:^6.9.5" dequal: "npm:^2.0.2" lodash: "npm:^4.17.21" @@ -5041,7 +5021,7 @@ __metadata: synchronous-promise: "npm:^2.0.15" ts-dedent: "npm:^2.0.0" util-deprecate: "npm:^1.0.2" - checksum: dd600eeaf752def91b81816bdfe353edf4217a81fca76535e9bec98fff4d4614ada2eded486f0404c6e3304ef734d2945cf8e93bff7ab1753d2b75acd2925415 + checksum: 2b4f07dfb08bdf4eecaa475f946b8217a052f309759413c0c311f7bff28350975b789fe34f3a02ba43f40b3d0b59a302406a4144ea9d64c651813d7280e3d0aa languageName: node linkType: hard @@ -5072,27 +5052,27 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/react-dom-shim@npm:7.5.1" +"@storybook/react-dom-shim@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/react-dom-shim@npm:7.5.2" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 4ae5e7501495f16ddd2906ea0d95b496c3c99d18cc4198b97c58c81bd59c0ca5c803fe262f9023d8125060523e7234e4dc82d75c019a3a185cf071ddaa3a6c03 + checksum: 89d67d86be2855c2a494dd39f6c1068f54676a5d091e9a56f2ab7be2ae0d08a86cc56ae6e7432a37e4ff9e547f789ccd8afe54e8d96d734f9dd395caa98cd55f languageName: node linkType: hard -"@storybook/react@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/react@npm:7.5.1" +"@storybook/react@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/react@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" - "@storybook/core-client": "npm:7.5.1" - "@storybook/docs-tools": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" + "@storybook/core-client": "npm:7.5.2" + "@storybook/docs-tools": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" - "@storybook/preview-api": "npm:7.5.1" - "@storybook/react-dom-shim": "npm:7.5.1" - "@storybook/types": "npm:7.5.1" + "@storybook/preview-api": "npm:7.5.2" + "@storybook/react-dom-shim": "npm:7.5.2" + "@storybook/types": "npm:7.5.2" "@types/escodegen": "npm:^0.0.6" "@types/estree": "npm:^0.0.51" "@types/node": "npm:^18.0.0" @@ -5114,7 +5094,7 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: b9bca9e619ba96b574f6098af12b6bda0fa5f792c35750656fa8b67b390e91e202c2ca5b841b04b90b9db091454b5c57eac1e58a74fd5e072ed0715d71c176a3 + checksum: af1a3d5d13c36155ae9717ec233fd272b351784f5ed60b8dd5fbe5c37aa025924b38e6348e9e6616091f3d6b90219b91ccf4b11e31fcef8e24a4c414cecb63dd languageName: node linkType: hard @@ -5134,17 +5114,17 @@ __metadata: languageName: node linkType: hard -"@storybook/router@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/router@npm:7.5.1" +"@storybook/router@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/router@npm:7.5.2" dependencies: - "@storybook/client-logger": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" memoizerific: "npm:^1.11.3" qs: "npm:^6.10.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 52f84e2c53d919d492d38cd18df745b82ec1d61b959a78bbf48664e48414b77da8474f009c6fb10f8dba6d4c6eb29fd44a1c6d3e10b37bac2b3a451113177c2f + checksum: 2746875990210cbcb96be8a5b014fc8314c2fc2e5c19b42cce0e3accea2b0f70bafe5b2342d3d93f686cbbe3977d82553c722947efb1e213ce82accfbad93678 languageName: node linkType: hard @@ -5212,30 +5192,30 @@ __metadata: languageName: node linkType: hard -"@storybook/theming@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/theming@npm:7.5.1" +"@storybook/theming@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/theming@npm:7.5.2" dependencies: "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.0.0" - "@storybook/client-logger": "npm:7.5.1" + "@storybook/client-logger": "npm:7.5.2" "@storybook/global": "npm:^5.0.0" memoizerific: "npm:^1.11.3" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 2b59ac6bb41a024ca31e5a39daa1b46c52da03bc1d69f3e3f91173621a0d1928a722acebe63d1ff84f50e0bbc0a661f5f48bde36a40292e40c670674bdeaf53a + checksum: 1b113f32fcda056ba6e61806de71f35795260285b3467d30654e42d2c6e0b639baacc7ce62970dfbc7bee6fd1f823c410f85bd4db0c853bb8751206d033d2e7e languageName: node linkType: hard -"@storybook/types@npm:7.5.1": - version: 7.5.1 - resolution: "@storybook/types@npm:7.5.1" +"@storybook/types@npm:7.5.2": + version: 7.5.2 + resolution: "@storybook/types@npm:7.5.2" dependencies: - "@storybook/channels": "npm:7.5.1" + "@storybook/channels": "npm:7.5.2" "@types/babel__core": "npm:^7.0.0" "@types/express": "npm:^4.7.0" file-system-cache: "npm:2.3.0" - checksum: 8f3aeb459f0b1af5c6ed8c6bf79d1be9089078733ef2b7e6353862d1238d0bc5a303749210ad268a220e9b79c9ebc6b5f8ef7e1fef423a5d7e4bb6c3ed627bfc + checksum: 482ee61ebdce9f04a2d5f839e2da5653bab63cf0c9acda6a7a7876fd16ae32f1db9a979358343495d979af266c5c1fbd7dffae17c7910118877cc3daca7e4337 languageName: node linkType: hard @@ -5725,11 +5705,9 @@ __metadata: linkType: hard "@types/node@npm:^18.0.0": - version: 18.18.7 - resolution: "@types/node@npm:18.18.7" - dependencies: - undici-types: "npm:~5.26.4" - checksum: f1ab9c8d318ad9b05f83664bd8a209b9a6410052b4e7124469771ee681ab080f9e65ac3ed3db8a3403976c1ee2941da1eef8008f42a7a3e2e084dc556d5494b5 + version: 18.18.6 + resolution: "@types/node@npm:18.18.6" + checksum: 50312053b0906058aa026e1c85c9125b4f0e8d6ae5e3699fb5bc8e0d5b9d1c2b12303902b2b91477c389f15ad40235d240b882819dd93a49bd6b46983f63be1c languageName: node linkType: hard @@ -5800,7 +5778,18 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:18.2.33, @types/react@npm:>=16": +"@types/react@npm:*, @types/react@npm:>=16": + version: 18.2.31 + resolution: "@types/react@npm:18.2.31" + dependencies: + "@types/prop-types": "npm:*" + "@types/scheduler": "npm:*" + csstype: "npm:^3.0.2" + checksum: d2793873aef68038e0dc3ee05a573c663fcd3ba7402f1134a633df25aaeb72fd397479d5a5f02e9edc8cd5d000479a73f7bdc64cf00c50fb022c883f22e1fd0f + languageName: node + linkType: hard + +"@types/react@npm:18.2.33": version: 18.2.33 resolution: "@types/react@npm:18.2.33" dependencies: @@ -6456,7 +6445,7 @@ __metadata: "@willbooster/eslint-config-ts": "npm:10.5.1" "@willbooster/prettier-config": "npm:9.1.2" blitz: "npm:2.0.0-beta.34" - build-ts: "npm:11.0.6" + build-ts: "npm:11.0.9" eslint: "npm:8.52.0" eslint-config-prettier: "npm:9.0.0" eslint-import-resolver-typescript: "npm:3.6.1" @@ -6494,7 +6483,7 @@ __metadata: "@typescript-eslint/parser": "npm:6.9.0" "@willbooster/eslint-config-ts": "npm:10.5.1" "@willbooster/prettier-config": "npm:9.1.2" - build-ts: "npm:11.0.6" + build-ts: "npm:11.0.9" dotenv: "npm:16.3.1" eslint: "npm:8.52.0" eslint-config-prettier: "npm:9.0.0" @@ -6519,14 +6508,14 @@ __metadata: dependencies: "@babel/core": "npm:7.23.2" "@mdx-js/react": "npm:3.0.0" - "@storybook/addon-actions": "npm:7.5.1" - "@storybook/addon-docs": "npm:7.5.1" - "@storybook/addon-essentials": "npm:7.5.1" - "@storybook/addon-interactions": "npm:7.5.1" - "@storybook/addon-links": "npm:7.5.1" + "@storybook/addon-actions": "npm:7.5.2" + "@storybook/addon-docs": "npm:7.5.2" + "@storybook/addon-essentials": "npm:7.5.2" + "@storybook/addon-interactions": "npm:7.5.2" + "@storybook/addon-links": "npm:7.5.2" "@storybook/builder-webpack4": "npm:6.5.16" "@storybook/manager-webpack4": "npm:6.5.16" - "@storybook/react": "npm:7.5.1" + "@storybook/react": "npm:7.5.2" "@storybook/testing-library": "npm:0.2.2" "@types/eslint": "npm:8.44.6" "@types/micromatch": "npm:4.0.4" @@ -6537,7 +6526,7 @@ __metadata: "@willbooster/eslint-config-ts-react": "npm:10.1.9" "@willbooster/prettier-config": "npm:9.1.2" babel-loader: "npm:9.1.3" - build-ts: "npm:11.0.6" + build-ts: "npm:11.0.9" eslint: "npm:8.52.0" eslint-config-prettier: "npm:9.0.0" eslint-import-resolver-typescript: "npm:3.6.1" @@ -6572,7 +6561,7 @@ __metadata: "@typescript-eslint/parser": "npm:6.9.0" "@willbooster/eslint-config-ts": "npm:10.5.1" "@willbooster/prettier-config": "npm:9.1.2" - build-ts: "npm:11.0.6" + build-ts: "npm:11.0.9" eslint: "npm:8.52.0" eslint-config-prettier: "npm:9.0.0" eslint-import-resolver-typescript: "npm:3.6.1" @@ -6602,7 +6591,8 @@ __metadata: "@typescript-eslint/parser": "npm:6.9.0" "@willbooster/eslint-config-ts": "npm:10.5.1" "@willbooster/prettier-config": "npm:9.1.2" - build-ts: "npm:11.0.6" + at-decorators: "npm:1.2.2" + build-ts: "npm:11.0.9" chalk: "npm:5.3.0" dotenv: "npm:16.3.1" eslint: "npm:8.52.0" @@ -6704,9 +6694,9 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": - version: 8.3.0 - resolution: "acorn-walk@npm:8.3.0" - checksum: 24346e595f507b6e704a60d35f3c5e1aa9891d4fb6a3fc3d856503ab718cc26cabb5e3e1ff0ff8da6ec03d60a8226ebdb602805a94f970e7f797ea3b8b09437f + version: 8.2.0 + resolution: "acorn-walk@npm:8.2.0" + checksum: dbe92f5b2452c93e960c5594e666dd1fae141b965ff2cb4a1e1d0381e3e4db4274c5ce4ffa3d681a86ca2a8d4e29d5efc0670a08e23fd2800051ea387df56ca2 languageName: node linkType: hard @@ -6729,11 +6719,11 @@ __metadata: linkType: hard "acorn@npm:^8.10.0, acorn@npm:^8.4.1, acorn@npm:^8.5.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.11.2 - resolution: "acorn@npm:8.11.2" + version: 8.10.0 + resolution: "acorn@npm:8.10.0" bin: acorn: bin/acorn - checksum: a3ed76c761b75ec54b1ec3068fb7f113a182e95aea7f322f65098c2958d232e3d211cb6dac35ff9c647024b63714bc528a26d54a925d1fef2c25585b4c8e4017 + checksum: deaeebfbea6e40f6c0e1070e9b0e16e76ba484de54cbd735914d1d41d19169a450de8630b7a3a0c4e271a3b0c0b075a3427ad1a40d8a69f8747c0e8cb02ee3e2 languageName: node linkType: hard @@ -7451,6 +7441,13 @@ __metadata: languageName: node linkType: hard +"at-decorators@npm:1.2.2": + version: 1.2.2 + resolution: "at-decorators@npm:1.2.2" + checksum: 0aa7f7da923f11176442182d01fdda199a6e2e96d7c8f4497ba464ee79acd94f7af22560ccfdcc903ab7ad7b95a313c4e2b00cd7defbb95a3c4fb85166222213 + languageName: node + linkType: hard + "at-least-node@npm:^1.0.0": version: 1.0.0 resolution: "at-least-node@npm:1.0.0" @@ -7794,7 +7791,7 @@ __metadata: languageName: node linkType: hard -"bn.js@npm:^5.0.0, bn.js@npm:^5.2.1": +"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1": version: 5.2.1 resolution: "bn.js@npm:5.2.1" checksum: bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa @@ -7948,7 +7945,7 @@ __metadata: languageName: node linkType: hard -"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0": +"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": version: 4.1.0 resolution: "browserify-rsa@npm:4.1.0" dependencies: @@ -7959,19 +7956,19 @@ __metadata: linkType: hard "browserify-sign@npm:^4.0.0": - version: 4.2.2 - resolution: "browserify-sign@npm:4.2.2" + version: 4.2.1 + resolution: "browserify-sign@npm:4.2.1" dependencies: - bn.js: "npm:^5.2.1" - browserify-rsa: "npm:^4.1.0" + bn.js: "npm:^5.1.1" + browserify-rsa: "npm:^4.0.1" create-hash: "npm:^1.2.0" create-hmac: "npm:^1.1.7" - elliptic: "npm:^6.5.4" + elliptic: "npm:^6.5.3" inherits: "npm:^2.0.4" - parse-asn1: "npm:^5.1.6" - readable-stream: "npm:^3.6.2" - safe-buffer: "npm:^5.2.1" - checksum: 4d1292e5c165d93455630515003f0e95eed9239c99e2d373920c5b56903d16296a3d23cd4bdc4d298f55ad9b83714a9e63bc4839f1166c303349a16e84e9b016 + parse-asn1: "npm:^5.1.5" + readable-stream: "npm:^3.6.0" + safe-buffer: "npm:^5.2.0" + checksum: 8f00a370e3e97060977dc58e51251d3ca398ee73523994a44430321e8de2c7d85395362d59014b2b07efe4190f369baee2ff28eb8f405ff4660b776651cf052d languageName: node linkType: hard @@ -8070,9 +8067,9 @@ __metadata: languageName: node linkType: hard -"build-ts@npm:11.0.6": - version: 11.0.6 - resolution: "build-ts@npm:11.0.6" +"build-ts@npm:11.0.9": + version: 11.0.9 + resolution: "build-ts@npm:11.0.9" dependencies: "@babel/core": "npm:7.23.2" "@babel/plugin-proposal-decorators": "npm:7.23.2" @@ -8109,7 +8106,7 @@ __metadata: yargs: "npm:17.7.2" bin: build-ts: bin/index.js - checksum: dad4c6f67a709c267c79f0333c05cda50f9cce53e3e3091f8067dac5409503a3c94f477f65618bc23de8e23ba7f836fa1cfbadd0feccec22b1aec0d4f8674735 + checksum: 23a7abdf2f4bb6fcc322397b800b19ef178d7de26573d9b0370bd61701f4bb6679ee0c5c81dce69f3ae0ffb6d48dba4e2b18d79b6c2d189e1c2de385a0efa55f languageName: node linkType: hard @@ -8199,32 +8196,6 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^16.1.0": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" - dependencies: - "@npmcli/fs": "npm:^2.1.0" - "@npmcli/move-file": "npm:^2.0.0" - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.1.0" - glob: "npm:^8.0.1" - infer-owner: "npm:^1.0.4" - lru-cache: "npm:^7.7.1" - minipass: "npm:^3.1.6" - minipass-collect: "npm:^1.0.2" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - mkdirp: "npm:^1.0.4" - p-map: "npm:^4.0.0" - promise-inflight: "npm:^1.0.1" - rimraf: "npm:^3.0.2" - ssri: "npm:^9.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^2.0.0" - checksum: cdf6836e1c457d2a5616abcaf5d8240c0346b1f5bd6fdb8866b9d84b6dff0b54e973226dc11e0d099f35394213d24860d1989c8358d2a41b39eb912b3000e749 - languageName: node - linkType: hard - "cacache@npm:^17.0.0, cacache@npm:^17.0.4, cacache@npm:^17.1.3": version: 17.1.4 resolution: "cacache@npm:17.1.4" @@ -8358,9 +8329,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001109, caniuse-lite@npm:^1.0.30001518, caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001557 - resolution: "caniuse-lite@npm:1.0.30001557" - checksum: 27c5aa8de4c0f6dc2500492600d817f46633127db61adddfad75e53e9bf0270379f9086afac6964b5dcde72938078f1fb7bad7e8b6904da0976b31353b03cdac + version: 1.0.30001551 + resolution: "caniuse-lite@npm:1.0.30001551" + checksum: fa27a83dd363bcb8fb2ef65c3aaadbbf7671a84ccd663c6683e27476f97b7c017c0cc9ecb99507e260fe81b5a14bc8adce1d6d3161baf0f7c558739f7d0ffe9d languageName: node linkType: hard @@ -9931,13 +9902,13 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.4.535": - version: 1.4.569 - resolution: "electron-to-chromium@npm:1.4.569" - checksum: d096c7adeb1e0df06ea6cb783c8d9bbd340f343185f8b16acfbe87f54ae2bc94173382383acdfe52ad83b21c9593ee41c27ef3fb49d667a4358f48bf6500b49c + version: 1.4.563 + resolution: "electron-to-chromium@npm:1.4.563" + checksum: 2f5b7ff65b863378f737467f694041d73de79812c8ed46ff405e319ff0fb12dd0e978f6f1769407879ea694b18117947370e9ba40be51aef50f224f1d36ed11a languageName: node linkType: hard -"elliptic@npm:^6.5.3, elliptic@npm:^6.5.4": +"elliptic@npm:^6.5.3": version: 6.5.4 resolution: "elliptic@npm:6.5.4" dependencies: @@ -11556,9 +11527,9 @@ __metadata: linkType: hard "flow-parser@npm:0.*": - version: 0.220.0 - resolution: "flow-parser@npm:0.220.0" - checksum: c4fc07940ec264b8ebd98c2c3e13f16022469f940f0366682c7c3dddfad9bb2a7d1fc889fcd47cf50834d97ddcb5eff0a8a0da5dcab48a87507a1a0e29492c90 + version: 0.219.3 + resolution: "flow-parser@npm:0.219.3" + checksum: 3c01fd5a2796f9a5edad24241887755a2e1fdf4d1f3a492c60c4317613d54ed4f760e86501b39d4a6d8a831862998d9e6f3a6d5c1f607c2375f56f190d01d836 languageName: node linkType: hard @@ -11742,7 +11713,7 @@ __metadata: languageName: node linkType: hard -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": +"fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" dependencies: @@ -12130,7 +12101,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^8.0.1, glob@npm:^8.0.3": +"glob@npm:^8.0.3": version: 8.1.0 resolution: "glob@npm:8.1.0" dependencies: @@ -12607,7 +12578,7 @@ __metadata: languageName: node linkType: hard -"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.0, http-cache-semantics@npm:^4.1.1": +"http-cache-semantics@npm:^4.0.0, http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc @@ -12993,12 +12964,21 @@ __metadata: languageName: node linkType: hard -"is-accessor-descriptor@npm:^1.0.1": - version: 1.0.1 - resolution: "is-accessor-descriptor@npm:1.0.1" +"is-accessor-descriptor@npm:^0.1.6": + version: 0.1.6 + resolution: "is-accessor-descriptor@npm:0.1.6" dependencies: - hasown: "npm:^2.0.0" - checksum: d034034074c5ffeb6c868e091083182279db1a956f49f8d1494cecaa0f8b99d706556ded2a9b20d9aa290549106eef8204d67d8572902e06dcb1add6db6b524d + kind-of: "npm:^3.0.2" + checksum: f2c314b314ec6e8a6e559351bff3c7ee9aed7a5e9c6f61dd8cb9e1382c8bfe33dca3f0e0af13daf9ded9e6e66390ff23b4acfb615d7a249009a51506a7b0f151 + languageName: node + linkType: hard + +"is-accessor-descriptor@npm:^1.0.0": + version: 1.0.0 + resolution: "is-accessor-descriptor@npm:1.0.0" + dependencies: + kind-of: "npm:^6.0.0" + checksum: d68edafd8ef133e9003837f3c80f4e5b82b12ab5456c772d1796857671ae83e3a426ed225a28a7e35bceabbce68c1f1ffdabf47e6d53f5a4d6c4558776ad3c20 languageName: node linkType: hard @@ -13128,12 +13108,21 @@ __metadata: languageName: node linkType: hard -"is-data-descriptor@npm:^1.0.1": - version: 1.0.1 - resolution: "is-data-descriptor@npm:1.0.1" +"is-data-descriptor@npm:^0.1.4": + version: 0.1.4 + resolution: "is-data-descriptor@npm:0.1.4" dependencies: - hasown: "npm:^2.0.0" - checksum: ad3acc372e3227f87eb8cdba112c343ca2a67f1885aecf64f02f901cb0858a1fc9488ad42135ab102e9d9e71a62b3594740790bb103a9ba5da830a131a89e3e8 + kind-of: "npm:^3.0.2" + checksum: 32fda7e966b2c1f093230d5ef2aad1bb86e43e7280da50961e38ec31dbd8a50570a2911fd45277d321074a0762adc98e8462bb62820462594128857225e90d21 + languageName: node + linkType: hard + +"is-data-descriptor@npm:^1.0.0": + version: 1.0.0 + resolution: "is-data-descriptor@npm:1.0.0" + dependencies: + kind-of: "npm:^6.0.0" + checksum: bed31385d7d1a0dbb2ab3077faf2188acf42609192dca4e320ed7b3dc14a9d70c00658956cdaa2c0402be136c6b56e183973ad81b730fd90ab427fb6fd3608be languageName: node linkType: hard @@ -13147,22 +13136,24 @@ __metadata: linkType: hard "is-descriptor@npm:^0.1.0": - version: 0.1.7 - resolution: "is-descriptor@npm:0.1.7" + version: 0.1.6 + resolution: "is-descriptor@npm:0.1.6" dependencies: - is-accessor-descriptor: "npm:^1.0.1" - is-data-descriptor: "npm:^1.0.1" - checksum: f5960b9783f508aec570465288cb673d4b3cc4aae4e6de970c3afd9a8fc1351edcb85d78b2cce2ec5251893a423f73263cab3bb94cf365a8d71b5d510a116392 + is-accessor-descriptor: "npm:^0.1.6" + is-data-descriptor: "npm:^0.1.4" + kind-of: "npm:^5.0.0" + checksum: 6b8f5617b764ef8c6be3d54830184357e6cdedd8e0eddf1b97d0658616ac170bfdbc7c1ad00e0aa9f5b767acdb9d6c63d4df936501784b34936bd0f9acf3b665 languageName: node linkType: hard "is-descriptor@npm:^1.0.0, is-descriptor@npm:^1.0.2": - version: 1.0.3 - resolution: "is-descriptor@npm:1.0.3" + version: 1.0.2 + resolution: "is-descriptor@npm:1.0.2" dependencies: - is-accessor-descriptor: "npm:^1.0.1" - is-data-descriptor: "npm:^1.0.1" - checksum: b4ee667ea787d3a0be4e58536087fd0587de2b0b6672fbfe288f5b8d831ac4b79fd987f31d6c2d4e5543a42c97a87428bc5215ce292a1a47070147793878226f + is-accessor-descriptor: "npm:^1.0.0" + is-data-descriptor: "npm:^1.0.0" + kind-of: "npm:^6.0.2" + checksum: a05169c7a87feb88fc155e3ada469090cfabb5a548a3f794358b511cc47a0871b8b95e7345be4925a22ef3df585c3923b31943b3ad6255ce563a9d97f2e221e0 languageName: node linkType: hard @@ -13500,9 +13491,9 @@ __metadata: linkType: hard "is-what@npm:^4.1.8": - version: 4.1.16 - resolution: "is-what@npm:4.1.16" - checksum: 611f1947776826dcf85b57cfb7bd3b3ea6f4b94a9c2f551d4a53f653cf0cb9d1e6518846648256d46ee6c91d114b6d09d2ac8a07306f7430c5900f87466aae5b + version: 4.1.15 + resolution: "is-what@npm:4.1.15" + checksum: 7d9bab85977d8352684a7b046cfee8d68e23029f0d6d5b4b7f366cf6c83dee39903e412b655ebf155dc9706d4d1bce02f6351f75a1426381961b4155394082db languageName: node linkType: hard @@ -14022,7 +14013,14 @@ __metadata: languageName: node linkType: hard -"kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": +"kind-of@npm:^5.0.0": + version: 5.1.0 + resolution: "kind-of@npm:5.1.0" + checksum: fe85b7a2ed4b4d5a12e16e01d00d5c336e1760842fe0da38283605b9880c984288935e87b13138909e4d23d2d197a1d492f7393c6638d2c0fab8a900c4fb0392 + languageName: node + linkType: hard + +"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2, kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" checksum: 61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 @@ -14574,31 +14572,7 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^10.0.3": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" - dependencies: - agentkeepalive: "npm:^4.2.1" - cacache: "npm:^16.1.0" - http-cache-semantics: "npm:^4.1.0" - http-proxy-agent: "npm:^5.0.0" - https-proxy-agent: "npm:^5.0.0" - is-lambda: "npm:^1.0.1" - lru-cache: "npm:^7.7.1" - minipass: "npm:^3.1.6" - minipass-collect: "npm:^1.0.2" - minipass-fetch: "npm:^2.0.3" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - promise-retry: "npm:^2.0.1" - socks-proxy-agent: "npm:^7.0.0" - ssri: "npm:^9.0.0" - checksum: 28ec392f63ab93511f400839dcee83107eeecfaad737d1e8487ea08b4332cd89a8f3319584222edd9f6f1d0833cf516691469496d46491863f9e88c658013949 - languageName: node - linkType: hard - -"make-fetch-happen@npm:^11.0.0, make-fetch-happen@npm:^11.0.1, make-fetch-happen@npm:^11.1.1": +"make-fetch-happen@npm:^11.0.0, make-fetch-happen@npm:^11.0.1, make-fetch-happen@npm:^11.0.3, make-fetch-happen@npm:^11.1.1": version: 11.1.1 resolution: "make-fetch-happen@npm:11.1.1" dependencies: @@ -15115,21 +15089,6 @@ __metadata: languageName: node linkType: hard -"minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^3.1.6" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 33ab2c5bdb3d91b9cb8bc6ae42d7418f4f00f7f7beae14b3bb21ea18f9224e792f560a6e17b6f1be12bbeb70dbe99a269f4204c60e5d99130a0777b153505c43 - languageName: node - linkType: hard - "minipass-fetch@npm:^3.0.0": version: 3.0.4 resolution: "minipass-fetch@npm:3.0.4" @@ -15182,7 +15141,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": +"minipass@npm:^3.0.0, minipass@npm:^3.1.1": version: 3.3.6 resolution: "minipass@npm:3.3.6" dependencies: @@ -15477,14 +15436,14 @@ __metadata: linkType: hard "node-gyp@npm:^9.0.0, node-gyp@npm:^9.4.0": - version: 9.4.1 - resolution: "node-gyp@npm:9.4.1" + version: 9.4.0 + resolution: "node-gyp@npm:9.4.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" glob: "npm:^7.1.4" graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^10.0.3" + make-fetch-happen: "npm:^11.0.3" nopt: "npm:^6.0.0" npmlog: "npm:^6.0.0" rimraf: "npm:^3.0.2" @@ -15493,7 +15452,7 @@ __metadata: which: "npm:^2.0.2" bin: node-gyp: bin/node-gyp.js - checksum: f7d676cfa79f27d35edf17fe9c80064123670362352d19729e5dc9393d7e99f1397491c3107eddc0c0e8941442a6244a7ba6c860cfbe4b433b4cae248a55fe10 + checksum: e8dfbe2b02f23d056f69e01c409381963e92c71cafba6c9cfbf63b038f65ca19ab8183bb6891d080e59c4eb2cc425fc736f42e90afc0f0030ecd97bfc64fb7ad languageName: node linkType: hard @@ -16434,7 +16393,7 @@ __metadata: languageName: node linkType: hard -"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.6": +"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": version: 5.1.6 resolution: "parse-asn1@npm:5.1.6" dependencies: @@ -16481,15 +16440,15 @@ __metadata: linkType: hard "parse-json@npm:^7.0.0": - version: 7.1.1 - resolution: "parse-json@npm:7.1.1" + version: 7.1.0 + resolution: "parse-json@npm:7.1.0" dependencies: "@babel/code-frame": "npm:^7.21.4" error-ex: "npm:^1.3.2" json-parse-even-better-errors: "npm:^3.0.0" lines-and-columns: "npm:^2.0.3" type-fest: "npm:^3.8.0" - checksum: a85ebc7430af7763fa52eb456d7efd35c35be5b06f04d8d80c37d0d33312ac6cdff12647acb9c95448dcc8b907dfafa81fb126e094aa132b0abc2a71b9df51d5 + checksum: 21471f9153a598bc54d86cf9da9343460094698cb974377ba2d2f0e1104302623c2cd5ff758770e5d634bdc99ee31a4cfc9f367be61f43e9b96243aa6b95f1f2 languageName: node linkType: hard @@ -17342,12 +17301,12 @@ __metadata: linkType: hard "react-devtools-core@npm:^4.19.1": - version: 4.28.5 - resolution: "react-devtools-core@npm:4.28.5" + version: 4.28.4 + resolution: "react-devtools-core@npm:4.28.4" dependencies: shell-quote: "npm:^1.6.1" ws: "npm:^7" - checksum: 1d71f9b69b8f557a752ba778a20eee9d33bf4393546dd32c96fa034a4b7cc4053f1ac4fccf1ed686a18e1149aa94c26f6d6c3a2c131c958a504199e8503d9ee1 + checksum: 3fbb61a11f79aad2cda9c499f23f74f748d0c8c4b65d133d0dd6ed4495beaccd6cd4b223dc47aabc5196f75362de687d38110851bcd3b386855486d6da8f953c languageName: node linkType: hard @@ -17587,7 +17546,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": +"readable-stream@npm:2 || 3, readable-stream@npm:3, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -18337,7 +18296,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 @@ -19154,15 +19113,6 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^9.0.0": - version: 9.0.1 - resolution: "ssri@npm:9.0.1" - dependencies: - minipass: "npm:^3.1.1" - checksum: c5d153ce03b5980d683ecaa4d805f6a03d8dc545736213803e168a1907650c46c08a4e5ce6d670a0205482b35c35713d9d286d9133bdd79853a406e22ad81f04 - languageName: node - linkType: hard - "stable@npm:^0.1.8": version: 0.1.8 resolution: "stable@npm:0.1.8" @@ -19942,9 +19892,9 @@ __metadata: linkType: hard "tocbot@npm:^4.20.1": - version: 4.21.3 - resolution: "tocbot@npm:4.21.3" - checksum: bf554f9d3d8449ddfef16fb53c93ad65b37dd27e7ad4725dbd0f5f048c908859680c75f800a1e2a7d77e59b30b42b04903fd260add0035946c6781e581e3d1e4 + version: 4.21.2 + resolution: "tocbot@npm:4.21.2" + checksum: 3b3f138368aca22757e85c56230d7db7a0bbcf1d3642258f3c4a16ac910d1dc01f99d0e78b0d965727e1eb9c63ec672f93c55d09554a5807e43459185d5a227b languageName: node linkType: hard @@ -20163,7 +20113,7 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:4.6.0, type-fest@npm:^4.2.0": +"type-fest@npm:4.6.0": version: 4.6.0 resolution: "type-fest@npm:4.6.0" checksum: 6f34c3cdb95948821fdfc5a70481791de99b2ba840fad87ac3fbdf77941e556eaeaa03c2ed136b366436560702004af7687d59b03d4f181c28289db1af903179 @@ -20240,6 +20190,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^4.2.0": + version: 4.5.0 + resolution: "type-fest@npm:4.5.0" + checksum: 8f45700dcfbdd03f2882a9e47e5ef21b8f879c4731633ed5ed43f4887b866d936ff27af0999afaa486a5683c03a45bd25bcf4d021ad9ac2486899867bfec91e3 + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -20325,9 +20282,9 @@ __metadata: linkType: hard "ua-parser-js@npm:^1.0.35": - version: 1.0.37 - resolution: "ua-parser-js@npm:1.0.37" - checksum: dac8cf82a55b2e097bd2286954e01454c4cfcf23c9d9b56961ce94bda3cec5a38ca536e6e84c20a4000a9d4b4a4abcbd98ec634ccebe21be36595ea3069126e4 + version: 1.0.36 + resolution: "ua-parser-js@npm:1.0.36" + checksum: c9a9554f368c5757545cc0b62fa6402df56a8001fd8fd21dd69fbab77d46c9603c07ea4537e039cf63afd32be5548d5cbe3636e94255d77e7fa4e3eb3a47c7a2 languageName: node linkType: hard @@ -20425,15 +20382,6 @@ __metadata: languageName: node linkType: hard -"unique-filename@npm:^2.0.0": - version: 2.0.1 - resolution: "unique-filename@npm:2.0.1" - dependencies: - unique-slug: "npm:^3.0.0" - checksum: 55d95cd670c4a86117ebc34d394936d712d43b56db6bc511f9ca00f666373818bf9f075fb0ab76bcbfaf134592ef26bb75aad20786c1ff1ceba4457eaba90fb8 - languageName: node - linkType: hard - "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -20452,15 +20400,6 @@ __metadata: languageName: node linkType: hard -"unique-slug@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-slug@npm:3.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 617240eb921af803b47d322d75a71a363dacf2e56c29ae5d1404fad85f64f4ec81ef10ee4fd79215d0202cbe1e5a653edb0558d59c9c81d3bd538c2d58e4c026 - languageName: node - linkType: hard - "unique-slug@npm:^4.0.0": version: 4.0.0 resolution: "unique-slug@npm:4.0.0" @@ -20838,8 +20777,8 @@ __metadata: linkType: hard "vite@npm:^3.0.0 || ^4.0.0 || ^5.0.0-0, vite@npm:^3.1.0 || ^4.0.0 || ^5.0.0-0": - version: 5.0.0-beta.13 - resolution: "vite@npm:5.0.0-beta.13" + version: 5.0.0-beta.11 + resolution: "vite@npm:5.0.0-beta.11" dependencies: esbuild: "npm:^0.19.3" fsevents: "npm:~2.3.3" @@ -20873,7 +20812,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: a325df13ceba5634e6728ac9b6c632c9b835f27780bcb774c5443c742610154db6ddf22fa61629d9195c853af2cb153f7fb26b0090fb33a6c341773135e07621 + checksum: 17bdbc144d314215e70cd23e41c1ee610177ee3027e61cc50a05c4afb5e4538492084885409fb0c46aecf343f7fc899e261c7adaffc46375024a56a25f611e01 languageName: node linkType: hard