137 lines
5.3 KiB
Nix
137 lines
5.3 KiB
Nix
{ pkgs, rust, rustPlatform, inputs, hashes, mtpSource, mtpVendor }:
|
|
let
|
|
inherit (pkgs) lib;
|
|
pnpm = pkgs.pnpm;
|
|
sdk-deps = pkgs.fetchPnpmDeps {
|
|
pname = "mtp-sdk";
|
|
version = "0.4.0";
|
|
src = inputs.mtp;
|
|
inherit pnpm;
|
|
fetcherVersion = 4;
|
|
hash = hashes.sdk;
|
|
};
|
|
wasmVersion = (lib.findFirst (p: p.name == "wasm-bindgen") (throw "Missing wasm-bindgen")
|
|
(builtins.fromTOML (builtins.readFile (inputs.mtp + "/Cargo.lock"))).package).version;
|
|
wasmBindgen = pkgs.${"wasm-bindgen-cli_" + builtins.replaceStrings [ "." ] [ "_" ] wasmVersion};
|
|
mtp-sdk = pkgs.stdenv.mkDerivation {
|
|
pname = "mtp-sdk";
|
|
version = "0.4.0";
|
|
src = mtpSource;
|
|
pnpmDeps = sdk-deps;
|
|
cargoDeps = mtpVendor;
|
|
nativeBuildInputs = [ rust pkgs.nodejs pnpm pkgs.pnpmConfigHook rustPlatform.cargoSetupHook wasmBindgen pkgs.lld ];
|
|
MTP_TYPE_MAPS = "${inputs.mtp-type-maps}/type-maps.yaml";
|
|
RUSTFLAGS = "--cfg=web_sys_unstable_apis";
|
|
buildPhase = ''
|
|
runHook preBuild
|
|
cargo build --locked --offline --release -p mtp-wasm --target wasm32-unknown-unknown
|
|
mkdir -p sdk/bindings/wasm/pkg
|
|
wasm-bindgen target/wasm32-unknown-unknown/release/mtp_wasm.wasm \
|
|
--target web --out-dir sdk/bindings/wasm/pkg --out-name mtp_wasm
|
|
pnpm --dir sdk run build:ts
|
|
# The Nix SDK already contains WASM compiled with the authoritative maps.
|
|
# Keep the plugin's YAML generation and aliases, but reuse that build.
|
|
substituteInPlace sdk/dist/vite/index.js \
|
|
--replace-fail 'await runWasmPack(state);' \
|
|
'await fs.cp(path.join(packageRoot, "bindings/wasm/pkg"), state.outDir, { recursive: true });'
|
|
runHook postBuild
|
|
'';
|
|
installPhase = ''
|
|
mkdir -p "$out"
|
|
cp -r sdk/dist sdk/bindings sdk/type-map sdk/package.json "$out/"
|
|
mkdir -p "$out/node_modules"
|
|
cp -rL sdk/node_modules/yaml "$out/node_modules/"
|
|
'';
|
|
passthru.source = inputs.mtp;
|
|
};
|
|
client-source = pkgs.runCommand "client-source" { nativeBuildInputs = [ pkgs.python3 ]; } ''
|
|
cp -r ${inputs.client} "$out"
|
|
chmod -R u+w "$out"
|
|
rm -rf "$out/mtp-type-maps"
|
|
cp -r ${inputs.mtp-type-maps} "$out/mtp-type-maps"
|
|
mkdir -p "$out/.mtp-sdk"
|
|
cp ${inputs.mtp}/sdk/package.json "$out/.mtp-sdk/package.json"
|
|
python - "$out" <<'PY'
|
|
import json, sys, os, re
|
|
from pathlib import Path
|
|
root = Path(sys.argv[1])
|
|
workspace = root / 'pnpm-workspace.yaml'
|
|
workspace.write_text(re.sub(r'^ mtp:.*\n', "", workspace.read_text(), flags=re.M))
|
|
for path in root.rglob('package.json'):
|
|
if '.mtp-sdk' in path.parts:
|
|
continue
|
|
data = json.loads(path.read_text())
|
|
for section in ['dependencies', 'devDependencies']:
|
|
if 'mtp' in data.get(section, {}):
|
|
data[section]['mtp'] = 'link:' + os.path.relpath(root / '.mtp-sdk', path.parent)
|
|
path.write_text(json.dumps(data, indent=2) + '\n')
|
|
PY
|
|
${lib.optionalString (builtins.pathExists ./locks/client.yaml) ''cp ${./locks/client.yaml} "$out/pnpm-lock.yaml"''}
|
|
'';
|
|
client-deps = pkgs.fetchPnpmDeps {
|
|
pname = "tensamin";
|
|
version = "0.0.11";
|
|
src = client-source;
|
|
inherit pnpm;
|
|
fetcherVersion = 4;
|
|
hash = hashes.client;
|
|
};
|
|
common = {
|
|
version = "0.0.11";
|
|
src = client-source;
|
|
pnpmDeps = client-deps;
|
|
nativeBuildInputs = [ pkgs.nodejs pnpm pkgs.pnpmConfigHook pkgs.makeWrapper ];
|
|
ELECTRON_SKIP_BINARY_DOWNLOAD = "1";
|
|
postPatch = ''
|
|
rm -rf .mtp-sdk
|
|
cp -r ${mtp-sdk} .mtp-sdk
|
|
chmod -R u+w .mtp-sdk
|
|
'';
|
|
passthru = { source = inputs.client; inherit mtp-sdk; };
|
|
meta.platforms = [ "x86_64-linux" "aarch64-linux" ];
|
|
};
|
|
client-web = pkgs.stdenv.mkDerivation (common // {
|
|
pname = "tensamin-web";
|
|
buildPhase = ''
|
|
runHook preBuild
|
|
pnpm run build:web
|
|
runHook postBuild
|
|
'';
|
|
installPhase = ''mkdir -p "$out"; cp -r apps/web/dist/. "$out/"'';
|
|
});
|
|
client = pkgs.stdenv.mkDerivation (common // {
|
|
pname = "tensamin";
|
|
buildPhase = ''
|
|
runHook preBuild
|
|
TENSAMIN_WEB_BASE=./ pnpm run build:web
|
|
pnpm --dir apps/electron run build
|
|
runHook postBuild
|
|
'';
|
|
installPhase = ''
|
|
mkdir -p "$out/lib/tensamin" "$out/bin"
|
|
cp -r apps/electron/dist "$out/lib/tensamin/"
|
|
cp apps/electron/package.json "$out/lib/tensamin/"
|
|
mkdir -p "$out/lib/web/dist"
|
|
cp -r apps/web/dist/. "$out/lib/web/dist/"
|
|
makeWrapper ${pkgs.electron}/bin/electron "$out/bin/tensamin" \
|
|
--add-flags "$out/lib/tensamin" \
|
|
--prefix PATH : ${lib.makeBinPath [ pkgs.pulseaudio ]} \
|
|
--set ELECTRON_OZONE_PLATFORM_HINT auto
|
|
if [ -d apps/electron/build/icons ]; then
|
|
mkdir -p "$out/lib/tensamin/build"
|
|
cp -r apps/electron/build/icons "$out/lib/tensamin/build/icons"
|
|
install -Dm644 apps/electron/build/icons/icon.png "$out/share/icons/hicolor/512x512/apps/tensamin.png"
|
|
fi
|
|
mkdir -p "$out/share/applications"
|
|
cp ${pkgs.makeDesktopItem {
|
|
name = "tensamin";
|
|
desktopName = "Tensamin";
|
|
exec = "tensamin %U";
|
|
icon = "tensamin";
|
|
categories = [ "Network" ];
|
|
mimeTypes = [ "x-scheme-handler/tensamin" ];
|
|
}}/share/applications/* "$out/share/applications/"
|
|
'';
|
|
meta = common.meta // { mainProgram = "tensamin"; };
|
|
});
|
|
in { inherit client client-web mtp-sdk client-source client-deps sdk-deps; }
|