@sap/cds-dk
Version:
Command line client and development toolkit for the SAP Cloud Application Programming Model
60 lines (53 loc) • 2.27 kB
JavaScript
const os = require('os')
const cds = require('../../../cds')
const { exists, copy, rimraf, fs:{promises:{ mkdtemp }}, path } = cds.utils, { join } = path
const cmd = require('../../../util/command')
const mvn = require('../../mvn')
const { merge } = require('../../merge')
const { bold, info } = require('../../../util/term')
const { URLS, OPTIONS: { NODEJS, JAVA } } = require('../../constants')
const { options } = cds.cli
module.exports = class JavaTemplate extends require('../../plugin') {
static help() {
return 'creates a Java-based project'
}
static hasInProduction() {
return exists('pom.xml')
}
async canRun() {
if (options.add?.has(NODEJS)) {
throw `only one runtime per project is supported – specify either ${bold(JAVA)} or ${bold(NODEJS)}`
}
return true
}
async run() {
const projectName = path.basename(cds.root)
const { params, artifactId, archetypeVersion } = await mvn.init(projectName)
console.log(`using Maven archetype version ${archetypeVersion}`)
const temp = await mkdtemp(join(os.tmpdir(), `${path.basename(cds.root)}_`))
// preserve existing package.json (if any)
let preservedPackageJsonPath
if (exists('package.json')) {
preservedPackageJsonPath = join(temp, 'package.json')
await copy('package.json').to(preservedPackageJsonPath)
}
try {
await cmd.spawnCommand('mvn', params, { cwd: temp })
await copy(join(temp, artifactId)).to(cds.root)
if (preservedPackageJsonPath) {
// merge template package.json into preserved one
// (not the other way around)
// to give preserved values precedence
await merge('package.json').into(preservedPackageJsonPath)
await copy(preservedPackageJsonPath).to('package.json')
}
} catch (err) {
if (err.code === 'ENOENT' && err.path === 'mvn') {
throw `Maven executable 'mvn' not found. Follow ${info(URLS.MAVEN_INSTALL_HELP)} and install Maven on your machine.`
}
throw err
} finally {
await rimraf(temp)
}
}
}