mirror of
https://github.com/Azure/k8s-set-context.git
synced 2026-04-12 03:22:16 +08:00
Migrate to ESM with esbuild, vitest (#227)
* Migrate to ESM, esbuild, vitest, and update actions/* to latest - Update @actions/core to 3.x, @actions/exec to 3.x, @actions/io to 3.x - Replace @vercel/ncc + babel with esbuild (build.mjs) targeting Node 20 ESM - Replace jest/babel-jest/ts-jest with vitest and @vitest/coverage-v8 - Update tsconfig to NodeNext module resolution with strict mode - Add explicit .js extensions to all relative imports (NodeNext requirement) - Fix implicit any index signatures in parseCluster and parseMethod - Migrate all test files from jest to vi.mock/vi.mocked APIs - Fix ESM module spying limitations using vi.mock() at module level - Fix env var test pollution in default.test.ts with afterEach cleanup * remove build.mjs and update build script * update pkg lock * update pkg lock
This commit is contained in:
parent
eb220500b5
commit
1f527c033f
@ -1,7 +0,0 @@
|
|||||||
// babel.config.js
|
|
||||||
export default {
|
|
||||||
presets: [
|
|
||||||
'@babel/preset-env', // For handling ES modules
|
|
||||||
'@babel/preset-typescript' // For handling TypeScript
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@ -1,28 +0,0 @@
|
|||||||
export default {
|
|
||||||
restoreMocks: true,
|
|
||||||
clearMocks: true,
|
|
||||||
resetMocks: true,
|
|
||||||
moduleFileExtensions: ['js', 'ts'],
|
|
||||||
testEnvironment: 'node',
|
|
||||||
testMatch: ['**/*.test.ts'],
|
|
||||||
transform: {
|
|
||||||
'^.+\\.ts$': 'ts-jest', // Use ts-jest for TypeScript files
|
|
||||||
'^.+\\.js$': 'babel-jest' // Transform TypeScript files
|
|
||||||
},
|
|
||||||
transformIgnorePatterns: [
|
|
||||||
'/node_modules/(?!@kubernetes/client-node)/' // Make sure to transform the Kubernetes client module
|
|
||||||
],
|
|
||||||
moduleNameMapper: {
|
|
||||||
'^.+\\.css$': 'jest-transform-stub' // Handle CSS imports (if any)
|
|
||||||
},
|
|
||||||
extensionsToTreatAsEsm: ['.ts', '.tsx'], // Treat TypeScript files as ESM
|
|
||||||
verbose: true,
|
|
||||||
coverageThreshold: {
|
|
||||||
global: {
|
|
||||||
branches: 0,
|
|
||||||
functions: 40,
|
|
||||||
lines: 22,
|
|
||||||
statements: 22
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
11913
package-lock.json
generated
11913
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
25
package.json
25
package.json
@ -5,10 +5,10 @@
|
|||||||
"main": "lib/index.js",
|
"main": "lib/index.js",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"prebuild": "npm i @vercel/ncc",
|
"build": "tsc --noEmit && esbuild src/run.ts --bundle --platform=node --target=node20 --format=esm --outfile=lib/index.js --banner:js=\"import { createRequire } from 'module';const require = createRequire(import.meta.url);\"",
|
||||||
"build": "ncc build src/run.ts -o lib",
|
"typecheck": "tsc --noEmit",
|
||||||
"test": "jest",
|
"test": "vitest run",
|
||||||
"test-coverage": "jest --coverage",
|
"test-coverage": "vitest run --coverage",
|
||||||
"format": "prettier --write .",
|
"format": "prettier --write .",
|
||||||
"format-check": "prettier --check .",
|
"format-check": "prettier --check .",
|
||||||
"prepare": "husky"
|
"prepare": "husky"
|
||||||
@ -21,24 +21,19 @@
|
|||||||
"author": "GitHub",
|
"author": "GitHub",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^2.0.2",
|
"@actions/core": "^3.0.0",
|
||||||
"@actions/exec": "^2.0.0",
|
"@actions/exec": "^3.0.0",
|
||||||
"@actions/io": "^2.0.0",
|
"@actions/io": "^3.0.2",
|
||||||
"@kubernetes/client-node": "^1.4.0",
|
"@kubernetes/client-node": "^1.4.0",
|
||||||
"husky": "^9.1.7",
|
"husky": "^9.1.7",
|
||||||
"js-yaml": "^4.1.1"
|
"js-yaml": "^4.1.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/preset-env": "^7.28.6",
|
|
||||||
"@babel/preset-typescript": "^7.28.5",
|
|
||||||
"@types/jest": "^30.0.0",
|
|
||||||
"@types/js-yaml": "^4.0.9",
|
"@types/js-yaml": "^4.0.9",
|
||||||
"@types/node": "^25.0.9",
|
"@types/node": "^25.0.9",
|
||||||
"@vercel/ncc": "^0.38.4",
|
"esbuild": "^0.27.4",
|
||||||
"babel-jest": "^30.2.0",
|
|
||||||
"jest": "^30.2.0",
|
|
||||||
"prettier": "^3.8.0",
|
"prettier": "^3.8.0",
|
||||||
"ts-jest": "^29.4.6",
|
"typescript": "^5.9.3",
|
||||||
"typescript": "^5.9.3"
|
"vitest": "^4.1.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,7 +1,9 @@
|
|||||||
import {getRequiredInputError} from '../tests/util'
|
import {vi, describe, it, expect} from 'vitest'
|
||||||
import {run} from './action'
|
import {getRequiredInputError} from '../tests/util.js'
|
||||||
import fs from 'fs'
|
import {run} from './action.js'
|
||||||
import * as utils from './utils'
|
|
||||||
|
vi.mock('fs')
|
||||||
|
vi.mock('./utils.js')
|
||||||
|
|
||||||
describe('Run', () => {
|
describe('Run', () => {
|
||||||
it('throws error without cluster type', async () => {
|
it('throws error without cluster type', async () => {
|
||||||
@ -9,22 +11,23 @@ describe('Run', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('writes kubeconfig and sets context', async () => {
|
it('writes kubeconfig and sets context', async () => {
|
||||||
|
const {getKubeconfig, setContext} = await import('./utils.js')
|
||||||
|
const fs = await import('fs')
|
||||||
const kubeconfig = 'kubeconfig'
|
const kubeconfig = 'kubeconfig'
|
||||||
|
|
||||||
process.env['INPUT_CLUSTER-TYPE'] = 'default'
|
process.env['INPUT_CLUSTER-TYPE'] = 'default'
|
||||||
process.env['RUNNER_TEMP'] = '/sample/path'
|
process.env['RUNNER_TEMP'] = '/sample/path'
|
||||||
|
|
||||||
jest
|
vi.mocked(getKubeconfig).mockResolvedValue(kubeconfig)
|
||||||
.spyOn(utils, 'getKubeconfig')
|
vi.mocked(setContext).mockReturnValue(kubeconfig)
|
||||||
.mockImplementation(async () => kubeconfig)
|
vi.mocked(fs.writeFileSync).mockImplementation(() => {})
|
||||||
jest.spyOn(fs, 'writeFileSync').mockImplementation(() => {})
|
vi.mocked(fs.chmodSync).mockImplementation(() => {})
|
||||||
jest.spyOn(fs, 'chmodSync').mockImplementation(() => {})
|
|
||||||
jest.spyOn(utils, 'setContext').mockImplementation(() => kubeconfig)
|
|
||||||
|
|
||||||
expect(await run())
|
await run()
|
||||||
expect(utils.getKubeconfig).toHaveBeenCalled()
|
|
||||||
|
expect(getKubeconfig).toHaveBeenCalled()
|
||||||
expect(fs.writeFileSync).toHaveBeenCalled()
|
expect(fs.writeFileSync).toHaveBeenCalled()
|
||||||
expect(fs.chmodSync).toHaveBeenCalled()
|
expect(fs.chmodSync).toHaveBeenCalled()
|
||||||
expect(utils.setContext).toHaveBeenCalled()
|
expect(setContext).toHaveBeenCalled()
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import {Cluster, parseCluster} from './types/cluster'
|
import {Cluster, parseCluster} from './types/cluster.js'
|
||||||
import {setContext, getKubeconfig} from './utils'
|
import {setContext, getKubeconfig} from './utils.js'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Kubernetes context based on supplied action inputs
|
* Sets the Kubernetes context based on supplied action inputs
|
||||||
@ -14,7 +14,7 @@ export async function run() {
|
|||||||
required: true
|
required: true
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
const runnerTempDirectory: string = process.env['RUNNER_TEMP']
|
const runnerTempDirectory: string = process.env['RUNNER_TEMP'] ?? ''
|
||||||
const kubeconfigPath: string = path.join(
|
const kubeconfigPath: string = path.join(
|
||||||
runnerTempDirectory,
|
runnerTempDirectory,
|
||||||
`kubeconfig_${Date.now()}`
|
`kubeconfig_${Date.now()}`
|
||||||
|
|||||||
@ -1,8 +1,11 @@
|
|||||||
import * as actions from '@actions/exec'
|
import {vi, describe, test, it, expect, beforeEach} from 'vitest'
|
||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import {getRequiredInputError} from '../../tests/util'
|
import {getRequiredInputError} from '../../tests/util.js'
|
||||||
import {getArcKubeconfig, KUBECONFIG_LOCATION} from './arc'
|
import {getArcKubeconfig, KUBECONFIG_LOCATION} from './arc.js'
|
||||||
import * as az from './azCommands'
|
import * as az from './azCommands.js'
|
||||||
|
|
||||||
|
vi.mock('@actions/io')
|
||||||
|
vi.mock('./azCommands.js')
|
||||||
|
|
||||||
describe('Arc kubeconfig', () => {
|
describe('Arc kubeconfig', () => {
|
||||||
test('it throws error without resource group', async () => {
|
test('it throws error without resource group', async () => {
|
||||||
@ -28,11 +31,11 @@ describe('Arc kubeconfig', () => {
|
|||||||
process.env['INPUT_RESOURCE-GROUP'] = group
|
process.env['INPUT_RESOURCE-GROUP'] = group
|
||||||
process.env['INPUT_CLUSTER-NAME'] = name
|
process.env['INPUT_CLUSTER-NAME'] = name
|
||||||
|
|
||||||
jest.spyOn(io, 'which').mockImplementation(async () => path)
|
vi.mocked(io.which).mockResolvedValue(path)
|
||||||
jest.spyOn(az, 'runAzCliCommand').mockImplementation(async () => {})
|
vi.mocked(az.runAzCliCommand).mockResolvedValue(undefined)
|
||||||
jest
|
vi.mocked(az.runAzKubeconfigCommandBlocking).mockResolvedValue(
|
||||||
.spyOn(az, 'runAzKubeconfigCommandBlocking')
|
kubeconfig
|
||||||
.mockImplementation(async () => kubeconfig)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('throws an error without method', async () => {
|
it('throws an error without method', async () => {
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as io from '@actions/io'
|
import * as io from '@actions/io'
|
||||||
import {Method, parseMethod} from '../types/method'
|
import {Method, parseMethod} from '../types/method.js'
|
||||||
import * as path from 'path'
|
import * as path from 'path'
|
||||||
import {runAzCliCommand, runAzKubeconfigCommandBlocking} from './azCommands'
|
import {runAzCliCommand, runAzKubeconfigCommandBlocking} from './azCommands.js'
|
||||||
|
|
||||||
const RUNNER_TEMP: string = process.env['RUNNER_TEMP'] || ''
|
const RUNNER_TEMP: string = process.env['RUNNER_TEMP'] || ''
|
||||||
export const KUBECONFIG_LOCATION: string = path.join(
|
export const KUBECONFIG_LOCATION: string = path.join(
|
||||||
|
|||||||
@ -1,14 +1,17 @@
|
|||||||
|
import {vi, describe, test, expect, beforeEach} from 'vitest'
|
||||||
import * as actions from '@actions/exec'
|
import * as actions from '@actions/exec'
|
||||||
import {runAzCliCommand} from './azCommands'
|
import {runAzCliCommand} from './azCommands.js'
|
||||||
|
|
||||||
|
vi.mock('@actions/exec')
|
||||||
|
|
||||||
describe('Az commands', () => {
|
describe('Az commands', () => {
|
||||||
test('it runs an az cli command', async () => {
|
test('it runs an az cli command', async () => {
|
||||||
const path = 'path'
|
const path = 'path'
|
||||||
const args = ['args']
|
const args = ['args']
|
||||||
|
|
||||||
jest.spyOn(actions, 'exec').mockImplementation(async () => 0)
|
vi.mocked(actions.exec).mockResolvedValue(0)
|
||||||
|
|
||||||
expect(await runAzCliCommand(path, args))
|
await runAzCliCommand(path, args)
|
||||||
expect(actions.exec).toHaveBeenCalledWith(path, args, {})
|
expect(actions.exec).toHaveBeenCalledWith(path, args, {})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -1,6 +1,5 @@
|
|||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import {ExecOptions} from '@actions/exec/lib/interfaces'
|
import {ExecOptions, exec} from '@actions/exec'
|
||||||
import {exec} from '@actions/exec'
|
|
||||||
import {spawn} from 'child_process'
|
import {spawn} from 'child_process'
|
||||||
|
|
||||||
const AZ_TIMEOUT_SECONDS: number = 120
|
const AZ_TIMEOUT_SECONDS: number = 120
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
|
import {vi, describe, test, expect, beforeEach, afterEach} from 'vitest'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import * as core from '@actions/core'
|
import {getRequiredInputError} from '../../tests/util.js'
|
||||||
import {getRequiredInputError} from '../../tests/util'
|
import {createKubeconfig, getDefaultKubeconfig} from './default.js'
|
||||||
import {createKubeconfig, getDefaultKubeconfig} from './default'
|
|
||||||
|
|
||||||
describe('Default kubeconfig', () => {
|
describe('Default kubeconfig', () => {
|
||||||
test('it creates a kubeconfig with proper format', () => {
|
test('it creates a kubeconfig with proper format', () => {
|
||||||
@ -51,6 +51,11 @@ describe('Default kubeconfig', () => {
|
|||||||
process.env['INPUT_METHOD'] = 'default'
|
process.env['INPUT_METHOD'] = 'default'
|
||||||
})
|
})
|
||||||
|
|
||||||
|
afterEach(() => {
|
||||||
|
delete process.env['INPUT_KUBECONFIG']
|
||||||
|
delete process.env['INPUT_KUBECONFIG-ENCODING']
|
||||||
|
})
|
||||||
|
|
||||||
test('it throws error without kubeconfig', () => {
|
test('it throws error without kubeconfig', () => {
|
||||||
expect(() => getDefaultKubeconfig()).toThrow(
|
expect(() => getDefaultKubeconfig()).toThrow(
|
||||||
getRequiredInputError('kubeconfig')
|
getRequiredInputError('kubeconfig')
|
||||||
@ -66,39 +71,25 @@ describe('Default kubeconfig', () => {
|
|||||||
|
|
||||||
test('returns kubeconfig as plaintext when encoding is plaintext', () => {
|
test('returns kubeconfig as plaintext when encoding is plaintext', () => {
|
||||||
const kc = 'example kc'
|
const kc = 'example kc'
|
||||||
jest.spyOn(core, 'getInput').mockImplementation((name: string) => {
|
process.env['INPUT_KUBECONFIG'] = kc
|
||||||
if (name === 'method') return 'default'
|
process.env['INPUT_KUBECONFIG-ENCODING'] = 'plaintext'
|
||||||
if (name === 'kubeconfig-encoding') return 'plaintext'
|
|
||||||
if (name === 'kubeconfig') return kc
|
|
||||||
return ''
|
|
||||||
})
|
|
||||||
expect(getDefaultKubeconfig()).toBe(kc)
|
expect(getDefaultKubeconfig()).toBe(kc)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('it gets default config through base64 kubeconfig input', () => {
|
test('it gets default config through base64 kubeconfig input', () => {
|
||||||
const kc = 'example kc'
|
const kc = 'example kc'
|
||||||
const base64Kc = Buffer.from(kc, 'utf-8').toString('base64')
|
const base64Kc = Buffer.from(kc, 'utf-8').toString('base64')
|
||||||
|
process.env['INPUT_KUBECONFIG'] = base64Kc
|
||||||
jest.spyOn(core, 'getInput').mockImplementation((name: string) => {
|
process.env['INPUT_KUBECONFIG-ENCODING'] = 'base64'
|
||||||
if (name === 'method') return 'default'
|
|
||||||
if (name === 'kubeconfig-encoding') return 'base64'
|
|
||||||
if (name === 'kubeconfig') return base64Kc
|
|
||||||
return ''
|
|
||||||
})
|
|
||||||
|
|
||||||
expect(getDefaultKubeconfig()).toBe(kc)
|
expect(getDefaultKubeconfig()).toBe(kc)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('it throws error for unknown kubeconfig-encoding', () => {
|
test('it throws error for unknown kubeconfig-encoding', () => {
|
||||||
const kc = 'example kc'
|
const kc = 'example kc'
|
||||||
const unknownEncoding = 'foobar'
|
process.env['INPUT_KUBECONFIG'] = kc
|
||||||
|
process.env['INPUT_KUBECONFIG-ENCODING'] = 'foobar'
|
||||||
jest.spyOn(core, 'getInput').mockImplementation((name: string) => {
|
|
||||||
if (name === 'method') return 'default'
|
|
||||||
if (name === 'kubeconfig-encoding') return unknownEncoding
|
|
||||||
if (name === 'kubeconfig') return kc
|
|
||||||
return ''
|
|
||||||
})
|
|
||||||
|
|
||||||
expect(() => getDefaultKubeconfig()).toThrow(
|
expect(() => getDefaultKubeconfig()).toThrow(
|
||||||
"Invalid kubeconfig-encoding: 'foobar'. Must be 'plaintext' or 'base64'."
|
"Invalid kubeconfig-encoding: 'foobar'. Must be 'plaintext' or 'base64'."
|
||||||
|
|||||||
@ -1,8 +1,8 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as jsyaml from 'js-yaml'
|
import * as jsyaml from 'js-yaml'
|
||||||
import {KubeConfig} from '@kubernetes/client-node'
|
import {KubeConfig} from '@kubernetes/client-node'
|
||||||
import {K8sSecret, parseK8sSecret} from '../types/k8sSecret'
|
import {K8sSecret, parseK8sSecret} from '../types/k8sSecret.js'
|
||||||
import {Method, parseMethod} from '../types/method'
|
import {Method, parseMethod} from '../types/method.js'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the kubeconfig based on provided method for a default Kubernetes cluster
|
* Gets the kubeconfig based on provided method for a default Kubernetes cluster
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
import {run} from './action'
|
import {run} from './action.js'
|
||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
|
|
||||||
// Run the application
|
// Run the application
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
import {Cluster, parseCluster} from './cluster'
|
import {describe, test, expect} from 'vitest'
|
||||||
|
import {Cluster, parseCluster} from './cluster.js'
|
||||||
|
|
||||||
describe('Cluster type', () => {
|
describe('Cluster type', () => {
|
||||||
test('it has required values', () => {
|
test('it has required values', () => {
|
||||||
const vals = <any>Object.values(Cluster)
|
const vals = Object.values(Cluster) as string[]
|
||||||
expect(vals.includes('arc')).toBe(true)
|
expect(vals.includes('arc')).toBe(true)
|
||||||
expect(vals.includes('generic')).toBe(true)
|
expect(vals.includes('generic')).toBe(true)
|
||||||
})
|
})
|
||||||
|
|||||||
@ -8,9 +8,10 @@ export enum Cluster {
|
|||||||
* @param str The cluster type (case insensitive)
|
* @param str The cluster type (case insensitive)
|
||||||
* @returns The Cluster enum or undefined if it can't be parsed
|
* @returns The Cluster enum or undefined if it can't be parsed
|
||||||
*/
|
*/
|
||||||
export const parseCluster = (str: string): Cluster | undefined =>
|
export const parseCluster = (str: string): Cluster | undefined => {
|
||||||
Cluster[
|
const key = Object.keys(Cluster).find(
|
||||||
Object.keys(Cluster).filter(
|
(k) =>
|
||||||
(k) => Cluster[k].toString().toLowerCase() === str.toLowerCase()
|
Cluster[k as keyof typeof Cluster].toLowerCase() === str.toLowerCase()
|
||||||
)[0] as keyof typeof Cluster
|
) as keyof typeof Cluster | undefined
|
||||||
]
|
return key !== undefined ? Cluster[key] : undefined
|
||||||
|
}
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
import {parseK8sSecret, K8sSecret} from './k8sSecret'
|
import {describe, test, expect} from 'vitest'
|
||||||
|
import {parseK8sSecret} from './k8sSecret.js'
|
||||||
|
|
||||||
describe('K8sSecret type', () => {
|
describe('K8sSecret type', () => {
|
||||||
describe('Parsing from any', () => {
|
describe('Parsing from any', () => {
|
||||||
|
|||||||
@ -1,8 +1,9 @@
|
|||||||
import {Method, parseMethod} from './method'
|
import {describe, test, expect} from 'vitest'
|
||||||
|
import {Method, parseMethod} from './method.js'
|
||||||
|
|
||||||
describe('Method type', () => {
|
describe('Method type', () => {
|
||||||
test('it has required values', () => {
|
test('it has required values', () => {
|
||||||
const vals = <any>Object.values(Method)
|
const vals = Object.values(Method) as string[]
|
||||||
expect(vals.includes('kubeconfig')).toBe(true)
|
expect(vals.includes('kubeconfig')).toBe(true)
|
||||||
expect(vals.includes('service-account')).toBe(true)
|
expect(vals.includes('service-account')).toBe(true)
|
||||||
expect(vals.includes('service-principal')).toBe(true)
|
expect(vals.includes('service-principal')).toBe(true)
|
||||||
|
|||||||
@ -9,9 +9,10 @@ export enum Method {
|
|||||||
* @param str The method (case insensitive)
|
* @param str The method (case insensitive)
|
||||||
* @returns The Method enum or undefined if it can't be parsed
|
* @returns The Method enum or undefined if it can't be parsed
|
||||||
*/
|
*/
|
||||||
export const parseMethod = (str: string): Method | undefined =>
|
export const parseMethod = (str: string): Method | undefined => {
|
||||||
Method[
|
const key = Object.keys(Method).find(
|
||||||
Object.keys(Method).filter(
|
(k) =>
|
||||||
(k) => Method[k].toString().toLowerCase() === str.toLowerCase()
|
Method[k as keyof typeof Method].toLowerCase() === str.toLowerCase()
|
||||||
)[0] as keyof typeof Method
|
) as keyof typeof Method | undefined
|
||||||
]
|
return key !== undefined ? Method[key] : undefined
|
||||||
|
}
|
||||||
|
|||||||
@ -1,25 +1,26 @@
|
|||||||
|
import {vi, describe, test, expect} from 'vitest'
|
||||||
import fs from 'fs'
|
import fs from 'fs'
|
||||||
import * as arc from './kubeconfigs/arc'
|
import * as arc from './kubeconfigs/arc.js'
|
||||||
import * as def from './kubeconfigs/default'
|
import * as def from './kubeconfigs/default.js'
|
||||||
import {Cluster} from './types/cluster'
|
import {Cluster} from './types/cluster.js'
|
||||||
import {getKubeconfig, setContext} from './utils'
|
import {getKubeconfig, setContext} from './utils.js'
|
||||||
|
|
||||||
describe('Utils', () => {
|
describe('Utils', () => {
|
||||||
describe('get kubeconfig', () => {
|
describe('get kubeconfig', () => {
|
||||||
test('it gets arc kubeconfig when type is arc', async () => {
|
test('it gets arc kubeconfig when type is arc', async () => {
|
||||||
const arcKubeconfig = 'arckubeconfig'
|
const arcKubeconfig = 'arckubeconfig'
|
||||||
jest
|
vi.spyOn(arc, 'getArcKubeconfig').mockImplementation(
|
||||||
.spyOn(arc, 'getArcKubeconfig')
|
async () => arcKubeconfig
|
||||||
.mockImplementation(async () => arcKubeconfig)
|
)
|
||||||
|
|
||||||
expect(await getKubeconfig(Cluster.ARC)).toBe(arcKubeconfig)
|
expect(await getKubeconfig(Cluster.ARC)).toBe(arcKubeconfig)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('it defaults to default kubeconfig', async () => {
|
test('it defaults to default kubeconfig', async () => {
|
||||||
const defaultKubeconfig = 'arckubeconfig'
|
const defaultKubeconfig = 'arckubeconfig'
|
||||||
jest
|
vi.spyOn(def, 'getDefaultKubeconfig').mockImplementation(
|
||||||
.spyOn(def, 'getDefaultKubeconfig')
|
() => defaultKubeconfig
|
||||||
.mockImplementation(() => defaultKubeconfig)
|
)
|
||||||
|
|
||||||
expect(await getKubeconfig(undefined)).toBe(defaultKubeconfig)
|
expect(await getKubeconfig(undefined)).toBe(defaultKubeconfig)
|
||||||
expect(await getKubeconfig(Cluster.GENERIC)).toBe(defaultKubeconfig)
|
expect(await getKubeconfig(Cluster.GENERIC)).toBe(defaultKubeconfig)
|
||||||
|
|||||||
@ -1,9 +1,9 @@
|
|||||||
import * as core from '@actions/core'
|
import * as core from '@actions/core'
|
||||||
import * as fs from 'fs'
|
import * as fs from 'fs'
|
||||||
import {KubeConfig} from '@kubernetes/client-node'
|
import {KubeConfig} from '@kubernetes/client-node'
|
||||||
import {getDefaultKubeconfig} from './kubeconfigs/default'
|
import {getDefaultKubeconfig} from './kubeconfigs/default.js'
|
||||||
import {getArcKubeconfig} from './kubeconfigs/arc'
|
import {getArcKubeconfig} from './kubeconfigs/arc.js'
|
||||||
import {Cluster} from './types/cluster'
|
import {Cluster} from './types/cluster.js'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the kubeconfig based on Kubernetes cluster type
|
* Gets the kubeconfig based on Kubernetes cluster type
|
||||||
|
|||||||
@ -1,15 +1,14 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
"baseUrl": ".",
|
"target": "ES2020",
|
||||||
"module": "ESNext", // or "NodeNext" depending on your setup
|
"module": "NodeNext",
|
||||||
"moduleResolution": "node",
|
"moduleResolution": "NodeNext",
|
||||||
"esModuleInterop": true,
|
"rootDir": "./src",
|
||||||
"allowSyntheticDefaultImports": true,
|
"outDir": "./lib",
|
||||||
|
"noImplicitAny": false,
|
||||||
"skipLibCheck": true,
|
"skipLibCheck": true,
|
||||||
"paths": {
|
"noEmit": true,
|
||||||
"@actions/core": ["node_modules/@actions/core"],
|
"types": ["node", "vitest/globals"]
|
||||||
"@kubernetes/client-node": ["node_modules/@kubernetes/client-node"]
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"exclude": ["node_modules", "tests", "src/**/*.test.ts"]
|
"exclude": ["node_modules", "**/*.test.ts", "vitest.config.ts", "tests/"]
|
||||||
}
|
}
|
||||||
|
|||||||
10
vitest.config.ts
Normal file
10
vitest.config.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import {defineConfig} from 'vitest/config'
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
test: {
|
||||||
|
globals: true,
|
||||||
|
environment: 'node',
|
||||||
|
include: ['**/*.test.ts'],
|
||||||
|
clearMocks: true
|
||||||
|
}
|
||||||
|
})
|
||||||
Loading…
x
Reference in New Issue
Block a user