├── art └── progress.png ├── src ├── Resources │ ├── Icon.png │ └── Preview.png ├── source.extension.ico ├── Properties │ └── AssemblyInfo.cs ├── source.extension.cs ├── Installer │ ├── GalleryEntry.cs │ ├── InstallerProgress.xaml │ └── InstallerProgress.xaml.cs ├── VSCommandTable.cs ├── Controls │ ├── ExtensionItem.xaml.cs │ └── ExtensionItem.xaml ├── VSCommandTable.vsct ├── source.extension.vsixmanifest ├── DataStore.cs ├── Helpers │ └── Logger.cs ├── ExtensionList.cs ├── packages.config ├── Commands │ └── ResetExtensions.cs ├── VSPackage.cs ├── source.extension.resx └── WebExtensionPack.csproj ├── lib └── Microsoft.VisualStudio.ExtensionManager.dll ├── .gitignore ├── .gitattributes ├── LICENSE ├── .github ├── ISSUE_TEMPLATE.md └── CONTRIBUTING.md ├── appveyor.yml ├── CHANGELOG.md ├── WebExtensionPack.sln └── README.md /art/progress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madskristensen/WebExtensionPack/HEAD/art/progress.png -------------------------------------------------------------------------------- /src/Resources/Icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madskristensen/WebExtensionPack/HEAD/src/Resources/Icon.png -------------------------------------------------------------------------------- /src/Resources/Preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madskristensen/WebExtensionPack/HEAD/src/Resources/Preview.png -------------------------------------------------------------------------------- /src/source.extension.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madskristensen/WebExtensionPack/HEAD/src/source.extension.ico -------------------------------------------------------------------------------- /lib/Microsoft.VisualStudio.ExtensionManager.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/madskristensen/WebExtensionPack/HEAD/lib/Microsoft.VisualStudio.ExtensionManager.dll -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | packages 2 | node_modules.7z 3 | template-report.xml 4 | 5 | # User files 6 | *.suo 7 | *.user 8 | *.sln.docstates 9 | .vs/ 10 | 11 | # Build results 12 | 13 | [Dd]ebug/ 14 | [Rr]elease/ 15 | x64/ 16 | [Bb]in/ 17 | [Oo]bj/ 18 | 19 | # MSTest test Results 20 | [Tt]est[Rr]esult*/ 21 | [Bb]uild[Ll]og.* 22 | 23 | # NCrunch 24 | *.ncrunchsolution 25 | *.ncrunchproject 26 | _NCrunch_WebCompiler -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright 2015 Mads Kristensen 2 | 3 | Licensed under the Apache License, Version 2.0 (the "License"); 4 | you may not use this file except in compliance with the License. 5 | You may obtain a copy of the License at 6 | 7 | http://www.apache.org/licenses/LICENSE-2.0 8 | 9 | Unless required by applicable law or agreed to in writing, software 10 | distributed under the License is distributed on an "AS IS" BASIS, 11 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 | See the License for the specific language governing permissions and 13 | limitations under the License. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Suggest an extension: 2 | Add the name and a link to the VS Gallery download page. 3 | 4 | 5 | ...or report a bug: 6 | 7 | ### Installed product versions 8 | - Visual Studio: [example 2015 Professional] 9 | - This extension: [example 1.1.21] 10 | 11 | ### Description 12 | Replace this text with a short description 13 | 14 | ### Steps to recreate 15 | 1. Replace this 16 | 2. text with 17 | 3. the steps 18 | 4. to recreate 19 | 20 | ### Current behavior 21 | Explain what it's doing and why it's wrong 22 | 23 | ### Expected behavior 24 | Explain what it should be doing after it's fixed. -------------------------------------------------------------------------------- /src/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | using WebExtensionPack; 4 | 5 | [assembly: AssemblyTitle(Vsix.Name)] 6 | [assembly: AssemblyDescription(Vsix.Description)] 7 | [assembly: AssemblyConfiguration("")] 8 | [assembly: AssemblyCompany(Vsix.Author)] 9 | [assembly: AssemblyProduct(Vsix.Name)] 10 | [assembly: AssemblyCopyright(Vsix.Author)] 11 | [assembly: AssemblyTrademark("")] 12 | [assembly: AssemblyCulture("")] 13 | 14 | [assembly: ComVisible(false)] 15 | 16 | [assembly: AssemblyVersion(Vsix.Version)] 17 | [assembly: AssemblyFileVersion(Vsix.Version)] 18 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | image: Visual Studio 2015 2 | 3 | install: 4 | - ps: (new-object Net.WebClient).DownloadString("https://raw.github.com/madskristensen/ExtensionScripts/master/AppVeyor/vsix.ps1") | iex 5 | 6 | before_build: 7 | - ps: Vsix-IncrementVsixVersion | Vsix-UpdateBuildVersion 8 | - ps: Vsix-TokenReplacement src\source.extension.cs 'Version = "([0-9\\.]+)"' 'Version = "{version}"' 9 | 10 | build_script: 11 | - nuget restore -Verbosity quiet 12 | - msbuild /p:configuration=Release /p:DeployExtension=false /p:ZipPackageCompressionLevel=normal /v:m 13 | 14 | after_test: 15 | - ps: Vsix-PushArtifacts | Vsix-PublishToGallery 16 | 17 | before_deploy: 18 | - ps: Vsix-CreateChocolatyPackage -packageId webextensionpack 19 | 20 | deploy: 21 | - provider: Environment 22 | name: Chocolatey 23 | on: 24 | branch: master 25 | appveyor_repo_commit_message_extended: /\[release\]/ -------------------------------------------------------------------------------- /src/source.extension.cs: -------------------------------------------------------------------------------- 1 | // ------------------------------------------------------------------------------ 2 | // 3 | // This file was generated by Extensibility Tools v1.10.188 4 | // 5 | // ------------------------------------------------------------------------------ 6 | namespace WebExtensionPack 7 | { 8 | static class Vsix 9 | { 10 | public const string Id = "92e3e73b-510f-45bb-8aee-c637e83778b3"; 11 | public const string Name = "Web Extension Pack 2015"; 12 | public const string Description = @"The easiest way to set up Visual Studio for the ultimate web development experience."; 13 | public const string Language = "en-US"; 14 | public const string Version = "1.9"; 15 | public const string Author = "Mads Kristensen"; 16 | public const string Tags = "extensions, vsix, install"; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/Installer/GalleryEntry.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Microsoft.VisualStudio.ExtensionManager; 3 | 4 | namespace WebExtensionPack 5 | { 6 | public class GalleryEntry : IRepositoryEntry 7 | { 8 | private Version _nonNullVsixVersion; 9 | 10 | public string VsixID { get; set; } 11 | public string DownloadUrl { get; set; } 12 | public string DownloadUpdateUrl { get; set; } 13 | public string VsixReferences { get; set; } 14 | public string VsixVersion { get; set; } 15 | public string Name { get; set; } 16 | public int Ranking { get; set; } 17 | 18 | public Version NonNullVsixVersion 19 | { 20 | get 21 | { 22 | if (_nonNullVsixVersion == null) 23 | { 24 | if (!Version.TryParse(VsixVersion, out _nonNullVsixVersion)) 25 | { 26 | _nonNullVsixVersion = new Version(); 27 | } 28 | } 29 | 30 | return _nonNullVsixVersion; 31 | } 32 | } 33 | 34 | public override string ToString() 35 | { 36 | return Name; 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /src/VSCommandTable.cs: -------------------------------------------------------------------------------- 1 | // ------------------------------------------------------------------------------ 2 | // 3 | // This file was generated by Extensibility Tools v1.9.176 4 | // 5 | // ------------------------------------------------------------------------------ 6 | namespace WebExtensionPack 7 | { 8 | using System; 9 | 10 | /// 11 | /// Helper class that exposes all GUIDs used across VS Package. 12 | /// 13 | internal sealed partial class PackageGuids 14 | { 15 | public const string guidVSPackageString = "92e3e73b-510f-45bb-8aee-c637e83778b3"; 16 | public const string guidVSPackageCmdSetString = "341f258c-125f-4997-81f0-812fbfb6577a"; 17 | public static Guid guidVSPackage = new Guid(guidVSPackageString); 18 | public static Guid guidVSPackageCmdSet = new Guid(guidVSPackageCmdSetString); 19 | } 20 | /// 21 | /// Helper class that encapsulates all CommandIDs uses across VS Package. 22 | /// 23 | internal sealed partial class PackageIds 24 | { 25 | public const int MyMenuGroup = 0x1020; 26 | public const int ResetExtensions = 0x0100; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/Controls/ExtensionItem.xaml.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | using System.Windows; 7 | using System.Windows.Controls; 8 | using System.Windows.Data; 9 | using System.Windows.Documents; 10 | using System.Windows.Input; 11 | using System.Windows.Media; 12 | using System.Windows.Media.Imaging; 13 | using System.Windows.Navigation; 14 | using System.Windows.Shapes; 15 | 16 | namespace WebExtensionPack.Controls 17 | { 18 | /// 19 | /// Interaction logic for ExtensionItem.xaml 20 | /// 21 | public partial class ExtensionItem : UserControl 22 | { 23 | public string ExtensionGuid { get; } 24 | 25 | public ExtensionItem(string extensionGuid, string extensionName) 26 | { 27 | InitializeComponent(); 28 | 29 | this.ExtensionGuid = extensionGuid; 30 | this.ExtensionName.Text = extensionName; 31 | } 32 | 33 | public void StartDownloading() 34 | { 35 | GridTick.Visibility = Visibility.Collapsed; 36 | GridPending.Visibility = Visibility.Collapsed; 37 | GridLoading.Visibility = Visibility.Visible; 38 | } 39 | 40 | public void SetAsComplete() 41 | { 42 | GridPending.Visibility = Visibility.Collapsed; 43 | GridLoading.Visibility = Visibility.Collapsed; 44 | GridTick.Visibility = Visibility.Visible; 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/VSCommandTable.vsct: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /src/source.extension.vsixmanifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Web Extension Pack 2015 6 | The easiest way to set up Visual Studio for the ultimate web development experience. 7 | https://visualstudiogallery.msdn.microsoft.com/f3b504c6-0095-42f1-a989-51d5fc2a8459 8 | Resources\LICENSE 9 | https://github.com/madskristensen/WebExtensionPack/blob/master/CHANGELOG.md 10 | Resources\Icon.png 11 | Resources\Preview.png 12 | extensions, vsix, install 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/DataStore.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.IO; 4 | using System.Linq; 5 | 6 | namespace WebExtensionPack 7 | { 8 | public class DataStore 9 | { 10 | private static string _configFile; 11 | 12 | public DataStore() 13 | { 14 | _configFile = Environment.ExpandEnvironmentVariables("%userprofile%\\.webextensionpack"); 15 | Initialize(); 16 | } 17 | 18 | public List PreviouslyInstalledExtensions { get; private set; } = new List(); 19 | 20 | public bool HasBeenInstalled(string productId) 21 | { 22 | return PreviouslyInstalledExtensions.Contains(productId); 23 | } 24 | 25 | public void Save() 26 | { 27 | File.WriteAllLines(_configFile, PreviouslyInstalledExtensions); 28 | } 29 | 30 | public bool Reset() 31 | { 32 | try 33 | { 34 | File.Delete(_configFile); 35 | return true; 36 | } 37 | catch (Exception ex) 38 | { 39 | Logger.Log(ex); 40 | return false; 41 | } 42 | } 43 | 44 | private void Initialize() 45 | { 46 | try 47 | { 48 | if (File.Exists(_configFile)) 49 | PreviouslyInstalledExtensions = File.ReadAllLines(_configFile).Where(l => !string.IsNullOrWhiteSpace(l)).ToList(); 50 | } 51 | catch (Exception ex) 52 | { 53 | Logger.Log(ex); 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Road map 2 | 3 | - [ ] Nothing yet... 4 | 5 | Features that have a checkmark are complete and available for 6 | download in the 7 | [nightly build](http://vsixgallery.com/extension/92e3e73b-510f-45bb-8aee-c637e83778b3/). 8 | 9 | # Change log 10 | 11 | These are the changes to each version that has been released 12 | on the official Visual Studio extension gallery. 13 | 14 | ## 1.9 15 | 16 | - [x] Added [Package Security Alerts](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.PackageSecurityAlerts) extension 17 | 18 | ## 1.7 19 | 20 | - [x] Added [Syntax Highlighting Pack](https://visualstudiogallery.msdn.microsoft.com/d92fd742-bab3-4314-b866-50b871d679ee) extension 21 | 22 | ## 1.6 23 | 24 | - [x] Added [File Icons](https://visualstudiogallery.msdn.microsoft.com/5e1762e8-a88b-417c-8467-6a65d771cc4e) extension 25 | 26 | ## 1.5 27 | 28 | - [x] Don't re-install extensions that have been uninstalled 29 | - [x] Button to reset installed extensions 30 | 31 | ## 1.4 32 | 33 | - [x] Added [Image Sprites](https://visualstudiogallery.msdn.microsoft.com/8bb845e9-5717-4eae-aed3-1fdf6fe5819a) extension 34 | 35 | ## 1.3 36 | 37 | - [x] Added [Web Accessibility Checker](https://visualstudiogallery.msdn.microsoft.com/3aabefab-1681-4fea-8f95-6a62e2f0f1ec) extension 38 | - [x] Added list of installed extensions to restart prompt 39 | 40 | ## 1.2 41 | 42 | - [x] Updated install progress dialog 43 | - [x] Added [Suggested Extensions](https://visualstudiogallery.msdn.microsoft.com/3be88243-8bf1-407a-a7ca-a968d0de2d59) extension 44 | - [x] Added [Add New File](http://visualstudiogallery.msdn.microsoft.com/3f820e99-6c0d-41db-aa74-a18d9623b1f3) extension -------------------------------------------------------------------------------- /src/Helpers/Logger.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics.CodeAnalysis; 3 | using Microsoft.VisualStudio.Shell.Interop; 4 | 5 | public static class Logger 6 | { 7 | private static IVsOutputWindowPane pane; 8 | private static object _syncRoot = new object(); 9 | private static IServiceProvider _provider; 10 | private static string _name; 11 | 12 | public static void Initialize(IServiceProvider provider, string name) 13 | { 14 | _provider = provider; 15 | _name = name; 16 | } 17 | 18 | [SuppressMessage("Microsoft.Usage", "CA1806:DoNotIgnoreMethodResults", MessageId = "Microsoft.VisualStudio.Shell.Interop.IVsOutputWindowPane.OutputString(System.String)")] 19 | public static void Log(string message) 20 | { 21 | if (string.IsNullOrEmpty(message)) 22 | return; 23 | 24 | try 25 | { 26 | if (EnsurePane()) 27 | { 28 | pane.OutputString(DateTime.Now.ToString() + ": " + message + Environment.NewLine); 29 | } 30 | } 31 | catch 32 | { 33 | // Do nothing 34 | } 35 | } 36 | 37 | public static void Log(Exception ex) 38 | { 39 | if (ex != null) 40 | { 41 | Log(ex.ToString()); 42 | } 43 | } 44 | 45 | private static bool EnsurePane() 46 | { 47 | if (pane == null) 48 | { 49 | Guid guid = Guid.NewGuid(); 50 | IVsOutputWindow output = (IVsOutputWindow)_provider.GetService(typeof(SVsOutputWindow)); 51 | output.CreatePane(ref guid, _name, 1, 1); 52 | output.GetPane(ref guid, out pane); 53 | } 54 | 55 | return pane != null; 56 | } 57 | } -------------------------------------------------------------------------------- /src/Installer/InstallerProgress.xaml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |