diff --git a/Nodejs/Product/ProjectWizard/NodejsPackageParametersExtension.cs b/Nodejs/Product/ProjectWizard/NodejsPackageParametersExtension.cs index a01f629ee..406411bbf 100644 --- a/Nodejs/Product/ProjectWizard/NodejsPackageParametersExtension.cs +++ b/Nodejs/Product/ProjectWizard/NodejsPackageParametersExtension.cs @@ -14,23 +14,17 @@ // //*********************************************************// +using System; using System.Collections.Generic; using System.Text.RegularExpressions; using EnvDTE; using Microsoft.VisualStudio.TemplateWizard; - + namespace Microsoft.NodejsTools.ProjectWizard { class NodejsPackageParametersExtension : IWizard { public void RunStarted(object automationObject, Dictionary replacementsDictionary, WizardRunKind runKind, object[] customParams) { var projectName = replacementsDictionary["$projectname$"]; - - // Remove all leading url-invalid, underscore, and period characters from the string - var npmProjectNameTransform = Regex.Replace(projectName, "^[^a-zA-Z0-9-~]*", string.Empty); - - // Replace all invalid characters with a dash - npmProjectNameTransform = Regex.Replace(npmProjectNameTransform, "[^a-zA-Z0-9-_~.]", "-"); - - replacementsDictionary.Add("$npmsafeprojectname$", npmProjectNameTransform); + replacementsDictionary.Add("$npmsafeprojectname$", NormalizeNpmPackageName(projectName)); } public void ProjectFinishedGenerating(EnvDTE.Project project) { @@ -51,6 +45,25 @@ public void BeforeOpeningFile(ProjectItem projectItem) { public void RunFinished() { return; + } + + private const int NpmPackageNameMaxLength = 214; + + /// + /// Normalize a project name to be a valid Npm package name: https://docs.npmjs.com/files/package.json#name + /// + /// Name of a VS project. + private static string NormalizeNpmPackageName(string projectName) { + // Remove all leading url-invalid, underscore, and period characters + var npmProjectNameTransform = Regex.Replace(projectName, "^[^a-zA-Z0-9-~]*", string.Empty); + + // Replace all invalid characters with a dash + npmProjectNameTransform = Regex.Replace(npmProjectNameTransform, "[^a-zA-Z0-9-_~.]", "-"); + + // Insert hyphens between camelcased sections. + npmProjectNameTransform = Regex.Replace(npmProjectNameTransform, "([a-z0-9])([A-Z])", "$1-$2").ToLowerInvariant(); + + return npmProjectNameTransform.Substring(0, Math.Min(npmProjectNameTransform.Length, NpmPackageNameMaxLength)); } } }