1{ stdenv, lib, fetchurl, runCommand, vscode, unzip }:
2
3let
4 extendedPkgVersion = lib.getVersion vscode;
5 extendedPkgName = lib.removeSuffix "-${extendedPkgVersion}" vscode.name;
6
7 mktplcExtRefToFetchArgs = ext: {
8 url = "https://${ext.publisher}.gallery.vsassets.io/_apis/public/gallery/publisher/${ext.publisher}/extension/${ext.name}/${ext.version}/assetbyname/Microsoft.VisualStudio.Services.VSIXPackage";
9 sha256 = ext.sha256;
10 # The `*.vsix` file is in the end a simple zip file. Change the extension
11 # so that existing `unzip` hooks takes care of the unpacking.
12 name = "${ext.publisher}-${ext.name}.zip";
13 };
14
15 buildVscodeExtension = a@{
16 name,
17 namePrefix ? "${extendedPkgName}-extension-",
18 src,
19 # Same as "Unique Identifier" on the extension's web page.
20 # For the moment, only serve as unique extension dir.
21 vscodeExtUniqueId,
22 configurePhase ? ":",
23 buildPhase ? ":",
24 dontPatchELF ? true,
25 dontStrip ? true,
26 buildInputs ? [],
27 ...
28 }:
29 stdenv.mkDerivation ((removeAttrs a [ "vscodeExtUniqueId" ]) // {
30
31 name = namePrefix + name;
32
33 inherit vscodeExtUniqueId;
34 inherit configurePhase buildPhase dontPatchELF dontStrip;
35
36 buildInputs = [ unzip ] ++ buildInputs;
37
38 installPhase = ''
39 mkdir -p "$out/share/${extendedPkgName}/extensions/${vscodeExtUniqueId}"
40 find . -mindepth 1 -maxdepth 1 | xargs mv -t "$out/share/${extendedPkgName}/extensions/${vscodeExtUniqueId}/"
41 '';
42
43 });
44
45
46 fetchVsixFromVscodeMarketplace = mktplcExtRef:
47 fetchurl((mktplcExtRefToFetchArgs mktplcExtRef));
48
49 buildVscodeMarketplaceExtension = a@{
50 name ? "",
51 src ? null,
52 mktplcRef,
53 ...
54 }: assert "" == name; assert null == src;
55 buildVscodeExtension ((removeAttrs a [ "mktplcRef" ]) // {
56 name = "${mktplcRef.publisher}-${mktplcRef.name}-${mktplcRef.version}";
57 src = fetchVsixFromVscodeMarketplace mktplcRef;
58 vscodeExtUniqueId = "${mktplcRef.publisher}.${mktplcRef.name}";
59 });
60
61 mktplcRefAttrList = [
62 "name"
63 "publisher"
64 "version"
65 "sha256"
66 ];
67
68 mktplcExtRefToExtDrv = ext:
69 buildVscodeMarketplaceExtension ((removeAttrs ext mktplcRefAttrList) // {
70 mktplcRef = ext;
71 });
72
73 extensionsFromVscodeMarketplace = mktplcExtRefList:
74 builtins.map mktplcExtRefToExtDrv mktplcExtRefList;
75
76in
77
78{
79 inherit fetchVsixFromVscodeMarketplace buildVscodeExtension
80 buildVscodeMarketplaceExtension extensionsFromVscodeMarketplace;
81}