From b46442bd9dd74633410e14e1f27a698f31bb85d0 Mon Sep 17 00:00:00 2001 From: Xiaohan-Tian <157918347+Xiaohan-Tian@users.noreply.github.com> Date: Thu, 22 Jan 2026 19:10:01 -0800 Subject: [PATCH] feat: added upgradeToV3 upgrader --- src/core/KGProject.ts | 2 +- .../project-upgrader/KGProjectUpgrader.ts | 5 ++++ src/core/project-upgrader/upgradeToV3.ts | 26 +++++++++++++++++++ src/test/utils/mock-data.ts | 2 +- 4 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/core/project-upgrader/upgradeToV3.ts diff --git a/src/core/KGProject.ts b/src/core/KGProject.ts index 76a24bd..233fc2f 100644 --- a/src/core/KGProject.ts +++ b/src/core/KGProject.ts @@ -47,7 +47,7 @@ export class KGProject { @WithDefault(0) private projectStructureVersion: number = 0; - public static readonly CURRENT_PROJECT_STRUCTURE_VERSION: number = 2; + public static readonly CURRENT_PROJECT_STRUCTURE_VERSION: number = 3; @Expose() @Type(() => KGTrack, { diff --git a/src/core/project-upgrader/KGProjectUpgrader.ts b/src/core/project-upgrader/KGProjectUpgrader.ts index 048d7dd..d0f3bfa 100644 --- a/src/core/project-upgrader/KGProjectUpgrader.ts +++ b/src/core/project-upgrader/KGProjectUpgrader.ts @@ -1,6 +1,7 @@ import { KGProject } from '../KGProject'; import { upgradeToV1 } from './upgradeToV1'; import { upgradeToV2 } from './upgradeToV2'; +import { upgradeToV3 } from './upgradeToV3'; /** * Upgrade the given project to the latest structure version, one version at a time. @@ -28,6 +29,10 @@ export function upgradeProjectToLatest(project: KGProject): KGProject { workingProject = upgradeToV2(workingProject); break; } + case 3: { + workingProject = upgradeToV3(workingProject); + break; + } default: { // If an upgrader is missing, throw to prevent loading incompatible structures throw new Error(`No upgrader found for project structure version ${nextVersion}`); diff --git a/src/core/project-upgrader/upgradeToV3.ts b/src/core/project-upgrader/upgradeToV3.ts new file mode 100644 index 0000000..07dbf35 --- /dev/null +++ b/src/core/project-upgrader/upgradeToV3.ts @@ -0,0 +1,26 @@ +import { KGProject } from '../KGProject'; + +/** + * Upgrade a project from structure version 2 to 3. + * Adds the isLooping and loopingRange fields with default values. + */ +export function upgradeToV3(project: KGProject): KGProject { + try { + // Set default isLooping to false if not already set + const currentIsLooping = project.getIsLooping?.(); + if (currentIsLooping === undefined) { + project.setIsLooping(false); + } + + // Set default loopingRange to [0, 0] if not already set + const currentLoopingRange = project.getLoopingRange?.(); + if (!currentLoopingRange) { + project.setLoopingRange([0, 0]); + } + } finally { + // Always set the project structure version to 3 to mark migration complete + project.setProjectStructureVersion(3); + } + + return project; +} diff --git a/src/test/utils/mock-data.ts b/src/test/utils/mock-data.ts index bf3062f..c7607e3 100644 --- a/src/test/utils/mock-data.ts +++ b/src/test/utils/mock-data.ts @@ -124,7 +124,7 @@ export const createMockProject = (overrides: Partial<{ false, // isLooping [0, 0], // loopingRange defaults.tracks, // tracks - 1 // projectStructureVersion + 3 // projectStructureVersion ) return project