diff --git a/common/web/keyboard-processor/build.sh b/common/web/keyboard-processor/build.sh
deleted file mode 100755
index 964370c2fbf..00000000000
--- a/common/web/keyboard-processor/build.sh
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/usr/bin/env bash
-#
-# Compile KeymanWeb's 'keyboard-processor' module, one of the components of Web's 'core' module.
-#
-## START STANDARD BUILD SCRIPT INCLUDE
-# adjust relative paths as necessary
-THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
-. "${THIS_SCRIPT%/*}/../../../resources/build/builder.inc.sh"
-## END STANDARD BUILD SCRIPT INCLUDE
-
-. "${KEYMAN_ROOT}/resources/shellHelperFunctions.sh"
-
-BUNDLE_CMD="node ${KEYMAN_ROOT}/common/web/es-bundling/build/common-bundle.mjs"
-
-################################ Main script ################################
-
-builder_describe \
- "Compiles the web-oriented utility function module." \
- "@/web/src/tools/testing/recorder-core test" \
- "@/web/src/engine/js-processor test" \
- "@/common/web/keyman-version" \
- "@/common/web/es-bundling" \
- "@/common/web/types" \
- "@/common/web/utils" \
- configure \
- clean \
- build \
- test \
- "--ci For use with action $(builder_term test) - emits CI-friendly test reports"
-
-builder_describe_outputs \
- configure /node_modules \
- build /common/web/keyboard-processor/build/lib/index.mjs
-
-builder_parse "$@"
-
-function do_configure() {
- verify_npm_setup
-
- # Configure Web browser-engine testing environments. As is, this should only
- # make changes when we update the dependency, even on our CI build agents.
- playwright install
-}
-
-function do_build() {
- tsc --build "${THIS_SCRIPT_PATH}/tsconfig.all.json"
-
- # Base product - the main keyboard processor
- builder_echo "Bundle base product - the main keyboard processor"
- ${BUNDLE_CMD} "${KEYMAN_ROOT}/common/web/keyboard-processor/build/obj/index.js" \
- --out "${KEYMAN_ROOT}/common/web/keyboard-processor/build/lib/index.mjs" \
- --format esm
-
- # The DOM-oriented keyboard loader
- builder_echo "Bundle the DOM-oriented keyboard loader"
- ${BUNDLE_CMD} "${KEYMAN_ROOT}/common/web/keyboard-processor/build/obj/keyboards/loaders/dom-keyboard-loader.js" \
- --out "${KEYMAN_ROOT}/common/web/keyboard-processor/build/lib/dom-keyboard-loader.mjs" \
- --format esm
-
- # The Node-oriented keyboard loader
- builder_echo "Bundle the Node-oriented keyboard loader"
- ${BUNDLE_CMD} "${KEYMAN_ROOT}/common/web/keyboard-processor/build/obj/keyboards/loaders/node-keyboard-loader.js" \
- --out "${KEYMAN_ROOT}/common/web/keyboard-processor/build/lib/node-keyboard-loader.mjs" \
- --format esm \
- --platform node
-
- # Tests
- # builder_echo "Bundle tests"
- # ${BUNDLE_CMD} "${KEYMAN_ROOT}/common/web/keyboard-processor/build/tests/dom/cases/domKeyboardLoader.spec.js" \
- # --out "${KEYMAN_ROOT}/common/web/keyboard-processor/build/tests/dom/domKeyboardLoader.spec.mjs" \
- # --format esm
-
- # Declaration bundling.
- builder_echo "Declaration bundling"
- tsc --emitDeclarationOnly --outFile ./build/lib/index.d.ts
- tsc --emitDeclarationOnly --outFile ./build/lib/dom-keyboard-loader.d.ts -p src/keyboards/loaders/tsconfig.dom.json
- tsc --emitDeclarationOnly --outFile ./build/lib/node-keyboard-loader.d.ts -p src/keyboards/loaders/tsconfig.node.json
-}
-
-function do_test() {
- local MOCHA_FLAGS=
- local WTR_CONFIG=
- if builder_has_option --ci; then
- echo "Replacing user-friendly test reports with CI-friendly versions."
- MOCHA_FLAGS="$MOCHA_FLAGS --reporter mocha-teamcity-reporter"
- WTR_CONFIG=.CI
- fi
-
- c8 mocha --recursive $MOCHA_FLAGS ./tests/node/
- web-test-runner --config tests/dom/web-test-runner${WTR_CONFIG}.config.mjs
-}
-
-builder_run_action configure do_configure
-builder_run_action clean rm -rf ./build
-builder_run_action build do_build
-# builder_run_action test do_test
diff --git a/common/web/keyboard-processor/package.json b/common/web/keyboard-processor/package.json
deleted file mode 100644
index 3f0a5958970..00000000000
--- a/common/web/keyboard-processor/package.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
- "name": "@keymanapp/keyboard-processor",
- "description": "Core module for Keyman keyboard support in KeymanWeb.",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/keymanapp/keyman.git"
- },
- "keywords": [
- "input",
- "languages",
- "keyboards"
- ],
- "author": "SIL International",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/keymanapp/keyman/issues"
- },
- "homepage": "https://github.com/keymanapp/keyman#readme",
- "devDependencies": {
- "@keymanapp/resources-gosh": "*",
- "c8": "^7.12.0",
- "mocha": "^10.0.0",
- "mocha-teamcity-reporter": "^4.0.0",
- "typescript": "^5.4.5"
- },
- "scripts": {
- "build": "gosh build.sh",
- "clean": "gosh build.sh clean",
- "test": "gosh build.sh test"
- },
- "dependencies": {
- "@keymanapp/common-types": "*",
- "@keymanapp/models-types": "*",
- "@keymanapp/keyman-version": "*",
- "@keymanapp/web-utils": "*"
- },
- "type": "module",
- "main": "./build/obj/index.js",
- "types": "./build/obj/index.d.ts",
- "exports": {
- ".": {
- "es6-bundling": "./src/index.ts",
- "default": "./build/obj/index.js"
- },
- "./node-keyboard-loader": {
- "es6-bundling": "./src/keyboards/loaders/node-keyboard-loader.ts",
- "types": "./build/obj/keyboards/loaders/node-keyboard-loader.d.ts",
- "import": "./build/obj/keyboards/loaders/node-keyboard-loader.js"
- },
- "./dom-keyboard-loader": {
- "es6-bundling": "./src/keyboards/loaders/dom-keyboard-loader.ts",
- "types": "./build/obj/keyboards/loaders/dom-keyboard-loader.d.ts",
- "import": "./build/obj/keyboards/loaders/dom-keyboard-loader.js"
- },
- "./lib": {
- "types": "./build/lib/index.d.ts",
- "import": "./build/lib/index.mjs"
- },
- "./lib/node-keyboard-loader": {
- "types": "./build/lib/node-keyboard-loader.d.ts",
- "import": "./build/lib/node-keyboard-loader.mjs"
- },
- "./lib/dom-keyboard-loader": {
- "types": "./build/lib/dom-keyboard-loader.d.ts",
- "import": "./build/lib/dom-keyboard-loader.mjs"
- },
- "./obj/*.js": "./build/obj/*.js"
- }
-}
diff --git a/common/web/keyboard-processor/src/keyboards/loaders/tsconfig.dom.json b/common/web/keyboard-processor/src/keyboards/loaders/tsconfig.dom.json
deleted file mode 100644
index 7ba2abe026a..00000000000
--- a/common/web/keyboard-processor/src/keyboards/loaders/tsconfig.dom.json
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "extends": "../../../../tsconfig.kmw-main-base.json",
- "compilerOptions": {
- "baseUrl": "../../../",
- "outDir": "../../../build/obj/keyboards/loaders/",
- "tsBuildInfoFile": "../../../build/obj/keyboards/loaders/tsconfig.dom.tsbuildinfo",
- "rootDir": "."
- },
- "references": [
- { "path": "../../../tsconfig.json" }
- ],
- "include": ["dom-keyboard-loader.ts", "domKeyboardLoader.ts"],
-}
diff --git a/common/web/keyboard-processor/src/keyboards/loaders/tsconfig.node.json b/common/web/keyboard-processor/src/keyboards/loaders/tsconfig.node.json
deleted file mode 100644
index 0be3f169ad3..00000000000
--- a/common/web/keyboard-processor/src/keyboards/loaders/tsconfig.node.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "extends": "../../../../tsconfig.kmw-main-base.json",
- "compilerOptions": {
- "types": [ "node" ],
- "baseUrl": "../../../",
- "outDir": "../../../build/obj/keyboards/loaders/",
- "tsBuildInfoFile": "../../../build/obj/keyboards/loaders/tsconfig.node.tsbuildinfo",
- "rootDir": "."
- },
- "references": [
- { "path": "../../../tsconfig.json" }
- ],
- "include": ["node-keyboard-loader.ts", "nodeKeyboardLoader.ts"],
-}
diff --git a/common/web/keyboard-processor/tsconfig.json b/common/web/keyboard-processor/tsconfig.json
deleted file mode 100644
index 728935b74f6..00000000000
--- a/common/web/keyboard-processor/tsconfig.json
+++ /dev/null
@@ -1,18 +0,0 @@
-// Is used by the keyboard-loader submodules.
-{
- "extends": "../tsconfig.kmw-main-base.json",
- "compilerOptions": {
- "baseUrl": "./",
- "outDir": "build/obj/",
- "tsBuildInfoFile": "build/obj/tsconfig.tsbuildinfo",
- "rootDir": "./src/"
- },
- "references": [
- { "path": "../types" },
- { "path": "../../models/types" },
- { "path": "../keyman-version/" },
- { "path": "../utils/" }
- ],
- "include": [ "./src/**/*.ts"],
- "exclude": ["./src/keyboards/loaders/**/*.ts"]
-}
diff --git a/common/web/types/src/keyman-touch-layout/keyman-touch-layout-file.ts b/common/web/types/src/keyman-touch-layout/keyman-touch-layout-file.ts
index 757316a70a9..786d9213e2b 100644
--- a/common/web/types/src/keyman-touch-layout/keyman-touch-layout-file.ts
+++ b/common/web/types/src/keyman-touch-layout/keyman-touch-layout-file.ts
@@ -58,7 +58,7 @@ export const PRIVATE_USE_IDS = [
] as const;
/* A map of key field names with values matching the `typeof` the corresponding property
- * exists in common/web/keyboard-processor, keyboards/activeLayout.ts.
+ * exists in /web/src/engine/keyboard/src/keyboards/activeLayout.ts.
*
* Make sure that when one is updated, the other also is. TS types are compile-time only,
* so the run-time-accessible mapping in activeLayout.ts cannot be auto-generated by TS. */
diff --git a/package-lock.json b/package-lock.json
index 90947948310..f6ea28257a3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -191,23 +191,6 @@
"typescript": "^5.4.5"
}
},
- "common/web/keyboard-processor": {
- "name": "@keymanapp/keyboard-processor",
- "license": "MIT",
- "dependencies": {
- "@keymanapp/common-types": "*",
- "@keymanapp/keyman-version": "*",
- "@keymanapp/models-types": "*",
- "@keymanapp/web-utils": "*"
- },
- "devDependencies": {
- "@keymanapp/resources-gosh": "*",
- "c8": "^7.12.0",
- "mocha": "^10.0.0",
- "mocha-teamcity-reporter": "^4.0.0",
- "typescript": "^5.4.5"
- }
- },
"common/web/keyman-version": {
"name": "@keymanapp/keyman-version",
"license": "MIT",
@@ -2868,10 +2851,6 @@
"resolved": "common/tools/hextobin",
"link": true
},
- "node_modules/@keymanapp/keyboard-processor": {
- "resolved": "common/web/keyboard-processor",
- "link": true
- },
"node_modules/@keymanapp/keyman-version": {
"resolved": "common/web/keyman-version",
"link": true
@@ -14821,7 +14800,6 @@
"name": "keyman",
"license": "MIT",
"dependencies": {
- "@keymanapp/keyboard-processor": "*",
"@keymanapp/keyman-version": "*",
"@keymanapp/lexical-model-layer": "*",
"@keymanapp/models-types": "*",
diff --git a/tsconfig.base.json b/tsconfig.base.json
index e34839a52ce..c4e0599eef6 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -26,7 +26,6 @@
"paths": {
"@keymanapp/common-types": ["./common/web/types/src/main"],
- "@keymanapp/keyboard-processor": ["./common/web/keyboard-processor/src"],
"@keymanapp/keyman": ["./web" ],
"@keymanapp/models-types": ["./common/models/types"],
"@keymanapp/models-templates": ["./common/models/templates"],
diff --git a/tsconfig.json b/tsconfig.json
index 093cec46f4a..8e6596a2312 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -10,7 +10,6 @@
{ "path": "./common/web/gesture-recognizer/tsconfig.json" },
{ "path": "./common/web/gesture-recognizer/src/tools/unit-test-resources/tsconfig.json" },
- { "path": "./common/web/keyboard-processor/tsconfig.json" },
{ "path": "./common/web/keyman-version" },
{ "path": "./common/web/lm-message-types/" },
{ "path": "./common/web/lm-worker/" },
diff --git a/web/README.md b/web/README.md
index 775f303df5c..7cd9e02f002 100644
--- a/web/README.md
+++ b/web/README.md
@@ -81,7 +81,7 @@ title: Dependency Graph
%%{init: {"flowchart": {"htmlLabels": false}} }%%
graph TD;
OSK["/web/src/engine/osk"];
- KP["@keymanapp/keyboard-processor
(/common/web/keyboard-processor)"];
+ KP["/web/src/engine/keyboard"];
JSProc["/web/src/engine/js-processor"];
OSK-->KP;
WebUtils["@keymanapp/web-utils
(/common/web/utils)"];
@@ -119,7 +119,7 @@ graph TD;
Device["/web/src/engine/device-detect"];
Device----->WebUtils;
Elements["/web/src/engine/element-wrappers"];
- Elements-->KP;
+ Elements-->JSProc;
KeyboardCache["/web/src/engine/package-cache"];
KeyboardCache-->Interfaces;
DomUtils["/web/src/engine/dom-utils"];
diff --git a/web/build.sh b/web/build.sh
index 6f4737710a3..c3e17e9d433 100755
--- a/web/build.sh
+++ b/web/build.sh
@@ -28,6 +28,7 @@ builder_describe "Builds engine modules for Keyman Engine for Web (KMW)." \
":engine/events Specialized classes utilized to support KMW API events" \
":engine/element-wrappers Subset used to integrate with website elements" \
":engine/js-processor Build JS processor for KMW" \
+ ":engine/keyboard Builds KMW's keyboard-loading and caching code" \
":engine/main Builds all common code used by KMW's app/-level targets" \
":engine/osk Builds the Web OSK module" \
":engine/package-cache Subset used to collate keyboards and request them from the cloud" \
@@ -59,6 +60,7 @@ builder_describe_outputs \
build:engine/events "/web/build/engine/events/lib/index.mjs" \
build:engine/element-wrappers "/web/build/engine/element-wrappers/lib/index.mjs" \
build:engine/js-processor "/web/build/engine/js-processor/lib/index.mjs" \
+ build:engine/keyboard "/web/build/engine/keyboard/lib/index.mjs" \
build:engine/main "/web/build/engine/main/lib/index.mjs" \
build:engine/osk "/web/build/engine/osk/lib/index.mjs" \
build:engine/package-cache "/web/build/engine/package-cache/lib/index.mjs" \
diff --git a/web/ci.sh b/web/ci.sh
index 6e5bc3b06ac..5e26a1e30e2 100755
--- a/web/ci.sh
+++ b/web/ci.sh
@@ -85,7 +85,7 @@ if builder_start_action test; then
# No --reporter option exists yet for the headless modules.
- "$KEYMAN_ROOT/common/web/keyboard-processor/build.sh" test $OPTIONS
+ "$KEYMAN_ROOT/web/src/engine/keyboard/build.sh" test $OPTIONS
"$KEYMAN_ROOT/common/web/gesture-recognizer/test.sh" $OPTIONS
./build.sh test $OPTIONS
diff --git a/web/package.json b/web/package.json
index 4baff29490d..b5727dd0095 100644
--- a/web/package.json
+++ b/web/package.json
@@ -42,6 +42,21 @@
"types": "./build/engine/js-processor/obj/index.d.ts",
"import": "./build/engine/js-processor/obj/index.js"
},
+ "./engine/keyboard": {
+ "es6-bundling": "./src/engine/keyboard/src/index.ts",
+ "types": "./build/engine/keyboard/obj/index.d.ts",
+ "import": "./build/engine/keyboard/obj/index.js"
+ },
+ "./engine/keyboard/node-keyboard-loader": {
+ "es6-bundling": "./src/engine/keyboard/src/keyboards/loaders/node-keyboard-loader.ts",
+ "types": "./build/engine/keyboard/obj/keyboards/loaders/node-keyboard-loader.d.ts",
+ "import": "./build/engine/keyboard/obj/keyboards/loaders/node-keyboard-loader.js"
+ },
+ "./engine/keyboard/dom-keyboard-loader": {
+ "es6-bundling": "./src/engine/keyboard/src/keyboards/loaders/dom-keyboard-loader.ts",
+ "types": "./build/engine/keyboard/obj/keyboards/loaders/dom-keyboard-loader.d.ts",
+ "import": "./build/engine/keyboard/obj/keyboards/loaders/dom-keyboard-loader.js"
+ },
"./engine/package-cache": {
"es6-bundling": "./src/engine/package-cache/src/index.ts",
"types": "./build/engine/package-cache/obj/index.d.ts",
@@ -104,7 +119,6 @@
"test": "gosh ./test.sh"
},
"dependencies": {
- "@keymanapp/keyboard-processor": "*",
"@keymanapp/keyman-version": "*",
"@keymanapp/lexical-model-layer": "*",
"@keymanapp/models-types": "*",
diff --git a/web/src/app/browser/src/configuration.ts b/web/src/app/browser/src/configuration.ts
index 4f2f2684388..df2153df828 100644
--- a/web/src/app/browser/src/configuration.ts
+++ b/web/src/app/browser/src/configuration.ts
@@ -1,8 +1,7 @@
import { EngineConfiguration, InitOptionSpec, InitOptionDefaults } from "keyman/engine/main";
import { OutputTarget as DOMOutputTarget } from 'keyman/engine/element-wrappers';
-import { isEmptyTransform, OutputTarget } from '@keymanapp/keyboard-processor';
-import { RuleBehavior } from 'keyman/engine/js-processor';
+import { isEmptyTransform, OutputTarget, RuleBehavior } from 'keyman/engine/js-processor';
import { AlertHost } from "./utils/alertHost.js";
import { whenDocumentReady } from "./utils/documentReady.js";
diff --git a/web/src/app/browser/src/contextManager.ts b/web/src/app/browser/src/contextManager.ts
index 1511269bbe8..f17a17a5299 100644
--- a/web/src/app/browser/src/contextManager.ts
+++ b/web/src/app/browser/src/contextManager.ts
@@ -1,4 +1,4 @@
-import { type Keyboard, KeyboardScriptError } from '@keymanapp/keyboard-processor';
+import { type Keyboard, KeyboardScriptError } from 'keyman/engine/keyboard';
import { type KeyboardStub } from 'keyman/engine/package-cache';
import { CookieSerializer } from 'keyman/engine/dom-utils';
import { eventOutputTarget, outputTargetForElement, PageContextAttachment } from 'keyman/engine/attachment';
diff --git a/web/src/app/browser/src/defaultBrowserRules.ts b/web/src/app/browser/src/defaultBrowserRules.ts
index 1ac48016892..4f0ffbe012e 100644
--- a/web/src/app/browser/src/defaultBrowserRules.ts
+++ b/web/src/app/browser/src/defaultBrowserRules.ts
@@ -2,9 +2,9 @@ import { ModifierKeyConstants } from '@keymanapp/common-types';
import {
Codes,
DefaultRules,
- type KeyEvent,
- type OutputTarget
-} from '@keymanapp/keyboard-processor';
+ type KeyEvent
+} from 'keyman/engine/keyboard';
+import { type OutputTarget } from 'keyman/engine/js-processor';
import ContextManager from './contextManager.js';
diff --git a/web/src/app/browser/src/hardwareEventKeyboard.ts b/web/src/app/browser/src/hardwareEventKeyboard.ts
index f6874fc77b7..0bb594e8975 100644
--- a/web/src/app/browser/src/hardwareEventKeyboard.ts
+++ b/web/src/app/browser/src/hardwareEventKeyboard.ts
@@ -1,4 +1,4 @@
-import { Codes, DeviceSpec, KeyEvent, KeyMapping, Keyboard } from '@keymanapp/keyboard-processor';
+import { Codes, DeviceSpec, KeyEvent, KeyMapping, Keyboard } from 'keyman/engine/keyboard';
import { KeyboardProcessor } from 'keyman/engine/js-processor';
import { ModifierKeyConstants } from '@keymanapp/common-types';
diff --git a/web/src/app/browser/src/keymanEngine.ts b/web/src/app/browser/src/keymanEngine.ts
index d807c415eb3..dc912f257be 100644
--- a/web/src/app/browser/src/keymanEngine.ts
+++ b/web/src/app/browser/src/keymanEngine.ts
@@ -7,7 +7,7 @@ import {
VisualKeyboard
} from 'keyman/engine/osk';
import { ErrorStub, KeyboardStub, CloudQueryResult, toPrefixedKeyboardId as prefixed } from 'keyman/engine/package-cache';
-import { DeviceSpec, Keyboard, KeyboardObject } from "@keymanapp/keyboard-processor";
+import { DeviceSpec, Keyboard, KeyboardObject } from "keyman/engine/keyboard";
import * as views from './viewsAnchorpoint.js';
import { BrowserConfiguration, BrowserInitOptionDefaults, BrowserInitOptionSpec } from './configuration.js';
diff --git a/web/src/app/webview/src/contextManager.ts b/web/src/app/webview/src/contextManager.ts
index b0c322ea29d..2b242de39c6 100644
--- a/web/src/app/webview/src/contextManager.ts
+++ b/web/src/app/webview/src/contextManager.ts
@@ -1,4 +1,5 @@
-import { type Keyboard, Mock, OutputTarget, Transcription, findCommonSubstringEndIndex, isEmptyTransform, TextTransform } from '@keymanapp/keyboard-processor';
+import { type Keyboard } from 'keyman/engine/keyboard';
+import { Mock, OutputTarget, Transcription, findCommonSubstringEndIndex, isEmptyTransform, TextTransform } from 'keyman/engine/js-processor';
import { KeyboardStub } from 'keyman/engine/package-cache';
import { ContextManagerBase } from 'keyman/engine/main';
import { WebviewConfiguration } from './configuration.js';
diff --git a/web/src/app/webview/src/keymanEngine.ts b/web/src/app/webview/src/keymanEngine.ts
index dfae058a650..ca0c39fd438 100644
--- a/web/src/app/webview/src/keymanEngine.ts
+++ b/web/src/app/webview/src/keymanEngine.ts
@@ -1,4 +1,4 @@
-import { DeviceSpec, DefaultRules } from '@keymanapp/keyboard-processor'
+import { DeviceSpec, DefaultRules } from 'keyman/engine/keyboard';
import { RuleBehavior } from 'keyman/engine/js-processor';
import { KeymanEngine as KeymanEngineBase, KeyboardInterface } from 'keyman/engine/main';
import { AnchoredOSKView, ViewConfiguration, StaticActivator } from 'keyman/engine/osk';
diff --git a/web/src/app/webview/src/oskConfiguration.ts b/web/src/app/webview/src/oskConfiguration.ts
index 26ceeb28721..9250b5a2a1d 100644
--- a/web/src/app/webview/src/oskConfiguration.ts
+++ b/web/src/app/webview/src/oskConfiguration.ts
@@ -1,5 +1,5 @@
import { OSKView } from "keyman/engine/osk";
-import { DeviceSpec } from "@keymanapp/keyboard-processor";
+import { DeviceSpec } from "keyman/engine/keyboard";
import { type EmbeddedGestureConfig } from "keyman/engine/osk";
import { GlobeHint } from './osk/globeHint.js';
diff --git a/web/src/app/webview/src/passthroughKeyboard.ts b/web/src/app/webview/src/passthroughKeyboard.ts
index d74ab7f99a7..25dec7a8e68 100644
--- a/web/src/app/webview/src/passthroughKeyboard.ts
+++ b/web/src/app/webview/src/passthroughKeyboard.ts
@@ -1,4 +1,4 @@
-import { DeviceSpec, Keyboard, KeyEvent, ManagedPromise } from '@keymanapp/keyboard-processor';
+import { DeviceSpec, Keyboard, KeyEvent, ManagedPromise } from 'keyman/engine/keyboard';
import { HardKeyboard, processForMnemonicsAndLegacy } from 'keyman/engine/main';
diff --git a/web/src/engine/attachment/src/pageContextAttachment.ts b/web/src/engine/attachment/src/pageContextAttachment.ts
index d63c113d5e2..4325c88f15d 100644
--- a/web/src/engine/attachment/src/pageContextAttachment.ts
+++ b/web/src/engine/attachment/src/pageContextAttachment.ts
@@ -1,6 +1,6 @@
import { EventEmitter } from 'eventemitter3';
-import { DeviceSpec, InternalKeyboardFont } from "@keymanapp/keyboard-processor";
+import { DeviceSpec, InternalKeyboardFont } from "keyman/engine/keyboard";
import { Input, nestedInstanceOf, wrapElement } from "keyman/engine/element-wrappers";
import {
arrayFromNodeList,
diff --git a/web/src/engine/dom-utils/build.sh b/web/src/engine/dom-utils/build.sh
index 74b46051c42..d2e424db209 100755
--- a/web/src/engine/dom-utils/build.sh
+++ b/web/src/engine/dom-utils/build.sh
@@ -16,7 +16,7 @@ SUBPROJECT_NAME=engine/dom-utils
builder_describe "Builds DOM-utility modules used by the Keyman Engine for Web (KMW)." \
"@/common/web/utils" \
- "@/common/web/keyboard-processor" \
+ "@/web/src/engine/keyboard" \
"clean" \
"configure" \
"build" \
diff --git a/web/src/engine/dom-utils/src/stylesheets.ts b/web/src/engine/dom-utils/src/stylesheets.ts
index 7312a62f055..977f253ff79 100644
--- a/web/src/engine/dom-utils/src/stylesheets.ts
+++ b/web/src/engine/dom-utils/src/stylesheets.ts
@@ -1,5 +1,5 @@
import { DeviceSpec, ManagedPromise } from '@keymanapp/web-utils';
-import { type InternalKeyboardFont as KeyboardFont } from '@keymanapp/keyboard-processor';
+import { type InternalKeyboardFont as KeyboardFont } from 'keyman/engine/keyboard';
type FontFamilyStyleMap = {[family: string]: HTMLStyleElement};
diff --git a/web/src/engine/dom-utils/tsconfig.json b/web/src/engine/dom-utils/tsconfig.json
index c0b4a7d79dd..dadf4db5c8c 100644
--- a/web/src/engine/dom-utils/tsconfig.json
+++ b/web/src/engine/dom-utils/tsconfig.json
@@ -11,7 +11,7 @@
"include": [ "src/**/*.ts" ],
"references": [
- { "path": "../../../../common/web/keyboard-processor" },
+ { "path": "../keyboard" },
{ "path": "../../../../common/web/utils" }
]
}
diff --git a/web/src/engine/element-wrappers/build.sh b/web/src/engine/element-wrappers/build.sh
index cfcc58a44f2..e188c7dd414 100755
--- a/web/src/engine/element-wrappers/build.sh
+++ b/web/src/engine/element-wrappers/build.sh
@@ -13,7 +13,7 @@ SUBPROJECT_NAME=engine/element-wrappers
# ################################ Main script ################################
builder_describe "Builds DOM-based OutputTarget subclasses used by the Keyman Engine for Web (KMW)." \
- "@/common/web/keyboard-processor" \
+ "@/web/src/engine/js-processor" \
"clean" \
"configure" \
"build" \
diff --git a/web/src/engine/element-wrappers/readme.md b/web/src/engine/element-wrappers/readme.md
index 1237237c7be..2a7685edbcb 100644
--- a/web/src/engine/element-wrappers/readme.md
+++ b/web/src/engine/element-wrappers/readme.md
@@ -1,4 +1,4 @@
## engine/element-wrappers
This submodule provides a subset of the main engine's Web-oriented code that's used to 'wrap' webpage
-elements as part of KMW attachment and interface the element with the `keyboard-processor` submodule.
\ No newline at end of file
+elements as part of KMW attachment and interface the element with the `keyboard` submodule.
\ No newline at end of file
diff --git a/web/src/engine/element-wrappers/src/outputTarget.ts b/web/src/engine/element-wrappers/src/outputTarget.ts
index 3a288c13471..43623af7812 100644
--- a/web/src/engine/element-wrappers/src/outputTarget.ts
+++ b/web/src/engine/element-wrappers/src/outputTarget.ts
@@ -1,4 +1,4 @@
-import { OutputTarget as OutputTargetBase } from "@keymanapp/keyboard-processor";
+import { OutputTarget as OutputTargetBase } from "keyman/engine/js-processor";
import { EventEmitter } from 'eventemitter3';
export default abstract class OutputTarget extends OutputTargetBase {
diff --git a/web/src/engine/element-wrappers/tsconfig.json b/web/src/engine/element-wrappers/tsconfig.json
index ab6aa238a80..15a58bbf2a8 100644
--- a/web/src/engine/element-wrappers/tsconfig.json
+++ b/web/src/engine/element-wrappers/tsconfig.json
@@ -11,6 +11,6 @@
"include": [ "src/**/*.ts" ],
"references": [
- { "path": "../../../../common/web/keyboard-processor" }
+ { "path": "../keyboard" }
]
}
diff --git a/web/src/engine/events/build.sh b/web/src/engine/events/build.sh
index 438d075c2ce..1b8993f5705 100755
--- a/web/src/engine/events/build.sh
+++ b/web/src/engine/events/build.sh
@@ -14,7 +14,7 @@ SUBPROJECT_NAME=engine/events
builder_describe "Builds specialized event-related modules utilized by Keyman Engine for Web." \
"@/common/web/utils build" \
- "@/common/web/keyboard-processor build" \
+ "@/web/src/engine/keyboard build" \
"clean" \
"configure" \
"build" \
diff --git a/web/src/engine/events/tsconfig.json b/web/src/engine/events/tsconfig.json
index bb25ac9c99b..5d0a45bbab9 100644
--- a/web/src/engine/events/tsconfig.json
+++ b/web/src/engine/events/tsconfig.json
@@ -12,6 +12,6 @@
"references": [
{ "path": "../../../../common/web/utils" },
- { "path": "../../../../common/web/keyboard-processor" }
+ { "path": "../keyboard" }
]
}
diff --git a/web/src/engine/interfaces/build.sh b/web/src/engine/interfaces/build.sh
index 528083d4d81..568bd7940d6 100755
--- a/web/src/engine/interfaces/build.sh
+++ b/web/src/engine/interfaces/build.sh
@@ -14,7 +14,7 @@ SUBPROJECT_NAME=engine/interfaces
builder_describe "Builds configuration subclasses used by the Keyman Engine for Web (KMW)." \
"@/common/web/es-bundling" \
- "@/common/web/keyboard-processor" \
+ "@/web/src/engine/keyboard" \
"@/web/src/engine/js-processor" \
"clean" \
"configure" \
diff --git a/web/src/engine/interfaces/src/prediction/languageProcessor.interface.ts b/web/src/engine/interfaces/src/prediction/languageProcessor.interface.ts
index 7265d51f463..df5ebae8968 100644
--- a/web/src/engine/interfaces/src/prediction/languageProcessor.interface.ts
+++ b/web/src/engine/interfaces/src/prediction/languageProcessor.interface.ts
@@ -1,7 +1,7 @@
///
import { EventEmitter } from "eventemitter3";
-import { OutputTarget } from "@keymanapp/keyboard-processor";
+import { OutputTarget } from "keyman/engine/js-processor";
export class ReadySuggestions {
suggestions: Suggestion[];
diff --git a/web/src/engine/interfaces/src/prediction/predictionContext.ts b/web/src/engine/interfaces/src/prediction/predictionContext.ts
index 90427c3020f..221875e62cb 100644
--- a/web/src/engine/interfaces/src/prediction/predictionContext.ts
+++ b/web/src/engine/interfaces/src/prediction/predictionContext.ts
@@ -1,7 +1,6 @@
import { EventEmitter } from "eventemitter3";
import { type LanguageProcessorSpec , ReadySuggestions, type InvalidateSourceEnum, StateChangeHandler } from './languageProcessor.interface.js';
-import { type OutputTarget } from "@keymanapp/keyboard-processor";
-import { type KeyboardProcessor } from 'keyman/engine/js-processor';
+import { type KeyboardProcessor, type OutputTarget } from 'keyman/engine/js-processor';
interface PredictionContextEventMap {
update: (suggestions: Suggestion[]) => void;
diff --git a/web/src/engine/interfaces/tsconfig.json b/web/src/engine/interfaces/tsconfig.json
index 634e62bada2..e53a8086820 100644
--- a/web/src/engine/interfaces/tsconfig.json
+++ b/web/src/engine/interfaces/tsconfig.json
@@ -12,7 +12,7 @@
"include": [ "**/*.ts" ],
"references": [
- { "path": "../../../../common/web/keyboard-processor" },
+ { "path": "../keyboard" },
{ "path": "../js-processor" }
]
}
diff --git a/web/src/engine/js-processor/build.sh b/web/src/engine/js-processor/build.sh
index 57adbd1dd21..db00593166a 100755
--- a/web/src/engine/js-processor/build.sh
+++ b/web/src/engine/js-processor/build.sh
@@ -36,6 +36,7 @@ do_build () {
--format esm
}
-builder_run_action configure verify_npm_setup
-builder_run_action clean rm -rf "${KEYMAN_ROOT}/web/build/${SUBPROJECT_NAME}"
-builder_run_action build do_build
+builder_run_action configure verify_npm_setup
+builder_run_action clean rm -rf "${KEYMAN_ROOT}/web/build/${SUBPROJECT_NAME}"
+builder_run_action build do_build
+builder_run_action test test-headless "${SUBPROJECT_NAME}" ""
diff --git a/common/web/keyboard-processor/src/text/deadkeys.ts b/web/src/engine/js-processor/src/deadkeys.ts
similarity index 100%
rename from common/web/keyboard-processor/src/text/deadkeys.ts
rename to web/src/engine/js-processor/src/deadkeys.ts
diff --git a/web/src/engine/js-processor/src/index.ts b/web/src/engine/js-processor/src/index.ts
index f87a044bd73..1755499119c 100644
--- a/web/src/engine/js-processor/src/index.ts
+++ b/web/src/engine/js-processor/src/index.ts
@@ -4,3 +4,8 @@ export { default as RuleBehavior } from "./ruleBehavior.js";
export * from './kbdInterface.js';
export { default as KeyboardInterface } from "./kbdInterface.js";
export * from "./systemStores.js";
+export * from "./deadkeys.js";
+export { default as OutputTarget } from "./outputTarget.js";
+export * from "./outputTarget.js";
+export { Mock } from "./mock.js";
+export * from "./stringDivergence.js";
diff --git a/web/src/engine/js-processor/src/kbdInterface.ts b/web/src/engine/js-processor/src/kbdInterface.ts
index 6272637d049..b39b2baea25 100644
--- a/web/src/engine/js-processor/src/kbdInterface.ts
+++ b/web/src/engine/js-processor/src/kbdInterface.ts
@@ -7,7 +7,10 @@
import { type DeviceSpec } from "@keymanapp/web-utils";
import { ModifierKeyConstants } from '@keymanapp/common-types';
-import { Codes, type KeyEvent, type Deadkey, KeyMapping, type OutputTarget, Mock, Keyboard, KeyboardHarness, KeyboardKeymanGlobal, VariableStoreDictionary } from "@keymanapp/keyboard-processor";
+import { Codes, type KeyEvent, KeyMapping, Keyboard, KeyboardHarness, KeyboardKeymanGlobal, VariableStoreDictionary } from "keyman/engine/keyboard";
+import type OutputTarget from './outputTarget.js';
+import { type Deadkey } from './deadkeys.js';
+import { Mock } from "./mock.js";
import RuleBehavior from "./ruleBehavior.js";
import { ComplexKeyboardStore, type KeyboardStore, KeyboardStoreElement, SystemStoreIDs, SystemStore, MutableSystemStore, PlatformSystemStore, VariableStore, VariableStoreSerializer } from "./systemStores.js";
@@ -1147,6 +1150,6 @@ export default class KeyboardInterface extends KeyboardHarness {
}
(function() {
- // This will be the only call within the keyboard-processor module.
+ // This will be the only call within the keyboard module.
KeyboardInterface.__publishShorthandAPI();
}());
diff --git a/web/src/engine/js-processor/src/keyboardProcessor.ts b/web/src/engine/js-processor/src/keyboardProcessor.ts
index 12efa4e9516..dea537dfdf6 100644
--- a/web/src/engine/js-processor/src/keyboardProcessor.ts
+++ b/web/src/engine/js-processor/src/keyboardProcessor.ts
@@ -10,8 +10,10 @@ import { EventEmitter } from 'eventemitter3';
import { ModifierKeyConstants } from '@keymanapp/common-types';
import {
Codes, type Keyboard, MinimalKeymanGlobal, KeyEvent, Layouts,
- type OutputTarget, Mock, DefaultRules, EmulationKeystrokes
-} from "@keymanapp/keyboard-processor";
+ DefaultRules, EmulationKeystrokes
+} from "keyman/engine/keyboard";
+import { Mock } from "./mock.js";
+import type OutputTarget from "./outputTarget.js";
import RuleBehavior from "./ruleBehavior.js";
import KeyboardInterface from './kbdInterface.js';
import { DeviceSpec, globalObject } from "@keymanapp/web-utils";
diff --git a/web/src/engine/js-processor/src/mock.ts b/web/src/engine/js-processor/src/mock.ts
new file mode 100644
index 00000000000..151d8313caa
--- /dev/null
+++ b/web/src/engine/js-processor/src/mock.ts
@@ -0,0 +1,157 @@
+import OutputTarget from './outputTarget.js';
+
+// Due to some interesting requirements on compile ordering in TS,
+// this needs to be in the same file as OutputTarget now.
+export class Mock extends OutputTarget {
+ text: string;
+
+ selStart: number;
+ selEnd: number;
+ selForward: boolean = true;
+
+ constructor(text?: string, caretPos?: number);
+ constructor(text?: string, selStart?: number, selEnd?: number);
+ constructor(text?: string, selStart?: number, selEnd?: number) {
+ super();
+
+ this.text = text ? text : "";
+ var defaultLength = this.text._kmwLength();
+
+ // Ensures that `caretPos == 0` is handled correctly.
+ this.selStart = typeof selStart == "number" ? selStart : defaultLength;
+
+ // If no selection-end is set, selection length is implied to be 0.
+ this.selEnd = typeof selEnd == "number" ? selEnd : this.selStart;
+
+ this.selForward = this.selEnd >= this.selStart;
+ }
+
+ // Clones the state of an existing EditableElement, creating a Mock version of its state.
+ static from(outputTarget: OutputTarget, readonly?: boolean) {
+ let clone: Mock;
+
+ if (outputTarget instanceof Mock) {
+ // Avoids the need to run expensive kmwstring.ts / `_kmwLength()`
+ // calculations when deep-copying Mock instances.
+ let priorMock = outputTarget as Mock;
+ clone = new Mock(priorMock.text, priorMock.selStart, priorMock.selEnd);
+ } else {
+ const text = outputTarget.getText();
+ const textLen = text._kmwLength();
+
+ // If !hasSelection()
+ let selectionStart: number = textLen;
+ let selectionEnd: number = 0;
+
+ if (outputTarget.hasSelection()) {
+ let beforeText = outputTarget.getTextBeforeCaret();
+ let afterText = outputTarget.getTextAfterCaret();
+ selectionStart = beforeText._kmwLength();
+ selectionEnd = textLen - afterText._kmwLength();
+ }
+
+ // readonly group or not, the returned Mock remains the same.
+ // New-context events should act as if the caret were at the earlier-in-context
+ // side of the selection, same as standard keyboard rules.
+ clone = new Mock(text, selectionStart, selectionEnd);
+ }
+
+ // Also duplicate deadkey state! (Needed for fat-finger ops.)
+ clone.setDeadkeys(outputTarget.deadkeys());
+
+ return clone;
+ }
+
+ clearSelection(): void {
+ this.text = this.getTextBeforeCaret() + this.getTextAfterCaret();
+ this.selEnd = this.selStart;
+ this.selForward = true;
+ }
+
+ invalidateSelection(): void {
+ return;
+ }
+
+ isSelectionEmpty(): boolean {
+ return this.selStart == this.selEnd;
+ }
+
+ hasSelection(): boolean {
+ return true;
+ }
+
+ getDeadkeyCaret(): number {
+ return this.selStart;
+ }
+
+ setSelection(start: number, end?: number) {
+ this.selStart = start;
+ this.selEnd = typeof end == 'number' ? end : start;
+
+ this.selForward = end >= start;
+ if (!this.selForward) {
+ let temp = this.selStart;
+ this.selStart = this.selEnd;
+ this.selEnd = temp;
+ }
+ }
+
+ getTextBeforeCaret(): string {
+ return this.text.kmwSubstr(0, this.selStart);
+ }
+
+ getSelectedText(): string {
+ return this.text.kmwSubstr(this.selStart, this.selEnd - this.selStart);
+ }
+
+ getTextAfterCaret(): string {
+ return this.text.kmwSubstr(this.selEnd);
+ }
+
+ getText(): string {
+ return this.text;
+ }
+
+ deleteCharsBeforeCaret(dn: number): void {
+ if (dn >= 0) {
+ if (dn > this.selStart) {
+ dn = this.selStart;
+ }
+ this.adjustDeadkeys(-dn);
+ this.text = this.text.kmwSubstr(0, this.selStart - dn) + this.text.kmwSubstr(this.selStart);
+ this.selStart -= dn;
+ this.selEnd -= dn;
+ }
+ }
+
+ insertTextBeforeCaret(s: string): void {
+ this.adjustDeadkeys(s._kmwLength());
+ this.text = this.getTextBeforeCaret() + s + this.text.kmwSubstr(this.selStart);
+ this.selStart += s.kmwLength();
+ this.selEnd += s.kmwLength();
+ }
+
+ handleNewlineAtCaret(): void {
+ this.insertTextBeforeCaret('\n');
+ }
+
+ protected setTextAfterCaret(s: string): void {
+ this.text = this.getTextBeforeCaret() + s;
+ }
+
+ /**
+ * Indicates if this Mock represents an identical context to that of another Mock.
+ * @param other
+ * @returns
+ */
+ isEqual(other: Mock) {
+ return this.text == other.text
+ && this.selStart == other.selStart
+ && this.selEnd == other.selEnd
+ && this.deadkeys().equal(other.deadkeys());
+ }
+
+ doInputEvent() {
+ // Mock isn't backed by an element, so it won't have any event listeners.
+ }
+}
diff --git a/common/web/keyboard-processor/src/text/outputTarget.ts b/web/src/engine/js-processor/src/outputTarget.ts
similarity index 69%
rename from common/web/keyboard-processor/src/text/outputTarget.ts
rename to web/src/engine/js-processor/src/outputTarget.ts
index 63c4c8a042f..f48647092c7 100644
--- a/common/web/keyboard-processor/src/text/outputTarget.ts
+++ b/web/src/engine/js-processor/src/outputTarget.ts
@@ -2,11 +2,12 @@
import { extendString } from "@keymanapp/web-utils";
import { findCommonSubstringEndIndex } from "./stringDivergence.js";
+import { Mock } from "./mock.js";
extendString();
// Defines deadkey management in a manner attachable to each element interface.
-import type KeyEvent from "./keyEvent.js";
+import { type KeyEvent } from 'keyman/engine/keyboard';
import { Deadkey, DeadkeyTracker } from "./deadkeys.js";
// Also relies on string-extensions provided by the web-utils package.
@@ -307,159 +308,3 @@ export default abstract class OutputTarget {
*/
abstract doInputEvent(): void;
}
-
-// Due to some interesting requirements on compile ordering in TS,
-// this needs to be in the same file as OutputTarget now.
-export class Mock extends OutputTarget {
- text: string;
-
- selStart: number;
- selEnd: number;
- selForward: boolean = true;
-
- constructor(text?: string, caretPos?: number);
- constructor(text?: string, selStart?: number, selEnd?: number);
- constructor(text?: string, selStart?: number, selEnd?: number) {
- super();
-
- this.text = text ? text : "";
- var defaultLength = this.text._kmwLength();
-
- // Ensures that `caretPos == 0` is handled correctly.
- this.selStart = typeof selStart == "number" ? selStart : defaultLength;
-
- // If no selection-end is set, selection length is implied to be 0.
- this.selEnd = typeof selEnd == "number" ? selEnd : this.selStart;
-
- this.selForward = this.selEnd >= this.selStart;
- }
-
- // Clones the state of an existing EditableElement, creating a Mock version of its state.
- static from(outputTarget: OutputTarget, readonly?: boolean) {
- let clone: Mock;
-
- if(outputTarget instanceof Mock) {
- // Avoids the need to run expensive kmwstring.ts / `_kmwLength()`
- // calculations when deep-copying Mock instances.
- let priorMock = outputTarget as Mock;
- clone = new Mock(priorMock.text, priorMock.selStart, priorMock.selEnd);
- } else {
- const text = outputTarget.getText();
- const textLen = text._kmwLength();
-
- // If !hasSelection()
- let selectionStart: number = textLen;
- let selectionEnd: number = 0;
-
- if(outputTarget.hasSelection()) {
- let beforeText = outputTarget.getTextBeforeCaret();
- let afterText = outputTarget.getTextAfterCaret();
- selectionStart = beforeText._kmwLength();
- selectionEnd = textLen - afterText._kmwLength();
- }
-
- // readonly group or not, the returned Mock remains the same.
- // New-context events should act as if the caret were at the earlier-in-context
- // side of the selection, same as standard keyboard rules.
- clone = new Mock(text, selectionStart, selectionEnd);
- }
-
- // Also duplicate deadkey state! (Needed for fat-finger ops.)
- clone.setDeadkeys(outputTarget.deadkeys());
-
- return clone;
- }
-
- clearSelection(): void {
- this.text = this.getTextBeforeCaret() + this.getTextAfterCaret();
- this.selEnd = this.selStart;
- this.selForward = true;
- }
-
- invalidateSelection(): void {
- return;
- }
-
- isSelectionEmpty(): boolean {
- return this.selStart == this.selEnd;
- }
-
- hasSelection(): boolean {
- return true;
- }
-
- getDeadkeyCaret(): number {
- return this.selStart;
- }
-
- setSelection(start: number, end?: number) {
- this.selStart = start;
- this.selEnd = typeof end == 'number' ? end : start;
-
- this.selForward = end >= start;
- if(!this.selForward) {
- let temp = this.selStart;
- this.selStart = this.selEnd;
- this.selEnd = temp;
- }
- }
-
- getTextBeforeCaret(): string {
- return this.text.kmwSubstr(0, this.selStart);
- }
-
- getSelectedText(): string {
- return this.text.kmwSubstr(this.selStart, this.selEnd - this.selStart);
- }
-
- getTextAfterCaret(): string {
- return this.text.kmwSubstr(this.selEnd);
- }
-
- getText(): string {
- return this.text;
- }
-
- deleteCharsBeforeCaret(dn: number): void {
- if(dn >= 0) {
- if(dn > this.selStart) {
- dn = this.selStart;
- }
- this.adjustDeadkeys(-dn);
- this.text = this.text.kmwSubstr(0, this.selStart - dn) + this.text.kmwSubstr(this.selStart);
- this.selStart -= dn;
- this.selEnd -= dn;
- }
- }
-
- insertTextBeforeCaret(s: string): void {
- this.adjustDeadkeys(s._kmwLength());
- this.text = this.getTextBeforeCaret() + s + this.text.kmwSubstr(this.selStart);
- this.selStart += s.kmwLength();
- this.selEnd += s.kmwLength();
- }
-
- handleNewlineAtCaret(): void {
- this.insertTextBeforeCaret('\n');
- }
-
- protected setTextAfterCaret(s: string): void {
- this.text = this.getTextBeforeCaret() + s;
- }
-
- /**
- * Indicates if this Mock represents an identical context to that of another Mock.
- * @param other
- * @returns
- */
- isEqual(other: Mock) {
- return this.text == other.text
- && this.selStart == other.selStart
- && this.selEnd == other.selEnd
- && this.deadkeys().equal(other.deadkeys());
- }
-
- doInputEvent() {
- // Mock isn't backed by an element, so it won't have any event listeners.
- }
-}
\ No newline at end of file
diff --git a/web/src/engine/js-processor/src/ruleBehavior.ts b/web/src/engine/js-processor/src/ruleBehavior.ts
index 08881eabcc0..a6b2c9973a1 100644
--- a/web/src/engine/js-processor/src/ruleBehavior.ts
+++ b/web/src/engine/js-processor/src/ruleBehavior.ts
@@ -1,7 +1,9 @@
///
import KeyboardProcessor from "./keyboardProcessor.js";
-import { OutputTarget, Mock, type Transcription, VariableStoreDictionary } from "@keymanapp/keyboard-processor";
+import { VariableStoreDictionary } from "keyman/engine/keyboard";
+import OutputTarget, { type Transcription } from './outputTarget.js';
+import { Mock } from "./mock.js";
import { type VariableStore } from "./systemStores.js";
/**
diff --git a/common/web/keyboard-processor/src/text/stringDivergence.ts b/web/src/engine/js-processor/src/stringDivergence.ts
similarity index 100%
rename from common/web/keyboard-processor/src/text/stringDivergence.ts
rename to web/src/engine/js-processor/src/stringDivergence.ts
diff --git a/web/src/engine/js-processor/src/systemStores.ts b/web/src/engine/js-processor/src/systemStores.ts
index 9d02dbddbc4..3288c9feff8 100644
--- a/web/src/engine/js-processor/src/systemStores.ts
+++ b/web/src/engine/js-processor/src/systemStores.ts
@@ -1,4 +1,4 @@
-import { type KeyboardHarness } from '@keymanapp/keyboard-processor';
+import { type KeyboardHarness } from 'keyman/engine/keyboard';
import { StoreNonCharEntry } from './kbdInterface.js';
export enum SystemStoreIDs {
diff --git a/common/web/keyboard-processor/.c8rc.json b/web/src/engine/keyboard/.c8rc.json
similarity index 100%
rename from common/web/keyboard-processor/.c8rc.json
rename to web/src/engine/keyboard/.c8rc.json
diff --git a/common/web/keyboard-processor/.gitignore b/web/src/engine/keyboard/.gitignore
similarity index 100%
rename from common/web/keyboard-processor/.gitignore
rename to web/src/engine/keyboard/.gitignore
diff --git a/common/web/keyboard-processor/README.md b/web/src/engine/keyboard/README.md
similarity index 92%
rename from common/web/keyboard-processor/README.md
rename to web/src/engine/keyboard/README.md
index 8ac9b8f9d05..a2a4eb89944 100644
--- a/common/web/keyboard-processor/README.md
+++ b/web/src/engine/keyboard/README.md
@@ -1,5 +1,6 @@
# Keyman: Keyboard Processor Module
-The Original Code is (C) 2017-2020 SIL International
+
+The Original Code is (C) 2017-2024 SIL International
The Keyboard Processor module is an internal component of KeymanWeb, seen within this repo at /web/.
diff --git a/web/src/engine/keyboard/build.sh b/web/src/engine/keyboard/build.sh
new file mode 100755
index 00000000000..226a7d9d754
--- /dev/null
+++ b/web/src/engine/keyboard/build.sh
@@ -0,0 +1,85 @@
+#!/usr/bin/env bash
+#
+# Compile KeymanWeb's 'keyboard' module, one of the components of Web's 'core' module.
+#
+## START STANDARD BUILD SCRIPT INCLUDE
+# adjust relative paths as necessary
+THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
+. "${THIS_SCRIPT%/*}/../../../../resources/build/builder.inc.sh"
+## END STANDARD BUILD SCRIPT INCLUDE
+
+SUBPROJECT_NAME=engine/keyboard
+
+. "${KEYMAN_ROOT}/web/common.inc.sh"
+. "${KEYMAN_ROOT}/resources/shellHelperFunctions.sh"
+
+################################ Main script ################################
+
+builder_describe \
+ "Compiles the web-oriented utility function module." \
+ "@/web/src/tools/testing/recorder-core test" \
+ "@/common/web/keyman-version" \
+ "@/common/web/es-bundling" \
+ "@/common/web/types" \
+ "@/common/web/utils" \
+ configure \
+ clean \
+ build \
+ test \
+ "--ci For use with action $(builder_term test) - emits CI-friendly test reports"
+
+builder_describe_outputs \
+ configure /node_modules \
+ build /web/build/engine/keyboard/lib/index.mjs
+
+builder_parse "$@"
+
+function do_configure() {
+ verify_npm_setup
+
+ # Configure Web browser-engine testing environments. As is, this should only
+ # make changes when we update the dependency, even on our CI build agents.
+ playwright install
+}
+
+BUILD_DIR="${KEYMAN_ROOT}/web/build/${SUBPROJECT_NAME}"
+
+function do_build() {
+ tsc --build "${THIS_SCRIPT_PATH}/tsconfig.all.json"
+
+ # Base product - the main keyboard processor
+ builder_echo "Bundle base product - the main keyboard processor"
+ ${BUNDLE_CMD} "${BUILD_DIR}/obj/index.js" \
+ --out "${BUILD_DIR}/lib/index.mjs" \
+ --format esm
+
+ # The DOM-oriented keyboard loader
+ builder_echo "Bundle the DOM-oriented keyboard loader"
+ ${BUNDLE_CMD} "${BUILD_DIR}/obj/keyboards/loaders/dom-keyboard-loader.js" \
+ --out "${BUILD_DIR}/lib/dom-keyboard-loader.mjs" \
+ --format esm
+
+ # The Node-oriented keyboard loader
+ builder_echo "Bundle the Node-oriented keyboard loader"
+ ${BUNDLE_CMD} "${BUILD_DIR}/obj/keyboards/loaders/node-keyboard-loader.js" \
+ --out "${BUILD_DIR}/lib/node-keyboard-loader.mjs" \
+ --format esm \
+ --platform node
+
+ # # Tests
+ # builder_echo "Bundle tests"
+ # ${BUNDLE_CMD} "${BUILD_DIR}/tests/dom/cases/domKeyboardLoader.spec.js" \
+ # --out "${BUILD_DIR}/tests/dom/domKeyboardLoader.spec.mjs" \
+ # --format esm
+
+ # Declaration bundling.
+ builder_echo "Declaration bundling"
+ tsc --emitDeclarationOnly --outFile "${BUILD_DIR}/lib/index.d.ts"
+ tsc --emitDeclarationOnly --outFile "${BUILD_DIR}/lib/dom-keyboard-loader.d.ts" -p src/keyboards/loaders/tsconfig.dom.json
+ tsc --emitDeclarationOnly --outFile "${BUILD_DIR}/lib/node-keyboard-loader.d.ts" -p src/keyboards/loaders/tsconfig.node.json
+}
+
+builder_run_action configure do_configure
+builder_run_action clean rm -rf "${BUILD_DIR}"
+builder_run_action build do_build
+builder_run_action test test-headless "${SUBPROJECT_NAME}" ""
diff --git a/common/web/keyboard-processor/src/text/codes.ts b/web/src/engine/keyboard/src/codes.ts
similarity index 100%
rename from common/web/keyboard-processor/src/text/codes.ts
rename to web/src/engine/keyboard/src/codes.ts
diff --git a/common/web/keyboard-processor/src/text/defaultRules.ts b/web/src/engine/keyboard/src/defaultRules.ts
similarity index 99%
rename from common/web/keyboard-processor/src/text/defaultRules.ts
rename to web/src/engine/keyboard/src/defaultRules.ts
index 94acb02688e..5512114d937 100644
--- a/common/web/keyboard-processor/src/text/defaultRules.ts
+++ b/web/src/engine/keyboard/src/defaultRules.ts
@@ -7,7 +7,7 @@
import { ModifierKeyConstants } from '@keymanapp/common-types';
import Codes from './codes.js';
import type KeyEvent from './keyEvent.js';
-import type OutputTarget from './outputTarget.js';
+import { type OutputTarget } from './outputTarget.interface.js';
export enum EmulationKeystrokes {
Enter = '\n',
diff --git a/common/web/keyboard-processor/src/index.ts b/web/src/engine/keyboard/src/index.ts
similarity index 69%
rename from common/web/keyboard-processor/src/index.ts
rename to web/src/engine/keyboard/src/index.ts
index d9d0b2137f0..f5a4edea71d 100644
--- a/common/web/keyboard-processor/src/index.ts
+++ b/web/src/engine/keyboard/src/index.ts
@@ -24,17 +24,13 @@ export {
export { default as SpacebarText } from "./keyboards/spacebarText.js";
export { default as StateKeyMap } from "./keyboards/stateKeyMap.js";
-export { default as Codes } from "./text/codes.js";
-export * from "./text/codes.js";
-export * from "./text/deadkeys.js";
-export { default as DefaultRules } from "./text/defaultRules.js";
-export * from "./text/defaultRules.js";
-export { default as KeyEvent } from "./text/keyEvent.js";
-export * from "./text/keyEvent.js";
-export { default as KeyMapping } from "./text/keyMapping.js";
-export { default as OutputTarget } from "./text/outputTarget.js";
-export * from "./text/outputTarget.js";
-export * from "./text/stringDivergence.js";
+export { default as Codes } from "./codes.js";
+export * from "./codes.js";
+export { default as DefaultRules } from "./defaultRules.js";
+export * from "./defaultRules.js";
+export { default as KeyEvent } from "./keyEvent.js";
+export * from "./keyEvent.js";
+export { default as KeyMapping } from "./keyMapping.js";
export * from "@keymanapp/web-utils";
diff --git a/common/web/keyboard-processor/src/text/keyEvent.ts b/web/src/engine/keyboard/src/keyEvent.ts
similarity index 98%
rename from common/web/keyboard-processor/src/text/keyEvent.ts
rename to web/src/engine/keyboard/src/keyEvent.ts
index 7d6483d0e9f..c359558b1fe 100644
--- a/common/web/keyboard-processor/src/text/keyEvent.ts
+++ b/web/src/engine/keyboard/src/keyEvent.ts
@@ -6,12 +6,12 @@
// a key event. The most straightforward way to integrate Web OSK events on other platforms is to have
// other platforms recognize and utilize this type.
-import type Keyboard from "../keyboards/keyboard.js";
+import type Keyboard from "./keyboards/keyboard.js";
import { type DeviceSpec } from "@keymanapp/web-utils";
import Codes from './codes.js';
import DefaultRules from "./defaultRules.js";
-import { ActiveKeyBase } from "../index.js";
+import { ActiveKeyBase } from './keyboards/activeLayout.js';
// Represents a probability distribution over a keyboard's keys.
// Defined here to avoid compilation issues.
diff --git a/common/web/keyboard-processor/src/text/keyMapping.ts b/web/src/engine/keyboard/src/keyMapping.ts
similarity index 100%
rename from common/web/keyboard-processor/src/text/keyMapping.ts
rename to web/src/engine/keyboard/src/keyMapping.ts
diff --git a/common/web/keyboard-processor/src/keyboards/activeLayout.ts b/web/src/engine/keyboard/src/keyboards/activeLayout.ts
similarity index 99%
rename from common/web/keyboard-processor/src/keyboards/activeLayout.ts
rename to web/src/engine/keyboard/src/keyboards/activeLayout.ts
index 7b293db93c3..c440511f172 100644
--- a/common/web/keyboard-processor/src/keyboards/activeLayout.ts
+++ b/web/src/engine/keyboard/src/keyboards/activeLayout.ts
@@ -1,6 +1,6 @@
-import Codes from "../text/codes.js";
-import KeyEvent, { KeyEventSpec } from "../text/keyEvent.js";
-import KeyMapping from "../text/keyMapping.js";
+import Codes from "../codes.js";
+import KeyEvent, { KeyEventSpec } from "../keyEvent.js";
+import KeyMapping from "../keyMapping.js";
import { ButtonClasses, Layouts } from "./defaultLayouts.js";
import type { LayoutKey, LayoutSubKey, LayoutRow, LayoutLayer, LayoutFormFactor, ButtonClass } from "./defaultLayouts.js";
import type Keyboard from "./keyboard.js";
@@ -105,7 +105,7 @@ export class ActiveKeyBase {
pad: ActiveKeyBase.DEFAULT_PAD
};
- /** WARNING - DO NOT USE DIRECTLY outside of @keymanapp/keyboard-processor! */
+ /** WARNING - DO NOT USE DIRECTLY outside of keyman/engine/keyboard! */
id: TouchLayout.TouchLayoutKeyId;
text: string;
hint?: string;
diff --git a/common/web/keyboard-processor/src/keyboards/defaultLayouts.ts b/web/src/engine/keyboard/src/keyboards/defaultLayouts.ts
similarity index 99%
rename from common/web/keyboard-processor/src/keyboards/defaultLayouts.ts
rename to web/src/engine/keyboard/src/keyboards/defaultLayouts.ts
index 109da53a0e5..3b97659d4bb 100644
--- a/common/web/keyboard-processor/src/keyboards/defaultLayouts.ts
+++ b/web/src/engine/keyboard/src/keyboards/defaultLayouts.ts
@@ -16,7 +16,7 @@ import ButtonClasses = TouchLayout.TouchLayoutKeySp;
export { ButtonClasses };
-import Codes from "../text/codes.js";
+import Codes from "../codes.js";
import type Keyboard from "./keyboard.js";
export interface EncodedVisualKeyboard {
diff --git a/common/web/keyboard-processor/src/keyboards/keyboard.ts b/web/src/engine/keyboard/src/keyboards/keyboard.ts
similarity index 99%
rename from common/web/keyboard-processor/src/keyboards/keyboard.ts
rename to web/src/engine/keyboard/src/keyboards/keyboard.ts
index d791d6ea75e..42463cd6e7f 100644
--- a/common/web/keyboard-processor/src/keyboards/keyboard.ts
+++ b/web/src/engine/keyboard/src/keyboards/keyboard.ts
@@ -1,8 +1,8 @@
-import Codes from "../text/codes.js";
+import Codes from "../codes.js";
import { EncodedVisualKeyboard, LayoutSpec, Layouts } from "./defaultLayouts.js";
import { ActiveKey, ActiveLayout, ActiveSubKey } from "./activeLayout.js";
-import KeyEvent from "../text/keyEvent.js";
-import type OutputTarget from "../text/outputTarget.js";
+import KeyEvent from "../keyEvent.js";
+import { type OutputTarget } from "../outputTarget.interface.js";
import { ModifierKeyConstants, TouchLayout } from "@keymanapp/common-types";
type TouchLayoutSpec = TouchLayout.TouchLayoutPlatform & { isDefault?: boolean};
diff --git a/common/web/keyboard-processor/src/keyboards/keyboardHarness.ts b/web/src/engine/keyboard/src/keyboards/keyboardHarness.ts
similarity index 99%
rename from common/web/keyboard-processor/src/keyboards/keyboardHarness.ts
rename to web/src/engine/keyboard/src/keyboards/keyboardHarness.ts
index 109d2090673..bb2e2d5ccb1 100644
--- a/common/web/keyboard-processor/src/keyboards/keyboardHarness.ts
+++ b/web/src/engine/keyboard/src/keyboards/keyboardHarness.ts
@@ -1,5 +1,5 @@
import Keyboard from "./keyboard.js";
-import Codes from "../text/codes.js";
+import Codes from "../codes.js";
import { DeviceSpec } from '@keymanapp/web-utils';
/**
diff --git a/common/web/keyboard-processor/src/keyboards/keyboardLoaderBase.ts b/web/src/engine/keyboard/src/keyboards/keyboardLoaderBase.ts
similarity index 100%
rename from common/web/keyboard-processor/src/keyboards/keyboardLoaderBase.ts
rename to web/src/engine/keyboard/src/keyboards/keyboardLoaderBase.ts
diff --git a/common/web/keyboard-processor/src/keyboards/keyboardProperties.ts b/web/src/engine/keyboard/src/keyboards/keyboardProperties.ts
similarity index 100%
rename from common/web/keyboard-processor/src/keyboards/keyboardProperties.ts
rename to web/src/engine/keyboard/src/keyboards/keyboardProperties.ts
diff --git a/common/web/keyboard-processor/src/keyboards/loaders/dom-keyboard-loader.ts b/web/src/engine/keyboard/src/keyboards/loaders/dom-keyboard-loader.ts
similarity index 100%
rename from common/web/keyboard-processor/src/keyboards/loaders/dom-keyboard-loader.ts
rename to web/src/engine/keyboard/src/keyboards/loaders/dom-keyboard-loader.ts
diff --git a/common/web/keyboard-processor/src/keyboards/loaders/domKeyboardLoader.ts b/web/src/engine/keyboard/src/keyboards/loaders/domKeyboardLoader.ts
similarity index 97%
rename from common/web/keyboard-processor/src/keyboards/loaders/domKeyboardLoader.ts
rename to web/src/engine/keyboard/src/keyboards/loaders/domKeyboardLoader.ts
index ea9cddecd42..fcb2c764cd6 100644
--- a/common/web/keyboard-processor/src/keyboards/loaders/domKeyboardLoader.ts
+++ b/web/src/engine/keyboard/src/keyboards/loaders/domKeyboardLoader.ts
@@ -2,7 +2,7 @@
///
-import { Keyboard, KeyboardHarness, KeyboardLoaderBase, KeyboardLoadErrorBuilder, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
+import { Keyboard, KeyboardHarness, KeyboardLoaderBase, KeyboardLoadErrorBuilder, MinimalKeymanGlobal } from 'keyman/engine/keyboard';
import { ManagedPromise } from '@keymanapp/web-utils';
diff --git a/common/web/keyboard-processor/src/keyboards/loaders/node-keyboard-loader.ts b/web/src/engine/keyboard/src/keyboards/loaders/node-keyboard-loader.ts
similarity index 100%
rename from common/web/keyboard-processor/src/keyboards/loaders/node-keyboard-loader.ts
rename to web/src/engine/keyboard/src/keyboards/loaders/node-keyboard-loader.ts
diff --git a/common/web/keyboard-processor/src/keyboards/loaders/nodeKeyboardLoader.ts b/web/src/engine/keyboard/src/keyboards/loaders/nodeKeyboardLoader.ts
similarity index 95%
rename from common/web/keyboard-processor/src/keyboards/loaders/nodeKeyboardLoader.ts
rename to web/src/engine/keyboard/src/keyboards/loaders/nodeKeyboardLoader.ts
index 143e1c16c11..b9f6a7cdfef 100644
--- a/common/web/keyboard-processor/src/keyboards/loaders/nodeKeyboardLoader.ts
+++ b/web/src/engine/keyboard/src/keyboards/loaders/nodeKeyboardLoader.ts
@@ -1,4 +1,4 @@
-import { Keyboard, KeyboardHarness, KeyboardLoaderBase, KeyboardLoadErrorBuilder, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
+import { Keyboard, KeyboardHarness, KeyboardLoaderBase, KeyboardLoadErrorBuilder, MinimalKeymanGlobal } from 'keyman/engine/keyboard';
import vm from 'vm';
import fs from 'fs';
diff --git a/web/src/engine/keyboard/src/keyboards/loaders/tsconfig.dom.json b/web/src/engine/keyboard/src/keyboards/loaders/tsconfig.dom.json
new file mode 100644
index 00000000000..1dd122f5485
--- /dev/null
+++ b/web/src/engine/keyboard/src/keyboards/loaders/tsconfig.dom.json
@@ -0,0 +1,13 @@
+{
+ "extends": "../../../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "baseUrl": "../../../",
+ "outDir": "../../../../../../build/engine/keyboard/obj/keyboards/loaders/",
+ "tsBuildInfoFile": "../../../../../../build/engine/keyboard/obj/keyboards/loaders/tsconfig.dom.tsbuildinfo",
+ "rootDir": "."
+ },
+ "references": [
+ { "path": "../../../tsconfig.json" }
+ ],
+ "include": ["dom-keyboard-loader.ts", "domKeyboardLoader.ts"],
+}
diff --git a/web/src/engine/keyboard/src/keyboards/loaders/tsconfig.node.json b/web/src/engine/keyboard/src/keyboards/loaders/tsconfig.node.json
new file mode 100644
index 00000000000..4a06decf4c4
--- /dev/null
+++ b/web/src/engine/keyboard/src/keyboards/loaders/tsconfig.node.json
@@ -0,0 +1,14 @@
+{
+ "extends": "../../../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "types": [ "node" ],
+ "baseUrl": "../../../",
+ "outDir": "../../../../../../build/engine/keyboard/obj/keyboards/loaders/",
+ "tsBuildInfoFile": "../../../../../../build/engine/keyboard/obj/keyboards/loaders/tsconfig.node.tsbuildinfo",
+ "rootDir": "."
+ },
+ "references": [
+ { "path": "../../../tsconfig.json" }
+ ],
+ "include": ["node-keyboard-loader.ts", "nodeKeyboardLoader.ts"],
+}
diff --git a/common/web/keyboard-processor/src/keyboards/spacebarText.ts b/web/src/engine/keyboard/src/keyboards/spacebarText.ts
similarity index 100%
rename from common/web/keyboard-processor/src/keyboards/spacebarText.ts
rename to web/src/engine/keyboard/src/keyboards/spacebarText.ts
diff --git a/common/web/keyboard-processor/src/keyboards/stateKeyMap.ts b/web/src/engine/keyboard/src/keyboards/stateKeyMap.ts
similarity index 65%
rename from common/web/keyboard-processor/src/keyboards/stateKeyMap.ts
rename to web/src/engine/keyboard/src/keyboards/stateKeyMap.ts
index c8e9ee8b763..e82ff417c4e 100644
--- a/common/web/keyboard-processor/src/keyboards/stateKeyMap.ts
+++ b/web/src/engine/keyboard/src/keyboards/stateKeyMap.ts
@@ -1,5 +1,5 @@
/**
- * Provided by @keymanapp/keyboard-processor's `KeyboardProcessor` class and utilized by the OSK
+ * Provided by keyman/engine/keyboard's `KeyboardProcessor` class and utilized by the OSK
* to provide state feedback on any corresponding keys visible in the OSK.
*/
export default interface StateKeyMap {
diff --git a/web/src/engine/keyboard/src/outputTarget.interface.ts b/web/src/engine/keyboard/src/outputTarget.interface.ts
new file mode 100644
index 00000000000..410094c812c
--- /dev/null
+++ b/web/src/engine/keyboard/src/outputTarget.interface.ts
@@ -0,0 +1,104 @@
+export interface OutputTarget {
+ /**
+ * Signifies that this OutputTarget has no default key processing behaviors. This should be false
+ * for OutputTargets backed by web elements like HTMLInputElement or HTMLTextAreaElement.
+ */
+ get isSynthetic(): boolean;
+
+ resetContext(): void;
+
+ hasDeadkeyMatch(n: number, d: number): boolean;
+
+ insertDeadkeyBeforeCaret(d: number): void;
+
+ /**
+ * Clears any selected text within the wrapper's element(s).
+ * Silently does nothing if no such text exists.
+ */
+ clearSelection(): void;
+
+ /**
+ * Clears any cached selection-related state values.
+ */
+ invalidateSelection(): void;
+
+ /**
+ * Indicates whether or not the underlying element has its own selection (input, textarea)
+ * or is part of (or possesses) the DOM's active selection. Don't confuse with isSelectionEmpty().
+ *
+ * TODO: rename to supportsOwnSelection
+ */
+ hasSelection(): boolean;
+
+ /**
+ * Returns true if there is no current selection -- that is, the selection range is empty
+ */
+ isSelectionEmpty(): boolean;
+
+ /**
+ * Returns an index corresponding to the caret's position for use with deadkeys.
+ */
+ getDeadkeyCaret(): number;
+
+ /**
+ * Relative to the caret, gets the current context within the wrapper's element.
+ */
+ getTextBeforeCaret(): string;
+
+ /**
+ * Gets the element's-currently selected text.
+ */
+ getSelectedText(): string;
+
+ /**
+ * Relative to the caret (and/or active selection), gets the element's text after the caret,
+ * excluding any actively selected text that would be immediately replaced upon text entry.
+ */
+ getTextAfterCaret(): string;
+
+ /**
+ * Gets the element's full text, including any text that is actively selected.
+ */
+ getText(): string;
+
+ /**
+ * Performs context deletions (from the left of the caret) as needed by the KeymanWeb engine and
+ * corrects the location of any affected deadkeys.
+ *
+ * Does not delete deadkeys (b/c KMW 1 & 2 behavior maintenance).
+ * @param dn The number of characters to delete. If negative, context will be left unchanged.
+ */
+ deleteCharsBeforeCaret(dn: number): void;
+
+ /**
+ * Inserts text immediately before the caret's current position, moving the caret after the
+ * newly inserted text in the process along with any affected deadkeys.
+ *
+ * @param s Text to insert before the caret's current position.
+ */
+ insertTextBeforeCaret(s: string): void;
+
+ /**
+ * Allows element-specific handling for ENTER key inputs. Conceptually, this should usually
+ * correspond to `insertTextBeforeCaret('\n'), but actual implementation will vary greatly among
+ * elements.
+ */
+ handleNewlineAtCaret(): void;
+
+ /**
+ * Saves element-specific state properties prone to mutation, enabling restoration after
+ * text-output operations.
+ */
+ saveProperties(): void;
+
+ /**
+ * Restores previously-saved element-specific state properties. Designed for use after text-output
+ * ops to facilitate more-seamless web-dev and user interactions.
+ */
+ restoreProperties(): void;
+
+ /**
+ * Generates a synthetic event on the underlying element, signalling that its value has changed.
+ */
+ doInputEvent(): void;
+}
diff --git a/common/web/keyboard-processor/tsconfig.all.json b/web/src/engine/keyboard/tsconfig.all.json
similarity index 66%
rename from common/web/keyboard-processor/tsconfig.all.json
rename to web/src/engine/keyboard/tsconfig.all.json
index 79f10644d10..1ee44d3e70e 100644
--- a/common/web/keyboard-processor/tsconfig.all.json
+++ b/web/src/engine/keyboard/tsconfig.all.json
@@ -1,9 +1,9 @@
{
- "extends": "../tsconfig.kmw-main-base.json",
+ "extends": "../../../tsconfig.base.json",
"compilerOptions": {
"baseUrl": "./",
- "outDir": "build/obj/",
- "tsBuildInfoFile": "build/obj/tsconfig.all.tsbuildinfo",
+ "outDir": "../../../build/engine/keyboard/obj/",
+ "tsBuildInfoFile": "../../../build/engine/keyboard/obj/tsconfig.all.tsbuildinfo",
"rootDir": "./src/"
},
"references": [
diff --git a/web/src/engine/keyboard/tsconfig.json b/web/src/engine/keyboard/tsconfig.json
new file mode 100644
index 00000000000..84d96c8591f
--- /dev/null
+++ b/web/src/engine/keyboard/tsconfig.json
@@ -0,0 +1,12 @@
+// Is used by the keyboard-loader submodules.
+{
+ "extends": "../../../tsconfig.base.json",
+ "compilerOptions": {
+ "baseUrl": "./",
+ "outDir": "../../../build/engine/keyboard/obj/",
+ "tsBuildInfoFile": "../../../build/engine/keyboard/obj/tsconfig.tsbuildinfo",
+ "rootDir": "./src/"
+ },
+ "include": [ "./src/**/*.ts"],
+ "exclude": ["./src/keyboards/loaders/**/*.ts"]
+}
diff --git a/web/src/engine/main/build.sh b/web/src/engine/main/build.sh
index 4e6ca67db11..15eaf770f2e 100755
--- a/web/src/engine/main/build.sh
+++ b/web/src/engine/main/build.sh
@@ -14,7 +14,7 @@ SUBPROJECT_NAME=engine/main
builder_describe "Builds the Keyman Engine for Web's common top-level base classes." \
"@/common/web/keyman-version" \
- "@/common/web/keyboard-processor" \
+ "@/web/src/engine/keyboard" \
"@/common/predictive-text" \
"@/web/src/engine/interfaces build" \
"@/web/src/engine/device-detect build" \
diff --git a/web/src/engine/main/src/contextManagerBase.ts b/web/src/engine/main/src/contextManagerBase.ts
index e745dbe312b..5c774aa72d0 100644
--- a/web/src/engine/main/src/contextManagerBase.ts
+++ b/web/src/engine/main/src/contextManagerBase.ts
@@ -1,6 +1,6 @@
import { EventEmitter } from 'eventemitter3';
-import { ManagedPromise, type Keyboard, type OutputTarget } from '@keymanapp/keyboard-processor';
-import { type KeyboardInterface } from 'keyman/engine/js-processor';
+import { ManagedPromise, type Keyboard } from 'keyman/engine/keyboard';
+import { type KeyboardInterface, type OutputTarget } from 'keyman/engine/js-processor';
import { StubAndKeyboardCache, type KeyboardStub } from 'keyman/engine/package-cache';
import { PredictionContext } from 'keyman/engine/interfaces';
import { EngineConfiguration } from './engineConfiguration.js';
diff --git a/web/src/engine/main/src/engineConfiguration.ts b/web/src/engine/main/src/engineConfiguration.ts
index bb82844c565..050a7be11e5 100644
--- a/web/src/engine/main/src/engineConfiguration.ts
+++ b/web/src/engine/main/src/engineConfiguration.ts
@@ -1,7 +1,7 @@
import { EventEmitter } from "eventemitter3";
-import { DeviceSpec, KeyboardProperties, ManagedPromise, OutputTarget, physicalKeyDeviceAlias, SpacebarText } from "@keymanapp/keyboard-processor";
-import { RuleBehavior } from 'keyman/engine/js-processor';
+import { DeviceSpec, KeyboardProperties, ManagedPromise, physicalKeyDeviceAlias, SpacebarText } from "keyman/engine/keyboard";
+import { OutputTarget, RuleBehavior } from 'keyman/engine/js-processor';
import { PathConfiguration, PathOptionDefaults, PathOptionSpec } from "keyman/engine/interfaces";
import { Device } from "keyman/engine/device-detect";
import { KeyboardStub } from "keyman/engine/package-cache";
diff --git a/web/src/engine/main/src/hardKeyboard.ts b/web/src/engine/main/src/hardKeyboard.ts
index 491073f7294..60f2b362004 100644
--- a/web/src/engine/main/src/hardKeyboard.ts
+++ b/web/src/engine/main/src/hardKeyboard.ts
@@ -1,5 +1,5 @@
import { EventEmitter } from "eventemitter3";
-import { Keyboard, KeyMapping, KeyEvent, Codes } from "@keymanapp/keyboard-processor";
+import { Keyboard, KeyMapping, KeyEvent, Codes } from "keyman/engine/keyboard";
import { type RuleBehavior } from 'keyman/engine/js-processor';
import { KeyEventSourceInterface } from 'keyman/engine/osk';
import { ModifierKeyConstants } from '@keymanapp/common-types';
diff --git a/web/src/engine/main/src/headless/contextWindow.ts b/web/src/engine/main/src/headless/contextWindow.ts
index 2adb4f0b6a6..9fcd1458b2a 100644
--- a/web/src/engine/main/src/headless/contextWindow.ts
+++ b/web/src/engine/main/src/headless/contextWindow.ts
@@ -1,4 +1,4 @@
-import { Mock } from "@keymanapp/keyboard-processor";
+import { Mock } from "keyman/engine/js-processor";
export default class ContextWindow implements Context {
// Used to limit the range of context replicated for use of keyboard rules within
diff --git a/web/src/engine/main/src/headless/inputProcessor.ts b/web/src/engine/main/src/headless/inputProcessor.ts
index 99a31db609b..6d8904c563d 100644
--- a/web/src/engine/main/src/headless/inputProcessor.ts
+++ b/web/src/engine/main/src/headless/inputProcessor.ts
@@ -7,16 +7,18 @@ import { LanguageProcessor } from "./languageProcessor.js";
import type { ModelSpec } from "keyman/engine/interfaces";
import { globalObject, DeviceSpec } from "@keymanapp/web-utils";
+import { Codes, type Keyboard, type KeyEvent } from "keyman/engine/keyboard";
import {
type Alternate,
- Codes,
isEmptyTransform,
- type Keyboard,
- type KeyEvent,
+ KeyboardInterface,
+ KeyboardProcessor,
Mock,
type OutputTarget,
-} from "@keymanapp/keyboard-processor";
-import { KeyboardInterface, KeyboardProcessor, RuleBehavior, type ProcessorInitOptions, SystemStoreIDs } from 'keyman/engine/js-processor';
+ RuleBehavior,
+ type ProcessorInitOptions,
+ SystemStoreIDs
+} from 'keyman/engine/js-processor';
import { TranscriptionCache } from "./transcriptionCache.js";
diff --git a/web/src/engine/main/src/headless/languageProcessor.ts b/web/src/engine/main/src/headless/languageProcessor.ts
index 30a676bb6aa..c1c1721484b 100644
--- a/web/src/engine/main/src/headless/languageProcessor.ts
+++ b/web/src/engine/main/src/headless/languageProcessor.ts
@@ -1,6 +1,6 @@
import { EventEmitter } from "eventemitter3";
import { LMLayer } from "@keymanapp/lexical-model-layer/web";
-import { OutputTarget, Transcription, Mock } from "@keymanapp/keyboard-processor";
+import { OutputTarget, Transcription, Mock } from "keyman/engine/js-processor";
import { LanguageProcessorEventMap, ModelSpec, StateChangeEnum, ReadySuggestions } from 'keyman/engine/interfaces';
import ContextWindow from "./contextWindow.js";
import { TranscriptionCache } from "./transcriptionCache.js";
diff --git a/web/src/engine/main/src/headless/transcriptionCache.ts b/web/src/engine/main/src/headless/transcriptionCache.ts
index c173009171c..af05853e174 100644
--- a/web/src/engine/main/src/headless/transcriptionCache.ts
+++ b/web/src/engine/main/src/headless/transcriptionCache.ts
@@ -1,4 +1,4 @@
-import { Transcription } from "@keymanapp/keyboard-processor";
+import { Transcription } from "keyman/engine/js-processor";
const TRANSCRIPTION_BUFFER_SIZE = 10;
diff --git a/web/src/engine/main/src/keyboardInterface.ts b/web/src/engine/main/src/keyboardInterface.ts
index d966c26bad4..9d922477b20 100644
--- a/web/src/engine/main/src/keyboardInterface.ts
+++ b/web/src/engine/main/src/keyboardInterface.ts
@@ -1,4 +1,4 @@
-import { KeyboardObject } from "@keymanapp/keyboard-processor";
+import { KeyboardObject } from "keyman/engine/keyboard";
import { KeyboardInterface as KeyboardInterfaceBase } from 'keyman/engine/js-processor';
import { KeyboardStub, RawKeyboardStub, toUnprefixedKeyboardId as unprefixed } from 'keyman/engine/package-cache';
diff --git a/web/src/engine/main/src/keymanEngine.ts b/web/src/engine/main/src/keymanEngine.ts
index 86ff9d5898d..b91920e70d3 100644
--- a/web/src/engine/main/src/keymanEngine.ts
+++ b/web/src/engine/main/src/keymanEngine.ts
@@ -1,6 +1,6 @@
-import { type KeyEvent, type Keyboard, KeyboardKeymanGlobal } from "@keymanapp/keyboard-processor";
+import { type KeyEvent, type Keyboard, KeyboardKeymanGlobal } from "keyman/engine/keyboard";
import { ProcessorInitOptions, RuleBehavior } from 'keyman/engine/js-processor';
-import { DOMKeyboardLoader as KeyboardLoader } from "@keymanapp/keyboard-processor/dom-keyboard-loader";
+import { DOMKeyboardLoader as KeyboardLoader } from "keyman/engine/keyboard/dom-keyboard-loader";
import { InputProcessor } from './headless/inputProcessor.js';
import { OSKView } from "keyman/engine/osk";
import { KeyboardRequisitioner, ModelCache, toUnprefixedKeyboardId as unprefixed } from "keyman/engine/package-cache";
@@ -244,7 +244,7 @@ export default class KeymanEngine<
this.contextManager.configure({
resetContext: (target) => {
// Could reset the target's deadkeys here, but it's really more of a 'core' task.
- // So we delegate that to keyboard-processor.
+ // So we delegate that to keyboard.
if(this.osk) {
this.osk.batchLayoutAfter(() => {
this.core.resetContext(target);
diff --git a/web/src/engine/osk/build.sh b/web/src/engine/osk/build.sh
index 4538b79d923..0d676a2d3ef 100755
--- a/web/src/engine/osk/build.sh
+++ b/web/src/engine/osk/build.sh
@@ -13,7 +13,7 @@ SUBPROJECT_NAME=engine/osk
# ################################ Main script ################################
builder_describe "Builds the Keyman Engine for Web's On-Screen Keyboard package (OSK)." \
- "@/common/web/keyboard-processor build" \
+ "@/web/src/engine/keyboard build" \
"@/common/web/gesture-recognizer build" \
"@/web/src/engine/interfaces build" \
"@/web/src/engine/dom-utils build" \
diff --git a/web/src/engine/osk/src/banner/banner.ts b/web/src/engine/osk/src/banner/banner.ts
index 39b3ddc708c..e38b6b6625d 100644
--- a/web/src/engine/osk/src/banner/banner.ts
+++ b/web/src/engine/osk/src/banner/banner.ts
@@ -1,4 +1,4 @@
-import { Keyboard, KeyboardProperties } from '@keymanapp/keyboard-processor';
+import { Keyboard, KeyboardProperties } from 'keyman/engine/keyboard';
import { createUnselectableElement } from 'keyman/engine/dom-utils';
// Base class for a banner above the keyboard in the OSK
diff --git a/web/src/engine/osk/src/banner/bannerController.ts b/web/src/engine/osk/src/banner/bannerController.ts
index a53ea2f9e92..7fbc8ceb9bb 100644
--- a/web/src/engine/osk/src/banner/bannerController.ts
+++ b/web/src/engine/osk/src/banner/bannerController.ts
@@ -6,7 +6,7 @@ import { BannerView } from './bannerView.js';
import { Banner } from './banner.js';
import { BlankBanner } from './blankBanner.js';
import { HTMLBanner } from './htmlBanner.js';
-import { Keyboard, KeyboardProperties } from '@keymanapp/keyboard-processor';
+import { Keyboard, KeyboardProperties } from 'keyman/engine/keyboard';
export class BannerController {
private container: BannerView;
diff --git a/web/src/engine/osk/src/banner/suggestionBanner.ts b/web/src/engine/osk/src/banner/suggestionBanner.ts
index adf6a5ea200..34455fd0619 100644
--- a/web/src/engine/osk/src/banner/suggestionBanner.ts
+++ b/web/src/engine/osk/src/banner/suggestionBanner.ts
@@ -13,7 +13,7 @@ import {
import { BANNER_GESTURE_SET } from './bannerGestureSet.js';
-import { DeviceSpec, Keyboard, KeyboardProperties, timedPromise } from '@keymanapp/keyboard-processor';
+import { DeviceSpec, Keyboard, KeyboardProperties, timedPromise } from 'keyman/engine/keyboard';
import { Banner } from './banner.js';
import { ParsedLengthStyle } from '../lengthStyle.js';
import { getFontSizeStyle } from '../fontSizeUtils.js';
diff --git a/web/src/engine/osk/src/components/helpPageView.ts b/web/src/engine/osk/src/components/helpPageView.ts
index 7c66708be9a..af489a2686f 100644
--- a/web/src/engine/osk/src/components/helpPageView.ts
+++ b/web/src/engine/osk/src/components/helpPageView.ts
@@ -1,4 +1,4 @@
-import { Keyboard } from '@keymanapp/keyboard-processor';
+import { Keyboard } from 'keyman/engine/keyboard';
import KeyboardView from './keyboardView.interface.js';
import { ParsedLengthStyle } from "../lengthStyle.js";
diff --git a/web/src/engine/osk/src/components/titleBar.ts b/web/src/engine/osk/src/components/titleBar.ts
index 815b8a1e4e0..dd4eba3df7f 100644
--- a/web/src/engine/osk/src/components/titleBar.ts
+++ b/web/src/engine/osk/src/components/titleBar.ts
@@ -1,6 +1,6 @@
import { EventEmitter } from 'eventemitter3';
-import { Keyboard } from '@keymanapp/keyboard-processor';
+import { Keyboard } from 'keyman/engine/keyboard';
import OSKViewComponent from './oskViewComponent.interface.js';
import { ParsedLengthStyle } from '../lengthStyle.js';
diff --git a/web/src/engine/osk/src/correctionLayout.ts b/web/src/engine/osk/src/correctionLayout.ts
index c3c0ffa8865..ba5f902ff47 100644
--- a/web/src/engine/osk/src/correctionLayout.ts
+++ b/web/src/engine/osk/src/correctionLayout.ts
@@ -1,4 +1,4 @@
-import { ActiveKey, ActiveKeyBase, ActiveLayer, ActiveRow, Codes } from "@keymanapp/keyboard-processor";
+import { ActiveKey, ActiveKeyBase, ActiveLayer, ActiveRow, Codes } from "keyman/engine/keyboard";
/**
* Defines correction-layout mappings for keys to be considered by
diff --git a/web/src/engine/osk/src/corrections.ts b/web/src/engine/osk/src/corrections.ts
index 39c5ae2ef37..808e1c6dce5 100644
--- a/web/src/engine/osk/src/corrections.ts
+++ b/web/src/engine/osk/src/corrections.ts
@@ -1,4 +1,4 @@
-import { ActiveKeyBase, KeyDistribution } from "@keymanapp/keyboard-processor";
+import { ActiveKeyBase, KeyDistribution } from "keyman/engine/keyboard";
import { CorrectionLayout } from "./correctionLayout.js";
/**
diff --git a/web/src/engine/osk/src/index.ts b/web/src/engine/osk/src/index.ts
index f2a543e175c..f010697d966 100644
--- a/web/src/engine/osk/src/index.ts
+++ b/web/src/engine/osk/src/index.ts
@@ -1,4 +1,4 @@
-export { Codes, DeviceSpec, Keyboard, KeyboardProperties, SpacebarText } from '@keymanapp/keyboard-processor';
+export { Codes, DeviceSpec, Keyboard, KeyboardProperties, SpacebarText } from 'keyman/engine/keyboard';
export { default as OSKView } from './views/oskView.js';
export { default as FloatingOSKView, FloatingOSKViewConfiguration } from './views/floatingOskView.js';
diff --git a/web/src/engine/osk/src/input/gestures/browser/flick.ts b/web/src/engine/osk/src/input/gestures/browser/flick.ts
index c83a85121ed..91d20718714 100644
--- a/web/src/engine/osk/src/input/gestures/browser/flick.ts
+++ b/web/src/engine/osk/src/input/gestures/browser/flick.ts
@@ -1,7 +1,7 @@
import { type KeyElement } from '../../../keyElement.js';
import VisualKeyboard from '../../../visualKeyboard.js';
-import { ActiveKey, ActiveKeyBase, ActiveSubKey, KeyDistribution, KeyEvent } from '@keymanapp/keyboard-processor';
+import { ActiveKey, ActiveKeyBase, ActiveSubKey, KeyDistribution, KeyEvent } from 'keyman/engine/keyboard';
import { ConfigChangeClosure, CumulativePathStats, GestureRecognizerConfiguration, GestureSequence, GestureSource, GestureSourceSubview, InputSample, RecognitionZoneSource } from '@keymanapp/gesture-recognizer';
import { GestureHandler } from '../gestureHandler.js';
import { distributionFromDistanceMaps } from '../../../corrections.js';
diff --git a/web/src/engine/osk/src/input/gestures/browser/modipress.ts b/web/src/engine/osk/src/input/gestures/browser/modipress.ts
index f3670944a46..3ffd4c206c9 100644
--- a/web/src/engine/osk/src/input/gestures/browser/modipress.ts
+++ b/web/src/engine/osk/src/input/gestures/browser/modipress.ts
@@ -1,7 +1,7 @@
import { type KeyElement } from '../../../keyElement.js';
import VisualKeyboard from '../../../visualKeyboard.js';
-import { KeyDistribution, ActiveKeyBase } from '@keymanapp/keyboard-processor';
+import { KeyDistribution, ActiveKeyBase } from 'keyman/engine/keyboard';
import { GestureSequence } from '@keymanapp/gesture-recognizer';
import { GestureHandler } from '../gestureHandler.js';
diff --git a/web/src/engine/osk/src/input/gestures/browser/multitap.ts b/web/src/engine/osk/src/input/gestures/browser/multitap.ts
index 23c4898ff0f..99e50810f9c 100644
--- a/web/src/engine/osk/src/input/gestures/browser/multitap.ts
+++ b/web/src/engine/osk/src/input/gestures/browser/multitap.ts
@@ -1,7 +1,7 @@
import { type KeyElement } from '../../../keyElement.js';
import VisualKeyboard from '../../../visualKeyboard.js';
-import { ActiveSubKey, ActiveKey, KeyDistribution, ActiveKeyBase } from '@keymanapp/keyboard-processor';
+import { ActiveSubKey, ActiveKey, KeyDistribution, ActiveKeyBase } from 'keyman/engine/keyboard';
import { GestureSequence, GestureStageReport } from '@keymanapp/gesture-recognizer';
import { GestureHandler } from '../gestureHandler.js';
import { distributionFromDistanceMaps } from '../../../corrections.js';
diff --git a/web/src/engine/osk/src/input/gestures/browser/oskSubKey.ts b/web/src/engine/osk/src/input/gestures/browser/oskSubKey.ts
index 7640c3b20e7..abf3a9fb801 100644
--- a/web/src/engine/osk/src/input/gestures/browser/oskSubKey.ts
+++ b/web/src/engine/osk/src/input/gestures/browser/oskSubKey.ts
@@ -1,4 +1,4 @@
-import { ActiveSubKey } from '@keymanapp/keyboard-processor';
+import { ActiveSubKey } from 'keyman/engine/keyboard';
import OSKKey from '../../../keyboard-layout/oskKey.js';
import { KeyData, KeyElement, link } from '../../../keyElement.js';
import VisualKeyboard from '../../../visualKeyboard.js';
diff --git a/web/src/engine/osk/src/input/gestures/browser/subkeyPopup.ts b/web/src/engine/osk/src/input/gestures/browser/subkeyPopup.ts
index e9388e96f2a..d33d3192116 100644
--- a/web/src/engine/osk/src/input/gestures/browser/subkeyPopup.ts
+++ b/web/src/engine/osk/src/input/gestures/browser/subkeyPopup.ts
@@ -3,7 +3,7 @@ import { type KeyElement } from '../../../keyElement.js';
import OSKBaseKey from '../../../keyboard-layout/oskBaseKey.js';
import VisualKeyboard from '../../../visualKeyboard.js';
-import { DeviceSpec, ActiveSubKey, KeyDistribution, ActiveKeyBase } from '@keymanapp/keyboard-processor';
+import { DeviceSpec, ActiveSubKey, KeyDistribution, ActiveKeyBase } from 'keyman/engine/keyboard';
import { ConfigChangeClosure, GestureRecognizerConfiguration, GestureSequence, PaddedZoneSource, RecognitionZoneSource } from '@keymanapp/gesture-recognizer';
import { GestureHandler } from '../gestureHandler.js';
import { CorrectionLayout, CorrectionLayoutEntry } from '../../../correctionLayout.js';
diff --git a/web/src/engine/osk/src/input/gestures/gestureHandler.ts b/web/src/engine/osk/src/input/gestures/gestureHandler.ts
index 4c45c39e776..3c585de6465 100644
--- a/web/src/engine/osk/src/input/gestures/gestureHandler.ts
+++ b/web/src/engine/osk/src/input/gestures/gestureHandler.ts
@@ -1,4 +1,4 @@
-import { ActiveKeyBase, KeyDistribution } from "@keymanapp/keyboard-processor";
+import { ActiveKeyBase, KeyDistribution } from "keyman/engine/keyboard";
export interface GestureHandler {
/**
diff --git a/web/src/engine/osk/src/input/gestures/heldRepeater.ts b/web/src/engine/osk/src/input/gestures/heldRepeater.ts
index 0f74677ddab..025d8989125 100644
--- a/web/src/engine/osk/src/input/gestures/heldRepeater.ts
+++ b/web/src/engine/osk/src/input/gestures/heldRepeater.ts
@@ -1,5 +1,5 @@
import { GestureSequence } from "@keymanapp/gesture-recognizer";
-import { KeyDistribution } from "@keymanapp/keyboard-processor";
+import { KeyDistribution } from "keyman/engine/keyboard";
import { KeyElement } from "../../keyElement.js";
import { GestureHandler } from './gestureHandler.js';
diff --git a/web/src/engine/osk/src/input/gestures/specsForLayout.ts b/web/src/engine/osk/src/input/gestures/specsForLayout.ts
index 34d5576e236..eeddc9402eb 100644
--- a/web/src/engine/osk/src/input/gestures/specsForLayout.ts
+++ b/web/src/engine/osk/src/input/gestures/specsForLayout.ts
@@ -12,7 +12,7 @@ import ButtonClasses = TouchLayout.TouchLayoutKeySp;
import {
ActiveLayout,
deepCopy
-} from '@keymanapp/keyboard-processor';
+} from 'keyman/engine/keyboard';
import { type KeyElement } from '../../keyElement.js';
diff --git a/web/src/engine/osk/src/keyElement.ts b/web/src/engine/osk/src/keyElement.ts
index 01ae3a0c99d..c913bdfbff5 100644
--- a/web/src/engine/osk/src/keyElement.ts
+++ b/web/src/engine/osk/src/keyElement.ts
@@ -1,4 +1,4 @@
-import { ActiveSubKey } from '@keymanapp/keyboard-processor';
+import { ActiveSubKey } from 'keyman/engine/keyboard';
import OSKKey from "./keyboard-layout/oskKey.js";
export class KeyData {
diff --git a/web/src/engine/osk/src/keyboard-layout/gesturePreviewHost.ts b/web/src/engine/osk/src/keyboard-layout/gesturePreviewHost.ts
index 321de328b83..32a30c3f5d7 100644
--- a/web/src/engine/osk/src/keyboard-layout/gesturePreviewHost.ts
+++ b/web/src/engine/osk/src/keyboard-layout/gesturePreviewHost.ts
@@ -1,4 +1,4 @@
-import { ActiveKeyBase } from "@keymanapp/keyboard-processor";
+import { ActiveKeyBase } from "keyman/engine/keyboard";
import { EventEmitter } from "eventemitter3";
import { KeyElement } from "../keyElement.js";
diff --git a/web/src/engine/osk/src/keyboard-layout/oskBaseKey.ts b/web/src/engine/osk/src/keyboard-layout/oskBaseKey.ts
index e48253df60d..3d70ed40100 100644
--- a/web/src/engine/osk/src/keyboard-layout/oskBaseKey.ts
+++ b/web/src/engine/osk/src/keyboard-layout/oskBaseKey.ts
@@ -1,4 +1,4 @@
-import { ActiveKey, Codes } from '@keymanapp/keyboard-processor';
+import { ActiveKey, Codes } from 'keyman/engine/keyboard';
import OSKKey, { KeyLayoutParams, renameSpecialKey } from './oskKey.js';
import { KeyData, KeyElement, link } from '../keyElement.js';
diff --git a/web/src/engine/osk/src/keyboard-layout/oskKey.ts b/web/src/engine/osk/src/keyboard-layout/oskKey.ts
index 6404658ef67..2b9381afe30 100644
--- a/web/src/engine/osk/src/keyboard-layout/oskKey.ts
+++ b/web/src/engine/osk/src/keyboard-layout/oskKey.ts
@@ -1,4 +1,4 @@
-import { ActiveKey, ActiveSubKey, ButtonClass, ButtonClasses, DeviceSpec } from '@keymanapp/keyboard-processor';
+import { ActiveKey, ActiveSubKey, ButtonClass, ButtonClasses, DeviceSpec } from 'keyman/engine/keyboard';
// At present, we don't use @keymanapp/keyman. Just `keyman`. (Refer to /web/package.json.)
import specialChars from '../specialCharacters.js';
diff --git a/web/src/engine/osk/src/keyboard-layout/oskLayer.ts b/web/src/engine/osk/src/keyboard-layout/oskLayer.ts
index 61c43f22cf8..a08d2921a55 100644
--- a/web/src/engine/osk/src/keyboard-layout/oskLayer.ts
+++ b/web/src/engine/osk/src/keyboard-layout/oskLayer.ts
@@ -1,4 +1,4 @@
-import { ActiveLayer, ActiveLayout } from '@keymanapp/keyboard-processor';
+import { ActiveLayer, ActiveLayout } from 'keyman/engine/keyboard';
import OSKRow from './oskRow.js';
import OSKBaseKey from './oskBaseKey.js';
diff --git a/web/src/engine/osk/src/keyboard-layout/oskLayerGroup.ts b/web/src/engine/osk/src/keyboard-layout/oskLayerGroup.ts
index 5f4a3f45a3b..4bf4bc01b49 100644
--- a/web/src/engine/osk/src/keyboard-layout/oskLayerGroup.ts
+++ b/web/src/engine/osk/src/keyboard-layout/oskLayerGroup.ts
@@ -1,4 +1,4 @@
-import { type DeviceSpec, Keyboard, ActiveLayout, ButtonClasses } from '@keymanapp/keyboard-processor';
+import { type DeviceSpec, Keyboard, ActiveLayout, ButtonClasses } from 'keyman/engine/keyboard';
import { InputSample } from '@keymanapp/gesture-recognizer';
diff --git a/web/src/engine/osk/src/keyboard-layout/oskRow.ts b/web/src/engine/osk/src/keyboard-layout/oskRow.ts
index 8012e8438a1..91c6409cd77 100644
--- a/web/src/engine/osk/src/keyboard-layout/oskRow.ts
+++ b/web/src/engine/osk/src/keyboard-layout/oskRow.ts
@@ -1,4 +1,4 @@
-import { ActiveKey, ActiveLayer, ActiveRow } from '@keymanapp/keyboard-processor';
+import { ActiveKey, ActiveLayer, ActiveRow } from 'keyman/engine/keyboard';
import OSKBaseKey from './oskBaseKey.js';
import { ParsedLengthStyle } from '../lengthStyle.js';
diff --git a/web/src/engine/osk/src/views/anchoredOskView.ts b/web/src/engine/osk/src/views/anchoredOskView.ts
index fe2670c0b90..25ab819e3cd 100644
--- a/web/src/engine/osk/src/views/anchoredOskView.ts
+++ b/web/src/engine/osk/src/views/anchoredOskView.ts
@@ -1,4 +1,4 @@
-import { DeviceSpec } from '@keymanapp/keyboard-processor';
+import { DeviceSpec } from 'keyman/engine/keyboard';
import { landscapeView } from 'keyman/engine/dom-utils';
import OSKView, { OSKPos, OSKRect } from './oskView.js';
diff --git a/web/src/engine/osk/src/views/floatingOskView.ts b/web/src/engine/osk/src/views/floatingOskView.ts
index c296bd374bf..ba186fc99e2 100644
--- a/web/src/engine/osk/src/views/floatingOskView.ts
+++ b/web/src/engine/osk/src/views/floatingOskView.ts
@@ -1,4 +1,4 @@
-import { DeviceSpec, ManagedPromise, Version } from '@keymanapp/keyboard-processor';
+import { DeviceSpec, ManagedPromise, Version } from 'keyman/engine/keyboard';
import { getAbsoluteX, getAbsoluteY, landscapeView } from 'keyman/engine/dom-utils';
import { EmitterListenerSpy } from 'keyman/engine/events';
diff --git a/web/src/engine/osk/src/views/inlinedOskView.ts b/web/src/engine/osk/src/views/inlinedOskView.ts
index 06f89c0a921..d4dc48fd664 100644
--- a/web/src/engine/osk/src/views/inlinedOskView.ts
+++ b/web/src/engine/osk/src/views/inlinedOskView.ts
@@ -1,4 +1,4 @@
-import { DeviceSpec } from '@keymanapp/keyboard-processor';
+import { DeviceSpec } from 'keyman/engine/keyboard';
import OSKView, { OSKPos, OSKRect } from './oskView.js';
import VisualKeyboard from '../visualKeyboard.js';
diff --git a/web/src/engine/osk/src/views/keyEventSource.interface.ts b/web/src/engine/osk/src/views/keyEventSource.interface.ts
index 36a065bd32c..827a0b9af8f 100644
--- a/web/src/engine/osk/src/views/keyEventSource.interface.ts
+++ b/web/src/engine/osk/src/views/keyEventSource.interface.ts
@@ -1,5 +1,5 @@
import { EventEmitter } from "eventemitter3";
-import { type KeyEvent } from "@keymanapp/keyboard-processor";
+import { type KeyEvent } from 'keyman/engine/keyboard';
import { type RuleBehavior } from 'keyman/engine/js-processor';
export type KeyEventResultCallback = (result: RuleBehavior, error?: Error) => void;
diff --git a/web/src/engine/osk/src/views/oskView.ts b/web/src/engine/osk/src/views/oskView.ts
index 2a400a86620..b51c18fbcd9 100644
--- a/web/src/engine/osk/src/views/oskView.ts
+++ b/web/src/engine/osk/src/views/oskView.ts
@@ -17,7 +17,7 @@ import {
KeyboardProperties,
ManagedPromise,
type MinimalCodesInterface
-} from '@keymanapp/keyboard-processor';
+} from 'keyman/engine/keyboard';
import { createUnselectableElement, getAbsoluteX, getAbsoluteY, StylesheetManager } from 'keyman/engine/dom-utils';
import { EventListener, LegacyEventEmitter } from 'keyman/engine/events';
import { type MutableSystemStore, type SystemStoreMutationHandler } from 'keyman/engine/js-processor';
diff --git a/web/src/engine/osk/src/visualKeyboard.ts b/web/src/engine/osk/src/visualKeyboard.ts
index d0826634542..ba419e07945 100644
--- a/web/src/engine/osk/src/visualKeyboard.ts
+++ b/web/src/engine/osk/src/visualKeyboard.ts
@@ -13,9 +13,9 @@ import {
StateKeyMap,
ActiveSubKey,
timedPromise,
- ActiveKeyBase,
- isEmptyTransform
-} from '@keymanapp/keyboard-processor';
+ ActiveKeyBase
+} from 'keyman/engine/keyboard';
+import { isEmptyTransform } from 'keyman/engine/js-processor';
import { buildCorrectiveLayout } from './correctionLayout.js';
import { distributionFromDistanceMaps, keyTouchDistances } from './corrections.js';
diff --git a/web/src/engine/package-cache/src/cloud/queryEngine.ts b/web/src/engine/package-cache/src/cloud/queryEngine.ts
index eb989d2f00a..5f38c32aead 100644
--- a/web/src/engine/package-cache/src/cloud/queryEngine.ts
+++ b/web/src/engine/package-cache/src/cloud/queryEngine.ts
@@ -3,7 +3,7 @@ import { EventEmitter } from 'eventemitter3';
import { PathConfiguration } from 'keyman/engine/interfaces';
import { default as KeyboardStub, ErrorStub, KeyboardAPISpec, mergeAndResolveStubPromises } from '../keyboardStub.js';
-import { LanguageAPIPropertySpec, ManagedPromise, Version } from '@keymanapp/keyboard-processor';
+import { LanguageAPIPropertySpec, ManagedPromise, Version } from 'keyman/engine/keyboard';
import CloudRequesterInterface from './requesterInterface.js';
// For when the API call straight-up times out.
diff --git a/web/src/engine/package-cache/src/cloud/requesterInterface.ts b/web/src/engine/package-cache/src/cloud/requesterInterface.ts
index c0f8e6baf14..6c612d9cb20 100644
--- a/web/src/engine/package-cache/src/cloud/requesterInterface.ts
+++ b/web/src/engine/package-cache/src/cloud/requesterInterface.ts
@@ -1,4 +1,4 @@
-import { ManagedPromise } from '@keymanapp/keyboard-processor';
+import { ManagedPromise } from 'keyman/engine/keyboard';
export default interface CloudRequesterInterface {
request(query: string): {
diff --git a/web/src/engine/package-cache/src/domCloudRequester.ts b/web/src/engine/package-cache/src/domCloudRequester.ts
index ee80b0f0638..fe671d101ff 100644
--- a/web/src/engine/package-cache/src/domCloudRequester.ts
+++ b/web/src/engine/package-cache/src/domCloudRequester.ts
@@ -1,4 +1,4 @@
-import { ManagedPromise } from '@keymanapp/keyboard-processor';
+import { ManagedPromise } from 'keyman/engine/keyboard';
import CloudRequesterInterface from './cloud/requesterInterface.js';
import { CLOUD_MALFORMED_OBJECT_ERR, CLOUD_TIMEOUT_ERR, CLOUD_STUB_REGISTRATION_ERR } from './cloud/queryEngine.js';
diff --git a/web/src/engine/package-cache/src/keyboardRequisitioner.ts b/web/src/engine/package-cache/src/keyboardRequisitioner.ts
index 13cc7ecef83..fb2807de6ff 100644
--- a/web/src/engine/package-cache/src/keyboardRequisitioner.ts
+++ b/web/src/engine/package-cache/src/keyboardRequisitioner.ts
@@ -3,7 +3,7 @@ import {
KeyboardLoaderBase as KeyboardLoader,
LanguageAPIPropertySpec,
RawKeyboardMetadata
-} from "@keymanapp/keyboard-processor";
+} from "keyman/engine/keyboard";
import { PathConfiguration } from "keyman/engine/interfaces";
// TODO: is cleanup needed here, to use local paths instead?
diff --git a/web/src/engine/package-cache/src/keyboardStub.ts b/web/src/engine/package-cache/src/keyboardStub.ts
index 474d4cc9eff..a2b1d87d6fa 100644
--- a/web/src/engine/package-cache/src/keyboardStub.ts
+++ b/web/src/engine/package-cache/src/keyboardStub.ts
@@ -3,7 +3,7 @@ import {
type KeyboardAPIPropertyMultilangSpec as APICompoundKeyboard,
KeyboardProperties,
type LanguageAPIPropertySpec,
-} from '@keymanapp/keyboard-processor';
+} from 'keyman/engine/keyboard';
import { toPrefixedKeyboardId as prefixed } from './stubAndKeyboardCache.js';
diff --git a/web/src/engine/package-cache/src/nodeCloudRequester.ts b/web/src/engine/package-cache/src/nodeCloudRequester.ts
index bd9ff851597..e8461ff20d7 100644
--- a/web/src/engine/package-cache/src/nodeCloudRequester.ts
+++ b/web/src/engine/package-cache/src/nodeCloudRequester.ts
@@ -1,4 +1,4 @@
-import { ManagedPromise } from '@keymanapp/keyboard-processor';
+import { ManagedPromise } from 'keyman/engine/keyboard';
import CloudRequesterInterface from './cloud/requesterInterface.js';
import {
CLOUD_TIMEOUT_ERR,
diff --git a/web/src/engine/package-cache/src/stubAndKeyboardCache.ts b/web/src/engine/package-cache/src/stubAndKeyboardCache.ts
index 9fd70e74724..67d62446bee 100644
--- a/web/src/engine/package-cache/src/stubAndKeyboardCache.ts
+++ b/web/src/engine/package-cache/src/stubAndKeyboardCache.ts
@@ -1,4 +1,4 @@
-import { Keyboard, KeyboardLoaderBase as KeyboardLoader } from "@keymanapp/keyboard-processor";
+import { Keyboard, KeyboardLoaderBase as KeyboardLoader } from "keyman/engine/keyboard";
import { EventEmitter } from "eventemitter3";
import KeyboardStub from "./keyboardStub.js";
diff --git a/web/src/test/auto/dom/cases/browser/contextManager.spec.ts b/web/src/test/auto/dom/cases/browser/contextManager.spec.ts
index f31cc453185..291c299b2b0 100644
--- a/web/src/test/auto/dom/cases/browser/contextManager.spec.ts
+++ b/web/src/test/auto/dom/cases/browser/contextManager.spec.ts
@@ -5,8 +5,8 @@ import {
import { LegacyEventEmitter } from 'keyman/engine/events';
import { StubAndKeyboardCache, toPrefixedKeyboardId as prefixed } from 'keyman/engine/package-cache';
-import { KeyboardHarness, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
-import { DOMKeyboardLoader } from '@keymanapp/keyboard-processor/dom-keyboard-loader';
+import { KeyboardHarness, MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { DOMKeyboardLoader } from 'keyman/engine/keyboard/dom-keyboard-loader';
import { loadKeyboardsFromStubs } from '../../kbdLoader.js';
import { DeviceSpec, ManagedPromise, timedPromise } from '@keymanapp/web-utils';
diff --git a/web/src/test/auto/dom/cases/element-wrappers/element_interfaces.spec.ts b/web/src/test/auto/dom/cases/element-wrappers/element_interfaces.spec.ts
index cee86cc35e3..cdfc8814af3 100644
--- a/web/src/test/auto/dom/cases/element-wrappers/element_interfaces.spec.ts
+++ b/web/src/test/auto/dom/cases/element-wrappers/element_interfaces.spec.ts
@@ -1,6 +1,7 @@
import { assert } from 'chai';
-import { extendString, Mock } from '@keymanapp/keyboard-processor';
+import { extendString } from 'keyman/engine/keyboard';
+import { Mock } from 'keyman/engine/js-processor';
import * as wrappers from 'keyman/engine/element-wrappers';
import { DynamicElements } from '../../test_utils.js';
@@ -1385,7 +1386,7 @@ describe('Element Input/Output Interfacing', function () {
// Unique to the Mock type - element interface cloning tests. Is element state properly copied?
// As those require a very different setup, they're in the target_mocks.js test case file instead.
- // Basic text-retrieval unit tests are now done headlessly in @keymanapp/keyboard-processor.
+ // Basic text-retrieval unit tests are now done headlessly in keyman/engine/keyboard.
describe('Text Mutation', function () {
describe('deleteCharsBeforeCaret', function () {
diff --git a/web/src/test/auto/dom/cases/element-wrappers/target_mocks.spec.ts b/web/src/test/auto/dom/cases/element-wrappers/target_mocks.spec.ts
index e850efaa550..707d8638997 100644
--- a/web/src/test/auto/dom/cases/element-wrappers/target_mocks.spec.ts
+++ b/web/src/test/auto/dom/cases/element-wrappers/target_mocks.spec.ts
@@ -1,6 +1,7 @@
import { assert } from 'chai';
-import { extendString, Mock } from '@keymanapp/keyboard-processor';
+import { extendString } from 'keyman/engine/keyboard';
+import { Mock } from 'keyman/engine/js-processor';
import { Input } from 'keyman/engine/element-wrappers';
import { DEFAULT_BROWSER_TIMEOUT } from '@keymanapp/common-test-resources/test-timeouts.mjs';
diff --git a/web/src/test/auto/dom/cases/keyboard-processor/domKeyboardLoader.spec.ts b/web/src/test/auto/dom/cases/keyboard/domKeyboardLoader.spec.ts
similarity index 94%
rename from web/src/test/auto/dom/cases/keyboard-processor/domKeyboardLoader.spec.ts
rename to web/src/test/auto/dom/cases/keyboard/domKeyboardLoader.spec.ts
index 63414662fae..da610402eb0 100644
--- a/web/src/test/auto/dom/cases/keyboard-processor/domKeyboardLoader.spec.ts
+++ b/web/src/test/auto/dom/cases/keyboard/domKeyboardLoader.spec.ts
@@ -1,8 +1,8 @@
import { assert } from 'chai';
-import { DOMKeyboardLoader } from '@keymanapp/keyboard-processor/dom-keyboard-loader';
-import { extendString, KeyboardHarness, Keyboard, MinimalKeymanGlobal, Mock, DeviceSpec, KeyboardKeymanGlobal } from '@keymanapp/keyboard-processor';
-import { KeyboardInterface } from 'keyman/engine/js-processor';
+import { DOMKeyboardLoader } from 'keyman/engine/keyboard/dom-keyboard-loader';
+import { extendString, KeyboardHarness, Keyboard, MinimalKeymanGlobal, DeviceSpec, KeyboardKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface, Mock } from 'keyman/engine/js-processor';
declare let window: typeof globalThis;
// KeymanEngine from the web/ folder... when available.
diff --git a/web/src/test/auto/dom/cases/packages/keyboardRequisitioner.spec.ts b/web/src/test/auto/dom/cases/packages/keyboardRequisitioner.spec.ts
index ab585bc9e07..7ad8356a322 100644
--- a/web/src/test/auto/dom/cases/packages/keyboardRequisitioner.spec.ts
+++ b/web/src/test/auto/dom/cases/packages/keyboardRequisitioner.spec.ts
@@ -1,8 +1,8 @@
import { assert } from 'chai';
import sinon from 'sinon';
-import { KeyboardHarness, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
-import { DOMKeyboardLoader } from '@keymanapp/keyboard-processor/dom-keyboard-loader';
+import { KeyboardHarness, MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { DOMKeyboardLoader } from 'keyman/engine/keyboard/dom-keyboard-loader';
import { PathConfiguration } from 'keyman/engine/interfaces';
import { CloudQueryEngine, KeyboardRequisitioner, type KeyboardStub } from 'keyman/engine/package-cache';
import DOMCloudRequester from 'keyman/engine/package-cache/dom-requester';
diff --git a/web/src/test/auto/dom/kbdLoader.ts b/web/src/test/auto/dom/kbdLoader.ts
index 2254011857f..8b5c081c758 100644
--- a/web/src/test/auto/dom/kbdLoader.ts
+++ b/web/src/test/auto/dom/kbdLoader.ts
@@ -1,12 +1,12 @@
import {
DOMKeyboardLoader
-} from '@keymanapp/keyboard-processor/dom-keyboard-loader';
+} from 'keyman/engine/keyboard/dom-keyboard-loader';
import {
Keyboard,
KeyboardProperties,
MinimalKeymanGlobal
-} from '@keymanapp/keyboard-processor';
+} from 'keyman/engine/keyboard';
import { KeyboardInterface } from 'keyman/engine/js-processor';
import { KeyboardStub } from 'keyman/engine/package-cache';
diff --git a/web/src/test/auto/headless/app/browser/hardware-event-processing.tests.ts b/web/src/test/auto/headless/app/browser/hardware-event-processing.tests.ts
index 447b2b1806e..d00425362d1 100644
--- a/web/src/test/auto/headless/app/browser/hardware-event-processing.tests.ts
+++ b/web/src/test/auto/headless/app/browser/hardware-event-processing.tests.ts
@@ -4,14 +4,14 @@ import { preprocessKeyboardEvent } from 'keyman/app/browser';
import { processForMnemonicsAndLegacy } from 'keyman/engine/main';
import { PhysicalInputEventSpec } from '@keymanapp/recorder-core';
import { DeviceSpec } from '@keymanapp/web-utils';
-import { Codes, Keyboard, KeyEvent } from '@keymanapp/keyboard-processor';
+import { Codes, Keyboard, KeyEvent } from 'keyman/engine/keyboard';
const ModifierCodes = Codes.modifierCodes;
const KeyCodes = Codes.keyCodes;
const DUMMY_DEVICE = new DeviceSpec('chrome', 'desktop', 'windows', false);
-// Compare and contrast the unit tests here with those for keyboard-processor unit testing
+// Compare and contrast the unit tests here with those for keyboard unit testing
// in the non-positional-rules set; the output objects here should have the same format
// as the inputs for rules as used there.
diff --git a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.spec.js b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.spec.js
index 3738f6824e7..f0d5a5a6dbc 100644
--- a/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.spec.js
+++ b/web/src/test/auto/headless/engine/interfaces/prediction/predictionContext.spec.js
@@ -4,8 +4,8 @@ import sinon from 'sinon';
import { LanguageProcessor, TranscriptionCache } from 'keyman/engine/main';
import { PredictionContext } from 'keyman/engine/interfaces';
import { Worker as LMWorker } from "@keymanapp/lexical-model-layer/node";
-import { DeviceSpec, Mock } from '@keymanapp/keyboard-processor';
-import { KeyboardProcessor } from 'keyman/engine/js-processor';
+import { DeviceSpec } from 'keyman/engine/keyboard';
+import { KeyboardProcessor, Mock } from 'keyman/engine/js-processor';
function compileDummyModel(suggestionSets) {
return `
diff --git a/common/web/keyboard-processor/tests/node/basic-engine.js b/web/src/test/auto/headless/engine/js-processor/basic-engine.js
similarity index 87%
rename from common/web/keyboard-processor/tests/node/basic-engine.js
rename to web/src/test/auto/headless/engine/js-processor/basic-engine.js
index 1e7ff3a205e..68eb5136e3d 100644
--- a/common/web/keyboard-processor/tests/node/basic-engine.js
+++ b/web/src/test/auto/headless/engine/js-processor/basic-engine.js
@@ -4,8 +4,9 @@ import fs from 'fs';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { KeyboardInterface, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
import { KeyboardTest, NodeProctor } from '@keymanapp/recorder-core';
describe('Engine - Basic Simulation', function() {
@@ -24,7 +25,7 @@ describe('Engine - Basic Simulation', function() {
before(async function() {
// -- START: Standard Recorder-based unit test loading boilerplate --
let keyboardLoader = new NodeKeyboardLoader(new KeyboardInterface({}, MinimalKeymanGlobal));
- let keyboard = await keyboardLoader.loadKeyboardFromPath('../../test/' + testSuite.keyboard.filename);
+ let keyboard = await keyboardLoader.loadKeyboardFromPath('../../../../../common/test/' + testSuite.keyboard.filename);
keyboardWithHarness = keyboardLoader.harness;
keyboardWithHarness.activeKeyboard = keyboard;
diff --git a/common/web/keyboard-processor/tests/node/basic-init.js b/web/src/test/auto/headless/engine/js-processor/basic-init.js
similarity index 92%
rename from common/web/keyboard-processor/tests/node/basic-init.js
rename to web/src/test/auto/headless/engine/js-processor/basic-init.js
index 8f04a6a6e8b..cabdb9d4322 100644
--- a/common/web/keyboard-processor/tests/node/basic-init.js
+++ b/web/src/test/auto/headless/engine/js-processor/basic-init.js
@@ -3,8 +3,8 @@ import { assert } from 'chai';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { KeyboardProcessor } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { KeyboardProcessor } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
global.keyman = {}; // So that keyboard-based checks against the global `keyman` succeed.
// 10.0+ dependent keyboards, like khmer_angkor, will otherwise fail to load.
diff --git a/common/web/keyboard-processor/tests/node/bundled-module.js b/web/src/test/auto/headless/engine/js-processor/bundled-module.js
similarity index 74%
rename from common/web/keyboard-processor/tests/node/bundled-module.js
rename to web/src/test/auto/headless/engine/js-processor/bundled-module.js
index bfff937b626..a6b80d50043 100644
--- a/common/web/keyboard-processor/tests/node/bundled-module.js
+++ b/web/src/test/auto/headless/engine/js-processor/bundled-module.js
@@ -1,5 +1,6 @@
import { assert } from "chai";
-import * as Package from "../../build/lib/index.mjs";
+import * as Package from "keyman/engine/js-processor";
+import * as Package2 from "keyman/engine/keyboard";
// A few small tests to ensure that the ES Module bundle was successfully constructed and is usable.
@@ -12,7 +13,7 @@ var toSupplementaryPairString = function(code){
let u = toSupplementaryPairString;
-describe('Bundled ES Module', function() {
+describe('Bundled ES Module for js-processor', function() {
describe('KeyboardProcessor', function () {
it('should initialize without errors', function () {
let kp = new Package.KeyboardProcessor();
@@ -40,11 +41,20 @@ describe('Bundled ES Module', function() {
}
});
});
+});
- describe("Imported `utils`", function() {
+describe('Bundled ES Module for keyboard', function () {
+ describe('Keyboard', function () {
+ it('should initialize without errors', function () {
+ let kp = new Package2.Keyboard();
+ assert.isNotNull(kp);
+ });
+ });
+
+ describe("Imported `utils`", function () {
it("should include `utils` package's Version class", () => {
- let v16 = new Package.Version([16, 1]);
+ let v16 = new Package2.Version([16, 1]);
assert.equal(v16.toString(), "16.1");
});
- })
-});
\ No newline at end of file
+ });
+});
diff --git a/common/web/keyboard-processor/tests/node/chirality.js b/web/src/test/auto/headless/engine/js-processor/chirality.js
similarity index 97%
rename from common/web/keyboard-processor/tests/node/chirality.js
rename to web/src/test/auto/headless/engine/js-processor/chirality.js
index 70dca3d47fd..c2220b7f5d2 100644
--- a/common/web/keyboard-processor/tests/node/chirality.js
+++ b/web/src/test/auto/headless/engine/js-processor/chirality.js
@@ -4,8 +4,9 @@ import fs from 'fs';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { KeyboardInterface, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
import { KeyboardTest, NodeProctor } from '@keymanapp/recorder-core';
import { ModifierKeyConstants } from '@keymanapp/common-types';
@@ -25,7 +26,7 @@ describe('Engine - Chirality', function() {
before(async function() {
// -- START: Standard Recorder-based unit test loading boilerplate --
let keyboardLoader = new NodeKeyboardLoader(new KeyboardInterface({}, MinimalKeymanGlobal));
- let keyboard = await keyboardLoader.loadKeyboardFromPath('../../test/' + testSuite.keyboard.filename);
+ let keyboard = await keyboardLoader.loadKeyboardFromPath('../../../../../common/test/' + testSuite.keyboard.filename);
keyboardWithHarness = keyboardLoader.harness;
keyboardWithHarness.activeKeyboard = keyboard;
diff --git a/common/web/keyboard-processor/tests/node/deadkeys.js b/web/src/test/auto/headless/engine/js-processor/deadkeys.js
similarity index 87%
rename from common/web/keyboard-processor/tests/node/deadkeys.js
rename to web/src/test/auto/headless/engine/js-processor/deadkeys.js
index e2fe70837eb..fd5d1457d3d 100644
--- a/common/web/keyboard-processor/tests/node/deadkeys.js
+++ b/web/src/test/auto/headless/engine/js-processor/deadkeys.js
@@ -4,8 +4,9 @@ import fs from 'fs';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { KeyboardInterface, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
import { KeyboardTest, NodeProctor } from '@keymanapp/recorder-core';
describe('Engine - Deadkeys', function() {
@@ -24,7 +25,7 @@ describe('Engine - Deadkeys', function() {
before(async function() {
// -- START: Standard Recorder-based unit test loading boilerplate --
let keyboardLoader = new NodeKeyboardLoader(new KeyboardInterface({}, MinimalKeymanGlobal));
- let keyboard = await keyboardLoader.loadKeyboardFromPath('../../test/' + testSuite.keyboard.filename);
+ let keyboard = await keyboardLoader.loadKeyboardFromPath('../../../../../common/test/' + testSuite.keyboard.filename);
keyboardWithHarness = keyboardLoader.harness;
keyboardWithHarness.activeKeyboard = keyboard;
diff --git a/common/web/keyboard-processor/tests/node/engine/context.js b/web/src/test/auto/headless/engine/js-processor/engine/context.js
similarity index 99%
rename from common/web/keyboard-processor/tests/node/engine/context.js
rename to web/src/test/auto/headless/engine/js-processor/engine/context.js
index a1fe5863df9..a355ead2650 100644
--- a/common/web/keyboard-processor/tests/node/engine/context.js
+++ b/web/src/test/auto/headless/engine/js-processor/engine/context.js
@@ -3,8 +3,9 @@ import { assert } from 'chai';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { KeyboardInterface, KeyboardProcessor, MinimalKeymanGlobal, Mock } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface, KeyboardProcessor, Mock } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
import { NodeProctor, RecordedKeystrokeSequence } from '@keymanapp/recorder-core';
diff --git a/common/web/keyboard-processor/tests/node/engine/notany_context.js b/web/src/test/auto/headless/engine/js-processor/engine/notany_context.js
similarity index 94%
rename from common/web/keyboard-processor/tests/node/engine/notany_context.js
rename to web/src/test/auto/headless/engine/js-processor/engine/notany_context.js
index 2329463d465..ecc7dd92d0d 100644
--- a/common/web/keyboard-processor/tests/node/engine/notany_context.js
+++ b/web/src/test/auto/headless/engine/js-processor/engine/notany_context.js
@@ -3,8 +3,9 @@ import { assert } from 'chai';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { KeyboardInterface, MinimalKeymanGlobal, Mock } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface, Mock } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
import { NodeProctor, RecordedKeystrokeSequence } from '@keymanapp/recorder-core';
import { extendString } from '@keymanapp/web-utils';
diff --git a/common/web/keyboard-processor/tests/node/engine/stores.js b/web/src/test/auto/headless/engine/js-processor/engine/stores.js
similarity index 94%
rename from common/web/keyboard-processor/tests/node/engine/stores.js
rename to web/src/test/auto/headless/engine/js-processor/engine/stores.js
index ade1c2bd471..8174cbe0779 100644
--- a/common/web/keyboard-processor/tests/node/engine/stores.js
+++ b/web/src/test/auto/headless/engine/js-processor/engine/stores.js
@@ -1,6 +1,7 @@
import { assert } from 'chai';
-import { Keyboard, KeyboardProcessor } from '@keymanapp/keyboard-processor';
+import { Keyboard } from 'keyman/engine/keyboard';
+import { KeyboardProcessor } from 'keyman/engine/js-processor';
import { extendString } from '@keymanapp/web-utils';
extendString();
diff --git a/common/web/keyboard-processor/tests/node/engine/unmatched_final_group.js b/web/src/test/auto/headless/engine/js-processor/engine/unmatched_final_group.js
similarity index 84%
rename from common/web/keyboard-processor/tests/node/engine/unmatched_final_group.js
rename to web/src/test/auto/headless/engine/js-processor/engine/unmatched_final_group.js
index 81f9765da4c..8bfee041ebe 100644
--- a/common/web/keyboard-processor/tests/node/engine/unmatched_final_group.js
+++ b/web/src/test/auto/headless/engine/js-processor/engine/unmatched_final_group.js
@@ -4,8 +4,9 @@ import fs from 'fs';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { KeyboardInterface, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
import { KeyboardTest, NodeProctor } from '@keymanapp/recorder-core';
describe('Engine - Unmatched Final Groups', function() {
@@ -23,7 +24,7 @@ describe('Engine - Unmatched Final Groups', function() {
before(async function() {
// -- START: Standard Recorder-based unit test loading boilerplate --
let keyboardLoader = new NodeKeyboardLoader(new KeyboardInterface({}, MinimalKeymanGlobal));
- const keyboard = await keyboardLoader.loadKeyboardFromPath('../../test/' + testSuite.keyboard.filename);
+ const keyboard = await keyboardLoader.loadKeyboardFromPath('../../../../../common/test/' + testSuite.keyboard.filename);
keyboardWithHarness = keyboardLoader.harness;
keyboardWithHarness.activeKeyboard = keyboard;
diff --git a/web/src/test/auto/headless/engine/js-processor/kbdInterface.tests.js b/web/src/test/auto/headless/engine/js-processor/kbdInterface.tests.js
new file mode 100644
index 00000000000..0d084964425
--- /dev/null
+++ b/web/src/test/auto/headless/engine/js-processor/kbdInterface.tests.js
@@ -0,0 +1,91 @@
+import { assert } from 'chai';
+
+import { createRequire } from 'module';
+const require = createRequire(import.meta.url);
+
+import { MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface, Mock } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
+
+describe('Headless keyboard loading', function () {
+ const laoPath = require.resolve('@keymanapp/common-test-resources/keyboards/lao_2008_basic.js');
+ const khmerPath = require.resolve('@keymanapp/common-test-resources/keyboards/khmer_angkor.js');
+ const nonKeyboardPath = require.resolve('@keymanapp/common-test-resources/index.mjs');
+ const ipaPath = require.resolve('@keymanapp/common-test-resources/keyboards/sil_ipa.js');
+ // Common test suite setup.
+
+ let device = {
+ formFactor: 'desktop',
+ OS: 'windows',
+ browser: 'native'
+ }
+
+ describe('Full harness loading', () => {
+ it('successfully loads', async function () {
+ // -- START: Standard Recorder-based unit test loading boilerplate --
+ let harness = new KeyboardInterface({}, MinimalKeymanGlobal);
+ let keyboardLoader = new NodeKeyboardLoader(harness);
+ let keyboard = await keyboardLoader.loadKeyboardFromPath(laoPath);
+ harness.activeKeyboard = keyboard;
+ // -- END: Standard Recorder-based unit test loading boilerplate --
+
+ // This part provides assurance that the keyboard properly loaded.
+ assert.equal(keyboard.id, "Keyboard_lao_2008_basic");
+ });
+
+ it('can evaluate rules', async function () {
+ // -- START: Standard Recorder-based unit test loading boilerplate --
+ let harness = new KeyboardInterface({}, MinimalKeymanGlobal);
+ let keyboardLoader = new NodeKeyboardLoader(harness);
+ let keyboard = await keyboardLoader.loadKeyboardFromPath(laoPath);
+ harness.activeKeyboard = keyboard;
+ // -- END: Standard Recorder-based unit test loading boilerplate --
+
+ // Runs a blank KeyEvent through the keyboard's rule processing.
+ harness.processKeystroke(new Mock(), keyboard.constructNullKeyEvent(device));
+ });
+
+ it('does not change the active kehboard', async function () {
+ let harness = new KeyboardInterface({}, MinimalKeymanGlobal);
+ let keyboardLoader = new NodeKeyboardLoader(harness);
+ const lao_keyboard = await keyboardLoader.loadKeyboardFromPath(laoPath);
+ assert.isNotOk(harness.activeKeyboard);
+ assert.isOk(lao_keyboard);
+
+ // This part provides assurance that the keyboard properly loaded.
+ assert.equal(lao_keyboard.id, "Keyboard_lao_2008_basic");
+
+ harness.activeKeyboard = lao_keyboard;
+
+ const khmer_keyboard = await keyboardLoader.loadKeyboardFromPath(khmerPath);
+ assert.strictEqual(lao_keyboard, harness.activeKeyboard);
+
+ assert.equal(khmer_keyboard.id, "Keyboard_khmer_angkor");
+ });
+
+ it('throws distinct errors', async function () {
+ const invalidPath = 'totally_invalid_path.js';
+
+ let harness = new KeyboardInterface({}, MinimalKeymanGlobal);
+ let keyboardLoader = new NodeKeyboardLoader(harness);
+ let missingError;
+ try {
+ await keyboardLoader.loadKeyboardFromPath(invalidPath);
+ } catch (err) {
+ missingError = err;
+ }
+ assert.isOk(missingError);
+
+ let scriptLoadError;
+ try {
+ await keyboardLoader.loadKeyboardFromPath(nonKeyboardPath);
+ } catch (err) {
+ scriptLoadError = err;
+ }
+ assert.isOk(scriptLoadError);
+
+ // The main test: do the errors match?
+ assert.notEqual(scriptLoadError.message, missingError.message);
+ });
+ })
+});
diff --git a/common/web/keyboard-processor/tests/node/mocks.js b/web/src/test/auto/headless/engine/js-processor/mocks.js
similarity index 98%
rename from common/web/keyboard-processor/tests/node/mocks.js
rename to web/src/test/auto/headless/engine/js-processor/mocks.js
index 9a84e2a8cc0..bad81bfcca4 100644
--- a/common/web/keyboard-processor/tests/node/mocks.js
+++ b/web/src/test/auto/headless/engine/js-processor/mocks.js
@@ -1,5 +1,5 @@
import { assert } from 'chai';
-import { Mock } from '@keymanapp/keyboard-processor';
+import { Mock } from 'keyman/engine/js-processor';
describe('Mocks', function() {
describe('app|les', () => {
diff --git a/common/web/keyboard-processor/tests/node/non-positional-rules.js b/web/src/test/auto/headless/engine/js-processor/non-positional-rules.js
similarity index 97%
rename from common/web/keyboard-processor/tests/node/non-positional-rules.js
rename to web/src/test/auto/headless/engine/js-processor/non-positional-rules.js
index aba54643aee..a65cec6708d 100644
--- a/common/web/keyboard-processor/tests/node/non-positional-rules.js
+++ b/web/src/test/auto/headless/engine/js-processor/non-positional-rules.js
@@ -4,8 +4,9 @@ import { ModifierKeyConstants } from '@keymanapp/common-types';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { Codes, KeyboardInterface, KeyEvent, MinimalKeymanGlobal, Mock } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { Codes, KeyEvent, MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface, Mock } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
// Compare and contrast the unit tests here with those for app/browser key-event unit testing
// in the hardware-event-processing set; the output objects there should have the same format
diff --git a/common/web/keyboard-processor/tests/node/specialized-backspace.js b/web/src/test/auto/headless/engine/js-processor/specialized-backspace.js
similarity index 98%
rename from common/web/keyboard-processor/tests/node/specialized-backspace.js
rename to web/src/test/auto/headless/engine/js-processor/specialized-backspace.js
index db2be071e8f..7e35817f07f 100644
--- a/common/web/keyboard-processor/tests/node/specialized-backspace.js
+++ b/web/src/test/auto/headless/engine/js-processor/specialized-backspace.js
@@ -4,8 +4,9 @@ import fs from 'fs';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { Codes, KeyboardInterface, KeyboardProcessor, KeyEvent, MinimalKeymanGlobal, Mock } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { Codes, KeyEvent, MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface, KeyboardProcessor, Mock } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
import { ModifierKeyConstants } from '@keymanapp/common-types';
diff --git a/common/web/keyboard-processor/tests/node/transcriptions.js b/web/src/test/auto/headless/engine/js-processor/transcriptions.js
similarity index 99%
rename from common/web/keyboard-processor/tests/node/transcriptions.js
rename to web/src/test/auto/headless/engine/js-processor/transcriptions.js
index b071532bf2a..45c09b3b80c 100644
--- a/common/web/keyboard-processor/tests/node/transcriptions.js
+++ b/web/src/test/auto/headless/engine/js-processor/transcriptions.js
@@ -1,6 +1,6 @@
import { assert } from 'chai';
-import { Mock, findCommonSubstringEndIndex } from '@keymanapp/keyboard-processor';
+import { Mock, findCommonSubstringEndIndex } from 'keyman/engine/js-processor';
import { extendString } from '@keymanapp/web-utils';
extendString(); // Ensure KMW's string-extension functionality is available.
diff --git a/common/web/keyboard-processor/tests/node/keyboard-loading.js b/web/src/test/auto/headless/engine/keyboard/keyboard-loading.js
similarity index 56%
rename from common/web/keyboard-processor/tests/node/keyboard-loading.js
rename to web/src/test/auto/headless/engine/keyboard/keyboard-loading.js
index 500780dfedb..0dd89a36148 100644
--- a/common/web/keyboard-processor/tests/node/keyboard-loading.js
+++ b/web/src/test/auto/headless/engine/keyboard/keyboard-loading.js
@@ -1,11 +1,11 @@
import { assert } from 'chai';
-import fs from 'fs';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { KeyboardHarness, KeyboardInterface, KeyboardLoaderBase, MinimalKeymanGlobal, Mock } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { KeyboardHarness, MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { KeyboardInterface, Mock } from 'keyman/engine/js-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
describe('Headless keyboard loading', function() {
const laoPath = require.resolve('@keymanapp/common-test-resources/keyboards/lao_2008_basic.js');
@@ -40,7 +40,7 @@ describe('Headless keyboard loading', function() {
it('successfully loads (has variable stores)', async () => {
// -- START: Standard Recorder-based unit test loading boilerplate --
- let harness = new KeyboardInterface({}, MinimalKeymanGlobal);
+ let harness = new KeyboardHarness({}, MinimalKeymanGlobal);
let keyboardLoader = new NodeKeyboardLoader(harness);
let keyboard = await keyboardLoader.loadKeyboardFromPath(ipaPath);
// -- END: Standard Recorder-based unit test loading boilerplate --
@@ -91,73 +91,4 @@ describe('Headless keyboard loading', function() {
assert.isFalse(mobileLayout.hasMultitaps);
});
});
-
- describe('Full harness loading', () => {
- it('successfully loads', async function() {
- // -- START: Standard Recorder-based unit test loading boilerplate --
- let harness = new KeyboardInterface({}, MinimalKeymanGlobal);
- let keyboardLoader = new NodeKeyboardLoader(harness);
- let keyboard = await keyboardLoader.loadKeyboardFromPath(laoPath);
- harness.activeKeyboard = keyboard;
- // -- END: Standard Recorder-based unit test loading boilerplate --
-
- // This part provides assurance that the keyboard properly loaded.
- assert.equal(keyboard.id, "Keyboard_lao_2008_basic");
- });
-
- it('can evaluate rules', async function() {
- // -- START: Standard Recorder-based unit test loading boilerplate --
- let harness = new KeyboardInterface({}, MinimalKeymanGlobal);
- let keyboardLoader = new NodeKeyboardLoader(harness);
- let keyboard = await keyboardLoader.loadKeyboardFromPath(laoPath);
- harness.activeKeyboard = keyboard;
- // -- END: Standard Recorder-based unit test loading boilerplate --
-
- // Runs a blank KeyEvent through the keyboard's rule processing.
- harness.processKeystroke(new Mock(), keyboard.constructNullKeyEvent(device));
- });
-
- it('does not change the active kehboard', async function() {
- let harness = new KeyboardInterface({}, MinimalKeymanGlobal);
- let keyboardLoader = new NodeKeyboardLoader(harness);
- const lao_keyboard = await keyboardLoader.loadKeyboardFromPath(laoPath);
- assert.isNotOk(harness.activeKeyboard);
- assert.isOk(lao_keyboard);
-
- // This part provides assurance that the keyboard properly loaded.
- assert.equal(lao_keyboard.id, "Keyboard_lao_2008_basic");
-
- harness.activeKeyboard = lao_keyboard;
-
- const khmer_keyboard = await keyboardLoader.loadKeyboardFromPath(khmerPath);
- assert.strictEqual(lao_keyboard, harness.activeKeyboard);
-
- assert.equal(khmer_keyboard.id, "Keyboard_khmer_angkor");
- });
-
- it('throws distinct errors', async function() {
- const invalidPath = 'totally_invalid_path.js';
-
- let harness = new KeyboardInterface({}, MinimalKeymanGlobal);
- let keyboardLoader = new NodeKeyboardLoader(harness);
- let missingError;
- try {
- await keyboardLoader.loadKeyboardFromPath(invalidPath);
- } catch (err) {
- missingError = err;
- }
- assert.isOk(missingError);
-
- let scriptLoadError;
- try {
- await keyboardLoader.loadKeyboardFromPath(nonKeyboardPath);
- } catch (err) {
- scriptLoadError = err;
- }
- assert.isOk(scriptLoadError);
-
- // The main test: do the errors match?
- assert.notEqual(scriptLoadError.message, missingError.message);
- });
- })
-});
\ No newline at end of file
+});
diff --git a/common/web/keyboard-processor/tests/node/keyboard-properties.js b/web/src/test/auto/headless/engine/keyboard/keyboard-properties.js
similarity index 98%
rename from common/web/keyboard-processor/tests/node/keyboard-properties.js
rename to web/src/test/auto/headless/engine/keyboard/keyboard-properties.js
index b6ec2dbf8d2..f23d56e3b52 100644
--- a/common/web/keyboard-processor/tests/node/keyboard-properties.js
+++ b/web/src/test/auto/headless/engine/keyboard/keyboard-properties.js
@@ -5,7 +5,7 @@ import path from 'path';
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
-import { KeyboardProperties, SpacebarText } from '@keymanapp/keyboard-processor';
+import { KeyboardProperties, SpacebarText } from 'keyman/engine/keyboard';
describe('Keyboard Properties', function() {
let commonResourcesPackage = '@keymanapp/common-test-resources';
diff --git a/web/src/test/auto/headless/engine/main/headless/inputProcessor.spec.js b/web/src/test/auto/headless/engine/main/headless/inputProcessor.spec.js
index d1b728e6253..56aa2f3e5ed 100644
--- a/web/src/test/auto/headless/engine/main/headless/inputProcessor.spec.js
+++ b/web/src/test/auto/headless/engine/main/headless/inputProcessor.spec.js
@@ -5,8 +5,8 @@ import { createRequire } from 'module';
const require = createRequire(import.meta.url);
import { InputProcessor } from 'keyman/engine/main';
-import { KeyboardInterface, MinimalKeymanGlobal, Mock } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { KeyboardInterface, MinimalKeymanGlobal, Mock } from 'keyman/engine/keyboard';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
import { KeyboardTest } from '@keymanapp/recorder-core';
import { Worker } from '@keymanapp/lexical-model-layer/node';
@@ -48,8 +48,8 @@ describe('InputProcessor', function() {
assert.isUndefined(core.activeKeyboard); // No keyboard should be loaded yet.
assert.isUndefined(core.activeModel); // Same for the model.
- // These checks are lifted from the keyboard-processor init checks found in
- // common/web/keyboard-processor/tests/cases/basic-init.js.
+ // These checks are lifted from the keyboard init checks found in
+ // web/src/test/auto/headless/engine/js-processor/basic-init.js.
assert.equal('us', core.keyboardProcessor.baseLayout, 'KeyboardProcessor has unexpected base layout')
assert.isNotNull(global.KeymanWeb, 'KeymanWeb global was not automatically installed');
assert.equal('default', core.keyboardProcessor.layerId, 'Default layer is not set to "default"');
diff --git a/web/src/test/auto/headless/engine/main/headless/languageProcessor.spec.js b/web/src/test/auto/headless/engine/main/headless/languageProcessor.spec.js
index a0eec4c5319..e4572de21d0 100644
--- a/web/src/test/auto/headless/engine/main/headless/languageProcessor.spec.js
+++ b/web/src/test/auto/headless/engine/main/headless/languageProcessor.spec.js
@@ -2,7 +2,7 @@ import { assert } from 'chai';
import { LanguageProcessor, TranscriptionCache } from 'keyman/engine/main';
import { SourcemappedWorker as LMWorker } from "@keymanapp/lexical-model-layer/node";
-import { Mock } from '@keymanapp/keyboard-processor';
+import { Mock } from 'keyman/engine/keyboard';
/*
* Unit tests for the Dummy prediction model.
@@ -43,8 +43,8 @@ describe('LanguageProcessor', function() {
it('has expected default values after initialization', function () {
let languageProcessor = new LanguageProcessor(worker, new TranscriptionCache());
- // These checks are lifted from the keyboard-processor init checks found in
- // common/web/keyboard-processor/tests/cases/basic-init.js.
+ // These checks are lifted from the keyboard init checks found in
+ // web/src/test/auto/headless/engine/js-processor/basic-init.js.
assert.isDefined(languageProcessor.lmEngine);
assert.isUndefined(languageProcessor.activeModel);
assert.isFalse(languageProcessor.isActive);
diff --git a/web/src/test/auto/headless/engine/osk/input/gestures/browser/subkeyPopup.tests.ts b/web/src/test/auto/headless/engine/osk/input/gestures/browser/subkeyPopup.tests.ts
index b70c17d7dc1..72679897f37 100644
--- a/web/src/test/auto/headless/engine/osk/input/gestures/browser/subkeyPopup.tests.ts
+++ b/web/src/test/auto/headless/engine/osk/input/gestures/browser/subkeyPopup.tests.ts
@@ -4,7 +4,7 @@ import { JSDOM } from 'jsdom';
import sinon from 'sinon';
import { GesturePath, GestureSequence, GestureSource, GestureSourceSubview } from '@keymanapp/gesture-recognizer';
-import { ActiveSubKey, DeviceSpec } from '@keymanapp/keyboard-processor';
+import { ActiveSubKey, DeviceSpec } from 'keyman/engine/keyboard';
import { DEFAULT_GESTURE_PARAMS, KeyElement, VisualKeyboard } from 'keyman/engine/osk';
import { OSKBaseKey, OSKRow, SubkeyPopup, link } from 'keyman/engine/osk/internals';
diff --git a/web/src/test/auto/headless/engine/package-cache/keyboardRequisitioner.js b/web/src/test/auto/headless/engine/package-cache/keyboardRequisitioner.js
index b2d64c05538..2ca0578790e 100644
--- a/web/src/test/auto/headless/engine/package-cache/keyboardRequisitioner.js
+++ b/web/src/test/auto/headless/engine/package-cache/keyboardRequisitioner.js
@@ -2,8 +2,8 @@ import { assert } from 'chai';
import sinon from 'sinon';
import fs from 'fs';
-import { KeyboardHarness, ManagedPromise, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
+import { KeyboardHarness, ManagedPromise, MinimalKeymanGlobal } from 'keyman/engine/keyboard';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
import {
KeyboardRequisitioner,
toPrefixedKeyboardId as prefixed
diff --git a/web/src/test/auto/headless/engine/package-cache/stubAndKeyboardCache.js b/web/src/test/auto/headless/engine/package-cache/stubAndKeyboardCache.js
index 03f6fbf5c5a..f49bb1238f6 100644
--- a/web/src/test/auto/headless/engine/package-cache/stubAndKeyboardCache.js
+++ b/web/src/test/auto/headless/engine/package-cache/stubAndKeyboardCache.js
@@ -4,8 +4,8 @@ import fs from 'fs';
import { KeyboardStub, StubAndKeyboardCache } from 'keyman/engine/package-cache';
-import { NodeKeyboardLoader } from '@keymanapp/keyboard-processor/node-keyboard-loader';
-import { KeyboardHarness, MinimalKeymanGlobal } from '@keymanapp/keyboard-processor';
+import { NodeKeyboardLoader } from 'keyman/engine/keyboard/node-keyboard-loader';
+import { KeyboardHarness, MinimalKeymanGlobal } from 'keyman/engine/keyboard';
import path from 'path';
diff --git a/web/src/test/manual/web/chirality/chirality.js b/web/src/test/manual/web/chirality/chirality.js
index eaf349463c1..68740ffc308 100644
--- a/web/src/test/manual/web/chirality/chirality.js
+++ b/web/src/test/manual/web/chirality/chirality.js
@@ -10,10 +10,10 @@
*/
function Keyboard_chirality() {
- // Refer to $KEYMAN_ROOT/common/web/keyboard-processor/src/text/codes.ts, same method name.
+ // Refer to $KEYMAN_ROOT/web/src/engine/keyboard/src/text/codes.ts, same method name.
// May be moved within common/web/types at some point in the future.
var getModifierState = function(layerId) {
- // Refer to C:\keymanapp\keyman\common\web\keyboard-processor\src\keyboards\keyboardHarness.ts,
+ // Refer to C:\keymanapp\keyman\web\src\engine\keyboard\src\keyboards\keyboardHarness.ts,
// `MinimalKeyboardHarness`.
let osk = keyman.osk; // Codes endpoint, as part of the standard keyboard harness.
@@ -86,7 +86,7 @@ function Keyboard_chirality() {
this.g0 = function (t, e) {
var k = KeymanWeb, r = 0, m = 0;
- // Refer to C:\keymanapp\keyman\common\web\keyboard-processor\src\keyboards\keyboardHarness.ts,
+ // Refer to C:\keymanapp\keyman\web\src\engine\keyboard\src\keyboards\keyboardHarness.ts,
// `MinimalKeyboardHarness`.
var Constants = keyman.osk; // Holds anchor points for relevant Codes properties.
diff --git a/web/src/test/manual/web/osk/kbdLoader.mjs b/web/src/test/manual/web/osk/kbdLoader.mjs
index a9db786c33d..edf2d3a6484 100644
--- a/web/src/test/manual/web/osk/kbdLoader.mjs
+++ b/web/src/test/manual/web/osk/kbdLoader.mjs
@@ -1,16 +1,16 @@
import { Keyboard, KeyboardProperties, Codes } from '../../../../../build/engine/osk/lib/index.mjs';
// // The following block would be sufficient to replace the `loadKeyboardFromPath` func below...
-// // were it not for common/web/keyboard-processor being outside of the standard `localhost` config
+// // were it not for web/src/engine/keyboard/ being outside of the standard `localhost` config
// // used for manual Web testing.
// import {
// DOMKeyboardLoader
-// } from '../../../../../../common/web/keyboard-processor/build/lib/dom-keyboard-loader.mjs';
+// } from '../../../keyboard/build/lib/dom-keyboard-loader.mjs';
// import {
// KeyboardInterface,
// MinimalKeymanGlobal
-// } from '../../../../../../common/web/keyboard-processor/build/lib/index.mjs';
+// } from '../../../keyboard/build/lib/index.mjs';
// // This script may or may not be temporary; the KMW "KeyboardManager" class may be spun off in a manner
// // that could replace this.
diff --git a/web/src/tools/build.sh b/web/src/tools/build.sh
index 24d455bc8fd..b7670418ab3 100755
--- a/web/src/tools/build.sh
+++ b/web/src/tools/build.sh
@@ -14,7 +14,7 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
builder_describe "Builds the Keyman Engine for Web's development & unit-testing tools" \
"@/common/web/keyman-version" \
- "@/common/web/keyboard-processor" \
+ "@/web/src/engine/keyboard" \
"configure" \
"clean" \
"build" \
diff --git a/web/src/tools/testing/recorder-core/package.json b/web/src/tools/testing/recorder-core/package.json
index 4812d8a7787..426595e567e 100644
--- a/web/src/tools/testing/recorder-core/package.json
+++ b/web/src/tools/testing/recorder-core/package.json
@@ -19,7 +19,6 @@
},
"homepage": "https://github.com/keymanapp/keyman#readme",
"dependencies": {
- "@keymanapp/keyboard-processor": "*",
"@keymanapp/models-types": "*",
"@keymanapp/keyman-version": "*",
"@keymanapp/web-utils": "*"
diff --git a/web/src/tools/testing/recorder-core/src/index.ts b/web/src/tools/testing/recorder-core/src/index.ts
index 94c2c9dc4d8..2a739710232 100644
--- a/web/src/tools/testing/recorder-core/src/index.ts
+++ b/web/src/tools/testing/recorder-core/src/index.ts
@@ -1,5 +1,5 @@
-import { type OutputTarget } from "@keymanapp/keyboard-processor";
-import { KeyDistribution, KeyEvent, Mock } from "@keymanapp/keyboard-processor";
+import { Mock, type OutputTarget } from "keyman/engine/js-processor";
+import { KeyDistribution, KeyEvent } from "keyman/engine/keyboard";
import Proctor from "./proctor.js";
diff --git a/web/src/tools/testing/recorder-core/src/nodeProctor.ts b/web/src/tools/testing/recorder-core/src/nodeProctor.ts
index 852002d4b3a..204ef219394 100644
--- a/web/src/tools/testing/recorder-core/src/nodeProctor.ts
+++ b/web/src/tools/testing/recorder-core/src/nodeProctor.ts
@@ -8,7 +8,8 @@ import {
RecordedSyntheticKeystroke
} from "./index.js";
-import { KeyEvent, KeyEventSpec, Mock, type OutputTarget, KeyboardHarness } from "@keymanapp/keyboard-processor";
+import { KeyEvent, KeyEventSpec, KeyboardHarness } from "keyman/engine/keyboard";
+import { Mock, type OutputTarget } from "keyman/engine/js-processor";
import { DeviceSpec } from "@keymanapp/web-utils";
import { KeyboardInterface, KeyboardProcessor } from 'keyman/engine/js-processor';
diff --git a/web/src/tools/testing/recorder-core/src/proctor.ts b/web/src/tools/testing/recorder-core/src/proctor.ts
index 940fa4a76b1..ec4f584b048 100644
--- a/web/src/tools/testing/recorder-core/src/proctor.ts
+++ b/web/src/tools/testing/recorder-core/src/proctor.ts
@@ -1,5 +1,5 @@
import { type DeviceSpec } from "@keymanapp/web-utils";
-import { type OutputTarget } from "@keymanapp/keyboard-processor";
+import { type OutputTarget } from "keyman/engine/js-processor";
import type { KeyboardTest, TestSet, TestSequence } from "./index.js";
@@ -9,7 +9,7 @@ export type AssertCallback = (s1: any, s2: any, msg?: string) => void;
* Facilitates running Recorder-generated tests on various platforms.
*
* Note that DOM-aware KeymanWeb will implement a Browser-based version, while
- * keyboard-processor and input-processor will use a Node-based version instead.
+ * keyboard and input-processor will use a Node-based version instead.
*/
export default abstract class Proctor {
device: DeviceSpec;
diff --git a/web/src/tools/testing/recorder-core/tsconfig.json b/web/src/tools/testing/recorder-core/tsconfig.json
index 38af26e1a42..920536eeee2 100644
--- a/web/src/tools/testing/recorder-core/tsconfig.json
+++ b/web/src/tools/testing/recorder-core/tsconfig.json
@@ -16,8 +16,8 @@
"references": [
{ "path": "../../../../../common/web/keyman-version" },
{ "path": "../../../../../common/web/utils/" },
- { "path": "../../../../../common/web/keyboard-processor/" },
{ "path": "../../../../../common/web/lm-message-types" },
- { "path": "../../../engine/js-processor" }
+ { "path": "../../../engine/js-processor" },
+ { "path": "../../../engine/keyboard" },
],
}
diff --git a/web/src/tools/testing/recorder/browserProctor.ts b/web/src/tools/testing/recorder/browserProctor.ts
index 40e7247423a..a48e5572cbe 100644
--- a/web/src/tools/testing/recorder/browserProctor.ts
+++ b/web/src/tools/testing/recorder/browserProctor.ts
@@ -4,7 +4,7 @@
import { type DeviceSpec } from "@keymanapp/web-utils";
-import { type OutputTarget } from "@keymanapp/keyboard-processor";
+import { type OutputTarget } from "keyman/engine/js-processor";
import { type KeymanEngine } from 'keyman/app/browser';
diff --git a/web/src/tools/testing/recorder/build.sh b/web/src/tools/testing/recorder/build.sh
index 28cc43a767d..91f27d09e57 100755
--- a/web/src/tools/testing/recorder/build.sh
+++ b/web/src/tools/testing/recorder/build.sh
@@ -16,7 +16,7 @@ SUBPROJECT_NAME=tools/testing/recorder
builder_describe "Builds the Keyman Engine for Web's test-sequence recording tool" \
"@/common/web/keyman-version" \
- "@/common/web/keyboard-processor" \
+ "@/web/src/engine/keyboard" \
"@../recorder-core" \
"clean" \
"configure" \
diff --git a/web/src/tools/testing/recorder/scribe.ts b/web/src/tools/testing/recorder/scribe.ts
index 371afadeefe..c266f1a5ccf 100644
--- a/web/src/tools/testing/recorder/scribe.ts
+++ b/web/src/tools/testing/recorder/scribe.ts
@@ -1,7 +1,7 @@
import { EventEmitter } from "eventemitter3";
-import type { KeyEvent } from "@keymanapp/keyboard-processor";
+import type { KeyEvent } from "keyman/engine/keyboard";
import {
Constraint,
diff --git a/web/src/tools/testing/recorder/tsconfig.json b/web/src/tools/testing/recorder/tsconfig.json
index 63cb543efa1..f5974b5738b 100644
--- a/web/src/tools/testing/recorder/tsconfig.json
+++ b/web/src/tools/testing/recorder/tsconfig.json
@@ -12,9 +12,9 @@
"references": [
{ "path": "../../../../../common/web/keyman-version" },
{ "path": "../../../../../common/web/utils" },
- { "path": "../../../../../common/web/keyboard-processor" },
{ "path": "../../../../../common/web/lm-message-types" },
{ "path": "../../../../../web/src/app/browser" },
{ "path": "../recorder-core" },
+ { "path": "../../../engine/keyboard" },
]
}