update got dependency and convert to esm module (#533)

* update require got to import got

* convert remaining to esm

* wip: replace jest with vitest

* fix test imports and vitest config

* remove dist package.json

* fix import in ent test

* add dist

* move actions/core to prod dependency

* remove unused import that was breaking esm compilation

* simplify imports

* use module.createRequire to import jsonata

* add doc link comment

* add comments on import insanity

* add more comments

* update PR tempalte

* bump got and remove jest deps

* revert debug npm run command

* fix fs import

* simplify vitest config for each test suite
This commit is contained in:
John-Michael Faircloth 2024-03-19 10:42:34 -05:00 committed by GitHub
parent a727ce205a
commit 77efb36ae3
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
39 changed files with 12213 additions and 14317 deletions

View file

@ -1,12 +1,14 @@
// @ts-check
const core = require('@actions/core');
const command = require('@actions/core/lib/command');
const got = require('got').default;
const jsonata = require('jsonata');
const { normalizeOutputKey } = require('./utils');
const { WILDCARD } = require('./constants');
import core from '@actions/core';
import got from 'got';
const { auth: { retrieveToken }, secrets: { getSecrets } } = require('./index');
import { normalizeOutputKey } from './utils.js';
import { WILDCARD } from './constants.js';
import { retrieveToken } from './auth.js';
import { getSecrets } from './secrets.js';
// ncc doesn't compile jsonata imports properly, so we must use our own custom require
import require from "./cjs-require.js";
const jsonata = require('jsonata');
const AUTH_METHODS = ['approle', 'token', 'github', 'jwt', 'kubernetes', 'ldap', 'userpass'];
const ENCODING_TYPES = ['base64', 'hex', 'utf8'];
@ -219,9 +221,8 @@ function parseHeadersInput(inputKey, inputOptions) {
}, new Map());
}
module.exports = {
export {
exportSecrets,
parseSecretsInput,
parseHeadersInput,
};
}

View file

@ -1,17 +1,17 @@
jest.mock('got');
jest.mock('@actions/core');
jest.mock('@actions/core/lib/command');
import { vi, describe, test, expect } from 'vitest';
const command = require('@actions/core/lib/command');
const core = require('@actions/core');
const got = require('got');
const {
vi.mock('got');
vi.mock('@actions/core');
import core from '@actions/core';
import got from 'got';
import {
exportSecrets,
parseSecretsInput,
parseHeadersInput
} = require('./action');
} from './action.js';
const { when } = require('jest-when');
import { when } from 'jest-when'
describe('parseSecretsInput', () => {
it('parses simple secret', () => {
@ -132,7 +132,7 @@ describe('parseHeaders', () => {
describe('exportSecrets', () => {
beforeEach(() => {
jest.resetAllMocks();
vi.resetAllMocks();
when(core.getInput)
.calledWith('url', expect.anything())

View file

@ -1,8 +1,8 @@
// @ts-check
const core = require('@actions/core');
const rsasign = require('jsrsasign');
const fs = require('fs');
const { default: got } = require('got');
import core from '@actions/core';
import * as fs from 'fs';
import got from 'got';
import rsasign from 'jsrsasign';
const defaultKubernetesTokenPath = '/var/run/secrets/kubernetes.io/serviceaccount/token'
/***
@ -154,6 +154,6 @@ async function getClientToken(client, method, path, payload) {
* }} auth
*/
module.exports = {
export {
retrieveToken,
};

View file

@ -1,22 +1,20 @@
jest.mock('got');
jest.mock('@actions/core');
jest.mock('@actions/core/lib/command');
jest.mock('fs', () => ({
stat: jest.fn().mockResolvedValue(null),
import { vi, describe, test, expect } from 'vitest';
vi.mock('got');
vi.mock('@actions/core');
vi.mock('fs', () => ({
stat: vi.fn().mockResolvedValue(null),
promises: {
access: jest.fn().mockResolvedValue(null),
access: vi.fn().mockResolvedValue(null),
}
}));
const core = require('@actions/core');
const got = require('got');
const fs = require("fs")
const { when } = require('jest-when');
import core from '@actions/core';
import got from 'got'
import * as fs from 'fs';
import { when } from 'jest-when'
const {
retrieveToken
} = require('./auth');
import { retrieveToken } from './auth.js';
function mockInput(name, key) {
@ -27,7 +25,7 @@ function mockInput(name, key) {
function mockApiResponse() {
const response = { body: { auth: { client_token: testToken, renewable: true, policies: [], accessor: "accessor" } } }
got.post = jest.fn()
got.post = vi.fn()
got.post.mockReturnValue(response)
}
const testToken = "testoken";
@ -35,7 +33,7 @@ const testToken = "testoken";
describe("test retrival for token", () => {
beforeEach(() => {
jest.resetAllMocks();
vi.resetAllMocks();
});
it("test retrival with approle", async () => {
@ -76,7 +74,7 @@ describe("test retrival for token", () => {
mockInput("kubernetesTokenPath", testTokenPath)
mockInput("role", testRole)
mockInput("path", testPath)
fs.readFileSync = jest.fn()
fs.readFileSync = vi.fn()
fs.readFileSync.mockReturnValueOnce(jwtToken)
const token = await retrieveToken(method, got)
expect(token).toEqual(testToken)

7
src/cjs-require.js Normal file
View file

@ -0,0 +1,7 @@
// This allows us to use `require` in our ECMAScript module
// See: https://github.com/vercel/ncc/issues/791
// https://nodejs.org/api/module.html#modulecreaterequirefilename
import { createRequire } from "module";
const require = createRequire(import.meta.url);
export default require;

View file

@ -1,5 +1,5 @@
const WILDCARD = '*';
module.exports = {
export {
WILDCARD
};
};

View file

@ -1,5 +1,5 @@
const core = require('@actions/core');
const { exportSecrets } = require('./action');
import core from '@actions/core';
import { exportSecrets } from './action.js';
(async () => {
try {

View file

@ -1,7 +1,7 @@
const auth = require('./auth');
const secrets = require('./secrets');
import auth from './auth.js';
import secrets from './secrets.js';
module.exports = {
export default {
auth,
secrets
};
};

View file

@ -1,17 +1,19 @@
jest.mock('@actions/core');
import { vi, describe, test, expect } from 'vitest';
const core = require('@actions/core');
const ServerMock = require("mock-http-server");
const { exportSecrets } = require("./action");
const { when } = require('jest-when');
vi.mock('@actions/core');
import core from '@actions/core';
import ServerMock from 'mock-http-server';
import { exportSecrets } from './action.js';
import { when } from 'jest-when';
describe('exportSecrets retries', () => {
var server = new ServerMock({ host: "127.0.0.1", port: 0 });
var calls = 0;
beforeEach((done) => {
beforeEach(() => new Promise(done => {
calls = 0;
jest.resetAllMocks();
vi.resetAllMocks();
when(core.getInput)
.calledWith('token', expect.anything())
@ -28,11 +30,11 @@ describe('exportSecrets retries', () => {
.mockReturnValueOnce('http://127.0.0.1:' + server.getHttpPort());
done();
});
});
}));
afterEach((done) => {
afterEach(() => new Promise(done => {
server.stop(done);
});
}));
function mockStatusCodes(statusCodes) {
server.on({
@ -51,19 +53,19 @@ describe('exportSecrets retries', () => {
});
}
it('retries on 412 status code', (done) => {
it('retries on 412 status code', () => new Promise(done => {
mockStatusCodes([412, 200])
exportSecrets().then(() => {
expect(calls).toEqual(2);
done();
});
});
}));
it('retries on 500 status code', (done) => {
it('retries on 500 status code', () => new Promise(done => {
mockStatusCodes([500, 200])
exportSecrets().then(() => {
expect(calls).toEqual(2);
done();
});
});
}));
});

View file

@ -1,7 +1,11 @@
const jsonata = require("jsonata");
const { WILDCARD } = require("./constants");
const { normalizeOutputKey } = require("./utils");
const core = require('@actions/core');
import core from '@actions/core';
import { WILDCARD } from './constants.js';
import { normalizeOutputKey } from './utils.js';
// ncc doesn't compile jsonata imports properly, so we must use our own custom require
import require from "./cjs-require.js";
const jsonata = require('jsonata');
/**
* @typedef {Object} SecretRequest
@ -44,7 +48,7 @@ async function getSecrets(secretRequests, client, ignoreNotFound) {
} catch (error) {
const {response} = error;
if (response?.statusCode === 404) {
notFoundMsg = `Unable to retrieve result for "${path}" because it was not found: ${response.body.trim()}`;
let notFoundMsg = `Unable to retrieve result for "${path}" because it was not found: ${response.body.trim()}`;
const ignoreNotFound = (core.getInput('ignoreNotFound', { required: false }) || 'false').toLowerCase() != 'false';
if (ignoreNotFound) {
core.error(`${notFoundMsg}`);
@ -165,7 +169,7 @@ const selectAndAppendResults = async (
];
};
module.exports = {
export {
getSecrets,
selectData
}

View file

@ -14,6 +14,6 @@ function normalizeOutputKey(dataKey, isEnvVar = false) {
return outputKey;
}
module.exports = {
normalizeOutputKey
export {
normalizeOutputKey
};