;
+
+class KmxTestSource {
+public:
+ KmxTestSource();
+
+ int load_source(
+ const km::kbp::path &path,
+ std::string &keys,
+ std::u16string &expected,
+ std::u16string &context,
+ kmx_options &options,
+ bool &expected_beep);
+
+ km_kbp_option_item *get_keyboard_options(kmx_options options);
+
+ key_event next_key(std::string &keys);
+
+ int
+ caps_lock_state() {
+ return _caps_lock_on ? KM_KBP_MODIFIER_CAPS : 0;
+ }
+
+ void
+ toggle_caps_lock_state() {
+ _caps_lock_on = !_caps_lock_on;
+ }
+
+ void set_caps_lock_on(bool caps_lock_on) {
+ _caps_lock_on = caps_lock_on;
+ }
+
+private:
+ bool _caps_lock_on = false;
+
+ std::u16string parse_source_string(std::string const &s);
+ bool parse_option_string(std::string line, kmx_options &options, kmx_option_type type);
+ bool is_token(const std::string token, std::string &line);
+ key_event char_to_event(char ch);
+ uint16_t get_modifier(std::string const m);
+ km_kbp_virtual_key get_vk(std::string const &vk);
+ key_event vkey_to_event(std::string const &vk_event);
+};
+
+} // namespace tests
+} // namespace km
+
+#endif // __KMX_TEST_SOURCE_HPP__
diff --git a/common/core/desktop/tests/unit/kmx/meson.build b/common/core/desktop/tests/unit/kmx/meson.build
index 28b53051bd..c535d1f517 100644
--- a/common/core/desktop/tests/unit/kmx/meson.build
+++ b/common/core/desktop/tests/unit/kmx/meson.build
@@ -7,13 +7,17 @@
if compiler.get_id() == 'emscripten'
tests_flags = ['--embed-file', join_paths(meson.current_source_dir(),'@/')]
+ source_path = '/'
test_path = '/'
else
tests_flags = []
- test_path = meson.current_source_dir()
+ source_path = meson.current_source_dir()
+ test_path = meson.current_build_dir()
endif
-kmx = executable('kmx', 'kmx.cpp',
+kmx = executable('kmx',
+ 'kmx.cpp',
+ 'kmx_test_source.cpp',
cpp_args: defns,
include_directories: [inc, libsrc],
link_args: links + tests_flags,
@@ -76,6 +80,8 @@ tests = [
if build_machine.system() == 'windows'
kmcomp = find_program('kmcomp.exe', required: false)
kmcomp_cmd = [kmcomp]
+ copy_cmd = [find_program('cmd.exe', required: true), '/c', 'copy']
+ cat_cmd = [find_program('cmd.exe', required: true), '/c', 'type']
else
kmcomp = find_program('kmcomp', required: false)
kmcomp_cmd = [kmcomp]
@@ -87,6 +93,8 @@ else
kmcomp = disabler()
endif
endif
+ copy_cmd = [find_program('cp', required: true)]
+ cat_cmd = [find_program('cat', required: true)]
endif
if compiler.get_id() == 'emscripten'
@@ -95,23 +103,126 @@ if compiler.get_id() == 'emscripten'
kmcomp = disabler()
endif
+test_keyboards = ''
+foreach kbd : tests
+ if test_keyboards.startswith('{')
+ test_keyboards += ''',
+ '''
+ endif
+ kbd_basename = 'k_' + kbd.underscorify().to_lower()
+ test_keyboards += '''{
+ "name": "''' + kbd_basename + '''",
+ "id": "''' + kbd_basename + '''",
+ "version": "0.0",
+ "languages": [
+ {
+ "name": "Undetermined",
+ "id": "und"
+ }
+ ]
+ }'''
+ if not kmcomp.found()
+ configure_file(
+ command: copy_cmd + ['@INPUT@', '@OUTPUT@'],
+ input: kbd + '.kmn',
+ output: kbd_basename + '.kmn'
+ )
+ configure_file(
+ command: copy_cmd + ['@INPUT@', '@OUTPUT@'],
+ input: kbd + '.kmx',
+ output: kbd_basename + '.kmx'
+ )
+ endif
+endforeach
+
+cfg = configuration_data()
+cfg.set('keyboards', test_keyboards)
+configure_file(
+ configuration: cfg,
+ input: 'kmp.json.in',
+ output: 'kmp.json'
+)
+
if kmcomp.found()
foreach kbd : tests
- kbd_src = files(kbd + '.kmn')
- kbd_obj = join_paths(meson.current_source_dir(), kbd) + '.kmx'
- kbd_log = custom_target(kbd + '.kmx'.underscorify(),
- output: kbd + '.log',
- input: kbd_src,
- command: kmcomp_cmd + ['-s', '-d', '@INPUT@', kbd_obj, '@OUTPUT@']
- )
+ kbd_basename = 'k_' + kbd.underscorify().to_lower()
- test(kbd, kmx, depends: kbd_log, args: [kbd_src, kbd_obj])
+ content = run_command(
+ cat_cmd, files(kbd + '.kmn'),
+ ).stdout().strip()
+
+ cfg = configuration_data()
+ cfg.set('keyboard', kbd)
+ cfg.set('keyboard_underscore', kbd_basename)
+ cfg.set('id1', 'id_' + kbd_basename + '_1')
+ cfg.set('id2', 'id_' + kbd_basename + '_2')
+ cfg.set('id3', 'id_' + kbd_basename + '_3')
+ cfg.set('build_dir', meson.current_build_dir())
+ cfg.set('NAME', kbd)
+ cfg.set('CONTENT', content)
+
+ kbd_kmn = configure_file(
+ configuration: cfg,
+ input: join_paths('template', 'keyboard.kmn.in'),
+ output: kbd_basename + '.kmn'
+ )
+ kbd_kpj = configure_file(
+ configuration: cfg,
+ input: join_paths('template', 'keyboard.kpj.in'),
+ output: kbd_basename + '.kpj'
+ )
+ kbd_kps = configure_file(
+ configuration: cfg,
+ input: join_paths('template', 'keyboard.kps.in'),
+ output: kbd_basename + '.kps'
+ )
+ kbd_kmp = custom_target(kbd_basename + '.kmp',
+ input: kbd_kpj,
+ output: [kbd_basename + '.kmp', kbd_basename + '.kmx'],
+ depend_files: [kbd_kps, kbd_kmn],
+ depfile: kbd_basename + '.dep',
+ command: kmcomp_cmd + ['-s', '-d', '@INPUT@'])
+
+ kbd_src = files(join_paths(test_path, kbd_basename) + '.kmn')
+ kbd_obj = join_paths(test_path, kbd_basename) + '.kmx'
+ # kbd_log = custom_target(kbd.underscorify() + '.kmx',
+ # output: kbd + '.log',
+ # input: kbd_src,
+ # command: kmcomp_cmd + ['-s', '-d', '@INPUT@', kbd_obj, '@OUTPUT@']
+ # )
+
+ test(kbd, kmx, depends: [kbd_kmp], args: [kbd_src, kbd_obj])
endforeach
else
foreach kbd : tests
- kbd_src = join_paths(test_path, kbd) + '.kmn'
- kbd_obj = join_paths(test_path, kbd) + '.kmx'
+ kbd_src = join_paths(test_path, kbd_basename) + '.kmn'
+ kbd_obj = join_paths(test_path, kbd_basename) + '.kmx'
test(kbd, kmx, args: [kbd_src, kbd_obj])
endforeach
endif
+
+
+# test for km_kbp_keyboard_get_key_list
+
+key_e = executable('key_list', 'kmx_key_list.cpp',
+ cpp_args: defns,include_directories: [inc, libsrc],
+ link_args: links,
+ dependencies: [rust_mock_processor],
+ objects: lib.extract_all_objects())
+test_kbd = 'kmx_key_list'
+if kmcomp.found()
+ kbd_src = files(test_kbd + '.kmn')
+ kbd_obj = join_paths(meson.current_source_dir(), test_kbd) + '.kmx'
+ kbd_log = custom_target(test_kbd + '.kmx'.underscorify(),
+ output: test_kbd + '.log',
+ input: kbd_src,
+ command: kmcomp_cmd + ['-s', '-d', '@INPUT@', kbd_obj, '@OUTPUT@']
+ )
+ test('key_list', key_e, depends: kbd_log, args: [kbd_obj] )
+else
+ kbd_obj = join_paths(meson.current_source_dir(), test_kbd) + '.kmx'
+ test('key_list', key_e, args: [kbd_obj] )
+endif
+
+
diff --git a/common/core/desktop/tests/unit/kmx/template/keyboard.kmn.in b/common/core/desktop/tests/unit/kmx/template/keyboard.kmn.in
new file mode 100644
index 0000000000..2e5826ef3c
--- /dev/null
+++ b/common/core/desktop/tests/unit/kmx/template/keyboard.kmn.in
@@ -0,0 +1,2 @@
+store(&NAME) '@NAME@'
+@CONTENT@
diff --git a/common/core/desktop/tests/unit/kmx/template/keyboard.kpj.in b/common/core/desktop/tests/unit/kmx/template/keyboard.kpj.in
new file mode 100644
index 0000000000..ba612eccaa
--- /dev/null
+++ b/common/core/desktop/tests/unit/kmx/template/keyboard.kpj.in
@@ -0,0 +1,42 @@
+
+
+
+ $PROJECTPATH
+ false
+ false
+ false
+ keyboard
+
+
+
+ @id1@
+ @keyboard_underscore@.kmn
+ @build_dir@/@keyboard_underscore@.kmn
+ 1.0
+ .kmn
+
+ @keyboard@
+ Copyright (C) Keyman Team
+
+
+
+ @id2@
+ @keyboard_underscore@.kps
+ @build_dir@/@keyboard_underscore@.kps
+
+ .kps
+
+ @keyboard@
+ Copyright (C) Keyman Team
+
+
+
+ @id3@
+ @keyboard_underscore@.kmx
+ @build_dir@/@keyboard_underscore@.kmx
+
+ .kmx
+ @id2@
+
+
+
diff --git a/common/core/desktop/tests/unit/kmx/template/keyboard.kps.in b/common/core/desktop/tests/unit/kmx/template/keyboard.kps.in
new file mode 100644
index 0000000000..fceae55377
--- /dev/null
+++ b/common/core/desktop/tests/unit/kmx/template/keyboard.kps.in
@@ -0,0 +1,43 @@
+
+
+
+ 15.0
+ 7.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @keyboard@
+ Copyright (C) Keyman Team
+ Keyman Team
+
+
+
+
+ @keyboard_underscore@.kmx
+
+ 0
+ .kmx
+
+
+
+
+ @keyboard@
+ @keyboard_underscore@
+ 1.0
+
+ English
+
+
+
+
+
diff --git a/common/core/desktop/tests/unit/meson.build b/common/core/desktop/tests/unit/meson.build
new file mode 100644
index 0000000000..f905a957f4
--- /dev/null
+++ b/common/core/desktop/tests/unit/meson.build
@@ -0,0 +1,5 @@
+subdir('json')
+subdir('utftest')
+subdir('kmnkbd')
+subdir('kmx')
+subdir('rust_mock')
diff --git a/common/core/web/input-processor/package-lock.json b/common/core/web/input-processor/package-lock.json
index 6a98c82319..403d2465d3 100644
--- a/common/core/web/input-processor/package-lock.json
+++ b/common/core/web/input-processor/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/input-processor",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/core/web/input-processor/package.json b/common/core/web/input-processor/package.json
index b7317375a4..df2aa1a9ab 100644
--- a/common/core/web/input-processor/package.json
+++ b/common/core/web/input-processor/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/input-processor",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "The core text and prediction processing engine for KeymanWeb",
"repository": {
"type": "git",
@@ -18,8 +18,8 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"devDependencies": {
- "@keymanapp/lexical-model-compiler": "^15.0.129",
- "@keymanapp/resources-gosh": "^15.0.129",
+ "@keymanapp/lexical-model-compiler": "^15.0.157",
+ "@keymanapp/resources-gosh": "^15.0.157",
"@types/node": "^11.9.4",
"chai": "^4.3.4",
"mocha": "^8.4.0",
@@ -34,11 +34,11 @@
"mocha": "mocha"
},
"dependencies": {
- "@keymanapp/keyboard-processor": "^15.0.129",
- "@keymanapp/lexical-model-layer": "^15.0.129",
- "@keymanapp/models-types": "^15.0.129",
- "@keymanapp/web-environment": "^15.0.129",
- "@keymanapp/web-utils": "^15.0.129",
+ "@keymanapp/keyboard-processor": "^15.0.157",
+ "@keymanapp/lexical-model-layer": "^15.0.157",
+ "@keymanapp/models-types": "^15.0.157",
+ "@keymanapp/web-environment": "^15.0.157",
+ "@keymanapp/web-utils": "^15.0.157",
"eventemitter3": "^4.0.0"
}
}
diff --git a/common/core/web/keyboard-processor/package-lock.json b/common/core/web/keyboard-processor/package-lock.json
index 224eb43832..8d9d004a91 100644
--- a/common/core/web/keyboard-processor/package-lock.json
+++ b/common/core/web/keyboard-processor/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/keyboard-processor",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/core/web/keyboard-processor/package.json b/common/core/web/keyboard-processor/package.json
index a39aa9a455..7c331d57fd 100644
--- a/common/core/web/keyboard-processor/package.json
+++ b/common/core/web/keyboard-processor/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/keyboard-processor",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "Core module for Keyman keyboard support in KeymanWeb.",
"repository": {
"type": "git",
@@ -18,7 +18,7 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"devDependencies": {
- "@keymanapp/resources-gosh": "^15.0.129",
+ "@keymanapp/resources-gosh": "^15.0.157",
"chai": "^4.3.4",
"mocha": "^8.4.0",
"mocha-teamcity-reporter": "^4.0.0",
@@ -32,9 +32,9 @@
"mocha": "mocha"
},
"dependencies": {
- "@keymanapp/models-types": "^15.0.129",
- "@keymanapp/web-environment": "^15.0.129",
- "@keymanapp/web-utils": "^15.0.129",
+ "@keymanapp/models-types": "^15.0.157",
+ "@keymanapp/web-environment": "^15.0.157",
+ "@keymanapp/web-utils": "^15.0.157",
"@types/node": "^11.9.4"
}
}
diff --git a/common/core/web/keyboard-processor/src/text/defaultOutput.ts b/common/core/web/keyboard-processor/src/text/defaultOutput.ts
index 5fd515280c..daf8ec0f13 100644
--- a/common/core/web/keyboard-processor/src/text/defaultOutput.ts
+++ b/common/core/web/keyboard-processor/src/text/defaultOutput.ts
@@ -70,15 +70,15 @@ namespace com.keyman.text {
}
/**
- * Used when a RuleBehavior represents a non-text "command" within the Engine. This will generally
+ * Used when a RuleBehavior represents a non-text "command" within the Engine. This will generally
* trigger events that require context reset - often by moving the caret or by moving what OutputTarget
* the caret is in. However, we let those events perform the actual context reset.
- *
+ *
* Note: is extended by DOM-aware KeymanWeb code.
*/
public static applyCommand(Lkc: KeyEvent, outputTarget: OutputTarget): void {
// Notes for potential default-handling extensions:
- //
+ //
// switch(code) {
// // Problem: clusters, and doing them right.
// // The commented-out code below should be a decent starting point, but clusters make it complex.
@@ -142,27 +142,33 @@ namespace com.keyman.text {
// Test for fall back to U_xxxxxx key id
// For this first test, we ignore the keyCode and use the keyName
public static forUnicodeKeynames(Lkc: KeyEvent, ruleBehavior?: RuleBehavior) {
- let keyName = Lkc.kName;
+ const keyName = Lkc.kName;
// Test for fall back to U_xxxxxx key id
// For this first test, we ignore the keyCode and use the keyName
if(!keyName || keyName.substr(0,2) != 'U_') {
return null;
}
-
- var codePoint = parseInt(keyName.substr(2,6), 16);
- if (((0x0 <= codePoint) && (codePoint <= 0x1F)) || ((0x80 <= codePoint) && (codePoint <= 0x9F))) {
- // Code points [U_0000 - U_001F] and [U_0080 - U_009F] refer to Unicode C0 and C1 control codes.
- // Check the codePoint number and do not allow output of these codes via U_xxxxxx shortcuts.
- if(ruleBehavior) {
- ruleBehavior.errorLog = ("Suppressing Unicode control code: U_00" + codePoint.toString(16));
+
+ let result = '';
+ const codePoints = keyName.substr(2).split('_');
+ for(let codePoint of codePoints) {
+ const codePointValue = parseInt(codePoint, 16);
+ if (((0x0 <= codePointValue) && (codePointValue <= 0x1F)) || ((0x80 <= codePointValue) && (codePointValue <= 0x9F))) {
+ // Code points [U_0000 - U_001F] and [U_0080 - U_009F] refer to Unicode C0 and C1 control codes.
+ // Check the codePoint number and do not allow output of these codes via U_xxxxxx shortcuts.
+ if(ruleBehavior) {
+ ruleBehavior.errorLog = ("Suppressing Unicode control code in " + keyName);
+ }
+ // We'll attempt to add valid chars
+ continue;
+ } else {
+ // String.fromCharCode() is inadequate to handle the entire range of Unicode
+ // Someday after upgrading to ES2015, can use String.fromCodePoint()
+ result += String.kmwFromCharCode(codePointValue);
}
- return null;
- } else {
- // String.fromCharCode() is inadequate to handle the entire range of Unicode
- // Someday after upgrading to ES2015, can use String.fromCodePoint()
- return String.kmwFromCharCode(codePoint);
}
+ return result ? result : null;
}
// Test for otherwise unimplemented keys on the the base default & shift layers.
diff --git a/common/core/web/tools/recorder/package-lock.json b/common/core/web/tools/recorder/package-lock.json
index e1603cb48e..30e1db2eb9 100644
--- a/common/core/web/tools/recorder/package-lock.json
+++ b/common/core/web/tools/recorder/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/recorder-core",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/core/web/tools/recorder/package.json b/common/core/web/tools/recorder/package.json
index 2f7c2a0b29..f5ab9c16f0 100644
--- a/common/core/web/tools/recorder/package.json
+++ b/common/core/web/tools/recorder/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/recorder-core",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "Core classes used to develop KeymanWeb test cases based on keystrokes",
"main": "index.js",
"scripts": {
@@ -17,10 +17,10 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"dependencies": {
- "@keymanapp/keyboard-processor": "^15.0.129",
- "@keymanapp/models-types": "^15.0.129",
- "@keymanapp/web-environment": "^15.0.129",
- "@keymanapp/web-utils": "^15.0.129",
+ "@keymanapp/keyboard-processor": "^15.0.157",
+ "@keymanapp/models-types": "^15.0.157",
+ "@keymanapp/web-environment": "^15.0.157",
+ "@keymanapp/web-utils": "^15.0.157",
"@types/node": "^11.9.4"
},
"devDependencies": {
diff --git a/common/core/web/tools/sentry-manager/package-lock.json b/common/core/web/tools/sentry-manager/package-lock.json
index 4fe55838eb..bc01211ad5 100644
--- a/common/core/web/tools/sentry-manager/package-lock.json
+++ b/common/core/web/tools/sentry-manager/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-sentry-manager",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/common/core/web/tools/sentry-manager/package.json b/common/core/web/tools/sentry-manager/package.json
index edf5ba520a..067febe8ca 100644
--- a/common/core/web/tools/sentry-manager/package.json
+++ b/common/core/web/tools/sentry-manager/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-sentry-manager",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "Common setup for KeymanWeb's Sentry-based error reporting",
"main": "dist/index.js",
"scripts": {
@@ -20,7 +20,7 @@
"typescript": "^3.8.3"
},
"dependencies": {
- "@keymanapp/web-environment": "^15.0.129",
+ "@keymanapp/web-environment": "^15.0.157",
"@sentry/browser": "^5.27.4"
}
}
diff --git a/common/core/web/utils/package-lock.json b/common/core/web/utils/package-lock.json
index 765f063753..28773940b0 100644
--- a/common/core/web/utils/package-lock.json
+++ b/common/core/web/utils/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-utils",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/common/core/web/utils/package.json b/common/core/web/utils/package.json
index 6a3328ba13..82b6ba3cad 100644
--- a/common/core/web/utils/package.json
+++ b/common/core/web/utils/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/web-utils",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "Common utility functions used throughout other Keyman packages",
"main": "./dist/index.js",
"types": "./dist/index.d.ts",
@@ -20,8 +20,8 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"devDependencies": {
- "@keymanapp/resources-gosh": "^15.0.129",
- "@keymanapp/web-environment": "^15.0.129",
+ "@keymanapp/resources-gosh": "^15.0.157",
+ "@keymanapp/web-environment": "^15.0.157",
"@types/node": "^14.0.5",
"typescript": "^3.8.3"
}
diff --git a/common/models/templates/package-lock.json b/common/models/templates/package-lock.json
index 8947213ecd..e1ca01585a 100644
--- a/common/models/templates/package-lock.json
+++ b/common/models/templates/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-templates",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/models/templates/package.json b/common/models/templates/package.json
index b1f959a46f..8b3873c929 100644
--- a/common/models/templates/package.json
+++ b/common/models/templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-templates",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "Backing model implementations (templates) for Keyman's modelling layer",
"keywords": [
"lm",
@@ -42,8 +42,8 @@
"url": "https://github.com/keymanapp/keyman/issues"
},
"devDependencies": {
- "@keymanapp/models-types": "^15.0.129",
- "@keymanapp/web-utils": "^15.0.129",
+ "@keymanapp/models-types": "^15.0.157",
+ "@keymanapp/web-utils": "^15.0.157",
"@types/chai": "^4.2.11",
"@types/mocha": "^7.0.2",
"@types/node": "^14.0.4",
@@ -52,6 +52,6 @@
"typescript": "^3.8.3"
},
"dependencies": {
- "@keymanapp/models-wordbreakers": "^15.0.129"
+ "@keymanapp/models-wordbreakers": "^15.0.157"
}
}
diff --git a/common/models/types/package-lock.json b/common/models/types/package-lock.json
index f022c3a6b9..9e3a35de44 100644
--- a/common/models/types/package-lock.json
+++ b/common/models/types/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-types",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
diff --git a/common/models/types/package.json b/common/models/types/package.json
index b4c5a2462f..a80ba99874 100644
--- a/common/models/types/package.json
+++ b/common/models/types/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-types",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "Type definitions in used in the modeling (lexical model/predictive text) component of Keyman.",
"types": "./index.d.ts",
"scripts": {
diff --git a/common/models/wordbreakers/package-lock.json b/common/models/wordbreakers/package-lock.json
index 52f7050946..4d20b2847c 100644
--- a/common/models/wordbreakers/package-lock.json
+++ b/common/models/wordbreakers/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-wordbreakers",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/models/wordbreakers/package.json b/common/models/wordbreakers/package.json
index 884b4c8f6c..a6aa0209b6 100644
--- a/common/models/wordbreakers/package.json
+++ b/common/models/wordbreakers/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/models-wordbreakers",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "Word breakers bundled in the modeling layer",
"keywords": [
"lexical model",
@@ -40,7 +40,7 @@
"url": "https://github.com/keymanapp/keyman/issues"
},
"devDependencies": {
- "@keymanapp/models-types": "^15.0.129",
+ "@keymanapp/models-types": "^15.0.157",
"@types/chai": "^4.2.11",
"@types/mocha": "^7.0.2",
"chai": "^4.3.4",
diff --git a/common/predictive-text/package-lock.json b/common/predictive-text/package-lock.json
index 58f7f52c2e..d2c8b344fa 100644
--- a/common/predictive-text/package-lock.json
+++ b/common/predictive-text/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-layer",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 2,
"requires": true,
"packages": {
diff --git a/common/predictive-text/package.json b/common/predictive-text/package.json
index f151a92b7a..c03185b880 100644
--- a/common/predictive-text/package.json
+++ b/common/predictive-text/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-layer",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "Keyman/Predictive Text integration layer",
"main": "build/index.js",
"scripts": {
@@ -21,8 +21,8 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"devDependencies": {
- "@keymanapp/models-types": "^15.0.129",
- "@keymanapp/resources-gosh": "^15.0.129",
+ "@keymanapp/models-types": "^15.0.157",
+ "@keymanapp/resources-gosh": "^15.0.157",
"@types/node": "^10.17.21",
"chai": "^4.3.4",
"karma": "^6.3.4",
@@ -46,10 +46,10 @@
"typescript": "^3.8.3"
},
"dependencies": {
- "@keymanapp/models-templates": "^15.0.129",
- "@keymanapp/models-wordbreakers": "^15.0.129",
- "@keymanapp/web-environment": "^15.0.129",
- "@keymanapp/web-utils": "^15.0.129",
+ "@keymanapp/models-templates": "^15.0.157",
+ "@keymanapp/models-wordbreakers": "^15.0.157",
+ "@keymanapp/web-environment": "^15.0.157",
+ "@keymanapp/web-utils": "^15.0.157",
"es6-shim": "^0.35.5",
"string.prototype.codepointat": "^0.2.1",
"string.prototype.startswith": "^0.2.0"
diff --git a/common/schemas/kps/README.md b/common/schemas/kps/README.md
new file mode 100644
index 0000000000..4322a28bf6
--- /dev/null
+++ b/common/schemas/kps/README.md
@@ -0,0 +1,6 @@
+# kps.xsd
+
+Master version: https://github.com/keymanapp/api.keyman.com/blob/master/schemas/kps/7.0/kps.xsd
+
+## 2021-07-19 7.0
+* Initial version 7.0
diff --git a/common/schemas/kps/kps.xsd b/common/schemas/kps/kps.xsd
new file mode 100644
index 0000000000..adbdc36178
--- /dev/null
+++ b/common/schemas/kps/kps.xsd
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/common/test/keyboards/.gitignore b/common/test/keyboards/.gitignore
new file mode 100644
index 0000000000..ef4be49c85
--- /dev/null
+++ b/common/test/keyboards/.gitignore
@@ -0,0 +1 @@
+*/build/
\ No newline at end of file
diff --git a/common/test/keyboards/u_xxxx_yyyy_2858/HISTORY.md b/common/test/keyboards/u_xxxx_yyyy_2858/HISTORY.md
new file mode 100644
index 0000000000..fa38145cc5
--- /dev/null
+++ b/common/test/keyboards/u_xxxx_yyyy_2858/HISTORY.md
@@ -0,0 +1,6 @@
+U_xxxx_yyyy_2858 Change History
+====================
+
+1.0 (2021-11-11)
+----------------
+* Created by
diff --git a/windows/src/test/manual-tests/caps_lock_headers/LICENSE.md b/common/test/keyboards/u_xxxx_yyyy_2858/LICENSE.md
similarity index 99%
rename from windows/src/test/manual-tests/caps_lock_headers/LICENSE.md
rename to common/test/keyboards/u_xxxx_yyyy_2858/LICENSE.md
index 714cb32594..77a9531492 100644
--- a/windows/src/test/manual-tests/caps_lock_headers/LICENSE.md
+++ b/common/test/keyboards/u_xxxx_yyyy_2858/LICENSE.md
@@ -1,6 +1,6 @@
The MIT License (MIT)
-©
+© 2021
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/windows/src/test/manual-tests/caps_lock_headers/README.md b/common/test/keyboards/u_xxxx_yyyy_2858/README.md
similarity index 60%
rename from windows/src/test/manual-tests/caps_lock_headers/README.md
rename to common/test/keyboards/u_xxxx_yyyy_2858/README.md
index bc3b3b42ea..1fe1e53fe5 100644
--- a/windows/src/test/manual-tests/caps_lock_headers/README.md
+++ b/common/test/keyboards/u_xxxx_yyyy_2858/README.md
@@ -1,17 +1,19 @@
-caps_lock_shift_frees_caps keyboard
+U_xxxx_yyyy_2858 keyboard
==============
-©
-
Version 1.0
Description
-----------
-
-caps_lock_shift_frees_caps generated from template
+U_xxxx_yyyy_2858 generated from template
Links
-----
+https://github.com/keymanapp/keyman/issues/2858
+
+Copyright
+---------
+See [LICENSE.md](LICENSE.md)
Supported Platforms
-------------------
diff --git a/common/test/keyboards/u_xxxx_yyyy_2858/source/NotoSansOldItalic-Regular.ttf b/common/test/keyboards/u_xxxx_yyyy_2858/source/NotoSansOldItalic-Regular.ttf
new file mode 100644
index 0000000000..97b184c228
Binary files /dev/null and b/common/test/keyboards/u_xxxx_yyyy_2858/source/NotoSansOldItalic-Regular.ttf differ
diff --git a/common/test/keyboards/u_xxxx_yyyy_2858/source/OFL.txt b/common/test/keyboards/u_xxxx_yyyy_2858/source/OFL.txt
new file mode 100644
index 0000000000..c9857270cc
--- /dev/null
+++ b/common/test/keyboards/u_xxxx_yyyy_2858/source/OFL.txt
@@ -0,0 +1,93 @@
+Copyright 2012 Google Inc. All Rights Reserved.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/windows/src/test/manual-tests/caps_lock_headers/source/readme.htm b/common/test/keyboards/u_xxxx_yyyy_2858/source/readme.htm
similarity index 62%
rename from windows/src/test/manual-tests/caps_lock_headers/source/readme.htm
rename to common/test/keyboards/u_xxxx_yyyy_2858/source/readme.htm
index 3e2679017c..642ac5d815 100644
--- a/windows/src/test/manual-tests/caps_lock_headers/source/readme.htm
+++ b/common/test/keyboards/u_xxxx_yyyy_2858/source/readme.htm
@@ -2,7 +2,8 @@
- caps_lock_shift_frees_caps
+
+ U_xxxx_yyyy_2858
+
+
+
+Start Using U_xxxx_yyyy_2858
+
+
+ U_xxxx_yyyy_2858 1.0 generated from template.
+
+
+Keyboard Layout
+
+
+
+
+
\ No newline at end of file
diff --git a/common/test/keyboards/u_xxxx_yyyy_2858/u_xxxx_yyyy_2858.keyboard_info b/common/test/keyboards/u_xxxx_yyyy_2858/u_xxxx_yyyy_2858.keyboard_info
new file mode 100644
index 0000000000..03c280d309
--- /dev/null
+++ b/common/test/keyboards/u_xxxx_yyyy_2858/u_xxxx_yyyy_2858.keyboard_info
@@ -0,0 +1,7 @@
+{
+ "license": "mit",
+ "languages": [
+
+ ],
+ "description": "U_xxxx_yyyy_2858 generated from template"
+}
diff --git a/common/test/keyboards/u_xxxx_yyyy_2858/u_xxxx_yyyy_2858.kpj b/common/test/keyboards/u_xxxx_yyyy_2858/u_xxxx_yyyy_2858.kpj
new file mode 100644
index 0000000000..f2b44703b1
--- /dev/null
+++ b/common/test/keyboards/u_xxxx_yyyy_2858/u_xxxx_yyyy_2858.kpj
@@ -0,0 +1,102 @@
+
+
+
+ $PROJECTPATH\build
+ True
+ True
+ True
+ keyboard
+
+
+
+ id_7e810b4833243057b00c8d803899b99f
+ u_xxxx_yyyy_2858.kmn
+ source\u_xxxx_yyyy_2858.kmn
+ 1.0
+ .kmn
+
+ U_xxxx_yyyy_2858
+ ©
+
+
+
+ id_e45c659d6b3f6aa669e8d9488bf2602d
+ u_xxxx_yyyy_2858.kps
+ source\u_xxxx_yyyy_2858.kps
+
+ .kps
+
+ U_xxxx_yyyy_2858
+ ©
+
+
+
+ id_ede98e4633e239f933cbfd1f4e1b766c
+ HISTORY.md
+ HISTORY.md
+
+ .md
+
+
+ id_53e892b8b41cc4caece1cfd5ef21d6e7
+ LICENSE.md
+ LICENSE.md
+
+ .md
+
+
+ id_0730bb7c2e8f9ea2438b52e419dd86c9
+ README.md
+ README.md
+
+ .md
+
+
+ id_10a5cd9d0c42cd03b9838916f6f0bd3d
+ u_xxxx_yyyy_2858.keyboard_info
+ u_xxxx_yyyy_2858.keyboard_info
+
+ .keyboard_info
+
+
+ id_a1200478ad69b7f058fdce369fb1d960
+ u_xxxx_yyyy_2858.kmx
+ source\..\build\u_xxxx_yyyy_2858.kmx
+
+ .kmx
+ id_e45c659d6b3f6aa669e8d9488bf2602d
+
+
+ id_e3aacd883345f12f694ac409407de6da
+ u_xxxx_yyyy_2858.js
+ source\..\build\u_xxxx_yyyy_2858.js
+
+ .js
+ id_e45c659d6b3f6aa669e8d9488bf2602d
+
+
+ id_6c1c142b76341666d0679b0979b76793
+ u_xxxx_yyyy_2858.kvk
+ source\..\build\u_xxxx_yyyy_2858.kvk
+
+ .kvk
+ id_e45c659d6b3f6aa669e8d9488bf2602d
+
+
+ id_356e5d149c1e539356d72698c1e401a6
+ welcome.htm
+ source\welcome.htm
+
+ .htm
+ id_e45c659d6b3f6aa669e8d9488bf2602d
+
+
+ id_8da344c4cea6f467013357fe099006f5
+ readme.htm
+ source\readme.htm
+
+ .htm
+ id_e45c659d6b3f6aa669e8d9488bf2602d
+
+
+
diff --git a/crowdin.yml b/crowdin.yml
index 08cdd98927..fcfdbc77bc 100644
--- a/crowdin.yml
+++ b/crowdin.yml
@@ -95,6 +95,31 @@ files:
type: gettext
update_option: update_as_unapproved
+ # macOS files
+
+ - source: /mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/en.lproj/KMAboutWindowController.strings
+ dest: /mac/app/KMAboutWindowController.strings
+ translation: /mac/Keyman4MacIM/Keyman4MacIM/KMAboutWindow/%osx_code%/%original_file_name%
+
+ - source: /mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/en.lproj/preferences.strings
+ dest: /mac/app/preferences.strings
+ translation: /mac/Keyman4MacIM/Keyman4MacIM/KMConfiguration/%osx_code%/%original_file_name%
+
+ - source: /mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/en.lproj/KMInfoWindowController.strings
+ dest: /mac/app/KMInfoWindowController.strings
+ translation: /mac/Keyman4MacIM/Keyman4MacIM/KMInfoWindow/%osx_code%/%original_file_name%
+
+ - source: /mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/en.lproj/KMKeyboardHelpWindowController.strings
+ dest: /mac/app/KMKeyboardHelpWindowController.strings
+ translation: /mac/Keyman4MacIM/Keyman4MacIM/KMKeyboardHelpWindow/%osx_code%/%original_file_name%
+
+ - source: /mac/Keyman4MacIM/Keyman4MacIM/en.lproj/Localizable.strings
+ dest: /mac/app/Localizable.strings
+ translation: /mac/Keyman4MacIM/Keyman4MacIM/%osx_code%/%original_file_name%
+
+ - source: /mac/Keyman4MacIM/Keyman4MacIM/en.lproj/MainMenu.strings
+ dest: /mac/app/MainMenu.strings
+ translation: /mac/Keyman4MacIM/Keyman4MacIM/%osx_code%/%original_file_name%
# crowdin parameters descriptions:
diff --git a/developer/js/package-lock.json b/developer/js/package-lock.json
index eb40320893..d923b69ab1 100644
--- a/developer/js/package-lock.json
+++ b/developer/js/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "@keymanapp/lexical-model-compiler",
- "version": "15.0.129",
+ "version": "15.0.157",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "@keymanapp/lexical-model-compiler",
- "version": "15.0.50",
+ "version": "15.0.121",
"license": "MIT",
"dependencies": {
"commander": "^3.0.0",
@@ -23,7 +23,7 @@
"@types/node": "^10.14.6",
"@types/xml2js": "^0.4.5",
"chalk": "^2.4.2",
- "jszip": "^2.5.0"
+ "jszip": "^3.7.0"
},
"engines": {
"node": ">=12.0.0"
@@ -227,14 +227,107 @@
}
},
"node_modules/jszip": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz",
- "integrity": "sha1-dET9hVHd8+XacZj+oMkbyDCMwnQ=",
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
+ "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
"dev": true,
"dependencies": {
- "pako": "~0.2.5"
+ "lie": "~3.3.0",
+ "pako": "~1.0.2",
+ "readable-stream": "~2.3.6",
+ "set-immediate-shim": "~1.0.1"
}
},
+ "node_modules/jszip/node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "node_modules/jszip/node_modules/immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
+ "dev": true
+ },
+ "node_modules/jszip/node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/jszip/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "node_modules/jszip/node_modules/lie": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+ "dev": true,
+ "dependencies": {
+ "immediate": "~3.0.5"
+ }
+ },
+ "node_modules/jszip/node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true
+ },
+ "node_modules/jszip/node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/jszip/node_modules/readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/jszip/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/jszip/node_modules/set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/jszip/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/jszip/node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
"node_modules/object-inspect": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz",
@@ -260,12 +353,6 @@
"node": ">= 0.8"
}
},
- "node_modules/pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
- "dev": true
- },
"node_modules/sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
@@ -498,12 +585,104 @@
}
},
"jszip": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz",
- "integrity": "sha1-dET9hVHd8+XacZj+oMkbyDCMwnQ=",
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
+ "integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
"dev": true,
"requires": {
- "pako": "~0.2.5"
+ "lie": "~3.3.0",
+ "pako": "~1.0.2",
+ "readable-stream": "~2.3.6",
+ "set-immediate-shim": "~1.0.1"
+ },
+ "dependencies": {
+ "core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=",
+ "dev": true
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "lie": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+ "dev": true,
+ "requires": {
+ "immediate": "~3.0.5"
+ }
+ },
+ "pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "set-immediate-shim": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+ "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
+ "dev": true
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ }
}
},
"object-inspect": {
@@ -525,12 +704,6 @@
"es-abstract": "^1.5.1"
}
},
- "pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
- "dev": true
- },
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
diff --git a/developer/js/package.json b/developer/js/package.json
index dcb75bc0c4..115d2e60c6 100644
--- a/developer/js/package.json
+++ b/developer/js/package.json
@@ -1,6 +1,6 @@
{
"name": "@keymanapp/lexical-model-compiler",
- "version": "15.0.129",
+ "version": "15.0.157",
"description": "Keyman Developer lexical model compiler",
"keywords": [
"keyboard",
@@ -37,21 +37,21 @@
"node": ">=12.0.0"
},
"dependencies": {
- "@keymanapp/models-types": "^15.0.129",
+ "@keymanapp/models-types": "^15.0.157",
"commander": "^3.0.0",
"typescript": "^3.8.3",
"xml2js": "^0.4.19"
},
"devDependencies": {
- "@keymanapp/models-templates": "^15.0.129",
- "@keymanapp/models-wordbreakers": "^15.0.129",
+ "@keymanapp/models-templates": "^15.0.157",
+ "@keymanapp/models-wordbreakers": "^15.0.157",
"@types/chai": "^4.1.7",
"@types/mocha": "^5.2.7",
"@types/node": "^10.14.6",
"@types/xml2js": "^0.4.5",
"chai": "^4.3.4",
"chalk": "^2.4.2",
- "jszip": "^2.5.0",
+ "jszip": "^3.7.0",
"mocha": "^8.4.0",
"ts-node": "^9.1.1"
},
diff --git a/developer/js/source/jszip.d.ts b/developer/js/source/jszip.d.ts
deleted file mode 100644
index 64735dada5..0000000000
--- a/developer/js/source/jszip.d.ts
+++ /dev/null
@@ -1,262 +0,0 @@
-// Definitions by: mzeiher , forabi , eddieantonio
-// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
-// TypeScript Version: 2.3
-
-///
-
-interface JSZipSupport {
- arraybuffer: boolean;
- uint8array: boolean;
- blob: boolean;
- nodebuffer: boolean;
-}
-
-type Compression = 'STORE' | 'DEFLATE';
-
-interface Metadata {
- percent: number;
- currentFile: string;
-}
-
-type OnUpdateCallback = (metadata: Metadata) => void;
-
-interface InputByType {
- base64: string;
- string: string;
- text: string;
- binarystring: string;
- array: number[];
- uint8array: Uint8Array;
- arraybuffer: ArrayBuffer;
- blob: Blob;
- stream: NodeJS.ReadableStream;
-}
-
-interface OutputByType {
- base64: string;
- text: string;
- binarystring: string;
- array: number[];
- uint8array: Uint8Array;
- arraybuffer: ArrayBuffer;
- blob: Blob;
- nodebuffer: Buffer;
-}
-
-type InputFileFormat = InputByType[keyof InputByType];
-
-type InputType = keyof InputByType;
-
-type OutputType = keyof OutputByType;
-
-interface JSZipObject {
- name: string;
- dir: boolean;
- date: Date;
- comment: string;
- /** The UNIX permissions of the file, if any. */
- unixPermissions: number | string | null;
- /** The UNIX permissions of the file, if any. */
- dosPermissions: number | null;
- options: JSZipObjectOptions;
-
- /**
- * Prepare the content in the asked type.
- * @param type the type of the result.
- * @param onUpdate a function to call on each internal update.
- * @return Promise the promise of the result.
- */
- async(type: T, onUpdate?: OnUpdateCallback): Promise;
- nodeStream(type?: 'nodestream', onUpdate?: OnUpdateCallback): NodeJS.ReadableStream;
-}
-
-interface JSZipFileOptions {
- /** Set to `true` if the data is `base64` encoded. For example image data from a `