https://github.com/angular/angular
Raw File
Tip revision: 7919982063e7638ffabe2127d4803bb930c791bc authored by Andrew Scott on 10 July 2024, 23:23:46 UTC
feat(core): Add whenStable helper on ApplicationRef (#57190)
Tip revision: 7919982
.pullapprove.yml
####################################################################################
####################################################################################
#                               Angular Code Ownership                             #
####################################################################################
####################################################################################
#
#  Configuration of code ownership and review approvals for the angular/angular repo.
#
#  More info: https://docs.pullapprove.com/
#
# =========================================================
#  General rules / philosophy
# =========================================================
#
#  - We trust that people do the right thing and won't approve changes they don't feel confident reviewing
#  - We enforce that only approved PRs are merged ensuring that unreviewed code isn't accidentally merged
#  - We distribute approval rights as much as possible to help us scale better
#  - Groups have one or two global approvers groups as fallbacks:
#    - @angular/fw-global-approvers: for approving minor changes, large-scale refactorings, and emergency situations.
#    - @angular/fw-global-approvers-for-docs-only-changes: for approving minor documentation-only changes that don't require engineering review
#  - A small number of file groups have very limited number of reviewers because incorrect changes to the files they guard would have serious consequences (e.g. security, public api)
#
#  Configuration nuances:
#
#  - This configuration works in conjunction with the protected branch settings that require all changes to be made via pull requests with at least one approval.
#  - This approval can come from an appropriate codeowner, or any repo collaborator (person with write access) if the PR is authored by a codeowner.
#  - All groups whose pullapprove rules are matched will be required for overall approval.
#
#  NOTE:
#    In the case of emergency, the repo administrators which include the current angular caretaker
#    can bypass this reviewer approval requirement, this is expected as a last resort and to be
#    done exceedingly sparingly.

####################################################################################
#  GitHub usernames
####################################################################################
# See reviewer list under `required-minimum-review` group.  Team member names and
# usernames are managed there.

####################################################################################
#  Approval Groups
####################################################################################
# =========================================================
# @angular/framework-global-approvers
# =========================================================
#  Used for approving minor changes, large-scale refactorings, and in emergency situations.
#
# alxhub
# jelbourn
# josephperrott
#
# =========================================================
# @angular/framework-global-approvers-for-docs-only-changes
# =========================================================
#  Used for approving minor documentation-only changes that don't require engineering review.

version: 3

availability:
  users_unavailable: []

# Meta field that goes unused by PullApprove to allow for defining aliases to be
# used throughout the config.
meta:
  # Note: Because all inactive groups start as pending, we are only checking pending and rejected active groups.
  no-groups-above-this-pending: &no-groups-above-this-pending len(groups.active.pending.exclude("required-minimum-review")) == 0
  no-groups-above-this-rejected: &no-groups-above-this-rejected len(groups.active.rejected.exclude("required-minimum-review")) == 0

  defaults: &defaults
    reviews:
      # Authors provide their approval implicitly, this approval allows for a reviewer
      # from a group not to need a review specifically for an area of the repository
      # they own.  This is coupled with the `required-minimum-review` group which requires
      # that all PRs are reviewed by at least one team member who is not the author of
      # the PR.
      author_value: 1

# turn on 'draft' support
# https://docs.pullapprove.com/config/github-api-version/
# https://developer.github.com/v3/previews/#draft-pull-requests
github_api_version: 'shadow-cat-preview'

# https://docs.pullapprove.com/config/overrides/
# Note that overrides are processed in order.
overrides:
  # For PRs which are still being worked on, either still in draft mode or indicated through WIP in
  # title or label, PullApprove stays in a pending state until its ready for review.
  - if: "draft or 'WIP' in title or 'PR state: WIP' in labels"
    status: pending
    explanation: 'Waiting to send reviews as PR is WIP'
  # Disable PullApprove on specific PRs by adding the `PullApprove: disable` label
  - if: "'PullApprove: disable' in labels"
    status: success
    explanation: "PullApprove skipped because of 'PullApprove: disable' label"
  # If no file matching based groups are active, report this pull request as failing. Most likely,
  # the PR author would need to update the PullApprove config, or create new group.
  - if: len(groups.active.exclude("required-minimum-review").exclude("global-*")) == 0 and len(groups.approved.include("global-*")) == 0
    status: failure
    explanation: 'At least one group must match this PR. Please update an existing review group, or create a new group.'
  # If any global dev-infra approval is given the status should be passing.
  - if: len(groups.approved.include("global-dev-infra-approvers")) == 1
    status: success
    explanation: 'Passing as globally approved by dev-infra'
  # If any global docs approval is given the status should be passing.
  - if: len(groups.approved.include("global-docs-approvers")) == 1
    status: success
    explanation: 'Passing as globally approved by docs'
  # If any global approval is given the status should be passing.
  - if: len(groups.approved.include("global-approvers")) == 1
    status: success
    explanation: 'Passing as globally approved by global approvers'

groups:
  # =========================================================
  #  Framework: Animations
  # =========================================================
  fw-animations:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/animations/**/{*,.*}',
          'packages/platform-browser/animations/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - crisbeto
        - ~jelbourn
        - thePunderWoman

  # =========================================================
  #  Framework: Compiler
  # =========================================================
  fw-compiler:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/compiler/**/{*,.*}',
          'packages/examples/compiler/**/{*,.*}',
          'packages/compiler-cli/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - crisbeto
        - devversion
        - dylhunn
        - JoostK

  # =========================================================
  #  Framework: Migrations
  # =========================================================
  fw-migrations:
    <<: *defaults
    conditions:
      - files.include("packages/core/schematics/*")
    reviewers:
      users:
        - alxhub
        - crisbeto
        - devversion
        - dylhunn
        - thePunderWoman
        - AndrewKushnir

  # =========================================================
  #  Framework: Core
  # =========================================================
  fw-core:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files.exclude("packages/core/schematics/*").exclude('packages/core/primitives/*'), [
          'packages/core/**/{*,.*}',
          'packages/examples/core/**/{*,.*}',
          'packages/platform-browser/**/{*,.*}',
          'packages/examples/platform-browser/**/{*,.*}',
          'packages/platform-browser-dynamic/**/{*,.*}',
          'packages/docs/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - crisbeto
        - devversion
        - dylhunn
        - thePunderWoman
        - pkozlowski-opensource

  # =========================================================
  #  Framework: Common
  # =========================================================
  fw-common:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files.exclude("packages/common/http/*"), [
          'packages/common/**/{*,.*}',
          'packages/examples/common/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - dylhunn
        - thePunderWoman
        - pkozlowski-opensource

  # =========================================================
  #  Framework: Http
  # =========================================================
  fw-http:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/common/http/**/{*,.*}',
          'packages/examples/http/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - dylhunn
        - thePunderWoman
        - pkozlowski-opensource

  # =========================================================
  #  Framework: Elements
  # =========================================================
  fw-elements:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/elements/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - andrewseguin
        - atscott
        - dylhunn
        - thePunderWoman
        - pkozlowski-opensource

  # =========================================================
  #  Framework: Forms
  # =========================================================
  fw-forms:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/forms/**/{*,.*}',
          'packages/examples/forms/**/{*,.*}',
          ])
    reviewers:
      users:
        - AndrewKushnir
        - dylhunn

  # =========================================================
  #  Framework: i18n
  # =========================================================
  fw-i18n:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/core/src/i18n/**/{*,.*}',
          'packages/core/src/render3/i18n/**/{*,.*}',
          'packages/core/src/render3/instructions/i18n.ts',
          'packages/core/src/render3/interfaces/i18n.ts',
          'packages/common/locales/**/{*,.*}',
          'packages/common/src/i18n/**/{*,.*}',
          'packages/common/src/pipes/date_pipe.ts',
          'packages/common/src/pipes/i18n_plural_pipe.ts',
          'packages/common/src/pipes/i18n_select_pipe.ts',
          'packages/common/src/pipes/number_pipe.ts',
          'packages/compiler/src/i18n/**/{*,.*}',
          'packages/compiler/src/render3/view/i18n/**/{*,.*}',
          'packages/compiler-cli/src/extract_i18n.ts',
          'packages/localize/**/{*,.*}',
          ])
    reviewers:
      users:
        - AndrewKushnir
        - dgp1130

  # =========================================================
  #  Framework: Platform Server
  # =========================================================
  fw-platform-server:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/platform-server/**/{*,.*}',
          ])
    reviewers:
      users:
        - alan-agius4
        - alxhub
        - AndrewKushnir
        - atscott
        - dylhunn
        - thePunderWoman
        - pkozlowski-opensource

  # =========================================================
  #  Framework: Router
  # =========================================================
  fw-router:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/router/**/{*,.*}',
          'packages/examples/router/**/{*,.*}',
          ])
    reviewers:
      users:
        - AndrewKushnir
        - atscott

  # =========================================================
  #  Framework: Service Worker
  # =========================================================
  fw-service-worker:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/service-worker/**/{*,.*}',
          'packages/examples/service-worker/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub

  # =========================================================
  #  Framework: Upgrade
  # =========================================================
  fw-upgrade:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/upgrade/**/{*,.*}',
          'packages/common/upgrade/**/{*,.*}',
          'packages/examples/upgrade/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - thePunderWoman

  # =========================================================
  #  Framework: Testing
  # =========================================================
  fw-testing:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files.exclude('packages/compiler-cli/*').exclude('packages/language-service/*').exclude('packages/service-worker/*'), [
          'packages/**/testing/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - dylhunn
        - thePunderWoman
        - pkozlowski-opensource

  # =========================================================
  #  Framework: Benchmarks
  # =========================================================
  fw-benchmarks:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'modules/benchmarks/**/{*,.*}'
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - dylhunn
        - thePunderWoman
        - pkozlowski-opensource

  # =========================================================
  #  Framework: Playground
  # =========================================================
  fw-playground:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'modules/playground/**/{*,.*}'
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - dylhunn
        - thePunderWoman
        - pkozlowski-opensource

  # =========================================================
  #  Framework: Security
  # =========================================================
  fw-security:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/core/src/sanitization/**/{*,.*}',
          'packages/core/test/linker/security_integration_spec.ts',
          'packages/compiler/src/schema/**/{*,.*}',
          'packages/platform-browser/src/security/**/{*,.*}',
          'packages/tsconfig-tsec-base.json',
          'packages/tsec-exemption.json',
          'tools/tsec.bzl',
          ])
    reviewers:
      users:
        - alxhub
        - jelbourn
        - josephperrott
        - pkozlowski-opensource
    reviews:
      request: -1 # request reviews from everyone
      required: 2 # require at least 2 approvals
      reviewed_for: required

  # =========================================================
  #  Bazel
  # =========================================================
  bazel:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/bazel/**/{*,.*}',
          ])
    reviewers:
      users:
        - devversion
        - josephperrott

  # =========================================================
  #  Language Service
  # =========================================================
  language-service:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/language-service/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - atscott
        - dylhunn

  # =========================================================
  #  zone.js
  # =========================================================
  zone-js:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/zone.js/**/{*,.*}',
          ])
    reviewers:
      users:
        - JiaLiPassion

  # =========================================================
  #  in-memory-web-api
  # =========================================================
  in-memory-web-api:
    conditions:
      - >
        contains_any_globs(files, [
          'packages/misc/angular-in-memory-web-api/**/{*,.*}',
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - crisbeto
        - dylhunn
        - thePunderWoman
        - pkozlowski-opensource

  # =========================================================
  #  Benchpress
  # =========================================================
  benchpress:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/benchpress/**/{*,.*}'
          ])
    reviewers:
      users:
        - devversion
        - josephperrott
        - pkozlowski-opensource

  # =========================================================
  #  Integration Tests
  # =========================================================
  integration-tests:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'integration/**/{*,.*}'
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - dylhunn
        - thePunderWoman
        - josephperrott

  # =========================================================
  #  Docs: Packaging, Tooling, Releasing
  # =========================================================
  docs-packaging-and-releasing:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'contributing-docs/public-api-surface.md',
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - thePunderWoman
        - jelbourn

  # =========================================================
  #  Tooling: Compiler API shared with Angular CLI
  #
  #  Changing this API might break Angular CLI, so we require
  #  the CLI team to approve changes here.
  # =========================================================
  tooling-cli-shared-api:
    conditions:
      - >
        contains_any_globs(files, [
          'packages/compiler-cli/private/tooling.ts',
          'packages/localize/tools/index.ts'
        ])
    reviewers:
      users:
        - alan-agius4
        - clydin
        - dgp1130
    reviews:
      request: -1 # request reviews from everyone
      required: 2 # require at least 2 approvals
      reviewed_for: required

  # =========================================================
  #  Docs: Angular Dev Site
  # =========================================================
  angular-dev:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'adev/**/{.*,*}',
          'aio/**/{.*,*}'
          ])
    reviewers:
      users:
        - josephperrott
        - jelbourn
        - bencodezen
        - thePunderWoman
        - dylhunn
        - AndrewKushnir
        - alxhub
        - crisbeto
        - devversion
        - atscott
        - pkozlowski-opensource
        - ~JeanMeche

  # =========================================================
  #  Angular DevTools
  # =========================================================
  devtools:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'devtools/**/{*,.*}',
          ])
    reviewers:
      users:
        - AleksanderBodurri
        - devversion
        - dgp1130
        - josephperrott
        - mgechev
        - twerske
        - ~JeanMeche

  # =========================================================
  #  Dev-infra
  # =========================================================
  dev-infra:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files.exclude('.pullapprove.yml'), [
          '{*,.*}',
          '.circleci/**/{*,.*}',
          '.devcontainer/**/{*,.*}',
          '.github/**/{*,.*}',
          '.husky/**/{*,.*}',
          '.ng-dev/**/{*,.*}',
          '.vscode/**/{*,.*}',
          '.yarn/**/{*,.*}',
          'contributing-docs/*.md',
          'contributing-docs/images/**/{*,.*}',
          'goldens/{*,.*}',
          'goldens/public-api/manage.js',
          'modules/{*,.*}',
          'packages/{*,.*}',
          'packages/examples/test-utils/**/{*,.*}',
          'packages/private/**/{*,.*}',
          'packages/examples/{*,.*}',
          'scripts/**/{*,.*}',
          'third_party/**/{*,.*}',
          'tools/bazel-repo-patches/**/{*,.*}',
          'tools/circular_dependency_test/**/{*,.*}',
          'tools/contributing-stats/**/{*,.*}',
          'tools/esm-interop/**/{*,.*}',
          'tools/gulp-tasks/**/{*,.*}',
          'tools/legacy-saucelabs/**/{*,.*}',
          'tools/manual_api_docs/**/{*,.*}',
          'tools/npm-patches/**/{*,.*}',
          'tools/rxjs/**/{*,.*}',
          'tools/saucelabs-daemon/**/{*,.*}',
          'tools/saucelabs/**/{*,.*}',
          'tools/symbol-extractor/**/{*,.*}',
          'tools/testing/**/{*,.*}',
          'tools/tslint/**/{*,.*}',
          'tools/utils/**/{*,.*}',
          'tools/yarn/**/{*,.*}',
          'tools/{*,.*}',
          '**/*.bzl'
          ])
    reviewers:
      users:
        - devversion
        - josephperrott

  # =========================================================
  #  Public API
  # =========================================================
  public-api:
    <<: *defaults
    conditions:
      - *no-groups-above-this-pending
      - *no-groups-above-this-rejected
      - >
        contains_any_globs(files.exclude("goldens/public-api/manage.js"), [
          'goldens/public-api/**/{*,.*}',
          ])
    reviewers:
      users:
        - AndrewKushnir
        - alxhub
        - atscott
        - dylhunn
        - ~jelbourn
        - thePunderWoman
        - pkozlowski-opensource
        - ~iteriani
        - ~tbondwilkinson
        - ~rahatarmanahmed
    reviews:
      request: 3 # Request reviews from 3 people
      required: 2 # Require that 2 people approve
      reviewed_for: required

  # ================================================
  #  Size tracking
  # ================================================
  size-tracking:
    <<: *defaults
    conditions:
      - *no-groups-above-this-pending
      - *no-groups-above-this-rejected
      - >
        contains_any_globs(files, [
          'goldens/size-tracking/**/{*,.*}'
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - dylhunn
        - ~jelbourn
        - thePunderWoman
        - pkozlowski-opensource
    reviews:
      request: 2 # Request reviews from 2 people
      required: 1 # Require that 1 person approve
      reviewed_for: required

  # ================================================
  #  Circular dependencies
  # ================================================
  circular-dependencies:
    <<: *defaults
    conditions:
      - *no-groups-above-this-pending
      - *no-groups-above-this-rejected
      - >
        contains_any_globs(files, [
          'goldens/circular-deps/packages.json'
        ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - atscott
        - dylhunn
        - ~jelbourn
        - thePunderWoman
        - pkozlowski-opensource

  ####################################################################################
  #  Special Cases
  ####################################################################################

  # =========================================================
  #  Code Ownership
  # =========================================================
  code-ownership:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          '.pullapprove.yml'
          ])
    reviewers:
      users:
        - alxhub
        - AndrewKushnir
        - andrewseguin
        - dgp1130
        - ~jelbourn
        - thePunderWoman
        - josephperrott

  # =========================================================
  #  Primitives
  # =========================================================

  # Angular team required reviews
  primitives:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/core/primitives/**/{*,.*}',
        ])
    reviewers:
      users:
        - pkozlowski-opensource # Pawel Kozlowski
        - alxhub # Alex Rickabaugh
        - thePunderWoman # Jessica Janiuk
        - dylhunn # Dylan Hunn
        - AndrewKushnir # Andrew Kushnir
        - atscott # Andrew Scott
    labels:
      pending: 'requires: TGP'
      approved: 'requires: TGP'
      rejected: 'requires: TGP'

  # External team required reviews
  primitives-shared:
    <<: *defaults
    conditions:
      - >
        contains_any_globs(files, [
          'packages/core/primitives/**/{*,.*}',
        ])
    reviewers:
      users:
        - csmick # Cameron Smick
        - lannka # Hongfei Ding
        - eduhmc # Eduardo Huerta-Mercado
        - ehlemur # Edward Lesmes
        - ellenyuan # Ellen Yuan
        - jatraman # Jatin Ramanathan
        - jesse-good # Jesse Costello-Good
        - mturco # Matt Turco
        - neonstalwart # Ben Hockey
        - iteriani # Thomas Nguyen
        - tbondwilkinson # Tom Wilkinson
        - rahatarmanahmed # Rahat Ahmed
    labels:
      pending: 'requires: TGP'
      approved: 'requires: TGP'
      rejected: 'requires: TGP'

  ####################################################################################
  # Override managed result groups
  #
  # Groups which are only used to determine the value of an override are managed at
  # the bottom of the list as they will set a status on the PR directly, they
  # therefore can always be process last without concern.
  ####################################################################################

  # =========================================================
  # Global Approvers
  #
  # All reviews performed for global approvals require using
  # the `Reviewed-for:` specifier to set the approval
  # specificity as documented at:
  # https://docs.pullapprove.com/reviewed-for/
  # =========================================================
  global-approvers:
    type: optional
    reviewers:
      teams:
        - framework-global-approvers
    reviews:
      request: 0
      required: 1
      reviewed_for: required

  # =========================================================
  # Global Approvers For Docs
  #
  # All reviews performed for global docs approvals require
  # using the `Reviewed-for:` specifier to set the approval
  # specificity as documented at:
  # https://docs.pullapprove.com/reviewed-for/
  # =========================================================
  global-docs-approvers:
    type: optional
    reviewers:
      teams:
        - framework-global-approvers-for-docs-only-changes
    reviews:
      request: 0
      required: 1
      reviewed_for: required

  # =========================================================
  # Global Approvers For Dev-Infra changes
  #
  # All reviews performed for global dev-infra approvals
  # require using the `Reviewed-for:` specifier to set the
  # approval specificity as documented at:
  # https://docs.pullapprove.com/reviewed-for/
  # =========================================================
  global-dev-infra-approvers:
    type: optional
    reviewers:
      teams:
        - dev-infra-framework
    reviews:
      request: 0
      required: 1
      reviewed_for: required

  # =========================================================
  # Require review on all PRs
  #
  # All PRs require at least one review.  This rule will not
  # request any reviewers, however will require that at least
  # one review is provided before the group is satisfied.
  # =========================================================
  required-minimum-review:
    reviews:
      request: 0 # Do not request any reviews from the reviewer group
      required: 1 # Require that all PRs have approval from at least one of the users in the group
      author_value: 0 # The author of the PR cannot provide an approval for themself
      reviewed_for: ignored # All reviews apply to this group whether noted via Reviewed-for or not
    reviewers:
      teams:
        # Any member of the team can provide a review to perform the minimum review required
        - team
back to top