langium-cli
Version:
CLI for Langium - the language engineering tool
68 lines (59 loc) • 2.65 kB
text/typescript
/******************************************************************************
* Copyright 2021 TypeFox GmbH
* This program and the accompanying materials are made available under the
* terms of the MIT License, which is available in the project root.
******************************************************************************/
import fs from 'fs-extra';
import * as path from 'node:path';
import * as url from 'node:url';
import * as readline from 'node:readline';
import { type Generated, expandToNode } from 'langium/generate';
// This is a replacement for `__dirname`
function getDirname(): string {
return url.fileURLToPath(new URL('.', import.meta.url));
}
function getLangiumCliVersion(): string {
const ownPackagePath = path.resolve(getDirname(), '..', '..', 'package.json');
const pack = fs.readJsonSync(ownPackagePath, { encoding: 'utf-8' });
return pack.version;
}
function getGeneratedHeader(): Generated {
return expandToNode`
/******************************************************************************
* This file was generated by langium-cli ${cliVersion}.
* DO NOT EDIT MANUALLY!
******************************************************************************/
`;
}
export function getUserInput(text: string): Promise<string> {
return new Promise(resolve => {
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
rl.question(text, answer => {
resolve(answer);
rl.close();
});
});
}
export async function getUserChoice<R extends string>(text: string, values: R[], defaultValue: R, lowerCase = true): Promise<R> {
const prompt = text + ' ' + values.map(v => v === defaultValue ? `[${v}]` : v).join('/') + ': ';
const answer = await getUserInput(prompt);
if (!answer) {
return defaultValue;
}
const lcAnswer = lowerCase ? answer.toLowerCase() : answer;
for (const value of values) {
if (value.startsWith(lcAnswer)) {
return value;
}
}
return defaultValue;
}
export const cliVersion = getLangiumCliVersion();
export const generatedHeader = getGeneratedHeader();
export const schema = fs.readJson(path.resolve(getDirname(), '../../langium-config-schema.json'), { encoding: 'utf-8' });
let start = process.hrtime();
export function elapsedTime(): string {
const elapsed = process.hrtime(start)[1] / 1000000; // divide by a million to get nano to milli
start = process.hrtime(); // reset the timer
return elapsed.toFixed();
}