diff --git a/acceptance-tests/tests/commands/create.spec.ts b/acceptance-tests/tests/commands/create.spec.ts index 7770efe31..97717f628 100644 --- a/acceptance-tests/tests/commands/create.spec.ts +++ b/acceptance-tests/tests/commands/create.spec.ts @@ -69,7 +69,7 @@ describe('hs create', () => { }); it('creates a module', async () => { - await testState.cli.execute( + await testState.cli.executeWithTestConfig( ['create', 'module', FOLDERS.module.name], ['label', ENTER, ENTER, ENTER, 'y', ENTER, ENTER] ); @@ -80,7 +80,7 @@ describe('hs create', () => { }); it('creates a template', async () => { - await testState.cli.execute( + await testState.cli.executeWithTestConfig( ['create', 'template', FOLDERS.template.name], [ENTER] ); @@ -90,35 +90,44 @@ describe('hs create', () => { }); it('website-theme', async () => { - await testState.cli.execute(['create', FOLDERS.websiteTheme.name]); + await testState.cli.executeWithTestConfig([ + 'create', + FOLDERS.websiteTheme.name, + ]); expect( testState.existsInTestOutputDirectory(FOLDERS.websiteTheme.folder) ).toBe(true); }); it('react-app', async () => { - await testState.cli.execute(['create', FOLDERS.reactApp.name]); + await testState.cli.executeWithTestConfig([ + 'create', + FOLDERS.reactApp.name, + ]); expect(testState.existsInTestOutputDirectory(FOLDERS.reactApp.folder)).toBe( true ); }); it('vue-app', async () => { - await testState.cli.execute(['create', FOLDERS.vueApp.name]); + await testState.cli.executeWithTestConfig(['create', FOLDERS.vueApp.name]); expect(testState.existsInTestOutputDirectory(FOLDERS.vueApp.folder)).toBe( true ); }); it('webpack-serverless', async () => { - await testState.cli.execute(['create', FOLDERS.webpackServerless.name]); + await testState.cli.executeWithTestConfig([ + 'create', + FOLDERS.webpackServerless.name, + ]); expect( testState.existsInTestOutputDirectory(FOLDERS.webpackServerless.folder) ).toBe(true); }); it('api-sample', async () => { - await testState.cli.execute( + await testState.cli.executeWithTestConfig( ['create', FOLDERS.apiSample.name, FOLDERS.apiSample.name], [ENTER, ENTER] ); @@ -129,14 +138,14 @@ describe('hs create', () => { }); it('app', async () => { - await testState.cli.execute(['create', FOLDERS.app.name]); + await testState.cli.executeWithTestConfig(['create', FOLDERS.app.name]); expect(testState.existsInTestOutputDirectory(FOLDERS.app.folder)).toBe( true ); }); it('function', async () => { - await testState.cli.execute( + await testState.cli.executeWithTestConfig( ['create', 'function'], [ FOLDERS.function.name, diff --git a/acceptance-tests/tests/workflows/cmsTemplateFlow.spec.ts b/acceptance-tests/tests/workflows/cmsTemplateFlow.spec.ts index 2030e081f..680b11234 100644 --- a/acceptance-tests/tests/workflows/cmsTemplateFlow.spec.ts +++ b/acceptance-tests/tests/workflows/cmsTemplateFlow.spec.ts @@ -21,7 +21,7 @@ describe('CMS Template Flow', () => { describe('hs create', () => { it('should create a CMS template', async () => { - await testState.cli.execute( + await testState.cli.executeWithTestConfig( ['create', 'template', TEMPLATE_NAME], [ENTER] ); diff --git a/bin/cli.js b/bin/cli.js index 16c73b315..e516fc32d 100755 --- a/bin/cli.js +++ b/bin/cli.js @@ -3,13 +3,11 @@ const yargs = require('yargs'); const updateNotifier = require('update-notifier'); const chalk = require('chalk'); -const fs = require('fs'); const { logger } = require('@hubspot/local-dev-lib/logger'); const { addUserAgentHeader } = require('@hubspot/local-dev-lib/http'); const { loadConfig, - getAndLoadConfigIfNeeded, configFileExists, getConfigPath, validateConfig, @@ -175,42 +173,29 @@ const NO_CONFIG_VALIDATION = { const loadConfigMiddleware = async options => { const maybeValidateConfig = () => { - if (shouldValidate(options, NO_CONFIG_VALIDATION)) { - if (!validateConfig()) { - process.exit(EXIT_CODES.ERROR); - } + if (shouldValidate(options, NO_CONFIG_VALIDATION) && !validateConfig()) { + process.exit(EXIT_CODES.ERROR); } }; // Load the new config and check for the conflicting config flag - if (configFileExists(true)) { - loadConfig('', options); - - if (options.config) { - logger.error( - i18n(`${i18nKey}.loadConfigMiddleware.configFileExists`, { - configPath: getConfigPath(), - }) - ); - process.exit(EXIT_CODES.ERROR); - } - maybeValidateConfig(); - return; - } - - // We need to load the config when options.config exists, - // so that getAccountIdFromConfig() in injectAccountIdMiddleware reads from the right config - if (options.config && fs.existsSync(options.config)) { + if (configFileExists(true) && options.config) { + logger.error( + i18n(`${i18nKey}.loadConfigMiddleware.configFileExists`, { + configPath: getConfigPath(), + }) + ); + process.exit(EXIT_CODES.ERROR); + } else { + // We need to load the config when options.config exists, + // so that getAccountIdFromConfig() in injectAccountIdMiddleware reads from the right config const { config: configPath } = options; - loadConfig(configPath, options); - maybeValidateConfig(); - return; + if (!options._.includes('init')) { + loadConfig(configPath, options); + } } - // Load deprecated config without a config flag and with no warnings - getAndLoadConfigIfNeeded(options); maybeValidateConfig(); - return; }; const checkAndWarnGitInclusionMiddleware = () => { diff --git a/commands/__tests__/create.test.ts b/commands/__tests__/create.test.ts index 388869374..d326ccbc8 100644 --- a/commands/__tests__/create.test.ts +++ b/commands/__tests__/create.test.ts @@ -41,7 +41,7 @@ describe('commands/create', () => { it('should support the correct options', () => { createCommand.builder(yargs); - expect(yargs.option).toHaveBeenCalledTimes(2); + expect(yargs.option).toHaveBeenCalledTimes(3); expect(yargs.option).toHaveBeenCalledWith( 'internal', expect.objectContaining({ type: 'boolean', hidden: true }) diff --git a/commands/create.ts b/commands/create.ts index ef180cb75..5dd1ef57f 100644 --- a/commands/create.ts +++ b/commands/create.ts @@ -26,7 +26,11 @@ const fs = require('fs-extra'); const { logError } = require('../lib/errorHandlers/index'); const { logger } = require('@hubspot/local-dev-lib/logger'); -const { setLogLevel, addGlobalOptions } = require('../lib/commonOpts'); +const { + setLogLevel, + addGlobalOptions, + addConfigOptions, +} = require('../lib/commonOpts'); const { resolveLocalPath } = require('../lib/filesystem'); const { trackCommandUsage } = require('../lib/usageTracking'); const assets = require('./create/index'); @@ -117,6 +121,7 @@ exports.builder = yargs => { hidden: true, }); + addConfigOptions(yargs); addGlobalOptions(yargs); return yargs; diff --git a/commands/project/__tests__/deploy.test.ts b/commands/project/__tests__/deploy.test.ts index 5858f797d..9e53acba4 100644 --- a/commands/project/__tests__/deploy.test.ts +++ b/commands/project/__tests__/deploy.test.ts @@ -17,11 +17,9 @@ const { addConfigOptions, addUseEnvironmentOptions, } = require('../../../lib/commonOpts'); -const { - getProjectConfig, - pollDeployStatus, - getProjectDetailUrl, -} = require('../../../lib/projects'); +const { getProjectConfig } = require('../../../lib/projects'); +const { getProjectDetailUrl } = require('../../../lib/projects/urls'); +const { pollDeployStatus } = require('../../../lib/projects/buildAndDeploy'); const { projectNamePrompt } = require('../../../lib/prompts/projectNamePrompt'); const { promptUser } = require('../../../lib/prompts/promptUtils'); const { trackCommandUsage } = require('../../../lib/usageTracking'); @@ -34,6 +32,8 @@ jest.mock('@hubspot/local-dev-lib/config'); jest.mock('../../../lib/commonOpts'); jest.mock('../../../lib/validation'); jest.mock('../../../lib/projects'); +jest.mock('../../../lib/projects/urls'); +jest.mock('../../../lib/projects/buildAndDeploy'); jest.mock('../../../lib/prompts/projectNamePrompt'); jest.mock('../../../lib/prompts/promptUtils'); jest.mock('../../../lib/usageTracking'); diff --git a/commands/project/deploy.ts b/commands/project/deploy.ts index 6a4de4b0d..1952c0af8 100644 --- a/commands/project/deploy.ts +++ b/commands/project/deploy.ts @@ -12,11 +12,9 @@ const { deployProject, fetchProject, } = require('@hubspot/local-dev-lib/api/projects'); -const { - getProjectConfig, - pollDeployStatus, - getProjectDetailUrl, -} = require('../../lib/projects'); +const { getProjectConfig } = require('../../lib/projects'); +const { pollDeployStatus } = require('../../lib/projects/buildAndDeploy'); +const { getProjectDetailUrl } = require('../../lib/projects/urls'); const { projectNamePrompt } = require('../../lib/prompts/projectNamePrompt'); const { promptUser } = require('../../lib/prompts/promptUtils'); const { i18n } = require('../../lib/lang'); diff --git a/commands/project/dev.ts b/commands/project/dev.ts index ec4f6430b..762028634 100644 --- a/commands/project/dev.ts +++ b/commands/project/dev.ts @@ -35,7 +35,7 @@ const { findProjectComponents, getProjectComponentTypes, COMPONENT_TYPES, -} = require('../../lib/projectStructure'); +} = require('../../lib/projects/structure'); const { confirmDefaultAccountIsTarget, suggestRecommendedNestedAccount, diff --git a/commands/project/listBuilds.ts b/commands/project/listBuilds.ts index b73845786..edb41ff35 100644 --- a/commands/project/listBuilds.ts +++ b/commands/project/listBuilds.ts @@ -16,9 +16,9 @@ const { getTableContents, getTableHeader } = require('../../lib/ui/table'); const { uiBetaTag, uiLink } = require('../../lib/ui'); const { getProjectConfig, - getProjectDetailUrl, validateProjectConfig, } = require('../../lib/projects'); +const { getProjectDetailUrl } = require('../../lib/projects/urls'); const moment = require('moment'); const { promptUser } = require('../../lib/prompts/promptUtils'); const { isHubSpotHttpError } = require('@hubspot/local-dev-lib/errors/index'); diff --git a/commands/project/open.ts b/commands/project/open.ts index 943b7fe4a..351d5fed5 100644 --- a/commands/project/open.ts +++ b/commands/project/open.ts @@ -9,11 +9,8 @@ const { const { trackCommandUsage } = require('../../lib/usageTracking'); const { i18n } = require('../../lib/lang'); const { logger } = require('@hubspot/local-dev-lib/logger'); -const { - getProjectConfig, - getProjectDetailUrl, - ensureProjectExists, -} = require('../../lib/projects'); +const { getProjectConfig, ensureProjectExists } = require('../../lib/projects'); +const { getProjectDetailUrl } = require('../../lib/projects/urls'); const { projectNamePrompt } = require('../../lib/prompts/projectNamePrompt'); const { uiBetaTag } = require('../../lib/ui'); const { EXIT_CODES } = require('../../lib/enums/exitCodes'); diff --git a/commands/project/upload.ts b/commands/project/upload.ts index b8ae46da2..343e93d52 100644 --- a/commands/project/upload.ts +++ b/commands/project/upload.ts @@ -11,12 +11,14 @@ const { trackCommandUsage } = require('../../lib/usageTracking'); const { ensureProjectExists, getProjectConfig, - handleProjectUpload, logFeedbackMessage, validateProjectConfig, - pollProjectBuildAndDeploy, - displayWarnLogs, } = require('../../lib/projects'); +const { handleProjectUpload } = require('../../lib/projects/upload'); +const { + displayWarnLogs, + pollProjectBuildAndDeploy, +} = require('../../lib/projects/buildAndDeploy'); const { i18n } = require('../../lib/lang'); const { getAccountConfig } = require('@hubspot/local-dev-lib/config'); const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index'); diff --git a/commands/project/watch.ts b/commands/project/watch.ts index c9116ff82..ceac52615 100644 --- a/commands/project/watch.ts +++ b/commands/project/watch.ts @@ -1,6 +1,6 @@ // @ts-nocheck const { i18n } = require('../../lib/lang'); -const { createWatcher } = require('../../lib/projectsWatch'); +const { createWatcher } = require('../../lib/projects/watch'); const { logError, ApiErrorContext } = require('../../lib/errorHandlers/index'); const { logger } = require('@hubspot/local-dev-lib/logger'); const { PROJECT_ERROR_TYPES } = require('../../lib/constants'); @@ -14,12 +14,14 @@ const { uiBetaTag } = require('../../lib/ui'); const { ensureProjectExists, getProjectConfig, - handleProjectUpload, - pollBuildStatus, - pollDeployStatus, validateProjectConfig, logFeedbackMessage, } = require('../../lib/projects'); +const { handleProjectUpload } = require('../../lib/projects/upload'); +const { + pollBuildStatus, + pollDeployStatus, +} = require('../../lib/projects/buildAndDeploy'); const { cancelStagedBuild, fetchProjectBuilds, diff --git a/commands/theme/preview.ts b/commands/theme/preview.ts index 483807b39..c82f6dd46 100644 --- a/commands/theme/preview.ts +++ b/commands/theme/preview.ts @@ -23,7 +23,7 @@ const { getProjectConfig } = require('../../lib/projects'); const { findProjectComponents, COMPONENT_TYPES, -} = require('../../lib/projectStructure'); +} = require('../../lib/projects/structure'); const { preview } = require('@hubspot/theme-preview-dev-server'); const { hasFeature } = require('../../lib/hasFeature'); const i18nKey = 'commands.theme.subcommands.preview'; diff --git a/lang/en.lyaml b/lang/en.lyaml index d7078bf9c..ee6bbdbcf 100644 --- a/lang/en.lyaml +++ b/lang/en.lyaml @@ -1094,16 +1094,6 @@ en: checkIfParentAccountIsAuthed: notAuthedError: "To develop this project locally, run {{ authCommand }} to authenticate the App Developer Account {{ accountId }} associated with {{ accountIdentifier }}." projects: - uploadProjectFiles: - add: "Uploading {{#bold}}{{ projectName }}{{/bold}} project files to {{ accountIdentifier }}" - fail: "Failed to upload {{#bold}}{{ projectName }}{{/bold}} project files to {{ accountIdentifier }}" - succeed: "Uploaded {{#bold}}{{ projectName }}{{/bold}} project files to {{ accountIdentifier }}" - buildCreated: "Project \"{{ projectName }}\" uploaded and build #{{ buildId }} created" - handleProjectUpload: - emptySource: "Source directory \"{{ srcDir }}\" is empty. Add files to your project and rerun `{{#yellow}}hs project upload{{/yellow}}` to upload them to HubSpot." - compressed: "Project files compressed: {{ byteCount }} bytes" - compressing: "Compressing build files to \"{{ path }}\"" - fileFiltered: "Ignore rule triggered for \"{{ filename }}\"" validateProjectConfig: configNotFound: "Unable to locate a project configuration file. Try running again from a project directory, or run {{ createCommand }} to create a new project." configMissingFields: "The project configuruation file is missing required fields." @@ -1116,6 +1106,11 @@ en: notFound: "Your project {{#bold}}{{ projectName }}{{/bold}} could not be found in {{#bold}}{{ accountIdentifier }}{{/bold}}." pollFetchProject: checkingProject: "Checking if project exists in {{ accountIdentifier }}" + unableToFindAutodeployStatus: "Unable to find the auto deploy for build #{{ buildId }}. This deploy may have been skipped. {{ viewDeploysLink }}." + logFeedbackMessage: + feedbackHeader: "We'd love to hear your feedback!" + feedbackMessage: "How are you liking the new projects and developer tools? \n > Run `{{#yellow}}hs feedback{{/yellow}}` to let us know what you think!\n" + projectBuildAndDeploy: makePollTaskStatusFunc: componentCountSingular: "Found 1 component in this project" componentCount: "Found {{ numComponents }} components in this project" @@ -1127,10 +1122,17 @@ en: buildSucceededAutomaticallyDeploying: "Build #{{ buildId }} succeeded. {{#bold}}Automatically deploying{{/bold}} to {{ accountIdentifier }}\n" cleanedUpTempFile: "Cleaned up temporary file {{ path }}" viewDeploys: "View all deploys for this project in HubSpot" - unableToFindAutodeployStatus: "Unable to find the auto deploy for build #{{ buildId }}. This deploy may have been skipped. {{ viewDeploysLink }}." - logFeedbackMessage: - feedbackHeader: "We'd love to hear your feedback!" - feedbackMessage: "How are you liking the new projects and developer tools? \n > Run `{{#yellow}}hs feedback{{/yellow}}` to let us know what you think!\n" + projectUpload: + uploadProjectFiles: + add: "Uploading {{#bold}}{{ projectName }}{{/bold}} project files to {{ accountIdentifier }}" + fail: "Failed to upload {{#bold}}{{ projectName }}{{/bold}} project files to {{ accountIdentifier }}" + succeed: "Uploaded {{#bold}}{{ projectName }}{{/bold}} project files to {{ accountIdentifier }}" + buildCreated: "Project \"{{ projectName }}\" uploaded and build #{{ buildId }} created" + handleProjectUpload: + emptySource: "Source directory \"{{ srcDir }}\" is empty. Add files to your project and rerun `{{#yellow}}hs project upload{{/yellow}}` to upload them to HubSpot." + compressed: "Project files compressed: {{ byteCount }} bytes" + compressing: "Compressing build files to \"{{ path }}\"" + fileFiltered: "Ignore rule triggered for \"{{ filename }}\"" ui: betaTag: "{{#bold}}[BETA]{{/bold}}" betaWarning: @@ -1551,6 +1553,8 @@ en: counts: errors: '{{#bold}}Errors:{{/bold}} {{ count }}' warnings: "{{#bold}}Warning:{{/bold}} {{ count }}" + oauth: + missingClientId: "Error building oauth URL: missing client ID." diff --git a/lib/DevServerManager.ts b/lib/DevServerManager.ts index 23c7d392a..525cf5751 100644 --- a/lib/DevServerManager.ts +++ b/lib/DevServerManager.ts @@ -1,6 +1,6 @@ // @ts-nocheck const { logger } = require('@hubspot/local-dev-lib/logger'); -const { COMPONENT_TYPES } = require('./projectStructure'); +const { COMPONENT_TYPES } = require('./projects/structure'); const { i18n } = require('./lang'); const { promptUser } = require('./prompts/promptUtils'); const { DevModeInterface } = require('@hubspot/ui-extensions-dev-server'); diff --git a/lib/LocalDevManager.ts b/lib/LocalDevManager.ts index 8958d491d..5503f6c10 100644 --- a/lib/LocalDevManager.ts +++ b/lib/LocalDevManager.ts @@ -20,13 +20,13 @@ const { PROJECT_CONFIG_FILE } = require('./constants'); const SpinniesManager = require('./ui/SpinniesManager'); const DevServerManager = require('./DevServerManager'); const { EXIT_CODES } = require('./enums/exitCodes'); -const { getProjectDetailUrl } = require('./projects'); +const { getProjectDetailUrl } = require('./projects/urls'); const { getAccountHomeUrl } = require('./localDev'); const { CONFIG_FILES, COMPONENT_TYPES, getAppCardConfigs, -} = require('./projectStructure'); +} = require('./projects/structure'); const { UI_COLORS, uiCommandReference, diff --git a/lib/constants.ts b/lib/constants.ts index 754a41d85..94c30f6ad 100644 --- a/lib/constants.ts +++ b/lib/constants.ts @@ -61,12 +61,12 @@ export const PROJECT_ERROR_TYPES = { SUBDEPLOY_FAILED: 'DeployPipelineErrorType.DEPENDENT_SUBDEPLOY_FAILED', } as const; -export const PROJECT_TASK_TYPES = { +export const PROJECT_TASK_TYPES: { [key: string]: string } = { PRIVATE_APP: 'private app', PUBLIC_APP: 'public app', APP_FUNCTION: 'function', CRM_CARD_V2: 'card', -} as const; +}; export const PROJECT_COMPONENT_TYPES = { PROJECTS: 'projects', diff --git a/lib/doctor/DiagnosticInfoBuilder.ts b/lib/doctor/DiagnosticInfoBuilder.ts index 6c05a38ac..d63c05e89 100644 --- a/lib/doctor/DiagnosticInfoBuilder.ts +++ b/lib/doctor/DiagnosticInfoBuilder.ts @@ -87,12 +87,14 @@ export class DiagnosticInfoBuilder { } async generateDiagnosticInfo(): Promise { - // @ts-expect-error getProjectConfig not typed yet this._projectConfig = await getProjectConfig(); if (this._projectConfig?.projectConfig) { await this.fetchProjectDetails(); await this.fetchAccessToken(); + } + + if (this._projectConfig?.projectDir) { await this.fetchProjectFilenames(); } @@ -134,7 +136,8 @@ export class DiagnosticInfoBuilder { try { const { data } = await fetchProject( this.accountId!, - this._projectConfig?.projectConfig?.name + // We check that config exists before running this function + this._projectConfig!.projectConfig!.name ); this.projectDetails = data; } catch (e) { @@ -158,10 +161,11 @@ export class DiagnosticInfoBuilder { private async fetchProjectFilenames(): Promise { try { - this.files = (await walk(this._projectConfig?.projectDir)) + // We check that projectDir exists before running this function + this.files = (await walk(this._projectConfig!.projectDir!)) .filter(file => !path.dirname(file).includes('node_modules')) .map(filename => - path.relative(this._projectConfig?.projectDir, filename) + path.relative(this._projectConfig!.projectDir!, filename) ); } catch (e) { logger.debug(e); diff --git a/lib/doctor/Doctor.ts b/lib/doctor/Doctor.ts index 34a3cce0e..dea9bdbc3 100644 --- a/lib/doctor/Doctor.ts +++ b/lib/doctor/Doctor.ts @@ -51,7 +51,8 @@ export class Doctor { text: i18n(`${i18nKey}.runningDiagnostics`), }); - this.diagnosticInfo = await this.diagnosticInfoBuilder.generateDiagnosticInfo(); + this.diagnosticInfo = + await this.diagnosticInfoBuilder.generateDiagnosticInfo(); this.projectConfig = this.diagnosticInfo?.project.config; @@ -279,7 +280,7 @@ export class Doctor { const packageDirName = path.dirname(packageFile); try { const needsInstall = await hasMissingPackages( - path.join(this.projectConfig?.projectDir, packageDirName) + path.join(this.projectConfig?.projectDir || '', packageDirName) ); if (needsInstall) { @@ -343,7 +344,10 @@ export class Doctor { private async checkProjectConfigJsonFiles(): Promise { let foundError = false; for (const jsonFile of this.diagnosticInfo?.jsonFiles || []) { - const fileToCheck = path.join(this.projectConfig?.projectDir, jsonFile); + const fileToCheck = path.join( + this.projectConfig?.projectDir || '', + jsonFile + ); if (!(await this.isValidJsonFile(fileToCheck))) { foundError = true; this.diagnosis?.addProjectSection({ diff --git a/lib/doctor/__tests__/Diagnosis.test.ts b/lib/doctor/__tests__/Diagnosis.test.ts index 6fe6ebc1f..a9985c4a4 100644 --- a/lib/doctor/__tests__/Diagnosis.test.ts +++ b/lib/doctor/__tests__/Diagnosis.test.ts @@ -28,6 +28,8 @@ describe('lib/doctor/Diagnosis', () => { projectDir: 'project-dir', projectConfig: { name: 'Super cool project', + srcDir: 'project-dir', + platformVersion: 'test', }, }, }, diff --git a/lib/doctor/__tests__/DiagnosticInfoBuilder.test.ts b/lib/doctor/__tests__/DiagnosticInfoBuilder.test.ts index 34e90cb70..ac741a807 100644 --- a/lib/doctor/__tests__/DiagnosticInfoBuilder.test.ts +++ b/lib/doctor/__tests__/DiagnosticInfoBuilder.test.ts @@ -26,7 +26,7 @@ import { AccessToken, CLIAccount } from '@hubspot/local-dev-lib/types/Accounts'; import { getProjectConfig as _getProjectConfig } from '../../projects'; import { fetchProject as _fetchProject } from '@hubspot/local-dev-lib/api/projects'; import { Project } from '@hubspot/local-dev-lib/types/Project'; -import { AxiosPromise } from 'axios'; +import { HubSpotPromise } from '@hubspot/local-dev-lib/types/Http'; const walk = _walk as jest.MockedFunction; const getAccessToken = _getAccessToken as jest.MockedFunction< @@ -124,6 +124,8 @@ describe('lib/doctor/DiagnosticInfo', () => { projectDir, projectConfig: { name: 'My project', + srcDir: 'project-dir', + platformVersion: 'test', }, }; @@ -133,7 +135,7 @@ describe('lib/doctor/DiagnosticInfo', () => { deployedBuildId: 1, id: 8989898, isLocked: false, - name: projectConfig.projectConfig.name, + name: projectConfig!.projectConfig!.name, portalId: accountId, updatedAt: 12345, }; @@ -143,16 +145,16 @@ describe('lib/doctor/DiagnosticInfo', () => { accountType: 'STANDARD', encodedOAuthRefreshToken: '', expiresAt: '', - hubName: projectConfig.projectConfig.name, + hubName: projectConfig!.projectConfig!.name, portalId: accountId, scopeGroups: [], enabledFeatures: {}, }; getProjectConfig.mockResolvedValue(projectConfig); - fetchProject.mockResolvedValue(({ + fetchProject.mockResolvedValue({ data: projectDetails, - } as unknown) as AxiosPromise); + } as unknown as HubSpotPromise); getAccessToken.mockResolvedValue(accessToken); getConfigPath.mockReturnValue(configPath); utilPromisify.mockReturnValue(jest.fn().mockResolvedValue(npmVersion)); @@ -166,7 +168,7 @@ describe('lib/doctor/DiagnosticInfo', () => { expect(fetchProject).toHaveBeenCalledTimes(1); expect(fetchProject).toHaveBeenCalledWith( accountId, - projectConfig!.projectConfig.name + projectConfig!.projectConfig!.name ); expect(getAccessToken).toHaveBeenCalledTimes(1); diff --git a/lib/doctor/__tests__/Doctor.test.ts b/lib/doctor/__tests__/Doctor.test.ts index cf6fc19ef..18977976e 100644 --- a/lib/doctor/__tests__/Doctor.test.ts +++ b/lib/doctor/__tests__/Doctor.test.ts @@ -28,17 +28,19 @@ jest.mock('util', () => ({ const hasMissingPackages = _hasMissingPackages as jest.MockedFunction< typeof _hasMissingPackages >; -const isPortManagerPortAvailable = _isPortManagerPortAvailable as jest.MockedFunction< - typeof _isPortManagerPortAvailable ->; +const isPortManagerPortAvailable = + _isPortManagerPortAvailable as jest.MockedFunction< + typeof _isPortManagerPortAvailable + >; const utilPromisify = util.promisify as jest.MockedFunction< typeof util.promisify >; -const accessTokenForPersonalAccessKey = _accessTokenForPersonalAccessKey as jest.MockedFunction< - typeof _accessTokenForPersonalAccessKey ->; +const accessTokenForPersonalAccessKey = + _accessTokenForPersonalAccessKey as jest.MockedFunction< + typeof _accessTokenForPersonalAccessKey + >; const isSpecifiedError = _isSpecifiedError as jest.MockedFunction< typeof _isSpecifiedError @@ -64,7 +66,11 @@ describe('lib/doctor/Doctor', () => { project: { config: { projectDir: '/path/to/project', - projectConfig: {}, + projectConfig: { + name: 'my-project', + srcDir: '/path/to/project', + platformVersion: 'test', + }, }, }, versions: { @@ -75,11 +81,11 @@ describe('lib/doctor/Doctor', () => { }; beforeEach(() => { - doctor = new Doctor(({ + doctor = new Doctor({ generateDiagnosticInfo: jest.fn().mockResolvedValue({ ...diagnosticInfo, }), - } as unknown) as DiagnosticInfoBuilder); + } as unknown as DiagnosticInfoBuilder); utilPromisify.mockReturnValue( jest.fn().mockImplementationOnce((filename: string) => { @@ -104,12 +110,12 @@ describe('lib/doctor/Doctor', () => { }); it('should add error section if node version is not available', async () => { - doctor = new Doctor(({ + doctor = new Doctor({ generateDiagnosticInfo: jest.fn().mockResolvedValue({ ...diagnosticInfo, versions: {}, }), - } as unknown) as DiagnosticInfoBuilder); + } as unknown as DiagnosticInfoBuilder); await doctor.diagnose(); @@ -121,12 +127,12 @@ describe('lib/doctor/Doctor', () => { }); it('should add error section if minimum node version is not met', async () => { - doctor = new Doctor(({ + doctor = new Doctor({ generateDiagnosticInfo: jest.fn().mockResolvedValue({ ...diagnosticInfo, versions: { node: '1.0.0' }, }), - } as unknown) as DiagnosticInfoBuilder); + } as unknown as DiagnosticInfoBuilder); await doctor.diagnose(); @@ -149,12 +155,12 @@ describe('lib/doctor/Doctor', () => { }); it('should add error section if npm is not installed', async () => { - doctor = new Doctor(({ + doctor = new Doctor({ generateDiagnosticInfo: jest.fn().mockResolvedValue({ ...diagnosticInfo, versions: {}, }), - } as unknown) as DiagnosticInfoBuilder); + } as unknown as DiagnosticInfoBuilder); await doctor.diagnose(); diff --git a/lib/doctor/__tests__/__snapshots__/DiagnosticInfoBuilder.test.ts.snap b/lib/doctor/__tests__/__snapshots__/DiagnosticInfoBuilder.test.ts.snap index 46dcb2477..4bef91f57 100644 --- a/lib/doctor/__tests__/__snapshots__/DiagnosticInfoBuilder.test.ts.snap +++ b/lib/doctor/__tests__/__snapshots__/DiagnosticInfoBuilder.test.ts.snap @@ -58,6 +58,8 @@ exports[`lib/doctor/DiagnosticInfo generateDiagnosticInfo should gather the requ "config": { "projectConfig": { "name": "My project", + "platformVersion": "test", + "srcDir": "project-dir", }, "projectDir": "/Users/test/project", }, diff --git a/lib/localDev.ts b/lib/localDev.ts index d983cad74..0f9d7ebd2 100644 --- a/lib/localDev.ts +++ b/lib/localDev.ts @@ -38,10 +38,8 @@ const { isAppDeveloperAccount, isDeveloperTestAccount, } = require('./accountTypes'); -const { - handleProjectUpload, - pollProjectBuildAndDeploy, -} = require('./projects'); +const { handleProjectUpload } = require('./projects/upload'); +const { pollProjectBuildAndDeploy } = require('./projects/buildAndDeploy'); const { PROJECT_ERROR_TYPES, PROJECT_BUILD_TEXT, @@ -248,9 +246,8 @@ const createDeveloperTestAccountForLocalDev = async ( let currentPortalCount = 0; let maxTestPortals = 10; try { - const validateResult = await validateDevTestAccountUsageLimits( - accountConfig - ); + const validateResult = + await validateDevTestAccountUsageLimits(accountConfig); if (validateResult) { currentPortalCount = validateResult.results ? validateResult.results.length @@ -306,9 +303,8 @@ const createDeveloperTestAccountForLocalDev = async ( // Prompt user to confirm usage of an existing developer test account that is not currently in the config const useExistingDevTestAccount = async (env, account) => { - const useExistingDevTestAcct = await confirmUseExistingDeveloperTestAccountPrompt( - account - ); + const useExistingDevTestAcct = + await confirmUseExistingDeveloperTestAccountPrompt(account); if (!useExistingDevTestAcct) { logger.log(''); logger.log( diff --git a/lib/oauth.ts b/lib/oauth.ts index c843c1e7a..875ec08a4 100644 --- a/lib/oauth.ts +++ b/lib/oauth.ts @@ -1,51 +1,66 @@ -// @ts-nocheck -const express = require('express'); -const open = require('open'); -const { - OAuth2Manager, -} = require('@hubspot/local-dev-lib/models/OAuth2Manager'); -const { getAccountConfig } = require('@hubspot/local-dev-lib/config'); -const { - getAccountIdentifier, -} = require('@hubspot/local-dev-lib/config/getAccountIdentifier'); -const { addOauthToAccountConfig } = require('@hubspot/local-dev-lib/oauth'); -const { handleExit } = require('./process'); -const { getHubSpotWebsiteOrigin } = require('@hubspot/local-dev-lib/urls'); -const { logger } = require('@hubspot/local-dev-lib/logger'); -const { - ENVIRONMENTS, -} = require('@hubspot/local-dev-lib/constants/environments'); +import express from 'express'; +import open from 'open'; +import { OAuth2Manager } from '@hubspot/local-dev-lib/models/OAuth2Manager'; +import { getAccountConfig } from '@hubspot/local-dev-lib/config'; +import { getAccountIdentifier } from '@hubspot/local-dev-lib/config/getAccountIdentifier'; +import { addOauthToAccountConfig } from '@hubspot/local-dev-lib/oauth'; +import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls'; +import { logger } from '@hubspot/local-dev-lib/logger'; +import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments'; +import { DEFAULT_OAUTH_SCOPES } from '@hubspot/local-dev-lib/constants/auth'; +import { OAuth2ManagerAccountConfig } from '@hubspot/local-dev-lib/types/Accounts'; +import { Server } from 'http'; + +import { handleExit } from './process'; +import { i18n } from './lang'; +import { EXIT_CODES } from './enums/exitCodes'; const PORT = 3000; const redirectUri = `http://localhost:${PORT}/oauth-callback`; -const buildAuthUrl = oauthManager => { +const i18nKey = 'lib.oauth'; + +function buildAuthUrl(oauthManager: OAuth2Manager): string { + const { + env: accountEnv, + clientId, + scopes: accountScopes, + } = oauthManager.account; + + const env = accountEnv || ENVIRONMENTS.PROD; + const scopes = accountScopes || DEFAULT_OAUTH_SCOPES; + + if (!clientId) { + logger.error(i18n(`${i18nKey}.missingClientId`)); + process.exit(EXIT_CODES.ERROR); + } + return ( - `${getHubSpotWebsiteOrigin(oauthManager.account.env)}/oauth/${ + `${getHubSpotWebsiteOrigin(env)}/oauth/${ oauthManager.account.accountId }/authorize` + - `?client_id=${encodeURIComponent(oauthManager.account.clientId)}` + // app's client ID - `&scope=${encodeURIComponent(oauthManager.account.scopes.join(' '))}` + // scopes being requested by the app + `?client_id=${encodeURIComponent(clientId)}` + // app's client ID + `&scope=${encodeURIComponent(scopes.join(' '))}` + // scopes being requested by the app `&redirect_uri=${encodeURIComponent(redirectUri)}` // where to send the user after the consent page ); -}; +} -const handleServerOnProcessEnd = server => { +function handleServerOnProcessEnd(server: Server): void { const shutdownServerIfRunning = () => { server?.close(); }; handleExit(shutdownServerIfRunning); -}; +} -const authorize = async oauthManager => { +async function authorize(oauthManager: OAuth2Manager): Promise { if (process.env.BROWSER !== 'none') { open(buildAuthUrl(oauthManager), { url: true }); } // eslint-disable-next-line no-async-promise-executor - return new Promise(async (resolve, reject) => { - let server; + return new Promise(async (resolve, reject) => { + let server: Server | null; const app = express(); app.get('/oauth-callback', async (req, res) => { @@ -87,25 +102,22 @@ const authorize = async oauthManager => { handleServerOnProcessEnd(server); }); -}; +} -const setupOauth = accountConfig => { - const id = getAccountIdentifier(accountConfig); - const accountId = parseInt(id, 10); - const config = getAccountConfig(accountId) || {}; +function setupOauth(accountConfig: OAuth2ManagerAccountConfig): OAuth2Manager { + const accountId = getAccountIdentifier(accountConfig); + const config = getAccountConfig(accountId); return new OAuth2Manager({ ...accountConfig, - environment: accountConfig.env || config.env || ENVIRONMENTS.PROD, + env: accountConfig.env || config?.env || ENVIRONMENTS.PROD, }); -}; +} -const authenticateWithOauth = async configData => { - const oauthManager = setupOauth(configData); +export async function authenticateWithOauth( + accountConfig: OAuth2ManagerAccountConfig +): Promise { + const oauthManager = setupOauth(accountConfig); logger.log('Authorizing'); await authorize(oauthManager); addOauthToAccountConfig(oauthManager); -}; - -module.exports = { - authenticateWithOauth, -}; +} diff --git a/lib/polling.ts b/lib/polling.ts index a62d2bbd6..baced84f2 100644 --- a/lib/polling.ts +++ b/lib/polling.ts @@ -1,7 +1,21 @@ -// @ts-nocheck -const { POLLING_DELAY, POLLING_STATUS } = require('./constants'); +import { HubSpotPromise } from '@hubspot/local-dev-lib/types/Http'; +import { ValueOf } from '@hubspot/local-dev-lib/types/Utils'; +import { POLLING_DELAY, POLLING_STATUS } from './constants'; -const poll = (callback, accountId, taskId) => { +type GenericPollingResponse = { + status: ValueOf; +}; + +type PollingCallback = ( + accountId: number, + taskId: number | string +) => HubSpotPromise; + +export function poll( + callback: PollingCallback, + accountId: number, + taskId: number | string +): Promise { return new Promise((resolve, reject) => { const pollInterval = setInterval(async () => { try { @@ -25,8 +39,4 @@ const poll = (callback, accountId, taskId) => { } }, POLLING_DELAY); }); -}; - -module.exports = { - poll, -}; +} diff --git a/lib/projectStructure.ts b/lib/projectStructure.ts deleted file mode 100644 index dffb98af6..000000000 --- a/lib/projectStructure.ts +++ /dev/null @@ -1,137 +0,0 @@ -// @ts-nocheck -const fs = require('fs'); -const path = require('path'); -const { walk } = require('@hubspot/local-dev-lib/fs'); -const { logger } = require('@hubspot/local-dev-lib/logger'); -const { logError } = require('./errorHandlers/index'); - -const COMPONENT_TYPES = Object.freeze({ - privateApp: 'private-app', - publicApp: 'public-app', - hublTheme: 'hubl-theme', -}); - -const CONFIG_FILES = { - [COMPONENT_TYPES.privateApp]: 'app.json', - [COMPONENT_TYPES.publicApp]: 'public-app.json', - [COMPONENT_TYPES.hublTheme]: 'theme.json', -}; - -function getTypeFromConfigFile(configFile) { - for (const key in CONFIG_FILES) { - if (CONFIG_FILES[key] === configFile) { - return key; - } - } - return null; -} - -function loadConfigFile(configPath) { - if (configPath) { - try { - const source = fs.readFileSync(configPath); - const parsedConfig = JSON.parse(source); - return parsedConfig; - } catch (e) { - logger.debug(e); - } - } - return null; -} - -function getAppCardConfigs(appConfig, appPath) { - const cardConfigs = []; - let cards; - - if (appConfig && appConfig.extensions && appConfig.extensions.crm) { - cards = appConfig.extensions.crm.cards; - } - - if (cards) { - cards.forEach(({ file }) => { - if (typeof file === 'string') { - const cardConfigPath = path.join(appPath, file); - const cardConfig = loadConfigFile(cardConfigPath); - - if (cardConfig) { - cardConfigs.push(cardConfig); - } - } - }); - } - - return cardConfigs; -} - -function getIsLegacyApp(appConfig, appPath) { - const cardConfigs = getAppCardConfigs(appConfig, appPath); - - if (!cardConfigs.length) { - // Assume any app that does not have any cards is not legacy - return false; - } - - let hasAnyReactExtensions = false; - - cardConfigs.forEach(cardConfig => { - if (!hasAnyReactExtensions) { - const isReactExtension = - cardConfig && - !!cardConfig.data && - !!cardConfig.data.module && - !!cardConfig.data.module.file; - - hasAnyReactExtensions = isReactExtension; - } - }); - - return !hasAnyReactExtensions; -} - -async function findProjectComponents(projectSourceDir) { - const components = []; - let projectFiles = []; - - try { - projectFiles = await walk(projectSourceDir); - } catch (e) { - logError(e); - } - - projectFiles.forEach(projectFile => { - // Find app components - const { base, dir } = path.parse(projectFile); - - if (Object.values(CONFIG_FILES).includes(base)) { - const parsedAppConfig = loadConfigFile(projectFile); - - if (parsedAppConfig) { - const isLegacy = getIsLegacyApp(parsedAppConfig, dir); - const isHublTheme = base === CONFIG_FILES[COMPONENT_TYPES.hublTheme]; - - components.push({ - type: getTypeFromConfigFile(base), - config: parsedAppConfig, - runnable: !isLegacy && !isHublTheme, - path: dir, - }); - } - } - }); - - return components; -} - -function getProjectComponentTypes(components) { - const projectContents = {}; - components.forEach(({ type }) => (projectContents[type] = true)); - return projectContents; -} - -module.exports = { - CONFIG_FILES, - COMPONENT_TYPES, - findProjectComponents, - getAppCardConfigs, - getProjectComponentTypes, -}; diff --git a/lib/projects.ts b/lib/projects.ts deleted file mode 100644 index b560635cf..000000000 --- a/lib/projects.ts +++ /dev/null @@ -1,1057 +0,0 @@ -// @ts-nocheck -const fs = require('fs-extra'); -const path = require('path'); -const archiver = require('archiver'); -const tmp = require('tmp'); -const chalk = require('chalk'); -const findup = require('findup-sync'); -const { logger } = require('@hubspot/local-dev-lib/logger'); -const { getEnv } = require('@hubspot/local-dev-lib/config'); -const { getHubSpotWebsiteOrigin } = require('@hubspot/local-dev-lib/urls'); -const { fetchFileFromRepository } = require('@hubspot/local-dev-lib/github'); -const { - ENVIRONMENTS, -} = require('@hubspot/local-dev-lib/constants/environments'); -const { - FEEDBACK_INTERVAL, - POLLING_DELAY, - PROJECT_BUILD_TEXT, - PROJECT_DEPLOY_TEXT, - PROJECT_CONFIG_FILE, - PROJECT_TASK_TYPES, - PROJECT_ERROR_TYPES, - HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, - PROJECT_COMPONENT_TYPES, -} = require('./constants'); -const { - createProject, - getBuildStatus, - getBuildStructure, - getDeployStatus, - getDeployStructure, - fetchProject, - uploadProject, - fetchBuildWarnLogs, - fetchDeployWarnLogs, -} = require('@hubspot/local-dev-lib/api/projects'); -const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index'); -const { shouldIgnoreFile } = require('@hubspot/local-dev-lib/ignoreRules'); -const { getCwd, getAbsoluteFilePath } = require('@hubspot/local-dev-lib/path'); -const { downloadGithubRepoContents } = require('@hubspot/local-dev-lib/github'); -const { promptUser } = require('./prompts/promptUtils'); -const { EXIT_CODES } = require('./enums/exitCodes'); -const { - uiLine, - uiLink, - uiAccountDescription, - uiCommandReference, -} = require('./ui'); -const { i18n } = require('./lang'); -const SpinniesManager = require('./ui/SpinniesManager'); -const { logError, ApiErrorContext } = require('./errorHandlers/index'); - -const i18nKey = 'lib.projects'; - -const SPINNER_STATUS = { - SPINNING: 'spinning', -}; - -const writeProjectConfig = (configPath, config) => { - try { - fs.ensureFileSync(configPath); - fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); - logger.debug(`Wrote project config at ${configPath}`); - } catch (e) { - logger.debug(e); - return false; - } - return true; -}; - -const getIsInProject = _dir => { - const configPath = getProjectConfigPath(_dir); - return !!configPath; -}; - -const getProjectConfigPath = _dir => { - const projectDir = _dir ? getAbsoluteFilePath(_dir) : getCwd(); - - const configPath = findup(PROJECT_CONFIG_FILE, { - cwd: projectDir, - nocase: true, - }); - - return configPath; -}; - -export const getProjectConfig = async _dir => { - const configPath = await getProjectConfigPath(_dir); - if (!configPath) { - return { projectConfig: null, projectDir: null }; - } - - try { - const config = fs.readFileSync(configPath); - const projectConfig = JSON.parse(config); - return { - projectDir: path.dirname(configPath), - projectConfig, - }; - } catch (e) { - logger.error('Could not read from project config'); - } -}; - -const createProjectConfig = async ( - projectPath, - projectName, - template, - templateSource, - githubRef -) => { - const { projectConfig, projectDir } = await getProjectConfig(projectPath); - - if (projectConfig) { - logger.warn( - projectPath === projectDir - ? 'A project already exists in that location.' - : `Found an existing project definition in ${projectDir}.` - ); - - const { shouldContinue } = await promptUser([ - { - name: 'shouldContinue', - message: () => { - return projectPath === projectDir - ? 'Do you want to overwrite the existing project definition with a new one?' - : `Continue creating a new project in ${projectPath}?`; - }, - type: 'confirm', - default: false, - }, - ]); - - if (!shouldContinue) { - return false; - } - } - - const projectConfigPath = path.join(projectPath, PROJECT_CONFIG_FILE); - - logger.log( - `Creating project config in ${ - projectPath ? projectPath : 'the current folder' - }` - ); - - const hasCustomTemplateSource = Boolean(templateSource); - - await downloadGithubRepoContents( - templateSource || HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, - template.path, - projectPath, - hasCustomTemplateSource ? undefined : githubRef - ); - const _config = JSON.parse(fs.readFileSync(projectConfigPath)); - writeProjectConfig(projectConfigPath, { - ..._config, - name: projectName, - }); - - if (template.name === 'no-template') { - fs.ensureDirSync(path.join(projectPath, 'src')); - } - - return true; -}; - -const validateProjectConfig = (projectConfig, projectDir) => { - if (!projectConfig) { - logger.error( - i18n(`${i18nKey}.validateProjectConfig.configNotFound`, { - createCommand: uiCommandReference('hs project create'), - }) - ); - return process.exit(EXIT_CODES.ERROR); - } - - if (!projectConfig.name || !projectConfig.srcDir) { - logger.error(i18n(`${i18nKey}.validateProjectConfig.configMissingFields`)); - return process.exit(EXIT_CODES.ERROR); - } - - const resolvedPath = path.resolve(projectDir, projectConfig.srcDir); - if (!resolvedPath.startsWith(projectDir)) { - const projectConfigFile = path.relative( - '.', - path.join(projectDir, PROJECT_CONFIG_FILE) - ); - logger.error( - i18n(`${i18nKey}.validateProjectConfig.srcOutsideProjectDir`, { - srcDir: projectConfig.srcDir, - projectConfig: projectConfigFile, - }) - ); - return process.exit(EXIT_CODES.ERROR); - } - - if (!fs.existsSync(resolvedPath)) { - logger.error( - i18n(`${i18nKey}.validateProjectConfig.srcDirNotFound`, { - srcDir: projectConfig.srcDir, - projectDir: projectDir, - }) - ); - - return process.exit(EXIT_CODES.ERROR); - } -}; - -const pollFetchProject = async (accountId, projectName) => { - // Temporary solution for gating slowness. Retry on 403 statusCode - return new Promise((resolve, reject) => { - let pollCount = 0; - SpinniesManager.init(); - SpinniesManager.add('pollFetchProject', { - text: i18n(`${i18nKey}.pollFetchProject.checkingProject`, { - accountIdentifier: uiAccountDescription(accountId), - }), - }); - const pollInterval = setInterval(async () => { - try { - const response = await fetchProject(accountId, projectName); - if (response && response.data) { - SpinniesManager.remove('pollFetchProject'); - clearInterval(pollInterval); - resolve(response); - } - } catch (err) { - if ( - isSpecifiedError(err, { - statusCode: 403, - category: 'GATED', - subCategory: 'BuildPipelineErrorType.PORTAL_GATED', - }) && - pollCount < 15 - ) { - pollCount += 1; - } else { - SpinniesManager.remove('pollFetchProject'); - clearInterval(pollInterval); - reject(err); - } - } - }, POLLING_DELAY); - }); -}; - -const ensureProjectExists = async ( - accountId, - projectName, - { - forceCreate = false, - allowCreate = true, - noLogs = false, - withPolling = false, - uploadCommand = false, - } = {} -) => { - const accountIdentifier = uiAccountDescription(accountId); - try { - const { data: project } = withPolling - ? await pollFetchProject(accountId, projectName) - : await fetchProject(accountId, projectName); - return { projectExists: !!project, project }; - } catch (err) { - if (isSpecifiedError(err, { statusCode: 404 })) { - let shouldCreateProject = forceCreate; - if (allowCreate && !shouldCreateProject) { - const promptKey = uploadCommand ? 'createPromptUpload' : 'createPrompt'; - const promptResult = await promptUser([ - { - name: 'shouldCreateProject', - message: i18n(`${i18nKey}.ensureProjectExists.${promptKey}`, { - projectName, - accountIdentifier, - }), - type: 'confirm', - }, - ]); - shouldCreateProject = promptResult.shouldCreateProject; - } - - if (shouldCreateProject) { - try { - const { data: project } = await createProject(accountId, projectName); - logger.success( - i18n(`${i18nKey}.ensureProjectExists.createSuccess`, { - projectName, - accountIdentifier, - }) - ); - return { projectExists: true, project }; - } catch (err) { - return logError(err, new ApiErrorContext({ accountId })); - } - } else { - if (!noLogs) { - logger.log( - i18n(`${i18nKey}.ensureProjectExists.notFound`, { - projectName, - accountIdentifier, - }) - ); - } - return { projectExists: false }; - } - } - if ( - isSpecifiedError(err, { - statusCode: 401, - }) - ) { - logger.error(err.message); - process.exit(EXIT_CODES.ERROR); - } - logError(err, new ApiErrorContext({ accountId })); - process.exit(EXIT_CODES.ERROR); - } -}; - -const getProjectHomeUrl = accountId => { - const baseUrl = getHubSpotWebsiteOrigin( - getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD - ); - - return `${baseUrl}/developer-projects/${accountId}`; -}; - -const getProjectDetailUrl = (projectName, accountId) => { - if (!projectName) return; - return `${getProjectHomeUrl(accountId)}/project/${projectName}`; -}; - -const getProjectActivityUrl = (projectName, accountId) => { - if (!projectName) return; - return `${getProjectDetailUrl(projectName, accountId)}/activity`; -}; - -const getProjectBuildDetailUrl = (projectName, buildId, accountId) => { - if (!projectName || !buildId || !accountId) return; - return `${getProjectActivityUrl(projectName, accountId)}/build/${buildId}`; -}; - -const getProjectDeployDetailUrl = (projectName, deployId, accountId) => { - if (!projectName || !deployId || !accountId) return; - return `${getProjectActivityUrl(projectName, accountId)}/deploy/${deployId}`; -}; - -const uploadProjectFiles = async ( - accountId, - projectName, - filePath, - uploadMessage, - platformVersion -) => { - SpinniesManager.init({}); - const accountIdentifier = uiAccountDescription(accountId); - - SpinniesManager.add('upload', { - text: i18n(`${i18nKey}.uploadProjectFiles.add`, { - accountIdentifier, - projectName, - }), - succeedColor: 'white', - }); - - let buildId; - let error; - - try { - const { data: upload } = await uploadProject( - accountId, - projectName, - filePath, - uploadMessage, - platformVersion - ); - - buildId = upload.buildId; - - SpinniesManager.succeed('upload', { - text: i18n(`${i18nKey}.uploadProjectFiles.succeed`, { - accountIdentifier, - projectName, - }), - }); - - logger.debug( - i18n(`${i18nKey}.uploadProjectFiles.buildCreated`, { - buildId, - projectName, - }) - ); - } catch (err) { - SpinniesManager.fail('upload', { - text: i18n(`${i18nKey}.uploadProjectFiles.fail`, { - accountIdentifier, - projectName, - }), - }); - - error = err; - } - - return { buildId, error }; -}; - -const pollProjectBuildAndDeploy = async ( - accountId, - projectConfig, - tempFile, - buildId, - silenceLogs = false -) => { - let buildStatus = await pollBuildStatus( - accountId, - projectConfig.name, - buildId, - null, - silenceLogs - ); - - if (!silenceLogs) { - uiLine(); - } - - const result = { - succeeded: true, - buildId, - buildResult: buildStatus, - deployResult: null, - }; - - if (buildStatus.status === 'FAILURE') { - result.succeeded = false; - return result; - } else if (buildStatus.isAutoDeployEnabled) { - if (!silenceLogs) { - logger.log( - i18n( - `${i18nKey}.pollProjectBuildAndDeploy.buildSucceededAutomaticallyDeploying`, - { - accountIdentifier: uiAccountDescription(accountId), - buildId, - } - ) - ); - - await displayWarnLogs(accountId, projectConfig.name, buildId); - } - - // autoDeployId of 0 indicates a skipped deploy - const getIsDeploying = () => - buildStatus.autoDeployId > 0 && buildStatus.deployStatusTaskLocator; - - // Sometimes the deploys do not immediately initiate, give them a chance to kick off - if (!getIsDeploying()) { - buildStatus = await pollBuildAutodeployStatus( - accountId, - projectConfig.name, - buildId - ); - } - - if (getIsDeploying()) { - const deployStatus = await pollDeployStatus( - accountId, - projectConfig.name, - buildStatus.deployStatusTaskLocator.id, - buildId, - silenceLogs - ); - result.deployResult = deployStatus; - - if (deployStatus.status === 'FAILURE') { - result.succeeded = false; - } - } else if (!silenceLogs) { - logger.log( - i18n( - `${i18nKey}.pollProjectBuildAndDeploy.unableToFindAutodeployStatus`, - { - buildId, - viewDeploysLink: uiLink( - i18n(`${i18nKey}.pollProjectBuildAndDeploy.viewDeploys`), - getProjectActivityUrl(projectConfig.name, accountId) - ), - } - ) - ); - } - } - - try { - if (tempFile) { - tempFile.removeCallback(); - logger.debug( - i18n(`${i18nKey}.pollProjectBuildAndDeploy.cleanedUpTempFile`, { - path: tempFile.name, - }) - ); - } - } catch (e) { - logger.error(e); - } - - if (result && result.deployResult) { - await displayWarnLogs( - accountId, - projectConfig.name, - result.deployResult.deployId, - true - ); - } - return result; -}; - -const handleProjectUpload = async ( - accountId, - projectConfig, - projectDir, - callbackFunc, - uploadMessage -) => { - const srcDir = path.resolve(projectDir, projectConfig.srcDir); - - const filenames = fs.readdirSync(srcDir); - if (!filenames || filenames.length === 0) { - logger.log( - i18n(`${i18nKey}.handleProjectUpload.emptySource`, { - srcDir: projectConfig.srcDir, - }) - ); - process.exit(EXIT_CODES.SUCCESS); - } - - const tempFile = tmp.fileSync({ postfix: '.zip' }); - - logger.debug( - i18n(`${i18nKey}.handleProjectUpload.compressing`, { - path: tempFile.name, - }) - ); - - const output = fs.createWriteStream(tempFile.name); - const archive = archiver('zip'); - - const result = new Promise(resolve => - output.on('close', async function () { - let uploadResult = {}; - - logger.debug( - i18n(`${i18nKey}.handleProjectUpload.compressed`, { - byteCount: archive.pointer(), - }) - ); - - const { buildId, error } = await uploadProjectFiles( - accountId, - projectConfig.name, - tempFile.name, - uploadMessage, - projectConfig.platformVersion - ); - - if (error) { - uploadResult.uploadError = error; - } else if (callbackFunc) { - uploadResult = await callbackFunc( - accountId, - projectConfig, - tempFile, - buildId - ); - } - resolve(uploadResult || {}); - }) - ); - - archive.pipe(output); - - let loggedIgnoredNodeModule = false; - - archive.directory(srcDir, false, file => { - const ignored = shouldIgnoreFile(file.name, true); - if (ignored) { - const isNodeModule = file.name.includes('node_modules'); - - if (!isNodeModule || !loggedIgnoredNodeModule) { - logger.debug( - i18n(`${i18nKey}.handleProjectUpload.fileFiltered`, { - filename: file.name, - }) - ); - } - - if (isNodeModule && !loggedIgnoredNodeModule) { - loggedIgnoredNodeModule = true; - } - } - return ignored ? false : file; - }); - - archive.finalize(); - - return result; -}; - -const makePollTaskStatusFunc = ({ - statusFn, - structureFn, - statusText, - statusStrings, - linkToHubSpot, -}) => { - return async ( - accountId, - taskName, - taskId, - deployedBuildId = null, - silenceLogs = false - ) => { - const displayId = deployedBuildId || taskId; - - if (linkToHubSpot && !silenceLogs) { - logger.log( - `\n${linkToHubSpot(accountId, taskName, taskId, deployedBuildId)}\n` - ); - } - - SpinniesManager.init(); - - const overallTaskSpinniesKey = `overallTaskStatus-${statusText.STATUS_TEXT}`; - - SpinniesManager.add(overallTaskSpinniesKey, { - text: 'Beginning', - succeedColor: 'white', - failColor: 'white', - failPrefix: chalk.bold('!'), - }); - - const [ - { data: initialTaskStatus }, - { - data: { topLevelComponentsWithChildren: taskStructure }, - }, - ] = await Promise.all([ - statusFn(accountId, taskName, taskId), - structureFn(accountId, taskName, taskId), - ]); - - const tasksById = initialTaskStatus[statusText.SUBTASK_KEY].reduce( - (acc, task) => { - const { id, visible } = task; - if (visible) { - acc[id] = task; - } - return acc; - }, - {} - ); - - const structuredTasks = Object.keys(taskStructure).map(key => { - return { - ...tasksById[key], - subtasks: taskStructure[key] - .filter(taskId => Boolean(tasksById[taskId])) - .map(taskId => tasksById[taskId]), - }; - }); - - const numComponents = structuredTasks.length; - const componentCountText = silenceLogs - ? '' - : i18n( - numComponents === 1 - ? `${i18nKey}.makePollTaskStatusFunc.componentCountSingular` - : `${i18nKey}.makePollTaskStatusFunc.componentCount`, - { numComponents } - ) + '\n'; - - SpinniesManager.update(overallTaskSpinniesKey, { - text: `${statusStrings.INITIALIZE( - taskName, - displayId - )}\n${componentCountText}`, - }); - - if (!silenceLogs) { - const addTaskSpinner = (task, indent, newline) => { - const taskName = task[statusText.SUBTASK_NAME_KEY]; - const taskType = task[statusText.TYPE_KEY]; - const formattedTaskType = PROJECT_TASK_TYPES[taskType] - ? `[${PROJECT_TASK_TYPES[taskType]}]` - : ''; - const text = `${indent <= 2 ? statusText.STATUS_TEXT : ''} ${chalk.bold( - taskName - )} ${formattedTaskType} ...${newline ? '\n' : ''}`; - - SpinniesManager.add(task.id, { - text, - indent, - succeedColor: 'white', - failColor: 'white', - }); - }; - - structuredTasks.forEach(task => { - addTaskSpinner(task, 2, !task.subtasks || task.subtasks.length === 0); - task.subtasks.forEach((subtask, i) => - addTaskSpinner(subtask, 4, i === task.subtasks.length - 1) - ); - }); - } - - return new Promise((resolve, reject) => { - const pollInterval = setInterval(async () => { - let taskStatus; - try { - const { data } = await statusFn(accountId, taskName, taskId); - taskStatus = data; - } catch (e) { - logger.debug(e); - logError( - e, - new ApiErrorContext({ - accountId, - projectName: taskName, - }) - ); - return reject( - new Error( - i18n( - `${i18nKey}.makePollTaskStatusFunc.errorFetchingTaskStatus`, - { - taskType: - statusText.TYPE_KEY === PROJECT_BUILD_TEXT.TYPE_KEY - ? 'build' - : 'deploy', - } - ) - ) - ); - } - - if ( - !taskStatus || - !taskStatus.status || - !taskStatus[statusText.SUBTASK_KEY] - ) { - return reject( - new Error( - i18n( - `${i18nKey}.makePollTaskStatusFunc.errorFetchingTaskStatus`, - { - taskType: - statusText.TYPE_KEY === PROJECT_BUILD_TEXT.TYPE_KEY - ? 'build' - : 'deploy', - } - ) - ) - ); - } - - const { status, [statusText.SUBTASK_KEY]: subTaskStatus } = taskStatus; - - if (SpinniesManager.hasActiveSpinners()) { - subTaskStatus.forEach(subTask => { - const { id, status } = subTask; - const spinner = SpinniesManager.pick(id); - - if (!spinner || spinner.status !== SPINNER_STATUS.SPINNING) { - return; - } - - const topLevelTask = structuredTasks.find(t => t.id == id); - - if ( - status === statusText.STATES.SUCCESS || - status === statusText.STATES.FAILURE - ) { - const taskStatusText = - subTask.status === statusText.STATES.SUCCESS - ? i18n(`${i18nKey}.makePollTaskStatusFunc.successStatusText`) - : i18n(`${i18nKey}.makePollTaskStatusFunc.failedStatusText`); - const hasNewline = - spinner.text.includes('\n') || Boolean(topLevelTask); - const updatedText = `${spinner.text.replace( - '\n', - '' - )} ${taskStatusText}${hasNewline ? '\n' : ''}`; - - if (status === statusText.STATES.SUCCESS) { - SpinniesManager.succeed(id, { text: updatedText }); - } else { - SpinniesManager.fail(id, { text: updatedText }); - } - - if (topLevelTask) { - topLevelTask.subtasks.forEach(currentSubtask => - SpinniesManager.remove(currentSubtask.id) - ); - } - } - }); - - if (status === statusText.STATES.SUCCESS) { - SpinniesManager.succeed(overallTaskSpinniesKey, { - text: statusStrings.SUCCESS(taskName, displayId), - }); - clearInterval(pollInterval); - resolve(taskStatus); - } else if (status === statusText.STATES.FAILURE) { - SpinniesManager.fail(overallTaskSpinniesKey, { - text: statusStrings.FAIL(taskName, displayId), - }); - - if (!silenceLogs) { - const failedSubtasks = subTaskStatus.filter( - subtask => subtask.status === 'FAILURE' - ); - - uiLine(); - logger.log( - `${statusStrings.SUBTASK_FAIL( - displayId, - failedSubtasks.length === 1 - ? failedSubtasks[0][statusText.SUBTASK_NAME_KEY] - : failedSubtasks.length + ' components' - )}\n` - ); - logger.log('See below for a summary of errors.'); - uiLine(); - - const displayErrors = failedSubtasks.filter( - subtask => - subtask.standardError.subCategory !== - PROJECT_ERROR_TYPES.SUBBUILD_FAILED && - subtask.standardError.subCategory !== - PROJECT_ERROR_TYPES.SUBDEPLOY_FAILED - ); - - displayErrors.forEach(subTask => { - logger.log( - `\n--- ${chalk.bold( - subTask[statusText.SUBTASK_NAME_KEY] - )} failed with the following error ---` - ); - logger.error(subTask.errorMessage); - - // Log nested errors - if (subTask.standardError && subTask.standardError.errors) { - logger.log(); - subTask.standardError.errors.forEach(error => { - logger.log(error.message); - }); - } - }); - } - clearInterval(pollInterval); - resolve(taskStatus); - } else if (!subTaskStatus.length) { - clearInterval(pollInterval); - resolve(taskStatus); - } - } - }, POLLING_DELAY); - }); - }; -}; - -const pollBuildAutodeployStatus = (accountId, taskName, buildId) => { - return new Promise((resolve, reject) => { - let maxIntervals = (30 * 1000) / POLLING_DELAY; // Num of intervals in ~30s - - const pollInterval = setInterval(async () => { - let taskStatus; - try { - taskStatus = await getBuildStatus(accountId, taskName, buildId); - } catch (e) { - logger.debug(e); - return reject( - new Error( - i18n(`${i18nKey}.pollBuildAutodeployStatusError`, { buildId }) - ) - ); - } - - if (!taskStatus || !taskStatus.status) { - return reject( - new Error( - i18n(`${i18nKey}.pollBuildAutodeployStatusError`, { buildId }) - ) - ); - } - - if (taskStatus.deployStatusTaskLocator || maxIntervals <= 0) { - clearInterval(pollInterval); - resolve(taskStatus); - } else { - maxIntervals -= 1; - } - }, POLLING_DELAY); - }); -}; - -const pollBuildStatus = makePollTaskStatusFunc({ - linkToHubSpot: (accountId, taskName, taskId) => - uiLink( - `View build #${taskId} in HubSpot`, - getProjectBuildDetailUrl(taskName, taskId, accountId) - ), - statusFn: getBuildStatus, - structureFn: getBuildStructure, - statusText: PROJECT_BUILD_TEXT, - statusStrings: { - INITIALIZE: (name, buildId) => `Building ${chalk.bold(name)} #${buildId}`, - SUCCESS: (name, buildId) => `Built ${chalk.bold(name)} #${buildId}`, - FAIL: (name, buildId) => `Failed to build ${chalk.bold(name)} #${buildId}`, - SUBTASK_FAIL: (buildId, name) => - `Build #${buildId} failed because there was a problem\nbuilding ${chalk.bold( - name - )}`, - }, -}); - -const pollDeployStatus = makePollTaskStatusFunc({ - linkToHubSpot: (accountId, taskName, taskId, deployedBuildId) => - uiLink( - `View deploy of build #${deployedBuildId} in HubSpot`, - getProjectDeployDetailUrl(taskName, taskId, accountId) - ), - statusFn: getDeployStatus, - structureFn: getDeployStructure, - statusText: PROJECT_DEPLOY_TEXT, - statusStrings: { - INITIALIZE: (name, buildId) => - `Deploying build #${buildId} in ${chalk.bold(name)}`, - SUCCESS: (name, buildId) => - `Deployed build #${buildId} in ${chalk.bold(name)}`, - FAIL: (name, buildId) => - `Failed to deploy build #${buildId} in ${chalk.bold(name)}`, - SUBTASK_FAIL: (deployedBuildId, name) => - `Deploy for build #${deployedBuildId} failed because there was a\nproblem deploying ${chalk.bold( - name - )}`, - }, -}); - -const logFeedbackMessage = buildId => { - if (buildId > 0 && buildId % FEEDBACK_INTERVAL === 0) { - uiLine(); - logger.log(i18n(`${i18nKey}.logFeedbackMessage.feedbackHeader`)); - uiLine(); - logger.log(i18n(`${i18nKey}.logFeedbackMessage.feedbackMessage`)); - } -}; - -const createProjectComponent = async ( - component, - name, - projectComponentsVersion -) => { - const i18nKey = 'commands.project.subcommands.add'; - const componentName = name; - - const configInfo = await getProjectConfig(); - - if (!configInfo.projectDir && !configInfo.projectConfig) { - logger.error(i18n(`${i18nKey}.error.locationInProject`)); - process.exit(EXIT_CODES.ERROR); - } - - const componentPath = path.join( - configInfo.projectDir, - configInfo.projectConfig.srcDir, - component.insertPath, - componentName - ); - - await downloadGithubRepoContents( - HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, - component.path, - componentPath, - projectComponentsVersion - ); -}; - -const displayWarnLogs = async ( - accountId, - projectName, - taskId, - isDeploy = false -) => { - let result; - - if (isDeploy) { - try { - const { data } = await fetchDeployWarnLogs( - accountId, - projectName, - taskId - ); - result = data; - } catch (e) { - logError(e); - } - } else { - try { - const { data } = await fetchBuildWarnLogs(accountId, projectName, taskId); - result = data; - } catch (e) { - logError(e); - } - } - - if (result && result.logs) { - const logLength = result.logs.length; - result.logs.forEach((log, i) => { - logger.warn(log.message); - if (i < logLength - 1) { - logger.log(''); - } - }); - } -}; - -const getProjectComponentsByVersion = async projectComponentsVersion => { - const config = await fetchFileFromRepository( - HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, - 'config.json', - projectComponentsVersion - ); - - return config[PROJECT_COMPONENT_TYPES.COMPONENTS]; -}; - -module.exports = { - writeProjectConfig, - getProjectConfig, - getIsInProject, - pollProjectBuildAndDeploy, - handleProjectUpload, - createProjectConfig, - validateProjectConfig, - getProjectHomeUrl, - getProjectDetailUrl, - getProjectBuildDetailUrl, - pollBuildStatus, - pollDeployStatus, - ensureProjectExists, - logFeedbackMessage, - createProjectComponent, - displayWarnLogs, - getProjectComponentsByVersion, -}; diff --git a/lib/projects/buildAndDeploy.ts b/lib/projects/buildAndDeploy.ts new file mode 100644 index 000000000..1a1960f7f --- /dev/null +++ b/lib/projects/buildAndDeploy.ts @@ -0,0 +1,610 @@ +import chalk from 'chalk'; +import { FileResult } from 'tmp'; +import { HubSpotPromise } from '@hubspot/local-dev-lib/types/Http'; +import { ComponentStructureResponse } from '@hubspot/local-dev-lib/types/ComponentStructure'; +import { Build } from '@hubspot/local-dev-lib/types/Build'; +import { Deploy } from '@hubspot/local-dev-lib/types/Deploy'; +import { logger } from '@hubspot/local-dev-lib/logger'; +import { + getBuildStatus, + getBuildStructure, + getDeployStatus, + getDeployStructure, + fetchBuildWarnLogs, + fetchDeployWarnLogs, +} from '@hubspot/local-dev-lib/api/projects'; +import { WarnLogsResponse } from '@hubspot/local-dev-lib/types/Project'; + +import { + POLLING_DELAY, + PROJECT_BUILD_TEXT, + PROJECT_DEPLOY_TEXT, + PROJECT_TASK_TYPES, + PROJECT_ERROR_TYPES, +} from '../constants'; +import SpinniesManager from '../ui/SpinniesManager'; +import { i18n } from '../lang'; +import { logError, ApiErrorContext } from '../errorHandlers'; +import { uiLine, uiLink, uiAccountDescription } from '../ui'; +import { + getProjectBuildDetailUrl, + getProjectDeployDetailUrl, + getProjectActivityUrl, +} from './urls'; +import { + ProjectConfig, + ProjectTask, + ProjectSubtask, + ProjectPollStatusFunctionText, +} from '../../types/Projects'; + +const i18nKey = 'lib.projectBuildAndDeploy'; + +const SPINNER_STATUS = { + SPINNING: 'spinning', +}; + +function getSubtasks(task: ProjectTask): ProjectSubtask[] { + if ('subbuildStatuses' in task) { + return task.subbuildStatuses; + } + return task.subdeployStatuses; +} + +function getSubtaskName(task: ProjectSubtask): string { + if ('buildName' in task) { + return task.buildName; + } + return task.deployName; +} + +function getSubtaskType(task: ProjectSubtask): string { + if ('buildType' in task) { + return task.buildType; + } + return task.deployType; +} + +type PollTaskStatusFunctionConfig = { + statusFn: ( + accountId: number, + projectName: string, + taskId: number + ) => HubSpotPromise; + structureFn: ( + accountId: number, + projectName: string, + taskId: number + ) => HubSpotPromise; + statusText: ProjectPollStatusFunctionText; + statusStrings: PollTaskStatusStrings; + linkToHubSpot: ( + accountId: number, + taskName: string, + taskId: number, + deployedBuildId: number | null + ) => void; +}; + +type PollTaskStatus = 'INITIALIZE' | 'SUCCESS' | 'FAIL' | 'SUBTASK_FAIL'; + +type PollTaskStatusStringFunction = (name: string, taskId: number) => string; + +type PollTaskStatusStrings = { + [k in PollTaskStatus]: PollTaskStatusStringFunction; +}; + +type PollTaskStatusFunction = ( + accountId: number, + taskName: string, + taskId: number, + deployedBuildId: number | null, + silenceLogs: boolean +) => Promise; + +function makePollTaskStatusFunc({ + statusFn, + structureFn, + statusText, + statusStrings, + linkToHubSpot, +}: PollTaskStatusFunctionConfig): PollTaskStatusFunction { + return async function ( + accountId, + taskName, + taskId, + deployedBuildId = null, + silenceLogs = false + ) { + const displayId = deployedBuildId || taskId; + + if (linkToHubSpot && !silenceLogs) { + logger.log( + `\n${linkToHubSpot(accountId, taskName, taskId, deployedBuildId)}\n` + ); + } + + SpinniesManager.init(); + + const overallTaskSpinniesKey = `overallTaskStatus-${statusText.STATUS_TEXT}`; + + SpinniesManager.add(overallTaskSpinniesKey, { + text: 'Beginning', + succeedColor: 'white', + failColor: 'white', + failPrefix: chalk.bold('!'), + }); + + const [ + { data: initialTaskStatus }, + { + data: { topLevelComponentsWithChildren: taskStructure }, + }, + ] = await Promise.all([ + statusFn(accountId, taskName, taskId), + structureFn(accountId, taskName, taskId), + ]); + + const subtasks = getSubtasks(initialTaskStatus); + + const tasksById = subtasks.reduce( + (acc: { [key: string]: ProjectSubtask }, subtask) => { + const { id, visible } = subtask; + if (visible) { + acc[id] = subtask; + } + return acc; + }, + {} + ); + + const structuredTasks = Object.keys(taskStructure).map(key => { + return { + ...tasksById[key], + subtasks: taskStructure[key] + .filter(taskId => Boolean(tasksById[taskId])) + .map(taskId => tasksById[taskId]), + }; + }); + + const numComponents = structuredTasks.length; + const componentCountText = silenceLogs + ? '' + : i18n( + numComponents === 1 + ? `${i18nKey}.makePollTaskStatusFunc.componentCountSingular` + : `${i18nKey}.makePollTaskStatusFunc.componentCount`, + { numComponents } + ) + '\n'; + + SpinniesManager.update(overallTaskSpinniesKey, { + text: `${statusStrings.INITIALIZE( + taskName, + displayId + )}\n${componentCountText}`, + }); + + if (!silenceLogs) { + function addTaskSpinner( + subtask: ProjectSubtask, + indent: number, + newline: boolean + ): void { + const taskName = getSubtaskName(subtask); + const taskType = getSubtaskType(subtask); + const formattedTaskType = PROJECT_TASK_TYPES[taskType] + ? `[${PROJECT_TASK_TYPES[taskType]}]` + : ''; + const text = `${indent <= 2 ? statusText.STATUS_TEXT : ''} ${chalk.bold( + taskName + )} ${formattedTaskType} ...${newline ? '\n' : ''}`; + + SpinniesManager.add(subtask.id, { + text, + indent, + succeedColor: 'white', + failColor: 'white', + }); + } + + structuredTasks.forEach(task => { + addTaskSpinner(task, 2, !task.subtasks || task.subtasks.length === 0); + task.subtasks.forEach((subtask, i) => + addTaskSpinner(subtask, 4, i === task.subtasks.length - 1) + ); + }); + } + + return new Promise((resolve, reject) => { + const pollInterval = setInterval(async () => { + let taskStatus: T; + try { + const { data } = await statusFn(accountId, taskName, taskId); + taskStatus = data; + } catch (e) { + logger.debug(e); + logError( + e, + new ApiErrorContext({ + accountId, + projectName: taskName, + }) + ); + return reject( + new Error( + i18n( + `${i18nKey}.makePollTaskStatusFunc.errorFetchingTaskStatus`, + { + taskType: + statusText.TYPE_KEY === PROJECT_BUILD_TEXT.TYPE_KEY + ? 'build' + : 'deploy', + } + ) + ) + ); + } + + const subtasks = getSubtasks(taskStatus); + + if (!taskStatus || !taskStatus.status || !subtasks) { + return reject( + new Error( + i18n( + `${i18nKey}.makePollTaskStatusFunc.errorFetchingTaskStatus`, + { + taskType: + statusText.TYPE_KEY === PROJECT_BUILD_TEXT.TYPE_KEY + ? 'build' + : 'deploy', + } + ) + ) + ); + } + + const { status } = taskStatus; + + if (SpinniesManager.hasActiveSpinners()) { + subtasks.forEach(subtask => { + const { id, status } = subtask; + const spinner = SpinniesManager.pick(id); + + if (!spinner || spinner.status !== SPINNER_STATUS.SPINNING) { + return; + } + + const topLevelTask = structuredTasks.find(t => t.id == id); + + if ( + status === statusText.STATES.SUCCESS || + status === statusText.STATES.FAILURE + ) { + const taskStatusText = + subtask.status === statusText.STATES.SUCCESS + ? i18n(`${i18nKey}.makePollTaskStatusFunc.successStatusText`) + : i18n(`${i18nKey}.makePollTaskStatusFunc.failedStatusText`); + const hasNewline = + spinner?.text?.includes('\n') || Boolean(topLevelTask); + const updatedText = `${spinner?.text?.replace( + '\n', + '' + )} ${taskStatusText}${hasNewline ? '\n' : ''}`; + + if (status === statusText.STATES.SUCCESS) { + SpinniesManager.succeed(id, { text: updatedText }); + } else { + SpinniesManager.fail(id, { text: updatedText }); + } + + if (topLevelTask) { + topLevelTask.subtasks.forEach(currentSubtask => + SpinniesManager.remove(currentSubtask.id) + ); + } + } + }); + + if (status === statusText.STATES.SUCCESS) { + SpinniesManager.succeed(overallTaskSpinniesKey, { + text: statusStrings.SUCCESS(taskName, displayId), + }); + clearInterval(pollInterval); + resolve(taskStatus); + } else if (status === statusText.STATES.FAILURE) { + SpinniesManager.fail(overallTaskSpinniesKey, { + text: statusStrings.FAIL(taskName, displayId), + }); + + if (!silenceLogs) { + const failedSubtasks = subtasks.filter( + subtask => subtask.status === 'FAILURE' + ); + + uiLine(); + logger.log( + `${statusStrings.SUBTASK_FAIL( + failedSubtasks.length === 1 + ? getSubtaskName(failedSubtasks[0]) + : failedSubtasks.length + ' components', + displayId + )}\n` + ); + logger.log('See below for a summary of errors.'); + uiLine(); + + const displayErrors = failedSubtasks.filter( + subtask => + subtask?.standardError?.subCategory !== + PROJECT_ERROR_TYPES.SUBBUILD_FAILED && + subtask?.standardError?.subCategory !== + PROJECT_ERROR_TYPES.SUBDEPLOY_FAILED + ); + + displayErrors.forEach(subTask => { + logger.log( + `\n--- ${chalk.bold( + getSubtaskName(subTask) + )} failed with the following error ---` + ); + logger.error(subTask.errorMessage); + + // Log nested errors + if (subTask.standardError && subTask.standardError.errors) { + logger.log(); + subTask.standardError.errors.forEach(error => { + logger.log(error.message); + }); + } + }); + } + clearInterval(pollInterval); + resolve(taskStatus); + } else if (!subtasks.length) { + clearInterval(pollInterval); + resolve(taskStatus); + } + } + }, POLLING_DELAY); + }); + }; +} + +function pollBuildAutodeployStatus( + accountId: number, + taskName: string, + buildId: number +): Promise { + return new Promise((resolve, reject) => { + let maxIntervals = (30 * 1000) / POLLING_DELAY; // Num of intervals in ~30s + + const pollInterval = setInterval(async () => { + let build: Build; + try { + const response = await getBuildStatus(accountId, taskName, buildId); + build = response.data; + } catch (e) { + logger.debug(e); + return reject( + new Error( + i18n(`${i18nKey}.pollBuildAutodeployStatusError`, { buildId }) + ) + ); + } + + if (!build || !build.status) { + return reject( + new Error( + i18n(`${i18nKey}.pollBuildAutodeployStatusError`, { buildId }) + ) + ); + } + + if (build.deployStatusTaskLocator || maxIntervals <= 0) { + clearInterval(pollInterval); + resolve(build); + } else { + maxIntervals -= 1; + } + }, POLLING_DELAY); + }); +} + +export const pollBuildStatus = makePollTaskStatusFunc({ + linkToHubSpot: (accountId, taskName, taskId) => + uiLink( + `View build #${taskId} in HubSpot`, + getProjectBuildDetailUrl(taskName, taskId, accountId) + ), + statusFn: getBuildStatus, + structureFn: getBuildStructure, + statusText: PROJECT_BUILD_TEXT, + statusStrings: { + INITIALIZE: (name, buildId) => `Building ${chalk.bold(name)} #${buildId}`, + SUCCESS: (name, buildId) => `Built ${chalk.bold(name)} #${buildId}`, + FAIL: (name, buildId) => `Failed to build ${chalk.bold(name)} #${buildId}`, + SUBTASK_FAIL: (buildId, name) => + `Build #${buildId} failed because there was a problem\nbuilding ${chalk.bold( + name + )}`, + }, +}); + +export const pollDeployStatus = makePollTaskStatusFunc({ + linkToHubSpot: (accountId, taskName, taskId, deployedBuildId) => + uiLink( + `View deploy of build #${deployedBuildId} in HubSpot`, + getProjectDeployDetailUrl(taskName, taskId, accountId) + ), + statusFn: getDeployStatus, + structureFn: getDeployStructure, + statusText: PROJECT_DEPLOY_TEXT, + statusStrings: { + INITIALIZE: (name, buildId) => + `Deploying build #${buildId} in ${chalk.bold(name)}`, + SUCCESS: (name, buildId) => + `Deployed build #${buildId} in ${chalk.bold(name)}`, + FAIL: (name, buildId) => + `Failed to deploy build #${buildId} in ${chalk.bold(name)}`, + SUBTASK_FAIL: (deployedBuildId, name) => + `Deploy for build #${deployedBuildId} failed because there was a\nproblem deploying ${chalk.bold( + name + )}`, + }, +}); + +type ProjectPollResult = { + succeeded: boolean; + buildId: number; + buildResult: Build; + deployResult: Deploy | null; +}; + +export async function displayWarnLogs( + accountId: number, + projectName: string, + taskId: number, + isDeploy = false +): Promise { + let result: WarnLogsResponse | undefined; + + if (isDeploy) { + try { + const { data } = await fetchDeployWarnLogs( + accountId, + projectName, + taskId + ); + result = data; + } catch (e) { + logError(e); + } + } else { + try { + const { data } = await fetchBuildWarnLogs(accountId, projectName, taskId); + result = data; + } catch (e) { + logError(e); + } + } + + if (result && result.logs) { + const logLength = result.logs.length; + result.logs.forEach((log, i) => { + logger.warn(log.message); + if (i < logLength - 1) { + logger.log(''); + } + }); + } +} + +export async function pollProjectBuildAndDeploy( + accountId: number, + projectConfig: ProjectConfig, + tempFile: FileResult, + buildId: number, + silenceLogs = false +): Promise { + let buildStatus = await pollBuildStatus( + accountId, + projectConfig.name, + buildId, + null, + silenceLogs + ); + + if (!silenceLogs) { + uiLine(); + } + + const result: ProjectPollResult = { + succeeded: true, + buildId, + buildResult: buildStatus, + deployResult: null, + }; + + if (buildStatus.status === 'FAILURE') { + result.succeeded = false; + return result; + } else if (buildStatus.isAutoDeployEnabled) { + if (!silenceLogs) { + logger.log( + i18n( + `${i18nKey}.pollProjectBuildAndDeploy.buildSucceededAutomaticallyDeploying`, + { + accountIdentifier: uiAccountDescription(accountId), + buildId, + } + ) + ); + + await displayWarnLogs(accountId, projectConfig.name, buildId); + } + + // autoDeployId of 0 indicates a skipped deploy + const getIsDeploying = () => + buildStatus.autoDeployId > 0 && buildStatus.deployStatusTaskLocator; + + // Sometimes the deploys do not immediately initiate, give them a chance to kick off + if (!getIsDeploying()) { + buildStatus = await pollBuildAutodeployStatus( + accountId, + projectConfig.name, + buildId + ); + } + + if (getIsDeploying()) { + const deployStatus = await pollDeployStatus( + accountId, + projectConfig.name, + Number(buildStatus.deployStatusTaskLocator.id), + buildId, + silenceLogs + ); + result.deployResult = deployStatus; + + if (deployStatus.status === 'FAILURE') { + result.succeeded = false; + } + } else if (!silenceLogs) { + logger.log( + i18n( + `${i18nKey}.pollProjectBuildAndDeploy.unableToFindAutodeployStatus`, + { + buildId, + viewDeploysLink: uiLink( + i18n(`${i18nKey}.pollProjectBuildAndDeploy.viewDeploys`), + getProjectActivityUrl(projectConfig.name, accountId) + ), + } + ) + ); + } + } + + try { + if (tempFile) { + tempFile.removeCallback(); + logger.debug( + i18n(`${i18nKey}.pollProjectBuildAndDeploy.cleanedUpTempFile`, { + path: tempFile.name, + }) + ); + } + } catch (e) { + logger.error(e); + } + + if (result && result.deployResult) { + await displayWarnLogs( + accountId, + projectConfig.name, + result.deployResult.deployId, + true + ); + } + return result; +} diff --git a/lib/projects/index.ts b/lib/projects/index.ts new file mode 100644 index 000000000..9a86d6b1e --- /dev/null +++ b/lib/projects/index.ts @@ -0,0 +1,372 @@ +import fs from 'fs-extra'; +import path from 'path'; +import findup from 'findup-sync'; +import { logger } from '@hubspot/local-dev-lib/logger'; +import { fetchFileFromRepository } from '@hubspot/local-dev-lib/github'; +import { + createProject, + fetchProject, +} from '@hubspot/local-dev-lib/api/projects'; +import { isSpecifiedError } from '@hubspot/local-dev-lib/errors/index'; +import { getCwd, getAbsoluteFilePath } from '@hubspot/local-dev-lib/path'; +import { downloadGithubRepoContents } from '@hubspot/local-dev-lib/github'; +import { RepoPath } from '@hubspot/local-dev-lib/types/Github'; +import { Project } from '@hubspot/local-dev-lib/types/Project'; +import { HubSpotPromise } from '@hubspot/local-dev-lib/types/Http'; + +import { + FEEDBACK_INTERVAL, + POLLING_DELAY, + PROJECT_CONFIG_FILE, + HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, + PROJECT_COMPONENT_TYPES, +} from '../constants'; +import { promptUser } from '../prompts/promptUtils'; +import { EXIT_CODES } from '../enums/exitCodes'; +import { uiLine, uiAccountDescription, uiCommandReference } from '../ui'; +import { i18n } from '../lang'; +import SpinniesManager from '../ui/SpinniesManager'; +import { + ProjectTemplate, + ProjectConfig, + ProjectAddComponentData, + ProjectTemplateRepoConfig, + ComponentTemplate, +} from '../../types/Projects'; +import { logError, ApiErrorContext } from '../errorHandlers/index'; + +const i18nKey = 'lib.projects'; + +export function writeProjectConfig( + configPath: string, + config: ProjectConfig +): boolean { + try { + fs.ensureFileSync(configPath); + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)); + logger.debug(`Wrote project config at ${configPath}`); + } catch (e) { + logger.debug(e); + return false; + } + return true; +} + +export function getIsInProject(dir?: string): boolean { + const configPath = getProjectConfigPath(dir); + return !!configPath; +} + +function getProjectConfigPath(dir?: string): string | null { + const projectDir = dir ? getAbsoluteFilePath(dir) : getCwd(); + + const configPath = findup(PROJECT_CONFIG_FILE, { + cwd: projectDir, + nocase: true, + }); + + return configPath; +} + +export async function getProjectConfig(dir?: string): Promise<{ + projectDir: string | null; + projectConfig: ProjectConfig | null; +}> { + const configPath = await getProjectConfigPath(dir); + if (!configPath) { + return { projectConfig: null, projectDir: null }; + } + + try { + const config = fs.readFileSync(configPath); + const projectConfig: ProjectConfig = JSON.parse(config.toString()); + return { + projectDir: path.dirname(configPath), + projectConfig, + }; + } catch (e) { + logger.error('Could not read from project config'); + return { projectConfig: null, projectDir: null }; + } +} + +export async function createProjectConfig( + projectPath: string, + projectName: string, + template: ProjectTemplate, + templateSource: RepoPath, + githubRef: string +): Promise { + const { projectConfig, projectDir } = await getProjectConfig(projectPath); + + if (projectConfig) { + logger.warn( + projectPath === projectDir + ? 'A project already exists in that location.' + : `Found an existing project definition in ${projectDir}.` + ); + + const { shouldContinue } = await promptUser<{ shouldContinue: boolean }>([ + { + name: 'shouldContinue', + message: () => { + return projectPath === projectDir + ? 'Do you want to overwrite the existing project definition with a new one?' + : `Continue creating a new project in ${projectPath}?`; + }, + type: 'confirm', + default: false, + }, + ]); + + if (!shouldContinue) { + return false; + } + } + + const projectConfigPath = path.join(projectPath, PROJECT_CONFIG_FILE); + + logger.log( + `Creating project config in ${ + projectPath ? projectPath : 'the current folder' + }` + ); + + const hasCustomTemplateSource = Boolean(templateSource); + + await downloadGithubRepoContents( + templateSource || HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, + template.path, + projectPath, + hasCustomTemplateSource ? undefined : githubRef + ); + const _config: ProjectConfig = JSON.parse( + fs.readFileSync(projectConfigPath).toString() + ); + writeProjectConfig(projectConfigPath, { + ..._config, + name: projectName, + }); + + if (template.name === 'no-template') { + fs.ensureDirSync(path.join(projectPath, 'src')); + } + + return true; +} + +export function validateProjectConfig( + projectConfig: ProjectConfig, + projectDir: string +): void { + if (!projectConfig) { + logger.error( + i18n(`${i18nKey}.validateProjectConfig.configNotFound`, { + createCommand: uiCommandReference('hs project create'), + }) + ); + return process.exit(EXIT_CODES.ERROR); + } + + if (!projectConfig.name || !projectConfig.srcDir) { + logger.error(i18n(`${i18nKey}.validateProjectConfig.configMissingFields`)); + return process.exit(EXIT_CODES.ERROR); + } + + const resolvedPath = path.resolve(projectDir, projectConfig.srcDir); + if (!resolvedPath.startsWith(projectDir)) { + const projectConfigFile = path.relative( + '.', + path.join(projectDir, PROJECT_CONFIG_FILE) + ); + logger.error( + i18n(`${i18nKey}.validateProjectConfig.srcOutsideProjectDir`, { + srcDir: projectConfig.srcDir, + projectConfig: projectConfigFile, + }) + ); + return process.exit(EXIT_CODES.ERROR); + } + + if (!fs.existsSync(resolvedPath)) { + logger.error( + i18n(`${i18nKey}.validateProjectConfig.srcDirNotFound`, { + srcDir: projectConfig.srcDir, + projectDir: projectDir, + }) + ); + + return process.exit(EXIT_CODES.ERROR); + } +} + +async function pollFetchProject( + accountId: number, + projectName: string +): HubSpotPromise { + // Temporary solution for gating slowness. Retry on 403 statusCode + return new Promise((resolve, reject) => { + let pollCount = 0; + SpinniesManager.init(); + SpinniesManager.add('pollFetchProject', { + text: i18n(`${i18nKey}.pollFetchProject.checkingProject`, { + accountIdentifier: uiAccountDescription(accountId), + }), + }); + const pollInterval = setInterval(async () => { + try { + const response = await fetchProject(accountId, projectName); + if (response && response.data) { + SpinniesManager.remove('pollFetchProject'); + clearInterval(pollInterval); + resolve(response); + } + } catch (err) { + if ( + isSpecifiedError(err, { + statusCode: 403, + category: 'GATED', + subCategory: 'BuildPipelineErrorType.PORTAL_GATED', + }) && + pollCount < 15 + ) { + pollCount += 1; + } else { + SpinniesManager.remove('pollFetchProject'); + clearInterval(pollInterval); + reject(err); + } + } + }, POLLING_DELAY); + }); +} + +export async function ensureProjectExists( + accountId: number, + projectName: string, + { + forceCreate = false, + allowCreate = true, + noLogs = false, + withPolling = false, + uploadCommand = false, + } = {} +): Promise<{ + projectExists: boolean; + project?: Project; +}> { + const accountIdentifier = uiAccountDescription(accountId); + try { + const { data: project } = withPolling + ? await pollFetchProject(accountId, projectName) + : await fetchProject(accountId, projectName); + return { projectExists: !!project, project }; + } catch (err) { + if (isSpecifiedError(err, { statusCode: 404 })) { + let shouldCreateProject = forceCreate; + if (allowCreate && !shouldCreateProject) { + const promptKey = uploadCommand ? 'createPromptUpload' : 'createPrompt'; + const promptResult = await promptUser<{ shouldCreateProject: boolean }>( + [ + { + name: 'shouldCreateProject', + message: i18n(`${i18nKey}.ensureProjectExists.${promptKey}`, { + projectName, + accountIdentifier, + }), + type: 'confirm', + }, + ] + ); + shouldCreateProject = promptResult.shouldCreateProject; + } + + if (shouldCreateProject) { + try { + const { data: project } = await createProject(accountId, projectName); + logger.success( + i18n(`${i18nKey}.ensureProjectExists.createSuccess`, { + projectName, + accountIdentifier, + }) + ); + return { projectExists: true, project }; + } catch (err) { + logError(err, new ApiErrorContext({ accountId })); + return { projectExists: false }; + } + } else { + if (!noLogs) { + logger.log( + i18n(`${i18nKey}.ensureProjectExists.notFound`, { + projectName, + accountIdentifier, + }) + ); + } + return { projectExists: false }; + } + } + if ( + isSpecifiedError(err, { + statusCode: 401, + }) + ) { + logger.error(err.message); + process.exit(EXIT_CODES.ERROR); + } + logError(err, new ApiErrorContext({ accountId })); + process.exit(EXIT_CODES.ERROR); + } +} + +export function logFeedbackMessage(buildId: number): void { + if (buildId > 0 && buildId % FEEDBACK_INTERVAL === 0) { + uiLine(); + logger.log(i18n(`${i18nKey}.logFeedbackMessage.feedbackHeader`)); + uiLine(); + logger.log(i18n(`${i18nKey}.logFeedbackMessage.feedbackMessage`)); + } +} + +export async function createProjectComponent( + component: ProjectAddComponentData, + name: string, + projectComponentsVersion: string +): Promise { + const i18nKey = 'commands.project.subcommands.add'; + const componentName = name; + + const configInfo = await getProjectConfig(); + + if (!configInfo.projectDir || !configInfo.projectConfig) { + logger.error(i18n(`${i18nKey}.error.locationInProject`)); + process.exit(EXIT_CODES.ERROR); + } + + const componentPath = path.join( + configInfo.projectDir, + configInfo.projectConfig.srcDir, + component.insertPath, + componentName + ); + + await downloadGithubRepoContents( + HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, + component.path, + componentPath, + projectComponentsVersion + ); +} + +export async function getProjectComponentsByVersion( + projectComponentsVersion: string +): Promise { + const config = await fetchFileFromRepository( + HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, + 'config.json', + projectComponentsVersion + ); + + return config[PROJECT_COMPONENT_TYPES.COMPONENTS] || []; +} diff --git a/lib/projects/structure.ts b/lib/projects/structure.ts new file mode 100644 index 000000000..a36b10480 --- /dev/null +++ b/lib/projects/structure.ts @@ -0,0 +1,217 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { ValueOf } from '@hubspot/local-dev-lib/types/Utils'; +import { walk } from '@hubspot/local-dev-lib/fs'; +import { logger } from '@hubspot/local-dev-lib/logger'; +import { logError } from '../errorHandlers/index'; + +export type Component = { + type: ComponentTypes; + config: object; + runnable: boolean; + path: string; +}; + +type PrivateAppComponentConfig = { + name: string; + description: string; + uid: string; + scopes: Array; + public: boolean; + extensions?: { + crm: { + cards: Array<{ file: string }>; + }; + }; +}; + +type PublicAppComponentConfig = { + name: string; + uid: string; + description: string; + allowedUrls: Array; + auth: { + redirectUrls: Array; + requiredScopes: Array; + optionalScopes: Array; + conditionallyRequiredScopes: Array; + }; + support: { + supportEmail: string; + documentationUrl: string; + supportUrl: string; + supportPhone: string; + }; + extensions?: { + crm: { + cards: Array<{ file: string }>; + }; + }; + webhooks?: { + file: string; + }; +}; + +type AppCardComponentConfig = { + type: 'crm-card'; + data: { + title: string; + uid: string; + location: string; + module: { + file: string; + }; + objectTypes: Array<{ name: string }>; + }; +}; + +type GenericComponentConfig = + | PublicAppComponentConfig + | PrivateAppComponentConfig + | AppCardComponentConfig; + +export const COMPONENT_TYPES = { + privateApp: 'private-app', + publicApp: 'public-app', + hublTheme: 'hubl-theme', +} as const; + +type ComponentTypes = ValueOf; + +export const CONFIG_FILES: { + [k in ValueOf]: string; +} = { + [COMPONENT_TYPES.privateApp]: 'app.json', + [COMPONENT_TYPES.publicApp]: 'public-app.json', + [COMPONENT_TYPES.hublTheme]: 'theme.json', +}; + +function getComponentTypeFromConfigFile( + configFile: string +): ComponentTypes | null { + let key: ComponentTypes; + for (key in CONFIG_FILES) { + if (CONFIG_FILES[key] === configFile) { + return key; + } + } + return null; +} + +function loadConfigFile(configPath: string): GenericComponentConfig | null { + if (configPath) { + try { + const source = fs.readFileSync(configPath); + const parsedConfig = JSON.parse(source.toString()); + return parsedConfig; + } catch (e) { + logger.debug(e); + } + } + return null; +} + +export function getAppCardConfigs( + appConfig: PublicAppComponentConfig | PrivateAppComponentConfig, + appPath: string +): Array { + const cardConfigs: Array = []; + let cards; + + if (appConfig && appConfig.extensions && appConfig.extensions.crm) { + cards = appConfig.extensions.crm.cards; + } + + if (cards) { + cards.forEach(({ file }: { file?: string }) => { + if (typeof file === 'string') { + const cardConfigPath = path.join(appPath, file); + const cardConfig = loadConfigFile(cardConfigPath); + + if (cardConfig && 'type' in cardConfig) { + cardConfigs.push(cardConfig); + } + } + }); + } + + return cardConfigs; +} + +function getIsLegacyApp( + appConfig: GenericComponentConfig, + appPath: string +): boolean { + let hasAnyReactExtensions = false; + + if (appConfig && 'extensions' in appConfig) { + const cardConfigs = getAppCardConfigs(appConfig, appPath); + + if (!cardConfigs.length) { + // Assume any app that does not have any cards is not legacy + return false; + } + + cardConfigs.forEach(cardConfig => { + if (!hasAnyReactExtensions) { + const isReactExtension = + cardConfig && + !!cardConfig.data && + !!cardConfig.data.module && + !!cardConfig.data.module.file; + + hasAnyReactExtensions = isReactExtension; + } + }); + } + + return !hasAnyReactExtensions; +} + +export async function findProjectComponents( + projectSourceDir: string +): Promise> { + const components: Array = []; + let projectFiles: Array = []; + + try { + projectFiles = await walk(projectSourceDir); + } catch (e) { + logError(e); + } + + projectFiles.forEach(projectFile => { + // Find app components + const { base, dir } = path.parse(projectFile); + + if (Object.values(CONFIG_FILES).includes(base)) { + const parsedConfig = loadConfigFile(projectFile); + + if (parsedConfig) { + const isLegacy = getIsLegacyApp(parsedConfig, dir); + const isHublTheme = base === CONFIG_FILES[COMPONENT_TYPES.hublTheme]; + const componentType = getComponentTypeFromConfigFile(base); + + if (componentType) { + components.push({ + type: componentType, + config: parsedConfig, + runnable: !isLegacy && !isHublTheme, + path: dir, + }); + } + } + } + }); + + return components; +} + +export function getProjectComponentTypes(components: Array): { + [key in ComponentTypes]?: boolean; +} { + const projectContents: { [key in ComponentTypes]?: boolean } = {}; + + components.forEach(({ type }) => (projectContents[type] = true)); + return projectContents; +} diff --git a/lib/projects/upload.ts b/lib/projects/upload.ts new file mode 100644 index 000000000..98068259d --- /dev/null +++ b/lib/projects/upload.ts @@ -0,0 +1,179 @@ +import archiver from 'archiver'; +import tmp, { FileResult } from 'tmp'; +import fs from 'fs-extra'; +import path from 'path'; +import { uploadProject } from '@hubspot/local-dev-lib/api/projects'; +import { shouldIgnoreFile } from '@hubspot/local-dev-lib/ignoreRules'; +import { logger } from '@hubspot/local-dev-lib/logger'; + +import SpinniesManager from '../ui/SpinniesManager'; +import { uiAccountDescription } from '../ui'; +import { i18n } from '../lang'; +import { EXIT_CODES } from '../enums/exitCodes'; +import { ProjectConfig } from '../../types/Projects'; + +const i18nKey = 'lib.projectUpload'; + +async function uploadProjectFiles( + accountId: number, + projectName: string, + filePath: string, + uploadMessage: string, + platformVersion: string +): Promise<{ buildId?: number; error: unknown }> { + SpinniesManager.init({}); + const accountIdentifier = uiAccountDescription(accountId); + + SpinniesManager.add('upload', { + text: i18n(`${i18nKey}.uploadProjectFiles.add`, { + accountIdentifier, + projectName, + }), + succeedColor: 'white', + }); + + let buildId: number | undefined; + let error: unknown; + + try { + const { data: upload } = await uploadProject( + accountId, + projectName, + filePath, + uploadMessage, + platformVersion + ); + + buildId = upload.buildId; + + SpinniesManager.succeed('upload', { + text: i18n(`${i18nKey}.uploadProjectFiles.succeed`, { + accountIdentifier, + projectName, + }), + }); + + if (buildId) { + logger.debug( + i18n(`${i18nKey}.uploadProjectFiles.buildCreated`, { + buildId, + projectName, + }) + ); + } + } catch (err) { + SpinniesManager.fail('upload', { + text: i18n(`${i18nKey}.uploadProjectFiles.fail`, { + accountIdentifier, + projectName, + }), + }); + + error = err; + } + + return { buildId, error }; +} + +type ProjectUploadCallbackFunction = ( + accountId: number, + projectConfig: ProjectConfig, + tempFile: FileResult, + buildId?: number +) => Promise; + +type ProjectUploadDefaultResult = { + uploadError?: unknown; +}; + +export async function handleProjectUpload( + accountId: number, + projectConfig: ProjectConfig, + projectDir: string, + callbackFunc: ProjectUploadCallbackFunction, + uploadMessage: string +) { + const srcDir = path.resolve(projectDir, projectConfig.srcDir); + + const filenames = fs.readdirSync(srcDir); + if (!filenames || filenames.length === 0) { + logger.log( + i18n(`${i18nKey}.handleProjectUpload.emptySource`, { + srcDir: projectConfig.srcDir, + }) + ); + process.exit(EXIT_CODES.SUCCESS); + } + + const tempFile = tmp.fileSync({ postfix: '.zip' }); + + logger.debug( + i18n(`${i18nKey}.handleProjectUpload.compressing`, { + path: tempFile.name, + }) + ); + + const output = fs.createWriteStream(tempFile.name); + const archive = archiver('zip'); + + const result = new Promise(resolve => + output.on('close', async function () { + let uploadResult: ProjectUploadDefaultResult | T | undefined; + + logger.debug( + i18n(`${i18nKey}.handleProjectUpload.compressed`, { + byteCount: archive.pointer(), + }) + ); + + const { buildId, error } = await uploadProjectFiles( + accountId, + projectConfig.name, + tempFile.name, + uploadMessage, + projectConfig.platformVersion + ); + + if (error) { + console.log(error); + uploadResult = { uploadError: error }; + } else if (callbackFunc) { + uploadResult = await callbackFunc( + accountId, + projectConfig, + tempFile, + buildId + ); + } + resolve(uploadResult || {}); + }) + ); + + archive.pipe(output); + + let loggedIgnoredNodeModule = false; + + archive.directory(srcDir, false, file => { + const ignored = shouldIgnoreFile(file.name, true); + if (ignored) { + const isNodeModule = file.name.includes('node_modules'); + + if (!isNodeModule || !loggedIgnoredNodeModule) { + logger.debug( + i18n(`${i18nKey}.handleProjectUpload.fileFiltered`, { + filename: file.name, + }) + ); + } + + if (isNodeModule && !loggedIgnoredNodeModule) { + loggedIgnoredNodeModule = true; + } + } + return ignored ? false : file; + }); + + archive.finalize(); + + return result; +} diff --git a/lib/projects/urls.ts b/lib/projects/urls.ts new file mode 100644 index 000000000..55e33bd42 --- /dev/null +++ b/lib/projects/urls.ts @@ -0,0 +1,42 @@ +import { getHubSpotWebsiteOrigin } from '@hubspot/local-dev-lib/urls'; +import { getEnv } from '@hubspot/local-dev-lib/config'; +import { ENVIRONMENTS } from '@hubspot/local-dev-lib/constants/environments'; + +function getProjectHomeUrl(accountId: number): string { + const baseUrl = getHubSpotWebsiteOrigin( + getEnv(accountId) === 'qa' ? ENVIRONMENTS.QA : ENVIRONMENTS.PROD + ); + + return `${baseUrl}/developer-projects/${accountId}`; +} + +export function getProjectDetailUrl( + projectName: string, + accountId: number +): string | undefined { + if (!projectName) return; + return `${getProjectHomeUrl(accountId)}/project/${projectName}`; +} + +export function getProjectActivityUrl( + projectName: string, + accountId: number +): string { + return `${getProjectDetailUrl(projectName, accountId)}/activity`; +} + +export function getProjectBuildDetailUrl( + projectName: string, + buildId: number, + accountId: number +): string { + return `${getProjectActivityUrl(projectName, accountId)}/build/${buildId}`; +} + +export function getProjectDeployDetailUrl( + projectName: string, + deployId: number, + accountId: number +): string { + return `${getProjectActivityUrl(projectName, accountId)}/deploy/${deployId}`; +} diff --git a/lib/projectsWatch.ts b/lib/projects/watch.ts similarity index 97% rename from lib/projectsWatch.ts rename to lib/projects/watch.ts index 95ea171b1..a67104526 100644 --- a/lib/projectsWatch.ts +++ b/lib/projects/watch.ts @@ -3,8 +3,8 @@ const chokidar = require('chokidar'); const path = require('path'); const chalk = require('chalk'); const { default: PQueue } = require('p-queue'); -const { logError, ApiErrorContext } = require('./errorHandlers/index'); -const { i18n } = require('./lang'); +const { logError, ApiErrorContext } = require('../errorHandlers/index'); +const { i18n } = require('../lang'); const { logger } = require('@hubspot/local-dev-lib/logger'); const { isAllowedExtension } = require('@hubspot/local-dev-lib/path'); const { shouldIgnoreFile } = require('@hubspot/local-dev-lib/ignoreRules'); @@ -16,7 +16,7 @@ const { queueBuild, } = require('@hubspot/local-dev-lib/api/projects'); const { isSpecifiedError } = require('@hubspot/local-dev-lib/errors/index'); -const { PROJECT_ERROR_TYPES } = require('./constants'); +const { PROJECT_ERROR_TYPES } = require('../constants'); const i18nKey = 'commands.project.subcommands.watch'; diff --git a/lib/prompts/accountNamePrompt.ts b/lib/prompts/accountNamePrompt.ts index 4efaf6c59..4ca2bf86b 100644 --- a/lib/prompts/accountNamePrompt.ts +++ b/lib/prompts/accountNamePrompt.ts @@ -1,7 +1,7 @@ import { accountNameExistsInConfig } from '@hubspot/local-dev-lib/config'; import { promptUser } from './promptUtils'; import { i18n } from '../lang'; -import { PromptConfig } from '../../types/prompts'; +import { PromptConfig } from '../../types/Prompts'; import { HUBSPOT_ACCOUNT_TYPES } from '@hubspot/local-dev-lib/constants/config'; import { AccountType } from '@hubspot/local-dev-lib/types/Accounts'; diff --git a/lib/prompts/accountsPrompt.ts b/lib/prompts/accountsPrompt.ts index 58f4c8e26..bee5ce10a 100644 --- a/lib/prompts/accountsPrompt.ts +++ b/lib/prompts/accountsPrompt.ts @@ -7,7 +7,7 @@ import { promptUser } from './promptUtils'; import { i18n } from '../lang'; import { uiAccountDescription } from '../ui'; import { CLIAccount } from '@hubspot/local-dev-lib/types/Accounts'; -import { PromptChoices } from '../../types/prompts'; +import { PromptChoices } from '../../types/Prompts'; function mapAccountChoices( portals: CLIAccount[] | null | undefined diff --git a/lib/prompts/createApiSamplePrompt.ts b/lib/prompts/createApiSamplePrompt.ts index d9ab223ba..c8d78b6ef 100644 --- a/lib/prompts/createApiSamplePrompt.ts +++ b/lib/prompts/createApiSamplePrompt.ts @@ -1,6 +1,6 @@ import { promptUser } from './promptUtils'; import { i18n } from '../lang'; -import { PromptConfig } from '../../types/prompts'; +import { PromptConfig } from '../../types/Prompts'; const i18nKey = 'lib.prompts.createApiSamplePrompt'; @@ -37,8 +37,8 @@ function getSampleTypesPrompt( name: `${choice.name} - ${choice.description}`, value: choice.id, })), - validate: function(input?: string) { - return new Promise(function(resolve, reject) { + validate: function (input?: string) { + return new Promise(function (resolve, reject) { if (input && input.length > 0) { resolve(true); } else { @@ -60,8 +60,8 @@ function getLanguagesPrompt( name: choice, value: choice, })), - validate: function(input: string | undefined) { - return new Promise(function(resolve, reject) { + validate: function (input: string | undefined) { + return new Promise(function (resolve, reject) { if (input && input.length > 0) { resolve(true); } diff --git a/lib/prompts/createFunctionPrompt.ts b/lib/prompts/createFunctionPrompt.ts index 197fdf8ba..0ec6f1f46 100644 --- a/lib/prompts/createFunctionPrompt.ts +++ b/lib/prompts/createFunctionPrompt.ts @@ -1,6 +1,6 @@ import { promptUser } from './promptUtils'; import { i18n } from '../lang'; -import { PromptConfig } from '../../types/prompts'; +import { PromptConfig } from '../../types/Prompts'; const i18nKey = 'lib.prompts.createFunctionPrompt'; diff --git a/lib/prompts/createModulePrompt.ts b/lib/prompts/createModulePrompt.ts index c7b90d1ee..bd4e1cf3d 100644 --- a/lib/prompts/createModulePrompt.ts +++ b/lib/prompts/createModulePrompt.ts @@ -1,4 +1,4 @@ -import { PromptConfig } from '../../types/prompts'; +import { PromptConfig } from '../../types/Prompts'; import { promptUser } from './promptUtils'; import { i18n } from '../lang'; @@ -53,7 +53,7 @@ const CONTENT_TYPES_PROMPT: PromptConfig = { { name: 'Membership', value: 'MEMBERSHIP' }, ], validate: (input: string[]) => { - return new Promise(function(resolve, reject) { + return new Promise(function (resolve, reject) { if (input.length > 0) { resolve(true); } diff --git a/lib/prompts/createProjectPrompt.ts b/lib/prompts/createProjectPrompt.ts index cb279d92d..dfae0cad5 100644 --- a/lib/prompts/createProjectPrompt.ts +++ b/lib/prompts/createProjectPrompt.ts @@ -6,42 +6,36 @@ import { isValidPath, untildify, } from '@hubspot/local-dev-lib/path'; +import { RepoPath } from '@hubspot/local-dev-lib/types/Github'; +import { fetchFileFromRepository } from '@hubspot/local-dev-lib/github'; +import { logger } from '@hubspot/local-dev-lib/logger'; + import { PROJECT_COMPONENT_TYPES, HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, DEFAULT_PROJECT_TEMPLATE_BRANCH, } from '../constants'; import { promptUser } from './promptUtils'; -import { fetchFileFromRepository } from '@hubspot/local-dev-lib/github'; import { i18n } from '../lang'; -import { logger } from '@hubspot/local-dev-lib/logger'; import { EXIT_CODES } from '../enums/exitCodes'; -import { RepoPath } from '@hubspot/local-dev-lib/types/Github'; +import { + ProjectTemplate, + ProjectTemplateRepoConfig, +} from '../../types/Projects'; const i18nKey = 'lib.prompts.createProjectPrompt'; -const PROJECT_PROPERTIES = ['name', 'label', 'path', 'insertPath']; - -type ProjectsConfig = { - projects?: ProjectProperties[]; -}; - -type ProjectProperties = { - name: string; - label: string; - path: string; - insertPath: string; -}; +const PROJECT_TEMPLATE_PROPERTIES = ['name', 'label', 'path', 'insertPath']; type CreateProjectPromptResponse = { name: string; dest: string; - template: ProjectProperties; + template: ProjectTemplate; }; -function hasAllProperties(projectList: ProjectProperties[]): boolean { +function hasAllProperties(projectList: ProjectTemplate[]): boolean { return projectList.every(config => - PROJECT_PROPERTIES.every(p => + PROJECT_TEMPLATE_PROPERTIES.every(p => Object.prototype.hasOwnProperty.call(config, p) ) ); @@ -50,13 +44,13 @@ function hasAllProperties(projectList: ProjectProperties[]): boolean { async function createTemplateOptions( templateSource: RepoPath, githubRef: string -): Promise { +): Promise { const hasCustomTemplateSource = Boolean(templateSource); const branch = hasCustomTemplateSource ? DEFAULT_PROJECT_TEMPLATE_BRANCH : githubRef; - const config: ProjectsConfig = await fetchFileFromRepository( + const config = await fetchFileFromRepository( templateSource || HUBSPOT_PROJECT_COMPONENTS_GITHUB_PATH, 'config.json', branch @@ -76,9 +70,9 @@ async function createTemplateOptions( } function findTemplate( - projectTemplates: ProjectProperties[], + projectTemplates: ProjectTemplate[], templateNameOrLabel: string -): ProjectProperties | undefined { +): ProjectTemplate | undefined { return projectTemplates.find( t => t.name === templateNameOrLabel || t.label === templateNameOrLabel ); @@ -94,7 +88,7 @@ export async function createProjectPrompt( }, skipTemplatePrompt = false ): Promise { - let projectTemplates: ProjectProperties[] = []; + let projectTemplates: ProjectTemplate[] = []; let selectedTemplate; if (!skipTemplatePrompt) { diff --git a/lib/prompts/createTemplatePrompt.ts b/lib/prompts/createTemplatePrompt.ts index ecfae6da1..7aa0b1a41 100644 --- a/lib/prompts/createTemplatePrompt.ts +++ b/lib/prompts/createTemplatePrompt.ts @@ -1,6 +1,6 @@ import { promptUser } from './promptUtils'; import { i18n } from '../lang'; -import { PromptChoices, PromptConfig } from '../../types/prompts'; +import { PromptChoices, PromptConfig } from '../../types/Prompts'; const i18nKey = 'lib.prompts.createTemplatePrompt'; @@ -15,7 +15,7 @@ const templateTypeChoices = [ ] satisfies PromptChoices; interface CreateTemplatePromptResponse { - templateType: typeof templateTypeChoices[number]['value']; + templateType: (typeof templateTypeChoices)[number]['value']; } const TEMPLATE_TYPE_PROMPT: PromptConfig = { diff --git a/lib/prompts/personalAccessKeyPrompt.ts b/lib/prompts/personalAccessKeyPrompt.ts index 7762868ef..dd15dc6ef 100644 --- a/lib/prompts/personalAccessKeyPrompt.ts +++ b/lib/prompts/personalAccessKeyPrompt.ts @@ -11,7 +11,7 @@ import { getCliAccountNamePromptConfig } from './accountNamePrompt'; import { i18n } from '../lang'; import { uiInfoSection } from '../ui'; import { EXIT_CODES } from '../enums/exitCodes'; -import { PromptConfig } from '../../types/prompts'; +import { PromptConfig } from '../../types/Prompts'; const i18nKey = 'lib.prompts.personalAccessKeyPrompt'; @@ -60,9 +60,10 @@ export async function personalAccessKeyPrompt({ if (account) { url = `${websiteOrigin}/personal-access-key/${account}`; } - const { personalAcessKeyBrowserOpenPrep: shouldOpen } = await promptUser< - PersonalAccessKeyBrowserOpenPrepResponse - >([PERSONAL_ACCESS_KEY_BROWSER_OPEN_PREP]); + const { personalAcessKeyBrowserOpenPrep: shouldOpen } = + await promptUser([ + PERSONAL_ACCESS_KEY_BROWSER_OPEN_PREP, + ]); if (shouldOpen) { open(url, { url: true }); } else { @@ -72,9 +73,8 @@ export async function personalAccessKeyPrompt({ } logger.log(i18n(`${i18nKey}.logs.openingWebBrowser`, { url })); - const { personalAccessKey } = await promptUser< - PersonalAccessKeyPromptResponse - >(PERSONAL_ACCESS_KEY); + const { personalAccessKey } = + await promptUser(PERSONAL_ACCESS_KEY); return { personalAccessKey, @@ -122,11 +122,12 @@ const CLIENT_SECRET: PromptConfig = { }, }; -const PERSONAL_ACCESS_KEY_BROWSER_OPEN_PREP: PromptConfig = { - name: 'personalAcessKeyBrowserOpenPrep', - type: 'confirm', - message: i18n(`${i18nKey}.personalAccessKeyBrowserOpenPrompt`), -}; +const PERSONAL_ACCESS_KEY_BROWSER_OPEN_PREP: PromptConfig = + { + name: 'personalAcessKeyBrowserOpenPrep', + type: 'confirm', + message: i18n(`${i18nKey}.personalAccessKeyBrowserOpenPrompt`), + }; const PERSONAL_ACCESS_KEY: PromptConfig = { name: 'personalAccessKey', diff --git a/lib/prompts/projectAddPrompt.ts b/lib/prompts/projectAddPrompt.ts index 1d682bc3f..77def953a 100644 --- a/lib/prompts/projectAddPrompt.ts +++ b/lib/prompts/projectAddPrompt.ts @@ -1,21 +1,16 @@ import { promptUser } from './promptUtils'; +import { ProjectAddComponentData } from '../../types/Projects'; import { i18n } from '../lang'; const i18nKey = 'lib.prompts.projectAddPrompt'; -type Component = { - path: string; - label: string; - insertPath: string; -}; - type ProjectAddPromptResponse = { - component: Component; + component: ProjectAddComponentData; name: string; }; export async function projectAddPrompt( - components: Component[], + components: ProjectAddComponentData[], promptOptions: { name?: string; type?: string } = {} ): Promise { return promptUser([ diff --git a/lib/prompts/projectDevTargetAccountPrompt.ts b/lib/prompts/projectDevTargetAccountPrompt.ts index ad56fdf58..8be678aa2 100644 --- a/lib/prompts/projectDevTargetAccountPrompt.ts +++ b/lib/prompts/projectDevTargetAccountPrompt.ts @@ -17,14 +17,12 @@ import { DeveloperTestAccount, FetchDeveloperTestAccountsResponse, } from '@hubspot/local-dev-lib/types/developerTestAccounts'; -import { PromptChoices } from '../../types/prompts'; +import { PromptChoices } from '../../types/Prompts'; import { EXIT_CODES } from '../enums/exitCodes'; const i18nKey = 'lib.prompts.projectDevTargetAccountPrompt'; -function mapNestedAccount( - accountConfig: CLIAccount -): { +function mapNestedAccount(accountConfig: CLIAccount): { name: string; value: { targetAccountId: number | null; diff --git a/lib/prompts/promptUtils.ts b/lib/prompts/promptUtils.ts index 8f8abec7b..c1b1d10c8 100644 --- a/lib/prompts/promptUtils.ts +++ b/lib/prompts/promptUtils.ts @@ -8,7 +8,7 @@ import { GenericPromptResponse, PromptWhen, PromptChoices, -} from '../../types/prompts'; +} from '../../types/Prompts'; const promptModule = inquirer.createPromptModule(); diff --git a/lib/prompts/sandboxesPrompt.ts b/lib/prompts/sandboxesPrompt.ts index 1046875a8..5a8b4e983 100644 --- a/lib/prompts/sandboxesPrompt.ts +++ b/lib/prompts/sandboxesPrompt.ts @@ -9,7 +9,7 @@ import { getConfigAccounts, } from '@hubspot/local-dev-lib/config'; import { CLIAccount } from '@hubspot/local-dev-lib/types/Accounts'; -import { PromptChoices } from '../../types/prompts'; +import { PromptChoices } from '../../types/Prompts'; const i18nKey = 'lib.prompts.sandboxesPrompt'; diff --git a/package.json b/package.json index d9c4db28b..80a88f4f1 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "license": "Apache-2.0", "repository": "https://github.com/HubSpot/hubspot-cli", "dependencies": { - "@hubspot/local-dev-lib": "3.0.1", + "@hubspot/local-dev-lib": "3.1.0", "@hubspot/serverless-dev-runtime": "7.0.0", "@hubspot/theme-preview-dev-server": "0.0.10", "@hubspot/ui-extensions-dev-server": "0.8.33", @@ -30,10 +30,14 @@ "yargs-parser": "^21.1.1" }, "devDependencies": { + "@types/archiver": "^6.0.3", + "@types/express": "^5.0.0", + "@types/findup-sync": "^4.0.5", "@types/fs-extra": "^11.0.4", "@types/jest": "^29.5.14", "@types/js-yaml": "^4.0.9", "@types/semver": "^7.5.8", + "@types/tmp": "^0.2.6", "@types/yargs": "^17.0.33", "@typescript-eslint/eslint-plugin": "^8.11.0", "@typescript-eslint/parser": "^8.11.0", diff --git a/types/Projects.ts b/types/Projects.ts new file mode 100644 index 000000000..e6010faeb --- /dev/null +++ b/types/Projects.ts @@ -0,0 +1,51 @@ +import { Build, SubbuildStatus } from '@hubspot/local-dev-lib/types/Build'; +import { Deploy, SubdeployStatus } from '@hubspot/local-dev-lib/types/Deploy'; + +export type ProjectTemplate = { + name: string; + label: string; + path: string; + insertPath: string; +}; + +export type ComponentTemplate = { + label: string; + path: string; + insertPath: string; +}; + +export type ProjectConfig = { + name: string; + srcDir: string; + platformVersion: string; +}; + +export type ProjectTaskStates = { + BUILDING?: string; + ENQUEUED?: string; + DEPLOYING?: string; + FAILURE: string; + PENDING: string; + SUCCESS: string; +}; + +export type ProjectTask = Build | Deploy; +export type ProjectSubtask = SubbuildStatus | SubdeployStatus; + +export type ProjectPollStatusFunctionText = { + STATES: ProjectTaskStates; + STATUS_TEXT: string; + TYPE_KEY: string; + SUBTASK_NAME_KEY: string; +}; + +export type ProjectAddComponentData = { + path: string; + label: string; + insertPath: string; +}; + +export type ProjectTemplateRepoConfig = { + projects?: ProjectTemplate[]; + components?: ComponentTemplate[]; +}; diff --git a/types/prompts.ts b/types/Prompts.ts similarity index 100% rename from types/prompts.ts rename to types/Prompts.ts diff --git a/yarn.lock b/yarn.lock index 52879ffe0..1a8ff8a26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,7 +17,7 @@ dependencies: default-browser-id "3.0.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": version "7.26.2" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== @@ -27,11 +27,11 @@ picocolors "^1.0.0" "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.9", "@babel/compat-data@^7.26.0": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.2.tgz#278b6b13664557de95b8f35b90d96785850bb56e" - integrity sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.3.tgz#99488264a56b2aded63983abd6a417f03b92ed02" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.12", "@babel/core@^7.22.9", "@babel/core@^7.23.9", "@babel/core@^7.25.2", "@babel/core@^7.7.5": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.12", "@babel/core@^7.22.9", "@babel/core@^7.23.9", "@babel/core@^7.26.0", "@babel/core@^7.7.5": version "7.26.0" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== @@ -52,13 +52,13 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/generator@^7.12.11", "@babel/generator@^7.22.9", "@babel/generator@^7.25.9", "@babel/generator@^7.26.0", "@babel/generator@^7.7.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.2.tgz#87b75813bec87916210e5e01939a4c823d6bb74f" - integrity sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw== +"@babel/generator@^7.12.11", "@babel/generator@^7.22.9", "@babel/generator@^7.26.0", "@babel/generator@^7.26.3", "@babel/generator@^7.7.2": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== dependencies: - "@babel/parser" "^7.26.2" - "@babel/types" "^7.26.0" + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" "@jridgewell/gen-mapping" "^0.3.5" "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" @@ -70,14 +70,6 @@ dependencies: "@babel/types" "^7.25.9" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz#f41752fe772a578e67286e6779a68a5a92de1ee9" - integrity sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz#55af025ce365be3cdc0c1c1e56c6af617ce88875" @@ -103,12 +95,12 @@ semver "^6.3.1" "@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz#3e8999db94728ad2b2458d7a470e7770b7764e26" - integrity sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz#5169756ecbe1d95f7866b90bb555b022595302a0" + integrity sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" - regexpu-core "^6.1.1" + regexpu-core "^6.2.0" semver "^6.3.1" "@babel/helper-define-polyfill-provider@^0.6.2", "@babel/helper-define-polyfill-provider@^0.6.3": @@ -177,14 +169,6 @@ "@babel/helper-optimise-call-expression" "^7.25.9" "@babel/traverse" "^7.25.9" -"@babel/helper-simple-access@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz#6d51783299884a2c74618d6ef0f86820ec2e7739" - integrity sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" @@ -225,12 +209,12 @@ "@babel/template" "^7.25.9" "@babel/types" "^7.26.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.2.tgz#fd7b6f487cfea09889557ef5d4eeb9ff9a5abd11" - integrity sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.4", "@babel/parser@^7.25.3", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== dependencies: - "@babel/types" "^7.26.0" + "@babel/types" "^7.26.3" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": version "7.25.9" @@ -555,11 +539,10 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-exponentiation-operator@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz#ece47b70d236c1d99c263a1e22b62dc20a4c8b0f" - integrity sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-export-namespace-from@^7.25.9": @@ -631,13 +614,12 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz#d165c8c569a080baf5467bda88df6425fc060686" - integrity sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== dependencies: - "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" "@babel/helper-plugin-utils" "^7.25.9" - "@babel/helper-simple-access" "^7.25.9" "@babel/plugin-transform-modules-systemjs@^7.25.9": version "7.25.9" @@ -749,14 +731,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-self@^7.18.6", "@babel/plugin-transform-react-jsx-self@^7.24.7": +"@babel/plugin-transform-react-jsx-self@^7.18.6", "@babel/plugin-transform-react-jsx-self@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz#c0b6cae9c1b73967f7f9eb2fca9536ba2fad2858" integrity sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg== dependencies: "@babel/helper-plugin-utils" "^7.25.9" -"@babel/plugin-transform-react-jsx-source@^7.19.6", "@babel/plugin-transform-react-jsx-source@^7.24.7": +"@babel/plugin-transform-react-jsx-source@^7.19.6", "@babel/plugin-transform-react-jsx-source@^7.25.9": version "7.25.9" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz#4c6b8daa520b5f155b5fb55547d7c9fa91417503" integrity sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg== @@ -823,9 +805,9 @@ "@babel/helper-plugin-utils" "^7.25.9" "@babel/plugin-transform-typescript@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz#69267905c2b33c2ac6d8fe765e9dc2ddc9df3849" - integrity sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ== + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz#3d6add9c78735623317387ee26d5ada540eee3fd" + integrity sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA== dependencies: "@babel/helper-annotate-as-pure" "^7.25.9" "@babel/helper-create-class-features-plugin" "^7.25.9" @@ -996,22 +978,22 @@ "@babel/types" "^7.25.9" "@babel/traverse@^7.1.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.25.3", "@babel/traverse@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.9.tgz#a50f8fe49e7f69f53de5bea7e413cd35c5e13c84" - integrity sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw== + version "7.26.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/generator" "^7.25.9" - "@babel/parser" "^7.25.9" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" "@babel/template" "^7.25.9" - "@babel/types" "^7.25.9" + "@babel/types" "^7.26.3" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.25.2", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.0.tgz#deabd08d6b753bc8e0f198f8709fb575e31774ff" - integrity sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA== +"@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.25.2", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== dependencies: "@babel/helper-string-parser" "^7.25.9" "@babel/helper-validator-identifier" "^7.25.9" @@ -1052,9 +1034,9 @@ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== "@emotion/use-insertion-effect-with-fallbacks@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz#1a818a0b2c481efba0cf34e5ab1e0cb2dcb9dfaf" - integrity sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" + integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== "@esbuild/aix-ppc64@0.21.5": version "0.21.5" @@ -1377,28 +1359,29 @@ express "^4.18.2" uuid "^9.0.1" -"@hubspot/cms-components@^0.18.10": - version "0.18.10" - resolved "https://registry.yarnpkg.com/@hubspot/cms-components/-/cms-components-0.18.10.tgz#3d74218e35e4887d05bb79063f6fbf7b1118a553" - integrity sha512-Qm8ypryApK7raqjPiq9305XQGcz7JhxYe6GTlYtgZ5JgXWK8rTs9lupYQ4d0M55+H1puSX81cPQ6XwZyi2ADNQ== +"@hubspot/cms-components@^0.18.11": + version "0.18.11" + resolved "https://registry.yarnpkg.com/@hubspot/cms-components/-/cms-components-0.18.11.tgz#5ad3992c228edcbdae56ecfd4850a73e2833e0b1" + integrity sha512-AeRBuFwFhyiz3TVoPxEOsZliohG6JwJa2tW7UInNxGvzQXwejiCYoyS1iq5+gaHUyMZcZRIxzRHrYTf5NY5QsA== dependencies: dot-prop "^8.0.2" react "18.3.1" react-dom "18.3.1" "@hubspot/cms-dev-server@^0.18.10": - version "0.18.10" - resolved "https://registry.yarnpkg.com/@hubspot/cms-dev-server/-/cms-dev-server-0.18.10.tgz#db7737ea03aea035e6b3f4c12e061da33d850475" - integrity sha512-khuA4tocob2P77zW/AZ9k2RxFdfj0Oju7HtbGM7TGdw4o0gddF25bXHYD+IG+p0CgZdr7Vv0KvouVNrkPwyM1g== + version "0.18.11" + resolved "https://registry.yarnpkg.com/@hubspot/cms-dev-server/-/cms-dev-server-0.18.11.tgz#d58c077286338b8a47ee2ff573bc51e54b1ac2e3" + integrity sha512-8VA8Z4g/Idj7fzFIEEe9BaVViyHjnw+Hw6BFDfArs1oh0VVnYuCL9Cgwa+zgSZ4qbMdCtwxlG7I1Gx0wumlTsQ== dependencies: "@babel/code-frame" "^7.24.7" "@babel/parser" "^7.25.3" "@babel/traverse" "^7.25.3" "@babel/types" "^7.25.2" - "@hubspot/cms-components" "^0.18.10" + "@hubspot/cms-components" "^0.18.11" "@hubspot/local-dev-lib" "2.0.1" "@inquirer/select" "^2.0.0" "@originjs/vite-plugin-commonjs" "^1.0.3" + "@radix-ui/react-dialog" "^1.1.2" "@radix-ui/react-separator" "^1.1.0" "@radix-ui/react-slot" "^1.1.0" "@radix-ui/react-tooltip" "^1.1.4" @@ -1463,10 +1446,10 @@ semver "^6.3.0" unixify "^1.0.0" -"@hubspot/local-dev-lib@3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@hubspot/local-dev-lib/-/local-dev-lib-3.0.1.tgz#1dd22f439d6e262353f14915a354115bbc1f5f76" - integrity sha512-h1jOmZJNdHZFbrOA5Gn815YCsix8eY81A4dkrUuDZI4MzVaJH3o4RoRalMl+Hr2e35nDrbrbcIR1RMQADPSmwg== +"@hubspot/local-dev-lib@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@hubspot/local-dev-lib/-/local-dev-lib-3.1.0.tgz#76b5d524aa694aad2bfc6e199ee1dac314f15774" + integrity sha512-iop3PgZ0ZWejCH6PmSeYnnGwV8vGIuA4F+w7SxukdX3QfhivlczClATWPaZanv1CYJHdflqoItq1kdF8ASJJmA== dependencies: address "^2.0.1" axios "^1.3.5" @@ -1825,9 +1808,9 @@ react-docgen-typescript "^2.2.2" "@jridgewell/gen-mapping@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" - integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== dependencies: "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" @@ -2035,44 +2018,73 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.28.tgz#d45e01c4a56f143ee69c54dd6b12eade9e270a73" integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== -"@radix-ui/primitive@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.0.tgz#42ef83b3b56dccad5d703ae8c42919a68798bbe2" - integrity sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA== +"@radix-ui/primitive@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/primitive/-/primitive-1.1.1.tgz#fc169732d755c7fbad33ba8d0cd7fd10c90dc8e3" + integrity sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA== -"@radix-ui/react-arrow@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz#744f388182d360b86285217e43b6c63633f39e7a" - integrity sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw== +"@radix-ui/react-arrow@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-arrow/-/react-arrow-1.1.1.tgz#2103721933a8bfc6e53bbfbdc1aaad5fc8ba0dd7" + integrity sha512-NaVpZfmv8SKeZbn4ijN2V3jlHA9ngBG16VnIIm22nUR0Yk8KUALyBxT3KYEUnNuch9sTE8UTsS3whzBgKOL30w== dependencies: - "@radix-ui/react-primitive" "2.0.0" - -"@radix-ui/react-compose-refs@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz#656432461fc8283d7b591dcf0d79152fae9ecc74" - integrity sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw== + "@radix-ui/react-primitive" "2.0.1" -"@radix-ui/react-context@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.0.tgz#6df8d983546cfd1999c8512f3a8ad85a6e7fcee8" - integrity sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A== +"@radix-ui/react-compose-refs@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz#6f766faa975f8738269ebb8a23bad4f5a8d2faec" + integrity sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw== "@radix-ui/react-context@1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@radix-ui/react-context/-/react-context-1.1.1.tgz#82074aa83a472353bb22e86f11bcbd1c61c4c71a" integrity sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q== -"@radix-ui/react-dismissable-layer@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz#cbdcb739c5403382bdde5f9243042ba643883396" - integrity sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ== +"@radix-ui/react-dialog@^1.1.2": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.1.4.tgz#d68e977acfcc0d044b9dab47b6dd2c179d2b3191" + integrity sha512-Ur7EV1IwQGCyaAuyDRiOLA5JIUZxELJljF+MbM/2NC0BYwfuRrbpS30BiQBJrVruscgUkieKkqXYDOoByaxIoA== + dependencies: + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.3" + "@radix-ui/react-focus-guards" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.1" + "@radix-ui/react-id" "1.1.0" + "@radix-ui/react-portal" "1.1.3" + "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-slot" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.1.0" + aria-hidden "^1.1.1" + react-remove-scroll "^2.6.1" + +"@radix-ui/react-dismissable-layer@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.3.tgz#4ee0f0f82d53bf5bd9db21665799bb0d1bad5ed8" + integrity sha512-onrWn/72lQoEucDmJnr8uczSNTujT0vJnA/X5+3AkChVPowr8n1yvIKIabhWyMQeMvvmdpsvcyDqx3X1LEXCPg== dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-primitive" "2.0.1" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-escape-keydown" "1.1.0" +"@radix-ui/react-focus-guards@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz#8635edd346304f8b42cae86b05912b61aef27afe" + integrity sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg== + +"@radix-ui/react-focus-scope@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.1.tgz#5c602115d1db1c4fcfa0fae4c3b09bb8919853cb" + integrity sha512-01omzJAYRxXdG2/he/+xy+c8a8gCydoQ1yOxnWNcRhrrBW5W+RQJ22EK1SaO8tb3WoUsuEw7mJjBozPzihDFjA== + dependencies: + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-use-callback-ref" "1.1.0" + "@radix-ui/react-id@1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@radix-ui/react-id/-/react-id-1.1.0.tgz#de47339656594ad722eb87f94a6b25f9cffae0ed" @@ -2080,76 +2092,76 @@ dependencies: "@radix-ui/react-use-layout-effect" "1.1.0" -"@radix-ui/react-popper@1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz#a3e500193d144fe2d8f5d5e60e393d64111f2a7a" - integrity sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg== +"@radix-ui/react-popper@1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-popper/-/react-popper-1.2.1.tgz#2fc66cfc34f95f00d858924e3bee54beae2dff0a" + integrity sha512-3kn5Me69L+jv82EKRuQCXdYyf1DqHwD2U/sxoNgBGCB7K9TRc3bQamQ+5EPM9EvyPdli0W41sROd+ZU1dTCztw== dependencies: "@floating-ui/react-dom" "^2.0.0" - "@radix-ui/react-arrow" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" - "@radix-ui/react-context" "1.1.0" - "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-arrow" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" + "@radix-ui/react-context" "1.1.1" + "@radix-ui/react-primitive" "2.0.1" "@radix-ui/react-use-callback-ref" "1.1.0" "@radix-ui/react-use-layout-effect" "1.1.0" "@radix-ui/react-use-rect" "1.1.0" "@radix-ui/react-use-size" "1.1.0" "@radix-ui/rect" "1.1.0" -"@radix-ui/react-portal@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.2.tgz#51eb46dae7505074b306ebcb985bf65cc547d74e" - integrity sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg== +"@radix-ui/react-portal@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.1.3.tgz#b0ea5141103a1671b715481b13440763d2ac4440" + integrity sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw== dependencies: - "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-primitive" "2.0.1" "@radix-ui/react-use-layout-effect" "1.1.0" -"@radix-ui/react-presence@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.1.tgz#98aba423dba5e0c687a782c0669dcd99de17f9b1" - integrity sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A== +"@radix-ui/react-presence@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@radix-ui/react-presence/-/react-presence-1.1.2.tgz#bb764ed8a9118b7ec4512da5ece306ded8703cdc" + integrity sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg== dependencies: - "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-use-layout-effect" "1.1.0" -"@radix-ui/react-primitive@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz#fe05715faa9203a223ccc0be15dc44b9f9822884" - integrity sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw== +"@radix-ui/react-primitive@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-2.0.1.tgz#6d9efc550f7520135366f333d1e820cf225fad9e" + integrity sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg== dependencies: - "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-slot" "1.1.1" "@radix-ui/react-separator@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.1.0.tgz#ee0f4d86003b0e3ea7bc6ccab01ea0adee32663e" - integrity sha512-3uBAs+egzvJBDZAzvb/n4NxxOYpnspmWxO2u5NbZ8Y6FM/NdrGSF9bop3Cf6F6C71z1rTSn8KV0Fo2ZVd79lGA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-separator/-/react-separator-1.1.1.tgz#dd60621553c858238d876be9b0702287424866d2" + integrity sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw== dependencies: - "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-primitive" "2.0.1" -"@radix-ui/react-slot@1.1.0", "@radix-ui/react-slot@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz#7c5e48c36ef5496d97b08f1357bb26ed7c714b84" - integrity sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw== +"@radix-ui/react-slot@1.1.1", "@radix-ui/react-slot@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.1.1.tgz#ab9a0ffae4027db7dc2af503c223c978706affc3" + integrity sha512-RApLLOcINYJA+dMVbOju7MYv1Mb2EBp2nH4HdDzXTSyaR5optlm6Otrz1euW3HbdOR8UmmFK06TD+A9frYWv+g== dependencies: - "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-tooltip@^1.1.4": - version "1.1.4" - resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.4.tgz#152d8485859b80d395d6b3229f676fef3cec56b3" - integrity sha512-QpObUH/ZlpaO4YgHSaYzrLO2VuO+ZBFFgGzjMUPwtiYnAzzNNDPJeEGRrT7qNOrWm/Jr08M1vlp+vTHtnSQ0Uw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.6.tgz#eab98e9a5c876ef0abfae3cfeee229870528ed06" + integrity sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA== dependencies: - "@radix-ui/primitive" "1.1.0" - "@radix-ui/react-compose-refs" "1.1.0" + "@radix-ui/primitive" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.1" "@radix-ui/react-context" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.3" "@radix-ui/react-id" "1.1.0" - "@radix-ui/react-popper" "1.2.0" - "@radix-ui/react-portal" "1.1.2" - "@radix-ui/react-presence" "1.1.1" - "@radix-ui/react-primitive" "2.0.0" - "@radix-ui/react-slot" "1.1.0" + "@radix-ui/react-popper" "1.2.1" + "@radix-ui/react-portal" "1.1.3" + "@radix-ui/react-presence" "1.1.2" + "@radix-ui/react-primitive" "2.0.1" + "@radix-ui/react-slot" "1.1.1" "@radix-ui/react-use-controllable-state" "1.1.0" - "@radix-ui/react-visually-hidden" "1.1.0" + "@radix-ui/react-visually-hidden" "1.1.1" "@radix-ui/react-use-callback-ref@1.1.0": version "1.1.0" @@ -2189,12 +2201,12 @@ dependencies: "@radix-ui/react-use-layout-effect" "1.1.0" -"@radix-ui/react-visually-hidden@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz#ad47a8572580f7034b3807c8e6740cd41038a5a2" - integrity sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ== +"@radix-ui/react-visually-hidden@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.1.tgz#f7b48c1af50dfdc366e92726aee6d591996c5752" + integrity sha512-vVfA2IZ9q/J+gEamvj761Oq1FpWgCDaNOOIfbPVp2MVPLEomUr5+Vf7kJGwQ24YxZSlQVar7Bes8kyTo5Dshpg== dependencies: - "@radix-ui/react-primitive" "2.0.0" + "@radix-ui/react-primitive" "2.0.1" "@radix-ui/rect@1.1.0": version "1.1.0" @@ -2210,103 +2222,108 @@ picomatch "^2.2.2" "@rollup/pluginutils@^5.0.2": - version "5.1.3" - resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.3.tgz#3001bf1a03f3ad24457591f2c259c8e514e0dbdf" - integrity sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A== + version "5.1.4" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.1.4.tgz#bb94f1f9eaaac944da237767cdfee6c5b2262d4a" + integrity sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ== dependencies: "@types/estree" "^1.0.0" estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz#ab2c78c43e4397fba9a80ea93907de7a144f3149" - integrity sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ== - -"@rollup/rollup-android-arm64@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz#de840660ab65cf73bd6d4bc62d38acd9fc94cd6c" - integrity sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw== - -"@rollup/rollup-darwin-arm64@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz#8c786e388f7eff0d830151a9d8fbf04c031bb07f" - integrity sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA== - -"@rollup/rollup-darwin-x64@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz#56dab9e4cac0ad97741740ea1ac7b6a576e20e59" - integrity sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg== - -"@rollup/rollup-freebsd-arm64@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz#bcb4112cb7e68a12d148b03cbc21dde43772f4bc" - integrity sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw== - -"@rollup/rollup-freebsd-x64@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz#c7cd9f69aa43847b37d819f12c2ad6337ec245fa" - integrity sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA== - -"@rollup/rollup-linux-arm-gnueabihf@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz#3692b22987a6195c8490bbf6357800e0c183ee38" - integrity sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q== - -"@rollup/rollup-linux-arm-musleabihf@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz#f920f24e571f26bbcdb882267086942fdb2474bf" - integrity sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg== - -"@rollup/rollup-linux-arm64-gnu@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz#2046553e91d8ca73359a2a3bb471826fbbdcc9a3" - integrity sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ== - -"@rollup/rollup-linux-arm64-musl@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz#8a3f05dbae753102ae10a9bc2168c7b6bbeea5da" - integrity sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g== - -"@rollup/rollup-linux-powerpc64le-gnu@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz#d281d9c762f9e4f1aa7909a313f7acbe78aced32" - integrity sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw== - -"@rollup/rollup-linux-riscv64-gnu@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz#fa84b3f81826cee0de9e90f9954f3e55c3cc6c97" - integrity sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A== - -"@rollup/rollup-linux-s390x-gnu@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz#6b9c04d84593836f942ceb4dd90644633d5fe871" - integrity sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA== - -"@rollup/rollup-linux-x64-gnu@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz#f13effcdcd1cc14b26427e6bec8c6c9e4de3773e" - integrity sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA== - -"@rollup/rollup-linux-x64-musl@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz#6547bc0069f2d788e6cf0f33363b951181f4cca5" - integrity sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ== - -"@rollup/rollup-win32-arm64-msvc@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz#3f2db9347c5df5e6627a7e12d937cea527d63526" - integrity sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw== - -"@rollup/rollup-win32-ia32-msvc@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz#54fcf9a13a98d3f0e4be6a4b6e28b9dca676502f" - integrity sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w== - -"@rollup/rollup-win32-x64-msvc@4.27.3": - version "4.27.3" - resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz#3721f601f973059bfeeb572992cf0dfc94ab2970" - integrity sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg== +"@rollup/rollup-android-arm-eabi@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e" + integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ== + +"@rollup/rollup-android-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d" + integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA== + +"@rollup/rollup-darwin-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz#dac0f0d0cfa73e7d5225ae6d303c13c8979e7999" + integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ== + +"@rollup/rollup-darwin-x64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2" + integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ== + +"@rollup/rollup-freebsd-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946" + integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA== + +"@rollup/rollup-freebsd-x64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282" + integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df" + integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA== + +"@rollup/rollup-linux-arm-musleabihf@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb" + integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg== + +"@rollup/rollup-linux-arm64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9" + integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA== + +"@rollup/rollup-linux-arm64-musl@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788" + integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A== + +"@rollup/rollup-linux-loongarch64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87" + integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c" + integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A== + +"@rollup/rollup-linux-riscv64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd" + integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA== + +"@rollup/rollup-linux-s390x-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd" + integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg== + +"@rollup/rollup-linux-x64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e" + integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw== + +"@rollup/rollup-linux-x64-musl@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b" + integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g== + +"@rollup/rollup-win32-arm64-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11" + integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A== + +"@rollup/rollup-win32-ia32-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f" + integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA== + +"@rollup/rollup-win32-x64-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz#4dff5c4259ebe6c5b4a8f2c5bc3829b7a8447ff0" + integrity sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA== "@rtsao/scc@^1.1.0": version "1.1.0" @@ -2903,9 +2920,9 @@ lodash "^4.17.15" "@storybook/csf@^0.1.0": - version "0.1.11" - resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.1.11.tgz#ad685a4fe564a47a6b73571c2e7c07b526f4f71b" - integrity sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg== + version "0.1.12" + resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.1.12.tgz#1dcfa0f398a69b834c563884b5f747db3d5a81df" + integrity sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw== dependencies: type-fest "^2.19.0" @@ -3177,32 +3194,32 @@ dependencies: "@babel/runtime" "^7.12.5" -"@ts-graphviz/adapter@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@ts-graphviz/adapter/-/adapter-2.0.5.tgz#81dad5e97a79ffaff485bd4fb0dcd387dd6c8a3b" - integrity sha512-K/xd2SJskbSLcUz9uYW9IDy26I3Oyutj/LREjJgcuLMxT3um4sZfy9LiUhGErHjxLRaNcaDVGSsmWeiNuhidXg== +"@ts-graphviz/adapter@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@ts-graphviz/adapter/-/adapter-2.0.6.tgz#18d5a42304dca7ffff760fcaf311a3148ef4a3bd" + integrity sha512-kJ10lIMSWMJkLkkCG5gt927SnGZcBuG0s0HHswGzcHTgvtUe7yk5/3zTEr0bafzsodsOq5Gi6FhQeV775nC35Q== dependencies: - "@ts-graphviz/common" "^2.1.4" + "@ts-graphviz/common" "^2.1.5" -"@ts-graphviz/ast@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@ts-graphviz/ast/-/ast-2.0.5.tgz#224825cf153abcaf255d9dc9c07e167bf15fc546" - integrity sha512-HVT+Bn/smDzmKNJFccwgrpJaEUMPzXQ8d84JcNugzTHNUVgxAIe2Vbf4ug351YJpowivQp6/N7XCluQMjtgi5w== +"@ts-graphviz/ast@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@ts-graphviz/ast/-/ast-2.0.6.tgz#d027b011934f9b933f7f9ba4f3ec712447cc14c2" + integrity sha512-JbOnw6+Pm+C9jRQlNV+qJG0/VTan4oCeZ0sClm++SjaaMBJ0q86O13i6wbcWKY2x8kKt9GP2hVCgM/p/BXtXWQ== dependencies: - "@ts-graphviz/common" "^2.1.4" + "@ts-graphviz/common" "^2.1.5" -"@ts-graphviz/common@^2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@ts-graphviz/common/-/common-2.1.4.tgz#9523a0f56e1a13467df070488de16cebf196c0e4" - integrity sha512-PNEzOgE4vgvorp/a4Ev26jVNtiX200yODoyPa8r6GfpPZbxWKW6bdXF6xWqzMkQoO1CnJOYJx2VANDbGqCqCCw== +"@ts-graphviz/common@^2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@ts-graphviz/common/-/common-2.1.5.tgz#a256dfaea009a5b147d8f73f25e57fb44f6462a2" + integrity sha512-S6/9+T6x8j6cr/gNhp+U2olwo1n0jKj/682QVqsh7yXWV6ednHYqxFw0ZsY3LyzT0N8jaZ6jQY9YD99le3cmvg== -"@ts-graphviz/core@^2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@ts-graphviz/core/-/core-2.0.5.tgz#89c084d936f1bdfc01b0f16d8c3670c0eab5aa5a" - integrity sha512-YwaCGAG3Hs0nhxl+2lVuwuTTAK3GO2XHqOGvGIwXQB16nV858rrR5w2YmWCw9nhd11uLTStxLsCAhI9koWBqDA== +"@ts-graphviz/core@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@ts-graphviz/core/-/core-2.0.6.tgz#a9728dacd2e78c873079956bf46a23e2edcde50c" + integrity sha512-0hvrluFirC0ph3Dn2o1B0O1fI2n7Hre1HlScfmRcO6DDDq/05Vizg5UMI0LfvkJulLuz80RPjUHluh+QfBUBKw== dependencies: - "@ts-graphviz/ast" "^2.0.5" - "@ts-graphviz/common" "^2.1.4" + "@ts-graphviz/ast" "^2.0.6" + "@ts-graphviz/common" "^2.1.5" "@tsconfig/node10@^1.0.7": version "1.0.11" @@ -3224,6 +3241,13 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== +"@types/archiver@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/archiver/-/archiver-6.0.3.tgz#074eb6f4febc0128c25a205a8263da3d4688df53" + integrity sha512-a6wUll6k3zX6qs5KlxIggs1P1JcYJaTCx2gnlr+f0S1yd2DoaEwoIK10HmBaLnZwWneBz+JBm0dwcZu0zECBcQ== + dependencies: + "@types/readdir-glob" "*" + "@types/aria-query@^5.0.1": version "5.0.4" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-5.0.4.tgz#1a31c3d378850d2778dabb6374d036dcba4ba708" @@ -3270,6 +3294,11 @@ "@types/connect" "*" "@types/node" "*" +"@types/braces@*": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/braces/-/braces-3.0.4.tgz#403488dc1c8d0db288270d3bbf0ce5f9c45678b4" + integrity sha512-0WR3b8eaISjEW7RpZnclONaLFDf7buaowRHdqLp4vLj54AsSAYWfh3DRbfiYJY9XDxMgx1B4sE1Afw2PGpuHOA== + "@types/connect@*": version "3.4.38" resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" @@ -3329,6 +3358,16 @@ "@types/range-parser" "*" "@types/send" "*" +"@types/express-serve-static-core@^5.0.0": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz#812d2871e5eea17fb0bd5214dda7a7b748c0e12a" + integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + "@types/express@^4.7.0": version "4.17.21" resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" @@ -3339,11 +3378,28 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/express@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@types/express/-/express-5.0.0.tgz#13a7d1f75295e90d19ed6e74cab3678488eaa96c" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + "@types/find-cache-dir@^3.2.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz#7b959a4b9643a1e6a1a5fe49032693cc36773501" integrity sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw== +"@types/findup-sync@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/findup-sync/-/findup-sync-4.0.5.tgz#df25b72fb256a65b346bc66e2dcd7de04393ec84" + integrity sha512-Y4NCs+7uDZ3SFF0GWowN2IANqOJr+Cdvp9hfMSGzQYqJkyvAEJIq/s0/8AP88fq+yswykWPWZRBrqWPEhCLsgg== + dependencies: + "@types/micromatch" "^4.0.0" + "@types/fs-extra@^11.0.4": version "11.0.4" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.4.tgz#e16a863bb8843fba8c5004362b5a73e17becca45" @@ -3438,6 +3494,13 @@ resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.13.tgz#68f6877043d377092890ff5b298152b0a21671bd" integrity sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw== +"@types/micromatch@^4.0.0": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/micromatch/-/micromatch-4.0.9.tgz#8e5763a8c1fc7fbf26144d9215a01ab0ff702dbb" + integrity sha512-7V+8ncr22h4UoYRLnLXSpTxjQrNUXtWHGeMPRJt1nULXI57G9bIcpyrHlmrQ7QK24EyyuXvYcSSWAM8GA9nqCg== + dependencies: + "@types/braces" "*" + "@types/mime-types@^2.1.0": version "2.1.4" resolved "https://registry.yarnpkg.com/@types/mime-types/-/mime-types-2.1.4.tgz#93a1933e24fed4fb9e4adc5963a63efcbb3317a2" @@ -3469,16 +3532,16 @@ form-data "^4.0.0" "@types/node@*", "@types/node@^22.5.5": - version "22.9.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-22.9.1.tgz#bdf91c36e0e7ecfb7257b2d75bf1b206b308ca71" - integrity sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg== + version "22.10.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.2.tgz#a485426e6d1fdafc7b0d4c7b24e2c78182ddabb9" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== dependencies: - undici-types "~6.19.8" + undici-types "~6.20.0" "@types/node@^16.0.0": - version "16.18.119" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.119.tgz#88443bb82119b7c0920e86949673876cbe1c3492" - integrity sha512-ia7V9a2FnhUFfetng4/sRPBMTwHZUkPFY736rb1cg9AgG7MZdR97q7/nLR9om+sq5f1la9C857E0l/nrI0RiFQ== + version "16.18.122" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.122.tgz#54948ddbe2ddef8144ee16b37f160e3f99c32397" + integrity sha512-rF6rUBS80n4oK16EW8nE75U+9fw0SSUgoPtWSvHhPXdT7itbvmS7UjB/jyM8i3AkvI6yeSM5qCwo+xN0npGDHg== "@types/normalize-package-data@^2.4.0": version "2.4.4" @@ -3495,11 +3558,6 @@ resolved "https://registry.yarnpkg.com/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#ee1bd8c9f7a01b3445786aad0ef23aba5f511a44" integrity sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA== -"@types/prop-types@*": - version "15.7.13" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451" - integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA== - "@types/qs@*", "@types/qs@^6.9.5": version "6.9.17" resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.17.tgz#fc560f60946d0aeff2f914eb41679659d3310e1a" @@ -3511,13 +3569,19 @@ integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== "@types/react@>=16": - version "18.3.12" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.12.tgz#99419f182ccd69151813b7ee24b792fe08774f60" - integrity sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw== + version "19.0.2" + resolved "https://registry.yarnpkg.com/@types/react/-/react-19.0.2.tgz#9363e6b3ef898c471cb182dd269decc4afc1b4f6" + integrity sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg== dependencies: - "@types/prop-types" "*" csstype "^3.0.2" +"@types/readdir-glob@*": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@types/readdir-glob/-/readdir-glob-1.1.5.tgz#21a4a98898fc606cb568ad815f2a0eedc24d412a" + integrity sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg== + dependencies: + "@types/node" "*" + "@types/semver@^7.3.4", "@types/semver@^7.5.8": version "7.5.8" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" @@ -3545,6 +3609,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/tmp@^0.2.6": + version "0.2.6" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.6.tgz#d785ee90c52d7cc020e249c948c36f7b32d1e217" + integrity sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA== + "@types/unist@^2.0.0": version "2.0.11" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.11.tgz#11af57b127e32487774841f7a4e54eab166d03c4" @@ -3580,46 +3649,46 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin@^8.11.0": - version "8.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz#c95c6521e70c8b095a684d884d96c0c1c63747d2" - integrity sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg== + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.18.1.tgz#992e5ac1553ce20d0d46aa6eccd79dc36dedc805" + integrity sha512-Ncvsq5CT3Gvh+uJG0Lwlho6suwDfUXH0HztslDf5I+F2wAFAZMRwYLEorumpKLzmO2suAXZ/td1tBg4NZIi9CQ== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.15.0" - "@typescript-eslint/type-utils" "8.15.0" - "@typescript-eslint/utils" "8.15.0" - "@typescript-eslint/visitor-keys" "8.15.0" + "@typescript-eslint/scope-manager" "8.18.1" + "@typescript-eslint/type-utils" "8.18.1" + "@typescript-eslint/utils" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" graphemer "^1.4.0" ignore "^5.3.1" natural-compare "^1.4.0" ts-api-utils "^1.3.0" "@typescript-eslint/parser@^8.11.0": - version "8.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.15.0.tgz#92610da2b3af702cfbc02a46e2a2daa6260a9045" - integrity sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A== - dependencies: - "@typescript-eslint/scope-manager" "8.15.0" - "@typescript-eslint/types" "8.15.0" - "@typescript-eslint/typescript-estree" "8.15.0" - "@typescript-eslint/visitor-keys" "8.15.0" + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.18.1.tgz#c258bae062778b7696793bc492249027a39dfb95" + integrity sha512-rBnTWHCdbYM2lh7hjyXqxk70wvon3p2FyaniZuey5TrcGBpfhVp0OxOa6gxr9Q9YhZFKyfbEnxc24ZnVbbUkCA== + dependencies: + "@typescript-eslint/scope-manager" "8.18.1" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/typescript-estree" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.15.0": - version "8.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz#28a1a0f13038f382424f45a988961acaca38f7c6" - integrity sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA== +"@typescript-eslint/scope-manager@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.18.1.tgz#52cedc3a8178d7464a70beffed3203678648e55b" + integrity sha512-HxfHo2b090M5s2+/9Z3gkBhI6xBH8OJCFjH9MhQ+nnoZqxU3wNxkLT+VWXWSFWc3UF3Z+CfPAyqdCTdoXtDPCQ== dependencies: - "@typescript-eslint/types" "8.15.0" - "@typescript-eslint/visitor-keys" "8.15.0" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" -"@typescript-eslint/type-utils@8.15.0": - version "8.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz#a6da0f93aef879a68cc66c73fe42256cb7426c72" - integrity sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw== +"@typescript-eslint/type-utils@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.18.1.tgz#10f41285475c0bdee452b79ff7223f0e43a7781e" + integrity sha512-jAhTdK/Qx2NJPNOTxXpMwlOiSymtR2j283TtPqXkKBdH8OAMmhiUfP0kJjc/qSE51Xrq02Gj9NY7MwK+UxVwHQ== dependencies: - "@typescript-eslint/typescript-estree" "8.15.0" - "@typescript-eslint/utils" "8.15.0" + "@typescript-eslint/typescript-estree" "8.18.1" + "@typescript-eslint/utils" "8.18.1" debug "^4.3.4" ts-api-utils "^1.3.0" @@ -3628,18 +3697,18 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== -"@typescript-eslint/types@8.15.0": - version "8.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.15.0.tgz#4958edf3d83e97f77005f794452e595aaf6430fc" - integrity sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ== +"@typescript-eslint/types@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.18.1.tgz#d7f4f94d0bba9ebd088de840266fcd45408a8fff" + integrity sha512-7uoAUsCj66qdNQNpH2G8MyTFlgerum8ubf21s3TSM3XmKXuIn+H2Sifh/ES2nPOPiYSRJWAk0fDkW0APBWcpfw== -"@typescript-eslint/typescript-estree@8.15.0": - version "8.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz#915c94e387892b114a2a2cc0df2d7f19412c8ba7" - integrity sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg== +"@typescript-eslint/typescript-estree@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.18.1.tgz#2a86cd64b211a742f78dfa7e6f4860413475367e" + integrity sha512-z8U21WI5txzl2XYOW7i9hJhxoKKNG1kcU4RzyNvKrdZDmbjkmLBo8bgeiOJmA06kizLI76/CCBAAGlTlEeUfyg== dependencies: - "@typescript-eslint/types" "8.15.0" - "@typescript-eslint/visitor-keys" "8.15.0" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/visitor-keys" "8.18.1" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -3661,15 +3730,15 @@ semver "^7.6.0" ts-api-utils "^1.3.0" -"@typescript-eslint/utils@8.15.0": - version "8.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.15.0.tgz#ac04679ad19252776b38b81954b8e5a65567cef6" - integrity sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ== +"@typescript-eslint/utils@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.18.1.tgz#c4199ea23fc823c736e2c96fd07b1f7235fa92d5" + integrity sha512-8vikiIj2ebrC4WRdcAdDcmnu9Q/MXXwg+STf40BVfT8exDqBCUPdypvzcUPxEqRGKg9ALagZ0UWcYCtn+4W2iQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" - "@typescript-eslint/scope-manager" "8.15.0" - "@typescript-eslint/types" "8.15.0" - "@typescript-eslint/typescript-estree" "8.15.0" + "@typescript-eslint/scope-manager" "8.18.1" + "@typescript-eslint/types" "8.18.1" + "@typescript-eslint/typescript-estree" "8.18.1" "@typescript-eslint/visitor-keys@7.18.0": version "7.18.0" @@ -3679,18 +3748,18 @@ "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" -"@typescript-eslint/visitor-keys@8.15.0": - version "8.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz#9ea5a85eb25401d2aa74ec8a478af4e97899ea12" - integrity sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q== +"@typescript-eslint/visitor-keys@8.18.1": + version "8.18.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.18.1.tgz#344b4f6bc83f104f514676facf3129260df7610a" + integrity sha512-Vj0WLm5/ZsD013YeUKn+K0y8p1M0jPpxOkKdbD1wB0ns53a5piVY02zjf072TblEweAbcYiFiPoSMF3kp+VhhQ== dependencies: - "@typescript-eslint/types" "8.15.0" + "@typescript-eslint/types" "8.18.1" eslint-visitor-keys "^4.2.0" "@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd" + integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA== "@vitejs/plugin-react@^3.0.1": version "3.1.0" @@ -3704,13 +3773,13 @@ react-refresh "^0.14.0" "@vitejs/plugin-react@^4.2.1": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.3.tgz#28301ac6d7aaf20b73a418ee5c65b05519b4836c" - integrity sha512-NooDe9GpHGqNns1i8XDERg0Vsg5SSYRhRxxyTGogUdkdNt47jal+fbuYi+Yfq6pzRCKXyoPcWisfxE6RIM3GKA== + version "4.3.4" + resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz#c64be10b54c4640135a5b28a2432330e88ad7c20" + integrity sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug== dependencies: - "@babel/core" "^7.25.2" - "@babel/plugin-transform-react-jsx-self" "^7.24.7" - "@babel/plugin-transform-react-jsx-source" "^7.24.7" + "@babel/core" "^7.26.0" + "@babel/plugin-transform-react-jsx-self" "^7.25.9" + "@babel/plugin-transform-react-jsx-source" "^7.25.9" "@types/babel__core" "^7.20.5" react-refresh "^0.14.2" @@ -3841,12 +3910,10 @@ agent-base@5: resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c" integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g== -agent-base@^7.0.2, agent-base@^7.1.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" - integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== - dependencies: - debug "^4.3.4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.3.tgz#29435eb821bc4194633a5b89e5bc4703bafc25a1" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== aggregate-error@^3.0.0: version "3.1.0" @@ -4007,6 +4074,13 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-hidden@^1.1.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/aria-hidden/-/aria-hidden-1.2.4.tgz#b78e383fdbc04d05762c78b4a25a501e736c4522" + integrity sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A== + dependencies: + tslib "^2.0.0" + aria-query@5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.1.3.tgz#19db27cd101152773631396f7a95a3b58c22c35e" @@ -4057,38 +4131,37 @@ array.prototype.findlastindex@^1.2.5: es-shim-unscopables "^1.0.2" array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" -arraybuffer.prototype.slice@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" - integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== +arraybuffer.prototype.slice@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c" + integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== dependencies: array-buffer-byte-length "^1.0.1" - call-bind "^1.0.5" + call-bind "^1.0.8" define-properties "^1.2.1" - es-abstract "^1.22.3" - es-errors "^1.2.1" - get-intrinsic "^1.2.3" + es-abstract "^1.23.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" is-array-buffer "^3.0.4" - is-shared-array-buffer "^1.0.2" asn1@~0.2.3: version "0.2.6" @@ -4171,9 +4244,9 @@ aws4@^1.8.0: integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== axios@^1.2.2, axios@^1.3.5, axios@^1.6.8, axios@^1.7.2: - version "1.7.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" - integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + version "1.7.9" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.9.tgz#d7d071380c132a24accda1b2cfc1535b79ec650a" + integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" @@ -4446,13 +4519,13 @@ browserify-zlib@^0.1.4: pako "~0.2.0" browserslist@^4.24.0, browserslist@^4.24.2: - version "4.24.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.2.tgz#f5845bc91069dbd55ee89faf9822e1d885d16580" - integrity sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg== + version "4.24.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.3.tgz#5fc2725ca8fb3c1432e13dac278c7cc103e026d2" + integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== dependencies: - caniuse-lite "^1.0.30001669" - electron-to-chromium "^1.5.41" - node-releases "^2.0.18" + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" update-browserslist-db "^1.1.1" bs-logger@^0.2.6: @@ -4536,16 +4609,31 @@ cacheable-request@^6.0.0: normalize-url "^4.1.0" responselike "^1.0.2" -call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz#32e5892e6361b29b0b545ba6f7763378daca2840" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== dependencies: - es-define-property "^1.0.0" es-errors "^1.3.0" function-bind "^1.1.2" + +call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" get-intrinsic "^1.2.4" - set-function-length "^1.2.1" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" callsites@^3.0.0: version "3.1.0" @@ -4562,10 +4650,10 @@ camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001669: - version "1.0.30001680" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz#5380ede637a33b9f9f1fc6045ea99bd142f3da5e" - integrity sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA== +caniuse-lite@^1.0.30001688: + version "1.0.30001690" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" + integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== caseless@~0.12.0: version "0.12.0" @@ -4590,9 +4678,9 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: supports-color "^7.1.0" chalk@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" - integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + version "5.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.0.tgz#846fdb5d5d939d6fa3d565cd5545697b6f8b6923" + integrity sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q== char-regex@^1.0.2: version "1.0.2" @@ -4652,11 +4740,11 @@ cjs-module-lexer@^1.0.0: integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== class-variance-authority@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.0.tgz#1c3134d634d80271b1837452b06d821915954522" - integrity sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A== + version "0.7.1" + resolved "https://registry.yarnpkg.com/class-variance-authority/-/class-variance-authority-0.7.1.tgz#4008a798a0e4553a781a57ac5177c9fb5d043787" + integrity sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg== dependencies: - clsx "2.0.0" + clsx "^2.1.1" clean-stack@^2.0.0: version "2.2.0" @@ -4758,11 +4846,6 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== -clsx@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.0.0.tgz#12658f3fd98fafe62075595a5c30e43d18f3d00b" - integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== - clsx@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" @@ -5076,11 +5159,11 @@ data-view-byte-length@^1.0.1: is-data-view "^1.0.1" data-view-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" - integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191" + integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.2" es-errors "^1.3.0" is-data-view "^1.0.1" @@ -5097,9 +5180,9 @@ debug@2.6.9, debug@^2.6.9: ms "2.0.0" debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" - integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" @@ -5205,7 +5288,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.2.0, define-properties@^1.2.1: +define-properties@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== @@ -5283,6 +5366,11 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/detect-node-es/-/detect-node-es-1.1.0.tgz#163acdf643330caa0b4cd7c21e7ee7755d6fa493" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + detect-package-manager@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/detect-package-manager/-/detect-package-manager-2.0.1.tgz#6b182e3ae5e1826752bfef1de9a7b828cffa50d8" @@ -5450,15 +5538,24 @@ dotenv-expand@^10.0.0: integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== dotenv@^16.0.0, dotenv@^16.3.1: - version "16.4.5" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" - integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + version "16.4.7" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.7.tgz#0e20c5b82950140aa99be360a8a5f52335f53c26" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== dotenv@^8.2.0: version "8.6.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== +dunder-proto@^1.0.0, dunder-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + duplexer3@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" @@ -5499,10 +5596,10 @@ ejs@^3.1.10, ejs@^3.1.8: dependencies: jake "^10.8.5" -electron-to-chromium@^1.5.41: - version "1.5.63" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz#69444d592fbbe628d129866c2355691ea93eda3e" - integrity sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA== +electron-to-chromium@^1.5.73: + version "1.5.74" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz#cb886b504a6467e4c00bea3317edb38393c53413" + integrity sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw== emittery@^0.13.1: version "0.13.1" @@ -5574,66 +5671,66 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: - version "1.23.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.5.tgz#f4599a4946d57ed467515ed10e4f157289cd52fb" - integrity sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ== +es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.6: + version "1.23.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.6.tgz#55f0e1ce7128995cc04ace0a57d7dca348345108" + integrity sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA== dependencies: array-buffer-byte-length "^1.0.1" - arraybuffer.prototype.slice "^1.0.3" + arraybuffer.prototype.slice "^1.0.4" available-typed-arrays "^1.0.7" - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" data-view-buffer "^1.0.1" data-view-byte-length "^1.0.1" data-view-byte-offset "^1.0.0" - es-define-property "^1.0.0" + es-define-property "^1.0.1" es-errors "^1.3.0" es-object-atoms "^1.0.0" es-set-tostringtag "^2.0.3" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.4" + es-to-primitive "^1.3.0" + function.prototype.name "^1.1.7" + get-intrinsic "^1.2.6" get-symbol-description "^1.0.2" globalthis "^1.0.4" - gopd "^1.0.1" + gopd "^1.2.0" has-property-descriptors "^1.0.2" - has-proto "^1.0.3" - has-symbols "^1.0.3" + has-proto "^1.2.0" + has-symbols "^1.1.0" hasown "^2.0.2" - internal-slot "^1.0.7" + internal-slot "^1.1.0" is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-data-view "^1.0.1" + is-data-view "^1.0.2" is-negative-zero "^2.0.3" - is-regex "^1.1.4" + is-regex "^1.2.1" is-shared-array-buffer "^1.0.3" - is-string "^1.0.7" + is-string "^1.1.1" is-typed-array "^1.1.13" - is-weakref "^1.0.2" + is-weakref "^1.1.0" + math-intrinsics "^1.0.0" object-inspect "^1.13.3" object-keys "^1.1.1" object.assign "^4.1.5" regexp.prototype.flags "^1.5.3" - safe-array-concat "^1.1.2" - safe-regex-test "^1.0.3" - string.prototype.trim "^1.2.9" - string.prototype.trimend "^1.0.8" + safe-array-concat "^1.1.3" + safe-regex-test "^1.1.0" + string.prototype.trim "^1.2.10" + string.prototype.trimend "^1.0.9" string.prototype.trimstart "^1.0.8" typed-array-buffer "^1.0.2" typed-array-byte-length "^1.0.1" - typed-array-byte-offset "^1.0.2" - typed-array-length "^1.0.6" + typed-array-byte-offset "^1.0.3" + typed-array-length "^1.0.7" unbox-primitive "^1.0.2" - which-typed-array "^1.1.15" + which-typed-array "^1.1.16" -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== -es-errors@^1.2.1, es-errors@^1.3.0: +es-errors@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== @@ -5674,21 +5771,21 @@ es-set-tostringtag@^2.0.3: has-tostringtag "^1.0.2" hasown "^2.0.1" -es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: +es-shim-unscopables@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: hasown "^2.0.0" -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== +es-to-primitive@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.0.tgz#96c89c82cc49fd8794a24835ba3e1ff87f214e18" + integrity sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" + is-callable "^1.2.7" + is-date-object "^1.0.5" + is-symbol "^1.0.4" es6-promise@^4.2.4: version "4.2.8" @@ -6176,9 +6273,9 @@ expect@^29.0.0, expect@^29.7.0: jest-util "^29.7.0" express@^4.17.1, express@^4.17.3, express@^4.18.2: - version "4.21.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.21.1.tgz#9dae5dda832f16b4eec941a4e44aa89ec481b281" - integrity sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ== + version "4.21.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.21.2.tgz#cf250e48362174ead6cea4a566abef0162c1ec32" + integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: accepts "~1.3.8" array-flatten "1.1.1" @@ -6199,7 +6296,7 @@ express@^4.17.1, express@^4.17.3, express@^4.18.2: methods "~1.1.2" on-finished "2.4.1" parseurl "~1.3.3" - path-to-regexp "0.1.10" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" qs "6.13.0" range-parser "~1.2.1" @@ -6476,9 +6573,9 @@ flatted@^3.2.9: integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== flow-parser@0.*: - version "0.254.1" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.254.1.tgz#914a3420506c0dbd7a3be73d94c51ca41f2a7727" - integrity sha512-dyUrQD6ZyI4PVQppj8PP5kj6BVThK8FprAcPCnJNLIZM7zcAL6/xGS1EE1haWv2HcO/dHy7GSwOAO59uaffjYw== + version "0.257.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.257.0.tgz#7bac8843ca43c7ba46611dfdef4acb0828351a02" + integrity sha512-j1odE5mnPe6GOd5W1H/i8EXJvkhVquZCdoFVsZxUW8Yzda0OvjISCBBhDMjxtSkI1YU3d15BkTEeSYb5TLsVuw== follow-redirects@^1.0.0, follow-redirects@^1.15.6: version "1.15.9" @@ -6622,15 +6719,16 @@ function-bind@^1.1.2: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== +function.prototype.name@^1.1.6, function.prototype.name@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.7.tgz#9df48ea5f746bf577d7e15b5da89df8952a98e7b" + integrity sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.8" + define-properties "^1.2.1" functions-have-names "^1.2.3" + hasown "^2.0.2" + is-callable "^1.2.7" functions-have-names@^1.2.3: version "1.2.3" @@ -6655,16 +6753,26 @@ get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== +get-intrinsic@^1.1.3, get-intrinsic@^1.2.2, get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.6.tgz#43dd3dd0e7b49b82b2dfcad10dc824bf7fc265d5" + integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== dependencies: + call-bind-apply-helpers "^1.0.1" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" es-errors "^1.3.0" + es-object-atoms "^1.0.0" function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.0.0" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-nonce/-/get-nonce-1.0.1.tgz#fdf3f0278073820d2ce9426c18f07481b1e0cdf3" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== get-npm-tarball-url@^2.0.3: version "2.1.0" @@ -6711,13 +6819,13 @@ get-stream@^8.0.1: integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== get-symbol-description@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" - integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee" + integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== dependencies: - call-bind "^1.0.5" + call-bound "^1.0.3" es-errors "^1.3.0" - get-intrinsic "^1.2.4" + get-intrinsic "^1.2.6" getpass@^0.1.1: version "0.1.7" @@ -6869,12 +6977,10 @@ gonzales-pe@^4.3.0: dependencies: minimist "^1.2.5" -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== got@^9.6.0: version "9.6.0" @@ -6940,10 +7046,10 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-bigints@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.1.0.tgz#28607e965ac967e03cd2a2c70a2636a1edad49fe" + integrity sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg== has-flag@^3.0.0: version "3.0.0" @@ -6962,15 +7068,17 @@ has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: dependencies: es-define-property "^1.0.0" -has-proto@^1.0.1, has-proto@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== +has-proto@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5" + integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== + dependencies: + dunder-proto "^1.0.0" -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: version "1.0.2" @@ -7087,11 +7195,11 @@ https-proxy-agent@^4.0.0: debug "4" https-proxy-agent@^7.0.5: - version "7.0.5" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" - integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + version "7.0.6" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== dependencies: - agent-base "^7.0.2" + agent-base "^7.1.2" debug "4" human-signals@^1.1.1: @@ -7223,14 +7331,14 @@ inquirer@8.2.0: strip-ansi "^6.0.0" through "^2.3.6" -internal-slot@^1.0.4, internal-slot@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" - integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== +internal-slot@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961" + integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== dependencies: es-errors "^1.3.0" - hasown "^2.0.0" - side-channel "^1.0.4" + hasown "^2.0.2" + side-channel "^1.1.0" ip@^2.0.0: version "2.0.1" @@ -7248,32 +7356,40 @@ is-absolute-url@^3.0.0: integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== is-arguments@^1.0.4, is-arguments@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.2.0.tgz#ad58c6aecf563b78ef2bf04df540da8f5d7d8e1b" + integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-array-buffer@^3.0.2, is-array-buffer@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" - integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== + version "3.0.5" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280" + integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.8" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== dependencies: - has-bigints "^1.0.1" + has-tostringtag "^1.0.0" + +is-bigint@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672" + integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== + dependencies: + has-bigints "^1.0.2" is-binary-path@~2.1.0: version "2.1.0" @@ -7282,15 +7398,15 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== +is-boolean-object@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.1.tgz#c20d0c654be05da4fbc23c562635c019e93daf89" + integrity sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -7302,26 +7418,29 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0, is-core-module@^2.15.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" - integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== +is-core-module@^2.13.0, is-core-module@^2.15.1, is-core-module@^2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.0.tgz#6c01ffdd5e33c49c1d2abfa93334a85cb56bd81c" + integrity sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g== dependencies: hasown "^2.0.2" -is-data-view@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" - integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== +is-data-view@^1.0.1, is-data-view@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e" + integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== dependencies: + call-bound "^1.0.2" + get-intrinsic "^1.2.6" is-typed-array "^1.1.13" -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== +is-date-object@^1.0.5, is-date-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7" + integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + has-tostringtag "^1.0.2" is-deflate@^1.0.0: version "1.0.0" @@ -7338,6 +7457,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90" + integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== + dependencies: + call-bound "^1.0.3" + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -7353,7 +7479,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-generator-function@^1.0.7: +is-generator-function@^1.0.10, is-generator-function@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== @@ -7400,12 +7526,13 @@ is-npm@^5.0.0: resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +is-number-object@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541" + integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" is-number@^7.0.0: version "7.0.0" @@ -7454,13 +7581,15 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-regex@^1.1.2, is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== +is-regex@^1.1.2, is-regex@^1.1.4, is-regex@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22" + integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" + call-bound "^1.0.2" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + hasown "^2.0.2" is-regexp@^1.0.0: version "1.0.0" @@ -7473,11 +7602,11 @@ is-set@^2.0.2, is-set@^2.0.3: integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" - integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f" + integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.3" is-stream@^2.0.0, is-stream@^2.0.1: version "2.0.1" @@ -7489,26 +7618,29 @@ is-stream@^3.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== +is-string@^1.0.7, is-string@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9" + integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== dependencies: - has-tostringtag "^1.0.0" + call-bound "^1.0.3" + has-tostringtag "^1.0.2" -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== +is-symbol@^1.0.3, is-symbol@^1.0.4, is-symbol@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634" + integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== dependencies: - has-symbols "^1.0.2" + call-bound "^1.0.2" + has-symbols "^1.1.0" + safe-regex-test "^1.1.0" -is-typed-array@^1.1.13, is-typed-array@^1.1.3: - version "1.1.13" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" - integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== +is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15, is-typed-array@^1.1.3: + version "1.1.15" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== dependencies: - which-typed-array "^1.1.14" + which-typed-array "^1.1.16" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" @@ -7535,20 +7667,20 @@ is-weakmap@^2.0.2: resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd" integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== +is-weakref@^1.0.2, is-weakref@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.0.tgz#47e3472ae95a63fa9cf25660bcf0c181c39770ef" + integrity sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.2" is-weakset@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.3.tgz#e801519df8c0c43e12ff2834eead84ec9e624007" - integrity sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca" + integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" + call-bound "^1.0.3" + get-intrinsic "^1.2.6" is-windows@^1.0.1: version "1.0.2" @@ -8104,7 +8236,12 @@ jsdom@^25.0.1: ws "^8.18.0" xml-name-validator "^5.0.0" -jsesc@^3.0.2, jsesc@~3.0.2: +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +jsesc@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== @@ -8427,9 +8564,9 @@ magic-string@^0.27.0: "@jridgewell/sourcemap-codec" "^1.4.13" magic-string@^0.30.0, magic-string@^0.30.11: - version "0.30.13" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.13.tgz#92438e3ff4946cf54f18247c981e5c161c46683c" - integrity sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g== + version "0.30.17" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== dependencies: "@jridgewell/sourcemap-codec" "^1.5.0" @@ -8473,9 +8610,14 @@ map-or-similar@^1.5.0: integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== markdown-to-jsx@^7.1.8: - version "7.7.0" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.0.tgz#98424780af4b9cccd55873c5bc7e43c0b00ff579" - integrity sha512-130nIMbJY+woOQJ11xTqEtYko60t6EpNkZuqjKMferL3udtob3nRfzXOdsiA26NPemiR7w/hR8M3/B9yiYPGZg== + version "7.7.2" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.7.2.tgz#59c1dd64f48b53719311ab140be3cd51cdabccd3" + integrity sha512-N3AKfYRvxNscvcIH6HDnDKILp4S8UWbebp+s92Y8SwIq0CuSbLW4Jgmrbjku3CWKjTQO0OyIMS6AhzqrwjEa3g== + +math-intrinsics@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== mdast-util-definitions@^4.0.0: version "4.0.0" @@ -8720,9 +8862,9 @@ mute-stream@^1.0.0: integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== nanoid@^3.3.7: - version "3.3.7" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" - integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== + version "3.3.8" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== natural-compare@^1.4.0: version "1.4.0" @@ -8782,10 +8924,10 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.18: - version "2.0.18" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f" - integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g== +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== node-source-walk@^7.0.0: version "7.0.0" @@ -8836,9 +8978,9 @@ npm-run-path@^5.1.0: path-key "^4.0.0" nwsapi@^2.2.12: - version "2.2.13" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.13.tgz#e56b4e98960e7a040e5474536587e599c4ff4655" - integrity sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ== + version "2.2.16" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.16.tgz#177760bba02c351df1d2644e220c31dfec8cdb43" + integrity sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ== nypm@^0.3.8: version "0.3.12" @@ -8862,7 +9004,7 @@ object-assign@^4, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.13.1, object-inspect@^1.13.3: +object-inspect@^1.13.3: version "1.13.3" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.3.tgz#f14c183de51130243d6d18ae149375ff50ea488a" integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== @@ -8881,13 +9023,15 @@ object-keys@^1.1.1: integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== object.assign@^4.1.4, object.assign@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== + version "4.1.7" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d" + integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== dependencies: - call-bind "^1.0.5" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" - has-symbols "^1.0.3" + es-object-atoms "^1.0.0" + has-symbols "^1.1.0" object-keys "^1.1.1" object.fromentries@^2.0.8: @@ -8910,11 +9054,12 @@ object.groupby@^1.0.3: es-abstract "^1.23.2" object.values@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" - integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" define-properties "^1.2.1" es-object-atoms "^1.0.0" @@ -9179,10 +9324,10 @@ path-scurry@^1.11.1: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" -path-to-regexp@0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.10.tgz#67e9108c5c0551b9e5326064387de4763c4d5f8b" - integrity sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w== +path-to-regexp@0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz#d5e1a12e478a976d432ef3c58d534b9923164bb7" + integrity sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ== path-type@^4.0.0: version "4.0.0" @@ -9346,12 +9491,7 @@ prettier@^2.8.0: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== -prettier@^3.3.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.3.tgz#30c54fe0be0d8d12e6ae61dbb10109ea00d53105" - integrity sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew== - -prettier@^3.4.2: +prettier@^3.3.0, prettier@^3.4.2: version "3.4.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== @@ -9432,9 +9572,9 @@ proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== psl@^1.1.28: - version "1.12.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.12.0.tgz#8b09cba186ebee68c0d824c1b22944cf5b2ad42c" - integrity sha512-OVcqwt4qWJF9G0fnSEMNz7aSa1PiGX/IvSXDO+PpbDK3r/IJ3QX2iu8ywanYG07e9IaYDigMu+EapE8TdMZOJQ== + version "1.15.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.15.0.tgz#bdace31896f1d97cec6a79e8224898ce93d974c6" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== dependencies: punycode "^2.3.1" @@ -9645,6 +9785,33 @@ react-refresh@^0.14.0, react-refresh@^0.14.2: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.14.2.tgz#3833da01ce32da470f1f936b9d477da5c7028bf9" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== +react-remove-scroll-bar@^2.3.7: + version "2.3.8" + resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz#99c20f908ee467b385b68a3469b4a3e750012223" + integrity sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q== + dependencies: + react-style-singleton "^2.2.2" + tslib "^2.0.0" + +react-remove-scroll@^2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.6.2.tgz#2518d2c5112e71ea8928f1082a58459b5c7a2a97" + integrity sha512-KmONPx5fnlXYJQqC62Q+lwIeAk64ws/cUw6omIumRzMRPqgnYqhSSti99nbj0Ry13bv7dF+BKn7NB+OqkdZGTw== + dependencies: + react-remove-scroll-bar "^2.3.7" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.3" + use-sidecar "^1.1.2" + +react-style-singleton@^2.2.1, react-style-singleton@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/react-style-singleton/-/react-style-singleton-2.2.3.tgz#4265608be69a4d70cfe3047f2c6c88b2c3ace388" + integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== + dependencies: + get-nonce "^1.0.0" + tslib "^2.0.0" + react@18.3.1: version "18.3.1" resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" @@ -9694,9 +9861,9 @@ readable-stream@^3.1.1, readable-stream@^3.4.0: util-deprecate "^1.0.1" readable-stream@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.5.2.tgz#9e7fc4c45099baeed934bff6eb97ba6cf2729e09" - integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== + version "4.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.6.0.tgz#ce412dfb19c04efde1c5936d99c27f37a1ff94c9" + integrity sha512-cbAdYt0VcnpN2Bekq7PU+k363ZRsPwJoEEJOEtSJQlJXzwaxt3FIo/uL+KeDSGIjJqtkwyge4KQgD2S2kd+CQw== dependencies: abort-controller "^3.0.0" buffer "^6.0.3" @@ -9739,6 +9906,20 @@ recast@^0.23.1: tiny-invariant "^1.3.3" tslib "^2.0.1" +reflect.getprototypeof@^1.0.6, reflect.getprototypeof@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.9.tgz#c905f3386008de95a62315f3ea8630404be19e2f" + integrity sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + dunder-proto "^1.0.1" + es-abstract "^1.23.6" + es-errors "^1.3.0" + get-intrinsic "^1.2.6" + gopd "^1.2.0" + which-builtin-type "^1.2.1" + regenerate-unicode-properties@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" @@ -9778,7 +9959,7 @@ regexp.prototype.flags@^1.5.1, regexp.prototype.flags@^1.5.3: es-errors "^1.3.0" set-function-name "^2.0.2" -regexpu-core@^6.1.1: +regexpu-core@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== @@ -9926,16 +10107,16 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve.exports@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" - integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" + integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== resolve@^1.10.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.22.8: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== dependencies: - is-core-module "^2.13.0" + is-core-module "^2.16.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -9993,30 +10174,31 @@ rimraf@~2.6.2: fsevents "~2.3.2" rollup@^4.20.0: - version "4.27.3" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.27.3.tgz#078ecb20830c1de1f5486607f3e2f490269fb98a" - integrity sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ== + version "4.28.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.28.1.tgz#7718ba34d62b449dfc49adbfd2f312b4fe0df4de" + integrity sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg== dependencies: "@types/estree" "1.0.6" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.27.3" - "@rollup/rollup-android-arm64" "4.27.3" - "@rollup/rollup-darwin-arm64" "4.27.3" - "@rollup/rollup-darwin-x64" "4.27.3" - "@rollup/rollup-freebsd-arm64" "4.27.3" - "@rollup/rollup-freebsd-x64" "4.27.3" - "@rollup/rollup-linux-arm-gnueabihf" "4.27.3" - "@rollup/rollup-linux-arm-musleabihf" "4.27.3" - "@rollup/rollup-linux-arm64-gnu" "4.27.3" - "@rollup/rollup-linux-arm64-musl" "4.27.3" - "@rollup/rollup-linux-powerpc64le-gnu" "4.27.3" - "@rollup/rollup-linux-riscv64-gnu" "4.27.3" - "@rollup/rollup-linux-s390x-gnu" "4.27.3" - "@rollup/rollup-linux-x64-gnu" "4.27.3" - "@rollup/rollup-linux-x64-musl" "4.27.3" - "@rollup/rollup-win32-arm64-msvc" "4.27.3" - "@rollup/rollup-win32-ia32-msvc" "4.27.3" - "@rollup/rollup-win32-x64-msvc" "4.27.3" + "@rollup/rollup-android-arm-eabi" "4.28.1" + "@rollup/rollup-android-arm64" "4.28.1" + "@rollup/rollup-darwin-arm64" "4.28.1" + "@rollup/rollup-darwin-x64" "4.28.1" + "@rollup/rollup-freebsd-arm64" "4.28.1" + "@rollup/rollup-freebsd-x64" "4.28.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.28.1" + "@rollup/rollup-linux-arm-musleabihf" "4.28.1" + "@rollup/rollup-linux-arm64-gnu" "4.28.1" + "@rollup/rollup-linux-arm64-musl" "4.28.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.28.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.28.1" + "@rollup/rollup-linux-riscv64-gnu" "4.28.1" + "@rollup/rollup-linux-s390x-gnu" "4.28.1" + "@rollup/rollup-linux-x64-gnu" "4.28.1" + "@rollup/rollup-linux-x64-musl" "4.28.1" + "@rollup/rollup-win32-arm64-msvc" "4.28.1" + "@rollup/rollup-win32-ia32-msvc" "4.28.1" + "@rollup/rollup-win32-x64-msvc" "4.28.1" fsevents "~2.3.2" rrweb-cssom@^0.7.1: @@ -10043,14 +10225,15 @@ rxjs@^7.2.0, rxjs@^7.5.1: dependencies: tslib "^2.1.0" -safe-array-concat@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" - integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== +safe-array-concat@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.3.tgz#c9e54ec4f603b0bbb8e7e5007a5ee7aecd1538c3" + integrity sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== dependencies: - call-bind "^1.0.7" - get-intrinsic "^1.2.4" - has-symbols "^1.0.3" + call-bind "^1.0.8" + call-bound "^1.0.2" + get-intrinsic "^1.2.6" + has-symbols "^1.1.0" isarray "^2.0.5" safe-buffer@5.1.1: @@ -10068,14 +10251,14 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex-test@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" - integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== +safe-regex-test@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1" + integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== dependencies: - call-bind "^1.0.6" + call-bound "^1.0.2" es-errors "^1.3.0" - is-regex "^1.1.4" + is-regex "^1.2.1" "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" @@ -10180,7 +10363,7 @@ serve-static@1.16.2: parseurl "~1.3.3" send "0.19.0" -set-function-length@^1.2.1: +set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== @@ -10226,15 +10409,45 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -side-channel@^1.0.4, side-channel@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" - integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.0.tgz#10cb5984263115d3b7a0e336591e290a830af8ad" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== dependencies: - call-bind "^1.0.7" es-errors "^1.3.0" - get-intrinsic "^1.2.4" - object-inspect "^1.13.1" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.4, side-channel@^1.0.6, side-channel@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.0.tgz#c3fcff9c4da932784873335ec9765fa94ff66bc9" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: version "3.0.7" @@ -10380,11 +10593,12 @@ statuses@2.0.1: integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== stop-iteration-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" - integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad" + integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== dependencies: - internal-slot "^1.0.4" + es-errors "^1.3.0" + internal-slot "^1.1.0" store2@^2.12.0, store2@^2.14.2: version "2.14.3" @@ -10404,9 +10618,9 @@ stream-to-array@^2.3.0: any-promise "^1.1.0" streamx@^2.15.0: - version "2.20.2" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.20.2.tgz#6a8911959d6f307c19781a1d19ecd94b5f042d78" - integrity sha512-aDGDLU+j9tJcUdPGOaHmVF1u/hhI+CsGkT02V3OKlHDV7IukOI+nTWAGkiZEKCO35rWN1wIr4tS7YFr1f4qSvA== + version "2.21.1" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.21.1.tgz#f02979d8395b6b637d08a589fb514498bed55845" + integrity sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw== dependencies: fast-fifo "^1.3.2" queue-tick "^1.0.1" @@ -10427,16 +10641,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -10454,22 +10659,26 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trim@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" - integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== +string.prototype.trim@^1.2.10: + version "1.2.10" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz#40b2dd5ee94c959b4dcfb1d65ce72e90da480c81" + integrity sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.2" + define-data-property "^1.1.4" define-properties "^1.2.1" - es-abstract "^1.23.0" + es-abstract "^1.23.5" es-object-atoms "^1.0.0" + has-property-descriptors "^1.0.2" -string.prototype.trimend@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" - integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== +string.prototype.trimend@^1.0.8, string.prototype.trimend@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz#62e2731272cd285041b36596054e9f66569b6942" + integrity sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.2" define-properties "^1.2.1" es-object-atoms "^1.0.0" @@ -10505,7 +10714,7 @@ stringify-object@^3.2.1, stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -10519,13 +10728,6 @@ strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -10621,9 +10823,9 @@ synchronous-promise@^2.0.15: integrity sha512-AsS729u2RHUfEra9xJrE39peJcc2stq2+poBXX8bcM08Y6g9j/i/PUzwNQqkaJde7Ntg1TO7bSREbR5sdosQ+g== table@^6.6.0, table@^6.8.1: - version "6.8.2" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.2.tgz#c5504ccf201213fa227248bdc8c5569716ac6c58" - integrity sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA== + version "6.9.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.9.0.tgz#50040afa6264141c7566b3b81d4d82c47a8668f5" + integrity sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A== dependencies: ajv "^8.0.1" lodash.truncate "^4.4.2" @@ -10632,9 +10834,9 @@ table@^6.6.0, table@^6.8.1: strip-ansi "^6.0.1" tailwind-merge@^2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.4.tgz#4bf574e81fa061adeceba099ae4df56edcee78d1" - integrity sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q== + version "2.5.5" + resolved "https://registry.yarnpkg.com/tailwind-merge/-/tailwind-merge-2.5.5.tgz#98167859b856a2a6b8d2baf038ee171b9d814e39" + integrity sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA== tailwindcss-animate@^1.0.7: version "1.0.7" @@ -10742,9 +10944,11 @@ test-exclude@^6.0.0: minimatch "^3.0.4" text-decoder@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.1.tgz#e173f5121d97bfa3ff8723429ad5ba92e1ead67e" - integrity sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ== + version "1.2.3" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.3.tgz#b19da364d981b2326d5f43099c310cc80d770c65" + integrity sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA== + dependencies: + b4a "^1.6.4" text-table@^0.2.0: version "0.2.0" @@ -10769,17 +10973,17 @@ tiny-invariant@^1.3.1, tiny-invariant@^1.3.3: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.3.tgz#46680b7a873a0d5d10005995eb90a70d74d60127" integrity sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg== -tldts-core@^6.1.62: - version "6.1.62" - resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.62.tgz#4568182465aa84dd14404ccbae0e8d82364ed25d" - integrity sha512-ohONqbfobpuaylhqFbtCzc0dFFeNz85FVKSesgT8DS9OV3a25Yj730pTj7/dDtCqmgoCgEj6gDiU9XxgHKQlBw== +tldts-core@^6.1.69: + version "6.1.69" + resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-6.1.69.tgz#079ffcac8a4407bc74567e292aecf30b943674e1" + integrity sha512-nygxy9n2PBUFQUtAXAc122gGo+04/j5qr5TGQFZTHafTKYvmARVXt2cA5rgero2/dnXUfkdPtiJoKmrd3T+wdA== tldts@^6.1.32: - version "6.1.62" - resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.62.tgz#f66eaabce34287faf4d9ef7111781226aa001dbd" - integrity sha512-TF+wo3MgTLbf37keEwQD0IxvOZO8UZxnpPJDg5iFGAASGxYzbX/Q0y944ATEjrfxG/pF1TWRHCPbFp49Mz1Y1w== + version "6.1.69" + resolved "https://registry.yarnpkg.com/tldts/-/tldts-6.1.69.tgz#0fe1fcb1ad09510459693e72f96062cee2411f1f" + integrity sha512-Oh/CqRQ1NXNY7cy9NkTPUauOWiTro0jEYZTioGbOmcQh6EC45oribyIMJp0OJO3677r13tO6SKdWoGZUx2BDFw== dependencies: - tldts-core "^6.1.62" + tldts-core "^6.1.69" tmp@^0.0.33: version "0.0.33" @@ -10853,9 +11057,9 @@ tr46@~0.0.3: integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== ts-api-utils@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.0.tgz#709c6f2076e511a81557f3d07a0cbd566ae8195c" - integrity sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ== + version "1.4.3" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" + integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== ts-dedent@^2.0.0, ts-dedent@^2.2.0: version "2.2.0" @@ -10863,14 +11067,14 @@ ts-dedent@^2.0.0, ts-dedent@^2.2.0: integrity sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ== ts-graphviz@^2.1.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-2.1.4.tgz#16db94dc83a7a7b5af6f5b113cd26c0c56c7f9f8" - integrity sha512-0g465/ES70H0h5rcLUqaenKqNYekQaR9W0m0xUGy3FxueGujpGr+0GN2YWlgLIYSE2Xg0W7Uq1Qqnn7Cg+Af2w== + version "2.1.5" + resolved "https://registry.yarnpkg.com/ts-graphviz/-/ts-graphviz-2.1.5.tgz#8b050f5b0632e91eee4225dfece6e4df21c375f4" + integrity sha512-IigMCo40QZvyyURRdYFh0DV6DGDt7OqkPM/TBGXSJKfNKnYmOfRg0tzSlnJS1TQCWFSTEtpBQsqmAZcziXJrWg== dependencies: - "@ts-graphviz/adapter" "^2.0.5" - "@ts-graphviz/ast" "^2.0.5" - "@ts-graphviz/common" "^2.1.4" - "@ts-graphviz/core" "^2.0.5" + "@ts-graphviz/adapter" "^2.0.6" + "@ts-graphviz/ast" "^2.0.6" + "@ts-graphviz/common" "^2.1.5" + "@ts-graphviz/core" "^2.0.6" ts-jest@^29.2.5: version "29.2.5" @@ -10930,7 +11134,7 @@ tslib@^1.13.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0: +tslib@^2.0.0, tslib@^2.0.1, tslib@^2.1.0, tslib@^2.4.0: version "2.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== @@ -10995,9 +11199,9 @@ type-fest@^3.11.0, type-fest@^3.8.0: integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-fest@^4.18.2: - version "4.28.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.28.0.tgz#ee4b007cbd1db07aed98b19faa0a2852a8006162" - integrity sha512-jXMwges/FVbFRe5lTMJZVEZCrO9kI9c8k0PA/z7nF3bo0JSCCLysvokFjNPIUK/itEMas10MQM+AiHoHt/T/XA== + version "4.30.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.30.2.tgz#d94429edde1f7deacf554741650aab394197a4cc" + integrity sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig== type-is@~1.6.18: version "1.6.18" @@ -11008,48 +11212,49 @@ type-is@~1.6.18: mime-types "~2.1.24" typed-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" - integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536" + integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== dependencies: - call-bind "^1.0.7" + call-bound "^1.0.3" es-errors "^1.3.0" - is-typed-array "^1.1.13" + is-typed-array "^1.1.14" typed-array-byte-length@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" - integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce" + integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== dependencies: - call-bind "^1.0.7" + call-bind "^1.0.8" for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.14" -typed-array-byte-offset@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" - integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== +typed-array-byte-offset@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355" + integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== dependencies: available-typed-arrays "^1.0.7" - call-bind "^1.0.7" + call-bind "^1.0.8" for-each "^0.3.3" - gopd "^1.0.1" - has-proto "^1.0.3" - is-typed-array "^1.1.13" + gopd "^1.2.0" + has-proto "^1.2.0" + is-typed-array "^1.1.15" + reflect.getprototypeof "^1.0.9" -typed-array-length@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" - integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== +typed-array-length@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.7.tgz#ee4deff984b64be1e118b0de8c9c877d5ce73d3d" + integrity sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== dependencies: call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-proto "^1.0.3" is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" + reflect.getprototypeof "^1.0.6" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -11064,9 +11269,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@^5.4.4, typescript@^5.4.5, typescript@^5.5.4, typescript@^5.6.2: - version "5.6.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" - integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== + version "5.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== typescript@~4.7.0: version "4.7.4" @@ -11089,19 +11294,19 @@ uglify-js@^3.1.4: integrity sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ== unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2" + integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== dependencies: - call-bind "^1.0.2" + call-bound "^1.0.3" has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" + has-symbols "^1.1.0" + which-boxed-primitive "^1.1.1" -undici-types@~6.19.8: - version "6.19.8" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" - integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.1" @@ -11245,6 +11450,13 @@ url-parse@^1.4.3: querystringify "^2.1.1" requires-port "^1.0.0" +use-callback-ref@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.3.3.tgz#98d9fab067075841c5b2c6852090d5d0feabe2bf" + integrity sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg== + dependencies: + tslib "^2.0.0" + use-resize-observer@^9.1.0: version "9.1.0" resolved "https://registry.yarnpkg.com/use-resize-observer/-/use-resize-observer-9.1.0.tgz#14735235cf3268569c1ea468f8a90c5789fc5c6c" @@ -11252,6 +11464,14 @@ use-resize-observer@^9.1.0: dependencies: "@juggle/resize-observer" "^3.3.1" +use-sidecar@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/use-sidecar/-/use-sidecar-1.1.3.tgz#10e7fd897d130b896e2c546c63a5e8233d00efdb" + integrity sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -11429,9 +11649,9 @@ whatwg-mimetype@^4.0.0: integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== whatwg-url@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.0.0.tgz#00baaa7fd198744910c4b1ef68378f2200e4ceb6" - integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw== + version "14.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.1.0.tgz#fffebec86cc8e6c2a657e50dc606207b870f0ab3" + integrity sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w== dependencies: tr46 "^5.0.0" webidl-conversions "^7.0.0" @@ -11444,18 +11664,37 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== +which-boxed-primitive@^1.0.2, which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e" + integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" + is-bigint "^1.1.0" + is-boolean-object "^1.2.1" + is-number-object "^1.1.1" + is-string "^1.1.1" + is-symbol "^1.1.1" -which-collection@^1.0.1: +which-builtin-type@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e" + integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== + dependencies: + call-bound "^1.0.2" + function.prototype.name "^1.1.6" + has-tostringtag "^1.0.2" + is-async-function "^2.0.0" + is-date-object "^1.1.0" + is-finalizationregistry "^1.1.0" + is-generator-function "^1.0.10" + is-regex "^1.2.1" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.1.0" + which-collection "^1.0.2" + which-typed-array "^1.1.16" + +which-collection@^1.0.1, which-collection@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0" integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== @@ -11470,15 +11709,16 @@ which-pm-runs@^1.0.0: resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== -which-typed-array@^1.1.13, which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.2: - version "1.1.15" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" - integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== +which-typed-array@^1.1.13, which-typed-array@^1.1.16, which-typed-array@^1.1.2: + version "1.1.18" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.18.tgz#df2389ebf3fbb246a71390e90730a9edb6ce17ad" + integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== dependencies: available-typed-arrays "^1.0.7" - call-bind "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" for-each "^0.3.3" - gopd "^1.0.1" + gopd "^1.2.0" has-tostringtag "^1.0.2" which@^1.2.14: @@ -11512,7 +11752,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -11530,15 +11770,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"