From 279092c5e6f379047942ed7f321a3c7ec6d29d45 Mon Sep 17 00:00:00 2001 From: NeyorDEV <180453958+NeyorDEV@users.noreply.github.com> Date: Tue, 20 Oct 2026 19:26:26 +0000 Subject: [PATCH] fix(migrate): require a digit in loader versions A real run accepted "--loader-version X.Y.Z" (another placeholder copied from an example) because it looks like a version, and wrote an unusable pack. Every real loader version contains a digit, so values without one (X.Y.Z, latest) are now rejected before any request. --- CHANGELOG.md | 3 ++- src/loaders/loaderVersion.ts | 7 ++++--- test/loaders/loaderVersion.test.ts | 15 +++++++++++---- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f68ec13..8f90acc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,8 @@ All notable changes to ModShift are documented here. The format follows ### Fixed - `migrate` (and the config and web UI) now reject a loader version that is not a version, such - as a `` placeholder copied from an example, instead of writing an invalid pack. + as a `` or `X.Y.Z` placeholder copied from an example (a version must contain a + digit), instead of writing an invalid pack. - Unrelated alternatives: a popular mod sharing only a broad category (e.g. Xaero's Minimap for CIT Resewn) is no longer suggested; a candidate needs a similar name or two shared keywords (one generic word such as "screen" is not enough). diff --git a/src/loaders/loaderVersion.ts b/src/loaders/loaderVersion.ts index 6789297..28da441 100644 --- a/src/loaders/loaderVersion.ts +++ b/src/loaders/loaderVersion.ts @@ -1,10 +1,11 @@ // Format d'une version de loader écrite dans un .mrpack (ex. 0.16.5, 21.1.77, 47.3.0, -// 0.27.1-beta.1). Refuse ce qui n'est clairement pas une version (ex. « » recopié -// d'un exemple), sans prétendre vérifier qu'elle existe. +// 0.27.1-beta.1). Refuse ce qui n'est clairement pas une version (ex. « » ou « X.Y.Z » +// recopiés d'un exemple : toute vraie version contient un chiffre), sans prétendre vérifier +// qu'elle existe. const LOADER_VERSION_PATTERN = /^[0-9A-Za-z][0-9A-Za-z.+_-]{0,63}$/; export function isValidLoaderVersion(value: string): boolean { - return LOADER_VERSION_PATTERN.test(value); + return LOADER_VERSION_PATTERN.test(value) && /[0-9]/.test(value); } export function invalidLoaderVersionMessage(value: string): string { diff --git a/test/loaders/loaderVersion.test.ts b/test/loaders/loaderVersion.test.ts index 15328fb..f584144 100644 --- a/test/loaders/loaderVersion.test.ts +++ b/test/loaders/loaderVersion.test.ts @@ -14,10 +14,17 @@ describe('loader version format', () => { (version) => expect(isValidLoaderVersion(version)).toBe(true), ); - it.each(['', '', ' 0.16.5', '0.16 .5', '-0.16.5', 'x'.repeat(65), '0.16.5;rm'])( - 'rejects %j', - (version) => expect(isValidLoaderVersion(version)).toBe(false), - ); + it.each([ + '', + 'X.Y.Z', + 'latest', + '', + ' 0.16.5', + '0.16 .5', + '-0.16.5', + 'x'.repeat(65), + '0.16.5;rm', + ])('rejects %j', (version) => expect(isValidLoaderVersion(version)).toBe(false)); it('rejects an invalid target.loaderVersion in the config', () => { expect(() => validateConfig({ target: { loaderVersion: '' } }, 'c.json')).toThrow(