at 17.09-beta 81 lines 2.5 kB view raw
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}