From f06a5ccacdb37c3bb1fd52cdba41fa17dd36a3cc Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Thu, 11 Dec 2025 14:50:56 +0100 Subject: [PATCH] Remove sync metadata from upgrade (#16491) # Introduction Related https://github.com/twentyhq/core-team-issues/issues/1910 From now on the upgrade won't integrate any sync metadata as it's going to be deprecated very soon Any updates to about to removes workspace-entity or standard flat entity will require a dedicated upgrade command, what we've already started doing during the 1.13 sprint, until we have totally migrated the v2 to be workspace agnostic --- .../__tests__/upgrade.command-runner.spec.ts | 85 +- .../command-runners/upgrade.command-runner.ts | 36 +- ...-add-workflow-run-stop-statuses.command.ts | 146 - ...ate-operation-field-metadata-id.command.ts | 114 - ...tadata-id-foreign-key-migration.command.ts | 57 - .../1-10/1-10-flush-cache.command.ts | 34 - ...sure-dashboard-naming-available.command.ts | 81 - ...attachment-author-to-created-by.command.ts | 108 - ...ttachment-type-to-file-category.command.ts | 88 - ...hannel-partial-full-sync-stages.command.ts | 134 - .../1-10-regenerate-search-vectors.command.ts | 425 --- .../1-10/1-10-seed-dashboard-view.command.ts | 132 - .../1-10-upgrade-version-command.module.ts | 71 - ...-11-clean-orphaned-role-targets.command.ts | 93 - ...-clean-orphaned-user-workspaces.command.ts | 100 - ...ate-twenty-standard-application.command.ts | 77 - .../1-11-upgrade-version-command.module.ts | 46 - ...nts-import-scheduled-sync-stage.command.ts | 259 -- ...ges-import-scheduled-sync-stage.command.ts | 256 -- .../1-12/1-12-clean-null-equivalent-values.ts | 273 -- ...te-workspace-custom-application.command.ts | 74 - ...d-application-not-uninstallable.command.ts | 62 - .../1-12-upgrade-version-command.module.ts | 57 - ...ation-id-non-nullable-migration.command.ts | 72 - ...ommand.ts => 1-13-rename-index.command.ts} | 0 .../1-13-upgrade-version-command.module.ts | 2 +- ...ntifier-position-and-visibility.command.ts | 132 - .../1-6/1-6-upgrade-version-command.module.ts | 32 - ...low-manual-trigger-availability.command.ts | 85 - .../1-7/1-7-upgrade-version-command.module.ts | 13 - .../1-8-deduplicate-unique-fields.command.ts | 371 -- ...ll-serverless-function-layer-id.command.ts | 3363 ----------------- ...1-8-migrate-channel-sync-stages.command.ts | 489 --- ...rate-workflow-step-filter-operand-value.ts | 126 - ...erson-search-vector-with-phones.command.ts | 174 - .../1-8/1-8-upgrade-version-command.module.ts | 52 - .../upgrade-version-command.module.ts | 14 - .../upgrade.command.ts | 156 +- 38 files changed, 34 insertions(+), 7855 deletions(-) delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-add-workflow-run-stop-statuses.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-clean-orphaned-kanban-aggregate-operation-field-metadata-id.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-create-view-kanban-field-metadata-id-foreign-key-migration.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-flush-cache.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-make-sure-dashboard-naming-available.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-author-to-created-by.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-type-to-file-category.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-channel-partial-full-sync-stages.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-regenerate-search-vectors.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-seed-dashboard-view.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-upgrade-version-command.module.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-role-targets.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-user-workspaces.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-create-twenty-standard-application.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-upgrade-version-command.module.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-add-calendar-events-import-scheduled-sync-stage.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-add-messages-import-scheduled-sync-stage.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-clean-null-equivalent-values.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-create-workspace-custom-application.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-set-standard-application-not-uninstallable.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-upgrade-version-command.module.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-workspace-custom-application-id-non-nullable-migration.command.ts rename packages/twenty-server/src/database/commands/upgrade-version-command/1-13/{1-13-rename-unique-index.command.ts => 1-13-rename-index.command.ts} (100%) delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-6/1-6-fix-label-identifier-position-and-visibility.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-6/1-6-upgrade-version-command.module.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-7/1-7-backfill-workflow-manual-trigger-availability.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-7/1-7-upgrade-version-command.module.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-deduplicate-unique-fields.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-fill-null-serverless-function-layer-id.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-migrate-channel-sync-stages.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-migrate-workflow-step-filter-operand-value.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-regenerate-person-search-vector-with-phones.command.ts delete mode 100644 packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-upgrade-version-command.module.ts diff --git a/packages/twenty-server/src/database/commands/command-runners/__tests__/upgrade.command-runner.spec.ts b/packages/twenty-server/src/database/commands/command-runners/__tests__/upgrade.command-runner.spec.ts index 0381ad9334d..f651bec5521 100644 --- a/packages/twenty-server/src/database/commands/command-runners/__tests__/upgrade.command-runner.spec.ts +++ b/packages/twenty-server/src/database/commands/command-runners/__tests__/upgrade.command-runner.spec.ts @@ -13,31 +13,18 @@ import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twent import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command'; class BasicUpgradeCommandRunner extends UpgradeCommandRunner { allCommands = { - '1.0.0': { - beforeSyncMetadata: [], - afterSyncMetadata: [], - }, - '2.0.0': { - beforeSyncMetadata: [], - afterSyncMetadata: [], - }, + '1.0.0': [], + '2.0.0': [], }; } class InvalidUpgradeCommandRunner extends UpgradeCommandRunner { allCommands = { - invalid: { - beforeSyncMetadata: [], - afterSyncMetadata: [], - }, - '2.0.0': { - beforeSyncMetadata: [], - afterSyncMetadata: [], - }, + invalid: [], + '2.0.0': [], }; } @@ -86,14 +73,12 @@ const buildUpgradeCommandModule = async ({ twentyConfigService: TwentyConfigService, globalWorkspaceOrmManager: GlobalWorkspaceOrmManager, dataSourceService: DataSourceService, - syncWorkspaceMetadataCommand: SyncWorkspaceMetadataCommand, ) => { return new commandRunner( workspaceRepository, twentyConfigService, globalWorkspaceOrmManager, dataSourceService, - syncWorkspaceMetadataCommand, ); }, inject: [ @@ -101,7 +86,6 @@ const buildUpgradeCommandModule = async ({ TwentyConfigService, GlobalWorkspaceOrmManager, DataSourceService, - SyncWorkspaceMetadataCommand, ], }, { @@ -146,12 +130,6 @@ const buildUpgradeCommandModule = async ({ provide: DataSourceService, useValue: mockDataSourceService, }, - { - provide: SyncWorkspaceMetadataCommand, - useValue: { - runOnWorkspace: jest.fn(), - }, - }, ], }).compile(); @@ -161,9 +139,6 @@ const buildUpgradeCommandModule = async ({ describe('UpgradeCommandRunner', () => { let upgradeCommandRunner: BasicUpgradeCommandRunner; let workspaceRepository: Repository; - let syncWorkspaceMetadataCommand: jest.Mocked; - let runAfterSyncMetadataSpy: jest.SpyInstance; - let runBeforeSyncMetadataSpy: jest.SpyInstance; let runCoreMigrationsSpy: jest.SpyInstance; let globalWorkspaceOrmManagerSpy: GlobalWorkspaceOrmManager; @@ -201,14 +176,6 @@ describe('UpgradeCommandRunner', () => { jest.spyOn(upgradeCommandRunner['logger'], 'error').mockImplementation(); jest.spyOn(upgradeCommandRunner['logger'], 'warn').mockImplementation(); - runBeforeSyncMetadataSpy = jest.spyOn( - upgradeCommandRunner, - 'runBeforeSyncMetadata', - ); - runAfterSyncMetadataSpy = jest.spyOn( - upgradeCommandRunner, - 'runAfterSyncMetadata', - ); jest.spyOn(upgradeCommandRunner, 'runOnWorkspace'); runCoreMigrationsSpy = jest .spyOn(upgradeCommandRunner, 'runCoreMigrations') @@ -217,7 +184,6 @@ describe('UpgradeCommandRunner', () => { workspaceRepository = module.get>( getRepositoryToken(WorkspaceEntity), ); - syncWorkspaceMetadataCommand = module.get(SyncWorkspaceMetadataCommand); globalWorkspaceOrmManagerSpy = module.get( GlobalWorkspaceOrmManager, ); @@ -253,12 +219,9 @@ describe('UpgradeCommandRunner', () => { upgradeCommandRunner.runOnWorkspace, ].forEach((fn) => expect(fn).toHaveBeenCalledTimes(1)); - [ - upgradeCommandRunner.runBeforeSyncMetadata, - syncWorkspaceMetadataCommand.runOnWorkspace, - upgradeCommandRunner.runAfterSyncMetadata, - workspaceRepository.update, - ].forEach((fn) => expect(fn).not.toHaveBeenCalled()); + [workspaceRepository.update].forEach((fn) => + expect(fn).not.toHaveBeenCalled(), + ); }); it('should run upgrade over several workspaces', async () => { @@ -278,9 +241,6 @@ describe('UpgradeCommandRunner', () => { [ upgradeCommandRunner.runOnWorkspace, - upgradeCommandRunner.runBeforeSyncMetadata, - upgradeCommandRunner.runAfterSyncMetadata, - syncWorkspaceMetadataCommand.runOnWorkspace, globalWorkspaceOrmManagerSpy.destroyDataSourceForWorkspace, ].forEach((fn) => expect(fn).toHaveBeenCalledTimes(numberOfWorkspace)); expect(workspaceRepository.update).toHaveBeenNthCalledWith( @@ -292,35 +252,6 @@ describe('UpgradeCommandRunner', () => { expect(upgradeCommandRunner.migrationReport.fail.length).toBe(0); }); - it('should run syncMetadataCommand betweensuccessful beforeSyncMetadataUpgradeCommandsToRun and afterSyncMetadataUpgradeCommandsToRun', async () => { - await buildModuleAndSetupSpies({}); - // @ts-expect-error legacy noImplicitAny - const passedParams = []; - const options = {}; - - // @ts-expect-error legacy noImplicitAny - await upgradeCommandRunner.run(passedParams, options); - - [ - upgradeCommandRunner.runOnWorkspace, - upgradeCommandRunner.runBeforeSyncMetadata, - upgradeCommandRunner.runAfterSyncMetadata, - syncWorkspaceMetadataCommand.runOnWorkspace, - globalWorkspaceOrmManagerSpy.destroyDataSourceForWorkspace, - ].forEach((fn) => expect(fn).toHaveBeenCalledTimes(1)); - - // Verify order of execution - const beforeSyncCall = runBeforeSyncMetadataSpy.mock.invocationCallOrder[0]; - const afterSyncCall = runAfterSyncMetadataSpy.mock.invocationCallOrder[0]; - const syncMetadataCall = - syncWorkspaceMetadataCommand.runOnWorkspace.mock.invocationCallOrder[0]; - - expect(beforeSyncCall).toBeLessThan(syncMetadataCall); - expect(syncMetadataCall).toBeLessThan(afterSyncCall); - expect(upgradeCommandRunner.migrationReport.success.length).toBe(1); - expect(upgradeCommandRunner.migrationReport.fail.length).toBe(0); - }); - describe('Workspace upgrade should succeed ', () => { const successfulTestUseCases: EachTestingContext<{ input: Omit; @@ -379,8 +310,6 @@ describe('UpgradeCommandRunner', () => { expect(failReport.length).toBe(0); expect(successReport.length).toBe(1); expect(runCoreMigrationsSpy).toHaveBeenCalledTimes(1); - expect(runAfterSyncMetadataSpy).toHaveBeenCalledTimes(1); - expect(runBeforeSyncMetadataSpy).toHaveBeenCalledTimes(1); const { workspaceId } = successReport[0]; expect(workspaceId).toBe('workspace_0'); diff --git a/packages/twenty-server/src/database/commands/command-runners/upgrade.command-runner.ts b/packages/twenty-server/src/database/commands/command-runners/upgrade.command-runner.ts index 11c4fcc90a7..1012a260951 100644 --- a/packages/twenty-server/src/database/commands/command-runners/upgrade.command-runner.ts +++ b/packages/twenty-server/src/database/commands/command-runners/upgrade.command-runner.ts @@ -21,23 +21,16 @@ import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twent import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { type DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command'; import { type CompareVersionMajorAndMinorReturnType, compareVersionMajorAndMinor, } from 'src/utils/version/compare-version-minor-and-major'; import { getPreviousVersion } from 'src/utils/version/get-previous-version'; -export type VersionCommands = { - beforeSyncMetadata: ( - | WorkspacesMigrationCommandRunner - | ActiveOrSuspendedWorkspacesMigrationCommandRunner - )[]; - afterSyncMetadata: ( - | WorkspacesMigrationCommandRunner - | ActiveOrSuspendedWorkspacesMigrationCommandRunner - )[]; -}; +export type VersionCommands = ( + | WorkspacesMigrationCommandRunner + | ActiveOrSuspendedWorkspacesMigrationCommandRunner +)[]; export type AllCommands = Record; const execPromise = promisify(exec); @@ -54,7 +47,6 @@ export abstract class UpgradeCommandRunner extends ActiveOrSuspendedWorkspacesMi protected readonly twentyConfigService: TwentyConfigService, protected readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager, protected readonly dataSourceService: DataSourceService, - protected readonly syncWorkspaceMetadataCommand: SyncWorkspaceMetadataCommand, ) { super(workspaceRepository, globalWorkspaceOrmManager, dataSourceService); } @@ -184,7 +176,7 @@ export abstract class UpgradeCommandRunner extends ActiveOrSuspendedWorkspacesMi 'Initialized upgrade context with:', `- currentVersion (migrating to): ${currentAppVersion}`, `- fromWorkspaceVersion: ${previousVersion}`, - `- ${this.commands.beforeSyncMetadata.length + this.commands.afterSyncMetadata.length} commands`, + `- ${this.commands.length} commands`, ]; this.logger.log(chalk.blue(message.join('\n '))); @@ -269,9 +261,9 @@ If any workspaces are not on the previous minor version, roll back to that versi ); } case 'equal': { - await this.runBeforeSyncMetadata(args); - await this.syncWorkspaceMetadataCommand.runOnWorkspace(args); - await this.runAfterSyncMetadata(args); + for (const command of this.commands) { + await command.runOnWorkspace(args); + } if (!options.dryRun) { await this.workspaceRepository.update( @@ -303,18 +295,6 @@ If any workspaces are not on the previous minor version, roll back to that versi } } - public readonly runBeforeSyncMetadata = async (args: RunOnWorkspaceArgs) => { - for (const command of this.commands.beforeSyncMetadata) { - await command.runOnWorkspace(args); - } - }; - - public readonly runAfterSyncMetadata = async (args: RunOnWorkspaceArgs) => { - for (const command of this.commands.afterSyncMetadata) { - await command.runOnWorkspace(args); - } - }; - private retrieveCurrentAppVersion() { const appVersion = this.twentyConfigService.get('APP_VERSION'); diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-add-workflow-run-stop-statuses.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-add-workflow-run-stop-statuses.command.ts deleted file mode 100644 index e9958e8d921..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-add-workflow-run-stop-statuses.command.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { DataSource, Repository } from 'typeorm'; -import { v4 } from 'uuid'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { FieldMetadataComplexOption } from 'src/engine/metadata-modules/field-metadata/dtos/options.input'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { WORKFLOW_RUN_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; -import { WorkflowRunStatus } from 'src/modules/workflow/common/standard-objects/workflow-run.workspace-entity'; - -@Command({ - name: 'upgrade:1-10:add-workflow-run-stop-statuses', - description: 'Add stopped and stopping statuses to workflow runs', -}) -export class AddWorkflowRunStopStatusesCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(FieldMetadataEntity) - private readonly fieldMetadataRepository: Repository, - @InjectDataSource() - private readonly coreDataSource: DataSource, - ) { - super(workspaceRepository, globalWorkspaceOrmManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Adding stopped and stopping statuses to workflow runs for workspace ${workspaceId}`, - ); - - const workflowRunStatusFieldMetadata = - await this.fieldMetadataRepository.findOne({ - where: { - standardId: WORKFLOW_RUN_STANDARD_FIELD_IDS.status, - workspaceId, - }, - }); - - if (!workflowRunStatusFieldMetadata) { - this.logger.error( - `Workflow run status field metadata not found for workspace ${workspaceId}`, - ); - - return; - } - - const workflowRunStatusFieldMetadataOptions = - workflowRunStatusFieldMetadata.options; - - if (options.dryRun) { - this.logger.log( - `Would add stopped and stopping statuses to workflow run status field metadata for workspace ${workspaceId}`, - ); - } else { - const workflowRunStatusFieldMetadataOptionsSpecificStoppingAndStoppedTreatment = - workflowRunStatusFieldMetadataOptions?.filter( - (option) => - option.value !== WorkflowRunStatus.STOPPED && - option.value !== WorkflowRunStatus.STOPPING, - ) as FieldMetadataComplexOption[]; - - workflowRunStatusFieldMetadataOptionsSpecificStoppingAndStoppedTreatment?.push( - { - id: v4(), - value: WorkflowRunStatus.STOPPING, - label: 'Stopping', - position: 5, - color: 'orange', - }, - ); - workflowRunStatusFieldMetadataOptionsSpecificStoppingAndStoppedTreatment?.push( - { - id: v4(), - value: WorkflowRunStatus.STOPPED, - label: 'Stopped', - position: 6, - color: 'gray', - }, - ); - - await this.fieldMetadataRepository.save({ - ...workflowRunStatusFieldMetadata, - options: - workflowRunStatusFieldMetadataOptionsSpecificStoppingAndStoppedTreatment, - }); - - this.logger.log( - `Stopped and stopping statuses added to workflow run status field metadata for workspace ${workspaceId}`, - ); - } - - if ( - workflowRunStatusFieldMetadataOptions?.some( - (option) => - option.value === WorkflowRunStatus.STOPPED || - option.value === WorkflowRunStatus.STOPPING, - ) - ) { - this.logger.log( - `We do not want to re-run the workspace command for those already added`, - ); - - return; - } - - const schemaName = getWorkspaceSchemaName(workspaceId); - - if (options.dryRun) { - this.logger.log( - `Would try to add stopped and stopping statuses to workflow run status enum for workspace ${workspaceId}`, - ); - } else { - try { - await this.coreDataSource.query( - `ALTER TYPE ${schemaName}."workflowRun_status_enum" ADD VALUE 'STOPPING'`, - ); - this.logger.log( - `Stopping status added to workflow run status enum for workspace ${workspaceId}`, - ); - await this.coreDataSource.query( - `ALTER TYPE ${schemaName}."workflowRun_status_enum" ADD VALUE 'STOPPED'`, - ); - this.logger.log( - `Stopped status added to workflow run status enum for workspace ${workspaceId}`, - ); - } catch (error) { - this.logger.error( - `Error adding stopped and stopping statuses to workflow run status enum for workspace ${workspaceId}: ${error}`, - ); - } - } - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-clean-orphaned-kanban-aggregate-operation-field-metadata-id.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-clean-orphaned-kanban-aggregate-operation-field-metadata-id.command.ts deleted file mode 100644 index e51afb6b998..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-clean-orphaned-kanban-aggregate-operation-field-metadata-id.command.ts +++ /dev/null @@ -1,114 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { isDefined } from 'twenty-shared/utils'; -import { In, IsNull, Not, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { ViewType } from 'src/engine/metadata-modules/view/enums/view-type.enum'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -@Command({ - name: 'upgrade:1-10:clean-orphaned-kanban-aggregate-operation-field-metadata-id', - description: - "Delete all kanbanAggregateOperationFieldMetadataId in views that don't map to a real fieldMetadata (this is because we want to introduce a FK later)", -}) -export class CleanOrphanedKanbanAggregateOperationFieldMetadataIdCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(ViewEntity) - private readonly viewRepository: Repository, - @InjectRepository(FieldMetadataEntity) - private readonly fieldMetadataRepository: Repository, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - index, - total, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `[${index + 1}/${total}] Cleaning orphaned kanbanAggregateOperationFieldMetadataId for workspace ${workspaceId}`, - ); - - const existingFieldMetadataIds = await this.fieldMetadataRepository.find({ - where: { workspaceId }, - select: ['id'], - }); - - const existingFieldMetadataIdSet = new Set( - existingFieldMetadataIds.map((fm) => fm.id), - ); - - const viewsWithOrphanedFieldMetadata = await this.viewRepository.find({ - where: { - workspaceId, - kanbanAggregateOperationFieldMetadataId: Not(IsNull()), - }, - select: ['id', 'kanbanAggregateOperationFieldMetadataId', 'type'], - }); - - const orphanedViews = viewsWithOrphanedFieldMetadata.filter( - (view) => - isDefined(view.kanbanAggregateOperationFieldMetadataId) && - !existingFieldMetadataIdSet.has( - view.kanbanAggregateOperationFieldMetadataId, - ), - ); - - if (orphanedViews.length === 0) { - this.logger.log( - 'No orphaned kanbanAggregateOperationFieldMetadataId references found', - ); - - return; - } - - const kanbanViewsToDelete = orphanedViews.filter( - (view) => view.type === ViewType.KANBAN, - ); - const otherViewsToUpdate = orphanedViews.filter( - (view) => view.type !== ViewType.KANBAN, - ); - - let deletedCount = 0; - let updatedCount = 0; - - if (!options.dryRun) { - if (kanbanViewsToDelete.length > 0) { - const kanbanViewIds = kanbanViewsToDelete.map((view) => view.id); - - await this.viewRepository.delete({ id: In(kanbanViewIds) }); - deletedCount = kanbanViewsToDelete.length; - } - - if (otherViewsToUpdate.length > 0) { - const otherViewIds = otherViewsToUpdate.map((view) => view.id); - - await this.viewRepository.update( - { id: In(otherViewIds) }, - { kanbanAggregateOperationFieldMetadataId: null }, - ); - updatedCount = otherViewsToUpdate.length; - } - } else { - deletedCount = kanbanViewsToDelete.length; - updatedCount = otherViewsToUpdate.length; - } - - this.logger.log( - `${options.dryRun ? 'DRY RUN - Would have' : ''}Deleted ${deletedCount} KANBAN views and updated ${updatedCount} other views with orphaned kanbanAggregateOperationFieldMetadataId references`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-create-view-kanban-field-metadata-id-foreign-key-migration.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-create-view-kanban-field-metadata-id-foreign-key-migration.command.ts deleted file mode 100644 index 0a996c1a58a..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-create-view-kanban-field-metadata-id-foreign-key-migration.command.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { DataSource, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -@Command({ - name: '1-10-create-view-kanban-field-metadata-id-foreign-key-migration', - description: - 'Create FK_b3cc95732479f7a1337350c398f foreign key on view kanban field metadata id column', -}) -export class CreateViewKanbanFieldMetadataIdForeignKeyMigrationCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - private hasRunOnce = false; - - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectDataSource() - private readonly coreDataSource: DataSource, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - options, - }: RunOnWorkspaceArgs): Promise { - if (this.hasRunOnce) { - this.logger.log('Skipping kanban field metadata id foreign key creation'); - - return; - } - - if (!options.dryRun) { - try { - await this.coreDataSource.query( - `ALTER TABLE "core"."view" ADD CONSTRAINT "FK_b3cc95732479f7a1337350c398f" FOREIGN KEY ("kanbanAggregateOperationFieldMetadataId") REFERENCES "core"."fieldMetadata"("id") ON DELETE CASCADE ON UPDATE NO ACTION`, - ); - this.logger.log( - 'Successfully added foreign key constraint for kanbanAggregateOperationFieldMetadataId', - ); - } catch (error) { - this.logger.log( - `Foreign key constraint already exists or could not be created (this is expected for subsequent workspaces): ${error.message}`, - ); - } - } - - this.hasRunOnce = true; - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-flush-cache.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-flush-cache.command.ts deleted file mode 100644 index f9c80afb074..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-flush-cache.command.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { WorkspaceCacheStorageService } from 'src/engine/workspace-cache-storage/workspace-cache-storage.service'; - -@Command({ - name: 'upgrade:1-10:flush-cache', - description: 'Flush cache for workspace', -}) -export class FlushCacheCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - protected readonly workspaceCacheStorageService: WorkspaceCacheStorageService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - }: RunOnWorkspaceArgs): Promise { - this.logger.log(`Flush cache for workspace ${workspaceId}`); - await this.workspaceCacheStorageService.flush(workspaceId); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-make-sure-dashboard-naming-available.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-make-sure-dashboard-naming-available.command.ts deleted file mode 100644 index 9ac9b7c8195..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-make-sure-dashboard-naming-available.command.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { isDefined } from 'twenty-shared/utils'; -import { Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -@Command({ - name: 'upgrade:1-10:make-sure-dashboard-naming-available', - description: 'Make sure the dashboard naming is available', -}) -export class MakeSureDashboardNamingAvailableCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(ObjectMetadataEntity) - private readonly objectMetadataRepository: Repository, - private readonly objectMetadataService: ObjectMetadataService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - const potentialCustomDashboardObjectMetadata = - await this.objectMetadataRepository.findOne({ - where: { - nameSingular: 'dashboard', - workspaceId, - isCustom: true, - }, - }); - - if (!isDefined(potentialCustomDashboardObjectMetadata)) { - this.logger.log( - `No custom dashboard object metadata found for workspace ${workspaceId}. Skipping...`, - ); - - return; - } - - if (options.dryRun) { - this.logger.log( - `Would have updated the dashboard object metadata for workspace ${workspaceId}. Skipping...`, - ); - - return; - } - - this.logger.log( - `Updating the dashboard object metadata for workspace ${workspaceId}...`, - ); - - await this.objectMetadataService.updateOneObject({ - workspaceId, - updateObjectInput: { - id: potentialCustomDashboardObjectMetadata.id, - update: { - nameSingular: 'myDashboard', - namePlural: 'myDashboards', - labelSingular: 'My Dashboard', - labelPlural: 'My Dashboards', - }, - }, - }); - this.logger.log( - `Updated the dashboard object metadata for workspace ${workspaceId}...`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-author-to-created-by.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-author-to-created-by.command.ts deleted file mode 100644 index d406a65bcd0..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-author-to-created-by.command.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { FieldActorSource } from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; -import { IsNull, Not, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { type AttachmentWorkspaceEntity } from 'src/modules/attachment/standard-objects/attachment.workspace-entity'; -import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; - -@Command({ - name: 'upgrade:1-10:migrate-attachment-author-to-created-by', - description: - 'Migrate attachment author field data to createdBy composite field', -}) -export class MigrateAttachmentAuthorToCreatedByCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Migrating attachment author to createdBy for workspace ${workspaceId}`, - ); - - const attachmentRepository = - await this.twentyORMGlobalManager.getRepository( - workspaceId, - 'attachment', - ); - - const workspaceMemberRepository = - await this.twentyORMGlobalManager.getRepository( - workspaceId, - 'workspaceMember', - ); - - const attachments = await attachmentRepository.find({ - where: { - authorId: Not(IsNull()), - createdBy: { - workspaceMemberId: IsNull(), - }, - }, - select: ['id', 'authorId'], - }); - - this.logger.log( - `Found ${attachments.length} attachments to migrate for workspace ${workspaceId}`, - ); - - let migratedCount = 0; - - for (const attachment of attachments) { - const { id, authorId } = attachment; - - if (!isDefined(authorId)) { - continue; - } - - const workspaceMember = await workspaceMemberRepository.findOne({ - where: { id: authorId }, - }); - - if (!isDefined(workspaceMember)) { - this.logger.warn( - `Workspace member ${authorId} not found for attachment ${id}, skipping`, - ); - continue; - } - - const firstName = workspaceMember.name?.firstName || ''; - const lastName = workspaceMember.name?.lastName || ''; - const displayName = - firstName || lastName ? `${firstName} ${lastName}`.trim() : 'Unknown'; - - await attachmentRepository.update( - { id }, - { - createdBy: { - source: FieldActorSource.MANUAL, - workspaceMemberId: workspaceMember.id, - name: displayName, - context: {}, - }, - }, - ); - - migratedCount++; - } - - this.logger.log( - `Successfully migrated ${migratedCount} attachments for workspace ${workspaceId}`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-type-to-file-category.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-type-to-file-category.command.ts deleted file mode 100644 index 1274775c356..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-type-to-file-category.command.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { isDefined } from 'twenty-shared/utils'; -import { Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { type AttachmentWorkspaceEntity } from 'src/modules/attachment/standard-objects/attachment.workspace-entity'; - -const TYPE_TO_FILE_CATEGORY_MAPPING: Record = { - Archive: 'ARCHIVE', - Audio: 'AUDIO', - Image: 'IMAGE', - Presentation: 'PRESENTATION', - Spreadsheet: 'SPREADSHEET', - TextDocument: 'TEXT_DOCUMENT', - Video: 'VIDEO', - Other: 'OTHER', -}; - -@Command({ - name: 'upgrade:1-10:migrate-attachment-type-to-file-category', - description: - 'Migrate attachment type field data to fileCategory SELECT field', -}) -export class MigrateAttachmentTypeToFileCategoryCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Migrating attachment type to fileCategory for workspace ${workspaceId}`, - ); - - const attachmentRepository = - await this.twentyORMGlobalManager.getRepository( - workspaceId, - 'attachment', - ); - - const attachments = await attachmentRepository.find({ - select: ['id', 'type'], - }); - - this.logger.log( - `Found ${attachments.length} attachments to migrate for workspace ${workspaceId}`, - ); - - let migratedCount = 0; - - for (const attachment of attachments) { - const { id, type } = attachment; - - if (!isDefined(type)) { - throw new Error(`Attachment ${id} has no type`); - } - - const fileCategory = - TYPE_TO_FILE_CATEGORY_MAPPING[type] || - TYPE_TO_FILE_CATEGORY_MAPPING.Other; - - await attachmentRepository.update( - { id }, - { - fileCategory, - }, - ); - - migratedCount++; - } - - this.logger.log( - `Successfully migrated ${migratedCount} attachments for workspace ${workspaceId}`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-channel-partial-full-sync-stages.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-channel-partial-full-sync-stages.command.ts deleted file mode 100644 index 2525360bae0..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-migrate-channel-partial-full-sync-stages.command.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { DataSource, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; - -@Command({ - name: 'upgrade:1-10:migrate-channel-partial-full-sync-stages', - description: - 'Migrate message and calendar channel partial and full sync stages', -}) -export class MigrateChannelPartialFullSyncStagesCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectDataSource() - private readonly coreDataSource: DataSource, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Migrating channel sync stages for workspace ${workspaceId}`, - ); - - const schemaName = getWorkspaceSchemaName(workspaceId); - - await this.migrateMessageChannelSyncStages( - workspaceId, - schemaName, - options, - ); - - await this.migrateCalendarChannelSyncStages( - workspaceId, - schemaName, - options, - ); - - this.logger.log( - `Successfully migrated channel sync stages for workspace ${workspaceId}`, - ); - } - - private async migrateMessageChannelSyncStages( - workspaceId: string, - schemaName: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let messageChannelUpdateResult: any; - - const tableName = 'messageChannel'; - - if (options.dryRun) { - this.logger.log( - `Would migrate deprecated messageChannel sync stages for workspace ${workspaceId}`, - ); - - return; - } - - try { - messageChannelUpdateResult = await this.coreDataSource.query( - `UPDATE "${schemaName}"."${tableName}" - SET "syncStage" = 'MESSAGE_LIST_FETCH_PENDING' - WHERE "syncStage" IN ('FULL_MESSAGE_LIST_FETCH_PENDING', 'PARTIAL_MESSAGE_LIST_FETCH_PENDING')`, - ); - } catch { - this.logger.log( - `Error (expected) while trying to migrate messageChannel sync stages for workspace ${workspaceId}, nothing to migrate`, - ); - - return; - } - - const messageChannelRowsUpdated = messageChannelUpdateResult[1] || 0; - - this.logger.log( - `Migrated ${messageChannelRowsUpdated} messageChannel records from deprecated sync stages in workspace ${workspaceId}`, - ); - } - - private async migrateCalendarChannelSyncStages( - workspaceId: string, - schemaName: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let calendarChannelUpdateResult: any; - - const tableName = 'calendarChannel'; - - if (options.dryRun) { - this.logger.log( - `Would migrate deprecated calendarChannel sync stages for workspace ${workspaceId}`, - ); - - return; - } - - try { - calendarChannelUpdateResult = await this.coreDataSource.query( - `UPDATE "${schemaName}"."${tableName}" - SET "syncStage" = 'CALENDAR_EVENT_LIST_FETCH_PENDING' - WHERE "syncStage" IN ('FULL_CALENDAR_EVENT_LIST_FETCH_PENDING', 'PARTIAL_CALENDAR_EVENT_LIST_FETCH_PENDING')`, - ); - } catch { - this.logger.log( - `Error (expected) while trying to migrate calendarChannel sync stages for workspace ${workspaceId}, nothing to migrate`, - ); - - return; - } - - const calendarChannelRowsUpdated = calendarChannelUpdateResult[1] || 0; - - this.logger.log( - `Migrated ${calendarChannelRowsUpdated} calendarChannel records from deprecated sync stages in workspace ${workspaceId}`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-regenerate-search-vectors.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-regenerate-search-vectors.command.ts deleted file mode 100644 index d698b6adba9..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-regenerate-search-vectors.command.ts +++ /dev/null @@ -1,425 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { STANDARD_OBJECT_IDS } from 'twenty-shared/metadata'; -import { DataSource, In, Repository, type QueryRunner } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { SEARCH_VECTOR_FIELD } from 'src/engine/metadata-modules/search-field-metadata/constants/search-vector-field.constants'; -import { SEARCH_FIELDS_FOR_CUSTOM_OBJECT } from 'src/engine/twenty-orm/custom.workspace-entity'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; -import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; -import { type SearchableFieldType } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/is-searchable-field.util'; -import { SEARCH_FIELDS_FOR_COMPANY } from 'src/modules/company/standard-objects/company.workspace-entity'; -import { SEARCH_FIELDS_FOR_DASHBOARD } from 'src/modules/dashboard/standard-objects/dashboard.workspace-entity'; -import { SEARCH_FIELDS_FOR_NOTES } from 'src/modules/note/standard-objects/note.workspace-entity'; -import { SEARCH_FIELDS_FOR_OPPORTUNITY } from 'src/modules/opportunity/standard-objects/opportunity.workspace-entity'; -import { SEARCH_FIELDS_FOR_PERSON } from 'src/modules/person/standard-objects/person.workspace-entity'; -import { SEARCH_FIELDS_FOR_TASKS } from 'src/modules/task/standard-objects/task.workspace-entity'; -import { SEARCH_FIELDS_FOR_WORKFLOW_RUNS } from 'src/modules/workflow/common/standard-objects/workflow-run.workspace-entity'; -import { SEARCH_FIELDS_FOR_WORKFLOW_VERSIONS } from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity'; -import { SEARCH_FIELDS_FOR_WORKFLOWS } from 'src/modules/workflow/common/standard-objects/workflow.workspace-entity'; -import { SEARCH_FIELDS_FOR_WORKSPACE_MEMBER } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; - -const STANDARD_SEARCH_EXPRESSIONS = buildStandardSearchExpressions(); - -@Command({ - name: 'upgrade:1-10:regenerate-search-vectors', - description: - 'Regenerate searchVector generated columns using unaccent-aware expressions for every searchable object', -}) -export class RegenerateSearchVectorsCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - private readonly workspaceSchemaManager: WorkspaceSchemaManagerService, - @InjectRepository(ObjectMetadataEntity) - private readonly objectMetadataRepository: Repository, - @InjectRepository(IndexMetadataEntity) - private readonly indexMetadataRepository: Repository, - @InjectDataSource() - private readonly coreDataSource: DataSource, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - await this.ensureUnaccentFunctionExists(); - - const schemaName = getWorkspaceSchemaName(workspaceId); - const isDryRun = options.dryRun || false; - - const searchableObjects = await this.fetchSearchableObjects(workspaceId); - - if (searchableObjects.length === 0) { - this.logger.log( - `No searchable objects found for workspace ${workspaceId}, skipping`, - ); - - return; - } - - const objectIds = searchableObjects.map((obj) => obj.id); - const allIndexes = await this.fetchIndexesForObjects(objectIds); - - let queryRunner: QueryRunner | undefined; - - if (isDryRun) { - queryRunner = this.coreDataSource.createQueryRunner(); - await queryRunner.connect(); - await queryRunner.startTransaction(); - } - - let successCount = 0; - let skipCount = 0; - let errorCount = 0; - - try { - for (const object of searchableObjects) { - try { - const result = await this.regenerateSearchVectorForObject( - queryRunner, - object, - allIndexes, - schemaName, - workspaceId, - ); - - if (result === 'skipped') { - skipCount++; - } else { - successCount++; - } - } catch (error) { - errorCount++; - this.logger.error( - `Failed to regenerate search vector for ${object.nameSingular} in workspace ${workspaceId}`, - error, - ); - - if (isDryRun) { - throw error; - } - } - } - - if (isDryRun && queryRunner) { - await queryRunner.rollbackTransaction(); - this.logger.log( - `DRY RUN: Would regenerate ${successCount} search vectors, skip ${skipCount}, ${errorCount} errors - rolled back all changes`, - ); - } else { - this.logger.log( - `Search vector regeneration complete for workspace ${workspaceId}: ${successCount} succeeded, ${skipCount} skipped, ${errorCount} failed out of ${searchableObjects.length} total`, - ); - } - } catch (error) { - if (queryRunner?.isTransactionActive) { - await queryRunner.rollbackTransaction(); - } - - throw error; - } finally { - if (queryRunner) { - await queryRunner.release(); - } - } - } - - private async fetchSearchableObjects( - workspaceId: string, - ): Promise { - return this.objectMetadataRepository.find({ - where: { - workspaceId, - isSearchable: true, - }, - relations: ['fields'], - }); - } - - private async fetchIndexesForObjects( - objectIds: string[], - ): Promise { - return this.indexMetadataRepository.find({ - where: { - objectMetadataId: In(objectIds), - }, - relations: ['indexFieldMetadatas'], - }); - } - - private async regenerateSearchVectorForObject( - queryRunner: QueryRunner | undefined, - object: ObjectMetadataEntity, - allIndexes: IndexMetadataEntity[], - schemaName: string, - workspaceId: string, - ): Promise<'success' | 'skipped'> { - const searchVectorField = this.findSearchVectorField(object); - - if (!searchVectorField) { - this.logger.warn( - `Search vector field not found for ${object.nameSingular} in workspace ${workspaceId}, skipping`, - ); - - return 'skipped'; - } - - const searchExpression = this.buildSearchExpression(object); - - if (!searchExpression) { - this.logger.warn( - `Cannot determine search expression for ${object.nameSingular} in workspace ${workspaceId}, skipping`, - ); - - return 'skipped'; - } - - const tableName = computeObjectTargetTable({ - nameSingular: object.nameSingular, - isCustom: object.isCustom, - }); - - const existingIndex = this.findSearchVectorIndex( - allIndexes, - object.id, - searchVectorField.id, - ); - - let localQueryRunner: QueryRunner; - const shouldRelease = !queryRunner; - - if (queryRunner) { - localQueryRunner = queryRunner; - } else { - localQueryRunner = this.coreDataSource.createQueryRunner(); - await localQueryRunner.connect(); - } - - try { - if (existingIndex) { - await this.dropIndex(localQueryRunner, schemaName, existingIndex.name); - } - - await this.dropSearchVectorColumn( - localQueryRunner, - schemaName, - tableName, - ); - - await this.createSearchVectorColumn( - localQueryRunner, - schemaName, - tableName, - searchExpression, - ); - - if (existingIndex) { - await this.recreateIndex( - localQueryRunner, - schemaName, - tableName, - existingIndex, - ); - } - - this.logger.log( - `Regenerated search vector for ${object.nameSingular} in workspace ${workspaceId}`, - ); - - return 'success'; - } finally { - if (shouldRelease) { - await localQueryRunner.release(); - } - } - } - - private findSearchVectorField( - object: ObjectMetadataEntity, - ): ObjectMetadataEntity['fields'][0] | undefined { - return object.fields.find( - (field) => field.name === SEARCH_VECTOR_FIELD.name, - ); - } - - private findSearchVectorIndex( - allIndexes: IndexMetadataEntity[], - objectId: string, - searchVectorFieldId: string, - ): IndexMetadataEntity | undefined { - return allIndexes.find( - (index) => - index.objectMetadataId === objectId && - index.indexFieldMetadatas.some( - (indexField) => indexField.fieldMetadataId === searchVectorFieldId, - ), - ); - } - - private buildSearchExpression( - object: ObjectMetadataEntity, - ): string | undefined { - if (object.standardId) { - const standardExpression = STANDARD_SEARCH_EXPRESSIONS[object.standardId]; - - if (standardExpression) { - return standardExpression; - } - } - - if (object.isCustom) { - return this.buildCustomObjectSearchExpression(object); - } - - return undefined; - } - - private buildCustomObjectSearchExpression( - object: ObjectMetadataEntity, - ): string { - const labelField = object.fields.find( - (field) => field.id === object.labelIdentifierFieldMetadataId, - ); - - if (!labelField) { - return getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_FOR_CUSTOM_OBJECT, - ); - } - - return getTsVectorColumnExpressionFromFields([ - { - name: labelField.name, - type: labelField.type as SearchableFieldType, - }, - ]); - } - - private async dropIndex( - queryRunner: QueryRunner, - schemaName: string, - indexName: string, - ): Promise { - await this.workspaceSchemaManager.indexManager.dropIndex({ - queryRunner, - schemaName, - indexName, - }); - } - - private async dropSearchVectorColumn( - queryRunner: QueryRunner, - schemaName: string, - tableName: string, - ): Promise { - await this.workspaceSchemaManager.columnManager.dropColumns({ - queryRunner, - schemaName, - tableName, - columnNames: [SEARCH_VECTOR_FIELD.name], - }); - } - - private async createSearchVectorColumn( - queryRunner: QueryRunner, - schemaName: string, - tableName: string, - expression: string, - ): Promise { - await this.workspaceSchemaManager.columnManager.addColumns({ - queryRunner, - schemaName, - tableName, - columnDefinitions: [ - { - name: SEARCH_VECTOR_FIELD.name, - type: 'tsvector', - isNullable: true, - generatedType: 'STORED', - asExpression: expression, - }, - ], - }); - } - - private async recreateIndex( - queryRunner: QueryRunner, - schemaName: string, - tableName: string, - index: IndexMetadataEntity, - ): Promise { - await this.workspaceSchemaManager.indexManager.createIndex({ - queryRunner, - schemaName, - tableName, - index: { - name: index.name, - columns: [SEARCH_VECTOR_FIELD.name], - type: index.indexType, - isUnique: index.isUnique, - where: index.indexWhereClause ?? undefined, - }, - }); - } - - private async ensureUnaccentFunctionExists(): Promise { - const result = await this.coreDataSource.query(` - SELECT EXISTS ( - SELECT 1 FROM pg_proc p - JOIN pg_namespace n ON p.pronamespace = n.oid - WHERE n.nspname = 'public' - AND p.proname = 'unaccent_immutable' - ) as function_exists - `); - - if (!result[0]?.function_exists) { - throw new Error( - 'The public.unaccent_immutable() function is required but not found. Please run database migrations first.', - ); - } - } -} - -function buildStandardSearchExpressions(): Partial> { - const standardObjectSearchFields = { - person: SEARCH_FIELDS_FOR_PERSON, - company: SEARCH_FIELDS_FOR_COMPANY, - opportunity: SEARCH_FIELDS_FOR_OPPORTUNITY, - task: SEARCH_FIELDS_FOR_TASKS, - note: SEARCH_FIELDS_FOR_NOTES, - dashboard: SEARCH_FIELDS_FOR_DASHBOARD, - workspaceMember: SEARCH_FIELDS_FOR_WORKSPACE_MEMBER, - workflow: SEARCH_FIELDS_FOR_WORKFLOWS, - workflowVersion: SEARCH_FIELDS_FOR_WORKFLOW_VERSIONS, - workflowRun: SEARCH_FIELDS_FOR_WORKFLOW_RUNS, - }; - - const expressions: Partial> = {}; - - for (const [objectKey, searchFields] of Object.entries( - standardObjectSearchFields, - )) { - const standardId = - STANDARD_OBJECT_IDS[objectKey as keyof typeof standardObjectSearchFields]; - - expressions[standardId] = - getTsVectorColumnExpressionFromFields(searchFields); - } - - return expressions; -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-seed-dashboard-view.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-seed-dashboard-view.command.ts deleted file mode 100644 index 55fe7951ae8..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-seed-dashboard-view.command.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { STANDARD_OBJECT_IDS } from 'twenty-shared/metadata'; -import { isDefined } from 'twenty-shared/utils'; -import { DataSource, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { ApplicationService } from 'src/engine/core-modules/application/application.service'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { ViewKey } from 'src/engine/metadata-modules/view/enums/view-key.enum'; -import { WorkspaceEntityManager } from 'src/engine/twenty-orm/entity-manager/workspace-entity-manager'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { createCoreViews } from 'src/engine/workspace-manager/standard-objects-prefill-data/prefill-core-views'; -import { prefillWorkspaceFavorites } from 'src/engine/workspace-manager/standard-objects-prefill-data/prefill-workspace-favorites'; -import { dashboardsAllView } from 'src/engine/workspace-manager/standard-objects-prefill-data/views/dashboards-all.view'; - -@Command({ - name: 'upgrade:1-10:seed-dashboard-view', - description: 'Seed the dashboard view', -}) -export class SeedDashboardViewCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectDataSource() - private readonly coreDataSource: DataSource, - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(ObjectMetadataEntity) - private readonly objectMetadataRepository: Repository, - @InjectRepository(DataSourceEntity) - private readonly dataSourceRepository: Repository, - @InjectRepository(ViewEntity) - private readonly viewRepository: Repository, - private readonly applicationService: ApplicationService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - const [dashboardObjectMetadata] = await this.objectMetadataRepository.find({ - where: { - workspaceId, - standardId: STANDARD_OBJECT_IDS.dashboard, - }, - relations: ['fields'], - }); - - if (!isDefined(dashboardObjectMetadata)) { - throw new Error( - `Dashboard object metadata not found for workspace ${workspaceId}`, - ); - } - - const { twentyStandardFlatApplication } = - await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( - { workspaceId }, - ); - const views = [ - dashboardsAllView({ - objectMetadataItems: [dashboardObjectMetadata], - useCoreNaming: true, - twentyStandardFlatApplication, - }), - ]; - - const schema = await this.dataSourceRepository.findOne({ - where: { - workspaceId, - }, - }); - - if (!isDefined(schema)) { - throw new Error(`Schema not found for workspace ${workspaceId}`); - } - - const existingViews = await this.viewRepository.find({ - where: { - workspaceId, - objectMetadataId: dashboardObjectMetadata.id, - key: ViewKey.INDEX, - }, - }); - - if (existingViews.length > 0) { - this.logger.log( - `Dashboard view already exists for workspace ${workspaceId}. Skipping...`, - ); - - return; - } - - if (options.dryRun) { - this.logger.log( - `Would have seeded dashboard view for workspace ${workspaceId}. Skipping...`, - ); - - return; - } - - const queryRunner = this.coreDataSource.createQueryRunner(); - - await queryRunner.connect(); - - const createdViews = await createCoreViews( - queryRunner, - workspaceId, - views, - twentyStandardFlatApplication, - ); - - await prefillWorkspaceFavorites( - createdViews.map((view) => view.id), - queryRunner.manager as WorkspaceEntityManager, - schema.schema, - ); - - await queryRunner.release(); - this.logger.log( - `Successfully seeded dashboard view for workspace ${workspaceId}: ${createdViews.map((view) => view.name).join(', ')}`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-upgrade-version-command.module.ts deleted file mode 100644 index f2147080f88..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-10/1-10-upgrade-version-command.module.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; - -import { AddWorkflowRunStopStatusesCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-add-workflow-run-stop-statuses.command'; -import { CleanOrphanedKanbanAggregateOperationFieldMetadataIdCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-clean-orphaned-kanban-aggregate-operation-field-metadata-id.command'; -import { CreateViewKanbanFieldMetadataIdForeignKeyMigrationCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-create-view-kanban-field-metadata-id-foreign-key-migration.command'; -import { FlushCacheCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-flush-cache.command'; -import { MakeSureDashboardNamingAvailableCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-make-sure-dashboard-naming-available.command'; -import { MigrateAttachmentAuthorToCreatedByCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-author-to-created-by.command'; -import { MigrateAttachmentTypeToFileCategoryCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-type-to-file-category.command'; -import { MigrateChannelPartialFullSyncStagesCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-migrate-channel-partial-full-sync-stages.command'; -import { RegenerateSearchVectorsCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-regenerate-search-vectors.command'; -import { SeedDashboardViewCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-seed-dashboard-view.command'; -import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; -import { ApplicationModule } from 'src/engine/core-modules/application/application.module'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; -import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module'; -import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { ObjectMetadataModule } from 'src/engine/metadata-modules/object-metadata/object-metadata.module'; -import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { WorkspaceSchemaManagerModule } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.module'; -import { WorkspaceCacheStorageModule } from 'src/engine/workspace-cache-storage/workspace-cache-storage.module'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([ - WorkspaceEntity, - ObjectMetadataEntity, - FieldMetadataEntity, - IndexMetadataEntity, - ViewEntity, - DataSourceEntity, - ApplicationEntity, - ]), - DataSourceModule, - WorkspaceSchemaManagerModule, - WorkspaceCacheStorageModule, - ObjectMetadataModule, - WorkspaceManyOrAllFlatEntityMapsCacheModule, - ApplicationModule, - ], - providers: [ - MigrateChannelPartialFullSyncStagesCommand, - MigrateAttachmentAuthorToCreatedByCommand, - MigrateAttachmentTypeToFileCategoryCommand, - RegenerateSearchVectorsCommand, - AddWorkflowRunStopStatusesCommand, - CleanOrphanedKanbanAggregateOperationFieldMetadataIdCommand, - MakeSureDashboardNamingAvailableCommand, - SeedDashboardViewCommand, - CreateViewKanbanFieldMetadataIdForeignKeyMigrationCommand, - FlushCacheCommand, - ], - exports: [ - MigrateAttachmentAuthorToCreatedByCommand, - MigrateAttachmentTypeToFileCategoryCommand, - RegenerateSearchVectorsCommand, - AddWorkflowRunStopStatusesCommand, - CleanOrphanedKanbanAggregateOperationFieldMetadataIdCommand, - MigrateChannelPartialFullSyncStagesCommand, - MakeSureDashboardNamingAvailableCommand, - SeedDashboardViewCommand, - CreateViewKanbanFieldMetadataIdForeignKeyMigrationCommand, - FlushCacheCommand, - ], -}) -export class V1_10_UpgradeVersionCommandModule {} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-role-targets.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-role-targets.command.ts deleted file mode 100644 index 7e9cb524593..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-role-targets.command.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { In, type Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -@Command({ - name: 'upgrade:1-11:clean-orphaned-role-targets', - description: - 'Clean up roleTargets records that reference non-existent userWorkspaces', -}) -export class CleanOrphanedRoleTargetsCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - private hasRunOnce = false; - constructor( - @InjectRepository(RoleTargetEntity) - private readonly roleTargetRepository: Repository, - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - options, - }: RunOnWorkspaceArgs): Promise { - if (this.hasRunOnce) { - this.logger.log('This command has already been run'); - - return; - } - const isDryRun = options.dryRun || false; - - if (isDryRun) { - this.logger.log('Dry run mode: No changes will be applied'); - } - - const orphanedRoleTargets = await this.roleTargetRepository - .createQueryBuilder('roleTarget') - .leftJoin( - UserWorkspaceEntity, - 'userWorkspace', - 'userWorkspace.id = roleTarget.userWorkspaceId', - ) - .where('roleTarget.userWorkspaceId IS NOT NULL') - .andWhere('userWorkspace.id IS NULL') - .select([ - 'roleTarget.id', - 'roleTarget.userWorkspaceId', - 'roleTarget.workspaceId', - ]) - .getMany(); - - if (orphanedRoleTargets.length === 0) { - this.logger.log('No orphaned roleTargets found'); - - return; - } - - if (isDryRun) { - this.logger.log( - `DRY RUN: Would delete ${orphanedRoleTargets.length} orphaned roleTarget(s):`, - ); - orphanedRoleTargets.forEach((roleTarget) => { - this.logger.log( - ` - roleTargetId: ${roleTarget.id}, userWorkspaceId: ${roleTarget.userWorkspaceId}, workspaceId: ${roleTarget.workspaceId}`, - ); - }); - - this.hasRunOnce = true; - - return; - } - - const orphanedIds = orphanedRoleTargets.map((roleTarget) => roleTarget.id); - - await this.roleTargetRepository.delete({ id: In(orphanedIds) }); - - this.logger.log( - `Deleted ${orphanedRoleTargets.length} orphaned roleTarget(s)`, - ); - - this.hasRunOnce = true; - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-user-workspaces.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-user-workspaces.command.ts deleted file mode 100644 index d634c1e95de..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-user-workspaces.command.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { In, type Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity'; - -@Command({ - name: 'upgrade:1-11:clean-orphaned-user-workspaces', - description: - 'Clean up userWorkspace records that do not have a corresponding workspaceMember in the workspace schema', -}) -export class CleanOrphanedUserWorkspacesCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(UserWorkspaceEntity) - private readonly userWorkspaceRepository: Repository, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - const isDryRun = options.dryRun || false; - - const userWorkspaces = await this.userWorkspaceRepository.find({ - where: { - workspaceId, - }, - }); - - if (userWorkspaces.length === 0) { - this.logger.log( - `No userWorkspaces found for workspace ${workspaceId}, skipping`, - ); - - return; - } - - const workspaceMemberRepository = - await this.twentyORMGlobalManager.getRepository( - workspaceId, - 'workspaceMember', - { shouldBypassPermissionChecks: true }, - ); - - const workspaceMembers = await workspaceMemberRepository.find({ - select: ['userId'], - }); - - const workspaceMemberUserIds = new Set( - workspaceMembers.map((member) => member.userId), - ); - - const orphanedUserWorkspaces = userWorkspaces.filter( - (userWorkspace) => !workspaceMemberUserIds.has(userWorkspace.userId), - ); - - if (orphanedUserWorkspaces.length === 0) { - this.logger.log( - `No orphaned userWorkspaces found for workspace ${workspaceId}`, - ); - - return; - } - - if (isDryRun) { - this.logger.log( - `DRY RUN: Would delete ${orphanedUserWorkspaces.length} orphaned userWorkspace(s) for workspace ${workspaceId}:`, - ); - orphanedUserWorkspaces.forEach((userWorkspace) => { - this.logger.log( - ` - userWorkspaceId: ${userWorkspace.id}, userId: ${userWorkspace.userId}`, - ); - }); - - return; - } - - // Delete orphaned userWorkspaces - const orphanedIds = orphanedUserWorkspaces.map((uw) => uw.id); - - await this.userWorkspaceRepository.delete({ id: In(orphanedIds) }); - - this.logger.log( - `Deleted ${orphanedUserWorkspaces.length} orphaned userWorkspace(s) for workspace ${workspaceId}`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-create-twenty-standard-application.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-create-twenty-standard-application.command.ts deleted file mode 100644 index d131e0d225c..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-create-twenty-standard-application.command.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { In, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; -import { ApplicationService } from 'src/engine/core-modules/application/application.service'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { TWENTY_STANDARD_APPLICATION } from 'src/engine/workspace-manager/twenty-standard-application/constants/twenty-standard-applications'; - -@Command({ - name: 'upgrade:1-11:create-twenty-standard-application', - description: - 'Create twenty-standard application for workspaces that do not have them', -}) -export class CreateTwentyStandardApplicationCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(ApplicationEntity) - private readonly applicationRepository: Repository, - private readonly applicationService: ApplicationService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Checking standard applications for workspace ${workspaceId}`, - ); - - const existingApplications = await this.applicationRepository.find({ - where: { - workspaceId, - universalIdentifier: In([ - TWENTY_STANDARD_APPLICATION.universalIdentifier, - ]), - }, - }); - - const existingIds = new Set( - existingApplications.map((app) => app.universalIdentifier), - ); - - if (existingIds.has(TWENTY_STANDARD_APPLICATION.universalIdentifier)) { - this.logger.log( - `Skipping twenty standard application as it already exists`, - ); - - return; - } - - this.logger.log(`About to seed twenty standard application`); - if (options.dryRun) { - return; - } - - try { - await this.applicationService.createTwentyStandardApplication({ - workspaceId, - }); - - this.logger.log(`Successfully seeded twenty standard`); - } catch (e) { - this.logger.error(`Failed to seed twenty standard`, e); - } - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-upgrade-version-command.module.ts deleted file mode 100644 index 1587e68c85c..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-11/1-11-upgrade-version-command.module.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; - -import { CleanOrphanedRoleTargetsCommand } from 'src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-role-targets.command'; -import { CleanOrphanedUserWorkspacesCommand } from 'src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-user-workspaces.command'; -import { CreateTwentyStandardApplicationCommand } from 'src/database/commands/upgrade-version-command/1-11/1-11-create-twenty-standard-application.command'; -import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; -import { ApplicationModule } from 'src/engine/core-modules/application/application.module'; -import { UserWorkspaceEntity } from 'src/engine/core-modules/user-workspace/user-workspace.entity'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { RoleTargetEntity } from 'src/engine/metadata-modules/role-target/role-target.entity'; -import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { WorkspaceSchemaManagerModule } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.module'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([ - WorkspaceEntity, - ObjectMetadataEntity, - FieldMetadataEntity, - IndexMetadataEntity, - ViewEntity, - UserWorkspaceEntity, - RoleTargetEntity, - ApplicationEntity, - ]), - DataSourceModule, - WorkspaceSchemaManagerModule, - ApplicationModule, - ], - providers: [ - CleanOrphanedUserWorkspacesCommand, - CleanOrphanedRoleTargetsCommand, - CreateTwentyStandardApplicationCommand, - ], - exports: [ - CleanOrphanedUserWorkspacesCommand, - CleanOrphanedRoleTargetsCommand, - CreateTwentyStandardApplicationCommand, - ], -}) -export class V1_11_UpgradeVersionCommandModule {} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-add-calendar-events-import-scheduled-sync-stage.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-add-calendar-events-import-scheduled-sync-stage.command.ts deleted file mode 100644 index eab276ca752..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-add-calendar-events-import-scheduled-sync-stage.command.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { STANDARD_OBJECT_IDS } from 'twenty-shared/metadata'; -import { DataSource, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { CALENDAR_CHANNEL_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; -import { CalendarChannelSyncStage } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; - -@Command({ - name: 'upgrade:1-12:add-calendar-events-import-scheduled-sync-stage', - description: - 'Replace calendar channel syncStage enum with complete CalendarChannelSyncStage values and update default to PENDING_CONFIGURATION', -}) -export class AddCalendarEventsImportScheduledSyncStageCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(ObjectMetadataEntity) - private readonly objectMetadataRepository: Repository, - @InjectRepository(FieldMetadataEntity) - private readonly fieldMetadataRepository: Repository, - @InjectDataSource() - private readonly coreDataSource: DataSource, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Updating calendar channel syncStage enum and default value for workspace ${workspaceId}`, - ); - - await this.updateCalendarChannelSyncStageFieldMetadata( - workspaceId, - options, - ); - - await this.addCalendarEventsImportScheduledEnumValue(workspaceId, options); - - this.logger.log( - `Successfully updated calendar channel syncStage enum and default value for workspace ${workspaceId}`, - ); - } - - private async addCalendarEventsImportScheduledEnumValue( - workspaceId: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - const calendarChannelObject = await this.objectMetadataRepository.findOne({ - where: { - standardId: STANDARD_OBJECT_IDS.calendarChannel, - workspaceId, - }, - }); - - if (!calendarChannelObject) { - this.logger.log( - `CalendarChannel object not found for workspace ${workspaceId}, skipping enum migration`, - ); - - return; - } - - const schemaName = getWorkspaceSchemaName(workspaceId); - const tableName = 'calendarChannel'; - const columnName = 'syncStage'; - const enumName = 'calendarChannel_syncStage_enum'; - - if (options.dryRun) { - this.logger.log( - `Would replace ${enumName} with complete CalendarChannelSyncStage enum values for workspace ${workspaceId}`, - ); - - return; - } - - const queryRunner = this.coreDataSource.createQueryRunner(); - - await queryRunner.connect(); - await queryRunner.startTransaction(); - - try { - // Remove default value first - await queryRunner.query( - `ALTER TABLE "${schemaName}"."${tableName}" ALTER COLUMN "${columnName}" DROP DEFAULT`, - ); - - // Convert column to text to remove enum dependency - await queryRunner.query( - `ALTER TABLE "${schemaName}"."${tableName}" ALTER COLUMN "${columnName}" TYPE text USING "${columnName}"::text`, - ); - - // Drop the old enum (now safe since no column uses it) - await queryRunner.query( - `DROP TYPE IF EXISTS ${schemaName}."${enumName}" CASCADE`, - ); - - // Create new enum with all CalendarChannelSyncStage values - await queryRunner.query( - `CREATE TYPE ${schemaName}."${enumName}" AS ENUM ( - '${CalendarChannelSyncStage.PENDING_CONFIGURATION}', - '${CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_PENDING}', - '${CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_SCHEDULED}', - '${CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_ONGOING}', - '${CalendarChannelSyncStage.CALENDAR_EVENTS_IMPORT_PENDING}', - '${CalendarChannelSyncStage.CALENDAR_EVENTS_IMPORT_SCHEDULED}', - '${CalendarChannelSyncStage.CALENDAR_EVENTS_IMPORT_ONGOING}', - '${CalendarChannelSyncStage.FAILED}' - )`, - ); - - // Convert column back to enum type - await queryRunner.query( - `ALTER TABLE "${schemaName}"."${tableName}" - ALTER COLUMN "${columnName}" TYPE ${schemaName}."${enumName}" - USING "${columnName}"::${schemaName}."${enumName}"`, - ); - - // Update default value to PENDING_CONFIGURATION - await queryRunner.query( - `ALTER TABLE "${schemaName}"."${tableName}" - ALTER COLUMN "${columnName}" SET DEFAULT '${CalendarChannelSyncStage.PENDING_CONFIGURATION}'::${schemaName}."${enumName}"`, - ); - - await queryRunner.commitTransaction(); - - this.logger.log( - `Successfully replaced ${enumName} with complete CalendarChannelSyncStage enum values and updated default to PENDING_CONFIGURATION for workspace ${workspaceId}`, - ); - } catch (error) { - await queryRunner.rollbackTransaction(); - - this.logger.error( - `Error replacing ${enumName} for workspace ${workspaceId}: ${error}`, - ); - throw error; - } finally { - await queryRunner.release(); - } - } - - private async updateCalendarChannelSyncStageFieldMetadata( - workspaceId: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - const calendarChannelObject = await this.objectMetadataRepository.findOne({ - where: { - standardId: STANDARD_OBJECT_IDS.calendarChannel, - workspaceId, - }, - }); - - if (!calendarChannelObject) { - this.logger.log( - `CalendarChannel object not found for workspace ${workspaceId}, skipping field metadata update`, - ); - - return; - } - - const syncStageField = await this.fieldMetadataRepository.findOne({ - where: { - standardId: CALENDAR_CHANNEL_STANDARD_FIELD_IDS.syncStage, - objectMetadataId: calendarChannelObject.id, - workspaceId, - }, - }); - - if (!syncStageField) { - this.logger.log( - `CalendarChannel syncStage field not found for workspace ${workspaceId}, skipping field metadata update`, - ); - - return; - } - - if (options.dryRun) { - this.logger.log( - `Would add CALENDAR_EVENTS_IMPORT_SCHEDULED to CalendarChannel syncStage field metadata for workspace ${workspaceId}`, - ); - - return; - } - - const syncStageFieldOptions = [ - { - value: CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_PENDING, - label: 'Calendar event list fetch pending', - position: 0, - color: 'blue', - }, - { - value: CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_SCHEDULED, - label: 'Calendar event list fetch scheduled', - position: 1, - color: 'green', - }, - { - value: CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_ONGOING, - label: 'Calendar event list fetch ongoing', - position: 2, - color: 'orange', - }, - { - value: CalendarChannelSyncStage.CALENDAR_EVENTS_IMPORT_PENDING, - label: 'Calendar events import pending', - position: 3, - color: 'blue', - }, - { - value: CalendarChannelSyncStage.CALENDAR_EVENTS_IMPORT_SCHEDULED, - label: 'Calendar events import scheduled', - position: 4, - color: 'green', - }, - { - value: CalendarChannelSyncStage.CALENDAR_EVENTS_IMPORT_ONGOING, - label: 'Calendar events import ongoing', - position: 5, - color: 'orange', - }, - { - value: CalendarChannelSyncStage.FAILED, - label: 'Failed', - position: 6, - color: 'red', - }, - { - value: CalendarChannelSyncStage.PENDING_CONFIGURATION, - label: 'Pending configuration', - position: 7, - color: 'gray', - }, - ]; - - syncStageField.options = syncStageFieldOptions; - syncStageField.defaultValue = `'${CalendarChannelSyncStage.PENDING_CONFIGURATION}'`; - - await this.fieldMetadataRepository.save(syncStageField); - - this.logger.log( - `Added CALENDAR_EVENTS_IMPORT_SCHEDULED to CalendarChannel syncStage field metadata for workspace ${workspaceId}`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-add-messages-import-scheduled-sync-stage.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-add-messages-import-scheduled-sync-stage.command.ts deleted file mode 100644 index 88fad8a1263..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-add-messages-import-scheduled-sync-stage.command.ts +++ /dev/null @@ -1,256 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { STANDARD_OBJECT_IDS } from 'twenty-shared/metadata'; -import { DataSource, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { MESSAGE_CHANNEL_STANDARD_FIELD_IDS } from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; -import { MessageChannelSyncStage } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; - -@Command({ - name: 'upgrade:1-12:add-messages-import-scheduled-sync-stage', - description: - 'Replace message channel syncStage enum with complete MessageChannelSyncStage values and update default to PENDING_CONFIGURATION', -}) -export class AddMessagesImportScheduledSyncStageCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(ObjectMetadataEntity) - private readonly objectMetadataRepository: Repository, - @InjectRepository(FieldMetadataEntity) - private readonly fieldMetadataRepository: Repository, - @InjectDataSource() - private readonly coreDataSource: DataSource, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Updating message channel syncStage enum and default value for workspace ${workspaceId}`, - ); - - await this.updateMessageChannelSyncStageFieldMetadata(workspaceId, options); - - await this.addMessagesImportScheduledEnumValue(workspaceId, options); - - this.logger.log( - `Successfully updated message channel syncStage enum and default value for workspace ${workspaceId}`, - ); - } - - private async addMessagesImportScheduledEnumValue( - workspaceId: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - const messageChannelObject = await this.objectMetadataRepository.findOne({ - where: { - standardId: STANDARD_OBJECT_IDS.messageChannel, - workspaceId, - }, - }); - - if (!messageChannelObject) { - this.logger.log( - `MessageChannel object not found for workspace ${workspaceId}, skipping enum migration`, - ); - - return; - } - - const schemaName = getWorkspaceSchemaName(workspaceId); - const tableName = 'messageChannel'; - const columnName = 'syncStage'; - const enumName = 'messageChannel_syncStage_enum'; - - if (options.dryRun) { - this.logger.log( - `Would replace ${enumName} with complete MessageChannelSyncStage enum values for workspace ${workspaceId}`, - ); - - return; - } - - const queryRunner = this.coreDataSource.createQueryRunner(); - - await queryRunner.connect(); - await queryRunner.startTransaction(); - - try { - // Remove default value first - await queryRunner.query( - `ALTER TABLE "${schemaName}"."${tableName}" ALTER COLUMN "${columnName}" DROP DEFAULT`, - ); - - // Convert column to text to remove enum dependency - await queryRunner.query( - `ALTER TABLE "${schemaName}"."${tableName}" ALTER COLUMN "${columnName}" TYPE text USING "${columnName}"::text`, - ); - - // Drop the old enum (now safe since no column uses it) - await queryRunner.query( - `DROP TYPE IF EXISTS ${schemaName}."${enumName}" CASCADE`, - ); - - // Create new enum with all MessageChannelSyncStage values - await queryRunner.query( - `CREATE TYPE ${schemaName}."${enumName}" AS ENUM ( - '${MessageChannelSyncStage.PENDING_CONFIGURATION}', - '${MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING}', - '${MessageChannelSyncStage.MESSAGE_LIST_FETCH_SCHEDULED}', - '${MessageChannelSyncStage.MESSAGE_LIST_FETCH_ONGOING}', - '${MessageChannelSyncStage.MESSAGES_IMPORT_PENDING}', - '${MessageChannelSyncStage.MESSAGES_IMPORT_SCHEDULED}', - '${MessageChannelSyncStage.MESSAGES_IMPORT_ONGOING}', - '${MessageChannelSyncStage.FAILED}' - )`, - ); - - // Convert column back to enum type - await queryRunner.query( - `ALTER TABLE "${schemaName}"."${tableName}" - ALTER COLUMN "${columnName}" TYPE ${schemaName}."${enumName}" - USING "${columnName}"::${schemaName}."${enumName}"`, - ); - - // Update default value to PENDING_CONFIGURATION - await queryRunner.query( - `ALTER TABLE "${schemaName}"."${tableName}" - ALTER COLUMN "${columnName}" SET DEFAULT '${MessageChannelSyncStage.PENDING_CONFIGURATION}'::${schemaName}."${enumName}"`, - ); - - await queryRunner.commitTransaction(); - - this.logger.log( - `Successfully replaced ${enumName} with complete MessageChannelSyncStage enum values and updated default to PENDING_CONFIGURATION for workspace ${workspaceId}`, - ); - } catch (error) { - await queryRunner.rollbackTransaction(); - - this.logger.error( - `Error replacing ${enumName} for workspace ${workspaceId}: ${error}`, - ); - throw error; - } finally { - await queryRunner.release(); - } - } - - private async updateMessageChannelSyncStageFieldMetadata( - workspaceId: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - const messageChannelObject = await this.objectMetadataRepository.findOne({ - where: { - standardId: STANDARD_OBJECT_IDS.messageChannel, - workspaceId, - }, - }); - - if (!messageChannelObject) { - this.logger.log( - `MessageChannel object not found for workspace ${workspaceId}, skipping field metadata update`, - ); - - return; - } - - const syncStageField = await this.fieldMetadataRepository.findOne({ - where: { - standardId: MESSAGE_CHANNEL_STANDARD_FIELD_IDS.syncStage, - objectMetadataId: messageChannelObject.id, - workspaceId, - }, - }); - - if (!syncStageField) { - this.logger.log( - `MessageChannel syncStage field not found for workspace ${workspaceId}, skipping field metadata update`, - ); - - return; - } - - if (options.dryRun) { - this.logger.log( - `Would add MESSAGES_IMPORT_SCHEDULED to MessageChannel syncStage field metadata for workspace ${workspaceId}`, - ); - - return; - } - - const syncStageFieldOptions = [ - { - value: MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING, - label: 'Messages list fetch pending', - position: 0, - color: 'blue', - }, - { - value: MessageChannelSyncStage.MESSAGE_LIST_FETCH_SCHEDULED, - label: 'Messages list fetch scheduled', - position: 1, - color: 'green', - }, - { - value: MessageChannelSyncStage.MESSAGE_LIST_FETCH_ONGOING, - label: 'Messages list fetch ongoing', - position: 2, - color: 'orange', - }, - { - value: MessageChannelSyncStage.MESSAGES_IMPORT_PENDING, - label: 'Messages import pending', - position: 3, - color: 'blue', - }, - { - value: MessageChannelSyncStage.MESSAGES_IMPORT_SCHEDULED, - label: 'Messages import scheduled', - position: 4, - color: 'green', - }, - { - value: MessageChannelSyncStage.MESSAGES_IMPORT_ONGOING, - label: 'Messages import ongoing', - position: 5, - color: 'orange', - }, - { - value: MessageChannelSyncStage.FAILED, - label: 'Failed', - position: 6, - color: 'red', - }, - { - value: MessageChannelSyncStage.PENDING_CONFIGURATION, - label: 'Pending configuration', - position: 7, - color: 'gray', - }, - ]; - - syncStageField.options = syncStageFieldOptions; - syncStageField.defaultValue = `'${MessageChannelSyncStage.PENDING_CONFIGURATION}'`; - - await this.fieldMetadataRepository.save(syncStageField); - - this.logger.log( - `Added MESSAGES_IMPORT_SCHEDULED to MessageChannel syncStage field metadata for workspace ${workspaceId}`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-clean-null-equivalent-values.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-clean-null-equivalent-values.ts deleted file mode 100644 index a060d7b2f4c..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-clean-null-equivalent-values.ts +++ /dev/null @@ -1,273 +0,0 @@ -import { Logger } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; - -import deepEqual from 'deep-equal'; -import { Command } from 'nest-commander'; -import { - CompositeType, - compositeTypeDefinitions, - FieldMetadataType, -} from 'twenty-shared/types'; -import { isDefined } from 'twenty-shared/utils'; -import { Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; -import { deprecatedGenerateDefaultValue } from 'src/engine/metadata-modules/field-metadata/utils/deprecated-generate-default-value'; -import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; -import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; -import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { generateMigrationName } from 'src/engine/metadata-modules/workspace-migration/utils/generate-migration-name.util'; -import { - WorkspaceMigrationIndexAction, - WorkspaceMigrationIndexActionType, - WorkspaceMigrationTableAction, - WorkspaceMigrationTableActionType, -} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; -import { WorkspaceMigrationService } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service'; - -@Command({ - name: 'upgrade:1-12:clean-null-equivalent-values', - description: 'Clean up null equivalent values in the database', -}) -export class CleanNullEquivalentValuesCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - protected readonly logger = new Logger(CleanNullEquivalentValuesCommand.name); - - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - @InjectRepository(ObjectMetadataEntity) - protected readonly objectMetadataRepository: Repository, - @InjectRepository(FieldMetadataEntity) - protected readonly fieldMetadataRepository: Repository, - @InjectRepository(IndexMetadataEntity) - protected readonly indexMetadataRepository: Repository, - @InjectRepository(FeatureFlagEntity) - protected readonly featureFlagRepository: Repository, - protected readonly workspaceMigrationService: WorkspaceMigrationService, - protected readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, - protected readonly dataSourceService: DataSourceService, - protected readonly workspaceManyOrAllFlatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - dataSource, - }: RunOnWorkspaceArgs): Promise { - const isDryRun = options.dryRun || false; - - if (!isDefined(dataSource)) { - throw new Error( - `Could not find data source for workspace ${workspaceId}, should never occur`, - ); - } - - const schemaName = getWorkspaceSchemaName(workspaceId); - - if (isDryRun) { - this.logger.log('Dry run mode: No changes will be applied'); - } - - const objectMetadataItems = await this.objectMetadataRepository.find({ - where: { workspaceId }, - relations: [ - 'fields', - 'indexMetadatas', - 'indexMetadatas.indexFieldMetadatas', - ], - }); - - for (const objectMetadataItem of objectMetadataItems) { - const tableName = computeObjectTargetTable(objectMetadataItem); - - for (const field of objectMetadataItem.fields) { - const fieldDefaultDefaultValue = deprecatedGenerateDefaultValue( - field.type, - ); - - if ( - !( - isDefined(field.defaultValue) && - ((typeof field.defaultValue === 'string' && - field.defaultValue === fieldDefaultDefaultValue) || - this.objectEquals( - field.defaultValue, - fieldDefaultDefaultValue, - )) && - field.type !== FieldMetadataType.ACTOR - ) - ) - continue; - - this.logger.log( - `Processing field ${field.name} on object ${objectMetadataItem.nameSingular} (Table: ${tableName})`, - ); - if (!isDryRun) { - if (isCompositeFieldMetadataType(field.type)) { - const compositeType = compositeTypeDefinitions.get(field.type); - - if (isDefined(compositeType)) { - for (const property of compositeType.properties) { - const columnName = computeCompositeColumnName( - field.name, - property, - ); - - await dataSource.query( - `ALTER TABLE "${schemaName}"."${tableName}" ALTER COLUMN "${columnName}" DROP NOT NULL, ALTER COLUMN "${columnName}" DROP DEFAULT`, - [], - undefined, - { shouldBypassPermissionChecks: true }, - ); - - await dataSource.query( - `UPDATE "${schemaName}"."${tableName}" SET "${columnName}" = NULL WHERE "${columnName}" = ${field.defaultValue[property.name as keyof typeof field.defaultValue]}`, - [], - undefined, - { shouldBypassPermissionChecks: true }, - ); - } - } - } else { - await dataSource.query( - `ALTER TABLE "${schemaName}"."${tableName}" ALTER COLUMN "${field.name}" DROP NOT NULL, ALTER COLUMN "${field.name}" DROP DEFAULT`, - [], - undefined, - { shouldBypassPermissionChecks: true }, - ); - - await dataSource.query( - `UPDATE "${schemaName}"."${tableName}" SET "${field.name}" = NULL WHERE "${field.name}" = ${field.defaultValue}`, - [], - undefined, - { shouldBypassPermissionChecks: true }, - ); - } - - await this.fieldMetadataRepository.update(field.id, { - isNullable: true, - defaultValue: null, - }); - - await this.workspaceManyOrAllFlatEntityMapsCacheService.invalidateFlatEntityMaps( - { - workspaceId, - flatMapsKeys: ['flatFieldMetadataMaps'], - }, - ); - } - - const relevantIndexes = objectMetadataItem.indexMetadatas.filter( - (index) => - index.isUnique && - index.indexFieldMetadatas.some( - (ifm) => ifm.fieldMetadataId === field.id, - ), - ); - - for (const index of relevantIndexes) { - if (!isDryRun) { - this.logger.log( - `Removing where clause from index ${index.name} on ${tableName}`, - ); - - await this.indexMetadataRepository.update(index.id, { - indexWhereClause: null, - }); - - await this.workspaceManyOrAllFlatEntityMapsCacheService.invalidateFlatEntityMaps( - { - workspaceId, - flatMapsKeys: ['flatIndexMaps'], - }, - ); - - const columnNames = index.indexFieldMetadatas.flatMap( - (indexFieldMetadata) => { - const fieldMetadata = objectMetadataItem.fields.find( - (f) => f.id === indexFieldMetadata.fieldMetadataId, - ); - - if (!isDefined(fieldMetadata)) { - throw new Error( - `Field metadata not found for index field metadata ${indexFieldMetadata.id}`, - ); - } - - if (isCompositeFieldMetadataType(fieldMetadata.type)) { - const compositeType = compositeTypeDefinitions.get( - fieldMetadata.type, - ) as CompositeType; - - const uniqueCompositeProperties = - compositeType.properties.filter( - (property) => property.isIncludedInUniqueConstraint, - ); - - return uniqueCompositeProperties.map((subField) => - computeCompositeColumnName(fieldMetadata.name, subField), - ); - } - - return [fieldMetadata.name]; - }, - ); - - const dropIndexAction: WorkspaceMigrationIndexAction = { - action: WorkspaceMigrationIndexActionType.DROP, - name: index.name, - columns: [], - isUnique: true, - }; - - const createIndexAction: WorkspaceMigrationIndexAction = { - action: WorkspaceMigrationIndexActionType.CREATE, - name: index.name, - columns: columnNames, - isUnique: true, - where: null, - }; - - const migration: WorkspaceMigrationTableAction = { - name: tableName, - action: WorkspaceMigrationTableActionType.ALTER_INDEXES, - indexes: [dropIndexAction, createIndexAction], - }; - - await this.workspaceMigrationService.createCustomMigration( - generateMigrationName(`update-index-${index.name}-remove-where`), - workspaceId, - [migration], - ); - - await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations( - workspaceId, - ); - } - } - } - } - } - - private objectEquals(obj1: unknown, obj2: unknown): boolean { - if (typeof obj1 !== 'object' || typeof obj2 !== 'object') { - return false; - } - - return deepEqual(obj1, obj2, { strict: true }); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-create-workspace-custom-application.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-create-workspace-custom-application.command.ts deleted file mode 100644 index 55ed9a4a500..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-create-workspace-custom-application.command.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { isDefined } from 'twenty-shared/utils'; -import { WorkspaceActivationStatus } from 'twenty-shared/workspace'; -import { Repository } from 'typeorm'; - -import { - WorkspacesMigrationCommandRunner, - type RunOnWorkspaceArgs, -} from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { ApplicationService } from 'src/engine/core-modules/application/application.service'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -@Command({ - name: 'upgrade:1-12:create-workspace-custom-application', - description: - 'Create workspace-custom application for workspaces that do not have them', -}) -export class CreateWorkspaceCustomApplicationCommand extends WorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - private readonly applicationService: ApplicationService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService, [ - WorkspaceActivationStatus.ONGOING_CREATION, - WorkspaceActivationStatus.PENDING_CREATION, - WorkspaceActivationStatus.ACTIVE, - WorkspaceActivationStatus.INACTIVE, - WorkspaceActivationStatus.SUSPENDED, - ]); - } - - override async runOnWorkspace({ - workspaceId, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Checking standard applications for workspace ${workspaceId}`, - ); - - const workspace = await this.workspaceRepository.findOne({ - where: { id: workspaceId }, - }); - - if (!isDefined(workspace)) { - throw new Error(`${workspaceId} workspace not found`); - } - - if (isDefined(workspace.workspaceCustomApplicationId)) { - this.logger.log( - `${workspaceId} skipping custom workspace application creation as already exists`, - ); - - return; - } - - const customWorkspaceApplication = - await this.applicationService.createWorkspaceCustomApplication({ - workspaceId, - workspaceDisplayName: workspace.displayName, - }); - - await this.workspaceRepository.update(workspace.id, { - workspaceCustomApplicationId: customWorkspaceApplication.id, - }); - - this.logger.log(`Successfully create workspace custom application`); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-set-standard-application-not-uninstallable.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-set-standard-application-not-uninstallable.command.ts deleted file mode 100644 index 917633fcc7e..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-set-standard-application-not-uninstallable.command.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { ApplicationService } from 'src/engine/core-modules/application/application.service'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -// Note: this command needs to be run after CreateWorkspaceCustomApplicationCommand -@Command({ - name: 'upgrade:1-12:set-standard-application-not-uninstallable', - description: 'Set canBeUninstalled flag to false for standard applications', -}) -export class SetStandardApplicationNotUninstallableCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - private readonly applicationService: ApplicationService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - try { - this.logger.log( - `Checking workspace applications for workspace ${workspaceId}`, - ); - - const { twentyStandardFlatApplication, workspaceCustomFlatApplication } = - await this.applicationService.findWorkspaceTwentyStandardAndCustomApplicationOrThrow( - { - workspaceId, - }, - ); - - if (options.dryRun) { - return; - } - - for (const existingApplication of [ - twentyStandardFlatApplication, - workspaceCustomFlatApplication, - ]) { - await this.applicationService.update(existingApplication.id, { - canBeUninstalled: false, - }); - } - this.logger.log(`Successfully updated workspace application`); - } catch (e) { - this.logger.error(`Failed to update workspace application`, e); - } - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-upgrade-version-command.module.ts deleted file mode 100644 index a106bee9a11..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-upgrade-version-command.module.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; - -import { AddCalendarEventsImportScheduledSyncStageCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-add-calendar-events-import-scheduled-sync-stage.command'; -import { AddMessagesImportScheduledSyncStageCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-add-messages-import-scheduled-sync-stage.command'; -import { CleanNullEquivalentValuesCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-clean-null-equivalent-values'; -import { CreateWorkspaceCustomApplicationCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-create-workspace-custom-application.command'; -import { SetStandardApplicationNotUninstallableCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-set-standard-application-not-uninstallable.command'; -import { WorkspaceCustomApplicationIdNonNullableCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-workspace-custom-application-id-non-nullable-migration.command'; -import { ApplicationModule } from 'src/engine/core-modules/application/application.module'; -import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { FieldMetadataModule } from 'src/engine/metadata-modules/field-metadata/field-metadata.module'; -import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module'; -import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { WorkspaceMigrationModule } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.module'; -import { WorkspaceSchemaManagerModule } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.module'; -import { WorkspaceMigrationRunnerModule } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.module'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([ - WorkspaceEntity, - ObjectMetadataEntity, - FieldMetadataEntity, - IndexMetadataEntity, - FeatureFlagEntity, - ]), - WorkspaceSchemaManagerModule, - WorkspaceMigrationModule, - WorkspaceMigrationRunnerModule, - ApplicationModule, - FieldMetadataModule, - DataSourceModule, - WorkspaceManyOrAllFlatEntityMapsCacheModule, - ], - providers: [ - AddCalendarEventsImportScheduledSyncStageCommand, - AddMessagesImportScheduledSyncStageCommand, - CreateWorkspaceCustomApplicationCommand, - SetStandardApplicationNotUninstallableCommand, - WorkspaceCustomApplicationIdNonNullableCommand, - CleanNullEquivalentValuesCommand, - ], - exports: [ - AddCalendarEventsImportScheduledSyncStageCommand, - AddMessagesImportScheduledSyncStageCommand, - CreateWorkspaceCustomApplicationCommand, - SetStandardApplicationNotUninstallableCommand, - WorkspaceCustomApplicationIdNonNullableCommand, - CleanNullEquivalentValuesCommand, - ], -}) -export class V1_12_UpgradeVersionCommandModule {} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-workspace-custom-application-id-non-nullable-migration.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-workspace-custom-application-id-non-nullable-migration.command.ts deleted file mode 100644 index c2374919843..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-12/1-12-workspace-custom-application-id-non-nullable-migration.command.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { DataSource, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -@Command({ - name: '1-12-workspace-custom-application-id-non-nullable-migration', - description: 'Create FK_3b1acb13a5dac9956d1a4b32755 foreign key', -}) -export class WorkspaceCustomApplicationIdNonNullableCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - private hasRunOnce = false; - - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectDataSource() - private readonly coreDataSource: DataSource, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - options, - }: RunOnWorkspaceArgs): Promise { - if (this.hasRunOnce) { - this.logger.log( - 'Skipping has already been run once WorkspaceCustomApplicationIdNonNullableCommand', - ); - - return; - } - - const queryRunner = this.coreDataSource.createQueryRunner(); - - await queryRunner.connect(); - await queryRunner.startTransaction(); - if (!options.dryRun) { - try { - await queryRunner.query( - `ALTER TABLE "core"."workspace" DROP CONSTRAINT "FK_3b1acb13a5dac9956d1a4b32755"`, - ); - await queryRunner.query( - `ALTER TABLE "core"."workspace" ALTER COLUMN "workspaceCustomApplicationId" SET NOT NULL`, - ); - await queryRunner.query( - `ALTER TABLE "core"."workspace" ADD CONSTRAINT "FK_3b1acb13a5dac9956d1a4b32755" FOREIGN KEY ("workspaceCustomApplicationId") REFERENCES "core"."application"("id") ON DELETE RESTRICT ON UPDATE NO ACTION`, - ); - - await queryRunner.commitTransaction(); - this.logger.log( - 'Successfully run WorkspaceCustomApplicationIdNonNullableCommand', - ); - this.hasRunOnce = true; - } catch (error) { - await queryRunner.rollbackTransaction(); - this.logger.log( - `Rollbacking WorkspaceCustomApplicationIdNonNullableCommand: ${error.message}`, - ); - } finally { - await queryRunner.release(); - } - } - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-rename-unique-index.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-rename-index.command.ts similarity index 100% rename from packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-rename-unique-index.command.ts rename to packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-rename-index.command.ts diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module.ts index 118f46ad277..1e6e964f715 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module.ts @@ -7,7 +7,7 @@ import { CleanEmptyStringNullInTextFieldsCommand } from 'src/database/commands/u import { DeduplicateRoleTargetsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-deduplicate-role-targets.command'; import { MigrateStandardInvalidEntitiesCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-migrate-standard-invalid-entities.command'; import { MigrateTimelineActivityToMorphRelationsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-migrate-timeline-activity-to-morph-relations.command'; -import { RenameIndexNameCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-rename-unique-index.command'; +import { RenameIndexNameCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-rename-index.command'; import { UpdateRoleTargetsUniqueConstraintMigrationCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-update-role-targets-unique-constraint-migration.command'; import { ApplicationModule } from 'src/engine/core-modules/application/application.module'; import { FeatureFlagEntity } from 'src/engine/core-modules/feature-flag/feature-flag.entity'; diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-6/1-6-fix-label-identifier-position-and-visibility.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-6/1-6-fix-label-identifier-position-and-visibility.command.ts deleted file mode 100644 index cec31e0fb0e..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-6/1-6-fix-label-identifier-position-and-visibility.command.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -@Command({ - name: 'upgrade:1-6:fix-label-identifier-position-and-visibility', - description: - 'Fix label identifier position to ensure it has the minimal position in each view', -}) -export class FixLabelIdentifierPositionAndVisibilityCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(ViewEntity) - private readonly viewRepository: Repository, - @InjectRepository(ViewFieldEntity) - private readonly viewFieldRepository: Repository, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Checking label identifiers position and visibility for workspace ${workspaceId}`, - ); - - const views = await this.viewRepository.find({ - where: { workspaceId }, - relations: { - objectMetadata: true, - viewFields: true, - }, - }); - - for (const view of views) { - const { objectMetadata, viewFields } = view; - - if (!objectMetadata.labelIdentifierFieldMetadataId) { - continue; - } - - const labelIdentifierViewField = viewFields.find( - (viewField: ViewFieldEntity) => - viewField.fieldMetadataId === - objectMetadata.labelIdentifierFieldMetadataId, - ); - - if (!labelIdentifierViewField) { - continue; - } - - // Find minimum position and count fields at that position in single pass - const minPositionData = viewFields.reduce( - (acc, viewField: ViewFieldEntity) => { - if (viewField.position < acc.minPosition) { - return { minPosition: viewField.position, count: 1 }; - } - if (viewField.position === acc.minPosition) { - return { ...acc, count: acc.count + 1 }; - } - - return acc; - }, - { minPosition: Number.MAX_SAFE_INTEGER, count: 0 }, - ); - - const minPosition = minPositionData.minPosition; - const numberOfViewFieldsAtTheMinimalPosition = minPositionData.count; - - const labelIdentifierPositionIsAlreadyTheMinimalPosition = - labelIdentifierViewField.position === minPosition && - numberOfViewFieldsAtTheMinimalPosition === 1; - - const labelIdentifierIsAlreadyVisible = - labelIdentifierViewField.isVisible; - - if ( - labelIdentifierPositionIsAlreadyTheMinimalPosition && - labelIdentifierIsAlreadyVisible - ) { - continue; - } - - if (!labelIdentifierPositionIsAlreadyTheMinimalPosition) { - // Update the label identifier position to be the minimal one - const newPosition = minPosition - 1; - - if (!options.dryRun) { - await this.viewFieldRepository.update( - { id: labelIdentifierViewField.id }, - { position: newPosition }, - ); - - this.logger.log( - `Fixed label identifier position for view ${view.id} in workspace ${workspaceId}: ${labelIdentifierViewField.position} -> ${newPosition}`, - ); - } else { - this.logger.log( - `Would fix label identifier position for view ${view.id} in workspace ${workspaceId}: ${labelIdentifierViewField.position} -> ${newPosition}`, - ); - } - } - - if (!labelIdentifierIsAlreadyVisible) { - if (!options.dryRun) { - await this.viewFieldRepository.update( - { id: labelIdentifierViewField.id }, - { isVisible: true }, - ); - } - - this.logger.log( - `Fixed label identifier visibility for view ${view.id} in workspace ${workspaceId}: ${labelIdentifierViewField.isVisible} -> true`, - ); - } - } - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-6/1-6-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-6/1-6-upgrade-version-command.module.ts deleted file mode 100644 index 86f34c92def..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-6/1-6-upgrade-version-command.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; - -import { FixLabelIdentifierPositionAndVisibilityCommand } from 'src/database/commands/upgrade-version-command/1-6/1-6-fix-label-identifier-position-and-visibility.command'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { ViewFieldEntity } from 'src/engine/metadata-modules/view-field/entities/view-field.entity'; -import { ViewEntity } from 'src/engine/metadata-modules/view/entities/view.entity'; -import { WorkspaceMetadataVersionModule } from 'src/engine/metadata-modules/workspace-metadata-version/workspace-metadata-version.module'; -import { WorkspaceSchemaManagerModule } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.module'; -import { WorkspaceDataSourceModule } from 'src/engine/workspace-datasource/workspace-datasource.module'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([ - WorkspaceEntity, - FieldMetadataEntity, - ObjectMetadataEntity, - ViewEntity, - ViewFieldEntity, - ]), - DataSourceModule, - WorkspaceDataSourceModule, - WorkspaceSchemaManagerModule, - WorkspaceMetadataVersionModule, - ], - providers: [FixLabelIdentifierPositionAndVisibilityCommand], - exports: [FixLabelIdentifierPositionAndVisibilityCommand], -}) -export class V1_6_UpgradeVersionCommandModule {} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-7/1-7-backfill-workflow-manual-trigger-availability.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-7/1-7-backfill-workflow-manual-trigger-availability.command.ts deleted file mode 100644 index 9568c26aa63..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-7/1-7-backfill-workflow-manual-trigger-availability.command.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { isDefined } from 'twenty-shared/utils'; -import { DataSource, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { WorkflowTriggerType } from 'src/modules/workflow/workflow-trigger/types/workflow-trigger.type'; - -@Command({ - name: 'upgrade:1-7:backfill-workflow-manual-trigger-availability', - description: - 'Backfill workflow manual trigger availability based on objectType', -}) -export class BackfillWorkflowManualTriggerAvailabilityCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectDataSource() - private readonly coreDataSource: DataSource, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - }: RunOnWorkspaceArgs): Promise { - const schemaName = getWorkspaceSchemaName(workspaceId); - - const workflowVersions = await this.coreDataSource.query( - `SELECT * FROM ${schemaName}."workflowVersion"`, - ); - - for (const workflowVersion of workflowVersions) { - const { trigger } = workflowVersion; - - if (!isDefined(trigger) || trigger?.type !== WorkflowTriggerType.MANUAL) { - continue; - } - - const availability = trigger.settings.availability; - const objectType = trigger.settings.objectType; - - if (isDefined(availability)) { - continue; - } - - const newAvailability = objectType - ? { - type: 'SINGLE_RECORD', - objectNameSingular: objectType, - } - : { - type: 'GLOBAL', - locations: [], - }; - - const updatedTrigger = { - ...trigger, - settings: { - ...trigger.settings, - availability: newAvailability, - }, - }; - - this.logger.log( - `Updating workflow version ${workflowVersion.id} with new availability ${JSON.stringify( - newAvailability, - )}`, - ); - - await this.coreDataSource.query( - `UPDATE ${schemaName}."workflowVersion" SET trigger = $1 WHERE id = $2`, - [updatedTrigger, workflowVersion.id], - ); - } - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-7/1-7-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-7/1-7-upgrade-version-command.module.ts deleted file mode 100644 index 340dfc7a38c..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-7/1-7-upgrade-version-command.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; - -import { BackfillWorkflowManualTriggerAvailabilityCommand } from 'src/database/commands/upgrade-version-command/1-7/1-7-backfill-workflow-manual-trigger-availability.command'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; - -@Module({ - imports: [TypeOrmModule.forFeature([WorkspaceEntity]), DataSourceModule], - providers: [BackfillWorkflowManualTriggerAvailabilityCommand], - exports: [BackfillWorkflowManualTriggerAvailabilityCommand], -}) -export class V1_7_UpgradeVersionCommandModule {} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-deduplicate-unique-fields.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-deduplicate-unique-fields.command.ts deleted file mode 100644 index 9379ac5fe37..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-deduplicate-unique-fields.command.ts +++ /dev/null @@ -1,371 +0,0 @@ -import { Logger } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { isDefined } from 'twenty-shared/utils'; -import { IsNull, Not, Repository } from 'typeorm'; - -import { type WorkspaceDataSourceInterface } from 'src/engine/twenty-orm/interfaces/workspace-datasource.interface'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { IndexMetadataService } from 'src/engine/metadata-modules/index-metadata/index-metadata.service'; -import { generateDeterministicIndexName } from 'src/engine/metadata-modules/index-metadata/utils/generate-deterministic-index-name'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { generateMigrationName } from 'src/engine/metadata-modules/workspace-migration/utils/generate-migration-name.util'; -import { - WorkspaceMigrationIndexAction, - WorkspaceMigrationIndexActionType, - WorkspaceMigrationTableAction, - WorkspaceMigrationTableActionType, -} from 'src/engine/metadata-modules/workspace-migration/workspace-migration.entity'; -import { WorkspaceMigrationService } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; -import { WorkspaceMigrationRunnerService } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.service'; - -@Command({ - name: 'upgrade:1-8:deduplicate-unique-fields', - description: - 'Deduplicate unique fields for workspaceMembers, companies and people because we changed the unique constraint', -}) -export class DeduplicateUniqueFieldsCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - protected readonly logger = new Logger(DeduplicateUniqueFieldsCommand.name); - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - protected readonly indexMetadataService: IndexMetadataService, - protected readonly workspaceMigrationRunnerService: WorkspaceMigrationRunnerService, - protected readonly workspaceMigrationService: WorkspaceMigrationService, - @InjectRepository(ObjectMetadataEntity) - protected readonly objectMetadataRepository: Repository, - @InjectRepository(IndexMetadataEntity) - protected readonly indexMetadataRepository: Repository, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - dataSource, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Deduplicating indexed fields for workspace ${workspaceId}`, - ); - if (!isDefined(dataSource)) { - throw new Error( - 'Could not find workspace dataSource, should never occur', - ); - } - - await this.deduplicateUniqueUserEmailFieldForWorkspaceMembers({ - dataSource, - dryRun: options.dryRun ?? false, - }); - - await this.deduplicateUniqueDomainNameFieldForCompanies({ - dataSource, - dryRun: options.dryRun ?? false, - }); - - await this.deduplicateUniqueEmailFieldForPeople({ - dataSource, - dryRun: options.dryRun ?? false, - }); - - if (!options.dryRun) { - await this.updateExistingIndexedFields({ - workspaceId, - objectMetadataNameSingular: 'workspaceMember', - columnName: 'userEmail', - }); - await this.updateExistingIndexedFields({ - workspaceId, - objectMetadataNameSingular: 'company', - columnName: 'domainNamePrimaryLinkUrl', - }); - await this.updateExistingIndexedFields({ - workspaceId, - objectMetadataNameSingular: 'person', - columnName: 'emailsPrimaryEmail', - }); - } - } - - private computeExistingUniqueIndexName({ - objectMetadata, - fieldMetadataToIndex, - }: { - objectMetadata: ObjectMetadataEntity; - fieldMetadataToIndex: Partial[]; - }) { - const tableName = computeObjectTargetTable(objectMetadata); - const columnNames: string[] = fieldMetadataToIndex.map( - (fieldMetadata) => fieldMetadata.name as string, - ); - - return `IDX_UNIQUE_${generateDeterministicIndexName([tableName, ...columnNames])}`; - } - - private async computeExistingIndexDeletionMigration({ - objectMetadata, - fieldMetadataToIndex, - }: { - objectMetadata: ObjectMetadataEntity; - fieldMetadataToIndex: Partial[]; - }) { - const tableName = computeObjectTargetTable(objectMetadata); - - const indexName = this.computeExistingUniqueIndexName({ - objectMetadata, - fieldMetadataToIndex, - }); - - return { - name: tableName, - action: WorkspaceMigrationTableActionType.ALTER_INDEXES, - indexes: [ - { - action: WorkspaceMigrationIndexActionType.DROP, - name: indexName, - columns: [], - isUnique: true, - } satisfies WorkspaceMigrationIndexAction, - ], - } satisfies WorkspaceMigrationTableAction; - } - - private async updateExistingIndexedFields({ - workspaceId, - objectMetadataNameSingular, - columnName, - }: { - workspaceId: string; - objectMetadataNameSingular: string; - columnName: string; - }) { - this.logger.log( - `Updating existing indexed fields for workspace members for workspace ${workspaceId}`, - ); - - const workspaceMemberObjectMetadata = - await this.objectMetadataRepository.findOneByOrFail({ - nameSingular: objectMetadataNameSingular, - }); - - await this.indexMetadataRepository.delete({ - workspaceId, - name: this.computeExistingUniqueIndexName({ - objectMetadata: workspaceMemberObjectMetadata, - fieldMetadataToIndex: [{ name: columnName }], - }), - }); - - const indexDeletionMigration = - await this.computeExistingIndexDeletionMigration({ - objectMetadata: workspaceMemberObjectMetadata, - fieldMetadataToIndex: [{ name: columnName }], - }); - - await this.workspaceMigrationService.createCustomMigration( - generateMigrationName(`delete-${objectMetadataNameSingular}-index`), - workspaceId, - [indexDeletionMigration], - ); - - await this.workspaceMigrationRunnerService.executeMigrationFromPendingMigrations( - workspaceId, - ); - } - - private async deduplicateUniqueUserEmailFieldForWorkspaceMembers({ - dataSource, - dryRun, - }: { - dataSource: WorkspaceDataSourceInterface; - dryRun: boolean; - }) { - const workspaceMemberRepository = dataSource.getRepository( - 'workspaceMember', - { shouldBypassPermissionChecks: true }, - ); - - const duplicates = await workspaceMemberRepository - .createQueryBuilder('workspaceMember') - .select('workspaceMember.userEmail', 'userEmail') - .addSelect('COUNT(*)', 'count') - .andWhere('workspaceMember.userEmail IS NOT NULL') - .andWhere("workspaceMember.userEmail != ''") - .withDeleted() - .groupBy('workspaceMember.userEmail') - .having('COUNT(*) > 1') - .getRawMany(); - - for (const duplicate of duplicates) { - const { userEmail } = duplicate; - - const softDeletedWorkspaceMembers = await workspaceMemberRepository.find({ - where: { - userEmail, - deletedAt: Not(IsNull()), - }, - withDeleted: true, - }); - - for (const [ - i, - softDeletedWorkspaceMember, - ] of softDeletedWorkspaceMembers.entries()) { - const newUserEmail = this.computeNewFieldValues( - softDeletedWorkspaceMember.userEmail, - i, - ); - - if (!dryRun) { - await workspaceMemberRepository - .createQueryBuilder('workspaceMember') - .update() - .set({ - userEmail: newUserEmail, - }) - .where('id = :id', { id: softDeletedWorkspaceMember.id }) - .execute(); - } - this.logger.log( - `Updated workspaceMember ${softDeletedWorkspaceMembers[i].id} userEmail from ${userEmail} to ${newUserEmail}`, - ); - } - } - } - - private async deduplicateUniqueDomainNameFieldForCompanies({ - dataSource, - dryRun, - }: { - dataSource: WorkspaceDataSourceInterface; - dryRun: boolean; - }) { - const companyRepository = dataSource.getRepository('company', { - shouldBypassPermissionChecks: true, - }); - - const duplicates = await companyRepository - .createQueryBuilder('company') - .select('company.domainNamePrimaryLinkUrl', 'domainNamePrimaryLinkUrl') - .addSelect('COUNT(*)', 'count') - .andWhere('company.domainNamePrimaryLinkUrl IS NOT NULL') - .andWhere("company.domainNamePrimaryLinkUrl != ''") - .withDeleted() - .groupBy('company.domainNamePrimaryLinkUrl') - .having('COUNT(*) > 1') - .getRawMany(); - - for (const duplicate of duplicates) { - const { domainNamePrimaryLinkUrl } = duplicate; - - const softDeletedCompanies = await companyRepository.find({ - where: { - domainName: { - primaryLinkUrl: domainNamePrimaryLinkUrl, - }, - deletedAt: Not(IsNull()), - }, - withDeleted: true, - }); - - for (const [i, softDeletedCompany] of softDeletedCompanies.entries()) { - const newDomainNamePrimaryLinkUrl = this.computeNewFieldValues( - softDeletedCompany.domainName.primaryLinkUrl, - i, - ); - - if (!dryRun) { - await companyRepository - .createQueryBuilder('company') - .update() - .set({ - domainName: { - primaryLinkUrl: newDomainNamePrimaryLinkUrl, - }, - }) - .where('id = :id', { id: softDeletedCompany.id }) - .execute(); - } - this.logger.log( - `Updated company ${softDeletedCompany.id} domainNamePrimaryLinkUrl from ${domainNamePrimaryLinkUrl} to ${newDomainNamePrimaryLinkUrl}`, - ); - } - } - } - - private async deduplicateUniqueEmailFieldForPeople({ - dataSource, - dryRun, - }: { - dataSource: WorkspaceDataSourceInterface; - dryRun: boolean; - }) { - const personRepository = dataSource.getRepository('person', { - shouldBypassPermissionChecks: true, - }); - - const duplicates = await personRepository - .createQueryBuilder('person') - .select('person.emailsPrimaryEmail', 'emailsPrimaryEmail') - .addSelect('COUNT(*)', 'count') - .andWhere('person.emailsPrimaryEmail IS NOT NULL') - .andWhere("person.emailsPrimaryEmail != ''") - .withDeleted() - .groupBy('person.emailsPrimaryEmail') - .having('COUNT(*) > 1') - .getRawMany(); - - for (const duplicate of duplicates) { - const { emailsPrimaryEmail } = duplicate; - - const softDeletedPersons = await personRepository.find({ - where: { - emails: { - primaryEmail: emailsPrimaryEmail, - }, - deletedAt: Not(IsNull()), - }, - withDeleted: true, - }); - - for (const [i, softDeletedPerson] of softDeletedPersons.entries()) { - const newEmailsPrimaryEmail = this.computeNewFieldValues( - softDeletedPerson.emails.primaryEmail, - i, - ); - - if (!dryRun) { - await personRepository - .createQueryBuilder('person') - .update() - .set({ - emails: { - primaryEmail: newEmailsPrimaryEmail, - }, - }) - .where('id = :id', { id: softDeletedPerson.id }) - .execute(); - } - this.logger.log( - `Updated person ${softDeletedPerson.id} emailsPrimaryEmail from ${emailsPrimaryEmail} to ${newEmailsPrimaryEmail}`, - ); - } - } - } - - private computeNewFieldValues(fieldValue: string, i: number) { - return `${fieldValue}-old-${i}`; - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-fill-null-serverless-function-layer-id.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-fill-null-serverless-function-layer-id.command.ts deleted file mode 100644 index 06a58b87b8a..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-fill-null-serverless-function-layer-id.command.ts +++ /dev/null @@ -1,3363 +0,0 @@ -import { Logger } from '@nestjs/common'; -import { InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { ServerlessFunctionLayerEntity } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity'; -import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; - -@Command({ - name: 'upgrade:1-8:fill-null-serverless-function-layer-id', - description: - 'Fill null serverless function layer id to prepare to set serverlessFunctionId column NOT NULL', -}) -export class FillNullServerlessFunctionLayerIdCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - protected readonly logger = new Logger( - FillNullServerlessFunctionLayerIdCommand.name, - ); - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(ServerlessFunctionEntity) - protected readonly serverlessFunctionRepository: Repository, - @InjectRepository(ServerlessFunctionLayerEntity) - protected readonly serverlessFunctionLayerRepository: Repository, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Fill null serverlessFunction.serverlessFunctionLayerId for workspace ${workspaceId}`, - ); - await this.fillNullServerlessFunctionLayerId(); - } - - private async fillNullServerlessFunctionLayerId() { - const distinctWorkspaceIds = await this.serverlessFunctionRepository - .createQueryBuilder('serverlessFunction') - .select('DISTINCT serverlessFunction.workspaceId', 'workspaceId') - .where('serverlessFunction.serverlessFunctionLayerId IS NULL') - .getRawMany(); - - for (const { workspaceId } of distinctWorkspaceIds) { - const serverlessFunctionLayerId = - await this.getOrInsertCommonLayer(workspaceId); - - await this.serverlessFunctionRepository - .createQueryBuilder('serverlessFunction') - .update() - .set({ serverlessFunctionLayerId }) - .where('workspaceId = :workspaceId', { workspaceId }) - .andWhere('serverlessFunctionLayerId IS NULL') - .execute(); - } - } - - private async getOrInsertCommonLayer(workspaceId: string) { - const commonServerlessFunctionLayers = - await this.serverlessFunctionLayerRepository - .createQueryBuilder('serverlessFunctionLayer') - .select('serverlessFunctionLayer.id', 'id') - .where('serverlessFunctionLayer.workspaceId = :workspaceId', { - workspaceId, - }) - .andWhere('serverlessFunctionLayer.checksum = :checksum', { - checksum: COMMON_SERVERLESS_FUNCTION_LAYER_V1_CHECKSUM, - }) - .getRawMany(); - - if (commonServerlessFunctionLayers.length === 0) { - const insertedServerlessFunctionLayers = - await this.serverlessFunctionLayerRepository - .createQueryBuilder() - .insert() - .into('serverlessFunctionLayer') - .values({ - packageJson: COMMON_SERVERLESS_FUNCTION_LAYER_PACKAGE_JSON, - yarnLock: COMMON_SERVERLESS_FUNCTION_LAYER_YARN_LOCK, - checksum: COMMON_SERVERLESS_FUNCTION_LAYER_V1_CHECKSUM, - workspaceId, - }) - .returning('id') - .execute(); - - return insertedServerlessFunctionLayers.raw[0].id; - } - - return commonServerlessFunctionLayers[0].id; - } -} - -const COMMON_SERVERLESS_FUNCTION_LAYER_V1_CHECKSUM = - 'a8ea7aee7c82b6a9d526bdf0f5228d7c'; - -const COMMON_SERVERLESS_FUNCTION_LAYER_PACKAGE_JSON = { - dependencies: { - uuid: '^10.0.0', - axios: '^1.7.5', - sharp: '^0.33.5', - bcrypt: '^5.1.1', - winston: '^3.14.2', - archiver: '^7.0.1', - 'deep-equal': '^2.2.3', - nodemailer: '^6.9.14', - '@types/uuid': '^10.0.0', - 'body-parser': '^1.20.2', - 'lodash.omit': '^4.5.0', - 'lodash.pick': '^4.4.0', - jsonwebtoken: '^9.0.2', - 'lodash.chunk': '^4.2.0', - 'lodash.merge': '^4.6.2', - '@types/bcrypt': '^5.0.2', - 'lodash.pickby': '^4.6.0', - 'lodash.compact': '^3.0.1', - 'lodash.groupby': '^4.6.0', - 'lodash.isempty': '^4.4.0', - 'lodash.isequal': '^4.5.0', - 'lodash.identity': '^3.0.0', - 'lodash.isobject': '^3.0.2', - 'lodash.camelcase': '^4.3.0', - 'lodash.kebabcase': '^4.1.1', - 'lodash.mapvalues': '^4.6.0', - 'lodash.snakecase': '^4.1.1', - '@types/deep-equal': '^1.0.4', - 'lodash.upperfirst': '^4.3.1', - '@types/lodash.omit': '^4.5.9', - '@types/lodash.pickby': '^4.6.9', - '@types/lodash.compact': '^3.0.9', - '@types/lodash.groupby': '^4.6.9', - '@types/lodash.isempty': '^4.4.9', - '@types/lodash.isequal': '^4.5.8', - '@types/lodash.identity': '^3.0.9', - '@types/lodash.isobject': '^3.0.9', - '@types/lodash.camelcase': '^4.3.9', - '@types/lodash.kebabcase': '^4.1.9', - '@types/lodash.mapvalues': '^4.6.9', - '@types/lodash.snakecase': '^4.1.9', - '@types/lodash.upperfirst': '^4.3.9', - }, -}; - -const COMMON_SERVERLESS_FUNCTION_LAYER_YARN_LOCK = `# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@colors/colors@npm:1.6.0, @colors/colors@npm:^1.6.0": - version: 1.6.0 - resolution: "@colors/colors@npm:1.6.0" - checksum: 10c0/9328a0778a5b0db243af54455b79a69e3fb21122d6c15ef9e9fcc94881d8d17352d8b2b2590f9bdd46fac5c2d6c1636dcfc14358a20c70e22daf89e1a759b629 - languageName: node - linkType: hard - -"@dabh/diagnostics@npm:^2.0.2": - version: 2.0.3 - resolution: "@dabh/diagnostics@npm:2.0.3" - dependencies: - colorspace: "npm:1.1.x" - enabled: "npm:2.0.x" - kuler: "npm:^2.0.0" - checksum: 10c0/a5133df8492802465ed01f2f0a5784585241a1030c362d54a602ed1839816d6c93d71dde05cf2ddb4fd0796238c19774406bd62fa2564b637907b495f52425fe - languageName: node - linkType: hard - -"@emnapi/runtime@npm:^1.2.0": - version: 1.2.0 - resolution: "@emnapi/runtime@npm:1.2.0" - dependencies: - tslib: "npm:^2.4.0" - checksum: 10c0/7005ff8b67724c9e61b6cd79a3decbdb2ce25d24abd4d3d187472f200ee6e573329c30264335125fb136bd813aa9cf9f4f7c9391d04b07dd1e63ce0a3427be57 - languageName: node - linkType: hard - -"@img/sharp-darwin-arm64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-darwin-arm64@npm:0.33.5" - dependencies: - "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-darwin-arm64": - optional: true - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@img/sharp-darwin-x64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-darwin-x64@npm:0.33.5" - dependencies: - "@img/sharp-libvips-darwin-x64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-darwin-x64": - optional: true - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@img/sharp-libvips-darwin-arm64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.4" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@img/sharp-libvips-darwin-x64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.4" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-arm64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.4" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-arm@npm:1.0.5": - version: 1.0.5 - resolution: "@img/sharp-libvips-linux-arm@npm:1.0.5" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-s390x@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.4" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linux-x64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linux-x64@npm:1.0.4" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@img/sharp-libvips-linuxmusl-x64@npm:1.0.4": - version: 1.0.4 - resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@img/sharp-linux-arm64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linux-arm64@npm:0.33.5" - dependencies: - "@img/sharp-libvips-linux-arm64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linux-arm64": - optional: true - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linux-arm@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linux-arm@npm:0.33.5" - dependencies: - "@img/sharp-libvips-linux-arm": "npm:1.0.5" - dependenciesMeta: - "@img/sharp-libvips-linux-arm": - optional: true - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linux-s390x@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linux-s390x@npm:0.33.5" - dependencies: - "@img/sharp-libvips-linux-s390x": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linux-s390x": - optional: true - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linux-x64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linux-x64@npm:0.33.5" - dependencies: - "@img/sharp-libvips-linux-x64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linux-x64": - optional: true - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@img/sharp-linuxmusl-arm64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.5" - dependencies: - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linuxmusl-arm64": - optional: true - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@img/sharp-linuxmusl-x64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-linuxmusl-x64@npm:0.33.5" - dependencies: - "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" - dependenciesMeta: - "@img/sharp-libvips-linuxmusl-x64": - optional: true - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@img/sharp-wasm32@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-wasm32@npm:0.33.5" - dependencies: - "@emnapi/runtime": "npm:^1.2.0" - conditions: cpu=wasm32 - languageName: node - linkType: hard - -"@img/sharp-win32-ia32@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-win32-ia32@npm:0.33.5" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@img/sharp-win32-x64@npm:0.33.5": - version: 0.33.5 - resolution: "@img/sharp-win32-x64@npm:0.33.5" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e - languageName: node - linkType: hard - -"@mapbox/node-pre-gyp@npm:^1.0.11": - version: 1.0.11 - resolution: "@mapbox/node-pre-gyp@npm:1.0.11" - dependencies: - detect-libc: "npm:^2.0.0" - https-proxy-agent: "npm:^5.0.0" - make-dir: "npm:^3.1.0" - node-fetch: "npm:^2.6.7" - nopt: "npm:^5.0.0" - npmlog: "npm:^5.0.1" - rimraf: "npm:^3.0.2" - semver: "npm:^7.3.5" - tar: "npm:^6.1.11" - bin: - node-pre-gyp: bin/node-pre-gyp - checksum: 10c0/2b24b93c31beca1c91336fa3b3769fda98e202fb7f9771f0f4062588d36dcc30fcf8118c36aa747fa7f7610d8cf601872bdaaf62ce7822bb08b545d1bbe086cc - languageName: node - linkType: hard - -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/325e0db7b287d4154ecd164c0815c08007abfb07653cc57bceded17bb7fd240998a3cbdbe87d700e30bef494885eccc725ab73b668020811d56623d145b524ae - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c37a5b4842bfdece3d14dfdb054f73fe15ed2d3da61b34ff76629fb5b1731647c49166fd2a8bf8b56fcfa51200382385ea8909a3cbecdad612310c114d3f6c99 - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd - languageName: node - linkType: hard - -"@types/bcrypt@npm:^5.0.2": - version: 5.0.2 - resolution: "@types/bcrypt@npm:5.0.2" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/dd7f05e183b9b1fc08ec499069febf197ab8e9c720766b5bbb5628395082e248f9a444c60882fe7788361fcadc302e21e055ab9c26a300f100e08791c353e6aa - languageName: node - linkType: hard - -"@types/deep-equal@npm:^1.0.4": - version: 1.0.4 - resolution: "@types/deep-equal@npm:1.0.4" - checksum: 10c0/583d41df5d7655b0bd5fdd4b173b045396108fad2191e1bd3b1bfc188f98d24fafff34a8a09c04f9c650c87d82e9f25a8119d269044522da0770a05075fbf74d - languageName: node - linkType: hard - -"@types/lodash.camelcase@npm:^4.3.9": - version: 4.3.9 - resolution: "@types/lodash.camelcase@npm:4.3.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/d6c42c800624b75b079ff7862d258d7c8236837f8485a4fe9f92e5e7d3e9ccaef2eb202e24e8f04d209ad5573c85edc7871d0cecc831454a501d594b11f1311b - languageName: node - linkType: hard - -"@types/lodash.compact@npm:^3.0.9": - version: 3.0.9 - resolution: "@types/lodash.compact@npm:3.0.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/9eff2fecd6773352f5b762a2c58f261e3c83f61d7297efe94b08f9a4b524b24ccc2de5e8d728e2ffd42472fa06973df0856e474eb74b5e614813d26d7436efc6 - languageName: node - linkType: hard - -"@types/lodash.debounce@npm:^4.0.9": - version: 4.0.9 - resolution: "@types/lodash.debounce@npm:4.0.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/9fbb24e5e52616faf60ba5c82d8c6517f4b86fc6e9ab353b4c56c0760f63d9bf53af3f2d8f6c37efa48090359fb96dba1087d497758511f6c40677002191d042 - languageName: node - linkType: hard - -"@types/lodash.groupby@npm:^4.6.9": - version: 4.6.9 - resolution: "@types/lodash.groupby@npm:4.6.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/1302531f76da99cc8f1bbd486a8c7048a833352b12c39eb5b2ded01173dd5fff76f2c7ace04f08b51c55840271170f1cfbffe4e454dde8597c3ee996e70d4e11 - languageName: node - linkType: hard - -"@types/lodash.identity@npm:^3.0.9": - version: 3.0.9 - resolution: "@types/lodash.identity@npm:3.0.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/fac961d04fe704b04bef608e9bffd8c7ea44d1d6f014c01ff520cd63e22fa58aa843d2017c18e31bcf21b35124b9c5c7dbf12b33362020d15f5c0591ff4cbc19 - languageName: node - linkType: hard - -"@types/lodash.isempty@npm:^4.4.9": - version: 4.4.9 - resolution: "@types/lodash.isempty@npm:4.4.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/581b3b1e896524b00cb32dc08f1aea328cec0ab95720f24e0f6d9e8a2c9be5b65e4ad030ec45f58f656ab8dcf555f039863862e04c91051a24ee27cac8a994ab - languageName: node - linkType: hard - -"@types/lodash.isequal@npm:^4.5.8": - version: 4.5.8 - resolution: "@types/lodash.isequal@npm:4.5.8" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/6db28cacf165d55421fbf2970ccfb1682a7b82b743bb7aba4398fa8ab98f1711fca2fe4afa1aa2b7b4afb3eff76c8aca13b22206f5efeb038d99e41300589bca - languageName: node - linkType: hard - -"@types/lodash.isobject@npm:^3.0.9": - version: 3.0.9 - resolution: "@types/lodash.isobject@npm:3.0.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/ab35ebaf0e53bce9f419194e8857da01a0f4ed668b2a61860f724e6ecedaad72bfe636bd6d98f9969cadf654595e317d19f7ba05cc3dfbea49966feb71ab687a - languageName: node - linkType: hard - -"@types/lodash.kebabcase@npm:^4.1.9": - version: 4.1.9 - resolution: "@types/lodash.kebabcase@npm:4.1.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/f00fbfb891fd1883e3fab2286fa2b23a013550b3498013c8c8c5e3ed437f52543afe8e8dc899b4f3317bab8db403bb281de863274a6fa12f088667378fd7b475 - languageName: node - linkType: hard - -"@types/lodash.mapvalues@npm:^4.6.9": - version: 4.6.9 - resolution: "@types/lodash.mapvalues@npm:4.6.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/09216965c2c64854c8c765f38f436333e931b98638a0b9d996bda7b6d538593a4cfe53cad7415d50593be48d76798763b97dc2d7925ab200dce1fa5b630ed3b4 - languageName: node - linkType: hard - -"@types/lodash.omit@npm:^4.5.9": - version: 4.5.9 - resolution: "@types/lodash.omit@npm:4.5.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/3b60c8ee8e9a691392d9a3ceabb32c85f888784bd3307eac3de01aeb7ff37383dc8899f027fe852641f5e0f56158fb19785cc3d20a4922e85b5810f14cba23f6 - languageName: node - linkType: hard - -"@types/lodash.pickby@npm:^4.6.9": - version: 4.6.9 - resolution: "@types/lodash.pickby@npm:4.6.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/a572e22a24f73e9041e1beca8bb8125875734471c440f7fe9ff48ced10e6ffe45a2392098940f4c1327252e3455afd0e2ea0cc3908a2e3bd0bafe60335e27e6c - languageName: node - linkType: hard - -"@types/lodash.snakecase@npm:^4.1.9": - version: 4.1.9 - resolution: "@types/lodash.snakecase@npm:4.1.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/69c565f5d914628314de307ac30bcaf6060d2a1e782e87bc25a9c0d287ad06a29cc9308af285ea49e485dba3d909d4fc3b0a0b279cf7545492b37926f1fb2f8f - languageName: node - linkType: hard - -"@types/lodash.upperfirst@npm:^4.3.9": - version: 4.3.9 - resolution: "@types/lodash.upperfirst@npm:4.3.9" - dependencies: - "@types/lodash": "npm:*" - checksum: 10c0/4f6be2e9d4b03a0739972fce3044c28bdf7fd96d5a3c773464f7b8e035d687e46878ad9b958a2fac448807636c0675962e3fbedf20af4fc74bc91bbaf471114f - languageName: node - linkType: hard - -"@types/lodash@npm:*": - version: 4.17.7 - resolution: "@types/lodash@npm:4.17.7" - checksum: 10c0/40c965b5ffdcf7ff5c9105307ee08b782da228c01b5c0529122c554c64f6b7168fc8f11dc79aa7bae4e67e17efafaba685dc3a47e294dbf52a65ed2b67100561 - languageName: node - linkType: hard - -"@types/node@npm:*": - version: 22.5.1 - resolution: "@types/node@npm:22.5.1" - dependencies: - undici-types: "npm:~6.19.2" - checksum: 10c0/35373176d8a1d4e16004a1ed303e68d39e4c6341024dc056f2577982df98c1a045a6b677f12ed557796f09bbf7d621f428f6874cc37ed28f7b336fa604b5f6a6 - languageName: node - linkType: hard - -"@types/triple-beam@npm:^1.3.2": - version: 1.3.5 - resolution: "@types/triple-beam@npm:1.3.5" - checksum: 10c0/d5d7f25da612f6d79266f4f1bb9c1ef8f1684e9f60abab251e1261170631062b656ba26ff22631f2760caeafd372abc41e64867cde27fba54fafb73a35b9056a - languageName: node - linkType: hard - -"@types/uuid@npm:^10.0.0": - version: 10.0.0 - resolution: "@types/uuid@npm:10.0.0" - checksum: 10c0/9a1404bf287164481cb9b97f6bb638f78f955be57c40c6513b7655160beb29df6f84c915aaf4089a1559c216557dc4d2f79b48d978742d3ae10b937420ddac60 - languageName: node - linkType: hard - -"abbrev@npm:1": - version: 1.1.1 - resolution: "abbrev@npm:1.1.1" - checksum: 10c0/3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 - languageName: node - linkType: hard - -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10c0/f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 - languageName: node - linkType: hard - -"abort-controller@npm:^3.0.0": - version: 3.0.0 - resolution: "abort-controller@npm:3.0.0" - dependencies: - event-target-shim: "npm:^5.0.0" - checksum: 10c0/90ccc50f010250152509a344eb2e71977fbf8db0ab8f1061197e3275ddf6c61a41a6edfd7b9409c664513131dd96e962065415325ef23efa5db931b382d24ca5 - languageName: node - linkType: hard - -"agent-base@npm:6": - version: 6.0.2 - resolution: "agent-base@npm:6.0.2" - dependencies: - debug: "npm:4" - checksum: 10c0/dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 - languageName: node - linkType: hard - -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10c0/e59ce7bed9c63bf071a30cc471f2933862044c97fd9958967bfe22521d7a0f601ce4ed5a8c011799d0c726ca70312142ae193bbebb60f576b52be19d4a363b50 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10c0/a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: 10c0/cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c - languageName: node - linkType: hard - -"aproba@npm:^1.0.3 || ^2.0.0": - version: 2.0.0 - resolution: "aproba@npm:2.0.0" - checksum: 10c0/d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5 - languageName: node - linkType: hard - -"archiver-utils@npm:^5.0.0, archiver-utils@npm:^5.0.2": - version: 5.0.2 - resolution: "archiver-utils@npm:5.0.2" - dependencies: - glob: "npm:^10.0.0" - graceful-fs: "npm:^4.2.0" - is-stream: "npm:^2.0.1" - lazystream: "npm:^1.0.0" - lodash: "npm:^4.17.15" - normalize-path: "npm:^3.0.0" - readable-stream: "npm:^4.0.0" - checksum: 10c0/3782c5fa9922186aa1a8e41ed0c2867569faa5f15c8e5e6418ea4c1b730b476e21bd68270b3ea457daf459ae23aaea070b2b9f90cf90a59def8dc79b9e4ef538 - languageName: node - linkType: hard - -"archiver@npm:^7.0.1": - version: 7.0.1 - resolution: "archiver@npm:7.0.1" - dependencies: - archiver-utils: "npm:^5.0.2" - async: "npm:^3.2.4" - buffer-crc32: "npm:^1.0.0" - readable-stream: "npm:^4.0.0" - readdir-glob: "npm:^1.1.2" - tar-stream: "npm:^3.0.0" - zip-stream: "npm:^6.0.1" - checksum: 10c0/02afd87ca16f6184f752db8e26884e6eff911c476812a0e7f7b26c4beb09f06119807f388a8e26ed2558aa8ba9db28646ebd147a4f99e46813b8b43158e1438e - languageName: node - linkType: hard - -"are-we-there-yet@npm:^2.0.0": - version: 2.0.0 - resolution: "are-we-there-yet@npm:2.0.0" - dependencies: - delegates: "npm:^1.0.0" - readable-stream: "npm:^3.6.0" - checksum: 10c0/375f753c10329153c8d66dc95e8f8b6c7cc2aa66e05cb0960bd69092b10dae22900cacc7d653ad11d26b3ecbdbfe1e8bfb6ccf0265ba8077a7d979970f16b99c - languageName: node - linkType: hard - -"array-buffer-byte-length@npm:^1.0.0": - version: 1.0.1 - resolution: "array-buffer-byte-length@npm:1.0.1" - dependencies: - call-bind: "npm:^1.0.5" - is-array-buffer: "npm:^3.0.4" - checksum: 10c0/f5cdf54527cd18a3d2852ddf73df79efec03829e7373a8322ef5df2b4ef546fb365c19c71d6b42d641cb6bfe0f1a2f19bc0ece5b533295f86d7c3d522f228917 - languageName: node - linkType: hard - -"async@npm:^3.2.3, async@npm:^3.2.4": - version: 3.2.6 - resolution: "async@npm:3.2.6" - checksum: 10c0/36484bb15ceddf07078688d95e27076379cc2f87b10c03b6dd8a83e89475a3c8df5848859dd06a4c95af1e4c16fc973de0171a77f18ea00be899aca2a4f85e70 - languageName: node - linkType: hard - -"asynckit@npm:^0.4.0": - version: 0.4.0 - resolution: "asynckit@npm:0.4.0" - checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d - languageName: node - linkType: hard - -"available-typed-arrays@npm:^1.0.7": - version: 1.0.7 - resolution: "available-typed-arrays@npm:1.0.7" - dependencies: - possible-typed-array-names: "npm:^1.0.0" - checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2 - languageName: node - linkType: hard - -"axios@npm:^1.7.5": - version: 1.7.5 - resolution: "axios@npm:1.7.5" - dependencies: - follow-redirects: "npm:^1.15.6" - form-data: "npm:^4.0.0" - proxy-from-env: "npm:^1.1.0" - checksum: 10c0/1d5daeb28b3d1bb2a7b9f0743433c4bfbeaddc15461e50ebde487eec6c009af2515749d5261096dd430c90cd891bd310bcba5ec3967bae2033c4a307f58a6ad3 - languageName: node - linkType: hard - -"b4a@npm:^1.6.4": - version: 1.6.6 - resolution: "b4a@npm:1.6.6" - checksum: 10c0/56f30277666cb511a15829e38d369b114df7dc8cec4cedc09cc5d685bc0f27cb63c7bcfb58e09a19a1b3c4f2541069ab078b5328542e85d74a39620327709a38 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"bare-events@npm:^2.2.0": - version: 2.4.2 - resolution: "bare-events@npm:2.4.2" - checksum: 10c0/09fa923061f31f815e83504e2ed4a8ba87732a01db40a7fae703dbb7eef7f05d99264b5e186074cbe9698213990d1af564c62cca07a5ff88baea8099ad9a6303 - languageName: node - linkType: hard - -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"bcrypt@npm:^5.1.1": - version: 5.1.1 - resolution: "bcrypt@npm:5.1.1" - dependencies: - "@mapbox/node-pre-gyp": "npm:^1.0.11" - node-addon-api: "npm:^5.0.0" - checksum: 10c0/743231158c866bddc46f25eb8e9617fe38bc1a6f5f3052aba35e361d349b7f8fb80e96b45c48a4c23c45c29967ccd11c81cf31166454fc0ab019801c336cab40 - languageName: node - linkType: hard - -"body-parser@npm:^1.20.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" - dependencies: - bytes: "npm:3.1.2" - content-type: "npm:~1.0.5" - debug: "npm:2.6.9" - depd: "npm:2.0.0" - destroy: "npm:1.2.0" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - on-finished: "npm:2.4.1" - qs: "npm:6.11.0" - raw-body: "npm:2.5.2" - type-is: "npm:~1.6.18" - unpipe: "npm:1.0.0" - checksum: 10c0/06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f - languageName: node - linkType: hard - -"buffer-crc32@npm:^1.0.0": - version: 1.0.0 - resolution: "buffer-crc32@npm:1.0.0" - checksum: 10c0/8b86e161cee4bb48d5fa622cbae4c18f25e4857e5203b89e23de59e627ab26beb82d9d7999f2b8de02580165f61f83f997beaf02980cdf06affd175b651921ab - languageName: node - linkType: hard - -"buffer-equal-constant-time@npm:1.0.1": - version: 1.0.1 - resolution: "buffer-equal-constant-time@npm:1.0.1" - checksum: 10c0/fb2294e64d23c573d0dd1f1e7a466c3e978fe94a4e0f8183937912ca374619773bef8e2aceb854129d2efecbbc515bbd0cc78d2734a3e3031edb0888531bbc8e - languageName: node - linkType: hard - -"buffer@npm:^6.0.3": - version: 6.0.3 - resolution: "buffer@npm:6.0.3" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.2.1" - checksum: 10c0/2a905fbbcde73cc5d8bd18d1caa23715d5f83a5935867c2329f0ac06104204ba7947be098fe1317fbd8830e26090ff8e764f08cd14fefc977bb248c3487bcbd0 - languageName: node - linkType: hard - -"bytes@npm:3.1.2": - version: 3.1.2 - resolution: "bytes@npm:3.1.2" - checksum: 10c0/76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e - languageName: node - linkType: hard - -"cacache@npm:^18.0.0": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" - dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10c0/6c055bafed9de4f3dcc64ac3dc7dd24e863210902b7c470eb9ce55a806309b3efff78033e3d8b4f7dcc5d467f2db43c6a2857aaaf26f0094b8a351d44c42179f - languageName: node - linkType: hard - -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.6, call-bind@npm:^1.0.7": - version: 1.0.7 - resolution: "call-bind@npm:1.0.7" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - set-function-length: "npm:^1.2.1" - checksum: 10c0/a3ded2e423b8e2a265983dba81c27e125b48eefb2655e7dfab6be597088da3d47c47976c24bc51b8fd9af1061f8f87b4ab78a314f3c77784b2ae2ba535ad8b8d - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: 10c0/594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 10c0/1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.3": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10c0/5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10c0/566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - -"color-name@npm:^1.0.0, color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"color-string@npm:^1.6.0, color-string@npm:^1.9.0": - version: 1.9.1 - resolution: "color-string@npm:1.9.1" - dependencies: - color-name: "npm:^1.0.0" - simple-swizzle: "npm:^0.2.2" - checksum: 10c0/b0bfd74c03b1f837f543898b512f5ea353f71630ccdd0d66f83028d1f0924a7d4272deb278b9aef376cacf1289b522ac3fb175e99895283645a2dc3a33af2404 - languageName: node - linkType: hard - -"color-support@npm:^1.1.2": - version: 1.1.3 - resolution: "color-support@npm:1.1.3" - bin: - color-support: bin.js - checksum: 10c0/8ffeaa270a784dc382f62d9be0a98581db43e11eee301af14734a6d089bd456478b1a8b3e7db7ca7dc5b18a75f828f775c44074020b51c05fc00e6d0992b1cc6 - languageName: node - linkType: hard - -"color@npm:^3.1.3": - version: 3.2.1 - resolution: "color@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.3" - color-string: "npm:^1.6.0" - checksum: 10c0/39345d55825884c32a88b95127d417a2c24681d8b57069413596d9fcbb721459ef9d9ec24ce3e65527b5373ce171b73e38dbcd9c830a52a6487e7f37bf00e83c - languageName: node - linkType: hard - -"color@npm:^4.2.3": - version: 4.2.3 - resolution: "color@npm:4.2.3" - dependencies: - color-convert: "npm:^2.0.1" - color-string: "npm:^1.9.0" - checksum: 10c0/7fbe7cfb811054c808349de19fb380252e5e34e61d7d168ec3353e9e9aacb1802674bddc657682e4e9730c2786592a4de6f8283e7e0d3870b829bb0b7b2f6118 - languageName: node - linkType: hard - -"colorspace@npm:1.1.x": - version: 1.1.4 - resolution: "colorspace@npm:1.1.4" - dependencies: - color: "npm:^3.1.3" - text-hex: "npm:1.0.x" - checksum: 10c0/af5f91ff7f8e146b96e439ac20ed79b197210193bde721b47380a75b21751d90fa56390c773bb67c0aedd34ff85091883a437ab56861c779bd507d639ba7e123 - languageName: node - linkType: hard - -"combined-stream@npm:^1.0.8": - version: 1.0.8 - resolution: "combined-stream@npm:1.0.8" - dependencies: - delayed-stream: "npm:~1.0.0" - checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 - languageName: node - linkType: hard - -"compress-commons@npm:^6.0.2": - version: 6.0.2 - resolution: "compress-commons@npm:6.0.2" - dependencies: - crc-32: "npm:^1.2.0" - crc32-stream: "npm:^6.0.0" - is-stream: "npm:^2.0.1" - normalize-path: "npm:^3.0.0" - readable-stream: "npm:^4.0.0" - checksum: 10c0/2347031b7c92c8ed5011b07b93ec53b298fa2cd1800897532ac4d4d1aeae06567883f481b6e35f13b65fc31b190c751df6635434d525562f0203fde76f1f0814 - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": - version: 1.1.0 - resolution: "console-control-strings@npm:1.1.0" - checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 - languageName: node - linkType: hard - -"content-type@npm:~1.0.5": - version: 1.0.5 - resolution: "content-type@npm:1.0.5" - checksum: 10c0/b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 - languageName: node - linkType: hard - -"crc-32@npm:^1.2.0": - version: 1.2.2 - resolution: "crc-32@npm:1.2.2" - bin: - crc32: bin/crc32.njs - checksum: 10c0/11dcf4a2e77ee793835d49f2c028838eae58b44f50d1ff08394a610bfd817523f105d6ae4d9b5bef0aad45510f633eb23c903e9902e4409bed1ce70cb82b9bf0 - languageName: node - linkType: hard - -"crc32-stream@npm:^6.0.0": - version: 6.0.0 - resolution: "crc32-stream@npm:6.0.0" - dependencies: - crc-32: "npm:^1.2.0" - readable-stream: "npm:^4.0.0" - checksum: 10c0/bf9c84571ede2d119c2b4f3a9ef5eeb9ff94b588493c0d3862259af86d3679dcce1c8569dd2b0a6eff2f35f5e2081cc1263b846d2538d4054da78cf34f262a3d - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 - languageName: node - linkType: hard - -"debug@npm:2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: "npm:2.0.0" - checksum: 10c0/121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.3.4": - version: 4.3.6 - resolution: "debug@npm:4.3.6" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/3293416bff072389c101697d4611c402a6bacd1900ac20c0492f61a9cdd6b3b29750fc7f5e299f8058469ef60ff8fb79b86395a30374fbd2490113c1c7112285 - languageName: node - linkType: hard - -"deep-equal@npm:^2.2.3": - version: 2.2.3 - resolution: "deep-equal@npm:2.2.3" - dependencies: - array-buffer-byte-length: "npm:^1.0.0" - call-bind: "npm:^1.0.5" - es-get-iterator: "npm:^1.1.3" - get-intrinsic: "npm:^1.2.2" - is-arguments: "npm:^1.1.1" - is-array-buffer: "npm:^3.0.2" - is-date-object: "npm:^1.0.5" - is-regex: "npm:^1.1.4" - is-shared-array-buffer: "npm:^1.0.2" - isarray: "npm:^2.0.5" - object-is: "npm:^1.1.5" - object-keys: "npm:^1.1.1" - object.assign: "npm:^4.1.4" - regexp.prototype.flags: "npm:^1.5.1" - side-channel: "npm:^1.0.4" - which-boxed-primitive: "npm:^1.0.2" - which-collection: "npm:^1.0.1" - which-typed-array: "npm:^1.1.13" - checksum: 10c0/a48244f90fa989f63ff5ef0cc6de1e4916b48ea0220a9c89a378561960814794a5800c600254482a2c8fd2e49d6c2e196131dc983976adb024c94a42dfe4949f - languageName: node - linkType: hard - -"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4": - version: 1.1.4 - resolution: "define-data-property@npm:1.1.4" - dependencies: - es-define-property: "npm:^1.0.0" - es-errors: "npm:^1.3.0" - gopd: "npm:^1.0.1" - checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37 - languageName: node - linkType: hard - -"define-properties@npm:^1.2.1": - version: 1.2.1 - resolution: "define-properties@npm:1.2.1" - dependencies: - define-data-property: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.0" - object-keys: "npm:^1.1.1" - checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 - languageName: node - linkType: hard - -"delayed-stream@npm:~1.0.0": - version: 1.0.0 - resolution: "delayed-stream@npm:1.0.0" - checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 - languageName: node - linkType: hard - -"delegates@npm:^1.0.0": - version: 1.0.0 - resolution: "delegates@npm:1.0.0" - checksum: 10c0/ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 - languageName: node - linkType: hard - -"depd@npm:2.0.0": - version: 2.0.0 - resolution: "depd@npm:2.0.0" - checksum: 10c0/58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c - languageName: node - linkType: hard - -"destroy@npm:1.2.0": - version: 1.2.0 - resolution: "destroy@npm:1.2.0" - checksum: 10c0/bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 - languageName: node - linkType: hard - -"detect-libc@npm:^2.0.0, detect-libc@npm:^2.0.3": - version: 2.0.3 - resolution: "detect-libc@npm:2.0.3" - checksum: 10c0/88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - -"ecdsa-sig-formatter@npm:1.0.11": - version: 1.0.11 - resolution: "ecdsa-sig-formatter@npm:1.0.11" - dependencies: - safe-buffer: "npm:^5.0.1" - checksum: 10c0/ebfbf19d4b8be938f4dd4a83b8788385da353d63307ede301a9252f9f7f88672e76f2191618fd8edfc2f24679236064176fab0b78131b161ee73daa37125408c - languageName: node - linkType: hard - -"ee-first@npm:1.1.1": - version: 1.1.1 - resolution: "ee-first@npm:1.1.1" - checksum: 10c0/b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"enabled@npm:2.0.x": - version: 2.0.0 - resolution: "enabled@npm:2.0.0" - checksum: 10c0/3b2c2af9bc7f8b9e291610f2dde4a75cf6ee52a68f4dd585482fbdf9a55d65388940e024e56d40bb03e05ef6671f5f53021fa8b72a20e954d7066ec28166713f - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - -"es-define-property@npm:^1.0.0": - version: 1.0.0 - resolution: "es-define-property@npm:1.0.0" - dependencies: - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/6bf3191feb7ea2ebda48b577f69bdfac7a2b3c9bcf97307f55fd6ef1bbca0b49f0c219a935aca506c993d8c5d8bddd937766cb760cd5e5a1071351f2df9f9aa4 - languageName: node - linkType: hard - -"es-errors@npm:^1.3.0": - version: 1.3.0 - resolution: "es-errors@npm:1.3.0" - checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85 - languageName: node - linkType: hard - -"es-get-iterator@npm:^1.1.3": - version: 1.1.3 - resolution: "es-get-iterator@npm:1.1.3" - dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.1.3" - has-symbols: "npm:^1.0.3" - is-arguments: "npm:^1.1.1" - is-map: "npm:^2.0.2" - is-set: "npm:^2.0.2" - is-string: "npm:^1.0.7" - isarray: "npm:^2.0.5" - stop-iteration-iterator: "npm:^1.0.0" - checksum: 10c0/ebd11effa79851ea75d7f079405f9d0dc185559fd65d986c6afea59a0ff2d46c2ed8675f19f03dce7429d7f6c14ff9aede8d121fbab78d75cfda6a263030bac0 - languageName: node - linkType: hard - -"event-target-shim@npm:^5.0.0": - version: 5.0.1 - resolution: "event-target-shim@npm:5.0.1" - checksum: 10c0/0255d9f936215fd206156fd4caa9e8d35e62075d720dc7d847e89b417e5e62cf1ce6c9b4e0a1633a9256de0efefaf9f8d26924b1f3c8620cffb9db78e7d3076b - languageName: node - linkType: hard - -"events@npm:^3.3.0": - version: 3.3.0 - resolution: "events@npm:3.3.0" - checksum: 10c0/d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10c0/160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 - languageName: node - linkType: hard - -"fast-fifo@npm:^1.2.0, fast-fifo@npm:^1.3.2": - version: 1.3.2 - resolution: "fast-fifo@npm:1.3.2" - checksum: 10c0/d53f6f786875e8b0529f784b59b4b05d4b5c31c651710496440006a398389a579c8dbcd2081311478b5bf77f4b0b21de69109c5a4eabea9d8e8783d1eb864e4c - languageName: node - linkType: hard - -"fecha@npm:^4.2.0": - version: 4.2.3 - resolution: "fecha@npm:4.2.3" - checksum: 10c0/0e895965959cf6a22bb7b00f0bf546f2783836310f510ddf63f463e1518d4c96dec61ab33fdfd8e79a71b4856a7c865478ce2ee8498d560fe125947703c9b1cf - languageName: node - linkType: hard - -"fn.name@npm:1.x.x": - version: 1.1.0 - resolution: "fn.name@npm:1.1.0" - checksum: 10c0/8ad62aa2d4f0b2a76d09dba36cfec61c540c13a0fd72e5d94164e430f987a7ce6a743112bbeb14877c810ef500d1f73d7f56e76d029d2e3413f20d79e3460a9a - languageName: node - linkType: hard - -"follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" - peerDependenciesMeta: - debug: - optional: true - checksum: 10c0/9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 - languageName: node - linkType: hard - -"for-each@npm:^0.3.3": - version: 0.3.3 - resolution: "for-each@npm:0.3.3" - dependencies: - is-callable: "npm:^1.1.3" - checksum: 10c0/22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10c0/028f1d41000553fcfa6c4bb5c372963bf3d9bf0b1f25a87d1a6253014343fb69dfb1b42d9625d7cf44c8ba429940f3d0ff718b62105d4d4a4f6ef8ca0a53faa2 - languageName: node - linkType: hard - -"form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" - dependencies: - asynckit: "npm:^0.4.0" - combined-stream: "npm:^1.0.8" - mime-types: "npm:^2.1.12" - checksum: 10c0/cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.3": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca - languageName: node - linkType: hard - -"gauge@npm:^3.0.0": - version: 3.0.2 - resolution: "gauge@npm:3.0.2" - dependencies: - aproba: "npm:^1.0.3 || ^2.0.0" - color-support: "npm:^1.1.2" - console-control-strings: "npm:^1.0.0" - has-unicode: "npm:^2.0.1" - object-assign: "npm:^4.1.1" - signal-exit: "npm:^3.0.0" - string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" - wide-align: "npm:^1.1.2" - checksum: 10c0/75230ccaf216471e31025c7d5fcea1629596ca20792de50c596eb18ffb14d8404f927cd55535aab2eeecd18d1e11bd6f23ec3c2e9878d2dda1dc74bccc34b913 - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2, get-intrinsic@npm:^1.2.4": - version: 1.2.4 - resolution: "get-intrinsic@npm:1.2.4" - dependencies: - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - has-proto: "npm:^1.0.1" - has-symbols: "npm:^1.0.3" - hasown: "npm:^2.0.0" - checksum: 10c0/0a9b82c16696ed6da5e39b1267104475c47e3a9bdbe8b509dfe1710946e38a87be70d759f4bb3cda042d76a41ef47fe769660f3b7c0d1f68750299344ffb15b7 - languageName: node - linkType: hard - -"glob@npm:^10.0.0, glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e - languageName: node - linkType: hard - -"glob@npm:^7.1.3": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - -"gopd@npm:^1.0.1": - version: 1.0.1 - resolution: "gopd@npm:1.0.1" - dependencies: - get-intrinsic: "npm:^1.1.3" - checksum: 10c0/505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"has-bigints@npm:^1.0.1": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 10c0/724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": - version: 1.0.2 - resolution: "has-property-descriptors@npm:1.0.2" - dependencies: - es-define-property: "npm:^1.0.0" - checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236 - languageName: node - linkType: hard - -"has-proto@npm:^1.0.1": - version: 1.0.3 - resolution: "has-proto@npm:1.0.3" - checksum: 10c0/35a6989f81e9f8022c2f4027f8b48a552de714938765d019dbea6bb547bd49ce5010a3c7c32ec6ddac6e48fc546166a3583b128f5a7add8b058a6d8b4afec205 - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: 10c0/e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.0, has-tostringtag@npm:^1.0.2": - version: 1.0.2 - resolution: "has-tostringtag@npm:1.0.2" - dependencies: - has-symbols: "npm:^1.0.3" - checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c - languageName: node - linkType: hard - -"has-unicode@npm:^2.0.1": - version: 2.0.1 - resolution: "has-unicode@npm:2.0.1" - checksum: 10c0/ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c - languageName: node - linkType: hard - -"hasown@npm:^2.0.0": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc - languageName: node - linkType: hard - -"http-errors@npm:2.0.0": - version: 2.0.0 - resolution: "http-errors@npm:2.0.0" - dependencies: - depd: "npm:2.0.0" - inherits: "npm:2.0.4" - setprototypeof: "npm:1.2.0" - statuses: "npm:2.0.1" - toidentifier: "npm:1.0.1" - checksum: 10c0/fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^5.0.0": - version: 5.0.1 - resolution: "https-proxy-agent@npm:5.0.1" - dependencies: - agent-base: "npm:6" - debug: "npm:4" - checksum: 10c0/6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" - dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:4" - checksum: 10c0/2490e3acec397abeb88807db52cac59102d5ed758feee6df6112ab3ccd8325e8a1ce8bce6f4b66e5470eca102d31e425ace904242e4fa28dbe0c59c4bafa7b2c - languageName: node - linkType: hard - -"iconv-lite@npm:0.4.24": - version: 0.4.24 - resolution: "iconv-lite@npm:0.4.24" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3" - checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"ieee754@npm:^1.2.1": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 10c0/1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"internal-slot@npm:^1.0.4": - version: 1.0.7 - resolution: "internal-slot@npm:1.0.7" - dependencies: - es-errors: "npm:^1.3.0" - hasown: "npm:^2.0.0" - side-channel: "npm:^1.0.4" - checksum: 10c0/f8b294a4e6ea3855fc59551bbf35f2b832cf01fd5e6e2a97f5c201a071cc09b49048f856e484b67a6c721da5e55736c5b6ddafaf19e2dbeb4a3ff1821680de6c - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc - languageName: node - linkType: hard - -"is-arguments@npm:^1.1.1": - version: 1.1.1 - resolution: "is-arguments@npm:1.1.1" - dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/5ff1f341ee4475350adfc14b2328b38962564b7c2076be2f5bac7bd9b61779efba99b9f844a7b82ba7654adccf8e8eb19d1bb0cc6d1c1a085e498f6793d4328f - languageName: node - linkType: hard - -"is-array-buffer@npm:^3.0.2, is-array-buffer@npm:^3.0.4": - version: 3.0.4 - resolution: "is-array-buffer@npm:3.0.4" - dependencies: - call-bind: "npm:^1.0.2" - get-intrinsic: "npm:^1.2.1" - checksum: 10c0/42a49d006cc6130bc5424eae113e948c146f31f9d24460fc0958f855d9d810e6fd2e4519bf19aab75179af9c298ea6092459d8cafdec523cd19e529b26eab860 - languageName: node - linkType: hard - -"is-arrayish@npm:^0.3.1": - version: 0.3.2 - resolution: "is-arrayish@npm:0.3.2" - checksum: 10c0/f59b43dc1d129edb6f0e282595e56477f98c40278a2acdc8b0a5c57097c9eff8fe55470493df5775478cf32a4dc8eaf6d3a749f07ceee5bc263a78b2434f6a54 - languageName: node - linkType: hard - -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" - dependencies: - has-bigints: "npm:^1.0.1" - checksum: 10c0/eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 - languageName: node - linkType: hard - -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" - dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 - languageName: node - linkType: hard - -"is-callable@npm:^1.1.3": - version: 1.2.7 - resolution: "is-callable@npm:1.2.7" - checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f - languageName: node - linkType: hard - -"is-date-object@npm:^1.0.5": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10c0/85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d - languageName: node - linkType: hard - -"is-map@npm:^2.0.2, is-map@npm:^2.0.3": - version: 2.0.3 - resolution: "is-map@npm:2.0.3" - checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc - languageName: node - linkType: hard - -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b - languageName: node - linkType: hard - -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" - dependencies: - call-bind: "npm:^1.0.2" - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 - languageName: node - linkType: hard - -"is-set@npm:^2.0.2, is-set@npm:^2.0.3": - version: 2.0.3 - resolution: "is-set@npm:2.0.3" - checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.3 - resolution: "is-shared-array-buffer@npm:1.0.3" - dependencies: - call-bind: "npm:^1.0.7" - checksum: 10c0/adc11ab0acbc934a7b9e5e9d6c588d4ec6682f6fea8cda5180721704fa32927582ede5b123349e32517fdadd07958973d24716c80e7ab198970c47acc09e59c7 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0, is-stream@npm:^2.0.1": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 - languageName: node - linkType: hard - -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: "npm:^1.0.0" - checksum: 10c0/905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" - dependencies: - has-symbols: "npm:^1.0.2" - checksum: 10c0/9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 - languageName: node - linkType: hard - -"is-weakmap@npm:^2.0.2": - version: 2.0.2 - resolution: "is-weakmap@npm:2.0.2" - checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 - languageName: node - linkType: hard - -"is-weakset@npm:^2.0.3": - version: 2.0.3 - resolution: "is-weakset@npm:2.0.3" - dependencies: - call-bind: "npm:^1.0.7" - get-intrinsic: "npm:^1.2.4" - checksum: 10c0/8ad6141b6a400e7ce7c7442a13928c676d07b1f315ab77d9912920bf5f4170622f43126f111615788f26c3b1871158a6797c862233124507db0bcc33a9537d1a - languageName: node - linkType: hard - -"isarray@npm:^2.0.5": - version: 2.0.5 - resolution: "isarray@npm:2.0.5" - checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd - languageName: node - linkType: hard - -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - -"jsonwebtoken@npm:^9.0.2": - version: 9.0.2 - resolution: "jsonwebtoken@npm:9.0.2" - dependencies: - jws: "npm:^3.2.2" - lodash.includes: "npm:^4.3.0" - lodash.isboolean: "npm:^3.0.3" - lodash.isinteger: "npm:^4.0.4" - lodash.isnumber: "npm:^3.0.3" - lodash.isplainobject: "npm:^4.0.6" - lodash.isstring: "npm:^4.0.1" - lodash.once: "npm:^4.0.0" - ms: "npm:^2.1.1" - semver: "npm:^7.5.4" - checksum: 10c0/d287a29814895e866db2e5a0209ce730cbc158441a0e5a70d5e940eb0d28ab7498c6bf45029cc8b479639bca94056e9a7f254e2cdb92a2f5750c7f358657a131 - languageName: node - linkType: hard - -"jwa@npm:^1.4.1": - version: 1.4.1 - resolution: "jwa@npm:1.4.1" - dependencies: - buffer-equal-constant-time: "npm:1.0.1" - ecdsa-sig-formatter: "npm:1.0.11" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/5c533540bf38702e73cf14765805a94027c66a0aa8b16bc3e89d8d905e61a4ce2791e87e21be97d1293a5ee9d4f3e5e47737e671768265ca4f25706db551d5e9 - languageName: node - linkType: hard - -"jws@npm:^3.2.2": - version: 3.2.2 - resolution: "jws@npm:3.2.2" - dependencies: - jwa: "npm:^1.4.1" - safe-buffer: "npm:^5.0.1" - checksum: 10c0/e770704533d92df358adad7d1261fdecad4d7b66fa153ba80d047e03ca0f1f73007ce5ed3fbc04d2eba09ba6e7e6e645f351e08e5ab51614df1b0aa4f384dfff - languageName: node - linkType: hard - -"kuler@npm:^2.0.0": - version: 2.0.0 - resolution: "kuler@npm:2.0.0" - checksum: 10c0/0a4e99d92ca373f8f74d1dc37931909c4d0d82aebc94cf2ba265771160fc12c8df34eaaac80805efbda367e2795cb1f1dd4c3d404b6b1cf38aec94035b503d2d - languageName: node - linkType: hard - -"lazystream@npm:^1.0.0": - version: 1.0.1 - resolution: "lazystream@npm:1.0.1" - dependencies: - readable-stream: "npm:^2.0.5" - checksum: 10c0/ea4e509a5226ecfcc303ba6782cc269be8867d372b9bcbd625c88955df1987ea1a20da4643bf9270336415a398d33531ebf0d5f0d393b9283dc7c98bfcbd7b69 - languageName: node - linkType: hard - -"lodash.camelcase@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.camelcase@npm:4.3.0" - checksum: 10c0/fcba15d21a458076dd309fce6b1b4bf611d84a0ec252cb92447c948c533ac250b95d2e00955801ebc367e5af5ed288b996d75d37d2035260a937008e14eaf432 - languageName: node - linkType: hard - -"lodash.chunk@npm:^4.2.0": - version: 4.2.0 - resolution: "lodash.chunk@npm:4.2.0" - checksum: 10c0/f9f99969561ad2f62af1f9a96c5bd0af776f000292b0d8db3126c28eb3b32e210d7c31b49c18d0d7901869bd769057046dc134b60cfa0c2c4ce017823a26bb23 - languageName: node - linkType: hard - -"lodash.compact@npm:^3.0.1": - version: 3.0.1 - resolution: "lodash.compact@npm:3.0.1" - checksum: 10c0/9cc32065f1a9aa90bf3caa987fb7e00f8b90a49209e7f9f37c601e595f396a83ebe8f3328b2ef7f365cf822c9f21697527620c9c9c9734f107453b4c6c4dd810 - languageName: node - linkType: hard - -"lodash.debounce@npm:^4.0.8": - version: 4.0.8 - resolution: "lodash.debounce@npm:4.0.8" - checksum: 10c0/762998a63e095412b6099b8290903e0a8ddcb353ac6e2e0f2d7e7d03abd4275fe3c689d88960eb90b0dde4f177554d51a690f22a343932ecbc50a5d111849987 - languageName: node - linkType: hard - -"lodash.groupby@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.groupby@npm:4.6.0" - checksum: 10c0/3d136cad438ad6c3a078984ef60e057a3498b1312aa3621b00246ecb99e8f2c4d447e2815460db7a0b661a4fe4e2eeee96c84cb661a824bad04b6cf1f7bc6e9b - languageName: node - linkType: hard - -"lodash.identity@npm:^3.0.0": - version: 3.0.0 - resolution: "lodash.identity@npm:3.0.0" - checksum: 10c0/a09ca0f99ae495c353e4ac6888684397f3b5b0c5f7d13a866a3956b7b2aa779462c78c219a31d4aab255d027ac5e11e8c3d943e70956e2a3d42feea56a8e9c1c - languageName: node - linkType: hard - -"lodash.includes@npm:^4.3.0": - version: 4.3.0 - resolution: "lodash.includes@npm:4.3.0" - checksum: 10c0/7ca498b9b75bf602d04e48c0adb842dfc7d90f77bcb2a91a2b2be34a723ad24bc1c8b3683ec6b2552a90f216c723cdea530ddb11a3320e08fa38265703978f4b - languageName: node - linkType: hard - -"lodash.isboolean@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isboolean@npm:3.0.3" - checksum: 10c0/0aac604c1ef7e72f9a6b798e5b676606042401dd58e49f051df3cc1e3adb497b3d7695635a5cbec4ae5f66456b951fdabe7d6b387055f13267cde521f10ec7f7 - languageName: node - linkType: hard - -"lodash.isempty@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.isempty@npm:4.4.0" - checksum: 10c0/6c7eaa0802398736809b9e8aed8b8ac1abca9be71788fd719ba9d7f5b4c23e8dc63b7f049df4131713dda30a2fdedc2f655268e9deb8cd5a985dfc934afca194 - languageName: node - linkType: hard - -"lodash.isequal@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.isequal@npm:4.5.0" - checksum: 10c0/dfdb2356db19631a4b445d5f37868a095e2402292d59539a987f134a8778c62a2810c2452d11ae9e6dcac71fc9de40a6fedcb20e2952a15b431ad8b29e50e28f - languageName: node - linkType: hard - -"lodash.isinteger@npm:^4.0.4": - version: 4.0.4 - resolution: "lodash.isinteger@npm:4.0.4" - checksum: 10c0/4c3e023a2373bf65bf366d3b8605b97ec830bca702a926939bcaa53f8e02789b6a176e7f166b082f9365bfec4121bfeb52e86e9040cb8d450e64c858583f61b7 - languageName: node - linkType: hard - -"lodash.isnumber@npm:^3.0.3": - version: 3.0.3 - resolution: "lodash.isnumber@npm:3.0.3" - checksum: 10c0/2d01530513a1ee4f72dd79528444db4e6360588adcb0e2ff663db2b3f642d4bb3d687051ae1115751ca9082db4fdef675160071226ca6bbf5f0c123dbf0aa12d - languageName: node - linkType: hard - -"lodash.isobject@npm:^3.0.2": - version: 3.0.2 - resolution: "lodash.isobject@npm:3.0.2" - checksum: 10c0/da4c8480d98b16835b59380b2fbd43c54081acd9466febb788ba77c434384349e0bec162d1c4e89f613f21687b2b6d8384d8a112b80da00c78d28d9915a5cdde - languageName: node - linkType: hard - -"lodash.isplainobject@npm:^4.0.6": - version: 4.0.6 - resolution: "lodash.isplainobject@npm:4.0.6" - checksum: 10c0/afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb - languageName: node - linkType: hard - -"lodash.isstring@npm:^4.0.1": - version: 4.0.1 - resolution: "lodash.isstring@npm:4.0.1" - checksum: 10c0/09eaf980a283f9eef58ef95b30ec7fee61df4d6bf4aba3b5f096869cc58f24c9da17900febc8ffd67819b4e29de29793190e88dc96983db92d84c95fa85d1c92 - languageName: node - linkType: hard - -"lodash.kebabcase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.kebabcase@npm:4.1.1" - checksum: 10c0/da5d8f41dbb5bc723d4bf9203d5096ca8da804d6aec3d2b56457156ba6c8d999ff448d347ebd97490da853cb36696ea4da09a431499f1ee8deb17b094ecf4e33 - languageName: node - linkType: hard - -"lodash.mapvalues@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.mapvalues@npm:4.6.0" - checksum: 10c0/a976bfc3923d4d8d2034e049ec4700e3aaf141a6143c973d06be3b2c87697923cd0158ee770484ad1af52dfed93ae90d2b76268413db95a42a2f46d7e1754828 - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 - languageName: node - linkType: hard - -"lodash.omit@npm:^4.5.0": - version: 4.5.0 - resolution: "lodash.omit@npm:4.5.0" - checksum: 10c0/3808b9b6faae35177174b6ab327f1177e29c91f1e98dcbccf13a72a6767bba337306449d537a4e0d8a33d2673f10d39bc732e30c4b803274ea0c1168ea60e549 - languageName: node - linkType: hard - -"lodash.once@npm:^4.0.0": - version: 4.1.1 - resolution: "lodash.once@npm:4.1.1" - checksum: 10c0/46a9a0a66c45dd812fcc016e46605d85ad599fe87d71a02f6736220554b52ffbe82e79a483ad40f52a8a95755b0d1077fba259da8bfb6694a7abbf4a48f1fc04 - languageName: node - linkType: hard - -"lodash.pick@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.pick@npm:4.4.0" - checksum: 10c0/a04c460b95d1aaa44e9513d1dacf72ea74d838da843e45831de9de64c303f13cdde1859702a6f4dcef417816898ffd47c6ae0614c957ac70245bed2809b8d2e2 - languageName: node - linkType: hard - -"lodash.pickby@npm:^4.6.0": - version: 4.6.0 - resolution: "lodash.pickby@npm:4.6.0" - checksum: 10c0/46befadb64ab0f61159977174b291f87b005cec1c7bd73d1b6949ec4cdff483c1be0e34398df8955b76ce06a3e93a4a5c5a552a4299520390d6993c5420c7ab9 - languageName: node - linkType: hard - -"lodash.snakecase@npm:^4.1.1": - version: 4.1.1 - resolution: "lodash.snakecase@npm:4.1.1" - checksum: 10c0/f0b3f2497eb20eea1a1cfc22d645ecaeb78ac14593eb0a40057977606d2f35f7aaff0913a06553c783b535aafc55b718f523f9eb78f8d5293f492af41002eaf9 - languageName: node - linkType: hard - -"lodash.upperfirst@npm:^4.3.1": - version: 4.3.1 - resolution: "lodash.upperfirst@npm:4.3.1" - checksum: 10c0/435625da4b3ee74e7a1367a780d9107ab0b13ef4359fc074b2a1a40458eb8d91b655af62f6795b7138d493303a98c0285340160341561d6896e4947e077fa975 - languageName: node - linkType: hard - -"lodash@npm:^4.17.15": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c - languageName: node - linkType: hard - -"logform@npm:^2.6.0, logform@npm:^2.6.1": - version: 2.6.1 - resolution: "logform@npm:2.6.1" - dependencies: - "@colors/colors": "npm:1.6.0" - "@types/triple-beam": "npm:^1.3.2" - fecha: "npm:^4.2.0" - ms: "npm:^2.1.1" - safe-stable-stringify: "npm:^2.3.1" - triple-beam: "npm:^1.3.0" - checksum: 10c0/c20019336b1da8c08adea67dd7de2b0effdc6e35289c0156722924b571df94ba9f900ef55620c56bceb07cae7cc46057c9859accdee37a131251ba34d6789bce - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb - languageName: node - linkType: hard - -"make-dir@npm:^3.1.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: "npm:^6.0.0" - checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa - languageName: node - linkType: hard - -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" - dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10c0/df5f4dbb6d98153b751bccf4dc4cc500de85a96a9331db9805596c46aa9f99d9555983954e6c1266d9f981ae37a9e4647f42b9a4bb5466f867f4012e582c9e7e - languageName: node - linkType: hard - -"media-typer@npm:0.3.0": - version: 0.3.0 - resolution: "media-typer@npm:0.3.0" - checksum: 10c0/d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-types@npm:^2.1.12, mime-types@npm:~2.1.24": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"minimatch@npm:^3.1.1": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - -"minimatch@npm:^5.1.0": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/9d702d57f556274286fdd97e406fc38a2f5c8d15e158b498d7393b1105974b21249289ec571fa2b51e038a4872bfc82710111cf75fae98c662f3d6f95e72152b - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 10c0/a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: 10c0/64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: 10c0/46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf - languageName: node - linkType: hard - -"ms@npm:2.0.0": - version: 2.0.0 - resolution: "ms@npm:2.0.0" - checksum: 10c0/f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d - languageName: node - linkType: hard - -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10c0/a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc - languageName: node - linkType: hard - -"ms@npm:^2.1.1": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10c0/3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 - languageName: node - linkType: hard - -"node-addon-api@npm:^5.0.0": - version: 5.1.0 - resolution: "node-addon-api@npm:5.1.0" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d - languageName: node - linkType: hard - -"node-fetch@npm:^2.6.7": - version: 2.7.0 - resolution: "node-fetch@npm:2.7.0" - dependencies: - whatwg-url: "npm:^5.0.0" - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 10c0/b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^4.1.0" - semver: "npm:^7.3.5" - tar: "npm:^6.2.1" - which: "npm:^4.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/00630d67dbd09a45aee0a5d55c05e3916ca9e6d427ee4f7bc392d2d3dc5fad7449b21fc098dd38260a53d9dcc9c879b36704a1994235d4707e7271af7e9a835b - languageName: node - linkType: hard - -"nodemailer@npm:^6.9.14": - version: 6.9.14 - resolution: "nodemailer@npm:6.9.14" - checksum: 10c0/2542986849bc6ec2bf12fb7b72226da0ce9c6a0946216dea020d9eedee3ac1a4eb2413f59772a3ddd4bb9188d5ce859167a030c065719473f71319e052a319dc - languageName: node - linkType: hard - -"nopt@npm:^5.0.0": - version: 5.0.0 - resolution: "nopt@npm:5.0.0" - dependencies: - abbrev: "npm:1" - bin: - nopt: bin/nopt.js - checksum: 10c0/fc5c4f07155cb455bf5fc3dd149fac421c1a40fd83c6bfe83aa82b52f02c17c5e88301321318adaa27611c8a6811423d51d29deaceab5fa158b585a61a551061 - languageName: node - linkType: hard - -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/a069c7c736767121242037a22a788863accfa932ab285a1eb569eb8cd534b09d17206f68c37f096ae785647435e0c5a5a0a67b42ec743e481a455e5ae6a6df81 - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 - languageName: node - linkType: hard - -"npmlog@npm:^5.0.1": - version: 5.0.1 - resolution: "npmlog@npm:5.0.1" - dependencies: - are-we-there-yet: "npm:^2.0.0" - console-control-strings: "npm:^1.1.0" - gauge: "npm:^3.0.0" - set-blocking: "npm:^2.0.0" - checksum: 10c0/489ba519031013001135c463406f55491a17fc7da295c18a04937fe3a4d523fd65e88dd418a28b967ab743d913fdeba1e29838ce0ad8c75557057c481f7d49fa - languageName: node - linkType: hard - -"object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: 10c0/b97835b4c91ec37b5fd71add84f21c3f1047d1d155d00c0fcd6699516c256d4fcc6ff17a1aced873197fe447f91a3964178fd2a67a1ee2120cdaf60e81a050b4 - languageName: node - linkType: hard - -"object-is@npm:^1.1.5": - version: 1.1.6 - resolution: "object-is@npm:1.1.6" - dependencies: - call-bind: "npm:^1.0.7" - define-properties: "npm:^1.2.1" - checksum: 10c0/506af444c4dce7f8e31f34fc549e2fb8152d6b9c4a30c6e62852badd7f520b579c679af433e7a072f9d78eb7808d230dc12e1cf58da9154dfbf8813099ea0fe0 - languageName: node - linkType: hard - -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d - languageName: node - linkType: hard - -"object.assign@npm:^4.1.4": - version: 4.1.5 - resolution: "object.assign@npm:4.1.5" - dependencies: - call-bind: "npm:^1.0.5" - define-properties: "npm:^1.2.1" - has-symbols: "npm:^1.0.3" - object-keys: "npm:^1.1.1" - checksum: 10c0/60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 - languageName: node - linkType: hard - -"on-finished@npm:2.4.1": - version: 2.4.1 - resolution: "on-finished@npm:2.4.1" - dependencies: - ee-first: "npm:1.1.1" - checksum: 10c0/46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - -"one-time@npm:^1.0.0": - version: 1.0.0 - resolution: "one-time@npm:1.0.0" - dependencies: - fn.name: "npm:1.x.x" - checksum: 10c0/6e4887b331edbb954f4e915831cbec0a7b9956c36f4feb5f6de98c448ac02ff881fd8d9b55a6b1b55030af184c6b648f340a76eb211812f4ad8c9b4b8692fdaa - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10c0/592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.0 - resolution: "package-json-from-dist@npm:1.0.0" - checksum: 10c0/e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - -"path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"possible-typed-array-names@npm:^1.0.0": - version: 1.0.0 - resolution: "possible-typed-array-names@npm:1.0.0" - checksum: 10c0/d9aa22d31f4f7680e20269db76791b41c3a32c01a373e25f8a4813b4d45f7456bfc2b6d68f752dc4aab0e0bb0721cb3d76fb678c9101cb7a16316664bc2c73fd - languageName: node - linkType: hard - -"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 10c0/17db4757c2a5c44c1e545170e6c70a26f7de58feb985091fb1763f5081cab3d01b181fb2dd240c9f4a4255a1d9227d163d5771b7e69c9e49a561692db865efb9 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - -"process@npm:^0.11.10": - version: 0.11.10 - resolution: "process@npm:0.11.10" - checksum: 10c0/40c3ce4b7e6d4b8c3355479df77aeed46f81b279818ccdc500124e6a5ab882c0cc81ff7ea16384873a95a74c4570b01b120f287abbdd4c877931460eca6084b3 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - -"proxy-from-env@npm:^1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: 10c0/fe7dd8b1bdbbbea18d1459107729c3e4a2243ca870d26d34c2c1bcd3e4425b7bcc5112362df2d93cc7fb9746f6142b5e272fd1cc5c86ddf8580175186f6ad42b - languageName: node - linkType: hard - -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" - dependencies: - side-channel: "npm:^1.0.4" - checksum: 10c0/4e4875e4d7c7c31c233d07a448e7e4650f456178b9dd3766b7cfa13158fdb24ecb8c4f059fa91e820dc6ab9f2d243721d071c9c0378892dcdad86e9e9a27c68f - languageName: node - linkType: hard - -"queue-tick@npm:^1.0.1": - version: 1.0.1 - resolution: "queue-tick@npm:1.0.1" - checksum: 10c0/0db998e2c9b15215317dbcf801e9b23e6bcde4044e115155dae34f8e7454b9a783f737c9a725528d677b7a66c775eb7a955cf144fe0b87f62b575ce5bfd515a9 - languageName: node - linkType: hard - -"raw-body@npm:2.5.2": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" - dependencies: - bytes: "npm:3.1.2" - http-errors: "npm:2.0.0" - iconv-lite: "npm:0.4.24" - unpipe: "npm:1.0.0" - checksum: 10c0/b201c4b66049369a60e766318caff5cb3cc5a900efd89bdac431463822d976ad0670912c931fdbdcf5543207daf6f6833bca57aa116e1661d2ea91e12ca692c4 - languageName: node - linkType: hard - -"readable-stream@npm:^2.0.5": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa - languageName: node - linkType: hard - -"readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": - version: 3.6.2 - resolution: "readable-stream@npm:3.6.2" - dependencies: - inherits: "npm:^2.0.3" - string_decoder: "npm:^1.1.1" - util-deprecate: "npm:^1.0.1" - checksum: 10c0/e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 - languageName: node - linkType: hard - -"readable-stream@npm:^4.0.0": - version: 4.5.2 - resolution: "readable-stream@npm:4.5.2" - dependencies: - abort-controller: "npm:^3.0.0" - buffer: "npm:^6.0.3" - events: "npm:^3.3.0" - process: "npm:^0.11.10" - string_decoder: "npm:^1.3.0" - checksum: 10c0/a2c80e0e53aabd91d7df0330929e32d0a73219f9477dbbb18472f6fdd6a11a699fc5d172a1beff98d50eae4f1496c950ffa85b7cc2c4c196963f289a5f39275d - languageName: node - linkType: hard - -"readdir-glob@npm:^1.1.2": - version: 1.1.3 - resolution: "readdir-glob@npm:1.1.3" - dependencies: - minimatch: "npm:^5.1.0" - checksum: 10c0/a37e0716726650845d761f1041387acd93aa91b28dd5381950733f994b6c349ddc1e21e266ec7cc1f9b92e205a7a972232f9b89d5424d07361c2c3753d5dbace - languageName: node - linkType: hard - -"regexp.prototype.flags@npm:^1.5.1": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" - dependencies: - call-bind: "npm:^1.0.6" - define-properties: "npm:^1.2.1" - es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.1" - checksum: 10c0/0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe - languageName: node - linkType: hard - -"rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: bin.js - checksum: 10c0/9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 - languageName: node - linkType: hard - -"root-workspace-0b6124@workspace:.": - version: 0.0.0-use.local - resolution: "root-workspace-0b6124@workspace:." - dependencies: - "@types/bcrypt": "npm:^5.0.2" - "@types/deep-equal": "npm:^1.0.4" - "@types/lodash.camelcase": "npm:^4.3.9" - "@types/lodash.compact": "npm:^3.0.9" - "@types/lodash.debounce": "npm:^4.0.9" - "@types/lodash.groupby": "npm:^4.6.9" - "@types/lodash.identity": "npm:^3.0.9" - "@types/lodash.isempty": "npm:^4.4.9" - "@types/lodash.isequal": "npm:^4.5.8" - "@types/lodash.isobject": "npm:^3.0.9" - "@types/lodash.kebabcase": "npm:^4.1.9" - "@types/lodash.mapvalues": "npm:^4.6.9" - "@types/lodash.omit": "npm:^4.5.9" - "@types/lodash.pickby": "npm:^4.6.9" - "@types/lodash.snakecase": "npm:^4.1.9" - "@types/lodash.upperfirst": "npm:^4.3.9" - "@types/uuid": "npm:^10.0.0" - archiver: "npm:^7.0.1" - axios: "npm:^1.7.5" - bcrypt: "npm:^5.1.1" - body-parser: "npm:^1.20.2" - deep-equal: "npm:^2.2.3" - jsonwebtoken: "npm:^9.0.2" - lodash.camelcase: "npm:^4.3.0" - lodash.chunk: "npm:^4.2.0" - lodash.compact: "npm:^3.0.1" - lodash.debounce: "npm:^4.0.8" - lodash.groupby: "npm:^4.6.0" - lodash.identity: "npm:^3.0.0" - lodash.isempty: "npm:^4.4.0" - lodash.isequal: "npm:^4.5.0" - lodash.isobject: "npm:^3.0.2" - lodash.kebabcase: "npm:^4.1.1" - lodash.mapvalues: "npm:^4.6.0" - lodash.merge: "npm:^4.6.2" - lodash.omit: "npm:^4.5.0" - lodash.pick: "npm:^4.4.0" - lodash.pickby: "npm:^4.6.0" - lodash.snakecase: "npm:^4.1.1" - lodash.upperfirst: "npm:^4.3.1" - nodemailer: "npm:^6.9.14" - sharp: "npm:^0.33.5" - uuid: "npm:^10.0.0" - winston: "npm:^3.14.2" - languageName: unknown - linkType: soft - -"safe-buffer@npm:^5.0.1, safe-buffer@npm:~5.2.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 - languageName: node - linkType: hard - -"safe-stable-stringify@npm:^2.3.1": - version: 2.5.0 - resolution: "safe-stable-stringify@npm:2.5.0" - checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"semver@npm:^6.0.0": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - -"semver@npm:^7.3.5, semver@npm:^7.5.4, semver@npm:^7.6.3": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 10c0/88f33e148b210c153873cb08cfe1e281d518aaa9a666d4d148add6560db5cd3c582f3a08ccb91f38d5f379ead256da9931234ed122057f40bb5766e65e58adaf - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 - languageName: node - linkType: hard - -"set-function-length@npm:^1.2.1": - version: 1.2.2 - resolution: "set-function-length@npm:1.2.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - function-bind: "npm:^1.1.2" - get-intrinsic: "npm:^1.2.4" - gopd: "npm:^1.0.1" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c - languageName: node - linkType: hard - -"set-function-name@npm:^2.0.1": - version: 2.0.2 - resolution: "set-function-name@npm:2.0.2" - dependencies: - define-data-property: "npm:^1.1.4" - es-errors: "npm:^1.3.0" - functions-have-names: "npm:^1.2.3" - has-property-descriptors: "npm:^1.0.2" - checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316 - languageName: node - linkType: hard - -"setprototypeof@npm:1.2.0": - version: 1.2.0 - resolution: "setprototypeof@npm:1.2.0" - checksum: 10c0/68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc - languageName: node - linkType: hard - -"sharp@npm:^0.33.5": - version: 0.33.5 - resolution: "sharp@npm:0.33.5" - dependencies: - "@img/sharp-darwin-arm64": "npm:0.33.5" - "@img/sharp-darwin-x64": "npm:0.33.5" - "@img/sharp-libvips-darwin-arm64": "npm:1.0.4" - "@img/sharp-libvips-darwin-x64": "npm:1.0.4" - "@img/sharp-libvips-linux-arm": "npm:1.0.5" - "@img/sharp-libvips-linux-arm64": "npm:1.0.4" - "@img/sharp-libvips-linux-s390x": "npm:1.0.4" - "@img/sharp-libvips-linux-x64": "npm:1.0.4" - "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4" - "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4" - "@img/sharp-linux-arm": "npm:0.33.5" - "@img/sharp-linux-arm64": "npm:0.33.5" - "@img/sharp-linux-s390x": "npm:0.33.5" - "@img/sharp-linux-x64": "npm:0.33.5" - "@img/sharp-linuxmusl-arm64": "npm:0.33.5" - "@img/sharp-linuxmusl-x64": "npm:0.33.5" - "@img/sharp-wasm32": "npm:0.33.5" - "@img/sharp-win32-ia32": "npm:0.33.5" - "@img/sharp-win32-x64": "npm:0.33.5" - color: "npm:^4.2.3" - detect-libc: "npm:^2.0.3" - semver: "npm:^7.6.3" - dependenciesMeta: - "@img/sharp-darwin-arm64": - optional: true - "@img/sharp-darwin-x64": - optional: true - "@img/sharp-libvips-darwin-arm64": - optional: true - "@img/sharp-libvips-darwin-x64": - optional: true - "@img/sharp-libvips-linux-arm": - optional: true - "@img/sharp-libvips-linux-arm64": - optional: true - "@img/sharp-libvips-linux-s390x": - optional: true - "@img/sharp-libvips-linux-x64": - optional: true - "@img/sharp-libvips-linuxmusl-arm64": - optional: true - "@img/sharp-libvips-linuxmusl-x64": - optional: true - "@img/sharp-linux-arm": - optional: true - "@img/sharp-linux-arm64": - optional: true - "@img/sharp-linux-s390x": - optional: true - "@img/sharp-linux-x64": - optional: true - "@img/sharp-linuxmusl-arm64": - optional: true - "@img/sharp-linuxmusl-x64": - optional: true - "@img/sharp-wasm32": - optional: true - "@img/sharp-win32-ia32": - optional: true - "@img/sharp-win32-x64": - optional: true - checksum: 10c0/6b81421ddfe6ee524d8d77e325c5e147fef22884e1c7b1656dfd89a88d7025894115da02d5f984261bf2e6daa16f98cadd1721c4ba408b4212b1d2a60f233484 - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.4": - version: 1.0.6 - resolution: "side-channel@npm:1.0.6" - dependencies: - call-bind: "npm:^1.0.7" - es-errors: "npm:^1.3.0" - get-intrinsic: "npm:^1.2.4" - object-inspect: "npm:^1.13.1" - checksum: 10c0/d2afd163dc733cc0a39aa6f7e39bf0c436293510dbccbff446733daeaf295857dbccf94297092ec8c53e2503acac30f0b78830876f0485991d62a90e9cad305f - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.0": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 - languageName: node - linkType: hard - -"simple-swizzle@npm:^0.2.2": - version: 0.2.2 - resolution: "simple-swizzle@npm:0.2.2" - dependencies: - is-arrayish: "npm:^0.3.1" - checksum: 10c0/df5e4662a8c750bdba69af4e8263c5d96fe4cd0f9fe4bdfa3cbdeb45d2e869dff640beaaeb1ef0e99db4d8d2ec92f85508c269f50c972174851bc1ae5bd64308 - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" - dependencies: - agent-base: "npm:^7.1.1" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/345593bb21b95b0508e63e703c84da11549f0a2657d6b4e3ee3612c312cb3a907eac10e53b23ede3557c6601d63252103494caa306b66560f43af7b98f53957a - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/d54a52bf9325165770b674a67241143a3d8b4e4c8884560c4e0e078aace2a728dffc7f70150660f51b85797c4e1a3b82f9b7aa25e0a0ceae1a243365da5c51a7 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/e5a1e23a4057a86a97971465418f22ea89bd439ac36ade88812dd920e4e61873e8abd6a9b72a03a67ef50faa00a2daf1ab745c5a15b46d03e0544a0296354227 - languageName: node - linkType: hard - -"stack-trace@npm:0.0.x": - version: 0.0.10 - resolution: "stack-trace@npm:0.0.10" - checksum: 10c0/9ff3dabfad4049b635a85456f927a075c9d0c210e3ea336412d18220b2a86cbb9b13ec46d6c37b70a302a4ea4d49e30e5d4944dd60ae784073f1cde778ac8f4b - languageName: node - linkType: hard - -"statuses@npm:2.0.1": - version: 2.0.1 - resolution: "statuses@npm:2.0.1" - checksum: 10c0/34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 - languageName: node - linkType: hard - -"stop-iteration-iterator@npm:^1.0.0": - version: 1.0.0 - resolution: "stop-iteration-iterator@npm:1.0.0" - dependencies: - internal-slot: "npm:^1.0.4" - checksum: 10c0/c4158d6188aac510d9e92925b58709207bd94699e9c31186a040c80932a687f84a51356b5895e6dc72710aad83addb9411c22171832c9ae0e6e11b7d61b0dfb9 - languageName: node - linkType: hard - -"streamx@npm:^2.15.0": - version: 2.19.0 - resolution: "streamx@npm:2.19.0" - dependencies: - bare-events: "npm:^2.2.0" - fast-fifo: "npm:^1.3.2" - queue-tick: "npm:^1.0.1" - text-decoder: "npm:^1.1.0" - dependenciesMeta: - bare-events: - optional: true - checksum: 10c0/5833a2c1226488a015e8efde08c6cd4983d7d20098b2210d09594b23f598a8b028c083d542621e2e91ddcb33a266233c3524c60152203be40f1dd816b9ede9da - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca - languageName: node - linkType: hard - -"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": - version: 1.3.0 - resolution: "string_decoder@npm:1.3.0" - dependencies: - safe-buffer: "npm:~5.2.0" - checksum: 10c0/810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 - languageName: node - linkType: hard - -"tar-stream@npm:^3.0.0": - version: 3.1.7 - resolution: "tar-stream@npm:3.1.7" - dependencies: - b4a: "npm:^1.6.4" - fast-fifo: "npm:^1.2.0" - streamx: "npm:^2.15.0" - checksum: 10c0/a09199d21f8714bd729993ac49b6c8efcb808b544b89f23378ad6ffff6d1cb540878614ba9d4cfec11a64ef39e1a6f009a5398371491eb1fda606ffc7f70f718 - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.2.1": - version: 6.2.1 - resolution: "tar@npm:6.2.1" - dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 10c0/a5eca3eb50bc11552d453488344e6507156b9193efd7635e98e867fab275d527af53d8866e2370cd09dfe74378a18111622ace35af6a608e5223a7d27fe99537 - languageName: node - linkType: hard - -"text-decoder@npm:^1.1.0": - version: 1.1.1 - resolution: "text-decoder@npm:1.1.1" - dependencies: - b4a: "npm:^1.6.4" - checksum: 10c0/e527d05454b59c0fa77456495de68c88e560a122de3dd28b3ebdbf81828aabeaa7e9bb8054b9eb52bc5029ccb5899ad04f466cbba3c53b2685270599d1710cee - languageName: node - linkType: hard - -"text-hex@npm:1.0.x": - version: 1.0.0 - resolution: "text-hex@npm:1.0.0" - checksum: 10c0/57d8d320d92c79d7c03ffb8339b825bb9637c2cbccf14304309f51d8950015c44464b6fd1b6820a3d4821241c68825634f09f5a2d9d501e84f7c6fd14376860d - languageName: node - linkType: hard - -"toidentifier@npm:1.0.1": - version: 1.0.1 - resolution: "toidentifier@npm:1.0.1" - checksum: 10c0/93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 - languageName: node - linkType: hard - -"tr46@npm:~0.0.3": - version: 0.0.3 - resolution: "tr46@npm:0.0.3" - checksum: 10c0/047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 - languageName: node - linkType: hard - -"triple-beam@npm:^1.3.0": - version: 1.4.1 - resolution: "triple-beam@npm:1.4.1" - checksum: 10c0/4bf1db71e14fe3ff1c3adbe3c302f1fdb553b74d7591a37323a7badb32dc8e9c290738996cbb64f8b10dc5a3833645b5d8c26221aaaaa12e50d1251c9aba2fea - languageName: node - linkType: hard - -"tslib@npm:^2.4.0": - version: 2.7.0 - resolution: "tslib@npm:2.7.0" - checksum: 10c0/469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6 - languageName: node - linkType: hard - -"type-is@npm:~1.6.18": - version: 1.6.18 - resolution: "type-is@npm:1.6.18" - dependencies: - media-typer: "npm:0.3.0" - mime-types: "npm:~2.1.24" - checksum: 10c0/a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d - languageName: node - linkType: hard - -"undici-types@npm:~6.19.2": - version: 6.19.8 - resolution: "undici-types@npm:6.19.8" - checksum: 10c0/078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10c0/6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 - languageName: node - linkType: hard - -"unpipe@npm:1.0.0": - version: 1.0.0 - resolution: "unpipe@npm:1.0.0" - checksum: 10c0/193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c - languageName: node - linkType: hard - -"util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 - languageName: node - linkType: hard - -"uuid@npm:^10.0.0": - version: 10.0.0 - resolution: "uuid@npm:10.0.0" - bin: - uuid: dist/bin/uuid - checksum: 10c0/eab18c27fe4ab9fb9709a5d5f40119b45f2ec8314f8d4cf12ce27e4c6f4ffa4a6321dc7db6c515068fa373c075b49691ba969f0010bf37f44c37ca40cd6bf7fe - languageName: node - linkType: hard - -"webidl-conversions@npm:^3.0.0": - version: 3.0.1 - resolution: "webidl-conversions@npm:3.0.1" - checksum: 10c0/5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db - languageName: node - linkType: hard - -"whatwg-url@npm:^5.0.0": - version: 5.0.0 - resolution: "whatwg-url@npm:5.0.0" - dependencies: - tr46: "npm:~0.0.3" - webidl-conversions: "npm:^3.0.0" - checksum: 10c0/1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 - languageName: node - linkType: hard - -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" - dependencies: - is-bigint: "npm:^1.0.1" - is-boolean-object: "npm:^1.1.0" - is-number-object: "npm:^1.0.4" - is-string: "npm:^1.0.5" - is-symbol: "npm:^1.0.3" - checksum: 10c0/0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e - languageName: node - linkType: hard - -"which-collection@npm:^1.0.1": - version: 1.0.2 - resolution: "which-collection@npm:1.0.2" - dependencies: - is-map: "npm:^2.0.3" - is-set: "npm:^2.0.3" - is-weakmap: "npm:^2.0.2" - is-weakset: "npm:^2.0.3" - checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 - languageName: node - linkType: hard - -"which-typed-array@npm:^1.1.13": - version: 1.1.15 - resolution: "which-typed-array@npm:1.1.15" - dependencies: - available-typed-arrays: "npm:^1.0.7" - call-bind: "npm:^1.0.7" - for-each: "npm:^0.3.3" - gopd: "npm:^1.0.1" - has-tostringtag: "npm:^1.0.2" - checksum: 10c0/4465d5348c044032032251be54d8988270e69c6b7154f8fcb2a47ff706fe36f7624b3a24246b8d9089435a8f4ec48c1c1025c5d6b499456b9e5eff4f48212983 - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a - languageName: node - linkType: hard - -"wide-align@npm:^1.1.2": - version: 1.1.5 - resolution: "wide-align@npm:1.1.5" - dependencies: - string-width: "npm:^1.0.2 || 2 || 3 || 4" - checksum: 10c0/1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95 - languageName: node - linkType: hard - -"winston-transport@npm:^4.7.0": - version: 4.7.1 - resolution: "winston-transport@npm:4.7.1" - dependencies: - logform: "npm:^2.6.1" - readable-stream: "npm:^3.6.2" - triple-beam: "npm:^1.3.0" - checksum: 10c0/99b7b55cc2ef7f38988ab1717e7fd946c81b856b42a9530aef8ee725490ef2f2811f9cb06d63aa2f76a85fe99ae15b3bef10a54afde3be8b5059ce325e78481f - languageName: node - linkType: hard - -"winston@npm:^3.14.2": - version: 3.14.2 - resolution: "winston@npm:3.14.2" - dependencies: - "@colors/colors": "npm:^1.6.0" - "@dabh/diagnostics": "npm:^2.0.2" - async: "npm:^3.2.3" - is-stream: "npm:^2.0.0" - logform: "npm:^2.6.0" - one-time: "npm:^1.0.0" - readable-stream: "npm:^3.4.0" - safe-stable-stringify: "npm:^2.3.1" - stack-trace: "npm:0.0.x" - triple-beam: "npm:^1.3.0" - winston-transport: "npm:^4.7.0" - checksum: 10c0/3f8fe505ea18310982e60452f335dd2b22fdbc9b25839b6ad882971b2416d5adc94a1f1a46e24cb37d967ad01dfe5499adaf5e53575626b5ebb2a25ff30f4e1d - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"zip-stream@npm:^6.0.1": - version: 6.0.1 - resolution: "zip-stream@npm:6.0.1" - dependencies: - archiver-utils: "npm:^5.0.0" - compress-commons: "npm:^6.0.2" - readable-stream: "npm:^4.0.0" - checksum: 10c0/50f2fb30327fb9d09879abf7ae2493705313adf403e794b030151aaae00009162419d60d0519e807673ec04d442e140c8879ca14314df0a0192de3b233e8f28b - languageName: node - linkType: hard -`; diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-migrate-channel-sync-stages.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-migrate-channel-sync-stages.command.ts deleted file mode 100644 index d61e2c8e6dd..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-migrate-channel-sync-stages.command.ts +++ /dev/null @@ -1,489 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { STANDARD_OBJECT_IDS } from 'twenty-shared/metadata'; -import { DataSource, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { type FieldMetadataComplexOption } from 'src/engine/metadata-modules/field-metadata/dtos/options.input'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { computeObjectTargetTable } from 'src/engine/utils/compute-object-target-table.util'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { - CALENDAR_CHANNEL_STANDARD_FIELD_IDS, - MESSAGE_CHANNEL_STANDARD_FIELD_IDS, -} from 'src/engine/workspace-manager/workspace-sync-metadata/constants/standard-field-ids'; -import { CalendarChannelSyncStage } from 'src/modules/calendar/common/standard-objects/calendar-channel.workspace-entity'; -import { MessageChannelSyncStage } from 'src/modules/messaging/common/standard-objects/message-channel.workspace-entity'; - -@Command({ - name: 'upgrade:1-8:migrate-channel-sync-stages', - description: - 'Migrate message and calendar channel sync stages: add PENDING_CONFIGURATION, add MESSAGE_LIST_FETCH_SCHEDULED, migrate deprecated stages', -}) -export class MigrateChannelSyncStagesCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - @InjectRepository(ObjectMetadataEntity) - private readonly objectMetadataRepository: Repository, - @InjectRepository(FieldMetadataEntity) - private readonly fieldMetadataRepository: Repository, - @InjectDataSource() - private readonly coreDataSource: DataSource, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `Migrating channel sync stages for workspace ${workspaceId}`, - ); - - await this.updateMessageChannelSyncStageFieldMetadata(workspaceId, options); - - await this.updateCalendarChannelSyncStageFieldMetadata( - workspaceId, - options, - ); - - const schemaName = getWorkspaceSchemaName(workspaceId); - - await this.migrateMessageChannelSyncStages( - workspaceId, - schemaName, - options, - ); - - await this.migrateCalendarChannelSyncStages( - workspaceId, - schemaName, - options, - ); - - this.logger.log( - `Successfully migrated channel sync stages for workspace ${workspaceId}`, - ); - } - - private async migrateMessageChannelSyncStages( - workspaceId: string, - schemaName: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - const messageChannelObject = await this.objectMetadataRepository.findOne({ - where: { - standardId: STANDARD_OBJECT_IDS.messageChannel, - workspaceId, - }, - }); - - if (!messageChannelObject) { - this.logger.log( - `MessageChannel object not found for workspace ${workspaceId}, skipping schema migration`, - ); - - return; - } - - const tableName = computeObjectTargetTable(messageChannelObject); - - // Add new enum values for MessageChannelSyncStage - if (options.dryRun) { - this.logger.log( - `Would try to add PENDING_CONFIGURATION to messageChannel_syncStage_enum for workspace ${workspaceId}`, - ); - } else { - try { - await this.coreDataSource.query( - `ALTER TYPE ${schemaName}."messageChannel_syncStage_enum" ADD VALUE IF NOT EXISTS 'PENDING_CONFIGURATION'`, - ); - this.logger.log( - `Added PENDING_CONFIGURATION to messageChannel_syncStage_enum for workspace ${workspaceId}`, - ); - } catch (error) { - this.logger.error( - `Error adding PENDING_CONFIGURATION to messageChannel_syncStage_enum for workspace ${workspaceId}: ${error}`, - ); - } - } - - if (options.dryRun) { - this.logger.log( - `Would try to add MESSAGE_LIST_FETCH_SCHEDULED to messageChannel_syncStage_enum for workspace ${workspaceId}`, - ); - } else { - try { - await this.coreDataSource.query( - `ALTER TYPE ${schemaName}."messageChannel_syncStage_enum" ADD VALUE IF NOT EXISTS 'MESSAGE_LIST_FETCH_SCHEDULED'`, - ); - this.logger.log( - `Added MESSAGE_LIST_FETCH_SCHEDULED to messageChannel_syncStage_enum for workspace ${workspaceId}`, - ); - } catch (error) { - this.logger.error( - `Error adding MESSAGE_LIST_FETCH_SCHEDULED to messageChannel_syncStage_enum for workspace ${workspaceId}: ${error}`, - ); - } - } - - // Migrate deprecated MessageChannel sync stages - if (options.dryRun) { - this.logger.log( - `Would migrate deprecated messageChannel sync stages for workspace ${workspaceId}`, - ); - } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let messageChannelUpdateResult: any; - - try { - messageChannelUpdateResult = await this.coreDataSource.query( - `UPDATE "${schemaName}"."${tableName}" - SET "syncStage" = 'MESSAGE_LIST_FETCH_PENDING' - WHERE "syncStage" IN ('FULL_MESSAGE_LIST_FETCH_PENDING', 'PARTIAL_MESSAGE_LIST_FETCH_PENDING')`, - ); - } catch { - await this.coreDataSource.query( - `ALTER TYPE ${schemaName}."messageChannel_syncStage_enum" ADD VALUE IF NOT EXISTS 'MESSAGE_LIST_FETCH_PENDING'`, - ); - - messageChannelUpdateResult = await this.coreDataSource.query( - `UPDATE "${schemaName}"."${tableName}" - SET "syncStage" = 'MESSAGE_LIST_FETCH_PENDING' - WHERE "syncStage" IN ('FULL_MESSAGE_LIST_FETCH_PENDING', 'PARTIAL_MESSAGE_LIST_FETCH_PENDING')`, - ); - } - - const messageChannelRowsUpdated = messageChannelUpdateResult[1] || 0; - - this.logger.log( - `Migrated ${messageChannelRowsUpdated} messageChannel records from deprecated sync stages in workspace ${workspaceId}`, - ); - } - } - - private async migrateCalendarChannelSyncStages( - workspaceId: string, - schemaName: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - const calendarChannelObject = await this.objectMetadataRepository.findOne({ - where: { - standardId: STANDARD_OBJECT_IDS.calendarChannel, - workspaceId, - }, - }); - - if (!calendarChannelObject) { - this.logger.log( - `CalendarChannel object not found for workspace ${workspaceId}, skipping schema migration`, - ); - - return; - } - - const tableName = computeObjectTargetTable(calendarChannelObject); - - // Add new enum values for CalendarChannelSyncStage - if (options.dryRun) { - this.logger.log( - `Would try to add PENDING_CONFIGURATION to calendarChannel_syncStage_enum for workspace ${workspaceId}`, - ); - } else { - try { - await this.coreDataSource.query( - `ALTER TYPE ${schemaName}."calendarChannel_syncStage_enum" ADD VALUE IF NOT EXISTS 'PENDING_CONFIGURATION'`, - ); - this.logger.log( - `Added PENDING_CONFIGURATION to calendarChannel_syncStage_enum for workspace ${workspaceId}`, - ); - } catch (error) { - this.logger.error( - `Error adding PENDING_CONFIGURATION to calendarChannel_syncStage_enum for workspace ${workspaceId}: ${error}`, - ); - } - } - - if (options.dryRun) { - this.logger.log( - `Would try to add CALENDAR_EVENT_LIST_FETCH_SCHEDULED to calendarChannel_syncStage_enum for workspace ${workspaceId}`, - ); - } else { - try { - await this.coreDataSource.query( - `ALTER TYPE ${schemaName}."calendarChannel_syncStage_enum" ADD VALUE IF NOT EXISTS 'CALENDAR_EVENT_LIST_FETCH_SCHEDULED'`, - ); - this.logger.log( - `Added CALENDAR_EVENT_LIST_FETCH_SCHEDULED to calendarChannel_syncStage_enum for workspace ${workspaceId}`, - ); - } catch (error) { - this.logger.error( - `Error adding CALENDAR_EVENT_LIST_FETCH_SCHEDULED to calendarChannel_syncStage_enum for workspace ${workspaceId}: ${error}`, - ); - } - } - - // Migrate deprecated CalendarChannel sync stages - if (options.dryRun) { - this.logger.log( - `Would migrate deprecated calendarChannel sync stages for workspace ${workspaceId}`, - ); - } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - let calendarChannelUpdateResult: any; - - try { - calendarChannelUpdateResult = await this.coreDataSource.query( - `UPDATE "${schemaName}"."${tableName}" - SET "syncStage" = 'CALENDAR_EVENT_LIST_FETCH_PENDING' - WHERE "syncStage" IN ('FULL_CALENDAR_EVENT_LIST_FETCH_PENDING', 'PARTIAL_CALENDAR_EVENT_LIST_FETCH_PENDING')`, - ); - } catch { - await this.coreDataSource.query( - `ALTER TYPE ${schemaName}."calendarChannel_syncStage_enum" ADD VALUE IF NOT EXISTS 'CALENDAR_EVENT_LIST_FETCH_PENDING'`, - ); - - calendarChannelUpdateResult = await this.coreDataSource.query( - `UPDATE "${schemaName}"."${tableName}" - SET "syncStage" = 'CALENDAR_EVENT_LIST_FETCH_PENDING' - WHERE "syncStage" IN ('FULL_CALENDAR_EVENT_LIST_FETCH_PENDING', 'PARTIAL_CALENDAR_EVENT_LIST_FETCH_PENDING')`, - ); - } - - const calendarChannelRowsUpdated = calendarChannelUpdateResult[1] || 0; - - this.logger.log( - `Migrated ${calendarChannelRowsUpdated} calendarChannel records from deprecated sync stages in workspace ${workspaceId}`, - ); - } - } - - private async updateMessageChannelSyncStageFieldMetadata( - workspaceId: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - const messageChannelObject = await this.objectMetadataRepository.findOne({ - where: { - standardId: STANDARD_OBJECT_IDS.messageChannel, - workspaceId, - }, - }); - - if (!messageChannelObject) { - this.logger.log( - `MessageChannel object not found for workspace ${workspaceId}, skipping field metadata update`, - ); - - return; - } - - const syncStageField = await this.fieldMetadataRepository.findOne({ - where: { - standardId: MESSAGE_CHANNEL_STANDARD_FIELD_IDS.syncStage, - objectMetadataId: messageChannelObject.id, - workspaceId, - }, - }); - - if (!syncStageField) { - this.logger.log( - `MessageChannel syncStage field not found for workspace ${workspaceId}, skipping field metadata update`, - ); - - return; - } - - const fieldOptions = (syncStageField.options || - []) as FieldMetadataComplexOption[]; - - const hasMessageListFetchScheduled = fieldOptions.some( - (option) => - option.value === MessageChannelSyncStage.MESSAGE_LIST_FETCH_SCHEDULED, - ); - - const hasPendingConfiguration = fieldOptions.some( - (option) => - option.value === MessageChannelSyncStage.PENDING_CONFIGURATION, - ); - - const hasMessageListFetchPending = fieldOptions.some( - (option) => - option.value === MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING, - ); - - if ( - hasMessageListFetchScheduled && - hasPendingConfiguration && - hasMessageListFetchPending - ) { - this.logger.log( - `MessageChannel syncStage field metadata already migrated for workspace ${workspaceId}`, - ); - - return; - } - - if (options.dryRun) { - this.logger.log( - `Would update MessageChannel syncStage field metadata for workspace ${workspaceId}`, - ); - - return; - } - - if (!hasMessageListFetchScheduled) { - fieldOptions.push({ - value: MessageChannelSyncStage.MESSAGE_LIST_FETCH_SCHEDULED, - label: 'Messages list fetch scheduled', - position: 1, - color: 'green', - }); - } - - if (!hasPendingConfiguration) { - fieldOptions.push({ - value: MessageChannelSyncStage.PENDING_CONFIGURATION, - label: 'Pending configuration', - position: 9, - color: 'gray', - }); - } - - if (!hasMessageListFetchPending) { - fieldOptions.push({ - value: MessageChannelSyncStage.MESSAGE_LIST_FETCH_PENDING, - label: 'Messages list fetch pending', - position: 0, - color: 'blue', - }); - } - syncStageField.options = fieldOptions; - - await this.fieldMetadataRepository.save(syncStageField); - - this.logger.log( - `Updated MessageChannel syncStage field metadata for workspace ${workspaceId}`, - ); - } - - private async updateCalendarChannelSyncStageFieldMetadata( - workspaceId: string, - options: RunOnWorkspaceArgs['options'], - ): Promise { - const calendarChannelObject = await this.objectMetadataRepository.findOne({ - where: { - standardId: STANDARD_OBJECT_IDS.calendarChannel, - workspaceId, - }, - }); - - if (!calendarChannelObject) { - this.logger.log( - `CalendarChannel object not found for workspace ${workspaceId}, skipping field metadata update`, - ); - - return; - } - - const syncStageField = await this.fieldMetadataRepository.findOne({ - where: { - standardId: CALENDAR_CHANNEL_STANDARD_FIELD_IDS.syncStage, - objectMetadataId: calendarChannelObject.id, - workspaceId, - }, - }); - - if (!syncStageField) { - this.logger.log( - `CalendarChannel syncStage field not found for workspace ${workspaceId}, skipping field metadata update`, - ); - - return; - } - - const fieldOptions = (syncStageField.options || - []) as FieldMetadataComplexOption[]; - - const hasCalendarEventListFetchScheduled = fieldOptions.some( - (option) => - option.value === - CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_SCHEDULED, - ); - - const hasPendingConfiguration = fieldOptions.some( - (option) => - option.value === CalendarChannelSyncStage.PENDING_CONFIGURATION, - ); - - const hasCalendarEventListFetchPending = fieldOptions.some( - (option) => - option.value === - CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_PENDING, - ); - - if ( - hasCalendarEventListFetchScheduled && - hasPendingConfiguration && - hasCalendarEventListFetchPending - ) { - this.logger.log( - `CalendarChannel syncStage field metadata already migrated for workspace ${workspaceId}`, - ); - - return; - } - - if (options.dryRun) { - this.logger.log( - `Would update CalendarChannel syncStage field metadata for workspace ${workspaceId}`, - ); - - return; - } - - if (!hasCalendarEventListFetchScheduled) { - fieldOptions.push({ - value: CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_SCHEDULED, - label: 'Calendar event list fetch scheduled', - position: 1, - color: 'green', - }); - } - - if (!hasPendingConfiguration) { - fieldOptions.push({ - value: CalendarChannelSyncStage.PENDING_CONFIGURATION, - label: 'Pending configuration', - position: 9, - color: 'gray', - }); - } - - if (!hasCalendarEventListFetchPending) { - fieldOptions.push({ - value: CalendarChannelSyncStage.CALENDAR_EVENT_LIST_FETCH_PENDING, - label: 'Calendar event list fetch pending', - position: 0, - color: 'blue', - }); - } - - syncStageField.options = fieldOptions; - - await this.fieldMetadataRepository.save(syncStageField); - - this.logger.log( - `Updated CalendarChannel syncStage field metadata for workspace ${workspaceId}`, - ); - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-migrate-workflow-step-filter-operand-value.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-migrate-workflow-step-filter-operand-value.ts deleted file mode 100644 index 8ee0d5537bd..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-migrate-workflow-step-filter-operand-value.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { InjectRepository } from '@nestjs/typeorm'; - -import { isString } from 'class-validator'; -import { Command } from 'nest-commander'; -import { - convertViewFilterOperandToCoreOperand, - isDefined, -} from 'twenty-shared/utils'; -import { Raw, Repository } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { WorkflowVersionWorkspaceEntity } from 'src/modules/workflow/common/standard-objects/workflow-version.workspace-entity'; -import { isWorkflowFilterAction } from 'src/modules/workflow/workflow-executor/workflow-actions/filter/guards/is-workflow-filter-action.guard'; -import { isWorkflowFindRecordsAction } from 'src/modules/workflow/workflow-executor/workflow-actions/record-crud/guards/is-workflow-find-records-action.guard'; -import { type WorkflowAction } from 'src/modules/workflow/workflow-executor/workflow-actions/types/workflow-action.type'; -@Command({ - name: 'upgrade:1-8:migrate-workflow-step-filter-operand-value', - description: - 'Migrate workflowVersion.steps[].settings.input.stepFilters[].operand to use new operand enum', -}) -export class MigrateWorkflowStepFilterOperandValueCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - index, - total, - options, - }: RunOnWorkspaceArgs): Promise { - this.logger.log( - `[${index + 1}/${total}] Migrating workflow step filter operand values for workspace ${workspaceId}`, - ); - - const workflowVersionRepository = - await this.twentyORMGlobalManager.getRepository( - workspaceId, - 'workflowVersion', - { shouldBypassPermissionChecks: true }, - ); - - const workflowVersionsToMigrate = await workflowVersionRepository.find({ - where: [ - { - steps: Raw( - (_alias) => `"workflowVersion"."steps"::text LIKE :search`, - { - search: '%operand%', - }, - ), - }, - ], - }); - - this.logger.log( - `Found ${workflowVersionsToMigrate.length} workflowVersions to migrate`, - ); - - for (const workflowVersion of workflowVersionsToMigrate) { - let steps: WorkflowAction[] | null | undefined; - - steps = workflowVersion.steps; - - let hasChanged = false; - - for (const step of steps ?? []) { - if (isWorkflowFilterAction(step)) { - for (const filter of step.settings.input.stepFilters ?? []) { - if (isDefined(filter.operand) && isString(filter.operand)) { - const newOperand = convertViewFilterOperandToCoreOperand( - filter.operand, - ); - - if (newOperand && newOperand !== filter.operand) { - filter.operand = newOperand; - hasChanged = true; - } - } - } - } - if (isWorkflowFindRecordsAction(step)) { - for (const filter of step.settings.input.filter?.recordFilters ?? - []) { - if (isString(filter.operand)) { - const newOperand = convertViewFilterOperandToCoreOperand( - filter.operand, - ); - - if (newOperand && newOperand !== filter.operand) { - filter.operand = newOperand; - hasChanged = true; - } - } - } - } - } - - if (hasChanged) { - this.logger.log( - `${options.dryRun ? 'DRY RUN - Would be' : ''}Updating workflowVersion ${workflowVersion.id} in workspace ${workspaceId}`, - ); - - if (!options.dryRun) { - await workflowVersionRepository.update( - { id: workflowVersion.id }, - { steps }, - ); - } - - this.logger.log( - `${options.dryRun ? 'DRY RUN - Would have' : ''} Updated workflowVersion ${workflowVersion.id} in workspace ${workspaceId}`, - ); - } - } - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-regenerate-person-search-vector-with-phones.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-regenerate-person-search-vector-with-phones.command.ts deleted file mode 100644 index de658862d32..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-regenerate-person-search-vector-with-phones.command.ts +++ /dev/null @@ -1,174 +0,0 @@ -import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; - -import { Command } from 'nest-commander'; -import { DataSource, Repository, type QueryRunner } from 'typeorm'; - -import { ActiveOrSuspendedWorkspacesMigrationCommandRunner } from 'src/database/commands/command-runners/active-or-suspended-workspaces-migration.command-runner'; -import { RunOnWorkspaceArgs } from 'src/database/commands/command-runners/workspaces-migration.command-runner'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { WorkspaceSchemaManagerService } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.service'; -import { getWorkspaceSchemaName } from 'src/engine/workspace-datasource/utils/get-workspace-schema-name.util'; -import { getTsVectorColumnExpressionFromFields } from 'src/engine/workspace-manager/workspace-sync-metadata/utils/get-ts-vector-column-expression.util'; -import { SEARCH_FIELDS_FOR_PERSON } from 'src/modules/person/standard-objects/person.workspace-entity'; - -@Command({ - name: 'upgrade:1-8:regenerate-person-search-vector-with-phones', - description: - 'Regenerate person search vector to include phone number indexing for existing workspaces', -}) -export class RegeneratePersonSearchVectorWithPhonesCommand extends ActiveOrSuspendedWorkspacesMigrationCommandRunner { - constructor( - @InjectRepository(WorkspaceEntity) - protected readonly workspaceRepository: Repository, - @InjectDataSource() - private readonly coreDataSource: DataSource, - protected readonly twentyORMGlobalManager: GlobalWorkspaceOrmManager, - protected readonly dataSourceService: DataSourceService, - private readonly workspaceSchemaManager: WorkspaceSchemaManagerService, - ) { - super(workspaceRepository, twentyORMGlobalManager, dataSourceService); - } - - override async runOnWorkspace({ - workspaceId, - options, - }: RunOnWorkspaceArgs): Promise { - await this.ensureUnaccentFunction(); - - this.logger.log( - `Regenerating person search vector for workspace ${workspaceId}`, - ); - - const queryRunner = this.coreDataSource.createQueryRunner(); - - await queryRunner.connect(); - - try { - const schemaName = getWorkspaceSchemaName(workspaceId); - - const newSearchVectorExpression = getTsVectorColumnExpressionFromFields( - SEARCH_FIELDS_FOR_PERSON, - ); - - const isDryRun = Boolean(options.dryRun); - - await queryRunner.startTransaction(); - - await this.applySearchVectorChanges( - schemaName, - workspaceId, - newSearchVectorExpression, - queryRunner, - ); - - if (isDryRun) { - await queryRunner.rollbackTransaction(); - - this.logger.log( - `DRY RUN: Would regenerate person search vector for workspace ${workspaceId}`, - ); - - return; - } - - await queryRunner.commitTransaction(); - - this.logger.log( - `Successfully regenerated person search vector for workspace ${workspaceId}`, - ); - } catch (error) { - if (queryRunner.isTransactionActive) { - await queryRunner.rollbackTransaction(); - } - - this.logger.error( - `Failed to regenerate person search vector for workspace ${workspaceId}: ${error.message}`, - ); - - throw error; - } finally { - await queryRunner.release(); - } - } - - private async applySearchVectorChanges( - schemaName: string, - workspaceId: string, - newSearchVectorExpression: string, - queryRunner: QueryRunner, - ): Promise { - this.logger.log( - `Dropping existing searchVector index for workspace ${workspaceId}`, - ); - - await this.workspaceSchemaManager.indexManager.dropIndex({ - queryRunner, - schemaName, - indexName: 'IDX_person_searchVector', - }); - - this.logger.log( - `Dropping existing searchVector column for workspace ${workspaceId}`, - ); - - await this.workspaceSchemaManager.columnManager.dropColumns({ - queryRunner, - schemaName, - tableName: 'person', - columnNames: ['searchVector'], - }); - - this.logger.log( - `Creating new searchVector column with phone indexing for workspace ${workspaceId}`, - ); - - await this.workspaceSchemaManager.columnManager.addColumns({ - queryRunner, - schemaName, - tableName: 'person', - columnDefinitions: [ - { - name: 'searchVector', - type: 'tsvector', - isNullable: true, - asExpression: newSearchVectorExpression, - generatedType: 'STORED', - }, - ], - }); - - this.logger.log( - `Recreating GIN index on searchVector for workspace ${workspaceId}`, - ); - - await this.workspaceSchemaManager.indexManager.createIndex({ - queryRunner, - schemaName, - tableName: 'person', - index: { - name: 'IDX_person_searchVector', - columns: ['searchVector'], - type: 'GIN', - }, - }); - } - - private async ensureUnaccentFunction(): Promise { - const result = await this.coreDataSource.query(` - SELECT EXISTS ( - SELECT 1 FROM pg_proc p - JOIN pg_namespace n ON p.pronamespace = n.oid - WHERE n.nspname = 'public' - AND p.proname = 'unaccent_immutable' - ) as function_exists - `); - - if (!result[0]?.function_exists) { - throw new Error( - 'The public.unaccent_immutable() function is required but not found. Please run database migrations first.', - ); - } - } -} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-upgrade-version-command.module.ts deleted file mode 100644 index 338af4f884b..00000000000 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/1-8/1-8-upgrade-version-command.module.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; - -import { DeduplicateUniqueFieldsCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-deduplicate-unique-fields.command'; -import { FillNullServerlessFunctionLayerIdCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-fill-null-serverless-function-layer-id.command'; -import { MigrateChannelSyncStagesCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-migrate-channel-sync-stages.command'; -import { MigrateWorkflowStepFilterOperandValueCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-migrate-workflow-step-filter-operand-value'; -import { RegeneratePersonSearchVectorWithPhonesCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-regenerate-person-search-vector-with-phones.command'; -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; -import { IndexMetadataEntity } from 'src/engine/metadata-modules/index-metadata/index-metadata.entity'; -import { IndexMetadataModule } from 'src/engine/metadata-modules/index-metadata/index-metadata.module'; -import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity'; -import { ServerlessFunctionLayerEntity } from 'src/engine/metadata-modules/serverless-function-layer/serverless-function-layer.entity'; -import { ServerlessFunctionEntity } from 'src/engine/metadata-modules/serverless-function/serverless-function.entity'; -import { WorkspaceMigrationModule } from 'src/engine/metadata-modules/workspace-migration/workspace-migration.module'; -import { WorkspaceSchemaManagerModule } from 'src/engine/twenty-orm/workspace-schema-manager/workspace-schema-manager.module'; -import { WorkspaceMigrationRunnerModule } from 'src/engine/workspace-manager/workspace-migration-runner/workspace-migration-runner.module'; - -@Module({ - imports: [ - TypeOrmModule.forFeature([ - WorkspaceEntity, - FieldMetadataEntity, - ObjectMetadataEntity, - IndexMetadataEntity, - ServerlessFunctionEntity, - ServerlessFunctionLayerEntity, - ]), - DataSourceModule, - IndexMetadataModule, - WorkspaceMigrationRunnerModule, - WorkspaceMigrationModule, - WorkspaceSchemaManagerModule, - ], - providers: [ - MigrateWorkflowStepFilterOperandValueCommand, - MigrateChannelSyncStagesCommand, - DeduplicateUniqueFieldsCommand, - FillNullServerlessFunctionLayerIdCommand, - RegeneratePersonSearchVectorWithPhonesCommand, - ], - exports: [ - MigrateChannelSyncStagesCommand, - MigrateWorkflowStepFilterOperandValueCommand, - DeduplicateUniqueFieldsCommand, - FillNullServerlessFunctionLayerIdCommand, - RegeneratePersonSearchVectorWithPhonesCommand, - ], -}) -export class V1_8_UpgradeVersionCommandModule {} diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts index 8f8dfdc7c2d..f9b18eee0a7 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade-version-command.module.ts @@ -1,30 +1,16 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { V1_10_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-10/1-10-upgrade-version-command.module'; -import { V1_11_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-11/1-11-upgrade-version-command.module'; -import { V1_12_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-12/1-12-upgrade-version-command.module'; import { V1_13_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-13/1-13-upgrade-version-command.module'; -import { V1_6_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-6/1-6-upgrade-version-command.module'; -import { V1_7_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-7/1-7-upgrade-version-command.module'; -import { V1_8_UpgradeVersionCommandModule } from 'src/database/commands/upgrade-version-command/1-8/1-8-upgrade-version-command.module'; import { UpgradeCommand } from 'src/database/commands/upgrade-version-command/upgrade.command'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { WorkspaceSyncMetadataModule } from 'src/engine/workspace-manager/workspace-sync-metadata/workspace-sync-metadata.module'; @Module({ imports: [ TypeOrmModule.forFeature([WorkspaceEntity]), - V1_6_UpgradeVersionCommandModule, - V1_7_UpgradeVersionCommandModule, - V1_8_UpgradeVersionCommandModule, - V1_10_UpgradeVersionCommandModule, - V1_11_UpgradeVersionCommandModule, - V1_12_UpgradeVersionCommandModule, V1_13_UpgradeVersionCommandModule, DataSourceModule, - WorkspaceSyncMetadataModule, ], providers: [UpgradeCommand], }) diff --git a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts index b099c1ac683..ea049b5b79b 100644 --- a/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts +++ b/packages/twenty-server/src/database/commands/upgrade-version-command/upgrade.command.ts @@ -9,41 +9,18 @@ import { UpgradeCommandRunner, type VersionCommands, } from 'src/database/commands/command-runners/upgrade.command-runner'; -import { AddWorkflowRunStopStatusesCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-add-workflow-run-stop-statuses.command'; -import { CleanOrphanedKanbanAggregateOperationFieldMetadataIdCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-clean-orphaned-kanban-aggregate-operation-field-metadata-id.command'; -import { CreateViewKanbanFieldMetadataIdForeignKeyMigrationCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-create-view-kanban-field-metadata-id-foreign-key-migration.command'; -import { FlushCacheCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-flush-cache.command'; -import { MakeSureDashboardNamingAvailableCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-make-sure-dashboard-naming-available.command'; -import { MigrateAttachmentAuthorToCreatedByCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-author-to-created-by.command'; -import { MigrateAttachmentTypeToFileCategoryCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-migrate-attachment-type-to-file-category.command'; -import { MigrateChannelPartialFullSyncStagesCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-migrate-channel-partial-full-sync-stages.command'; -import { RegenerateSearchVectorsCommand } from 'src/database/commands/upgrade-version-command/1-10/1-10-regenerate-search-vectors.command'; -import { CleanOrphanedRoleTargetsCommand } from 'src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-role-targets.command'; -import { CleanOrphanedUserWorkspacesCommand } from 'src/database/commands/upgrade-version-command/1-11/1-11-clean-orphaned-user-workspaces.command'; -import { CreateTwentyStandardApplicationCommand } from 'src/database/commands/upgrade-version-command/1-11/1-11-create-twenty-standard-application.command'; -import { AddCalendarEventsImportScheduledSyncStageCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-add-calendar-events-import-scheduled-sync-stage.command'; -import { AddMessagesImportScheduledSyncStageCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-add-messages-import-scheduled-sync-stage.command'; -import { CleanNullEquivalentValuesCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-clean-null-equivalent-values'; -import { CreateWorkspaceCustomApplicationCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-create-workspace-custom-application.command'; -import { SetStandardApplicationNotUninstallableCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-set-standard-application-not-uninstallable.command'; -import { WorkspaceCustomApplicationIdNonNullableCommand } from 'src/database/commands/upgrade-version-command/1-12/1-12-workspace-custom-application-id-non-nullable-migration.command'; import { BackfillPageLayoutUniversalIdentifiersCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-backfill-page-layout-universal-identifiers.command'; +import { BackfillViewMainGroupByFieldMetadataIdCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-backfill-view-main-group-by-field-metadata-id.command'; +import { CleanEmptyStringNullInTextFieldsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-clean-empty-string-null-in-text-fields.command'; import { DeduplicateRoleTargetsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-deduplicate-role-targets.command'; import { MigrateStandardInvalidEntitiesCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-migrate-standard-invalid-entities.command'; import { MigrateTimelineActivityToMorphRelationsCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-migrate-timeline-activity-to-morph-relations.command'; +import { RenameIndexNameCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-rename-index.command'; import { UpdateRoleTargetsUniqueConstraintMigrationCommand } from 'src/database/commands/upgrade-version-command/1-13/1-13-update-role-targets-unique-constraint-migration.command'; -import { FixLabelIdentifierPositionAndVisibilityCommand } from 'src/database/commands/upgrade-version-command/1-6/1-6-fix-label-identifier-position-and-visibility.command'; -import { BackfillWorkflowManualTriggerAvailabilityCommand } from 'src/database/commands/upgrade-version-command/1-7/1-7-backfill-workflow-manual-trigger-availability.command'; -import { DeduplicateUniqueFieldsCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-deduplicate-unique-fields.command'; -import { FillNullServerlessFunctionLayerIdCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-fill-null-serverless-function-layer-id.command'; -import { MigrateChannelSyncStagesCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-migrate-channel-sync-stages.command'; -import { MigrateWorkflowStepFilterOperandValueCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-migrate-workflow-step-filter-operand-value'; -import { RegeneratePersonSearchVectorWithPhonesCommand } from 'src/database/commands/upgrade-version-command/1-8/1-8-regenerate-person-search-vector-with-phones.command'; import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; -import { SyncWorkspaceMetadataCommand } from 'src/engine/workspace-manager/workspace-sync-metadata/commands/sync-workspace-metadata.command'; @Command({ name: 'upgrade', @@ -58,45 +35,6 @@ export class UpgradeCommand extends UpgradeCommandRunner { protected readonly twentyConfigService: TwentyConfigService, protected readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager, protected readonly dataSourceService: DataSourceService, - protected readonly syncWorkspaceMetadataCommand: SyncWorkspaceMetadataCommand, - - // 1.6 Commands - protected readonly fixLabelIdentifierPositionAndVisibilityCommand: FixLabelIdentifierPositionAndVisibilityCommand, - - // 1.7 Commands - protected readonly backfillWorkflowManualTriggerAvailabilityCommand: BackfillWorkflowManualTriggerAvailabilityCommand, - - // 1.8 Commands - protected readonly fillNullServerlessFunctionLayerIdCommand: FillNullServerlessFunctionLayerIdCommand, - protected readonly migrateWorkflowStepFilterOperandValueCommand: MigrateWorkflowStepFilterOperandValueCommand, - protected readonly deduplicateUniqueFieldsCommand: DeduplicateUniqueFieldsCommand, - protected readonly regeneratePersonSearchVectorWithPhonesCommand: RegeneratePersonSearchVectorWithPhonesCommand, - protected readonly migrateChannelSyncStagesCommand: MigrateChannelSyncStagesCommand, - - // 1.10 Commands - protected readonly migrateAttachmentAuthorToCreatedByCommand: MigrateAttachmentAuthorToCreatedByCommand, - protected readonly migrateAttachmentTypeToFileCategoryCommand: MigrateAttachmentTypeToFileCategoryCommand, - protected readonly regenerateSearchVectorsCommand: RegenerateSearchVectorsCommand, - protected readonly addWorkflowRunStopStatusesCommand: AddWorkflowRunStopStatusesCommand, - protected readonly cleanOrphanedKanbanAggregateOperationFieldMetadataIdCommand: CleanOrphanedKanbanAggregateOperationFieldMetadataIdCommand, - protected readonly migrateChannelPartialFullSyncStagesCommand: MigrateChannelPartialFullSyncStagesCommand, - protected readonly makeSureDashboardNamingAvailableCommand: MakeSureDashboardNamingAvailableCommand, - protected readonly createViewKanbanFieldMetadataIdForeignKeyMigrationCommand: CreateViewKanbanFieldMetadataIdForeignKeyMigrationCommand, - protected readonly flushWorkspaceCacheCommand: FlushCacheCommand, - - // 1.11 Commands - protected readonly cleanOrphanedUserWorkspacesCommand: CleanOrphanedUserWorkspacesCommand, - protected readonly cleanOrphanedRoleTargetsCommand: CleanOrphanedRoleTargetsCommand, - protected readonly seedStandardApplicationsCommand: CreateTwentyStandardApplicationCommand, - - // 1.12 Commands - protected readonly setStandardApplicationNotUninstallableCommand: SetStandardApplicationNotUninstallableCommand, - protected readonly createTwentyStandardApplicationCommand: CreateTwentyStandardApplicationCommand, - protected readonly createWorkspaceCustomApplicationCommand: CreateWorkspaceCustomApplicationCommand, - protected readonly workspaceCustomApplicationIdNonNullableCommand: WorkspaceCustomApplicationIdNonNullableCommand, - protected readonly addMessagesImportScheduledSyncStageCommand: AddMessagesImportScheduledSyncStageCommand, - protected readonly addCalendarEventsImportScheduledSyncStageCommand: AddCalendarEventsImportScheduledSyncStageCommand, - protected readonly cleanNullEquivalentValuesCommand: CleanNullEquivalentValuesCommand, // 1.13 Commands protected readonly migrateTimelineActivityToMorphRelationsCommand: MigrateTimelineActivityToMorphRelationsCommand, @@ -104,90 +42,32 @@ export class UpgradeCommand extends UpgradeCommandRunner { protected readonly updateRoleTargetsUniqueConstraintMigrationCommand: UpdateRoleTargetsUniqueConstraintMigrationCommand, protected readonly backfillPageLayoutUniversalIdentifiersCommand: BackfillPageLayoutUniversalIdentifiersCommand, protected readonly migrateStandardInvalidEntitiesCommand: MigrateStandardInvalidEntitiesCommand, + protected readonly backfillViewMainGroupByFieldMetadataIdCommand: BackfillViewMainGroupByFieldMetadataIdCommand, + protected readonly cleanEmptyStringNullInTextFieldsCommand: CleanEmptyStringNullInTextFieldsCommand, + protected readonly renameIndexNameCommand: RenameIndexNameCommand, ) { super( workspaceRepository, twentyConfigService, globalWorkspaceOrmManager, dataSourceService, - syncWorkspaceMetadataCommand, ); - const commands_160: VersionCommands = { - beforeSyncMetadata: [this.fixLabelIdentifierPositionAndVisibilityCommand], - afterSyncMetadata: [], - }; + // Note: Required empty commands array to allow retrieving previous version + const commands_1120: VersionCommands = []; - const commands_170: VersionCommands = { - beforeSyncMetadata: [ - this.backfillWorkflowManualTriggerAvailabilityCommand, - ], - afterSyncMetadata: [], - }; - - const commands_180: VersionCommands = { - beforeSyncMetadata: [ - this.migrateWorkflowStepFilterOperandValueCommand, - this.deduplicateUniqueFieldsCommand, - this.regeneratePersonSearchVectorWithPhonesCommand, - this.migrateChannelSyncStagesCommand, - this.fillNullServerlessFunctionLayerIdCommand, - ], - afterSyncMetadata: [], - }; - - const commands_1100: VersionCommands = { - beforeSyncMetadata: [ - this.regenerateSearchVectorsCommand, - this.addWorkflowRunStopStatusesCommand, - this.cleanOrphanedKanbanAggregateOperationFieldMetadataIdCommand, - this.createViewKanbanFieldMetadataIdForeignKeyMigrationCommand, - this.migrateChannelPartialFullSyncStagesCommand, - this.makeSureDashboardNamingAvailableCommand, - ], - afterSyncMetadata: [ - this.migrateAttachmentAuthorToCreatedByCommand, - this.migrateAttachmentTypeToFileCategoryCommand, - this.flushWorkspaceCacheCommand, - ], - }; - - const commands_1110: VersionCommands = { - beforeSyncMetadata: [this.createTwentyStandardApplicationCommand], - afterSyncMetadata: [ - this.cleanOrphanedUserWorkspacesCommand, - this.cleanOrphanedRoleTargetsCommand, - ], - }; - - const commands_1120: VersionCommands = { - beforeSyncMetadata: [ - this.createWorkspaceCustomApplicationCommand, - this.workspaceCustomApplicationIdNonNullableCommand, - this.addMessagesImportScheduledSyncStageCommand, - this.addCalendarEventsImportScheduledSyncStageCommand, - this.cleanNullEquivalentValuesCommand, - ], - afterSyncMetadata: [this.setStandardApplicationNotUninstallableCommand], - }; - - const commands_1130: VersionCommands = { - beforeSyncMetadata: [ - this.deduplicateRoleTargetsCommand, - this.updateRoleTargetsUniqueConstraintMigrationCommand, - this.migrateTimelineActivityToMorphRelationsCommand, - this.backfillPageLayoutUniversalIdentifiersCommand, - this.migrateStandardInvalidEntitiesCommand, - ], - afterSyncMetadata: [], - }; + const commands_1130: VersionCommands = [ + this.migrateTimelineActivityToMorphRelationsCommand, + this.deduplicateRoleTargetsCommand, + this.updateRoleTargetsUniqueConstraintMigrationCommand, + this.backfillPageLayoutUniversalIdentifiersCommand, + this.migrateStandardInvalidEntitiesCommand, + this.backfillViewMainGroupByFieldMetadataIdCommand, + this.cleanEmptyStringNullInTextFieldsCommand, + this.renameIndexNameCommand, + ]; this.allCommands = { - '1.6.0': commands_160, - '1.7.0': commands_170, - '1.8.0': commands_180, - '1.10.0': commands_1100, - '1.11.0': commands_1110, '1.12.0': commands_1120, '1.13.0': commands_1130, };