k8s-deploy/src/strategyHelpers/blueGreen/serviceBlueGreenHelper.ts
David Gamero 01cfe404ef
Migrate to esbuild/Vitest and upgrade @actions/* to ESM-only versions (#492)
* Migrate build toolchain from ncc/Jest to esbuild/Vitest

Replace the legacy ncc/Jest/Babel build stack with a modern ESM toolchain:

Build:
- Replace @vercel/ncc with esbuild (--platform=node --target=node20 --format=esm)
- Add createRequire banner for CJS interop in ESM bundle
- Add "type": "module" to package.json
- Add tsc --noEmit typecheck script (esbuild strips types without checking)
- Add typecheck to husky pre-commit hook

Dependencies:
- Bump @actions/core@3, exec@3, io@3, tool-cache@4 (ESM-only)
- Replace jest/ts-jest/@babel/* with vitest@4

Tests:
- Convert 29 test files: jest.fn()→vi.fn(), jest.mock()→vi.mock(), jest.spyOn()→vi.spyOn()
- Fix vitest 4 compat: mockImplementation requires args, mock call tracking, await .rejects

CI:
- Update build step from ncc build → npm run build
- Update composite action to use npm run build

* Switch tsconfig to NodeNext module resolution

Change module/moduleResolution from ES2022/bundler to NodeNext/NodeNext
and target from ES2022 to ES2020.

- Add .js extensions to all relative imports across 59 source/test files
  (required by NodeNext module resolution)
- Add vitest/globals to tsconfig types array for global test API declarations
2026-02-24 11:57:56 -08:00

51 lines
1.4 KiB
TypeScript

import * as core from '@actions/core'
import {K8sServiceObject} from '../../types/k8sObject.js'
import {Kubectl} from '../../types/kubectl.js'
import {
addBlueGreenLabelsAndAnnotations,
BLUE_GREEN_VERSION_LABEL,
fetchResource,
GREEN_LABEL_VALUE
} from './blueGreenHelper.js'
// add green labels to configure existing service
export function getUpdatedBlueGreenService(
inputObject: any,
labelValue: string
): K8sServiceObject {
const newObject = JSON.parse(JSON.stringify(inputObject))
// Adding labels and annotations.
addBlueGreenLabelsAndAnnotations(newObject, labelValue)
return newObject
}
export async function validateServicesState(
kubectl: Kubectl,
serviceEntityList: any[]
): Promise<boolean> {
let areServicesGreen: boolean = true
for (const serviceObject of serviceEntityList) {
// finding the existing routed service
const existingService = await fetchResource(
kubectl,
serviceObject.kind,
serviceObject.metadata.name,
serviceObject?.metadata?.namespace
)
let isServiceGreen =
!!existingService &&
getServiceSpecLabel(existingService as K8sServiceObject) ==
GREEN_LABEL_VALUE
areServicesGreen = areServicesGreen && isServiceGreen
}
return areServicesGreen
}
export function getServiceSpecLabel(inputObject: K8sServiceObject): string {
return inputObject.spec.selector[BLUE_GREEN_VERSION_LABEL]
}