;
+begin
+ cmdline := [
+ 'build',
+ '--log-format', 'tsv',
+ '--log-level', 'info',
+ '--for-publishing',
+ '--publish-only',
+ projectFilename
+ ];
+
+ if Assigned(FGlobalProject) and (FGlobalProject.Options.CompilerWarningsAsErrors) then
+ cmdline := cmdline + ['--compiler-warnings-as-errors']
+ else
+ cmdline := cmdline + ['--no-compiler-warnings-as-errors'];
+
+ if Assigned(FGlobalProject) and (not FGlobalProject.Options.WarnDeprecatedCode) then
+ cmdline := cmdline + ['--no-warn-deprecated-code'];
+
+ if debug then
+ cmdline := cmdline + ['--debug'];
+
+ Result := Run(cmdline, ExtractFileDir(projectFilename), projectFilename, Callback);
+end;
+
+
function TKmcWrapper.Compile(
ProjectFile: TProjectFile;
const infile: string;
diff --git a/developer/src/tike/main/Keyman.System.KeymanCore.pas b/developer/src/tike/main/Keyman.System.KeymanCore.pas
index ee9a3c0e82..1df9e42d8c 100644
--- a/developer/src/tike/main/Keyman.System.KeymanCore.pas
+++ b/developer/src/tike/main/Keyman.System.KeymanCore.pas
@@ -233,7 +233,7 @@ type
km_core_keyboard_attrs = record
version_string: pkm_core_cu;
id: pkm_core_cu;
- default_optons: pkm_core_option_item
+ default_options: pkm_core_option_item
end;
pkm_core_keyboard_attrs = ^km_core_keyboard_attrs;
diff --git a/developer/src/tike/main/Keyman.System.KeymanCoreDebug.pas b/developer/src/tike/main/Keyman.System.KeymanCoreDebug.pas
index 0b5600152b..3c90239173 100644
--- a/developer/src/tike/main/Keyman.System.KeymanCoreDebug.pas
+++ b/developer/src/tike/main/Keyman.System.KeymanCoreDebug.pas
@@ -186,7 +186,7 @@ initialization
Assert(sizeof(km_core_context_item) = 8);
Assert(sizeof(km_core_action_item) = 12);
Assert(sizeof(km_core_option_item) = 12);
- Assert(sizeof(km_core_keyboard_attrs) = 16);
+ Assert(sizeof(km_core_keyboard_attrs) = 12);
Assert(sizeof(km_core_attr) = 16);
//keyman_core_api_debug.h:
diff --git a/developer/src/tike/main/UfrmMessages.pas b/developer/src/tike/main/UfrmMessages.pas
index 9a76254c96..924bec9acd 100644
--- a/developer/src/tike/main/UfrmMessages.pas
+++ b/developer/src/tike/main/UfrmMessages.pas
@@ -170,6 +170,12 @@ const // ABGR - text on white bg, Colors similar to Light+ VSCode color theme
INFO_FileNotBuiltSuccessfully = NAMESPACE_Infrastructure or $0007;
INFO_ProjectBuiltSuccessfully = NAMESPACE_Infrastructure or $000B;
INFO_ProjectNotBuiltSuccessfully = NAMESPACE_Infrastructure or $000C;
+ INFO_ProjectCopiedSuccessfully = NAMESPACE_Infrastructure or $0024;
+ INFO_ProjectNotCopiedSuccessfully = NAMESPACE_Infrastructure or $0025;
+ INFO_ProjectGeneratedSuccessfully = NAMESPACE_Infrastructure or $0027;
+ INFO_ProjectNotGeneratedSuccessfully = NAMESPACE_Infrastructure or $0028;
+ INFO_ProjectValidatedSuccessfully = NAMESPACE_Infrastructure or $002A;
+ INFO_ProjectNotValidatedSuccessfully = NAMESPACE_Infrastructure or $002B;
Segment_Filename = 0;
Segment_Filename_Separator = 1;
@@ -254,12 +260,18 @@ begin
FColor := clBlack;
FTextColor := Color_Text;
- // Override formatting for 4 known messages
+ // Override formatting for known messages -- keep in sync with messageSpecialColor() in NodeCompilerCallbacks.ts
if (MsgCode = INFO_FileBuiltSuccessfully) or
- (MsgCode = INFO_ProjectBuiltSuccessfully) then
+ (MsgCode = INFO_ProjectBuiltSuccessfully) or
+ (MsgCode = INFO_ProjectCopiedSuccessfully) or
+ (MsgCode = INFO_ProjectGeneratedSuccessfully) or
+ (MsgCode = INFO_ProjectValidatedSuccessfully) then
state := plsSuccess
else if (MsgCode = INFO_FileNotBuiltSuccessfully) or
- (MsgCode = INFO_ProjectNotBuiltSuccessfully) then
+ (MsgCode = INFO_ProjectNotBuiltSuccessfully) or
+ (MsgCode = INFO_ProjectNotCopiedSuccessfully) or
+ (MsgCode = INFO_ProjectNotGeneratedSuccessfully) or
+ (MsgCode = INFO_ProjectNotValidatedSuccessfully) then
state := plsFailure;
case state of
diff --git a/developer/src/tike/project/Keyman.Developer.System.Project.kpsProjectFileAction.pas b/developer/src/tike/project/Keyman.Developer.System.Project.kpsProjectFileAction.pas
index c7a7cafcc5..94cb28c151 100644
--- a/developer/src/tike/project/Keyman.Developer.System.Project.kpsProjectFileAction.pas
+++ b/developer/src/tike/project/Keyman.Developer.System.Project.kpsProjectFileAction.pas
@@ -29,6 +29,8 @@ begin
w := TKmcWrapper.Create;
try
Result := w.Compile(Self, FileName, TargetFilename, False);
+ if not OwnerProject.Options.SkipMetadataFiles then
+ Result := Result and w.CompileForPublishing(Self, OwnerProject.FileName, False);
// TODO(lowpri): FDebug flag
finally
w.Free;
diff --git a/developer/src/tike/xml/help/contexthelp.xml b/developer/src/tike/xml/help/contexthelp.xml
index 646496f5c7..7bada6adbf 100644
--- a/developer/src/tike/xml/help/contexthelp.xml
+++ b/developer/src/tike/xml/help/contexthelp.xml
@@ -419,11 +419,6 @@
Choose a help file to include in the keyboard
-
- Compiles the keyboard for KeymanWeb. Two output files will be generated: [filename].js and [filename]_load.js. The KeymanWeb Tutorial
- contains more information about the difference between the two output files.
-
-
Tests your KeymanWeb keyboard in an Internet Explorer embedded window
diff --git a/docs/websites/README.md b/docs/websites/README.md
index 9813fcc2ae..165fb6a718 100644
--- a/docs/websites/README.md
+++ b/docs/websites/README.md
@@ -71,7 +71,7 @@ After this, you can access the website at the following ports:
| status.keyman.com* | http://localhost:8060 | http://status-backend.keyman.com.localhost | status-keyman-website |
| | http://localhost:8061 | http://status.keyman.com.localhost | status-keyman-public |
-\* Note that status.keyman.com runs in two containers in development to allow for live reload and separation of logs for backend and frontend.
+\* Note that status.keyman.com runs in two containers in development to allow for live reload and separation of logs for backend and frontend.
In production, only port 8060 is used.
#### Remove the Docker container and image
@@ -95,6 +95,55 @@ docker logs -f {Docker Container Name}
Refer to **Port lookup table** above for Docker container names
+---------
+
+## How to run composer updates
+
+The Docker containers are setup with multi-stage images, so you will need to
+target the composer-builder stage if you want to execute composer commands such
+as `composer update` or `composer audit`. The following scripts show how to do
+this; here the same id is used for the image tag and the container name for simplicity:
+
+On macOS, Linux:
+
+```bash
+COMPOSER_ID=composer-temp
+# setup
+docker build -f Dockerfile --target composer-builder --tag $COMPOSER_ID .
+docker run -v "$(pwd):/var/www/html/" --name $COMPOSER_ID --user root --rm -d $COMPOSER_ID
+# run commands with `docker exec`, e.g.:
+# docker exec $COMPOSER_ID composer audit
+# docker exec $COMPOSER_ID composer update
+# docker exec $COMPOSER_ID composer update --lock
+# copy modified files to mounted volume:
+docker exec $COMPOSER_ID cp composer.lock /var/www/html/
+docker exec $COMPOSER_ID cp composer.json /var/www/html/
+# cleanup
+docker stop $COMPOSER_ID
+docker rmi $COMPOSER_ID
+```
+
+On git bash for Windows, paths must start with `//`, e.g. `//$(pwd)`, `//var/www/html/`:
+
+```bash
+COMPOSER_ID=composer-temp
+# setup
+docker build -f Dockerfile --target composer-builder --tag $COMPOSER_ID .
+docker run -v "//$(pwd):/var/www/html/" --name $COMPOSER_ID --user root --rm -d $COMPOSER_ID
+# run commands with `docker exec`, e.g.:
+# docker exec $COMPOSER_ID composer audit
+# docker exec $COMPOSER_ID composer update
+# docker exec $COMPOSER_ID composer update --lock
+# copy modified files to mounted volume:
+docker exec $COMPOSER_ID cp composer.lock //var/www/html/
+docker exec $COMPOSER_ID cp composer.json //var/www/html/
+# cleanup
+docker stop $COMPOSER_ID
+docker rmi $COMPOSER_ID
+```
+
+
+
---------
## Website Dependencies
diff --git a/linux/scripts/dist.sh b/linux/scripts/dist.sh
index b66615ad9d..a09225e3ea 100755
--- a/linux/scripts/dist.sh
+++ b/linux/scripts/dist.sh
@@ -15,6 +15,101 @@ THIS_SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
# shellcheck disable=SC2154
. "${KEYMAN_ROOT}/linux/scripts/package-build.inc.sh"
+create_tarball() {
+ # Include these files and folders:
+ # shellcheck disable=2034 # to_include appears to be unused, even though
+ # it is used indirectly by generate_tar_ignore_list.
+ to_include=(
+ common/build.sh \
+ common/cpp \
+ common/include \
+ common/linux \
+ common/test/keyboards/baseline \
+ core \
+ linux \
+ resources/build/*.sh \
+ resources/build/meson \
+ resources/standards-data \
+ resources/*.sh \
+ ./*.md \
+ ./build.sh \
+ ./*.json \
+ )
+
+ # files and subfolders to exclude from paths included in 'to_include',
+ # i.e. the exceptions to 'to_include'.
+ # shellcheck disable=2034 # to_exclude appears to be unused, even though
+ # it is used indirectly by generate_tar_ignore_list.
+ to_exclude=(
+ build \
+ common/test/keyboards/baseline/kmcomp-*.zip \
+ linux/builddebs \
+ linux/docs/help \
+ linux/keyman-config/keyman_config/version.py \
+ linux/keyman-config/buildtools/build-langtags.py \
+ linux/upload \
+ )
+
+ # array to store list of --tar-ignore parameters generated from to_include and to_exclude.
+ ignored_files=()
+
+ generate_tar_ignore_list "./" to_include to_exclude ignored_files "$(basename "${KEYMAN_ROOT}")"
+
+ # Note: explicitly specify the --tar-ignores here for files/folders that we always
+ # want to ignore regardless of their location. Having them here allows us to pass
+ # the wildcards to dpkg-source - whereas the wildcards in 'to_exclude' will be
+ # resolved and replaced with multiple --tar-ignore entries.
+ dpkg-source \
+ --tar-ignore=*~ \
+ --tar-ignore=.git \
+ --tar-ignore=.gitattributes \
+ --tar-ignore=.gitignore \
+ --tar-ignore=experiments \
+ --tar-ignore=debian \
+ --tar-ignore=.github \
+ --tar-ignore=.vscode \
+ --tar-ignore=.configured \
+ --tar-ignore=.devcontainer \
+ --tar-ignore=.pc \
+ --tar-ignore=__pycache__ \
+ --tar-ignore=node_modules \
+ --tar-ignore=keyman_1* \
+ --tar-ignore=launchpad \
+ --tar-ignore=dist \
+ --tar-ignore=VERSION \
+ \
+ "${ignored_files[@]}" \
+ \
+ --compression=xz --build .
+ mv ../keyman_"${KEYMAN_VERSION}".tar.xz linux/dist/keyman-"${KEYMAN_VERSION}".tar.xz
+}
+
+replace_toplevel_buildsh() {
+ # extract the tarball and replace top-level build.sh, then recreate tarball
+ builder_echo heading "Replacing top-level build.sh"
+ cd "${KEYMAN_ROOT}/linux/dist"
+ tar xfJ keyman-"${KEYMAN_VERSION}".tar.xz
+ cat > "keyman/build.sh" << EOF
+#!/usr/bin/env bash
+linux/build.sh "\$@"
+EOF
+ chmod +x "keyman/build.sh"
+ tar cfJ "keyman-${KEYMAN_VERSION}.tar.xz" "keyman"
+ rm -rf "keyman"
+}
+
+create_debian_origtarxz() {
+ builder_echo heading "Creating Debian orig.tar.xz"
+ cd "${KEYMAN_ROOT}/linux/dist"
+ pkgvers="keyman-${KEYMAN_VERSION}"
+ tar xfJ keyman-"${KEYMAN_VERSION}".tar.xz
+ mv -v keyman "${pkgvers}" 2>/dev/null || mv -v "$(find . -mindepth 1 -maxdepth 1 -type d)" "${pkgvers}"
+ tar cfJ "keyman_${KEYMAN_VERSION}.orig.tar.xz" "${pkgvers}"
+ rm "keyman-${KEYMAN_VERSION}.tar.xz"
+ rm -rf "${pkgvers}"
+}
+
+
BASEDIR=$(pwd)
cd "${KEYMAN_ROOT}/linux"
@@ -24,6 +119,8 @@ if [[ ! -z ${1+x} ]] && [[ "$1" == "origdist" ]]; then
shift
fi
+builder_echo heading "Creating source tarball for Keyman ${KEYMAN_VERSION}"
+
rm -rf dist
mkdir -p dist
@@ -34,130 +131,13 @@ echo "3.0 (native)" > debian/source/format
# shellcheck disable=SC2154
dch keyman --newversion "${KEYMAN_VERSION}" --force-bad-version --nomultimaint
-# Create the tarball
-
-# We always include these files which are the minimum files and
-# folder required for Ubuntu/Debian packaging
-# shellcheck disable=2034 # to_include appears to be unused
-to_include=(
- common/build.sh \
- common/cpp \
- common/include \
- common/linux \
- common/test/keyboards/baseline \
- core \
- linux \
- resources/build/*.sh \
- resources/build/meson \
- resources/standards-data \
- resources/*.sh \
- ./*.md \
- ./build.sh \
- ./*.json \
-)
-
-# files and subfolders to exclude from paths included in 'to_include',
-# i.e. the exceptions to 'to_include'.
-
-# shellcheck disable=2034 # to_exclude appears to be unused
-to_exclude=(
- build \
- common/test/keyboards/baseline/kmcomp-*.zip \
- linux/builddebs \
- linux/docs/help \
- linux/keyman-config/keyman_config/version.py \
- linux/keyman-config/buildtools/build-langtags.py \
- linux/upload \
-)
-
-if [[ -z "${create_origdist+x}" ]]; then
- # If we build a full source tarball we include additional files
- # so that it's possible to run `${KEYMAN_ROOT}/build.sh` on Linux
-
- # shellcheck disable=2034 # to_include appears to be unused
- to_include+=(
- common/schemas \
- common/tools/hextobin \
- common/web/keyman-version \
- common/web/langtags \
- common/web/types \
- common/windows/cpp \
- common/windows/include \
- developer/src/common/include \
- developer/src/common/web \
- developer/src/ext/json \
- developer/src/kmc \
- developer/src/kmc-analyze \
- developer/src/kmc-copy \
- developer/src/kmc-generate \
- developer/src/kmc-keyboard-info \
- developer/src/kmc-kmn \
- developer/src/kmc-ldml \
- developer/src/kmc-model \
- developer/src/kmc-model-info \
- developer/src/kmc-package \
- developer/src/kmcmplib \
- docs/minimum-versions.md.in
- resources/build \
- resources/standards-data \
- )
-
- # additional files and subfolders to exclude from paths included in 'to_include',
- # i.e. the exceptions to 'to_include'.
- # shellcheck disable=2034 # to_exclude appears to be unused
- to_exclude+=(
- *.exe \
- resources/build/history \
- resources/build/l10n \
- resources/build/mac \
- resources/build/win \
- resources/build/*.lua \
- )
-fi
-
-# array to store list of --tar-ignore parameters generated from to_include and to_exclude.
-ignored_files=()
-
-generate_tar_ignore_list "./" to_include to_exclude ignored_files "$(basename "${KEYMAN_ROOT}")"
-
-# Note: explicitly specify the --tar-ignores here for files/folders that we always
-# want to ignore regardless of their location. Having them here allows us to pass
-# the wildcards to dpkg-source - whereas the wildcards in 'to_exclude' will be
-# resolved and replaced with multiple --tar-ignore entries.
-dpkg-source \
- --tar-ignore=*~ \
- --tar-ignore=.git \
- --tar-ignore=.gitattributes \
- --tar-ignore=.gitignore \
- --tar-ignore=experiments \
- --tar-ignore=debian \
- --tar-ignore=.github \
- --tar-ignore=.vscode \
- --tar-ignore=.configured \
- --tar-ignore=.devcontainer \
- --tar-ignore=.pc \
- --tar-ignore=__pycache__ \
- --tar-ignore=node_modules \
- --tar-ignore=keyman_1* \
- --tar-ignore=launchpad \
- --tar-ignore=dist \
- --tar-ignore=VERSION \
- \
- "${ignored_files[@]}" \
- \
- -Zxz -b .
-
-mv ../keyman_"${KEYMAN_VERSION}".tar.xz linux/dist/keyman-"${KEYMAN_VERSION}".tar.xz
+create_tarball
echo "3.0 (quilt)" > debian/source/format
-cd "${BASEDIR}"
+replace_toplevel_buildsh
# create orig.tar.xz
if [[ ! -z "${create_origdist+x}" ]]; then
- cd "${KEYMAN_ROOT}/linux/dist"
- pkgvers="keyman-${KEYMAN_VERSION}"
- tar xfJ keyman-"${KEYMAN_VERSION}".tar.xz
- mv -v keyman "${pkgvers}" 2>/dev/null || mv -v "$(find . -mindepth 1 -maxdepth 1 -type d)" "${pkgvers}"
- tar cfJ "keyman_${KEYMAN_VERSION}.orig.tar.xz" "${pkgvers}"
- rm "keyman-${KEYMAN_VERSION}.tar.xz"
- rm -rf "${pkgvers}"
+ create_debian_origtarxz
fi
+
+cd "${BASEDIR}"
diff --git a/linux/scripts/package-build.inc.sh b/linux/scripts/package-build.inc.sh
index ca58fb9d54..f1d6f15c69 100644
--- a/linux/scripts/package-build.inc.sh
+++ b/linux/scripts/package-build.inc.sh
@@ -32,7 +32,7 @@ function downloadSource() {
cd ..
mv "keyman-${version}" "${KEYMAN_ROOT}/linux/${packageDir}"
mv "keyman_${version}.orig.tar.xz" "${KEYMAN_ROOT}/linux/${packageDir}"
- mv "keyman_${version}.pkg.tar.xz" "${KEYMAN_ROOT}/linux/${packageDir}"
+ mv "keyman-${version}.tar.xz" "${KEYMAN_ROOT}/linux/${packageDir}"
mv "keyman"*.asc "${KEYMAN_ROOT}/linux/${packageDir}"
rm "keyman"*.debian.tar.xz
cd "${KEYMAN_ROOT}/linux/${packageDir}" || exit
diff --git a/linux/scripts/verify_source.sh b/linux/scripts/verify_source.sh
index bec62599f5..2ed00b9a6f 100755
--- a/linux/scripts/verify_source.sh
+++ b/linux/scripts/verify_source.sh
@@ -36,10 +36,6 @@ create_source_tarball() {
./scripts/reconf.sh
PKG_CONFIG_PATH="${KEYMAN_ROOT}/core/build/arch/release/meson-private" ./scripts/dist.sh
mv "dist/keyman-${KEYMAN_VERSION}.tar.xz" "${target_dir}"
-
- builder_echo heading "Make source for packaging"
- PKG_CONFIG_PATH="${KEYMAN_ROOT}/core/build/arch/release/meson-private" ./scripts/dist.sh origdist
- mv "dist/keyman_${KEYMAN_VERSION}.orig.tar.xz" "${target_dir}/keyman_${KEYMAN_VERSION}.pkg.tar.xz"
}
extract_source_tarball() {
@@ -51,15 +47,6 @@ extract_source_tarball() {
tar -xvf "keyman-${KEYMAN_VERSION}.tar.xz"
}
-extract_packaging_source_tarball() {
- local target_dir="$1"
-
- builder_echo heading "Extract packaging source tarball"
- cd "${target_dir}"
- rm -rf "keyman-${KEYMAN_VERSION}"
- tar -xvf "keyman_${KEYMAN_VERSION}.pkg.tar.xz"
-}
-
verify_can_build() {
local target_dir="$1"
builder_echo heading "Verifying build of tarball"
@@ -81,7 +68,7 @@ create_source_package() {
cd launchpad
cp -r "../keyman-${KEYMAN_VERSION}" .
cp -r "${KEYMAN_ROOT}/linux/debian" "keyman-${KEYMAN_VERSION}"
- cp "${target_dir}/keyman_${KEYMAN_VERSION}.pkg.tar.xz" "keyman_${KEYMAN_VERSION}.orig.tar.xz"
+ cp "${target_dir}/keyman-${KEYMAN_VERSION}.tar.xz" "keyman_${KEYMAN_VERSION}.orig.tar.xz"
"keyman-${KEYMAN_VERSION}/linux/scripts/launchpad.sh" --no-download \
--dist "$(lsb_release -c -s)" --outputdir "${target_dir}/launchpad" --no-lintian --no-sign
}
@@ -124,7 +111,8 @@ fi
if ! builder_has_option --source-only; then
builder_echo start lintian "Verifying Launchpad source package"
- extract_packaging_source_tarball "${TARGET_DIR}"
+ extract_source_tarball "${TARGET_DIR}"
+ mv "${TARGET_DIR}/keyman" "${TARGET_DIR}/keyman-${KEYMAN_VERSION}"
create_source_package "${TARGET_DIR}"
verify_lintian
rm -rf "${TARGET_DIR}/keyman-${KEYMAN_VERSION}"
diff --git a/linux/scripts/watch.in b/linux/scripts/watch.in
index 82a5ce6cde..b4c0039a84 100644
--- a/linux/scripts/watch.in
+++ b/linux/scripts/watch.in
@@ -1,3 +1,3 @@
version=4
# Tier replaced by package-build.inc.sh script
-opts=pgpsigurlmangle=s/$/.asc/ https://downloads.keyman.com/linux/$tier/@ANY_VERSION@/@PACKAGE@@ANY_VERSION@.pkg@ARCHIVE_EXT@ debian uupdate
+opts=pgpsigurlmangle=s/$/.asc/ https://downloads.keyman.com/linux/$tier/@ANY_VERSION@/@PACKAGE@@ANY_VERSION@@ARCHIVE_EXT@ debian uupdate
diff --git a/oem/firstvoices/ios/exportAppStore.plist b/oem/firstvoices/ios/exportAppStore.plist
index 35155c59ea..a981855b26 100644
--- a/oem/firstvoices/ios/exportAppStore.plist
+++ b/oem/firstvoices/ios/exportAppStore.plist
@@ -7,9 +7,9 @@
teamID
D7TR486TEH
signingCertificate
- D7B7973A30C90C1A04666667F24B4D5C7E913923
+ D2FEB39A439B44ACC1E5A710D20C17587EEE29E1
installerSigningCertificate
- D7B7973A30C90C1A04666667F24B4D5C7E913923
+ D2FEB39A439B44ACC1E5A710D20C17587EEE29E1
provisioningProfiles
com.firstvoices.keyboards
diff --git a/oem/firstvoices/windows/src/xml/strings.xml b/oem/firstvoices/windows/src/xml/strings.xml
index e69f624e0c..e476f1daf8 100644
--- a/oem/firstvoices/windows/src/xml/strings.xml
+++ b/oem/firstvoices/windows/src/xml/strings.xml
@@ -833,11 +833,6 @@ keyboard that you use in Windows. Keyman for FirstVoices will adapt automatical
en
-
-
-
- en
-
diff --git a/package-lock.json b/package-lock.json
index bdf2510433..5ac21c94d1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1148,7 +1148,7 @@
"@ngrok/ngrok": "^1.7.0",
"@sentry/node": "^7.57.0",
"chalk": "^4.1.2",
- "express": "^4.22.1",
+ "express": "^4.22.2",
"multer": "^2.1.1",
"open": "^8.4.0",
"restructure": "^3.0.1",
@@ -5195,22 +5195,23 @@
"license": "Apache-2.0"
},
"node_modules/body-parser": {
- "version": "1.20.3",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
- "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "version": "1.20.5",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
+ "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
+ "license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
+ "bytes": "~3.1.2",
"content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.13.0",
- "raw-body": "2.5.2",
+ "destroy": "~1.2.0",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "on-finished": "~2.4.1",
+ "qs": "~6.15.1",
+ "raw-body": "~2.5.3",
"type-is": "~1.6.18",
- "unpipe": "1.0.0"
+ "unpipe": "~1.0.0"
},
"engines": {
"node": ">= 0.8",
@@ -5221,6 +5222,7 @@
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@@ -5229,14 +5231,60 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
+ "node_modules/body-parser/node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
"node_modules/body-parser/node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser/node_modules/raw-body": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/body-parser/node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
},
"node_modules/brace-expansion": {
"version": "1.1.12",
@@ -5494,6 +5542,7 @@
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@@ -6266,6 +6315,7 @@
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
"integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
"dependencies": {
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
@@ -7726,14 +7776,14 @@
"dev": true
},
"node_modules/express": {
- "version": "4.22.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
- "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
+ "version": "4.22.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz",
+ "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==",
"license": "MIT",
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "~1.20.3",
+ "body-parser": "~1.20.5",
"content-disposition": "~0.5.4",
"content-type": "~1.0.4",
"cookie": "~0.7.1",
@@ -7752,7 +7802,7 @@
"parseurl": "~1.3.3",
"path-to-regexp": "~0.1.12",
"proxy-addr": "~2.0.7",
- "qs": "~6.14.0",
+ "qs": "~6.15.1",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
"send": "~0.19.0",
@@ -7802,40 +7852,6 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
- "node_modules/express/node_modules/qs": {
- "version": "6.14.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
- "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
- "license": "BSD-3-Clause",
- "dependencies": {
- "side-channel": "^1.1.0"
- },
- "engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/express/node_modules/side-channel": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
- "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
- "license": "MIT",
- "dependencies": {
- "es-errors": "^1.3.0",
- "object-inspect": "^1.13.3",
- "side-channel-list": "^1.0.0",
- "side-channel-map": "^1.0.1",
- "side-channel-weakmap": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/express/node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
@@ -8561,6 +8577,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
"integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
"dependencies": {
"es-define-property": "^1.0.0"
},
@@ -11680,12 +11697,12 @@
"license": "MIT"
},
"node_modules/qs": {
- "version": "6.13.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
- "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "version": "6.15.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
+ "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
"license": "BSD-3-Clause",
"dependencies": {
- "side-channel": "^1.0.6"
+ "side-channel": "^1.1.0"
},
"engines": {
"node": ">=0.6"
@@ -11740,6 +11757,7 @@
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dev": true,
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
@@ -12169,6 +12187,7 @@
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
"integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
"dependencies": {
"define-data-property": "^1.1.4",
"es-errors": "^1.3.0",
@@ -12236,14 +12255,16 @@
}
},
"node_modules/side-channel": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
- "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.7",
"es-errors": "^1.3.0",
- "get-intrinsic": "^1.2.4",
- "object-inspect": "^1.13.1"
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -14153,7 +14174,7 @@
"@sentry/cli": "^2.31.0",
"@zip.js/zip.js": "^2.7.32",
"c8": "^7.12.0",
- "express": "^4.19.2",
+ "express": "^4.22.2",
"jsdom": "^23.0.1",
"promise-status-async": "^1.2.10",
"tsx": "^4.19.0"
diff --git a/resources/teamcity/linux/keyman-linux-release.sh b/resources/teamcity/linux/keyman-linux-release.sh
index 9fb73ef91e..9cc1b76a1b 100755
--- a/resources/teamcity/linux/keyman-linux-release.sh
+++ b/resources/teamcity/linux/keyman-linux-release.sh
@@ -61,15 +61,11 @@ function _make_release_source_tarball() {
./scripts/reconf.sh
PKG_CONFIG_PATH="${KEYMAN_ROOT}/core/build/arch/release/meson-private" ./scripts/dist.sh
mv dist/*.tar.xz "upload/${KEYMAN_VERSION}/"
- builder_echo heading "Make source for packaging"
- PKG_CONFIG_PATH="${KEYMAN_ROOT}/core/build/arch/release/meson-private" ./scripts/dist.sh origdist
- mv "dist/keyman_${KEYMAN_VERSION}.orig.tar.xz" "dist/keyman_${KEYMAN_VERSION}.pkg.tar.xz"
- mv dist/*.tar.xz "upload/${KEYMAN_VERSION}/"
(
cd "upload/${KEYMAN_VERSION}"
sha256sum ./*.tar.xz > SHA256SUMS
- builder_echo end "make source tarball" success "Make source tarball"
)
+ builder_echo end "make source tarball" success "Make source tarball"
}
function _sign_source_tarball() {
@@ -100,7 +96,6 @@ function _publish_to_downloads() {
chmod a+r "${UPLOAD_DIR}"/*
write_download_info "${UPLOAD_DIR}" "keyman-${KEYMAN_VERSION}.tar.xz" "Keyman for Linux source tarball" tar.xz linux
- write_download_info "${UPLOAD_DIR}" "keyman_${KEYMAN_VERSION}.pkg.tar.xz" "Keyman for Linux source for packaging" tar.xz linux
tc_rsync_upload "${UPLOAD_DIR}" "linux/${KEYMAN_TIER}"
builder_echo end "publish to downloads" success "Publish to downloads.keyman.com"
diff --git a/web/NOTICE b/web/NOTICE
deleted file mode 100644
index 116bef6767..0000000000
--- a/web/NOTICE
+++ /dev/null
@@ -1,5 +0,0 @@
- Tavultesoft KeymanWeb 2.0
- Copyright 2005-2014 Tavultesoft Pty Ltd
-
- This product includes software developed at
- Tavultesoft (http://www.tavultesoft.com/).
diff --git a/web/docs/engine/guide/adding-keyboards.md b/web/docs/engine/guide/adding-keyboards.md
index 221f495de1..957df80270 100644
--- a/web/docs/engine/guide/adding-keyboards.md
+++ b/web/docs/engine/guide/adding-keyboards.md
@@ -8,8 +8,8 @@ There are multiple ways to add and install keyboards into your KeymanWeb install
The most efficient way to utilize a keyboard is to obtain a local copy of it and place this copy in a static location on your website. Once this is done, it can be directly linked into KeymanWeb as follows.
-```c
-keyman.addKeyboards({
+```typescript
+await keyman.addKeyboards({
id:'us', // The keyboard's unique identification code.
name:'English', // The keyboard's user-readable name.
language:{
@@ -22,7 +22,7 @@ keyman.addKeyboards({
Custom fonts may also be utilized via the `language.font` property. For example:
-```c
+```typescript
font:{
family:'LaoWeb',
source:['../font/saysettha_web.ttf','../font/saysettha_web.woff','../font/saysettha_web.eot']
@@ -33,16 +33,16 @@ font:{
To obtain the default Keyman keyboard for a given language, call the following function.
-```c
-keyman.addKeyboardsForLanguage('Dzongkha');
+```typescript
+await keyman.addKeyboardsForLanguage('Dzongkha');
```
This example would find the default keyboard for the Dzongkha language. This method will fail if the name doesn't perfectly match any language found in the CDN's repository.
Alternatively, languages may be looked up via their BCP 47 language code as follows:
-```c
-keyman.addKeyboards('@he')
+```typescript
+await keyman.addKeyboards('@he');
```
The `@` prefix indicates the use of the BCP 47 language code, which in this case corresponds with Hebrew.
@@ -51,8 +51,8 @@ The `@` prefix indicates the use of the BCP 47 language code, which in this case
To obtain a specific keyboard by name or by keyboard name and language code as a pair, see the following:
-```c
-keyman.addKeyboards('french','sil_euro_latin@sv','sil_euro_latin@no')
+```typescript
+await keyman.addKeyboards('french', 'sil_euro_latin@sv', 'sil_euro_latin@no');
```
This will install three keyboards - one for French (named, quite simply, "French") and two copies of the EuroLatin keyboard - one for Swedish and one for Norwegian.
diff --git a/web/docs/engine/guide/examples/__auto-control.html b/web/docs/engine/guide/examples/__auto-control.html
index 050e03a9f0..c2a8b472b0 100644
--- a/web/docs/engine/guide/examples/__auto-control.html
+++ b/web/docs/engine/guide/examples/__auto-control.html
@@ -1,20 +1,17 @@
+
-
-
@@ -28,4 +25,4 @@
Back to Document
-
\ No newline at end of file
+