From f52a1209c8671cbdc03ea9da1d2a330f16941e2e Mon Sep 17 00:00:00 2001 From: Eberhard Beilharz Date: Wed, 11 Sep 2024 16:43:15 +0200 Subject: [PATCH] refactor(web): merge `device-detect` with `web/src/engine/main` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change moves `web/src/engine/device-detect/` → `web/src/engine/main/` and renames the `Device` class to `DeviceDetector`. Fixes: #12388 --- web/README.md | 2 - web/build.sh | 5 +- web/package.json | 5 -- web/src/app/browser/src/keymanEngine.ts | 3 +- web/src/engine/device-detect/build.sh | 49 ------------------- web/src/engine/device-detect/readme.md | 6 --- web/src/engine/device-detect/tsconfig.json | 17 ------- web/src/engine/main/build.sh | 1 - .../engine/main/src/engineConfiguration.ts | 4 +- .../src/headless/deviceDetector.ts} | 11 +++-- .../src/headless}/utils/styleConstants.ts | 0 web/src/engine/main/src/index.ts | 3 +- web/src/engine/main/tsconfig.json | 1 - .../auto/dom/cases/osk/activation.spec.ts | 4 +- .../test/auto/dom/cases/osk/events.spec.ts | 4 +- web/src/test/auto/dom/test_init_check.spec.ts | 4 +- .../test/auto/integrated/cases/basics.spec.ts | 4 +- .../auto/integrated/test_init_check.spec.ts | 6 +-- web/src/test/auto/integrated/test_utils.ts | 8 +-- .../manual/web/osk/scratchspace/setup.mjs | 6 +-- .../testing/bulk_rendering/renderer_core.ts | 4 +- .../testing/bulk_rendering/tsconfig.json | 2 +- .../testing/recorder/recorder_ui_and_stubs.js | 4 +- 23 files changed, 35 insertions(+), 118 deletions(-) delete mode 100755 web/src/engine/device-detect/build.sh delete mode 100644 web/src/engine/device-detect/readme.md delete mode 100644 web/src/engine/device-detect/tsconfig.json rename web/src/engine/{device-detect/src/index.ts => main/src/headless/deviceDetector.ts} (98%) rename web/src/engine/{device-detect/src => main/src/headless}/utils/styleConstants.ts (100%) diff --git a/web/README.md b/web/README.md index 6b8245c5d2..7f7415c698 100644 --- a/web/README.md +++ b/web/README.md @@ -116,8 +116,6 @@ graph TD; subgraph ClassicWeb["`**ClassicWeb** Intermediate-level engine modules`"] - Device["/web/src/engine/device-detect"]; - Device----->WebUtils; Elements["/web/src/engine/element-wrappers"]; Elements-->JSProc; KeyboardStorage["/web/src/engine/keyboard-storage"]; diff --git a/web/build.sh b/web/build.sh index 5f2446a945..be1227cdee 100755 --- a/web/build.sh +++ b/web/build.sh @@ -23,7 +23,6 @@ builder_describe "Builds engine modules for Keyman Engine for Web (KMW)." \ ":app/webview A puppetable version of KMW designed for use in a host app's WebView" \ ":app/ui Builds KMW's desktop form-factor keyboard-selection UI modules" \ ":engine/attachment Subset used for detecting valid page contexts for use in text editing " \ - ":engine/device-detect Subset used for device-detection " \ ":engine/dom-utils A common subset of function used for DOM calculations, layout, etc" \ ":engine/events Specialized classes utilized to support KMW API events" \ ":engine/element-wrappers Subset used to integrate with website elements" \ @@ -56,7 +55,6 @@ builder_describe_outputs \ build:app/webview "/web/build/app/webview/${config}/keymanweb-webview.js" \ build:app/ui "/web/build/app/ui/${config}/kmwuitoggle.js" \ build:engine/attachment "/web/build/engine/attachment/lib/index.mjs" \ - build:engine/device-detect "/web/build/engine/device-detect/lib/index.mjs" \ build:engine/dom-utils "/web/build/engine/dom-utils/obj/index.js" \ build:engine/events "/web/build/engine/events/lib/index.mjs" \ build:engine/element-wrappers "/web/build/engine/element-wrappers/lib/index.mjs" \ @@ -146,7 +144,6 @@ coverage_action() { cd web } -builder_run_child_actions build:engine/device-detect builder_run_child_actions build:engine/dom-utils builder_run_child_actions build:engine/keyboard @@ -164,7 +161,7 @@ builder_run_child_actions build:engine/attachment # Uses engine/interfaces (due to resource-path config interface) builder_run_child_actions build:engine/keyboard-storage -# Uses engine/interfaces, engine/device-detect, engine/keyboard-storage, & engine/osk +# Uses engine/interfaces, engine/keyboard-storage, & engine/osk builder_run_child_actions build:engine/main # Uses all but engine/element-wrappers and engine/attachment diff --git a/web/package.json b/web/package.json index 650aece14d..64c11eb40d 100644 --- a/web/package.json +++ b/web/package.json @@ -17,11 +17,6 @@ "types": "./build/engine/interfaces/obj/index.d.ts", "import": "./build/engine/interfaces/obj/index.js" }, - "./engine/device-detect": { - "es6-bundling": "./src/engine/device-detect/src/index.ts", - "types": "./build/engine/device-detect/obj/index.d.ts", - "import": "./build/engine/device-detect/obj/index.js" - }, "./engine/dom-utils": { "es6-bundling": "./src/engine/dom-utils/src/index.ts", "types": "./build/engine/dom-utils/obj/index.d.ts", diff --git a/web/src/app/browser/src/keymanEngine.ts b/web/src/app/browser/src/keymanEngine.ts index d9d386760b..803d601ec2 100644 --- a/web/src/app/browser/src/keymanEngine.ts +++ b/web/src/app/browser/src/keymanEngine.ts @@ -1,5 +1,4 @@ -import { KeymanEngine as KeymanEngineBase } from 'keyman/engine/main'; -import { Device as DeviceDetector } from 'keyman/engine/device-detect'; +import { KeymanEngine as KeymanEngineBase, DeviceDetector } from 'keyman/engine/main'; import { getAbsoluteY } from 'keyman/engine/dom-utils'; import { OutputTarget } from 'keyman/engine/element-wrappers'; import { diff --git a/web/src/engine/device-detect/build.sh b/web/src/engine/device-detect/build.sh deleted file mode 100755 index d0ad834320..0000000000 --- a/web/src/engine/device-detect/build.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash - -## 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/device-detect -. "$KEYMAN_ROOT/web/common.inc.sh" -. "$KEYMAN_ROOT/resources/shellHelperFunctions.sh" - -# ################################ Main script ################################ - -builder_describe "Builds the device-detection component of Keyman Engine for Web (KMW)." \ - "@/common/web/keyman-version" \ - "@/web/src/engine/common/web-utils" \ - "clean" \ - "configure" \ - "build" \ - "test" \ - "--ci+ Set to utilize CI-based test configurations & reporting." - -# Possible TODO? -# "upload-symbols Uploads build product to Sentry for error report symbolification. Only defined for $DOC_BUILD_EMBED_WEB" \ - -builder_describe_outputs \ - configure /node_modules \ - build /web/build/$SUBPROJECT_NAME/lib/index.mjs - -builder_parse "$@" - -#### Build action definitions #### - -do_build () { - compile $SUBPROJECT_NAME - - $BUNDLE_CMD "${KEYMAN_ROOT}/web/build/${SUBPROJECT_NAME}/obj/index.js" \ - --out "${KEYMAN_ROOT}/web/build/${SUBPROJECT_NAME}/lib/index.mjs" \ - --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 test - -# No headless tests for this child project. Currently, DOM-based unit & -# integrated tests are run solely by the top-level $KEYMAN_ROOT/web project. \ No newline at end of file diff --git a/web/src/engine/device-detect/readme.md b/web/src/engine/device-detect/readme.md deleted file mode 100644 index aa3d725835..0000000000 --- a/web/src/engine/device-detect/readme.md +++ /dev/null @@ -1,6 +0,0 @@ -## engine/device-detect - -This submodule provides the subset of the main engine's Web-oriented code that's used to detect -the user's device in isolation from the rest of KMW code. Fortunately, it doesn't have any -cross-references with other top-level KMW code, so it was possible to modularize in the form -seen here. \ No newline at end of file diff --git a/web/src/engine/device-detect/tsconfig.json b/web/src/engine/device-detect/tsconfig.json deleted file mode 100644 index 3f71dc0f26..0000000000 --- a/web/src/engine/device-detect/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "extends": "../../tsconfig.dom.json", - - "compilerOptions": { - "baseUrl": "./", - "outDir": "../../../build/engine/device-detect/obj/", - "tsBuildInfoFile": "../../../build/engine/device-detect/obj/tsconfig.tsbuildinfo", - "rootDir": "./src" - }, - - "include": [ "**/*.ts" ], - - "references": [ - { "path": "../../../../common/web/keyman-version" }, - { "path": "../common/web-utils" } - ] -} diff --git a/web/src/engine/main/build.sh b/web/src/engine/main/build.sh index 77673626e0..705bfbb902 100755 --- a/web/src/engine/main/build.sh +++ b/web/src/engine/main/build.sh @@ -16,7 +16,6 @@ builder_describe "Builds the Keyman Engine for Web's common top-level base class "@/common/web/keyman-version" \ "@/web/src/engine/keyboard" \ "@/web/src/engine/interfaces build" \ - "@/web/src/engine/device-detect build" \ "@/web/src/engine/js-processor build" \ "@/web/src/engine/keyboard-storage build" \ "@/web/src/engine/osk build" \ diff --git a/web/src/engine/main/src/engineConfiguration.ts b/web/src/engine/main/src/engineConfiguration.ts index aac559acab..40485c0f0f 100644 --- a/web/src/engine/main/src/engineConfiguration.ts +++ b/web/src/engine/main/src/engineConfiguration.ts @@ -3,7 +3,7 @@ import { EventEmitter } from "eventemitter3"; 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 { DeviceDetector } from "./headless/deviceDetector.js"; import { KeyboardStub } from "keyman/engine/keyboard-storage"; interface EventMap { @@ -31,7 +31,7 @@ export class EngineConfiguration extends EventEmitter { super(); if(!device) { - const deviceDetector = new Device(); + const deviceDetector = new DeviceDetector(); deviceDetector.detect(); device = deviceDetector.coreSpec; diff --git a/web/src/engine/device-detect/src/index.ts b/web/src/engine/main/src/headless/deviceDetector.ts similarity index 98% rename from web/src/engine/device-detect/src/index.ts rename to web/src/engine/main/src/headless/deviceDetector.ts index 97b14280b3..cd0bf7a185 100644 --- a/web/src/engine/device-detect/src/index.ts +++ b/web/src/engine/main/src/headless/deviceDetector.ts @@ -1,9 +1,12 @@ +/* + * Keyman is copyright (C) SIL International. MIT License. + * + * Detect the user's device. + */ import StyleConstants from './utils/styleConstants.js'; import { DeviceSpec, Version } from "@keymanapp/web-utils"; -// The Device object definition ------------------------------------------------- - -export class Device { +export class DeviceDetector { // These correspond directly to the properties & parameters for `DeviceSpec`. touchable: boolean; OS: string; @@ -203,5 +206,3 @@ export class Device { return new DeviceSpec(this.browser, this.formFactor, this.OS, this.touchable); } } - -export default Device; \ No newline at end of file diff --git a/web/src/engine/device-detect/src/utils/styleConstants.ts b/web/src/engine/main/src/headless/utils/styleConstants.ts similarity index 100% rename from web/src/engine/device-detect/src/utils/styleConstants.ts rename to web/src/engine/main/src/headless/utils/styleConstants.ts diff --git a/web/src/engine/main/src/index.ts b/web/src/engine/main/src/index.ts index b928d72c8a..9e33d0d4ef 100644 --- a/web/src/engine/main/src/index.ts +++ b/web/src/engine/main/src/index.ts @@ -7,4 +7,5 @@ export { LegacyAPIEvents } from './legacyAPIEvents.js'; export { VariableStoreCookieSerializer } from './variableStoreCookieSerializer.js'; export { LanguageProcessor } from './headless/languageProcessor.js'; export { TranscriptionCache } from './headless/transcriptionCache.js'; -export { InputProcessor } from './headless/inputProcessor.js'; \ No newline at end of file +export { InputProcessor } from './headless/inputProcessor.js'; +export { DeviceDetector } from './headless/deviceDetector.js'; \ No newline at end of file diff --git a/web/src/engine/main/tsconfig.json b/web/src/engine/main/tsconfig.json index d2e0580161..f49d40dc35 100644 --- a/web/src/engine/main/tsconfig.json +++ b/web/src/engine/main/tsconfig.json @@ -11,7 +11,6 @@ "include": [ "src/**/*.ts" ], "references": [ - { "path": "../device-detect" }, { "path": "../osk" }, { "path": "../keyboard-storage" }, { "path": "../interfaces" }, diff --git a/web/src/test/auto/dom/cases/osk/activation.spec.ts b/web/src/test/auto/dom/cases/osk/activation.spec.ts index 48f82bede3..a78c5f0d4a 100644 --- a/web/src/test/auto/dom/cases/osk/activation.spec.ts +++ b/web/src/test/auto/dom/cases/osk/activation.spec.ts @@ -1,5 +1,5 @@ import * as KeymanOSK from 'keyman/engine/osk'; -import Device from 'keyman/engine/device-detect'; +import { DeviceDetector } from 'keyman/engine/main'; import { loadKeyboardsFromStubs } from '../../kbdLoader.js'; import { timedPromise } from '@keymanapp/web-utils'; @@ -7,7 +7,7 @@ import { timedPromise } from '@keymanapp/web-utils'; import { assert } from 'chai'; import { DEFAULT_BROWSER_TIMEOUT } from '@keymanapp/common-test-resources/test-timeouts.mjs'; -const device = new Device(); +const device = new DeviceDetector(); device.detect(); const TestResources = { diff --git a/web/src/test/auto/dom/cases/osk/events.spec.ts b/web/src/test/auto/dom/cases/osk/events.spec.ts index efe5570df0..c0a5932c0b 100644 --- a/web/src/test/auto/dom/cases/osk/events.spec.ts +++ b/web/src/test/auto/dom/cases/osk/events.spec.ts @@ -1,5 +1,5 @@ import * as KeymanOSK from 'keyman/engine/osk'; -import Device from 'keyman/engine/device-detect'; +import { DeviceDetector } from 'keyman/engine/main'; import { loadKeyboardsFromStubs } from '../../kbdLoader.js'; import { timedPromise } from '@keymanapp/web-utils'; @@ -9,7 +9,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { DEFAULT_BROWSER_TIMEOUT } from '@keymanapp/common-test-resources/test-timeouts.mjs'; -const device = new Device(); +const device = new DeviceDetector(); device.detect(); const TestResources = { diff --git a/web/src/test/auto/dom/test_init_check.spec.ts b/web/src/test/auto/dom/test_init_check.spec.ts index ad694e9543..46ad413673 100644 --- a/web/src/test/auto/dom/test_init_check.spec.ts +++ b/web/src/test/auto/dom/test_init_check.spec.ts @@ -2,7 +2,7 @@ // We'll let things break after this reports, since this will likely signal a LOT of other failures. import { assert } from 'chai'; -import Device from 'keyman/engine/device-detect'; +import { DeviceDetector } from 'keyman/engine/main'; /* Note - we still have to prevent errors setting up test resources; * Karma will fail to report errors for affected browsers otherwise. @@ -17,7 +17,7 @@ describe('Test Initialization', function() { it("Detects device without JS errors", function() { try { - const device = new Device(); + const device = new DeviceDetector(); device.detect(); console.log("Detected platform: " + device.browser + " on " + device.OS + " with form factor " + device.formFactor); diff --git a/web/src/test/auto/integrated/cases/basics.spec.ts b/web/src/test/auto/integrated/cases/basics.spec.ts index 2ca272b7e8..6103701fd8 100644 --- a/web/src/test/auto/integrated/cases/basics.spec.ts +++ b/web/src/test/auto/integrated/cases/basics.spec.ts @@ -1,7 +1,7 @@ import { assert } from 'chai'; import { DEVICE_DETECT_FAILURE, setupKMW, teardownKMW } from "../test_utils.js"; -import { Device } from "keyman/engine/device-detect"; +import { DeviceDetector } from "keyman/engine/main"; import { KeymanEngine } from "keyman/app/browser"; const baseTimeout = 5000; @@ -49,7 +49,7 @@ describe('Basic KeymanWeb', function() { }); }); -const device = new Device(); +const device = new DeviceDetector(); device.detect(); if(!device.touchable) { describe('Basic Toggle UI', function() { diff --git a/web/src/test/auto/integrated/test_init_check.spec.ts b/web/src/test/auto/integrated/test_init_check.spec.ts index f51a280f56..813ac7ba45 100644 --- a/web/src/test/auto/integrated/test_init_check.spec.ts +++ b/web/src/test/auto/integrated/test_init_check.spec.ts @@ -2,7 +2,7 @@ // We'll let things break after this reports, since this will likely signal a LOT of other failures. import { assert } from 'chai'; -import Device from 'keyman/engine/device-detect'; +import { DeviceDetector } from 'keyman/engine/main'; /* Note - we still have to prevent errors setting up test resources; * Karma will fail to report errors for affected browsers otherwise. @@ -16,9 +16,9 @@ describe('Test Initialization', function() { this.timeout(15000); it("Detects device without JS errors", function() { - let device: Device; + let device: DeviceDetector; try { - device = new Device(); + device = new DeviceDetector(); device.detect(); console.log("Detected platform: " + device.browser + " on " + device.OS + " with form factor " + device.formFactor); diff --git a/web/src/test/auto/integrated/test_utils.ts b/web/src/test/auto/integrated/test_utils.ts index 6e04885b1a..9cacb46cb0 100644 --- a/web/src/test/auto/integrated/test_utils.ts +++ b/web/src/test/auto/integrated/test_utils.ts @@ -1,6 +1,6 @@ -// // KeymanWeb test suite - processing of the Karma configuration's client.args parameter. +// KeymanWeb test suite - processing of the Karma configuration's client.args parameter. -import Device from 'keyman/engine/device-detect'; +import { DeviceDetector } from 'keyman/engine/main'; import * as KMWRecorder from '#recorder'; import { type BrowserInitOptionSpec, type KeymanEngine } from 'keyman/app/browser'; import { ErrorStub, type KeyboardAPISpec, type KeyboardStub } from 'keyman/engine/keyboard-storage'; @@ -17,7 +17,7 @@ const domain = `${loc.protocol}/${loc.host}` // If we've set things up to support Device dection without loading KMW... try { - const device = new Device(); + const device = new DeviceDetector(); device.detect(); } catch (err) { // Sets a warning flag that unit-test files can use to disable themselves. @@ -233,7 +233,7 @@ export async function runKeyboardTestFromJSON(jsonPath: any, params: any, assert const testJSON = await jsonResponse.json(); const testSpec = new KMWRecorder.KeyboardTest(testJSON); - const device = new Device(); + const device = new DeviceDetector(); device.detect(); // @ts-ignore // Types are a bit messy here. diff --git a/web/src/test/manual/web/osk/scratchspace/setup.mjs b/web/src/test/manual/web/osk/scratchspace/setup.mjs index ec3ae0dcac..f4c1923b5d 100644 --- a/web/src/test/manual/web/osk/scratchspace/setup.mjs +++ b/web/src/test/manual/web/osk/scratchspace/setup.mjs @@ -1,12 +1,12 @@ import * as KeymanOSK from '../../../../../../build/engine/osk/lib/index.mjs'; -import Device from '../../../../../../build/engine/device-detect/lib/index.mjs'; +import { DeviceDetector } from '../../../../../../build/engine/main/lib/index.mjs'; import { loadKeyboardFromPath, loadKeyboardsFromStubs } from '../kbdLoader.mjs'; // NOTE: we must actually set these in this manner to have accessibility outside of // this script tag! window.modules = { osk: KeymanOSK, - device: Device + device: DeviceDetector }; let prefix = '../../'; @@ -22,7 +22,7 @@ window.keyboards = loadKeyboardsFromStubs(stubs).then((keyboards) => { window.keyboards = keyboards; }); -let device = new Device(); +let device = new DeviceDetector(); device.detect(); if(device.formFactor == 'phone') { diff --git a/web/src/tools/testing/bulk_rendering/renderer_core.ts b/web/src/tools/testing/bulk_rendering/renderer_core.ts index 8c00c9b917..50c5ca2494 100644 --- a/web/src/tools/testing/bulk_rendering/renderer_core.ts +++ b/web/src/tools/testing/bulk_rendering/renderer_core.ts @@ -1,5 +1,5 @@ // Includes KeymanWeb's Device class, as it's quite a useful resource for KMW-related projects. -import { Device } from 'keyman/engine/device-detect'; +import { DeviceDetector } from 'keyman/engine/main'; import { type DeviceSpec } from '@keymanapp/web-utils'; import type { KeymanEngine } from 'keyman/app/browser'; @@ -243,7 +243,7 @@ export class BatchRenderer { fillDeviceNotes() { let description = document.createElement('p'); - let device = new Device(); + let device = new DeviceDetector(); device.detect(); description.appendChild(document.createTextNode('Browser: ' + device.browser)); diff --git a/web/src/tools/testing/bulk_rendering/tsconfig.json b/web/src/tools/testing/bulk_rendering/tsconfig.json index 3ada9b1853..8256bda7b9 100644 --- a/web/src/tools/testing/bulk_rendering/tsconfig.json +++ b/web/src/tools/testing/bulk_rendering/tsconfig.json @@ -14,6 +14,6 @@ "references": [ { "path": "../../../app/browser" }, - { "path": "../../../engine/device-detect" } + { "path": "../../../engine/main" } ] } diff --git a/web/src/tools/testing/recorder/recorder_ui_and_stubs.js b/web/src/tools/testing/recorder/recorder_ui_and_stubs.js index f543b881fe..6e0d182578 100644 --- a/web/src/tools/testing/recorder/recorder_ui_and_stubs.js +++ b/web/src/tools/testing/recorder/recorder_ui_and_stubs.js @@ -1,5 +1,5 @@ import * as KMWRecorder from '../../../../build/tools/testing/recorder/lib/index.mjs'; -import { Device } from '../../../../build/engine/device-detect/lib/index.mjs'; +import { DeviceDetector } from '../../../../build/engine/main/lib/index.mjs'; import { getResourcePathPrefix } from './recorder_KeyboardScripts.js'; @@ -124,7 +124,7 @@ window.errorUpdate = () => { window.initDevice = () => { // From KMW. - var device = new Device(); + var device = new DeviceDetector(); device.detect(); document.getElementById("activeFormFactor").textContent = device.formFactor;