Merged in chore/fix-semver (pull request #3393)
Chore/fix semver * fix semver versioning * fix semver versioning * Merge branch 'chore/fix-semver' of bitbucket.org:scandic-swap/web into chore/fix-semver * Merge branch 'master' of bitbucket.org:scandic-swap/web into chore/fix-semver * reset to master Approved-by: Linus Flood
This commit is contained in:
7
apps/partner-sas/env/client.ts
vendored
7
apps/partner-sas/env/client.ts
vendored
@@ -1,11 +1,16 @@
|
|||||||
import { createEnv } from "@t3-oss/env-nextjs"
|
import { createEnv } from "@t3-oss/env-nextjs"
|
||||||
import { z } from "zod"
|
import { z } from "zod"
|
||||||
|
|
||||||
|
import { getSemver } from "@scandic-hotels/common/utils/getSemver"
|
||||||
|
|
||||||
export const env = createEnv({
|
export const env = createEnv({
|
||||||
client: {
|
client: {
|
||||||
NEXT_PUBLIC_SENTRY_ENVIRONMENT: z.string().default("development"),
|
NEXT_PUBLIC_SENTRY_ENVIRONMENT: z.string().default("development"),
|
||||||
NEXT_PUBLIC_SENTRY_CLIENT_SAMPLERATE: z.coerce.number().default(0.001),
|
NEXT_PUBLIC_SENTRY_CLIENT_SAMPLERATE: z.coerce.number().default(0.001),
|
||||||
NEXT_PUBLIC_RELEASE_TAG: z.string().optional(),
|
NEXT_PUBLIC_RELEASE_TAG: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.transform((s) => getSemver(s, process.env.BRANCH || "development")),
|
||||||
},
|
},
|
||||||
emptyStringAsUndefined: true,
|
emptyStringAsUndefined: true,
|
||||||
runtimeEnv: {
|
runtimeEnv: {
|
||||||
|
|||||||
7
apps/partner-sas/env/server.ts
vendored
7
apps/partner-sas/env/server.ts
vendored
@@ -1,6 +1,8 @@
|
|||||||
import { createEnv } from "@t3-oss/env-nextjs"
|
import { createEnv } from "@t3-oss/env-nextjs"
|
||||||
import { z } from "zod"
|
import { z } from "zod"
|
||||||
|
|
||||||
|
import { getSemver } from "@scandic-hotels/common/utils/getSemver"
|
||||||
|
|
||||||
export const env = createEnv({
|
export const env = createEnv({
|
||||||
/**
|
/**
|
||||||
* Due to t3-env only checking typeof window === "undefined"
|
* Due to t3-env only checking typeof window === "undefined"
|
||||||
@@ -36,7 +38,10 @@ export const env = createEnv({
|
|||||||
.refine((s) => s === "true" || s === "false")
|
.refine((s) => s === "true" || s === "false")
|
||||||
.transform((s) => s === "true")
|
.transform((s) => s === "true")
|
||||||
.default("false"),
|
.default("false"),
|
||||||
RELEASE_TAG: z.string().optional(),
|
RELEASE_TAG: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.transform((s) => getSemver(s, process.env.BRANCH || "development")),
|
||||||
},
|
},
|
||||||
emptyStringAsUndefined: true,
|
emptyStringAsUndefined: true,
|
||||||
runtimeEnv: {
|
runtimeEnv: {
|
||||||
|
|||||||
@@ -27,12 +27,12 @@ export function EnvironmentWatermark() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const { environment, name } = getEnvironmentName()
|
const { environment, name } = getEnvironmentName()
|
||||||
const displayValues = [name]
|
const displayValues: string[] = [environment]
|
||||||
if (name !== environment) {
|
|
||||||
displayValues.push(`(${environment})`)
|
|
||||||
}
|
|
||||||
if (env.NEXT_PUBLIC_RELEASE_TAG) {
|
if (env.NEXT_PUBLIC_RELEASE_TAG) {
|
||||||
displayValues.push(`[${env.NEXT_PUBLIC_RELEASE_TAG}]`)
|
displayValues.push(`[${env.NEXT_PUBLIC_RELEASE_TAG}]`)
|
||||||
|
} else if (name !== environment) {
|
||||||
|
displayValues.push(`(${name})`)
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
7
apps/scandic-web/env/client.ts
vendored
7
apps/scandic-web/env/client.ts
vendored
@@ -1,6 +1,8 @@
|
|||||||
import { createEnv } from "@t3-oss/env-nextjs"
|
import { createEnv } from "@t3-oss/env-nextjs"
|
||||||
import { z } from "zod"
|
import { z } from "zod"
|
||||||
|
|
||||||
|
import { getSemver } from "@scandic-hotels/common/utils/getSemver"
|
||||||
|
|
||||||
export const env = createEnv({
|
export const env = createEnv({
|
||||||
client: {
|
client: {
|
||||||
NEXT_PUBLIC_NODE_ENV: z.enum(["development", "test", "production"]),
|
NEXT_PUBLIC_NODE_ENV: z.enum(["development", "test", "production"]),
|
||||||
@@ -8,7 +10,10 @@ export const env = createEnv({
|
|||||||
NEXT_PUBLIC_SENTRY_ENVIRONMENT: z.string().default("development"),
|
NEXT_PUBLIC_SENTRY_ENVIRONMENT: z.string().default("development"),
|
||||||
NEXT_PUBLIC_SENTRY_CLIENT_SAMPLERATE: z.coerce.number().default(0.001),
|
NEXT_PUBLIC_SENTRY_CLIENT_SAMPLERATE: z.coerce.number().default(0.001),
|
||||||
NEXT_PUBLIC_PUBLIC_URL: z.string().optional(),
|
NEXT_PUBLIC_PUBLIC_URL: z.string().optional(),
|
||||||
NEXT_PUBLIC_RELEASE_TAG: z.string().optional(),
|
NEXT_PUBLIC_RELEASE_TAG: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.transform((s) => getSemver(s, process.env.BRANCH || "development")),
|
||||||
},
|
},
|
||||||
emptyStringAsUndefined: true,
|
emptyStringAsUndefined: true,
|
||||||
runtimeEnv: {
|
runtimeEnv: {
|
||||||
|
|||||||
7
apps/scandic-web/env/server.ts
vendored
7
apps/scandic-web/env/server.ts
vendored
@@ -1,6 +1,8 @@
|
|||||||
import { createEnv } from "@t3-oss/env-nextjs"
|
import { createEnv } from "@t3-oss/env-nextjs"
|
||||||
import { z } from "zod"
|
import { z } from "zod"
|
||||||
|
|
||||||
|
import { getSemver } from "@scandic-hotels/common/utils/getSemver"
|
||||||
|
|
||||||
export const env = createEnv({
|
export const env = createEnv({
|
||||||
/**
|
/**
|
||||||
* Due to t3-env only checking typeof window === "undefined"
|
* Due to t3-env only checking typeof window === "undefined"
|
||||||
@@ -112,7 +114,10 @@ export const env = createEnv({
|
|||||||
.refine((s) => s === "true" || s === "false")
|
.refine((s) => s === "true" || s === "false")
|
||||||
.transform((s) => s === "true")
|
.transform((s) => s === "true")
|
||||||
.default("false"),
|
.default("false"),
|
||||||
RELEASE_TAG: z.string().optional(),
|
RELEASE_TAG: z
|
||||||
|
.string()
|
||||||
|
.optional()
|
||||||
|
.transform((s) => getSemver(s, process.env.BRANCH || "development")),
|
||||||
},
|
},
|
||||||
emptyStringAsUndefined: true,
|
emptyStringAsUndefined: true,
|
||||||
runtimeEnv: {
|
runtimeEnv: {
|
||||||
|
|||||||
@@ -40,6 +40,7 @@
|
|||||||
"./stores/*": "./stores/*.ts",
|
"./stores/*": "./stores/*.ts",
|
||||||
"./telemetry": "./telemetry/index.ts",
|
"./telemetry": "./telemetry/index.ts",
|
||||||
"./tokenManager": "./tokenManager/index.ts",
|
"./tokenManager": "./tokenManager/index.ts",
|
||||||
|
"./utils/getSemver": "./utils/getSemver.ts",
|
||||||
"./utils/stringEquals": "./utils/stringEquals.ts",
|
"./utils/stringEquals": "./utils/stringEquals.ts",
|
||||||
"./utils/chunk": "./utils/chunk.ts",
|
"./utils/chunk": "./utils/chunk.ts",
|
||||||
"./utils/dateFormatting": "./utils/dateFormatting.ts",
|
"./utils/dateFormatting": "./utils/dateFormatting.ts",
|
||||||
|
|||||||
50
packages/common/utils/getSemver.test.ts
Normal file
50
packages/common/utils/getSemver.test.ts
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
import { describe, expect, it } from "vitest"
|
||||||
|
|
||||||
|
import { getSemver } from "./getSemver"
|
||||||
|
|
||||||
|
describe("getSemver", () => {
|
||||||
|
it("should return undefined if version is undefined", () => {
|
||||||
|
expect(getSemver(undefined, "master")).toBeUndefined()
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should return undefined if version is not a string", () => {
|
||||||
|
// @ts-expect-error Testing invalid input
|
||||||
|
expect(getSemver(123, "master")).toBeUndefined()
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should strip 'v' prefix from version", () => {
|
||||||
|
expect(getSemver("v1.0.0", "master")).toBe("1.0.0")
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should return undefined if version format is invalid", () => {
|
||||||
|
expect(getSemver("invalid-version", "master")).toBeUndefined()
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should return the version as-is for named branches", () => {
|
||||||
|
expect(getSemver("1.0.0", "release")).toBe("1.0.0")
|
||||||
|
expect(getSemver("1.0.0", "master")).toBe("1.0.0")
|
||||||
|
expect(getSemver("1.0.0", "test")).toBe("1.0.0")
|
||||||
|
expect(getSemver("1.0.0", "stage")).toBe("1.0.0")
|
||||||
|
expect(getSemver("1.0.0", "prod")).toBe("1.0.0")
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should append cleaned branch name for non-named branches", () => {
|
||||||
|
expect(getSemver("1.0.0", "feature/my-feature")).toBe(
|
||||||
|
"1.0.0-feature-my-feature"
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should handle special characters in non-named branches", () => {
|
||||||
|
expect(getSemver("1.0.0", "fix/bug#123")).toBe("1.0.0-fix-bug-123")
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should lowercase and trim non-named branches", () => {
|
||||||
|
expect(getSemver("1.0.0", " MY-BRANCH ")).toBe("1.0.0-my-branch")
|
||||||
|
})
|
||||||
|
|
||||||
|
it("should truncate long branch names", () => {
|
||||||
|
expect(
|
||||||
|
getSemver("1.0.0", "feature/very-long-branch-name-that-exceeds-limit")
|
||||||
|
).toBe("1.0.0-feature-very-long-br")
|
||||||
|
})
|
||||||
|
})
|
||||||
32
packages/common/utils/getSemver.ts
Normal file
32
packages/common/utils/getSemver.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
const namedBranches = ["release", "master", "test", "stage", "prod"] as const
|
||||||
|
|
||||||
|
type NamedBranch = (typeof namedBranches)[number] | (string & {})
|
||||||
|
|
||||||
|
export function getSemver(
|
||||||
|
version: string | undefined,
|
||||||
|
branch: NamedBranch
|
||||||
|
): string | undefined {
|
||||||
|
if (!version || typeof version !== "string") {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
if (version.startsWith("v")) {
|
||||||
|
version = version.substring(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!/^\d+\.\d+\.\d+/.test(version)) {
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!namedBranches.includes(branch as any)) {
|
||||||
|
let cleanedBranch = branch
|
||||||
|
.substring(0, 20)
|
||||||
|
.trim()
|
||||||
|
.replace(/[^a-zA-Z0-9]/g, "-")
|
||||||
|
.toLowerCase()
|
||||||
|
|
||||||
|
return `${version}-${cleanedBranch}`
|
||||||
|
}
|
||||||
|
|
||||||
|
return version
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user