gen-jhipster
Version:
Spring Boot + Angular/React/Vue in one handy generator
71 lines (70 loc) • 3.27 kB
JavaScript
import { createHash } from 'node:crypto';
import { readFileSync } from 'node:fs';
import { join } from 'node:path';
import { RECOMMENDED_JAVA_VERSION, RECOMMENDED_NODE_VERSION } from '../../generators/index.js';
import { getSourceRoot } from '../index.js';
import { JAVA_COMPATIBLE_VERSIONS, JAVA_VERSION, NODE_VERSION } from '../../generators/generator-constants.js';
const knwonGitHubMatrixProperties = [
'os',
'node-version',
'java-version',
'default-environment',
'job-name',
'sample',
'samples-group',
'sample-type',
'args',
'jwt-secret',
'jdl',
];
export const getUnknownGitHubMatrixProperties = (matrix) => Object.keys(matrix).filter(key => !knwonGitHubMatrixProperties.includes(key));
export const getUnknownGitHubMatrixGroupProperties = (matrixRecord) => {
let unknownProperties = [];
for (const matrix of Object.values(matrixRecord)) {
unknownProperties = [...new Set([...unknownProperties, ...getUnknownGitHubMatrixProperties(matrix)])];
}
return unknownProperties;
};
const NPM_VERSION = JSON.parse(readFileSync(join(getSourceRoot(), 'generators/common/resources/package.json'), 'utf-8')).devDependencies
.npm;
export const defaultGithubEnvironment = {
os: 'ubuntu-latest',
'node-version': RECOMMENDED_NODE_VERSION,
'java-version': RECOMMENDED_JAVA_VERSION,
'npm-version': NPM_VERSION,
'default-environment': 'prod',
'jwt-secret-key': 'ZjY4MTM4YjI5YzMwZjhjYjI2OTNkNTRjMWQ5Y2Q0Y2YwOWNmZTE2NzRmYzU3NTMwM2NjOTE3MTllOTM3MWRkMzcyYTljMjVmNmQ0Y2MxOTUzODc0MDhhMTlkMDIxMzI2YzQzZDM2ZDE3MmQ3NjVkODk3OTVmYzljYTQyZDNmMTQ=',
};
const randomReproducibleValue = (seed, choices, options) => {
const { useVersionPlaceholders } = options ?? {};
const index = createHash('shake256', { outputLength: 1 }).update(seed, 'utf8').digest('binary').charCodeAt(0) % choices.length;
if (useVersionPlaceholders) {
return `[${index}]`;
}
return choices[index];
};
const randomEnvironmentMatrix = (key, options) => {
const { useVersionPlaceholders, javaVersions = [JAVA_VERSION, ...JAVA_COMPATIBLE_VERSIONS], nodeVersions = [NODE_VERSION, '18', '20'], } = options;
const javaVersion = randomReproducibleValue(`java-${key}`, javaVersions, { useVersionPlaceholders });
const nodeVersion = randomReproducibleValue(`node-${key}`, nodeVersions, { useVersionPlaceholders });
return {
'job-name': `${key} (n${nodeVersion}/j${javaVersion})`,
'java-version': javaVersion,
'node-version': nodeVersion,
};
};
export const convertToGitHubMatrix = (matrix, options) => {
const { randomEnvironment, useVersionPlaceholders, ...randomEnvironmentOptions } = options ?? {};
return {
include: Object.entries(matrix)
.filter(([_key, value]) => !value.disabled)
.map(([key, value]) => ({
'job-name': key,
sample: key,
...defaultGithubEnvironment,
...(useVersionPlaceholders ? { 'java-version': 'JAVA-VERSION', 'node-version': 'NODE-VERSION', 'npm-version': 'NPM-VERSION' } : {}),
...value,
...(randomEnvironment ? randomEnvironmentMatrix(key, { useVersionPlaceholders, ...randomEnvironmentOptions }) : {}),
})),
};
};