Skip to content

Commit 7f27971

Browse files
authored
nix: write prisma-language-server derivation (#1313)
That makes it very easy for nix users to reproducibly build and run the language server. See the new section in CONTRIBUTING.md for more info. Good next steps would be integrating test runs and improving the dev shell.
1 parent 46fa45b commit 7f27971

8 files changed

+330
-5
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ coverage
1010
# Dependency directory
1111
**/node_modules/**
1212

13+
# Nix
14+
/result
15+
1316
# Others
1417
/.direnv
1518
dist/

flake.lock

+254
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

+16-3
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,29 @@
77
inputs.nixpkgs-lib.follows = "nixpkgs";
88
};
99
nixpkgs.url = "nixpkgs/nixos-unstable";
10+
dream2nix = {
11+
url = "github:nix-community/dream2nix";
12+
inputs = {
13+
nixpkgs.follows = "nixpkgs";
14+
flake-parts.follows = "flake-parts";
15+
16+
# Avoid fetching large unused projects.
17+
all-cabal-json.follows = "nixpkgs";
18+
nix-pypi-fetcher.follows = "nixpkgs";
19+
};
20+
};
1021
};
1122

12-
outputs = { self, nixpkgs, flake-parts }:
23+
outputs = { self, nixpkgs, flake-parts, dream2nix }:
1324
flake-parts.lib.mkFlake { inherit self; } {
1425
systems = [ "x86_64-linux" ];
15-
perSystem = { pkgs, system, self', ... }:
26+
imports = [ dream2nix.flakeModuleBeta ];
27+
perSystem = { ... }:
1628
{
1729
imports = [
18-
./nix/format-project.nix
1930
./nix/delete-node-modules.nix
31+
./nix/format-project.nix
32+
./nix/prisma-language-server.nix
2033
./nix/shell.nix
2134
./nix/vscode.nix
2235
];

nix/format-project.nix

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
{
44
packages.formatProject = pkgs.writeShellScriptBin "formatProject" ''
55
PATH=${pkgs.nodejs}/bin:${pkgs.jq}/bin:$PATH
6-
PRETTIER_VERSION=`jq -r .devDependencies.prettier ${./package.json}`
6+
PRETTIER_VERSION=`jq -r .devDependencies.prettier ${../package.json}`
77
npx prettier@$PRETTIER_VERSION -w ./packages/**/*.ts ./**/*.json ./**/*.js
88
'';
99
}

nix/prisma-language-server.nix

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{ pkgs, config, ... }:
2+
3+
let
4+
# We clean up the source for dream2nix to produce just the node_modules we
5+
# need to build and run the server.
6+
src = pkgs.runCommand "makesrc"
7+
{ jq = pkgs.jq; root = ../packages/language-server; }
8+
''
9+
export PATH="$jq/bin:$PATH"
10+
11+
mkdir $out
12+
cp -r $root/src $out/src
13+
cp $root/package-lock.json $out/package-lock.json
14+
jq 'del(.scripts) | del(.bin) | del(.devDependencies.typescript) | del(.devDependencies.mocha)' $root/package.json > $out/package.json
15+
jq 'del(.extends) | del(.exclude)' $root/tsconfig.json > $out/tsconfig.json
16+
'';
17+
18+
inherit (pkgs) nodejs typescript;
19+
in
20+
{
21+
dream2nix.inputs.language-server.source = src;
22+
23+
packages.prisma-language-server =
24+
let nodeDeps = config.dream2nix.outputs.language-server.packages."@prisma/language-server"; in
25+
pkgs.stdenv.mkDerivation
26+
{
27+
name = "prisma-language-server";
28+
src = "${nodeDeps}/lib/node_modules/@prisma/language-server";
29+
30+
buildInputs = [ nodejs typescript ];
31+
buildPhase = ''
32+
tsc --outDir $out/lib/dist
33+
cp -r node_modules $out/lib
34+
cp package.json $out/lib
35+
'';
36+
37+
installPhase = ''
38+
mkdir $out/bin
39+
echo '#!/bin/bash' >> $out/bin/prisma-language-server
40+
echo "${nodejs}/bin/node $out/lib/dist/src/bin.js" >> $out/bin/prisma-language-server
41+
chmod +x $out/bin/prisma-language-server
42+
'';
43+
};
44+
}

nix/shell.nix

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
devShells.default = pkgs.mkShell {
55
packages = [
66
pkgs.nodejs
7+
pkgs.typescript
78
self'.packages.buildVscodeExtension
89
self'.packages.code
910
self'.packages.deleteNodeModules

packages/language-server/CONTRIBUTING.md

+10
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,13 @@ Unit tests:
2525
## Publishing
2626

2727
The extension is automatically published to npm via GitHub actions (see `.github/workflows`).
28+
29+
## Nix users
30+
31+
The flake in this repository has a language server package.
32+
33+
Run `nix build .#prisma-language-server` to build it. The compiled output and a
34+
wrapper script will be in the `result/` directory.
35+
36+
Run `nix run .#prisma-language-server -- --stdio` to run the language server, listening
37+
over stdio.

0 commit comments

Comments
 (0)