@keymanapp/kmc
Version:
Keyman Developer compiler command line tools
52 lines • 2.6 kB
JavaScript
import * as path from 'path';
import * as fs from 'fs';
import { KeymanFileTypes } from "@keymanapp/common-types";
import { KeymanDeveloperProject, KPJFileReader } from "@keymanapp/developer-utils";
import { InfrastructureMessages } from "../messages/infrastructureMessages.js";
export const isProject = (filename) => fs.existsSync(filename) && (fs.statSync(filename).isDirectory() ||
KeymanFileTypes.sourceTypeFromFilename(filename) == ".kpj" /* KeymanFileTypes.Source.Project */);
export async function loadProject(infile, callbacks) {
infile = path.resolve(infile.replace(/\\/g, '/'));
if (fs.existsSync(infile) && fs.statSync(infile).isDirectory()) {
// This is a project folder, look for folder-name.kpj
infile = path.join(infile, path.basename(infile) + ".kpj" /* KeymanFileTypes.Source.Project */);
}
// infile should be the .kpj
if (!infile.endsWith(".kpj" /* KeymanFileTypes.Source.Project */)) {
callbacks.reportMessage(InfrastructureMessages.Error_NotAProjectFile({ filename: infile }));
return null;
}
const project = callbacks.fs.existsSync(infile) ?
await loadProjectFromFile(infile, callbacks) :
await loadDefaultProjectFromFolder(infile, callbacks);
return project;
}
async function loadDefaultProjectFromFolder(infile, callbacks) {
// The folder does not contain a .kpj, so construct a default 2.0 .kpj
const project = new KeymanDeveloperProject(infile, '2.0', callbacks);
if (!await project.populateFiles()) {
callbacks.reportMessage(InfrastructureMessages.Error_InvalidProjectFolder({ folderName: path.dirname(infile) }));
return null;
}
return project;
}
async function loadProjectFromFile(infile, callbacks) {
const kpjData = await callbacks.fsAsync.readFile(infile);
const reader = new KPJFileReader(callbacks);
let kpj = null;
try {
kpj = reader.read(kpjData);
if (kpj.KeymanDeveloperProject?.Options?.Version && kpj.KeymanDeveloperProject.Options.Version != "1.0" && kpj.KeymanDeveloperProject.Options.Version != "2.0") {
callbacks.reportMessage(InfrastructureMessages.Error_UnsupportedProjectVersion({ version: kpj.KeymanDeveloperProject.Options.Version }));
return null;
}
reader.validate(kpj);
}
catch (e) {
callbacks.reportMessage(InfrastructureMessages.Error_InvalidProjectFile({ message: (e ?? '').toString() }));
return null;
}
const project = await reader.transform(infile, kpj);
return project;
}
//# sourceMappingURL=projectLoader.js.map