spiegel-keyman/developer/js/source/kmlmi.ts
Marc Durdin 65c8c89be5 chore(web): adapts keyman-version bundling in Developer products
As KEYMAN-VERSION changed from being a type to a class, this broke the
bundling and referencing strategies in Developer/Server and
Developer/kmlmc. This updates the bundling process and fixes the
references in both projects.

Note that keyman-version no longer depends on gosh. Given we are
currently manually calling the build for this in all projects (or should
be!), it's better that we keep the build of this explicit for now.

If we want to restore the postinstall/postci steps in the future, the
gosh dependency would need to be manually removed from package.json in
order for the bundling builds to work for Developer/Server and
Developer/kmlmc.
2022-05-28 10:57:24 +10:00

73 lines
3 KiB
JavaScript

#!/usr/bin/env node
/**
* kmlmi - Keyman Lexical Model model_info Compiler
*/
import * as program from 'commander';
import * as fs from 'fs';
import * as path from 'path';
import KmpCompiler from './package-compiler/kmp-compiler';
import { ModelInfoOptions as ModelInfoOptions, writeMergedModelMetadataFile } from './model-info-compiler/model-info-compiler';
import { SysExits } from './util/sysexits';
const KEYMAN_VERSION = require("@keymanapp/keyman-version").KEYMAN_VERSION;
let inputFilename: string;
/* Arguments */
program
.description('Merges Keyman lexical model model_info files. Intended for use within the keymanapp/lexical-models repository.')
.version(KEYMAN_VERSION.VERSION_WITH_TAG)
.arguments('<infile>')
.action(infile => inputFilename = infile)
.option('-o, --outFile <filename>', 'where to save the resultant file')
.option('-m, --model <model_id>', 'model id, defaults to basename of input file sans .model_info extension')
.option('-s, --source <source>', 'path to source of model, relative to lexical-models repo root')
.option('--kpsFilename <kpsFilename>', 'path to .model.kps file, defaults to source/<model_id>.model.kps')
.option('--kmpFilename <kmpFilename>', 'path to .model.kmp file, defaults to build/<model_id>.model.kmp')
.option('--jsFilename <jsFilename>', 'path to .model.js file, defaults to build/<model_id>.model.js');
program.parse(process.argv);
// Deal with input arguments:
if (!inputFilename) {
exitDueToUsageError('Must provide a lexical model .model_info source file.');
}
let model_id: string = program.model ? program.model : path.basename(inputFilename).replace(/\.model_info$/, "");
let outputFilename: string = program.outFile ? program.outFile : path.join(path.dirname(inputFilename), 'build', path.basename(inputFilename));
let kpsFilename = program.kpsFilename ? program.kpsFilename : path.join(path.dirname(inputFilename), 'source', path.basename(inputFilename).replace(/\.model_info$/, '.model.kps'));
let kmpFilename = program.kmpFilename ? program.kmpFilename : path.join(path.dirname(inputFilename), 'build', path.basename(inputFilename).replace(/\.model_info$/, '.model.kmp'));
let jsFilename = program.jsFilename ? program.jsFilename : path.join(path.dirname(inputFilename), 'build', path.basename(inputFilename).replace(/\.model_info$/, '.model.js'));
//
// Load .kps source data
//
let kpsString: string = fs.readFileSync(kpsFilename, 'utf8');
let kmpCompiler = new KmpCompiler();
let kmpJsonData = kmpCompiler.transformKpsToKmpObject(kpsString);
//
// Write out the merged .model_info file
//
let modelInfoOptions: ModelInfoOptions = {
model_id: model_id,
kmpJsonData: kmpJsonData,
sourcePath: program.source,
modelFileName: jsFilename,
kmpFileName: kmpFilename
};
writeMergedModelMetadataFile(
inputFilename,
outputFilename,
modelInfoOptions);
function exitDueToUsageError(message: string): never {
console.error(`${program._name}: ${message}`);
console.error();
program.outputHelp();
return process.exit(SysExits.EX_USAGE);
}