diff --git a/.vsts-pr.yml b/.vsts-pr.yml index 2478c07d6590..488515512434 100644 --- a/.vsts-pr.yml +++ b/.vsts-pr.yml @@ -38,7 +38,7 @@ resources: - container: ubuntu2204DebPkg image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-22.04-debpkg -stages: +# stages: TODO REVERT SO THAT THIS PIPEPLINE WORKS AGAIN ############### BUILD STAGE ############### - stage: build displayName: Build diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 8f262df5193d..b46351ba8f3c 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -1,5 +1,6 @@ + https://github.com/dotnet/templating diff --git a/eng/pipelines/templates/jobs/vmr-build.yml b/eng/pipelines/templates/jobs/vmr-build.yml index cc4d1073cde8..45c8a09004bd 100644 --- a/eng/pipelines/templates/jobs/vmr-build.yml +++ b/eng/pipelines/templates/jobs/vmr-build.yml @@ -352,6 +352,7 @@ jobs: vmrPath: $(vmrPath) vmrBranch: ${{ parameters.vmrBranch }} targetRef: $(Build.SourceVersion) # Synchronize the current sdk commit + additionalSyncs: [ 'NuGet.Protocol' ] # Also synchronize nuget-client. More information: https://github.com/dotnet/arcade-services/issues/4618 - ${{ if parameters.buildFromArchive }}: - script: | diff --git a/eng/pipelines/templates/steps/vmr-pull-updates.yml b/eng/pipelines/templates/steps/vmr-pull-updates.yml index 3a59083f087f..ef6b2ff60487 100644 --- a/eng/pipelines/templates/steps/vmr-pull-updates.yml +++ b/eng/pipelines/templates/steps/vmr-pull-updates.yml @@ -17,6 +17,11 @@ parameters: type: string default: $(Agent.BuildDirectory)/vmr +- name: additionalSyncs + displayName: Optional list of package names whose repo's source will also be synchronized in the local VMR, e.g. NuGet.Protocol + type: object + default: [] + steps: - checkout: self displayName: Clone dotnet/sdk @@ -43,23 +48,19 @@ steps: workingDirectory: ${{ parameters.vmrPath }} - script: | - ./eng/vmr-sync.sh \ - --vmr ${{ parameters.vmrPath }} \ - --tmp $(Agent.TempDirectory) \ - --azdev-pat '$(dn-bot-all-orgs-code-r)' \ - --branch ${{ parameters.vmrBranch }} \ - --repository "sdk:${{ parameters.targetRef }}" \ - --recursive \ - --remote "sdk:$(Agent.BuildDirectory)/sdk" \ - --tpn-template $(Agent.BuildDirectory)/sdk/src/VirtualMonoRepo/THIRD-PARTY-NOTICES.template.txt \ - --ci \ + ./eng/vmr-sync.sh \ + --vmr ${{ parameters.vmrPath }} \ + --tmp $(Agent.TempDirectory) \ + --azdev-pat '$(dn-bot-all-orgs-code-r)' \ + --branch ${{ parameters.vmrBranch }} \ + --ci \ --debug if [ "$?" -ne 0 ]; then echo "##vso[task.logissue type=error]Failed to synchronize the VMR" exit 1 fi - displayName: Synchronize dotnet/dotnet (Unix) + displayName: Sync sdk into VMR (Unix) condition: ne(variables['Agent.OS'], 'Windows_NT') workingDirectory: $(Agent.BuildDirectory)/sdk @@ -70,22 +71,19 @@ steps: condition: eq(variables['Agent.OS'], 'Windows_NT') - powershell: | - ./eng/vmr-sync.ps1 ` - -vmr ${{ parameters.vmrPath }} ` - -tmp $(Agent.TempDirectory) ` + ./eng/vmr-sync.ps1 ` + -vmr ${{ parameters.vmrPath }} ` + -tmp $(Agent.TempDirectory) ` -azdevPat '$(dn-bot-all-orgs-code-r)' ` - -branch ${{ parameters.vmrBranch }} ` - -repository "sdk:${{ parameters.targetRef }}" ` - -recursive ` - -tpnTemplate $(Agent.BuildDirectory)/sdk/src/VirtualMonoRepo/THIRD-PARTY-NOTICES.template.txt ` - -ci ` + -branch ${{ parameters.vmrBranch }} ` + -ci ` -debugOutput if ($LASTEXITCODE -ne 0) { echo "##vso[task.logissue type=error]Failed to synchronize the VMR" exit 1 } - displayName: Synchronize dotnet/dotnet (Windows) + displayName: Sync sdk into VMR (Windows) condition: eq(variables['Agent.OS'], 'Windows_NT') workingDirectory: $(Agent.BuildDirectory)/sdk @@ -102,3 +100,94 @@ steps: artifact: $(System.JobDisplayName)_FailedPatches displayName: Upload failed patches condition: failed() + +- ${{ each assetName in parameters.additionalSyncs }}: + # The vmr-sync script ends up staging files in the local VMR so we have to commit those + - script: + git commit --allow-empty -am "Forward-flow dotnet/sdk" + displayName: Commit local VMR changes + workingDirectory: ${{ parameters.vmrPath }} + + - script: | + set -ex + + echo "Searching for details of asset ${{ assetName }}..." + + # Use darc to get dependencies information + dependencies=$(./.dotnet/dotnet darc get-dependencies --name '${{ assetName }}' --ci) + + # Extract repository URL and commit hash + repository=$(echo "$dependencies" | grep 'Repo:' | sed 's/Repo:[[:space:]]*//' | head -1) + + if [ -z "$repository" ]; then + echo "##vso[task.logissue type=error]Asset ${{ assetName }} not found in the dependency list" + exit 1 + fi + + commit=$(echo "$dependencies" | grep 'Commit:' | sed 's/Commit:[[:space:]]*//' | head -1) + + echo "Updating the VMR from $repository / $commit..." + cd .. + git clone $repository ${{ assetName }} + cd ${{ assetName }} + git checkout $commit + git branch "sync/$commit" + + $(Agent.BuildDirectory)/sdk/eng/vmr-sync.sh \ + --vmr ${{ parameters.vmrPath }} \ + --tmp $(Agent.TempDirectory) \ + --azdev-pat '$(dn-bot-all-orgs-code-r)' \ + --branch ${{ parameters.vmrBranch }} \ + --ci \ + --debug + + if [ "$?" -ne 0 ]; then + echo "##vso[task.logissue type=error]Failed to synchronize the VMR" + exit 1 + fi + displayName: Sync ${{ assetName }} into (Unix) + condition: ne(variables['Agent.OS'], 'Windows_NT') + workingDirectory: $(Agent.BuildDirectory)/sdk + + - powershell: | + $ErrorActionPreference = 'Stop' + + Write-Host "Searching for details of asset ${{ assetName }}..." + + $dependencies = .\.dotnet\dotnet darc get-dependencies --name '${{ assetName }}' --ci + + $repository = $dependencies | Select-String -Pattern 'Repo:\s+([^\s]+)' | Select-Object -First 1 + $repository -match 'Repo:\s+([^\s]+)' | Out-Null + $repository = $matches[1] + + if ($repository -eq $null) { + Write-Error "Asset ${{ assetName }} not found in the dependency list" + exit 1 + } + + $commit = $dependencies | Select-String -Pattern 'Commit:\s+([^\s]+)' | Select-Object -First 1 + $commit -match 'Commit:\s+([^\s]+)' | Out-Null + $commit = $matches[1] + + Write-Host "Updating the VMR from $repository / $commit..." + cd .. + git clone $repository ${{ assetName }} + cd ${{ assetName }} + git checkout $commit + git branch "sync/$commit" + + $(Agent.BuildDirectory)\sdk\eng\vmr-sync.ps1 ` + -vmr ${{ parameters.vmrPath }} ` + -tmp $(Agent.TempDirectory) ` + -azdevPat '$(dn-bot-all-orgs-code-r)' ` + -branch ${{ parameters.vmrBranch }} ` + -ci ` + -debugOutput + + if ($LASTEXITCODE -ne 0) { + echo "##vso[task.logissue type=error]Failed to synchronize the VMR" + exit 1 + } + displayName: Sync ${{ assetName }} into (Windows) + condition: eq(variables['Agent.OS'], 'Windows_NT') + workingDirectory: $(Agent.BuildDirectory)/sdk diff --git a/eng/pipelines/vmr-build-pr.yml b/eng/pipelines/vmr-build-pr.yml index 9abe336f5371..856bcf352c3a 100644 --- a/eng/pipelines/vmr-build-pr.yml +++ b/eng/pipelines/vmr-build-pr.yml @@ -68,17 +68,18 @@ resources: stages: # You can temporarily disable the VMR Build stage by setting the disableBuild variable - ${{ if not(parameters.disableBuild) }}: - - template: templates/stages/vmr-build.yml - parameters: - vmrBranch: ${{ variables.VmrBranch }} - isBuiltFromVmr: false - isSourceOnlyBuild: ${{ variables.isSourceOnlyBuild }} - ${{ if contains(variables['Build.DefinitionName'], '-full') }}: - scope: full - ${{ elseif eq(variables.isSourceOnlyBuild, 'true') }}: - scope: ultralite - ${{ else }}: - scope: lite + - ${{ if ne(variables.isSourceOnlyBuild, 'true') }}: + - template: templates/stages/vmr-build.yml + parameters: + vmrBranch: ${{ variables.VmrBranch }} + isBuiltFromVmr: false + isSourceOnlyBuild: ${{ variables.isSourceOnlyBuild }} + ${{ if contains(variables['Build.DefinitionName'], '-full') }}: + scope: full + ${{ elseif eq(variables.isSourceOnlyBuild, 'true') }}: + scope: ultralite + ${{ else }}: + scope: lite # In case the VMR Build stage is temporarily disabled, the VMR synchronization step is run to validate # that the PR can be merged and later synchronized into the VMR without problems. diff --git a/eng/vmr-sync.ps1 b/eng/vmr-sync.ps1 index a0e24f80f7ef..8c3c91ce8ded 100644 --- a/eng/vmr-sync.ps1 +++ b/eng/vmr-sync.ps1 @@ -1,57 +1,26 @@ <# .SYNOPSIS -This script is used for synchronizing the dotnet/dotnet VMR locally. This means pulling new -code from various repositories into the 'dotnet/dotnet' repository. +This script is used for synchronizing the current repository into a local VMR. +It pulls the current repository's code into the specified VMR directory for local testing or +Source-Build validation. .DESCRIPTION -The script is used during CI to ingest new code based on dotnet/sdk but it can also help -for reproducing potential failures during sdk's PRs, namely to fix the Source-Build. -Another usecase is to try manually synchronizing a given commit of some repo into the VMR and -trying to Source-Build the VMR. This can help when fixing the Source-Build but using a commit -from a not-yet merged branch (or fork) to test the fix will help. - -The tooling that synchronizes the VMR will need to clone the various repositories into a temporary -folder. These clones can be re-used in future synchronizations so it is advised you dedicate a -folder to this to speed up your re-runs. +The tooling used for synchronization will clone the VMR repository into a temporary folder if +it does not already exist. These clones can be reused in future synchronizations, so it is +recommended to dedicate a folder for this to speed up re-runs. .EXAMPLE - Synchronize current sdk and all dependencies into a local VMR: + Synchronize current repository into a local VMR: ./vmr-sync.ps1 -vmrDir "$HOME/repos/dotnet" -tmpDir "$HOME/repos/tmp" - Synchronize the VMR to a specific commit of dotnet/runtime using custom fork: - ./vmr-sync.ps1 ` - -repository runtime:e7e71da303af8dc97df99b098f21f526398c3943 ` - -remote runtime:https://github.com/yourfork/runtime ` - -tmpDir "$HOME/repos/tmp" - .PARAMETER tmpDir Required. Path to the temporary folder where repositories will be cloned .PARAMETER vmrBranch Optional. Branch of the 'dotnet/dotnet' repo to synchronize. The VMR will be checked out to this branch -.PARAMETER recursive -Optional. Recursively synchronize all the source build dependencies (declared in Version.Details.xml) -This is used when performing the full synchronization during sdk's CI and the final VMR sync. -Defaults to false unless no repository is supplied in which case a recursive sync of sdk is performed. - -.PARAMETER remote -Optional. Additional remote to use during the synchronization -This can be used to synchronize to a commit from a fork of the repository -Example: 'runtime:https://github.com/yourfork/runtime' - -.PARAMETER repository -Optional. Repository + git ref separated by colon to synchronize to. -This can be a specific commit, branch, tag. -If not supplied, the revision of the parent sdk repository of this script will be used (recursively). -Example: 'runtime:my-branch-name' - -.PARAMETER tpnTemplate -Optional. Template for the header of VMRs THIRD-PARTY-NOTICES file. -Defaults to src/VirtualMonoRepo/THIRD-PARTY-NOTICES.template.txt - .PARAMETER azdevPat Optional. Azure DevOps PAT to use for cloning private repositories. @@ -68,18 +37,13 @@ param ( [Parameter(Mandatory=$true, HelpMessage="Path to the temporary folder where repositories will be cloned")] [string][Alias('t', 'tmp')]$tmpDir, [string][Alias('b', 'branch')]$vmrBranch, - [switch]$recursive, [string]$remote, - [string][Alias('r')]$repository, - [string]$tpnTemplate = "src/VirtualMonoRepo/THIRD-PARTY-NOTICES.template.txt", [string]$azdevPat, [string][Alias('v', 'vmr')]$vmrDir, [switch]$ci, [switch]$debugOutput ) -$scriptRoot = $PSScriptRoot - function Fail { Write-Host "> $($args[0])" -ForegroundColor 'Red' } @@ -88,46 +52,19 @@ function Highlight { Write-Host "> $($args[0])" -ForegroundColor 'Cyan' } -$sdkDir = (Split-Path -Parent $scriptRoot) - -# If sdk is a repo, we're in an sdk and not in the dotnet/dotnet repo -if (Test-Path -Path "$sdkDir/.git" -PathType Container) { - $additionalRemotes = "sdk:$sdkDir" -} - -if ($remote) { - $additionalRemotes = "$additionalRemotes $remote" -} - $verbosity = 'verbose' if ($debugOutput) { $verbosity = 'debug' } # Validation -if (-not (Test-Path -Path $sdkDir -PathType Container)) { - Fail "Directory '$sdkDir' does not exist. Please specify the path to the dotnet/sdk repo" - exit 1 -} - if (-not $tmpDir) { Fail "Missing -tmpDir argument. Please specify the path to the temporary folder where the repositories will be cloned" exit 1 } -if (-not (Test-Path -Path $tpnTemplate -PathType Leaf)) { - Fail "File '$tpnTemplate' does not exist. Please specify a valid path to the THIRD-PARTY-NOTICES template" - exit 1 -} - # Sanitize the input -# Default when no repository is provided -if (-not $repository) { - $repository = "sdk:$(git -C $sdkDir rev-parse HEAD)" - $recursive = $true -} - if (-not $vmrDir) { $vmrDir = Join-Path $tmpDir 'dotnet' } @@ -164,37 +101,25 @@ Set-StrictMode -Version Latest # Prepare darc Highlight 'Installing .NET, preparing the tooling..' -. $scriptRoot\common\tools.ps1 +. .\eng\common\tools.ps1 $dotnetRoot = InitializeDotNetCli -install:$true $dotnet = "$dotnetRoot\dotnet.exe" & "$dotnet" tool restore -Highlight "Starting the synchronization of '$repository'.." +Highlight "Starting the synchronization of VMR.." # Synchronize the VMR $darcArgs = ( - "darc", "vmr", "update", - "--vmr", $vmrDir, - "--tmp", $tmpDir, - "--$verbosity", - "--tpn-template", $tpnTemplate, - "--discard-patches", - "--generate-credscansuppressions", - $repository + "darc", "vmr", "forwardflow", + "--tmp", $tmpDir, + "--$verbosity", + $vmrDir ) -if ($recursive) { - $darcArgs += ("--recursive") -} - if ($ci) { $darcArgs += ("--ci") } -if ($additionalRemotes) { - $darcArgs += ("--additional-remotes", $additionalRemotes) -} - if ($azdevPat) { $darcArgs += ("--azdev-pat", $azdevPat) } @@ -205,7 +130,7 @@ if ($LASTEXITCODE -eq 0) { Highlight "Synchronization succeeded" } else { - Fail "Synchronization of dotnet/dotnet to '$repository' failed!" + Fail "Synchronization of repo to VMR failed!" Fail "'$vmrDir' is left in its last state (re-run of this script will reset it)." Fail "Please inspect the logs which contain path to the failing patch file (use -debugOutput to get all the details)." Fail "Once you make changes to the conflicting VMR patch, commit it locally and re-run this script." diff --git a/eng/vmr-sync.sh b/eng/vmr-sync.sh index 425bbe45995a..86d77ccf5b48 100755 --- a/eng/vmr-sync.sh +++ b/eng/vmr-sync.sh @@ -1,27 +1,16 @@ #!/bin/bash -### This script is used for synchronizing the dotnet/dotnet VMR locally. This means pulling new -### code from various repositories into the 'dotnet/dotnet' repository. +### This script is used for synchronizing the current repository into a local VMR. +### It pulls the current repository's code into the specified VMR directory for local testing or +### Source-Build validation. ### -### The script is used during CI to ingest new code based on dotnet/sdk but it can also help -### for reproducing potential failures during sdk's PRs, namely to fix the Source-Build. -### Another usecase is to try manually synchronizing a given commit of some repo into the VMR and -### trying to Source-Build the VMR. This can help when fixing the Source-Build but using a commit -### from a not-yet merged branch (or fork) to test the fix will help. -### -### The tooling that synchronizes the VMR will need to clone the various repositories into a temporary -### folder. These clones can be re-used in future synchronizations so it is advised you dedicate a -### folder to this to speed up your re-runs. +### The tooling used for synchronization will clone the VMR repository into a temporary folder if +### it does not already exist. These clones can be reused in future synchronizations, so it is +### recommended to dedicate a folder for this to speed up re-runs. ### ### USAGE: -### Synchronize current sdk and all dependencies into a local VMR: -### ./vmr-sync.sh --vmr "$HOME/repos/dotnet" --tmp "$HOME/repos/tmp" -### -### Synchronize the VMR to a specific commit of dotnet/runtime using custom fork: -### ./vmr-sync.sh \ -### --repository runtime:e7e71da303af8dc97df99b098f21f526398c3943 \ -### --remote runtime:https://github.com/yourfork/runtime \ -### --tmp "$HOME/repos/tmp" +### Synchronize current repository into a local VMR: +### ./vmr-sync.sh --tmp "$HOME/repos/tmp" "$HOME/repos/dotnet" ### ### Options: ### -t, --tmp, --tmp-dir PATH @@ -33,26 +22,11 @@ ### --debug ### Optional. Turns on the most verbose logging for the VMR tooling ### -### --recursive -### Optional. Recursively synchronize all the source build dependencies (declared in Version.Details.xml) -### This is used when performing the full synchronization during sdk's CI and the final VMR sync. -### Defaults to false unless no repository is supplied in which case a recursive sync of sdk is performed. -### ### --remote name:URI ### Optional. Additional remote to use during the synchronization ### This can be used to synchronize to a commit from a fork of the repository ### Example: 'runtime:https://github.com/yourfork/runtime' ### -### -r, --repository name:GIT_REF -### Optional. Repository + git ref separated by colon to synchronize to. -### This can be a specific commit, branch, tag. -### If not supplied, the revision of the parent sdk repository of this script will be used (recursively). -### Example: 'runtime:my-branch-name' -### -### --tpn-template -### Optional. Template for the header of VMRs THIRD-PARTY-NOTICES file. -### Defaults to src/VirtualMonoRepo/THIRD-PARTY-NOTICES.template.txt -### ### --azdev-pat ### Optional. Azure DevOps PAT to use for cloning private repositories. ### @@ -89,26 +63,14 @@ function highlight () { echo "${COLOR_CYAN}$FAILURE_PREFIX${1//${COLOR_RESET}/${COLOR_CYAN}}${COLOR_CLEAR}" } -# realpath is not available in macOS 12, try horrible-but-portable workaround -sdk_dir=$(cd "$scriptroot/../"; pwd -P) - tmp_dir='' vmr_dir='' vmr_branch='' -repository='' additional_remotes='' -recursive=false verbosity=verbose -tpn_template="$sdk_dir/src/VirtualMonoRepo/THIRD-PARTY-NOTICES.template.txt" -enable_build_lookup='' azdev_pat='' ci=false -# If sdk is a repo, we're in an sdk and not in the dotnet/dotnet repo -if [[ -d "$sdk_dir/.git" ]]; then - additional_remotes="sdk:$sdk_dir" -fi - while [[ $# -gt 0 ]]; do opt="$(echo "$1" | tr "[:upper:]" "[:lower:]")" case "$opt" in @@ -124,24 +86,10 @@ while [[ $# -gt 0 ]]; do vmr_branch=$2 shift ;; - -r|--repository) - repository=$2 - shift - ;; - --recursive) - recursive=true - ;; --remote) additional_remotes="$additional_remotes $2" shift ;; - --tpn-template) - tpn_template=$2 - shift - ;; - --enable-build-lookup) - enable_build_lookup="--enable-build-lookup" - ;; --azdev-pat) azdev_pat=$2 shift @@ -168,29 +116,13 @@ done # Validation -if [[ ! -d "$sdk_dir" ]]; then - fail "Directory '$sdk_dir' does not exist. Please specify the path to the dotnet/sdk repo" - exit 1 -fi - if [[ -z "$tmp_dir" ]]; then fail "Missing --tmp-dir argument. Please specify the path to the temporary folder where the repositories will be cloned" exit 1 fi -if [[ ! -f "$tpn_template" ]]; then - fail "File '$tpn_template' does not exist. Please specify a valid path to the THIRD-PARTY-NOTICES template" - exit 1 -fi - # Sanitize the input -# Default when no repository is provided -if [[ -z "$repository" ]]; then - repository="sdk:$(git -C "$sdk_dir" rev-parse HEAD)" - recursive=true -fi - if [[ -z "$vmr_dir" ]]; then vmr_dir="$tmp_dir/dotnet" fi @@ -230,20 +162,15 @@ set -e # Prepare darc highlight 'Installing .NET, preparing the tooling..' -source "$scriptroot/common/tools.sh" +source "./eng/common/tools.sh" InitializeDotNetCli true -dotnetDir=$( cd $scriptroot/../.dotnet/; pwd -P ) +dotnetDir=$( cd ./.dotnet/; pwd -P ) dotnet=$dotnetDir/dotnet "$dotnet" tool restore -highlight "Starting the synchronization of '$repository'.." +highlight "Starting the synchronization of VMR.." set +e -recursive_arg='' -if [[ "$recursive" == "true" ]]; then - recursive_arg="--recursive" -fi - if [[ -n "$additional_remotes" ]]; then additional_remotes="--additional-remotes $additional_remotes" fi @@ -259,24 +186,18 @@ fi # Synchronize the VMR -"$dotnet" darc vmr update \ - --vmr "$vmr_dir" \ - --tmp "$tmp_dir" \ - $azdev_pat \ - --$verbosity \ - $recursive_arg \ - $ci_arg \ - $additional_remotes \ - --tpn-template "$tpn_template" \ - --discard-patches \ - --generate-credscansuppressions \ - $enable_build_lookup \ - "$repository" +"$dotnet" darc vmr forwardflow \ + --tmp "$tmp_dir" \ + $azdev_pat \ + --$verbosity \ + $ci_arg \ + $additional_remotes \ + "$vmr_dir" if [[ $? == 0 ]]; then highlight "Synchronization succeeded" else - fail "Synchronization of dotnet/dotnet to '$repository' failed!" + fail "Synchronization of repo to VMR failed!" fail "'$vmr_dir' is left in its last state (re-run of this script will reset it)." fail "Please inspect the logs which contain path to the failing patch file (use --debug to get all the details)." fail "Once you make changes to the conflicting VMR patch, commit it locally and re-run this script." diff --git a/src/VirtualMonoRepo/source-mappings.json b/src/VirtualMonoRepo/source-mappings.json index 031ba3ee33df..2014c283f91b 100644 --- a/src/VirtualMonoRepo/source-mappings.json +++ b/src/VirtualMonoRepo/source-mappings.json @@ -18,20 +18,7 @@ // Some files are copied outside of the src/ directory into other locations // When files in the source paths are changed, they are automatically synchronized too - "additionalMappings": [ - { - "source": "src/sdk/src/SourceBuild/content", - "destination": "" - }, - { - "source": "src/sdk/eng/common", - "destination": "eng/common" - }, - { - "source": "src/sdk/src/VirtualMonoRepo/source-mappings.json", - "destination": "src" - } - ], + "additionalMappings": [], // These defaults are added to all mappings unless `ignoreDefaults: true` is specified // When no "include" filter is specified, "**/*" is used