diff --git a/common/web/types/build.sh b/common/web/types/build.sh
index 85c448024e..e565b03acc 100755
--- a/common/web/types/build.sh
+++ b/common/web/types/build.sh
@@ -38,6 +38,7 @@ function compile_schemas() {
"$KEYMAN_ROOT/common/schemas/keyman-touch-layout/keyman-touch-layout.spec.json"
"$KEYMAN_ROOT/common/schemas/keyman-touch-layout/keyman-touch-layout.clean.spec.json"
"$KEYMAN_ROOT/common/schemas/keyboard_info/keyboard_info.schema.json"
+ "$KEYMAN_ROOT/common/schemas/kmp/kmp.schema.json"
)
rm -rf "$THIS_SCRIPT_PATH/obj/schemas"
diff --git a/common/web/types/src/schema-validators.ts b/common/web/types/src/schema-validators.ts
index 07bcc032f1..ed07d44fde 100644
--- a/common/web/types/src/schema-validators.ts
+++ b/common/web/types/src/schema-validators.ts
@@ -7,6 +7,7 @@ import displayMap from './schemas/displaymap.schema.validator.mjs';
import touchLayoutClean from './schemas/keyman-touch-layout.clean.spec.validator.mjs';
import touchLayout from './schemas/keyman-touch-layout.spec.validator.mjs';
import keyboard_info from './schemas/keyboard_info.schema.validator.mjs';
+import kmp from './schemas/kmp.schema.validator.mjs';
// How to use: https://ajv.js.org/standalone.html#using-the-validation-function-s
// See also existing uses (search for `SchemaValidators`) for examples.
@@ -20,6 +21,7 @@ const SchemaValidators = {
touchLayoutClean,
touchLayout,
keyboard_info,
+ kmp,
};
export default SchemaValidators;
diff --git a/common/web/types/src/schemas.ts b/common/web/types/src/schemas.ts
index 8140f3c070..ee5f532861 100644
--- a/common/web/types/src/schemas.ts
+++ b/common/web/types/src/schemas.ts
@@ -8,6 +8,7 @@ import displayMap from './schemas/displaymap.schema.js';
import touchLayoutClean from './schemas/keyman-touch-layout.clean.spec.js';
import touchLayout from './schemas/keyman-touch-layout.spec.js';
import keyboard_info from './schemas/keyboard_info.schema.js';
+import kmp from './schemas/kmp.schema.js';
const Schemas = {
kpj,
@@ -19,6 +20,7 @@ const Schemas = {
touchLayoutClean,
touchLayout,
keyboard_info,
+ kmp,
};
export default Schemas;
diff --git a/common/web/types/tools/schema-bundler.js b/common/web/types/tools/schema-bundler.js
index 995befaec1..c8086e0650 100644
--- a/common/web/types/tools/schema-bundler.js
+++ b/common/web/types/tools/schema-bundler.js
@@ -15,6 +15,7 @@ await esbuild.build({
'obj/schemas/keyman-touch-layout.clean.spec.validator.cjs',
'obj/schemas/keyman-touch-layout.spec.validator.cjs',
'obj/schemas/keyboard_info.schema.validator.cjs',
+ 'obj/schemas/kmp.schema.validator.cjs',
],
bundle: true,
format: 'esm',
diff --git a/developer/src/inst/download.in.mak b/developer/src/inst/download.in.mak
index 81d8bb83ab..54f6940782 100644
--- a/developer/src/inst/download.in.mak
+++ b/developer/src/inst/download.in.mak
@@ -122,6 +122,7 @@ make-kmc-install-zip: copy-schemas
sentry.dll sentry.x64.dll \
kmdecomp.exe \
keyboard_info.schema.json \
+ kmp.schema.json \
keyman-touch-layout.spec.json keyman-touch-layout.clean.spec.json \
xml\layoutbuilder\*.keyman-touch-layout \
projects\* \
@@ -136,4 +137,5 @@ copy-schemas:
copy $(KEYMAN_ROOT)\common\schemas\keyman-touch-layout\keyman-touch-layout.spec.json $(DEVELOPER_ROOT)\bin
copy $(KEYMAN_ROOT)\common\schemas\keyman-touch-layout\keyman-touch-layout.clean.spec.json $(DEVELOPER_ROOT)\bin
copy $(KEYMAN_ROOT)\common\schemas\displaymap\displaymap.schema.json $(DEVELOPER_ROOT)\bin
+ copy $(KEYMAN_ROOT)\common\schemas\kmp\kmp.schema.json $(DEVELOPER_ROOT)\bin
diff --git a/developer/src/inst/kmdev.wxs b/developer/src/inst/kmdev.wxs
index 80b0df7250..cb683261fd 100644
--- a/developer/src/inst/kmdev.wxs
+++ b/developer/src/inst/kmdev.wxs
@@ -171,6 +171,10 @@
+
+
+
+
diff --git a/developer/src/kmc-package/src/compiler/kmp-compiler.ts b/developer/src/kmc-package/src/compiler/kmp-compiler.ts
index b26643e178..0e8349dd10 100644
--- a/developer/src/kmc-package/src/compiler/kmp-compiler.ts
+++ b/developer/src/kmc-package/src/compiler/kmp-compiler.ts
@@ -2,9 +2,8 @@ import * as xml2js from 'xml2js';
import JSZip from 'jszip';
import KEYMAN_VERSION from "@keymanapp/keyman-version";
-import { CompilerCallbacks, KeymanFileTypes, KvkFile } from '@keymanapp/common-types';
+import { KmpJsonFile, KpsFile, SchemaValidators, CompilerCallbacks, KeymanFileTypes, KvkFile } from '@keymanapp/common-types';
import { CompilerMessages } from './messages.js';
-import { KmpJsonFile, KpsFile } from '@keymanapp/common-types';
import { PackageMetadataCollector } from './package-metadata-collector.js';
import { KmpInfWriter } from './kmp-inf-writer.js';
import { transcodeToCP1252 } from './cp1252.js';
@@ -31,7 +30,15 @@ export class KmpCompiler {
if(!kps) {
return null;
}
- return this.transformKpsFileToKmpObject(kpsFilename, kps);
+ const kmp = this.transformKpsFileToKmpObject(kpsFilename, kps);
+
+ // Verify that the generated kmp.json validates with the kmp.json schema
+ if(!SchemaValidators.default.kmp(kmp)) {
+ // This is an internal error, so throwing an exception is appropriate
+ throw new Error((SchemaValidators.default.kmp).errors);
+ }
+
+ return kmp;
}
public loadKpsFile(kpsFilename: string): KpsFile.KpsFile {