1# wrapper over vscode to control extensions per project (extensions folder will be created in execution path)
2{
3 lib,
4 writeShellScriptBin,
5 extensionsFromVscodeMarketplace,
6 vscodeDefault,
7}:
8## User input
9{
10 vscode ? vscodeDefault,
11 # extensions to be symlinked into the project's extensions folder
12 nixExtensions ? [ ],
13 # extensions to be copied into the project's extensions folder
14 mutableExtensions ? [ ],
15 vscodeExtsFolderName ? ".vscode-exts",
16 user-data-dir ? ''"''${TMP}vscodeWithConfiguration/vscode-data-dir"'',
17}:
18let
19 nixExtsDrvs = extensionsFromVscodeMarketplace nixExtensions;
20 mutExtsDrvs = extensionsFromVscodeMarketplace mutableExtensions;
21 mutableExtsPaths = lib.forEach mutExtsDrvs (e: {
22 origin = "${e}/share/vscode/extensions/${e.vscodeExtUniqueId}";
23 target = ''${vscodeExtsFolderName}/${e.vscodeExtUniqueId}-${
24 (lib.findSingle (
25 ext: "${ext.publisher}.${ext.name}" == e.vscodeExtUniqueId
26 ) "" "m" mutableExtensions).version
27 }'';
28 });
29
30 #removed not defined extensions
31 rmExtensions = lib.optionalString (nixExtensions ++ mutableExtensions != [ ]) ''
32 find ${vscodeExtsFolderName} -mindepth 1 -maxdepth 1 ${
33 lib.concatMapStringsSep " " (e: "! -iname ${e.publisher}.${e.name} ") nixExtensions
34 + lib.concatMapStringsSep " " (
35 e: "! -iname ${e.publisher}.${e.name}-${e.version} "
36 ) mutableExtensions
37 } -exec rm -rf {} \;
38 '';
39 #copy mutable extension out of the nix store
40 cpExtensions = ''
41 ${lib.concatMapStringsSep "\n" (
42 e: "ln -sfn ${e}/share/vscode/extensions/* ${vscodeExtsFolderName}/"
43 ) nixExtsDrvs}
44 ${lib.concatMapStringsSep "\n" (ePath: ''
45 if [ ! -d ${ePath.target} ]; then
46 cp -a ${ePath.origin} ${ePath.target}
47 chmod -R u+rwx ${ePath.target}
48 fi
49 '') mutableExtsPaths}
50 '';
51in
52writeShellScriptBin "code" ''
53 if ! [[ "$@" =~ "--list-extension" ]]; then
54 mkdir -p "${vscodeExtsFolderName}"
55 ${rmExtensions}
56 ${cpExtensions}
57 fi
58 ${vscode}/bin/code --extensions-dir "${vscodeExtsFolderName}" ${
59 lib.optionalString (user-data-dir != "") "--user-data-dir ${user-data-dir}"
60 } "$@"
61''