matrix-appservice-discord: rewrite using yarn{Config,Build}Hooks (#493048)

This commit is contained in:
Doron Behar
2026-03-02 16:50:03 +00:00
committed by GitHub
4 changed files with 78 additions and 198 deletions
@@ -1,84 +0,0 @@
{
"name": "matrix-appservice-discord",
"version": "4.0.0",
"description": "A bridge between Matrix and Discord",
"main": "discordas.js",
"engines": {
"npm": "please-use-yarn",
"node": ">=18 <=20"
},
"scripts": {
"test": "mocha -r ts-node/register test/config.ts test/test_*.ts test/**/test_*.ts",
"lint": "eslint -c .eslintrc --max-warnings 200 src/**/*.ts test/**/*.ts",
"coverage": "tsc && nyc mocha build/test/config.js build/test",
"build": "tsc",
"postinstall": "yarn build",
"start": "node ./build/src/discordas.js",
"debug": "node --inspect ./build/src/discordas.js",
"addbot": "node ./build/tools/addbot.js",
"adminme": "node ./build/tools/adminme.js",
"usertool": "node ./build/tools/userClientTools.js",
"directoryfix": "node ./build/tools/addRoomsToDirectory.js",
"ghostfix": "node ./build/tools/ghostfix.js",
"chanfix": "node ./build/tools/chanfix.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Half-Shot/matrix-appservice-discord.git"
},
"keywords": [
"matrix",
"discord",
"bridge",
"application-service",
"as"
],
"author": "Half-Shot",
"license": "Apache-2.0",
"bugs": {
"url": "https://github.com/Half-Shot/matrix-appservice-discord/issues"
},
"homepage": "https://github.com/Half-Shot/matrix-appservice-discord#readme",
"dependencies": {
"@mx-puppet/better-discord.js": "^12.5.1",
"@mx-puppet/matrix-discord-parser": "^0.1.10",
"better-sqlite3": "^8.6.0",
"command-line-args": "^5.1.1",
"command-line-usage": "^6.1.0",
"escape-html": "^1.0.3",
"escape-string-regexp": "^4.0.0",
"js-yaml": "^3.14.0",
"marked": "^1.2.2",
"matrix-appservice-bridge": "^9.0.1",
"mime": "^2.4.6",
"p-queue": "^6.4.0",
"pg-promise": "^10.5.6",
"prom-client": "^12.0.0",
"uuid": "^8.3.1",
"winston": "^3.2.1",
"winston-daily-rotate-file": "^4.5.0"
},
"devDependencies": {
"@istanbuljs/nyc-config-typescript": "^1.0.1",
"@types/better-sqlite3": "^5.4.1",
"@types/chai": "^4.2.11",
"@types/command-line-args": "^5.0.0",
"@types/express": "^4.17.9",
"@types/js-yaml": "^3.12.4",
"@types/marked": "^1.1.0",
"@types/mime": "^2.0.2",
"@types/mocha": "^7.0.2",
"@types/node": "^14",
"@typescript-eslint/eslint-plugin": "^5.4.0",
"@typescript-eslint/parser": "^5.4.0",
"chai": "^4.2.0",
"eslint": "^7.4.0",
"mocha": "^8.0.1",
"nyc": "^15.1.0",
"proxyquire": "^1.7.11",
"source-map-support": "^0.5.19",
"ts-node": "^8.10.2",
"typescript": "^4.2.3",
"why-is-node-running": "^2.2.0"
}
}
@@ -1,74 +1,108 @@
{
lib,
mkYarnPackage,
stdenv,
fetchYarnDeps,
fetchFromGitHub,
srcOnly,
makeWrapper,
removeReferencesTo,
# native
yarn,
yarnConfigHook,
node-gyp,
python3,
srcOnly,
removeReferencesTo,
yarnBuildHook,
makeWrapper,
# buildInputs
nodejs_20,
matrix-sdk-crypto-nodejs,
napi-rs-cli,
}:
let
nodejs = nodejs_20; # only supports nodejs v18.X - v20.X
pin = lib.importJSON ./pin.json;
nodeSources = srcOnly nodejs;
yarn' = yarn.override {
nodejs = nodejs_20;
};
yarnConfigHook' = yarnConfigHook.override {
nodejs = nodejs_20;
yarn = yarn';
};
yarnBuildHook' = yarnBuildHook.override {
nodejs = nodejs_20;
yarn = yarn';
};
matrix-sdk-crypto-nodejs' = matrix-sdk-crypto-nodejs.override {
nodejs = nodejs_20;
napi-rs-cli = napi-rs-cli.override {
nodejs = nodejs_20;
};
};
nodeSources = srcOnly nodejs_20;
in
mkYarnPackage rec {
stdenv.mkDerivation (finalAttrs: {
pname = "matrix-appservice-discord";
inherit (pin) version;
inherit nodejs;
version = "4.0.0";
src = fetchFromGitHub {
owner = "matrix-org";
repo = "matrix-appservice-discord";
rev = "v${version}";
hash = pin.srcHash;
tag = "v${finalAttrs.version}";
hash = "sha256-UyRMMbnX4aJVv8oQfgn/rkZT1cRATtcgFj4fXszDKqo=";
};
packageJSON = ./package.json;
offlineCache = fetchYarnDeps {
yarnLock = "${src}/yarn.lock";
sha256 = pin.yarnSha256;
yarnOfflineCache = fetchYarnDeps {
yarnLock = "${finalAttrs.src}/yarn.lock";
hash = "sha256-s8ictJX65mSU2oxaIuCswfb2flo2RN9a1JZevacN/Ic=";
};
pkgConfig = {
"@matrix-org/matrix-sdk-crypto-nodejs" = {
postInstall = ''
# replace with the built package
cd ..
rm -r matrix-sdk-crypto-nodejs
ln -s ${matrix-sdk-crypto-nodejs}/lib/node_modules/@matrix-org/* ./
'';
};
nativeBuildInputs = [
yarnConfigHook'
yarnBuildHook'
nodejs_20
node-gyp
python3
removeReferencesTo
makeWrapper
];
better-sqlite3 = {
nativeBuildInputs = [ python3 ];
postInstall = ''
# build native sqlite bindings
npm run build-release --offline --nodedir="${nodeSources}"
find build -type f -exec \
${removeReferencesTo}/bin/remove-references-to \
-t "${nodeSources}" {} \;
'';
};
};
preBuild = ''
cp -r ${matrix-sdk-crypto-nodejs'}/lib/node_modules/@matrix-org ./node_modules
cd ./node_modules/better-sqlite3
npm run build-release --offline --nodedir="${nodeSources}"
find build -type f -exec remove-references-to -t "${nodeSources}" {} \;
cd ../../
'';
nativeBuildInputs = [ makeWrapper ];
# npmHooks.npmInstallHook and yarnInstallHook don't work for this package
# because:
#
# - There is no `bin` key in
# package.json, which instructs it to create a binary file for the package.
# - The build/ directory, containing the compiled `.js` files from some
# doesn't get picked up by `yarn pack`.
installPhase = ''
runHook preInstall
buildPhase = ''
runHook preBuild
mkdir -p $out/lib/node_modules
# compile TypeScript sources
yarn --offline build
mv build $out/lib/node_modules/matrix-appservice-discord
cp -r node_modules $out/lib/node_modules/matrix-appservice-discord
makeWrapper '${nodejs_20}/bin/node' "$out/bin/matrix-appservice-discord" \
--add-flags "$out/lib/node_modules/matrix-appservice-discord/src/discordas.js"
runHook postBuild
# admin tools wrappers
for toolPath in $out/lib/node_modules/matrix-appservice-discord/tools/*; do
makeWrapper '${nodejs_20}/bin/node' \
"$out/bin/matrix-appservice-discord-$(basename $toolPath .js)" \
--add-flags "$toolPath"
done
runHook postInstall
'';
doCheck = true;
checkPhase = ''
runHook preCheck
@@ -78,29 +112,6 @@ mkYarnPackage rec {
runHook postCheck
'';
postInstall = ''
OUT_JS_DIR="$out/${passthru.nodeAppDir}/build"
# server wrapper
makeWrapper '${nodejs}/bin/node' "$out/bin/${pname}" \
--add-flags "$OUT_JS_DIR/src/discordas.js"
# admin tools wrappers
for toolPath in $OUT_JS_DIR/tools/*; do
makeWrapper '${nodejs}/bin/node' \
"$out/bin/${pname}-$(basename $toolPath .js)" \
--add-flags "$toolPath"
done
'';
# don't generate the dist tarball
doDist = false;
passthru = {
nodeAppDir = "libexec/${pname}/deps/${pname}";
updateScript = ./update.sh;
};
meta = {
description = "Bridge between Matrix and Discord";
homepage = "https://github.com/matrix-org/matrix-appservice-discord";
@@ -109,4 +120,4 @@ mkYarnPackage rec {
platforms = lib.platforms.linux;
mainProgram = "matrix-appservice-discord";
};
}
})
@@ -1,5 +0,0 @@
{
"version": "4.0.0",
"srcHash": "sha256-UyRMMbnX4aJVv8oQfgn/rkZT1cRATtcgFj4fXszDKqo=",
"yarnSha256": "11zw1nkvsplnsiddyi1nb9zgdxn1mkh24nlcvaa69rpsjns9rj5k"
}
@@ -1,42 +0,0 @@
#!/usr/bin/env nix-shell
#!nix-shell -I nixpkgs=../../../ -i bash -p nix curl jq prefetch-yarn-deps nix-prefetch-github
ORG="matrix-org"
PROJ="matrix-appservice-discord"
if [ "$#" -gt 1 ] || [[ "$1" == -* ]]; then
echo "Regenerates packaging data for $PROJ."
echo "Usage: $0 [git release tag]"
exit 1
fi
tag="$1"
set -euo pipefail
if [ -z "$tag" ]; then
tag="$(
curl "https://api.github.com/repos/$ORG/$PROJ/releases?per_page=1" |
jq -r '.[0].tag_name'
)"
fi
src="https://raw.githubusercontent.com/$ORG/$PROJ/$tag"
src_hash=$(nix-prefetch-github $ORG $PROJ --rev ${tag} | jq -r .hash)
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
pushd $tmpdir
curl -O "$src/yarn.lock"
yarn_sha256=$(prefetch-yarn-deps yarn.lock)
popd
curl -O "$src/package.json"
cat > pin.json << EOF
{
"version": "$(echo $tag | grep -P '(\d|\.)+' -o)",
"srcHash": "$src_hash",
"yarnSha256": "$yarn_sha256"
}
EOF