;
+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 ee9a3c0e828..1df9e42d8c2 100644
--- a/developer/src/tike/main/Keyman.System.KeymanCore.pas
+++ b/developer/src/tike/main/Keyman.System.KeymanCore.pas
@@ -233,7 +233,7 @@ function km_core_state_options_update(
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 0b5600152b9..3c902391737 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 9a76254c969..924bec9acd5 100644
--- a/developer/src/tike/main/UfrmMessages.pas
+++ b/developer/src/tike/main/UfrmMessages.pas
@@ -170,6 +170,12 @@ implementation
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 @@ procedure TfrmMessages.Add(state: TProjectLogState; filename, msg: WideString; M
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 c7a7cafcc5c..94cb28c151c 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 @@ function TkpsProjectFileAction.CompilePackage: Boolean;
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 646496f5c7d..7bada6adbf8 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 9813fcc2aec..165fb6a718a 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 b66615ad9dc..a09225e3ea3 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 ca58fb9d54d..f1d6f15c692 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 bec62599f55..2ed00b9a6f8 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 82a5ce6cde7..b4c0039a846 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 35155c59ea9..a981855b265 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 e69f624e0c7..e476f1daf89 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 bdf2510433b..5ac21c94d1d 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 9fb73ef91e9..9cc1b76a1b6 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 116bef67679..00000000000
--- 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 221f495de1b..957df80270c 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 050e03a9f03..c2a8b472b09 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 @@ Automatic Mode Example
Back to Document
-
\ No newline at end of file
+