@keymanapp/kmc-package 17.0.85-alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/.nyc_output/coverage-4892-1681239251006-0.json +1 -0
  2. package/Makefile +38 -0
  3. package/build/src/kmp-compiler.d.ts +18 -0
  4. package/build/src/kmp-compiler.d.ts.map +1 -0
  5. package/build/src/kmp-compiler.js +232 -0
  6. package/build/src/kmp-compiler.js.map +1 -0
  7. package/build/src/kmp-json-file.d.ts +68 -0
  8. package/build/src/kmp-json-file.d.ts.map +1 -0
  9. package/build/src/kmp-json-file.js +2 -0
  10. package/build/src/kmp-json-file.js.map +1 -0
  11. package/build/src/kps-file.d.ts +98 -0
  12. package/build/src/kps-file.d.ts.map +1 -0
  13. package/build/src/kps-file.js +16 -0
  14. package/build/src/kps-file.js.map +1 -0
  15. package/build/test/helpers/index.d.ts +10 -0
  16. package/build/test/helpers/index.d.ts.map +1 -0
  17. package/build/test/helpers/index.js +17 -0
  18. package/build/test/helpers/index.js.map +1 -0
  19. package/build/test/test-package-compiler.d.ts +2 -0
  20. package/build/test/test-package-compiler.d.ts.map +1 -0
  21. package/build/test/test-package-compiler.js +97 -0
  22. package/build/test/test-package-compiler.js.map +1 -0
  23. package/build/test/tsconfig.tsbuildinfo +1 -0
  24. package/build/tsconfig.tsbuildinfo +1 -0
  25. package/build.sh +66 -0
  26. package/coverage/lcov-report/base.css +224 -0
  27. package/coverage/lcov-report/block-navigation.js +87 -0
  28. package/coverage/lcov-report/favicon.png +0 -0
  29. package/coverage/lcov-report/index.html +146 -0
  30. package/coverage/lcov-report/prettify.css +1 -0
  31. package/coverage/lcov-report/prettify.js +2 -0
  32. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  33. package/coverage/lcov-report/sorter.js +196 -0
  34. package/coverage/lcov-report/src/index.html +116 -0
  35. package/coverage/lcov-report/src/kmp-compiler.ts.html +904 -0
  36. package/coverage/lcov-report/test/helpers/index.html +116 -0
  37. package/coverage/lcov-report/test/helpers/index.ts.html +136 -0
  38. package/coverage/lcov-report/test/index.html +116 -0
  39. package/coverage/lcov-report/test/test-package-compiler.ts.html +445 -0
  40. package/coverage/lcov.info +518 -0
  41. package/package.json +54 -0
  42. package/src/kmp-compiler.ts +273 -0
  43. package/src/kmp-json-file.ts +77 -0
  44. package/src/kps-file.ts +126 -0
  45. package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.js +55 -0
  46. package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kmp.intermediate.json +48 -0
  47. package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kmp.json +48 -0
  48. package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kmp.zipped.json +45 -0
  49. package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.kps +35 -0
  50. package/test/fixtures/example.qaa.sencoten/example.qaa.sencoten.model.ts +6 -0
  51. package/test/fixtures/example.qaa.sencoten/wordlist.tsv +10 -0
  52. package/test/fixtures/khmer_angkor/build/khmer_angkor.js +1 -0
  53. package/test/fixtures/khmer_angkor/build/khmer_angkor.kmx +0 -0
  54. package/test/fixtures/khmer_angkor/build/khmer_angkor.kvk +0 -0
  55. package/test/fixtures/khmer_angkor/ref/kmp.json +110 -0
  56. package/test/fixtures/khmer_angkor/shared/fonts/khmer/busrakbd/khmer_busra_kbd.ttf +0 -0
  57. package/test/fixtures/khmer_angkor/shared/fonts/khmer/mondulkiri/FONTLOG.txt +123 -0
  58. package/test/fixtures/khmer_angkor/shared/fonts/khmer/mondulkiri/Mondulkiri-R.ttf +0 -0
  59. package/test/fixtures/khmer_angkor/shared/fonts/khmer/mondulkiri/OFL-FAQ.txt +425 -0
  60. package/test/fixtures/khmer_angkor/shared/fonts/khmer/mondulkiri/OFL.txt +95 -0
  61. package/test/fixtures/khmer_angkor/source/khmer_angkor.kps +131 -0
  62. package/test/fixtures/khmer_angkor/source/readme.htm +23 -0
  63. package/test/fixtures/khmer_angkor/source/splash.gif +0 -0
  64. package/test/fixtures/khmer_angkor/source/welcome/KAK_Documentation_EN.pdf +0 -0
  65. package/test/fixtures/khmer_angkor/source/welcome/KAK_Documentation_KH.pdf +0 -0
  66. package/test/fixtures/khmer_angkor/source/welcome/image002.png +0 -0
  67. package/test/fixtures/khmer_angkor/source/welcome/keyboard_layout.png +0 -0
  68. package/test/fixtures/khmer_angkor/source/welcome/welcome.htm +54 -0
  69. package/test/fixtures/withfolders.qaa.sencoten/build/withfolders.qaa.sencoten.model.js +55 -0
  70. package/test/fixtures/withfolders.qaa.sencoten/source/welcome.htm +1 -0
  71. package/test/fixtures/withfolders.qaa.sencoten/source/withfolders.qaa.sencoten.model.kps +41 -0
  72. package/test/fixtures/withfolders.qaa.sencoten/source/withfolders.qaa.sencoten.model.ts +6 -0
  73. package/test/fixtures/withfolders.qaa.sencoten/source/wordlist.tsv +10 -0
  74. package/test/fixtures/withfolders.qaa.sencoten/withfolders.qaa.sencoten.model.kmp.intermediate.json +52 -0
  75. package/test/fixtures/withfolders.qaa.sencoten/withfolders.qaa.sencoten.model.kmp.zipped.json +50 -0
  76. package/test/helpers/index.ts +17 -0
  77. package/test/test-package-compiler.ts +120 -0
  78. package/test/tsconfig.json +19 -0
  79. package/tsconfig.json +15 -0
package/Makefile ADDED
@@ -0,0 +1,38 @@
1
+ #
2
+ # Keyman Developer - kmc Package Compiler Makefile
3
+ #
4
+
5
+ !include ..\Defines.mak
6
+
7
+ # We don't depend on configure here because kmc-keyboard does that already
8
+ build: .virtual
9
+ $(GIT_BASH_FOR_KEYMAN) build.sh build
10
+
11
+ configure: .virtual
12
+ $(GIT_BASH_FOR_KEYMAN) build.sh configure
13
+
14
+ clean: .virtual
15
+ $(GIT_BASH_FOR_KEYMAN) build.sh clean
16
+
17
+ test: .virtual
18
+ $(GIT_BASH_FOR_KEYMAN) build.sh test
19
+
20
+ # build.sh bundle must be run from shell as it requires a temp folder to be
21
+ # passed in. See inst/download.in.mak for instantiation.
22
+
23
+ publish: .virtual
24
+ $(GIT_BASH_FOR_KEYMAN) build.sh publish
25
+
26
+ signcode:
27
+ @rem nothing to do
28
+
29
+ wrap-symbols:
30
+ @rem nothing to do
31
+
32
+ test-manifest:
33
+ @rem nothing to do
34
+
35
+ install:
36
+ @rem nothing to do
37
+
38
+ !include ..\Target.mak
@@ -0,0 +1,18 @@
1
+ import type { KmpJsonFile } from './kmp-json-file.js';
2
+ export { type KmpJsonFile } from './kmp-json-file.js';
3
+ export default class KmpCompiler {
4
+ transformKpsToKmpObject(kpsString: string, kpsPath: string): KmpJsonFile;
5
+ private kpsInfoToKmpInfo;
6
+ private arrayWrap;
7
+ private kpsLanguagesToKmpLanguages;
8
+ private extractKeyboardVersionFromKmx;
9
+ private stripUndefined;
10
+ /**
11
+ * Returns a Promise to the serialized data which can then be written to a .kmp file.
12
+ *
13
+ * @param kpsFilename - Filename of the kps, not read, used only for calculating relative paths
14
+ * @param kmpJsonData - The kmp.json Object
15
+ */
16
+ buildKmpFile(kpsFilename: string, kmpJsonData: KmpJsonFile): Promise<string>;
17
+ }
18
+ //# sourceMappingURL=kmp-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kmp-compiler.d.ts","sourceRoot":"","sources":["../../src/kmp-compiler.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAA4D,MAAM,oBAAoB,CAAC;AAEhH,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD,MAAM,CAAC,OAAO,OAAO,WAAW;IAEvB,uBAAuB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,WAAW;IAiJ/E,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,SAAS;IAOjB,OAAO,CAAC,0BAA0B;IAIlC,OAAO,CAAC,6BAA6B;IAcrC,OAAO,CAAC,cAAc;IAWtB;;;;;OAKG;IACI,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;CAiDpF"}
@@ -0,0 +1,232 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as xml2js from 'xml2js';
4
+ import JSZip from 'jszip';
5
+ import KEYMAN_VERSION from "@keymanapp/keyman-version";
6
+ const FILEVERSION_KMP_JSON = '12.0';
7
+ export default class KmpCompiler {
8
+ transformKpsToKmpObject(kpsString, kpsPath) {
9
+ // Load the KPS data from XML as JS structured data.
10
+ let kpsPackage = (() => {
11
+ let a;
12
+ let parser = new xml2js.Parser({
13
+ tagNameProcessors: [xml2js.processors.firstCharLowerCase],
14
+ explicitArray: false
15
+ });
16
+ parser.parseString(kpsString, (e, r) => { a = r; });
17
+ return a;
18
+ })();
19
+ let kps = kpsPackage.package;
20
+ //
21
+ // To convert to kmp.json, we need to:
22
+ //
23
+ // 1. Unwrap arrays (and convert to array where single object)
24
+ // 2. Fix casing on `iD`
25
+ // 3. Rewrap info, keyboard.languages, lexicalModel.languages, startMenu.items elements
26
+ // 4. Remove options.followKeyboardVersion, file.fileType
27
+ // 5. Convert file.copyLocation to a Number
28
+ // 6. Filenames need to be basenames (but this comes after processing)
29
+ //
30
+ // Start to construct the kmp.json file from the .kps file
31
+ let kmp = {
32
+ system: {
33
+ fileVersion: FILEVERSION_KMP_JSON,
34
+ keymanDeveloperVersion: KEYMAN_VERSION.VERSION
35
+ },
36
+ options: {}
37
+ };
38
+ //
39
+ // Fill in additional fields
40
+ //
41
+ let keys = [
42
+ ['executeProgram', 'executeProgram'],
43
+ ['graphicFile', 'graphicFile'],
44
+ ['msiFileName', 'msiFilename'],
45
+ ['msiOptions', 'msiOptions'],
46
+ ['readMeFile', 'readmeFile']
47
+ ];
48
+ for (let [src, dst] of keys) {
49
+ if (kps.options[src]) {
50
+ kmp.options[dst] = kps.options[src];
51
+ }
52
+ }
53
+ //
54
+ // Add basic metadata
55
+ //
56
+ if (kps.info) {
57
+ kmp.info = this.kpsInfoToKmpInfo(kps.info);
58
+ }
59
+ // FollowKeyboardVersion support
60
+ if (kps.options?.followKeyboardVersion !== undefined) {
61
+ kmp.info.version = {
62
+ description: this.extractKeyboardVersionFromKmx(kpsPath, kps)
63
+ };
64
+ }
65
+ //
66
+ // Add file metadata
67
+ //
68
+ if (kps.files && kps.files.file) {
69
+ kmp.files = this.arrayWrap(kps.files.file).map((file) => {
70
+ return {
71
+ name: file.name,
72
+ description: file.description,
73
+ copyLocation: parseInt(file.copyLocation, 10) || undefined
74
+ // note: we don't emit fileType as that is not permitted in kmp.json
75
+ };
76
+ });
77
+ }
78
+ kmp.files = kmp.files ?? [];
79
+ // Add the standard kmp.json self-referential to match existing implementations
80
+ kmp.files.push({
81
+ name: "kmp.json",
82
+ description: "Package information (JSON)"
83
+ });
84
+ //
85
+ // Add keyboard metadata
86
+ //
87
+ if (kps.keyboards && kps.keyboards.keyboard) {
88
+ kmp.keyboards = this.arrayWrap(kps.keyboards.keyboard).map((keyboard) => {
89
+ return {
90
+ displayFont: keyboard.displayFont ? path.basename(keyboard.displayFont.replaceAll('\\', '/')) : undefined,
91
+ oskFont: keyboard.oSKFont ? path.basename(keyboard.oSKFont.replaceAll('\\', '/')) : undefined,
92
+ name: keyboard.name,
93
+ id: keyboard.iD,
94
+ version: keyboard.version,
95
+ languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(keyboard.languages.language))
96
+ };
97
+ });
98
+ }
99
+ //
100
+ // Add lexical-model metadata
101
+ //
102
+ if (kps.lexicalModels && kps.lexicalModels.lexicalModel) {
103
+ kmp.lexicalModels = this.arrayWrap(kps.lexicalModels.lexicalModel).map((model) => {
104
+ return { name: model.name, id: model.iD, languages: this.kpsLanguagesToKmpLanguages(this.arrayWrap(model.languages.language)) };
105
+ });
106
+ }
107
+ //
108
+ // Add Windows Start Menu metadata
109
+ //
110
+ if (kps.startMenu && kps.startMenu.items) {
111
+ kmp.startMenu = {};
112
+ if (kps.startMenu.addUninstallEntry)
113
+ kmp.startMenu.addUninstallEntry = kps.startMenu.addUninstallEntry === '';
114
+ if (kps.startMenu.folder)
115
+ kmp.startMenu.folder = kps.startMenu.folder;
116
+ if (kps.startMenu.items && kps.startMenu.items.item)
117
+ kmp.startMenu.items = this.arrayWrap(kps.startMenu.items.item);
118
+ }
119
+ //
120
+ // Add translation strings
121
+ //
122
+ if (kps.strings && kps.strings.string) {
123
+ kmp.strings = this.arrayWrap(kps.strings.string);
124
+ }
125
+ kmp = this.stripUndefined(kmp);
126
+ return kmp;
127
+ }
128
+ // Helper functions
129
+ kpsInfoToKmpInfo(info) {
130
+ let ni = {};
131
+ const keys = [
132
+ ['author', 'author'],
133
+ ['copyright', 'copyright'],
134
+ ['name', 'name'],
135
+ ['version', 'version'],
136
+ ['webSite', 'website']
137
+ ];
138
+ for (let [src, dst] of keys) {
139
+ if (info[src]) {
140
+ ni[dst] = { description: info[src]._ ?? (typeof info[src] == 'string' ? info[src].toString() : '') };
141
+ if (info[src].$ && info[src].$.URL)
142
+ ni[dst].url = info[src].$.URL;
143
+ }
144
+ }
145
+ return ni;
146
+ }
147
+ ;
148
+ arrayWrap(a) {
149
+ if (Array.isArray(a)) {
150
+ return a;
151
+ }
152
+ return [a];
153
+ }
154
+ ;
155
+ kpsLanguagesToKmpLanguages(language) {
156
+ return language.map((element) => { return { name: element._, id: element.$.ID }; });
157
+ }
158
+ ;
159
+ extractKeyboardVersionFromKmx(kpsPath, kps) {
160
+ // TODO-LDML: #7340 this is incomplete; we need to read from first .kmx
161
+ // When we do this, we'll need to update fixtures to have the correct
162
+ // version string also
163
+ if (!kps.keyboards || !kps.keyboards.keyboard) {
164
+ // We don't read from the kps metadata because we want the keyboard
165
+ // version data here;
166
+ // TODO: currently model files don't support follow-version?
167
+ return '0.0.0';
168
+ }
169
+ let k = this.arrayWrap(kps.keyboards.keyboard);
170
+ return k?.[0]?.version ?? '0.0.0';
171
+ }
172
+ stripUndefined(o) {
173
+ for (const key in o) {
174
+ if (o[key] === undefined) {
175
+ delete o[key];
176
+ }
177
+ else if (typeof o[key] == 'object') {
178
+ o[key] = this.stripUndefined(o[key]);
179
+ }
180
+ }
181
+ return o;
182
+ }
183
+ /**
184
+ * Returns a Promise to the serialized data which can then be written to a .kmp file.
185
+ *
186
+ * @param kpsFilename - Filename of the kps, not read, used only for calculating relative paths
187
+ * @param kmpJsonData - The kmp.json Object
188
+ */
189
+ buildKmpFile(kpsFilename, kmpJsonData) {
190
+ const zip = JSZip();
191
+ const kmpJsonFileName = 'kmp.json';
192
+ const basePath = path.dirname(kpsFilename);
193
+ // Make a copy of kmpJsonData, as we mutate paths for writing
194
+ const data = JSON.parse(JSON.stringify(kmpJsonData));
195
+ if (!data.files) {
196
+ data.files = [];
197
+ }
198
+ data.files.forEach(function (value) {
199
+ // Get the path of the file
200
+ let filename = value.name;
201
+ // We add this separately after zipping all other files
202
+ if (filename == 'kmp.json') {
203
+ return;
204
+ }
205
+ if (path.isAbsolute(value.name)) {
206
+ // absolute paths are not very cross-platform compatible -- we are going to have trouble
207
+ // with path separators and roots
208
+ // TODO: emit a warning
209
+ }
210
+ else {
211
+ // Transform separators to platform separators -- kps files may use
212
+ // either / or \, although older kps files were always \.
213
+ if (path.sep == '/') {
214
+ filename = filename.replace(/\\/g, '/');
215
+ }
216
+ else {
217
+ filename = filename.replace(/\//g, '\\');
218
+ }
219
+ filename = path.resolve(basePath, filename);
220
+ }
221
+ const basename = path.basename(filename);
222
+ let data = fs.readFileSync(filename);
223
+ zip.file(basename, data);
224
+ // Remove path data from files before JSON save
225
+ value.name = basename;
226
+ });
227
+ zip.file(kmpJsonFileName, JSON.stringify(data, null, 2));
228
+ // Generate kmp file
229
+ return zip.generateAsync({ type: 'binarystring', compression: 'DEFLATE' });
230
+ }
231
+ }
232
+ //# sourceMappingURL=kmp-compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kmp-compiler.js","sourceRoot":"","sources":["../../src/kmp-compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ export interface KmpJsonFile {
2
+ system: KmpJsonFileSystem;
3
+ options: KmpJsonFileOptions;
4
+ info?: KmpJsonFileInfo;
5
+ files?: KmpJsonFileContentFile[];
6
+ lexicalModels?: KmpJsonFileLexicalModel[];
7
+ startMenu?: KmpJsonFileStartMenu;
8
+ keyboards?: KmpJsonFileKeyboard[];
9
+ strings?: string[];
10
+ }
11
+ export interface KmpJsonFileSystem {
12
+ keymanDeveloperVersion: string;
13
+ fileVersion: string;
14
+ }
15
+ export interface KmpJsonFileOptions {
16
+ readmeFile?: string;
17
+ graphicFile?: string;
18
+ executeProgram?: string;
19
+ msiFilename?: string;
20
+ msiOptions?: string;
21
+ }
22
+ export interface KmpJsonFileInfo {
23
+ website?: KmpJsonFileInfoItem;
24
+ version?: KmpJsonFileInfoItem;
25
+ name?: KmpJsonFileInfoItem;
26
+ copyright?: KmpJsonFileInfoItem;
27
+ author?: KmpJsonFileInfoItem;
28
+ }
29
+ export interface KmpJsonFileInfoItem {
30
+ description: string;
31
+ url?: string;
32
+ }
33
+ export interface KmpJsonFileContentFile {
34
+ name: string;
35
+ description: string;
36
+ copyLocation?: number;
37
+ }
38
+ export interface KmpJsonFileLexicalModel {
39
+ name: string;
40
+ id: string;
41
+ languages: KmpJsonFileLanguage[];
42
+ }
43
+ export interface KmpJsonFileLanguage {
44
+ name: string;
45
+ id: string;
46
+ }
47
+ export interface KmpJsonFileKeyboard {
48
+ name: string;
49
+ id: string;
50
+ version: string;
51
+ oskFont?: string;
52
+ displayFont?: string;
53
+ rtl?: boolean;
54
+ languages?: KmpJsonFileLanguage[];
55
+ }
56
+ export interface KmpJsonFileStartMenu {
57
+ folder?: string;
58
+ addUninstallEntry?: boolean;
59
+ items?: KmpJsonFileStartMenuItem[];
60
+ }
61
+ export interface KmpJsonFileStartMenuItem {
62
+ name: string;
63
+ filename: string;
64
+ arguments?: string;
65
+ icon?: string;
66
+ location?: string;
67
+ }
68
+ //# sourceMappingURL=kmp-json-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kmp-json-file.d.ts","sourceRoot":"","sources":["../../src/kmp-json-file.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,KAAK,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC1C,SAAS,CAAC,EAAE,oBAAoB,CAAC;IACjC,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,IAAI,CAAC,EAAE,mBAAmB,CAAC;IAC3B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,MAAM,CAAC,EAAE,mBAAmB,CAAC;CAC9B;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,wBAAwB,EAAE,CAAC;CACpC;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=kmp-json-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kmp-json-file.js","sourceRoot":"","sources":["../../src/kmp-json-file.ts"],"names":[],"mappings":""}
@@ -0,0 +1,98 @@
1
+ export interface KpsPackage {
2
+ /**
3
+ * <Package> -- the root element.
4
+ */
5
+ package: KpsFile;
6
+ }
7
+ export interface KpsFile {
8
+ system: KpsFileSystem;
9
+ options: KpsFileOptions;
10
+ info?: KpsFileInfo;
11
+ files?: KpsFileContentFiles;
12
+ keyboards?: KpsFileKeyboards;
13
+ lexicalModels?: KpsFileLexicalModels;
14
+ startMenu?: KpsFileStartMenu;
15
+ strings?: KpsFileStrings;
16
+ }
17
+ export interface KpsFileSystem {
18
+ keymanDeveloperVersion: string;
19
+ fileVersion: string;
20
+ }
21
+ export interface KpsFileOptions {
22
+ followKeyboardVersion?: string;
23
+ readMeFile?: string;
24
+ graphicFile?: string;
25
+ executeProgram?: string;
26
+ msiFileName?: string;
27
+ msiOptions?: string;
28
+ }
29
+ export interface KpsFileInfo {
30
+ name?: KpsFileInfoItem;
31
+ copyright?: KpsFileInfoItem;
32
+ author?: KpsFileInfoItem;
33
+ webSite?: KpsFileInfoItem;
34
+ version?: KpsFileInfoItem;
35
+ }
36
+ export interface KpsFileInfoItem {
37
+ _: string;
38
+ $: {
39
+ URL: string;
40
+ };
41
+ }
42
+ export interface KpsFileContentFiles {
43
+ file: KpsFileContentFile[] | KpsFileContentFile;
44
+ }
45
+ export interface KpsFileContentFile {
46
+ name: string;
47
+ description: string;
48
+ copyLocation: string;
49
+ fileType: string;
50
+ }
51
+ export interface KpsFileLexicalModel {
52
+ name: string;
53
+ iD: string;
54
+ languages: KpsFileLanguages;
55
+ }
56
+ export interface KpsFileLexicalModels {
57
+ lexicalModel: KpsFileLexicalModel[] | KpsFileLexicalModel;
58
+ }
59
+ export interface KpsFileLanguages {
60
+ language: KpsFileLanguage[] | KpsFileLanguage;
61
+ }
62
+ export interface KpsFileLanguage {
63
+ _: string;
64
+ $: {
65
+ ID: string;
66
+ };
67
+ }
68
+ export interface KpsFileKeyboard {
69
+ name: string;
70
+ iD: string;
71
+ version: string;
72
+ oSKFont?: string;
73
+ displayFont?: string;
74
+ rtl?: boolean;
75
+ languages?: KpsFileLanguages;
76
+ }
77
+ export interface KpsFileKeyboards {
78
+ keyboard: KpsFileKeyboard[] | KpsFileKeyboard;
79
+ }
80
+ export interface KpsFileStartMenu {
81
+ folder?: string;
82
+ addUninstallEntry?: string;
83
+ items?: KpsFileStartMenuItems;
84
+ }
85
+ export interface KpsFileStartMenuItem {
86
+ name: string;
87
+ filename: string;
88
+ arguments?: string;
89
+ icon?: string;
90
+ location?: string;
91
+ }
92
+ export interface KpsFileStartMenuItems {
93
+ item: KpsFileStartMenuItem[] | KpsFileStartMenuItem;
94
+ }
95
+ export interface KpsFileStrings {
96
+ string: string[] | string;
97
+ }
98
+ //# sourceMappingURL=kps-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kps-file.d.ts","sourceRoot":"","sources":["../../src/kps-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ //
2
+ // The interfaces in this file are designed with reference to the
3
+ // mapped structures produced by xml2js when passed a .kps file.
4
+ //
5
+ // A few notes:
6
+ //
7
+ // * Casing is updated to camelCase during load (leaving `iD` as a
8
+ // mixed up beastie).
9
+ // * Arrays are buried a layer too deep (e.g. <Files><File/><File/></Files>
10
+ // leads to KpsFiles.KpsFile[]
11
+ // * Properties such as used in Info Items use `_` and `$` and must be
12
+ // extracted.
13
+ // * Strings element is not yet checked to be correct
14
+ //
15
+ export {};
16
+ //# sourceMappingURL=kps-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kps-file.js","sourceRoot":"","sources":["../../src/kps-file.ts"],"names":[],"mappings":"AAAA,EAAE;AACF,iEAAiE;AACjE,gEAAgE;AAChE,EAAE;AACF,eAAe;AACf,EAAE;AACF,kEAAkE;AAClE,uBAAuB;AACvB,2EAA2E;AAC3E,gCAAgC;AAChC,sEAAsE;AACtE,eAAe;AACf,qDAAqD;AACrD,EAAE"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Builds a path to the fixture with the given path components.
3
+ *
4
+ * e.g., makePathToFixture('example.qaa.trivial')
5
+ * e.g., makePathToFixture('example.qaa.trivial', 'model.ts')
6
+ *
7
+ * @param components One or more path components.
8
+ */
9
+ export declare function makePathToFixture(...components: string[]): string;
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../test/helpers/index.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AACF,wBAAgB,iBAAiB,CAAC,GAAG,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAElE"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Helpers and utilities for the Mocha tests.
3
+ */
4
+ import * as path from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ /**
7
+ * Builds a path to the fixture with the given path components.
8
+ *
9
+ * e.g., makePathToFixture('example.qaa.trivial')
10
+ * e.g., makePathToFixture('example.qaa.trivial', 'model.ts')
11
+ *
12
+ * @param components One or more path components.
13
+ */
14
+ export function makePathToFixture(...components) {
15
+ return fileURLToPath(new URL(path.join('..', '..', '..', 'test', 'fixtures', ...components), import.meta.url));
16
+ }
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../test/helpers/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC;;;;;;;GAOG;AACF,MAAM,UAAU,iBAAiB,CAAC,GAAG,UAAoB;IACxD,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACjH,CAAC"}
@@ -0,0 +1,2 @@
1
+ import 'mocha';
2
+ //# sourceMappingURL=test-package-compiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-package-compiler.d.ts","sourceRoot":"","sources":["../../test/test-package-compiler.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC"}
@@ -0,0 +1,97 @@
1
+ import 'mocha';
2
+ import * as fs from 'fs';
3
+ import { assert } from 'chai';
4
+ import KmpCompiler from '../src/kmp-compiler.js';
5
+ import { makePathToFixture } from './helpers/index.js';
6
+ import JSZip from 'jszip';
7
+ import KEYMAN_VERSION from "@keymanapp/keyman-version";
8
+ describe('KmpCompiler', function () {
9
+ const MODELS = [
10
+ 'example.qaa.sencoten',
11
+ 'withfolders.qaa.sencoten',
12
+ ];
13
+ let kmpCompiler = new KmpCompiler();
14
+ for (let modelID of MODELS) {
15
+ const kpsPath = modelID.includes('withfolders') ?
16
+ makePathToFixture(modelID, 'source', `${modelID}.model.kps`) : makePathToFixture(modelID, `${modelID}.model.kps`);
17
+ const jsPath = modelID.includes('withfolders') ?
18
+ makePathToFixture(modelID, 'source', `${modelID}.model.js`) : makePathToFixture(modelID, `${modelID}.model.js`);
19
+ const kmpJsonIntermediatePath = makePathToFixture(modelID, `${modelID}.model.kmp.intermediate.json`);
20
+ const kmpJsonZippedPath = makePathToFixture(modelID, `${modelID}.model.kmp.zipped.json`);
21
+ const kmpJsonIntermediateFixture = JSON.parse(fs.readFileSync(kmpJsonIntermediatePath, 'utf-8'));
22
+ const kmpJsonZippedFixture = JSON.parse(fs.readFileSync(kmpJsonZippedPath, 'utf-8'));
23
+ // We override the fixture version so that we can compare with the compiler output
24
+ kmpJsonIntermediateFixture.system.keymanDeveloperVersion = KEYMAN_VERSION.VERSION;
25
+ //
26
+ // Test just the transform from kps to kmp.json
27
+ //
28
+ it(`should transform ${modelID}.model.kps to kmp.json`, function () {
29
+ let source = fs.readFileSync(kpsPath, 'utf-8');
30
+ let kmpJson;
31
+ assert.doesNotThrow(() => {
32
+ kmpJson = kmpCompiler.transformKpsToKmpObject(source, kpsPath);
33
+ });
34
+ // Test that the kmp.json data is identical
35
+ assert.deepEqual(kmpJson, kmpJsonIntermediateFixture);
36
+ // Note that in-memory kmp.json still contains paths in the files array.
37
+ // However, when building the .kmp, the final written kmp.json data is
38
+ // modified to strip paths.
39
+ // This was used when building initial test data
40
+ //fs.writeFileSync(kmpJsonPath, JSON.stringify(kmpJson), 'utf-8');
41
+ });
42
+ it(`should build a full .kmp for ${modelID}`, async function () {
43
+ const source = fs.readFileSync(kpsPath, 'utf-8');
44
+ const zip = JSZip();
45
+ // Build kmp.json in memory
46
+ const kmpJson = kmpCompiler.transformKpsToKmpObject(source, kpsPath);
47
+ // Build file.kmp in memory
48
+ const promise = kmpCompiler.buildKmpFile(kpsPath, kmpJson);
49
+ promise.then(data => {
50
+ // Check that file.kmp contains just 2 files - kmp.json and file.model.js,
51
+ // and that they match exactly what we expect
52
+ return zip.loadAsync(data, { checkCRC32: true }).then(zipFile => {
53
+ assert.equal(zipFile.length, 2);
54
+ return Promise.all([
55
+ zipFile.file("kmp.json").async('uint8array').then(kmpJsonOutput => {
56
+ assert.deepEqual(kmpJsonOutput, kmpJsonZippedFixture);
57
+ }),
58
+ zipFile.file(`${modelID}.model.js`).async('uint8array').then(modelJsFile => {
59
+ assert.deepEqual(modelJsFile, fs.readFileSync(jsPath));
60
+ })
61
+ ]);
62
+ });
63
+ });
64
+ return promise;
65
+ });
66
+ }
67
+ it('should generates a valid .kmp (zip) file', async function () {
68
+ // const kmpPath = makePathToFixture('khmer_angkor', 'build', 'khmer_angkor.kmp');
69
+ const kpsPath = makePathToFixture('khmer_angkor', 'source', 'khmer_angkor.kps');
70
+ const kmpJsonRefPath = makePathToFixture('khmer_angkor', 'ref', 'kmp.json');
71
+ const kmpCompiler = new KmpCompiler();
72
+ const source = fs.readFileSync(kpsPath, 'utf-8');
73
+ const kmpJsonFixture = JSON.parse(fs.readFileSync(kmpJsonRefPath, 'utf-8'));
74
+ // We override the fixture version so that we can compare with the compiler output
75
+ kmpJsonFixture.system.keymanDeveloperVersion = KEYMAN_VERSION.VERSION;
76
+ let kmpJson = null;
77
+ assert.doesNotThrow(() => {
78
+ kmpJson = kmpCompiler.transformKpsToKmpObject(source, kpsPath);
79
+ });
80
+ const kmpData = await kmpCompiler.buildKmpFile(kpsPath, kmpJson);
81
+ const zip = JSZip();
82
+ let jszip = await zip.loadAsync(kmpData);
83
+ assert.isNotNull(jszip.file('kmp.json')); // kmp.json should be present
84
+ // kmp file should contain the following files
85
+ const expectedFiles = [
86
+ 'FONTLOG.txt', 'image002.png', 'KAK_Documentation_EN.pdf', 'KAK_Documentation_KH.pdf',
87
+ 'keyboard_layout.png', 'khmer_angkor.js', 'khmer_angkor.kmx', 'khmer_angkor.kvk',
88
+ 'khmer_busra_kbd.ttf', 'Mondulkiri-R.ttf', 'OFL.txt', 'OFL-FAQ.txt', 'readme.htm',
89
+ 'splash.gif', 'welcome.htm',
90
+ 'kmp.json', // standard .kmp metadata file
91
+ ];
92
+ assert.sameMembers(Object.entries(jszip.files).map(([s, o]) => o.name).sort(), expectedFiles.sort(), 'khmer_angkor.kmp file should have exactly the expected files');
93
+ let kmpJsonData = JSON.parse(await jszip.file('kmp.json').async('string'));
94
+ assert.deepEqual(kmpJsonData, kmpJsonFixture);
95
+ });
96
+ });
97
+ //# sourceMappingURL=test-package-compiler.js.map