My Nix configuration. Enter at your own risk.
1{
2 config,
3 lib,
4 pkgs,
5 utils,
6 ...
7}: {
8 options.modules.home.webdev-common = {
9 enable = lib.mkEnableOption "webdev-common";
10
11 javascript = utils.mkToggle "javascript" true;
12 typescript = utils.mkToggle "typescript" true;
13 svelte = utils.mkToggle "svelte" true;
14 astro = utils.mkToggle "astro" true;
15 pnpm = utils.mkToggle "pnpm" true;
16 yarn = utils.mkToggle "yarn" true;
17 fnm = utils.mkToggle "fnm" true;
18 bun = utils.mkToggle "bun" true;
19
20 vue = utils.mkToggle "vue" false;
21 };
22
23 config = let
24 webdev-common = config.modules.home.webdev-common;
25 pnpmHome = "${config.home.homeDirectory}/.local/share/pnpm";
26 in
27 lib.mkIf webdev-common.enable (lib.mkMerge [
28 {
29 home.packages = utils.mkIfOptions webdev-common {
30 javascript = pkgs.vscode-langservers-extracted;
31 svelte = pkgs.svelte-language-server;
32 astro = pkgs.astro-language-server;
33 vue = pkgs.vue-language-server;
34 pnpm = pkgs.pnpm;
35 yarn = pkgs.yarn;
36 fnm = pkgs.fnm;
37 bun = pkgs.bun;
38 typescript = [
39 pkgs.typescript-language-server
40 pkgs.typescript
41 ];
42 };
43 }
44 (lib.mkIf webdev-common.pnpm.enable {
45 home.sessionVariables.PNPM_HOME = pnpmHome;
46 home.sessionPath = [pnpmHome];
47 })
48 (lib.mkIf (config.modules.home.helix.enable && webdev-common.astro.enable) {
49 programs.helix.languages.language = [
50 {
51 roots = ["package.json" "astro.config.mjs"];
52 language-servers = ["astro-ls"];
53 injection-regex = "astro";
54 file-types = ["astro"];
55 scope = "source.astro";
56 name = "astro";
57 }
58 ];
59
60 programs.helix.languages.language-server.astro-ls = {
61 initOptions.typescript.tsdk = "${pkgs.typescript}/lib/node_modules/typescript/lib";
62 command = "astro-ls";
63 args = ["--stdio"];
64 };
65 })
66 (lib.mkIf (config.modules.home.fish.enable && webdev-common.fnm.enable) {
67 programs.fish.interactiveShellInit = ''
68 ${pkgs.fnm}/bin/fnm env --use-on-cd --shell fish | source
69 '';
70 })
71 ]);
72}