Private/Edit-PackageJsonFile.ps1

<#
.SYNOPSIS
Updates a 'package.json' files in a directory using the in the specified [Manifest] object.
 
.PARAMETER $Manifest
The [Manifest] object.
 
.PARAMETER Path
The project directory.
#>


function Edit-PackageJsonFile
{
    Param(
        [Parameter(Mandatory, ValueFromPipeline)]
        $Manifest,

        [string]$Path
    )

    $modifiedFiles = [System.Collections.ArrayList]::new();
    foreach ($file in (Get-ChildItem $Path -Recurse -Filter "package.json" | Where-Object { $_.FullName -inotmatch '(bin|obj|node_modules)[\\/]?' } | Select-Object -ExpandProperty FullName))
    {
        if ($PSCmdlet.ShouldProcess($file))
        {
            $package = Get-Content $file | Out-String | ConvertFrom-Json;
            foreach ($field in @{
                "name"=$Manifest.Name;
                "author"=$Manifest.Author;
                "homepage"=$Manifest.Website;
                "description"=$Manifest.Description;
                "keywords"=$Manifest.Tags.Split(' ');
                "repository"=$Manifest.RepositoryUrl;
                "version"=($Manifest | Convert-NcrementVersionNumberToString);
            }.GetEnumerator())
            {
                if (-not [string]::IsNullOrEmpty($field.Value))
                {
                    if ($package.PSObject.Properties.Match($field.Name).Count -eq 0)
                    {
                        if ($field.Name -eq "repository")
                        {
                            $field.Value = @{"type"="git";"url"=$field.Value;};
                        }

                        $package | Add-Member -MemberType NoteProperty -Name $field.Name -Value $field.Value;
                    }
                    elseif ($field.Name -eq "repository")
                    {
                        $package.repository.url = $field.Value;
                    }
                    else
                    {
                        $package."$($field.Name)" = $field.Value;
                    }
                }
            }

            $package | ConvertTo-Json | Out-File $file -Encoding utf8;
            $modifiedFiles.Add($file) | Out-Null;
        }
    }

    return $modifiedFiles;
}