/// <summary>
        /// If a package name is added, then only packages matching one of the supplied names are removed.
        /// </summary>
        /// <param name="settings">The settings.</param>
        /// <param name="packageName">The package name to add.</param>
        /// <param name="scope">The package scope.</param>
        /// <returns>The <paramref name="settings"/> instance with the package added to <see cref="NpmPruneSettings.Packages"/>.</returns>
        public static NpmPruneSettings AddPackage(this NpmPruneSettings settings, string packageName, string scope)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }

            if (string.IsNullOrWhiteSpace(packageName))
            {
                throw new ArgumentNullException(nameof(packageName));
            }

            var resolvedPackageName = packageName;

            if (!string.IsNullOrWhiteSpace(scope))
            {
                if (!scope.StartsWith("@"))
                {
                    throw new ArgumentException("Scope should start with @", nameof(scope));
                }

                resolvedPackageName = $"{scope}/{resolvedPackageName}";
            }

            settings.Packages.Add(resolvedPackageName);
            return(settings);
        }
        /// <summary>
        /// If true, then no changes will actually be made.
        /// </summary>
        /// <param name="settings">The settings.</param>
        /// <param name="dryRun">Whether or not to make changes</param>
        /// <returns>The <paramref name="settings"/> instance with <see cref="NpmPruneSettings.DryRun"/> set to <paramref name="dryRun"/>.</returns>
        public static NpmPruneSettings DryRun(this NpmPruneSettings settings, bool dryRun)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }

            settings.DryRun = dryRun;
            return(settings);
        }
        /// <summary>
        /// Defines whether npm should remove modules listed in <c>devDependencies</c>.
        /// </summary>
        /// <param name="settings">The settings.</param>
        /// <param name="production">True to enable</param>
        /// <returns>The <paramref name="settings"/> instance with <see cref="NpmPruneSettings.Production"/> set to <paramref name="production"/>.</returns>
        public static NpmPruneSettings ForProduction(this NpmPruneSettings settings, bool production)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }

            settings.Production = production;
            return(settings);
        }
        /// <summary>
        /// If true, the changes npm prune made (or would have made with DryRun) are printed as a JSON object.
        /// </summary>
        /// <param name="settings">The settings.</param>
        /// <param name="json">Whether or not to print json.</param>
        /// <returns>The <paramref name="settings"/> instance with <see cref="NpmPruneSettings.Json"/> set to <paramref name="json"/>.</returns>
        public static NpmPruneSettings Json(this NpmPruneSettings settings, bool json)
        {
            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }

            settings.Json = json;
            return(settings);
        }
 /// <summary>
 /// Set so no changes will actually be made.
 /// </summary>
 /// <param name="settings">The settings.</param>
 /// <returns>The <paramref name="settings"/> instance with <see cref="NpmPruneSettings.DryRun"/> set to <c>true</c>.</returns>
 public static NpmPruneSettings DryRun(this NpmPruneSettings settings)
 {
     return(settings.DryRun(true));
 }
 /// <summary>
 /// If a package name is added, then only packages matching one of the supplied names are removed.
 /// </summary>
 /// <param name="settings">The settings.</param>
 /// <param name="packageName">The package name to add.</param>
 /// <returns>The <paramref name="settings"/> instance with the package added to <see cref="NpmPruneSettings.Packages"/>.</returns>
 public static NpmPruneSettings AddPackage(this NpmPruneSettings settings, string packageName)
 {
     return(settings.AddPackage(packageName, null));
 }
 /// <summary>
 /// Defines that npm should remove modules listed in <c>devDependencies</c>.
 /// </summary>
 /// <param name="settings">The settings.</param>
 /// <returns>The <paramref name="settings"/> instance with <see cref="NpmPruneSettings.Production"/> set to <c>true</c>.</returns>
 public static NpmPruneSettings ForProduction(this NpmPruneSettings settings)
 {
     return(settings.ForProduction(true));
 }
 /// <summary>
 /// The changes npm prune made (or would have made with DryRun) are printed as a JSON object.
 /// </summary>
 /// <param name="settings">The settings.</param>
 /// <returns>The <paramref name="settings"/> instance with <see cref="NpmPruneSettings.Json"/> set to <c>true</c>.</returns>
 public static NpmPruneSettings Json(this NpmPruneSettings settings)
 {
     return(settings.Json(true));
 }