@keymanapp/kmc-package 18.0.17-alpha → 18.0.18-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.
- package/build/src/compiler/cp1252.js +289 -288
- package/build/src/compiler/cp1252.js.map +1 -1
- package/build/src/compiler/kmp-compiler.js +494 -493
- package/build/src/compiler/kmp-compiler.js.map +1 -1
- package/build/src/compiler/kmp-inf-writer.js +145 -144
- package/build/src/compiler/kmp-inf-writer.js.map +1 -1
- package/build/src/compiler/kmx-keyboard-metadata.js +19 -18
- package/build/src/compiler/kmx-keyboard-metadata.js.map +1 -1
- package/build/src/compiler/markdown.js +49 -48
- package/build/src/compiler/markdown.js.map +1 -1
- package/build/src/compiler/package-compiler-messages.js +79 -78
- package/build/src/compiler/package-compiler-messages.js.map +1 -1
- package/build/src/compiler/package-keyboard-target-validator.js +45 -44
- package/build/src/compiler/package-keyboard-target-validator.js.map +1 -1
- package/build/src/compiler/package-metadata-collector.js +78 -77
- package/build/src/compiler/package-metadata-collector.js.map +1 -1
- package/build/src/compiler/package-metadata-updater.js +13 -12
- package/build/src/compiler/package-metadata-updater.js.map +1 -1
- package/build/src/compiler/package-validation.js +180 -179
- package/build/src/compiler/package-validation.js.map +1 -1
- package/build/src/compiler/package-version-validator.js +92 -91
- package/build/src/compiler/package-version-validator.js.map +1 -1
- package/build/src/compiler/redist-files.js +59 -58
- package/build/src/compiler/redist-files.js.map +1 -1
- package/build/src/compiler/web-keyboard-metadata.js +37 -36
- package/build/src/compiler/web-keyboard-metadata.js.map +1 -1
- package/build/src/compiler/windows-package-installer-compiler.js +180 -179
- package/build/src/compiler/windows-package-installer-compiler.js.map +1 -1
- package/build/src/main.js +7 -6
- package/build/src/main.js.map +1 -1
- package/package.json +3 -3
|
@@ -1,180 +1,181 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
// const
|
|
12
|
-
// const
|
|
13
|
-
//
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
//
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
//
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
//
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
//
|
|
162
|
-
//
|
|
163
|
-
//
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
179
|
-
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="23f9afaa-cea5-5f81-8a88-12f3b0eb5897")}catch(e){}}();
|
|
3
|
+
import { KeymanFileTypes } from '@keymanapp/common-types';
|
|
4
|
+
import { CompilerMessages } from './package-compiler-messages.js';
|
|
5
|
+
import { keymanEngineForWindowsFiles, keymanForWindowsInstallerFiles, keymanForWindowsRedistFiles } from './redist-files.js';
|
|
6
|
+
// The keyboard ID SHOULD adhere to this pattern:
|
|
7
|
+
const KEYBOARD_ID_PATTERN_PACKAGE = /^[a-z_][a-z0-9_]*\.(kps|kmp)$/;
|
|
8
|
+
// The model ID SHOULD adhere to this pattern:
|
|
9
|
+
// author .bcp47 .uniq
|
|
10
|
+
const MODEL_ID_PATTERN_PACKAGE = /^[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_-]*\.[a-z_][a-z0-9_]*\.model\.(kps|kmp)$/;
|
|
11
|
+
// const MODEL_ID_PATTERN_JS = /^[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_-]*\.[a-z_][a-z0-9_]*\.model\.js$/;
|
|
12
|
+
// const MODEL_ID_PATTERN_TS = /^[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_-]*\.[a-z_][a-z0-9_]*\.model\.ts$/;
|
|
13
|
+
// const MODEL_ID_PATTERN_PROJECT = /^[a-z_][a-z0-9_]*\.[a-z_][a-z0-9_-]*\.[a-z_][a-z0-9_]*\.model\.kpj$/;
|
|
14
|
+
// "Content files" within the package should adhere to these pattern:
|
|
15
|
+
const CONTENT_FILE_BASENAME_PATTERN = /^[a-z0-9_+.-]+$/i; // base names can be case insensitive
|
|
16
|
+
const CONTENT_FILE_EXTENSION_PATTERN = /^(\.[a-z0-9_-]+)?$/; // extensions should be lower-case or empty
|
|
17
|
+
/**
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
export class PackageValidation {
|
|
21
|
+
callbacks;
|
|
22
|
+
options;
|
|
23
|
+
constructor(callbacks, options) {
|
|
24
|
+
this.callbacks = callbacks;
|
|
25
|
+
this.options = options;
|
|
26
|
+
}
|
|
27
|
+
validate(filename, kmpJson) {
|
|
28
|
+
if (!this.checkForModelsAndKeyboardsInSamePackage(kmpJson)) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
if (!this.checkKeyboards(filename, kmpJson)) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
if (!this.checkLexicalModels(filename, kmpJson)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (!this.checkContentFiles(kmpJson)) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (!this.checkPackageInfo(kmpJson)) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
checkForDuplicatedOrNonMinimalLanguages(resourceType, id, languages) {
|
|
46
|
+
let minimalTags = {};
|
|
47
|
+
if (languages.length == 0) {
|
|
48
|
+
if (resourceType == 'keyboard') {
|
|
49
|
+
this.callbacks.reportMessage(CompilerMessages.Warn_KeyboardShouldHaveAtLeastOneLanguage({ id }));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
this.callbacks.reportMessage(CompilerMessages.Error_ModelMustHaveAtLeastOneLanguage({ id }));
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (let lang of languages) {
|
|
57
|
+
let locale;
|
|
58
|
+
try {
|
|
59
|
+
locale = new Intl.Locale(lang.id);
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
this.callbacks.reportMessage(CompilerMessages.Error_LanguageTagIsNotValid({ resourceType, id, lang: lang.id, e }));
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const minimalTag = locale.minimize().toString();
|
|
66
|
+
if (minimalTag.toLowerCase() !== lang.id.toLowerCase()) {
|
|
67
|
+
this.callbacks.reportMessage(CompilerMessages.Hint_LanguageTagIsNotMinimal({ resourceType, id, actual: lang.id, expected: minimalTag }));
|
|
68
|
+
}
|
|
69
|
+
if (minimalTags[minimalTag]) {
|
|
70
|
+
this.callbacks.reportMessage(CompilerMessages.Hint_PackageShouldNotRepeatLanguages({ resourceType, id, minimalTag, firstTag: lang.id, secondTag: minimalTags[minimalTag] }));
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
minimalTags[minimalTag] = lang.id;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
checkForModelsAndKeyboardsInSamePackage(kmpJson) {
|
|
79
|
+
if (kmpJson.lexicalModels?.length > 0 && kmpJson.keyboards?.length > 0) {
|
|
80
|
+
this.callbacks.reportMessage(CompilerMessages.Error_PackageCannotContainBothModelsAndKeyboards());
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (!kmpJson.lexicalModels?.length && !kmpJson.keyboards?.length) {
|
|
84
|
+
// Note: we require at least 1 keyboard or model in the package. This may
|
|
85
|
+
// change in the future if we start to use packages to distribute, e.g.
|
|
86
|
+
// localizations or themes.
|
|
87
|
+
this.callbacks.reportMessage(CompilerMessages.Error_PackageMustContainAModelOrAKeyboard());
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
checkLexicalModels(filename, kmpJson) {
|
|
93
|
+
if (!kmpJson.lexicalModels || kmpJson.lexicalModels.length == 0) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
filename = this.callbacks.path.basename(filename);
|
|
97
|
+
if (!MODEL_ID_PATTERN_PACKAGE.test(filename)) {
|
|
98
|
+
this.callbacks.reportMessage(CompilerMessages.Warn_PackageNameDoesNotFollowLexicalModelConventions({ filename }));
|
|
99
|
+
}
|
|
100
|
+
for (let model of kmpJson.lexicalModels) {
|
|
101
|
+
if (!this.checkForDuplicatedOrNonMinimalLanguages('model', model.id, model.languages)) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
checkKeyboards(filename, kmpJson) {
|
|
108
|
+
if (!kmpJson.keyboards || kmpJson.keyboards.length == 0) {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
filename = this.callbacks.path.basename(filename);
|
|
112
|
+
if (!KEYBOARD_ID_PATTERN_PACKAGE.test(filename)) {
|
|
113
|
+
this.callbacks.reportMessage(CompilerMessages.Warn_PackageNameDoesNotFollowKeyboardConventions({ filename }));
|
|
114
|
+
}
|
|
115
|
+
for (let keyboard of kmpJson.keyboards) {
|
|
116
|
+
if (!this.checkForDuplicatedOrNonMinimalLanguages('keyboard', keyboard.id, keyboard.languages)) {
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
// Note: package-version-validation verifies that there is a corresponding
|
|
120
|
+
// content file for each keyboard
|
|
121
|
+
}
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
checkContentFiles(kmpJson) {
|
|
125
|
+
for (let file of kmpJson.files) {
|
|
126
|
+
if (!this.checkContentFile(file)) {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
checkContentFile(file) {
|
|
133
|
+
const filename = this.callbacks.path.basename(file.name);
|
|
134
|
+
const ext = this.callbacks.path.extname(filename);
|
|
135
|
+
const base = filename.substring(0, filename.length - ext.length);
|
|
136
|
+
if (this.options.checkFilenameConventions) {
|
|
137
|
+
if (!CONTENT_FILE_BASENAME_PATTERN.test(base) || !CONTENT_FILE_EXTENSION_PATTERN.test(ext)) {
|
|
138
|
+
this.callbacks.reportMessage(CompilerMessages.Warn_FileInPackageDoesNotFollowFilenameConventions({ filename }));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (!this.checkIfContentFileIsDangerous(file)) {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
return true;
|
|
145
|
+
}
|
|
146
|
+
checkIfContentFileIsDangerous(file) {
|
|
147
|
+
const filename = this.callbacks.path.basename(file.name).toLowerCase();
|
|
148
|
+
// # Test for inclusion of redistributable files
|
|
149
|
+
if (keymanForWindowsInstallerFiles.includes(filename) ||
|
|
150
|
+
keymanForWindowsRedistFiles.includes(filename) ||
|
|
151
|
+
keymanEngineForWindowsFiles.includes(filename)) {
|
|
152
|
+
this.callbacks.reportMessage(CompilerMessages.Warn_RedistFileShouldNotBeInPackage({ filename }));
|
|
153
|
+
}
|
|
154
|
+
// # Test for inclusion of .doc or .docx files
|
|
155
|
+
if (filename.match(/\.doc(x?)$/)) {
|
|
156
|
+
this.callbacks.reportMessage(CompilerMessages.Warn_DocFileDangerous({ filename }));
|
|
157
|
+
}
|
|
158
|
+
// # Test for inclusion of keyboard source files
|
|
159
|
+
//
|
|
160
|
+
// We treat this as a hint, because it's not a dangerous problem, just
|
|
161
|
+
// something that suggests that perhaps they are trying to distribute the
|
|
162
|
+
// wrong files.
|
|
163
|
+
//
|
|
164
|
+
// Note: we allow .xml in the package because there are other files
|
|
165
|
+
// which may be valid, not just LDML keyboards
|
|
166
|
+
const fileType = KeymanFileTypes.sourceTypeFromFilename(file.name);
|
|
167
|
+
if (fileType !== null && fileType !== ".xml" /* KeymanFileTypes.Source.LdmlKeyboard */) {
|
|
168
|
+
this.callbacks.reportMessage(CompilerMessages.Hint_PackageContainsSourceFile({ filename: file.name }));
|
|
169
|
+
}
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
checkPackageInfo(file) {
|
|
173
|
+
if (!file.info || !file.info.name || !file.info.name.description.trim()) {
|
|
174
|
+
this.callbacks.reportMessage(CompilerMessages.Error_PackageNameCannotBeBlank());
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
180
|
//# sourceMappingURL=package-validation.js.map
|
|
181
|
+
//# debugId=23f9afaa-cea5-5f81-8a88-12f3b0eb5897
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"
|
|
1
|
+
{"version":3,"file":"package-validation.js","sources":["../../../src/compiler/package-validation.ts"],"sourceRoot":"","names":[],"mappings":"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","debug_id":"23f9afaa-cea5-5f81-8a88-12f3b0eb5897"}
|
|
@@ -1,92 +1,93 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export const
|
|
5
|
-
export const
|
|
6
|
-
export
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* @param
|
|
33
|
-
* @
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
|
|
1
|
+
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2fed3219-dbc8-5798-b47d-f1496278331b")}catch(e){}}();
|
|
3
|
+
import { CompilerMessages } from './package-compiler-messages.js';
|
|
4
|
+
export const DEFAULT_KEYBOARD_VERSION = '1.0';
|
|
5
|
+
export const MIN_LM_FILEVERSION_KMP_JSON = '12.0';
|
|
6
|
+
export const MIN_KBD_FILEVERSION_KMP_JSON = '7.0';
|
|
7
|
+
export class PackageVersionValidator {
|
|
8
|
+
callbacks;
|
|
9
|
+
constructor(callbacks) {
|
|
10
|
+
this.callbacks = callbacks;
|
|
11
|
+
}
|
|
12
|
+
getMinKeymanVersion(keyboardMetadata) {
|
|
13
|
+
let minKeymanVersion = MIN_KBD_FILEVERSION_KMP_JSON;
|
|
14
|
+
for (let id of Object.keys(keyboardMetadata)) {
|
|
15
|
+
// minKeymanVersion is always a float so float comparison is safe
|
|
16
|
+
let kbdMinKeymanVersion = parseFloat(keyboardMetadata[id].data.minKeymanVersion);
|
|
17
|
+
if (kbdMinKeymanVersion > 14.0) {
|
|
18
|
+
// Keyman for Windows 14 and earlier only accepted version 7.0 for keyboard
|
|
19
|
+
// packages, so we must not write any other version in order to allow
|
|
20
|
+
// earlier versions of Keyman to load the package.
|
|
21
|
+
if (parseFloat(minKeymanVersion) < kbdMinKeymanVersion) {
|
|
22
|
+
minKeymanVersion = keyboardMetadata[id].data.minKeymanVersion;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return minKeymanVersion;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Verifies version information in corresponding keyboards and updates kmpJson
|
|
30
|
+
* metadata as the version information can be out of sync in the .kps file
|
|
31
|
+
* after updating a contained keyboard.
|
|
32
|
+
* @param kps
|
|
33
|
+
* @param kmp
|
|
34
|
+
* @returns
|
|
35
|
+
*/
|
|
36
|
+
validateAndUpdateVersions(kps, kmp, keyboardMetadata) {
|
|
37
|
+
const followKeyboardVersion = kps.Options?.FollowKeyboardVersion !== undefined;
|
|
38
|
+
if (followKeyboardVersion) {
|
|
39
|
+
if (!this.checkFollowKeyboardVersion(kmp)) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
if (!kmp.keyboards) {
|
|
44
|
+
// Lexical models don't have version metadata; only their packages.
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
let result = true;
|
|
48
|
+
// We now know we have at least one keyboard in the package
|
|
49
|
+
for (let keyboard of kmp.keyboards) {
|
|
50
|
+
const data = keyboardMetadata[keyboard.id];
|
|
51
|
+
if (!data) {
|
|
52
|
+
// Warnings or errors will have been raised by getKeyboardFileData
|
|
53
|
+
// TODO raise error -- we should not have gotten here
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
// Note: there is often version metadata in the .kps <Keyboard> element, but
|
|
57
|
+
// we don't read from the metadata because we want to ensure we have the
|
|
58
|
+
// most up-to-date keyboard version data here, from the compiled keyboard.
|
|
59
|
+
if (followKeyboardVersion && data.data.keyboardVersion === null) {
|
|
60
|
+
this.callbacks.reportMessage(CompilerMessages.Info_KeyboardFileHasNoKeyboardVersion({ filename: keyboard.id }));
|
|
61
|
+
}
|
|
62
|
+
keyboard.version = data.data.keyboardVersion ?? DEFAULT_KEYBOARD_VERSION;
|
|
63
|
+
if (result && followKeyboardVersion) {
|
|
64
|
+
if (kmp.keyboards[0].version !== keyboard.version) {
|
|
65
|
+
this.callbacks.reportMessage(CompilerMessages.Warn_KeyboardVersionsDoNotMatch({
|
|
66
|
+
keyboard: keyboard.id,
|
|
67
|
+
version: keyboard.version,
|
|
68
|
+
firstKeyboard: kmp.keyboards[0].id,
|
|
69
|
+
firstVersion: kmp.keyboards[0].version
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (result && followKeyboardVersion) {
|
|
75
|
+
kmp.info.version = { description: kmp.keyboards[0].version };
|
|
76
|
+
}
|
|
77
|
+
return result;
|
|
78
|
+
}
|
|
79
|
+
checkFollowKeyboardVersion(kmp) {
|
|
80
|
+
// Lexical model packages do not allow FollowKeyboardVersion
|
|
81
|
+
if (kmp.lexicalModels && kmp.lexicalModels.length) {
|
|
82
|
+
this.callbacks.reportMessage(CompilerMessages.Error_FollowKeyboardVersionNotAllowedForModelPackages());
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
if (!kmp.keyboards || !kmp.keyboards.length) {
|
|
86
|
+
this.callbacks.reportMessage(CompilerMessages.Error_FollowKeyboardVersionButNoKeyboards());
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
92
|
//# sourceMappingURL=package-version-validator.js.map
|
|
93
|
+
//# debugId=2fed3219-dbc8-5798-b47d-f1496278331b
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"
|
|
1
|
+
{"version":3,"file":"package-version-validator.js","sources":["../../../src/compiler/package-version-validator.ts"],"sourceRoot":"","names":[],"mappings":"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","debug_id":"2fed3219-dbc8-5798-b47d-f1496278331b"}
|