Path: blob/main/components/ide/gha-update-image/lib/jb-helper/jb-helper.ts
2501 views
import semver from "semver";1import { ReleaseItem } from "./jb-releases";23export type UsePlatformVersionType =4| "build" // use `build` field from ReleaseItem5| "version" // use `version` field from ReleaseItem6| "build-snapshot"; // use major `build` with `-EAP-CANDIDATE-SNAPSHOT`78export const AllProductCodes = ["IIU", "GW", "GO", "PCP", "PS", "RM", "WS", "RD", "CL", "RR"] as const;9export type ProductCodes = (typeof AllProductCodes)[number];10export const AllProductIDs = [11"intellij",12"gateway",13"goland",14"pycharm",15"phpstorm",16"rubymine",17"webstorm",18"rider",19"clion",20"rustrover",21] as const;22export type ProductIDs = (typeof AllProductIDs)[number];2324export interface TargetInfo {25/**26* @example intellij goland27*/28productId: ProductIDs;29/**30* @example IIU GO31*/32productCode: ProductCodes;33/**34* @example eap,rc,release35*/36productType: string;37/**38* Examples value for different type:39* - build 243.18137.2240* - version 2024.341* - build-snapshot 243.18137-EAP-CANDIDATE-SNAPSHOT42*/43usePlatformVersionType: "build" | "version" | "build-snapshot";44gradlePropertiesPath: string;45gradlePropertiesTemplate: string;46}4748export interface GradleProperties {49pluginSinceBuild: string;50pluginUntilBuild: string;51pluginVerifierIdeVersions: string;52platformVersion: string;53}5455export const parseGradleProperties = (content: string) => {56const properties: Record<string, string> = {};57content.split("\n").forEach((line) => {58if (line.startsWith("#")) {59return;60}61const [key, value] = line.split("=");62if (key && value) {63properties[key.trim()] = value.trim();64}65});66return properties as any as GradleProperties;67};6869export function parseGradlePropertiesFromTaskConfig(70info: Pick<TargetInfo, "usePlatformVersionType">,71targetBuild: ReleaseItem,72): GradleProperties {73const build = targetBuild.build;74const buildSem = semver.parse(build);75if (!buildSem) {76throw new Error(`Invalid build version ${build}`);77}78let platformVersion = build;79switch (info.usePlatformVersionType) {80case "build":81platformVersion = build;82break;83case "version":84platformVersion = targetBuild.version;85break;86case "build-snapshot":87platformVersion = `${buildSem.major}.${buildSem.minor}-EAP-CANDIDATE-SNAPSHOT`;88break;89}90return {91pluginSinceBuild: `${buildSem.major}.${buildSem.minor}`,92pluginUntilBuild: `${buildSem.major}.*`,93pluginVerifierIdeVersions: targetBuild.majorVersion,94platformVersion,95};96}9798export function renderPropertiesTemplate(99whoami: string,100info: Pick<TargetInfo, "gradlePropertiesTemplate">,101properties: GradleProperties,102) {103const { gradlePropertiesTemplate } = info;104let newContent = gradlePropertiesTemplate;105Object.entries(properties).forEach(([key, value]) => {106newContent = newContent.replace(`{{${key}}}`, value);107});108return `# Code generated by ${whoami}. DO NOT EDIT.\n${newContent}`;109}110111export const maybeCompatible = (112newRelease: Pick<ReleaseItem, "build">,113oldVersion: Pick<GradleProperties, "pluginSinceBuild">,114) => {115const sinceBuild = semver.parse(`${oldVersion.pluginSinceBuild}.0`);116const newBuild = semver.parse(newRelease.build);117if (!sinceBuild || !newBuild) {118return false;119}120const versionOK = semver.gte(newBuild, sinceBuild, false);121const majorOK = semver.major(newBuild) === semver.major(sinceBuild);122return versionOK && majorOK;123};124125126