chore(developer): move package formats to common/web/types

Package file interfaces were stored in developer/kmc-package but belong
better now in common/web/types.
This commit is contained in:
Marc Durdin 2023-05-09 15:48:50 +07:00
parent 3b1c484538
commit 53ccdbe241
6 changed files with 31 additions and 31 deletions

View file

@ -29,4 +29,8 @@ export * as KPJ from './kpj/kpj-file.js';
export { KPJFileReader } from './kpj/kpj-file-reader.js';
export { KeymanDeveloperProject } from './kpj/keyman-developer-project.js';
export * as util from './util/util.js';
export * as KpsFile from './package/kps-file.js';
export * as KmpJsonFile from './package/kmp-json-file.js';
export * as util from './util/util.js';

View file

@ -2,13 +2,9 @@ import * as xml2js from 'xml2js';
import JSZip from 'jszip';
import KEYMAN_VERSION from "@keymanapp/keyman-version";
import type { KpsFile, KpsFileContentFile, KpsFileInfo, KpsFileKeyboard, KpsFileLanguage, KpsFileLexicalModel, KpsFileOptions, KpsPackage } from './kps-file.js';
import type { KmpJsonFile, KmpJsonFileInfo, KmpJsonFileLanguage, KmpJsonFileOptions } from './kmp-json-file.js';
import { CompilerCallbacks, KvkFile } from '@keymanapp/common-types';
import { CompilerMessages } from './messages.js';
import { KMX, KmxFileReader } from '@keymanapp/common-types';
export { type KmpJsonFile } from './kmp-json-file.js';
import { KmpJsonFile, KpsFile, KMX, KmxFileReader } from '@keymanapp/common-types';
const FILEVERSION_KMP_JSON = '12.0';
@ -17,21 +13,21 @@ export default class KmpCompiler {
constructor(private callbacks: CompilerCallbacks) {
}
public transformKpsToKmpObject(kpsFilename: string): KmpJsonFile {
public transformKpsToKmpObject(kpsFilename: string): KmpJsonFile.KmpJsonFile {
// Load the KPS data from XML as JS structured data.
const data = this.callbacks.fs.readFileSync(kpsFilename, 'utf-8');
const kpsPackage = (() => {
let a: KpsPackage;
let a: KpsFile.KpsPackage;
let parser = new xml2js.Parser({
tagNameProcessors: [xml2js.processors.firstCharLowerCase],
explicitArray: false
});
parser.parseString(data, (e: unknown, r: unknown) => { a = r as KpsPackage });
parser.parseString(data, (e: unknown, r: unknown) => { a = r as KpsFile.KpsPackage });
return a;
})();
let kps: KpsFile = kpsPackage.package;
let kps: KpsFile.KpsFile = kpsPackage.package;
//
// To convert to kmp.json, we need to:
@ -46,7 +42,7 @@ export default class KmpCompiler {
// Start to construct the kmp.json file from the .kps file
let kmp: KmpJsonFile = {
let kmp: KmpJsonFile.KmpJsonFile = {
system: {
fileVersion: FILEVERSION_KMP_JSON,
keymanDeveloperVersion: KEYMAN_VERSION.VERSION
@ -58,7 +54,7 @@ export default class KmpCompiler {
// Fill in additional fields
//
let keys: [keyof KpsFileOptions, keyof KmpJsonFileOptions][] = [
let keys: [keyof KpsFile.KpsFileOptions, keyof KmpJsonFile.KmpJsonFileOptions][] = [
['executeProgram','executeProgram'],
['graphicFile', 'graphicFile'],
['msiFileName','msiFilename'],
@ -86,7 +82,7 @@ export default class KmpCompiler {
//
if(kps.files && kps.files.file) {
kmp.files = this.arrayWrap(kps.files.file).map((file: KpsFileContentFile) => {
kmp.files = this.arrayWrap(kps.files.file).map((file: KpsFile.KpsFileContentFile) => {
return {
name: file.name,
description: file.description,
@ -108,14 +104,14 @@ export default class KmpCompiler {
//
if(kps.keyboards && kps.keyboards.keyboard) {
kmp.keyboards = this.arrayWrap(kps.keyboards.keyboard).map((keyboard: KpsFileKeyboard) => {
kmp.keyboards = this.arrayWrap(kps.keyboards.keyboard).map((keyboard: KpsFile.KpsFileKeyboard) => {
return {
displayFont: keyboard.displayFont ? this.callbacks.path.basename(keyboard.displayFont) : undefined,
oskFont: keyboard.oSKFont ? this.callbacks.path.basename(keyboard.oSKFont) : undefined,
name:keyboard.name,
id:keyboard.iD,
version:keyboard.version,
languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(keyboard.languages.language) as KpsFileLanguage[])
languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(keyboard.languages.language) as KpsFile.KpsFileLanguage[])
};
});
}
@ -125,8 +121,8 @@ export default class KmpCompiler {
//
if(kps.lexicalModels && kps.lexicalModels.lexicalModel) {
kmp.lexicalModels = this.arrayWrap(kps.lexicalModels.lexicalModel).map((model: KpsFileLexicalModel) => {
return { name:model.name, id:model.iD, languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(model.languages.language) as KpsFileLanguage[]) }
kmp.lexicalModels = this.arrayWrap(kps.lexicalModels.lexicalModel).map((model: KpsFile.KpsFileLexicalModel) => {
return { name:model.name, id:model.iD, languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(model.languages.language) as KpsFile.KpsFileLanguage[]) }
});
}
@ -160,17 +156,17 @@ export default class KmpCompiler {
kmp.strings = this.arrayWrap(kps.strings.string);
}
kmp = this.stripUndefined(kmp) as KmpJsonFile;
kmp = this.stripUndefined(kmp) as KmpJsonFile.KmpJsonFile;
return kmp;
}
// Helper functions
private kpsInfoToKmpInfo(info: KpsFileInfo): KmpJsonFileInfo {
let ni: KmpJsonFileInfo = {};
private kpsInfoToKmpInfo(info: KpsFile.KpsFileInfo): KmpJsonFile.KmpJsonFileInfo {
let ni: KmpJsonFile.KmpJsonFileInfo = {};
const keys: [(keyof KpsFileInfo), (keyof KmpJsonFileInfo)][] = [
const keys: [(keyof KpsFile.KpsFileInfo), (keyof KmpJsonFile.KmpJsonFileInfo)][] = [
['author','author'],
['copyright','copyright'],
['name','name'],
@ -195,11 +191,11 @@ export default class KmpCompiler {
return [a];
};
private kpsLanguagesToKmpLanguages(language: KpsFileLanguage[]): KmpJsonFileLanguage[] {
private kpsLanguagesToKmpLanguages(language: KpsFile.KpsFileLanguage[]): KmpJsonFile.KmpJsonFileLanguage[] {
return language.map((element) => { return { name: element._, id: element.$.ID } });
};
private extractKeyboardVersionFromKmx(kpsFilename: string, kmp: KmpJsonFile) {
private extractKeyboardVersionFromKmx(kpsFilename: string, kmp: KmpJsonFile.KmpJsonFile) {
// The DEFAULT_VERSION used to be '1.0', but we now use '0.0' to allow
// pre-release 0.x keyboards to be considered later than a keyboard without
// any version metadata at all.
@ -278,13 +274,13 @@ export default class KmpCompiler {
* @param kpsFilename - Filename of the kps, not read, used only for calculating relative paths
* @param kmpJsonData - The kmp.json Object
*/
public buildKmpFile(kpsFilename: string, kmpJsonData: KmpJsonFile): Promise<string> {
public buildKmpFile(kpsFilename: string, kmpJsonData: KmpJsonFile.KmpJsonFile): Promise<string> {
const zip = JSZip();
const kmpJsonFileName = 'kmp.json';
// Make a copy of kmpJsonData, as we mutate paths for writing
const data: KmpJsonFile = JSON.parse(JSON.stringify(kmpJsonData));
const data: KmpJsonFile.KmpJsonFile = JSON.parse(JSON.stringify(kmpJsonData));
if(!data.files) {
data.files = [];
}

View file

@ -6,7 +6,7 @@ import KmpCompiler from '../src/kmp-compiler.js';
import {makePathToFixture} from './helpers/index.js';
import JSZip from 'jszip';
import KEYMAN_VERSION from "@keymanapp/keyman-version";
import { type KmpJsonFile } from '../src/kmp-json-file.js';
import { KmpJsonFile } from '@keymanapp/common-types';
import { TestCompilerCallbacks } from '@keymanapp/developer-test-helpers';
import { CompilerMessages } from '../src/messages.js';
@ -37,7 +37,7 @@ describe('KmpCompiler', function () {
// Test just the transform from kps to kmp.json
//
it(`should transform ${modelID}.model.kps to kmp.json`, function () {
let kmpJson: KmpJsonFile;
let kmpJson: KmpJsonFile.KmpJsonFile;
assert.doesNotThrow(() => {
kmpJson = kmpCompiler.transformKpsToKmpObject(kpsPath);
@ -56,7 +56,7 @@ describe('KmpCompiler', function () {
it(`should build a full .kmp for ${modelID}`, async function() {
const zip = JSZip();
// Build kmp.json in memory
const kmpJson: KmpJsonFile = kmpCompiler.transformKpsToKmpObject(kpsPath);
const kmpJson: KmpJsonFile.KmpJsonFile = kmpCompiler.transformKpsToKmpObject(kpsPath);
// Build file.kmp in memory
const promise = kmpCompiler.buildKmpFile(kpsPath, kmpJson);
promise.then(data => {
@ -86,7 +86,7 @@ describe('KmpCompiler', function () {
const kmpJsonRefPath = makePathToFixture('khmer_angkor', 'ref', 'kmp.json');
const kmpCompiler = new KmpCompiler(callbacks);
const kmpJsonFixture: KmpJsonFile = JSON.parse(fs.readFileSync(kmpJsonRefPath, 'utf-8'));
const kmpJsonFixture: KmpJsonFile.KmpJsonFile = JSON.parse(fs.readFileSync(kmpJsonRefPath, 'utf-8'));
// We override the fixture version so that we can compare with the compiler output
kmpJsonFixture.system.keymanDeveloperVersion = KEYMAN_VERSION.VERSION;
@ -131,7 +131,7 @@ describe('KmpCompiler', function () {
const kpsPath = makePathToFixture('absolute_path', 'source', 'absolute_path.kps');
const kmpCompiler = new KmpCompiler(callbacks);
let kmpJson: KmpJsonFile = null;
let kmpJson: KmpJsonFile.KmpJsonFile = null;
assert.doesNotThrow(() => {
kmpJson = kmpCompiler.transformKpsToKmpObject(kpsPath);

View file

@ -7,7 +7,7 @@
"allowSyntheticDefaultImports": true, // for jszip
},
"include": [
"src/**/*.ts"
"src/**/*.ts",
],
"references": [
{ "path": "../../../common/web/keyman-version/tsconfig.esm.json" },