|
| 1 | +import { basename, dirname } from "path"; |
| 2 | +import { exec } from "child_process"; |
| 3 | +import { readdir } from "fs/promises"; |
| 4 | +import { join } from "path"; |
| 5 | + |
| 6 | +type CommandResult = { |
| 7 | + code: number | null; |
| 8 | + output: string; |
| 9 | +}; |
| 10 | + |
| 11 | +function runCommand(command: string, workingDirectory: string): Promise<CommandResult> { |
| 12 | + return new Promise(resolve => { |
| 13 | + exec(command, { cwd: workingDirectory }, (error, stdout, stderr) => { |
| 14 | + const output = `${stdout}${stderr}`.trim(); |
| 15 | + resolve({ code: error ? (error as unknown as { code?: number }).code ?? 1 : 0, output }); |
| 16 | + }); |
| 17 | + }); |
| 18 | +} |
| 19 | + |
| 20 | +function dockerMxCommand(mendixVersion: string, projectFile: string, mxArguments: string): string { |
| 21 | + return ( |
| 22 | + `docker run -t -v ${dirname(projectFile)}:/source --rm mxbuild:${mendixVersion} ` + |
| 23 | + `bash -c "mx ${mxArguments.replace("{project}", `/source/${basename(projectFile)}`)}"` |
| 24 | + ); |
| 25 | +} |
| 26 | + |
| 27 | +async function findProjectFile(projectDir: string): Promise<string> { |
| 28 | + const entries = await readdir(projectDir, { withFileTypes: true }); |
| 29 | + const projectFile = entries.find(entry => entry.isFile() && entry.name.endsWith(".mpr")); |
| 30 | + if (!projectFile) { |
| 31 | + throw new Error(`No .mpr file found in ${projectDir}`); |
| 32 | + } |
| 33 | + return join(projectDir, projectFile.name); |
| 34 | +} |
| 35 | + |
| 36 | +export async function setModuleVersion( |
| 37 | + projectDir: string, |
| 38 | + moduleName: string, |
| 39 | + version: string, |
| 40 | + mendixVersion: string |
| 41 | +): Promise<void> { |
| 42 | + if (!/^\d+\.\d+\.\d+$/.test(version ?? "")) { |
| 43 | + throw new Error(`Cannot set module version: "${version}" is not a SemVer major.minor.patch version`); |
| 44 | + } |
| 45 | + const projectFile = await findProjectFile(projectDir); |
| 46 | + |
| 47 | + const command = dockerMxCommand( |
| 48 | + mendixVersion, |
| 49 | + projectFile, |
| 50 | + `set-module-version {project} ${moduleName} ${version}` |
| 51 | + ); |
| 52 | + const { code, output } = await runCommand(command, dirname(projectFile)); |
| 53 | + if (code === 0) { |
| 54 | + console.log(`Set module "${moduleName}" version to ${version} via mx set-module-version.`); |
| 55 | + } else { |
| 56 | + throw new Error( |
| 57 | + `Failed to set version ${version} of module "${moduleName}" in ${projectFile}. Error: ${output || "<none>"}` |
| 58 | + ); |
| 59 | + } |
| 60 | +} |
0 commit comments