Commit 939e1b8f authored by Doron Behar's avatar Doron Behar
Browse files

matrix-appservice-discord: rewrite using yarn{Config,Build}Hooks

Addresses #324246 .
parent ce8de01c
Loading
Loading
Loading
Loading
+0 −84
Original line number Diff line number Diff line
{
  "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"
  }
}
+77 −66
Original line number Diff line number Diff line
{
  lib,
  mkYarnPackage,
  stdenv,
  fetchYarnDeps,
  fetchFromGitHub,

  # native
  yarn,
  yarnConfigHook,
  node-gyp,
  python3,
  srcOnly,
  makeWrapper,
  removeReferencesTo,
  python3,
  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/* ./
      '';
    };

    better-sqlite3 = {
      nativeBuildInputs = [ python3 ];
      postInstall = ''
        # build native sqlite bindings
  nativeBuildInputs = [
    yarnConfigHook'
    yarnBuildHook'
    nodejs_20
    node-gyp
    python3
    removeReferencesTo
    makeWrapper
  ];

  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 \
          ${removeReferencesTo}/bin/remove-references-to \
          -t "${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

    mkdir -p $out/lib/node_modules

  buildPhase = ''
    runHook preBuild
    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"

    # compile TypeScript sources
    yarn --offline build
    # 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 postBuild
    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";
  };
}
})
+0 −5
Original line number Diff line number Diff line
{
  "version": "4.0.0",
  "srcHash": "sha256-UyRMMbnX4aJVv8oQfgn/rkZT1cRATtcgFj4fXszDKqo=",
  "yarnSha256": "11zw1nkvsplnsiddyi1nb9zgdxn1mkh24nlcvaa69rpsjns9rj5k"
}
+0 −42
Original line number Diff line number Diff line
#!/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