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 {