Path: blob/main/extensions/extension-editing/src/extensionEngineValidation.ts
3291 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45// https://github.com/microsoft/vscode/blob/6cb34eb22385bc93ab25aa2e5113f59c7a2299ac/src/vs/platform/extensions/common/extensionValidator.ts67export interface IParsedVersion {8hasCaret: boolean;9hasGreaterEquals: boolean;10majorBase: number;11majorMustEqual: boolean;12minorBase: number;13minorMustEqual: boolean;14patchBase: number;15patchMustEqual: boolean;16preRelease: string | null;17}1819export interface INormalizedVersion {20majorBase: number;21majorMustEqual: boolean;22minorBase: number;23minorMustEqual: boolean;24patchBase: number;25patchMustEqual: boolean;26notBefore: number; /* milliseconds timestamp, or 0 */27isMinimum: boolean;28}2930const VERSION_REGEXP = /^(\^|>=)?((\d+)|x)\.((\d+)|x)\.((\d+)|x)(\-.*)?$/;31const NOT_BEFORE_REGEXP = /^-(\d{4})(\d{2})(\d{2})$/;3233export function isValidVersionStr(version: string): boolean {34version = version.trim();35return (version === '*' || VERSION_REGEXP.test(version));36}3738export function parseVersion(version: string): IParsedVersion | null {39if (!isValidVersionStr(version)) {40return null;41}4243version = version.trim();4445if (version === '*') {46return {47hasCaret: false,48hasGreaterEquals: false,49majorBase: 0,50majorMustEqual: false,51minorBase: 0,52minorMustEqual: false,53patchBase: 0,54patchMustEqual: false,55preRelease: null56};57}5859const m = version.match(VERSION_REGEXP);60if (!m) {61return null;62}63return {64hasCaret: m[1] === '^',65hasGreaterEquals: m[1] === '>=',66majorBase: m[2] === 'x' ? 0 : parseInt(m[2], 10),67majorMustEqual: (m[2] === 'x' ? false : true),68minorBase: m[4] === 'x' ? 0 : parseInt(m[4], 10),69minorMustEqual: (m[4] === 'x' ? false : true),70patchBase: m[6] === 'x' ? 0 : parseInt(m[6], 10),71patchMustEqual: (m[6] === 'x' ? false : true),72preRelease: m[8] || null73};74}7576export function normalizeVersion(version: IParsedVersion | null): INormalizedVersion | null {77if (!version) {78return null;79}8081const majorBase = version.majorBase;82const majorMustEqual = version.majorMustEqual;83const minorBase = version.minorBase;84let minorMustEqual = version.minorMustEqual;85const patchBase = version.patchBase;86let patchMustEqual = version.patchMustEqual;8788if (version.hasCaret) {89if (majorBase === 0) {90patchMustEqual = false;91} else {92minorMustEqual = false;93patchMustEqual = false;94}95}9697let notBefore = 0;98if (version.preRelease) {99const match = NOT_BEFORE_REGEXP.exec(version.preRelease);100if (match) {101const [, year, month, day] = match;102notBefore = Date.UTC(Number(year), Number(month) - 1, Number(day));103}104}105106return {107majorBase: majorBase,108majorMustEqual: majorMustEqual,109minorBase: minorBase,110minorMustEqual: minorMustEqual,111patchBase: patchBase,112patchMustEqual: patchMustEqual,113isMinimum: version.hasGreaterEquals,114notBefore,115};116}117118119