Compare commits
353 Commits
9.0.0-rc.1
...
8.0.3
Author | SHA1 | Date | |
---|---|---|---|
9b812dc729 | |||
2eee8d59fe | |||
f0dc8cfc05 | |||
79471f7610 | |||
54f68c342b | |||
86bfb0172b | |||
52186165ee | |||
e9ae885982 | |||
8a1bd2c401 | |||
018b695ef2 | |||
1d193df360 | |||
0a46b2acfb | |||
b63aa4e7ef | |||
6aae19633b | |||
00242e8d6d | |||
4ea231fdbe | |||
6bad2ca586 | |||
dabf1325ed | |||
987b18596b | |||
f470e69fba | |||
980bcaf176 | |||
48f7f65bf4 | |||
7fe95b1882 | |||
266871baf4 | |||
bc54ecf66e | |||
274833ee94 | |||
ff5934597a | |||
09b60ed36a | |||
0bb83b2ba6 | |||
de04741863 | |||
8ea91887ca | |||
ff184b56eb | |||
15d138fdd3 | |||
1699b54860 | |||
07f6b2c018 | |||
4a193580fe | |||
9c222350f9 | |||
c36edffe2a | |||
13b984d72b | |||
f00eff5916 | |||
31ee45efdc | |||
b68f2d6fa5 | |||
d8def6d728 | |||
e8f464409c | |||
a73b8a62c8 | |||
2fe8f2b1e0 | |||
f1c08c6918 | |||
bf9de8ca53 | |||
df37c47ac5 | |||
788d19c036 | |||
8492499fe7 | |||
48174010a1 | |||
1460e46ba1 | |||
a7ff7d8d27 | |||
eb970b4626 | |||
18d301258a | |||
6a01fa532c | |||
e190a7e9de | |||
53c6425954 | |||
c198dc6c19 | |||
d1b26dd3a1 | |||
ce7131f3fb | |||
934702892e | |||
8a830a72e2 | |||
2abb54c4a1 | |||
44632bb700 | |||
e33b382ab4 | |||
c4da400db4 | |||
c40e6b2edc | |||
978fc27314 | |||
b9f2bbb7d1 | |||
9654d646ae | |||
7f214499e8 | |||
a3d55a9d27 | |||
e222b8761e | |||
1435c0b3a9 | |||
0a7aebbcf5 | |||
bd7f91feac | |||
3bbc89b958 | |||
52d98e563d | |||
b279f8bd62 | |||
954e34cc91 | |||
e1f6d15387 | |||
cbb3794931 | |||
77a5790a9d | |||
4ca401c394 | |||
3dcd5ebdbc | |||
49307f0595 | |||
762fc28fee | |||
338e58c278 | |||
7e2ed89208 | |||
56a3dcf44c | |||
501bacdcf6 | |||
c5f2979a87 | |||
fe02462b5f | |||
3000d19ad1 | |||
dcf9f05c9a | |||
ba56f3c15b | |||
865ad56e9a | |||
5cda2a041b | |||
6a484853a9 | |||
e6ac289518 | |||
4e8614bb92 | |||
9ace748d3a | |||
08c38a1f99 | |||
9aeef0afdb | |||
8aef446373 | |||
f7ee91a17c | |||
8ae0afd3f8 | |||
be82270493 | |||
4cef2c1236 | |||
26e3615e19 | |||
65f20107fe | |||
5a7bcd1862 | |||
152ea36c80 | |||
ea2adb104b | |||
19caace2ab | |||
ccc1c27461 | |||
97268b95f7 | |||
7c41abe64a | |||
991e138650 | |||
d00b421402 | |||
06ffed5141 | |||
5a15126520 | |||
9e4b2f1a4f | |||
393529d3b5 | |||
81b75590d7 | |||
151f0f4b2c | |||
f88f941008 | |||
0e17958640 | |||
e82b45c8a7 | |||
8422ef2a93 | |||
cdf586d0d2 | |||
3828c89792 | |||
0f352b6350 | |||
06bdecffb9 | |||
99ddec152b | |||
31aba96fcb | |||
facce2c9fd | |||
edaf058548 | |||
4bff2d0c8c | |||
cfc608aaf3 | |||
6d9f5fcddb | |||
b19a05c25a | |||
bd75b3b7b3 | |||
1c67b9063b | |||
9a9ae60e0e | |||
ae6fa9260a | |||
f8fa2f2a6c | |||
f3ee9a6144 | |||
d076c51455 | |||
38a7e2a775 | |||
c61c14a127 | |||
652b0959a8 | |||
002fbddcf1 | |||
4761d40a41 | |||
608e0f0d67 | |||
45718b3b21 | |||
b5756bcc39 | |||
60f0462049 | |||
9fd22959d3 | |||
d5dd907396 | |||
5a6bf7de0e | |||
d135bb5e6e | |||
8b9a3e49f2 | |||
44e55fe2e4 | |||
063cc308b6 | |||
c567135dd5 | |||
361f181c8c | |||
b40844523b | |||
c8af830ec8 | |||
e2c9ddb33e | |||
04196ec2d0 | |||
7323072c5c | |||
f0c5400cab | |||
3f2f937c9f | |||
256fe2421a | |||
e6f27bcb0c | |||
8abcf04a5e | |||
bf38df4eb9 | |||
79a025306a | |||
62c936aa49 | |||
77e1b34d91 | |||
26cb128b3c | |||
fdbe07982a | |||
c0e3209915 | |||
70880f0cea | |||
221a5ba634 | |||
68b08cf782 | |||
10560a0872 | |||
561e01ddfd | |||
d1345c78f0 | |||
276f9067c8 | |||
0e90a4263b | |||
e4cc1398aa | |||
8d1f993ceb | |||
df1ab49893 | |||
df03fec8a6 | |||
c01cae22e1 | |||
5a46f94987 | |||
5716605d52 | |||
8043e3131c | |||
54f7245081 | |||
5de24b6dfe | |||
4dc4d7f30a | |||
fcea1a3c22 | |||
8bc4da8665 | |||
a5a2d525ae | |||
4690dcecac | |||
722b2fa6ed | |||
124d1abf19 | |||
736d3ef820 | |||
9b0ad347e1 | |||
d2598ace0a | |||
4a25e4cf95 | |||
3f67bf208d | |||
d85476fd8c | |||
9763edf829 | |||
b6ae54c547 | |||
3de26a84ff | |||
8022d3691b | |||
581336a918 | |||
effc58086c | |||
766615c8a1 | |||
ede4246663 | |||
bb8a6abbf2 | |||
32daa930d0 | |||
b6aa99d3a7 | |||
e10b213784 | |||
a67cf99b0c | |||
04d04fd147 | |||
17361d2b2c | |||
9b88920aa9 | |||
b12e76d1d3 | |||
af001a8cbd | |||
db64b014f8 | |||
7e34975bb0 | |||
0fa48e8c00 | |||
fde3f467e2 | |||
7b378a6920 | |||
3136d9ff2e | |||
325e6cf557 | |||
381d7c4e44 | |||
1b6f3c1ead | |||
c38349127c | |||
a4817729a2 | |||
61c343e3eb | |||
24e6c1e80d | |||
42fc5c9b33 | |||
33e7b285ca | |||
74afdc37da | |||
3c1ffba0ad | |||
14c0017db8 | |||
4878f4890b | |||
b7edef0cd3 | |||
39fa937ab9 | |||
2977829c67 | |||
dbe845e048 | |||
e562acc884 | |||
e295c6a0ae | |||
10b43355f8 | |||
d4e7587bd8 | |||
cabe03cf6d | |||
0cefa9e342 | |||
e073daa48e | |||
994d48a96e | |||
806f8118c8 | |||
dd299f9eb2 | |||
49ec3f312c | |||
71eba450e6 | |||
192f108b0f | |||
dd8651db73 | |||
5bbbe3f684 | |||
a71d8a837b | |||
e8ceae14e1 | |||
c3246e6f16 | |||
685753361e | |||
6b07711f96 | |||
12fb639b7d | |||
644925fd0c | |||
bcc72b0924 | |||
e1091b2ba8 | |||
08841e31d9 | |||
d1fcc2bc13 | |||
fac00442d2 | |||
b8cbcbcf49 | |||
1ed45bd783 | |||
82fd1920b1 | |||
f6d7271ec7 | |||
c1f3faf1df | |||
97202278f9 | |||
132f01c5ca | |||
6a987f1b9c | |||
548b003ed3 | |||
48dc41de01 | |||
817c2b49bc | |||
fed07c735c | |||
390cac6874 | |||
8eb0b8bd40 | |||
d7283c6085 | |||
3fe3a84a4b | |||
28e4187bd6 | |||
7cbc69c890 | |||
1dc134bc6b | |||
6a61d37f95 | |||
8d2e92bcfe | |||
5038f5c909 | |||
6eeca70043 | |||
9f68c35fa9 | |||
21418ea109 | |||
02d8b4ed3c | |||
6748392edc | |||
d9fd301157 | |||
71c5d80ce7 | |||
9798229fde | |||
4b2fcfd5dc | |||
b4d291aa7a | |||
b0ecafdc2f | |||
6816bb62d7 | |||
4b05b8cea0 | |||
a0728aedf7 | |||
ea96f6112a | |||
b706800ea8 | |||
c6f95b1d70 | |||
d896126604 | |||
a20da5ddcc | |||
18878600ba | |||
d7e10f3f7e | |||
4d044ea5b2 | |||
e2d1e0cd98 | |||
4e056580bb | |||
e4c2e6a904 | |||
a50989832d | |||
525307b6a3 | |||
a3ab76b216 | |||
f2265d4b46 | |||
d3ac709b99 | |||
908d43a5bb | |||
71cdb0a08e | |||
c7fbbdfa99 | |||
10e4ab7712 | |||
5114c23c21 | |||
c3e585d7eb | |||
0776daec88 | |||
615e1a58b2 | |||
606758357e | |||
ba2a3595c6 | |||
a50bfe5054 | |||
c8983bc367 | |||
8d6d2c6704 | |||
6711f22e62 | |||
8dd9192fe3 | |||
870e0dab48 |
@ -1,4 +1,3 @@
|
|||||||
.git
|
|
||||||
node_modules
|
node_modules
|
||||||
dist
|
dist
|
||||||
aio/content
|
aio/content
|
||||||
|
95
.bazelrc
95
.bazelrc
@ -1,3 +1,14 @@
|
|||||||
|
###############################
|
||||||
|
# Typescript / Angular / Sass #
|
||||||
|
###############################
|
||||||
|
|
||||||
|
# Make compilation fast, by keeping a few copies of the compilers
|
||||||
|
# running as daemons, and cache SourceFile AST's to reduce parse time.
|
||||||
|
build --strategy=AngularTemplateCompile=worker
|
||||||
|
# TODO(alexeagle): re-enable after fixing worker instability with rxjs typings
|
||||||
|
# build --strategy=TypeScriptCompile=worker
|
||||||
|
build --strategy=TypeScriptCompile=standalone
|
||||||
|
|
||||||
# Enable debugging tests with --config=debug
|
# Enable debugging tests with --config=debug
|
||||||
test:debug --test_arg=--node_options=--inspect-brk --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results
|
test:debug --test_arg=--node_options=--inspect-brk --test_output=streamed --test_strategy=exclusive --test_timeout=9999 --nocache_test_results
|
||||||
|
|
||||||
@ -18,8 +29,11 @@ test:debug --test_arg=--node_options=--inspect-brk --test_output=streamed --test
|
|||||||
# See https://github.com/bazelbuild/bazel/issues/4603
|
# See https://github.com/bazelbuild/bazel/issues/4603
|
||||||
build --symlink_prefix=dist/
|
build --symlink_prefix=dist/
|
||||||
|
|
||||||
|
# Disable watchfs as it causes tests to be flaky on Windows
|
||||||
|
# https://github.com/angular/angular/issues/29541
|
||||||
|
build --nowatchfs
|
||||||
|
|
||||||
# Turn off legacy external runfiles
|
# Turn off legacy external runfiles
|
||||||
build --nolegacy_external_runfiles
|
|
||||||
run --nolegacy_external_runfiles
|
run --nolegacy_external_runfiles
|
||||||
test --nolegacy_external_runfiles
|
test --nolegacy_external_runfiles
|
||||||
|
|
||||||
@ -33,6 +47,22 @@ build --incompatible_strict_action_env
|
|||||||
run --incompatible_strict_action_env
|
run --incompatible_strict_action_env
|
||||||
test --incompatible_strict_action_env
|
test --incompatible_strict_action_env
|
||||||
|
|
||||||
|
###############################
|
||||||
|
# Saucelabs support #
|
||||||
|
# Turn on these settings with #
|
||||||
|
# --config=saucelabs #
|
||||||
|
###############################
|
||||||
|
|
||||||
|
# Expose SauceLabs environment to actions
|
||||||
|
# These environment variables are needed by
|
||||||
|
# web_test_karma to run on Saucelabs
|
||||||
|
test:saucelabs --action_env=SAUCE_USERNAME
|
||||||
|
test:saucelabs --action_env=SAUCE_ACCESS_KEY
|
||||||
|
test:saucelabs --action_env=SAUCE_READY_FILE
|
||||||
|
test:saucelabs --action_env=SAUCE_PID_FILE
|
||||||
|
test:saucelabs --action_env=SAUCE_TUNNEL_IDENTIFIER
|
||||||
|
test:saucelabs --define=KARMA_WEB_TEST_MODE=SL_REQUIRED
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
# Release support #
|
# Release support #
|
||||||
# Turn on these settings with #
|
# Turn on these settings with #
|
||||||
@ -55,11 +85,17 @@ query --output=label_kind
|
|||||||
# By default, failing tests don't print any output, it goes to the log file
|
# By default, failing tests don't print any output, it goes to the log file
|
||||||
test --test_output=errors
|
test --test_output=errors
|
||||||
|
|
||||||
|
# Show which actions are run under workers,
|
||||||
|
# and print all the actions running in parallel.
|
||||||
|
# Helps to demonstrate that bazel uses all the cores on the machine.
|
||||||
|
build --experimental_ui
|
||||||
|
test --experimental_ui
|
||||||
|
|
||||||
################################
|
################################
|
||||||
# Settings for CircleCI #
|
# Settings for CircleCI #
|
||||||
################################
|
################################
|
||||||
|
|
||||||
# Bazel flags for CircleCI are in /.circleci/bazel.linux.rc and /.circleci/bazel.windows.rc
|
# Bazel flags for CircleCI are in /.circleci/bazel.rc
|
||||||
|
|
||||||
################################
|
################################
|
||||||
# Temporary Settings for Ivy #
|
# Temporary Settings for Ivy #
|
||||||
@ -68,45 +104,18 @@ test --test_output=errors
|
|||||||
# any bazel target. This is a temporary flag until codebase is permanently switched to Ivy.
|
# any bazel target. This is a temporary flag until codebase is permanently switched to Ivy.
|
||||||
build --define=compile=legacy
|
build --define=compile=legacy
|
||||||
|
|
||||||
################################
|
###############################
|
||||||
# Settings for rules_nodejs #
|
# Remote Build Execution support
|
||||||
################################
|
# Turn on these settings with
|
||||||
# Temporary define while angular depends on the legacy rollup_bundle rule.
|
# --config=remote
|
||||||
# TODO: remove this setting after https://github.com/angular/angular/pull/33201 lands.
|
###############################
|
||||||
build --define=enable_legacy_rollup_rule=1
|
|
||||||
|
|
||||||
#######################
|
# Load default settings for Remote Build Execution.
|
||||||
# Remote HTTP Caching #
|
import %workspace%/third_party/github.com/bazelbuild/bazel-toolchains/bazelrc/.bazelrc.notoolchain
|
||||||
#######################
|
|
||||||
build --remote_http_cache=https://storage.googleapis.com/angular-team-cache
|
|
||||||
build --remote_accept_cached=true
|
|
||||||
build --remote_upload_local_results=false
|
|
||||||
|
|
||||||
######################################
|
|
||||||
# Remote HTTP Caching writes support #
|
|
||||||
# Turn on these settings with #
|
|
||||||
# --config=-http-caching #
|
|
||||||
######################################
|
|
||||||
build:remote-http-caching --remote_upload_local_results=true
|
|
||||||
build:remote-http-caching --google_default_credentials
|
|
||||||
|
|
||||||
##################################
|
|
||||||
# Remote Build Execution support #
|
|
||||||
# Turn on these settings with #
|
|
||||||
# --config=remote #
|
|
||||||
##################################
|
|
||||||
|
|
||||||
# The following --define=EXECUTOR=remote will be able to be removed
|
|
||||||
# once https://github.com/bazelbuild/bazel/issues/7254 is fixed
|
|
||||||
build:remote --define=EXECUTOR=remote
|
|
||||||
|
|
||||||
# Set a higher timeout value, just in case.
|
|
||||||
build:remote --remote_timeout=600
|
|
||||||
|
|
||||||
# Increase the default number of jobs by 50% because our build has lots of
|
# Increase the default number of jobs by 50% because our build has lots of
|
||||||
# parallelism
|
# parallelism
|
||||||
build:remote --jobs=150
|
build:remote --jobs=150
|
||||||
build:remote --google_default_credentials
|
|
||||||
|
|
||||||
# Toolchain and platform related flags
|
# Toolchain and platform related flags
|
||||||
build:remote --host_javabase=@rbe_ubuntu1604_angular//java:jdk
|
build:remote --host_javabase=@rbe_ubuntu1604_angular//java:jdk
|
||||||
@ -120,11 +129,21 @@ build:remote --extra_execution_platforms=//tools:rbe_ubuntu1604-angular
|
|||||||
build:remote --host_platform=//tools:rbe_ubuntu1604-angular
|
build:remote --host_platform=//tools:rbe_ubuntu1604-angular
|
||||||
build:remote --platforms=//tools:rbe_ubuntu1604-angular
|
build:remote --platforms=//tools:rbe_ubuntu1604-angular
|
||||||
|
|
||||||
# Remote instance and caching
|
# Remote instance.
|
||||||
build:remote --remote_instance_name=projects/internal-200822/instances/default_instance
|
build:remote --remote_instance_name=projects/internal-200822/instances/default_instance
|
||||||
build:remote --project_id=internal-200822
|
build:remote --project_id=internal-200822
|
||||||
|
|
||||||
|
# Remote caching
|
||||||
build:remote --remote_cache=remotebuildexecution.googleapis.com
|
build:remote --remote_cache=remotebuildexecution.googleapis.com
|
||||||
build:remote --remote_executor=remotebuildexecution.googleapis.com
|
# By default, do not accept remote cache, to be set to true for CI based on environment
|
||||||
|
build:remote --remote_accept_cached=false
|
||||||
|
# By default, do not upload local results to cache, to be set to true for CI based on environment
|
||||||
|
build:remote --remote_upload_local_results=false
|
||||||
|
|
||||||
|
# Build Event Service Configuration
|
||||||
|
build:remote --bes_backend=buildeventservice.googleapis.com
|
||||||
|
build:remote --bes_timeout=30s
|
||||||
|
build:remote --bes_results_url="https://source.cloud.google.com/results/invocations/"
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
# NodeJS rules settings
|
# NodeJS rules settings
|
||||||
|
42
.buildkite/Dockerfile
Normal file
42
.buildkite/Dockerfile
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# Heavily based on https://github.com/StefanScherer/dockerfiles-windows/ images.
|
||||||
|
# Combines the node windowsservercore image with the Bazel Prerequisites (https://docs.bazel.build/versions/master/install-windows.html).
|
||||||
|
# msys install taken from https://github.com/StefanScherer/dockerfiles-windows/issues/30
|
||||||
|
# VS redist install taken from https://github.com/StefanScherer/dockerfiles-windows/blob/master/apache/Dockerfile
|
||||||
|
# The nanoserver image won't work because MSYS2 does not run in it https://github.com/Alexpux/MSYS2-packages/issues/1493
|
||||||
|
|
||||||
|
# Before building this image, you must locally build node-windows:10.13.0-windowsservercore-1803.
|
||||||
|
# Clone https://github.com/StefanScherer/dockerfiles-windows/commit/4ce7101a766b9b880ac262479dd9126b64d656cf and build using
|
||||||
|
# docker build -t node-windows:10.13.0-windowsservercore-1803 --build-arg core=microsoft/windowsservercore:1803 --build-arg target=microsoft/windowsservercore:1803 .
|
||||||
|
FROM node-windows:10.13.0-windowsservercore-1803
|
||||||
|
|
||||||
|
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
|
||||||
|
|
||||||
|
# Install 7zip to extract msys2
|
||||||
|
RUN Invoke-WebRequest -UseBasicParsing 'https://www.7-zip.org/a/7z1805-x64.exe' -OutFile 7z.exe
|
||||||
|
# For some reason the last letter in the destination directory is lost. So '/D=C:\\7zip0' will extract to '/D=C:\\7zip'.
|
||||||
|
RUN Start-Process -FilePath 'C:\\7z.exe' -ArgumentList '/S', '/D=C:\\7zip0' -NoNewWindow -Wait
|
||||||
|
|
||||||
|
# Extract msys2
|
||||||
|
RUN Invoke-WebRequest -UseBasicParsing 'http://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20180531.tar.xz' -OutFile msys2.tar.xz
|
||||||
|
RUN Start-Process -FilePath 'C:\\7zip\\7z' -ArgumentList 'e', 'msys2.tar.xz' -Wait
|
||||||
|
RUN Start-Process -FilePath 'C:\\7zip\\7z' -ArgumentList 'x', 'msys2.tar', '-oC:\\' -Wait
|
||||||
|
RUN Remove-Item msys2.tar.xz
|
||||||
|
RUN Remove-Item msys2.tar
|
||||||
|
RUN Remove-Item 7z.exe
|
||||||
|
RUN Remove-Item -Recurse 7zip
|
||||||
|
|
||||||
|
# Add MSYS2 to PATH, and set BAZEL_SH
|
||||||
|
RUN [Environment]::SetEnvironmentVariable('Path', $env:Path + ';C:\msys64\usr\bin', [System.EnvironmentVariableTarget]::Machine)
|
||||||
|
RUN [Environment]::SetEnvironmentVariable('BAZEL_SH', 'C:\msys64\usr\bin\bash.exe', [System.EnvironmentVariableTarget]::Machine)
|
||||||
|
|
||||||
|
# Install Microsoft Visual C++ Redistributable for Visual Studio 2015
|
||||||
|
RUN Invoke-WebRequest -UseBasicParsing 'https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe' -OutFile vc_redist.x64.exe
|
||||||
|
RUN Start-Process 'c:\\vc_redist.x64.exe' -ArgumentList '/Install', '/Passive', '/NoRestart' -NoNewWindow -Wait
|
||||||
|
RUN Remove-Item vc_redist.x64.exe
|
||||||
|
|
||||||
|
# Add a fix for https://github.com/docker/for-win/issues/2920 as entry point to the container.
|
||||||
|
SHELL ["cmd", "/c"]
|
||||||
|
COPY "fix-msys64.cmd" "C:\\fix-msys64.cmd"
|
||||||
|
ENTRYPOINT cmd /C C:\\fix-msys64.cmd && cmd /c
|
||||||
|
|
||||||
|
CMD ["cmd.exe"]
|
96
.buildkite/README.md
Normal file
96
.buildkite/README.md
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
# BuildKite configuration
|
||||||
|
|
||||||
|
This folder contains configuration for the [BuildKite](https://buildkite.com) based CI checks for
|
||||||
|
this repository.
|
||||||
|
|
||||||
|
BuildKite is a CI provider that provides build coordination and reports while we provide the
|
||||||
|
infrastructure.
|
||||||
|
|
||||||
|
CI runs are triggered by new PRs and will show up on the GitHub checks interface, along with the
|
||||||
|
other current CI solutions.
|
||||||
|
|
||||||
|
Currently it is only used for tests on Windows platforms.
|
||||||
|
|
||||||
|
|
||||||
|
## The build pipeline
|
||||||
|
|
||||||
|
BuildKite uses a pipeline for each repository. The `pipeline.yml` file defines pipeline
|
||||||
|
[build steps](https://buildkite.com/docs/pipelines/defining-steps) for this repository.
|
||||||
|
|
||||||
|
Run results can be seen in the GitHub checks interface and in the
|
||||||
|
[pipeline dashboard](https://buildkite.com/angular/angular).
|
||||||
|
|
||||||
|
Although most configuration is done via `pipeline.yml`, some options are only available
|
||||||
|
in the online [pipeline settings](https://buildkite.com/angular/angular/settings).
|
||||||
|
|
||||||
|
|
||||||
|
## Infrastructure
|
||||||
|
|
||||||
|
BuildKite does not provide the host machines where the builds runs, providing instead the
|
||||||
|
[BuildKite Agent](https://buildkite.com/docs/agent/v3) that should be run our own infrastructure.
|
||||||
|
|
||||||
|
|
||||||
|
### Agents
|
||||||
|
|
||||||
|
This agent polls the BuildKite API for builds, runs them, and reports back the results.
|
||||||
|
Agents are the unit of concurrency: each agent can run one build at any given time.
|
||||||
|
Adding agents allows more builds to be ran at the same time.
|
||||||
|
|
||||||
|
Individual agents can have tags, and pipeline steps can target only agents with certain tags via the
|
||||||
|
`agents` field in `pipeline.yml`.
|
||||||
|
For example: agents on Windows machines are tagged as `windows`, and the Windows specific build
|
||||||
|
steps list `windows: true` in their `agents` field.
|
||||||
|
|
||||||
|
You can see the current agent pool, along with their tags, in the
|
||||||
|
[agents list](https://buildkite.com/organizations/angular/agents).
|
||||||
|
|
||||||
|
|
||||||
|
### Our host machines
|
||||||
|
|
||||||
|
We use [Google Cloud](https://cloud.google.com/) as our cloud provider, under the
|
||||||
|
[Angular project](https://console.cloud.google.com/home/dashboard?project=internal-200822).
|
||||||
|
To access this project you need need to be logged in with a Google account that's a member of
|
||||||
|
team@angular.io.
|
||||||
|
For googlers this may be your google.com account, for others it is an angular.io account.
|
||||||
|
|
||||||
|
In this project we have a number of Windows VMs running, each of them with several agents.
|
||||||
|
The `provision-windows-buildkite.ps1` file contains instructions on how to create new host VMs that
|
||||||
|
are fully configured to run the BuildKite agents as services.
|
||||||
|
|
||||||
|
Our pipeline uses [docker-buildkite-plugin](https://github.com/buildkite-plugins/docker-buildkite-plugin)
|
||||||
|
to run build steps inside docker containers.
|
||||||
|
This way we achieve isolation and hermeticity.
|
||||||
|
|
||||||
|
The `Dockerfile` file describes a custom Docker image that includes NodeJs, Yarn, and the Bazel
|
||||||
|
pre-requisites on Windows.
|
||||||
|
|
||||||
|
To upload a new version of the docker image, follow any build instructions in `Dockerfile` and then
|
||||||
|
run `docker build -t angular/node-bazel-windows:NEW_VERSION`, followed by
|
||||||
|
`docker push angular/node-bazel-windows:NEW_VERSION`.
|
||||||
|
After being pushed it should be available online, and you can use the new version in `pipeline.yml`.
|
||||||
|
|
||||||
|
|
||||||
|
## Caretaker
|
||||||
|
|
||||||
|
BuildKite status can be found at https://www.buildkitestatus.com/.
|
||||||
|
|
||||||
|
Issues related to the BuildKite setup should be escalated to the Tools Team via the current
|
||||||
|
caretaker, followed by Alex Eagle and Filipe Silva.
|
||||||
|
|
||||||
|
Support requests should be submitted via email to support@buildkite.com and cc Igor, Misko, Alex,
|
||||||
|
Jeremy and Manu
|
||||||
|
|
||||||
|
|
||||||
|
## Rollout strategy
|
||||||
|
|
||||||
|
At the moment our BuildKite CI uses 1 host VM running 4 agents, thus being capable of 4 concurrent
|
||||||
|
builds.
|
||||||
|
The only test running is `bazel test //tools/ts-api-guardian:all`, and the PR check is not
|
||||||
|
mandatory.
|
||||||
|
|
||||||
|
In the future we should add cache support to speed up the initial `yarn` install, and also Bazel
|
||||||
|
remote caching to speed up Bazel builds.
|
||||||
|
|
||||||
|
After the current setup is verified as stable and reliable the GitHub PR check can become mandatory.
|
||||||
|
|
||||||
|
The tests ran should also be expanded to cover most, if not all, of the Bazel tests.
|
6
.buildkite/fix-msys64.cmd
Normal file
6
.buildkite/fix-msys64.cmd
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
@echo off
|
||||||
|
REM Fix for https://github.com/docker/for-win/issues/2920
|
||||||
|
REM echo "Fixing msys64 folder..."
|
||||||
|
REM Touch all .dll files inside C:\msys64\
|
||||||
|
forfiles /p C:\msys64\ /s /m *.dll /c "cmd /c Copy /B @path+,, >NUL"
|
||||||
|
REM echo "Fixed msys64 folder."
|
10
.buildkite/pipeline.yml
Normal file
10
.buildkite/pipeline.yml
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
steps:
|
||||||
|
- label: windows-test
|
||||||
|
commands:
|
||||||
|
- "yarn install --frozen-lockfile --non-interactive --network-timeout 100000"
|
||||||
|
- "yarn bazel test //tools/ts-api-guardian:all --noshow_progress"
|
||||||
|
plugins:
|
||||||
|
- docker#v2.1.0:
|
||||||
|
image: "filipesilva/node-bazel-windows:0.0.2"
|
||||||
|
agents:
|
||||||
|
windows: true
|
94
.buildkite/provision-windows-buildkite.ps1
Normal file
94
.buildkite/provision-windows-buildkite.ps1
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
# PowerShell script to provision a Windows Server with BuildKite
|
||||||
|
# This script follows https://buildkite.com/docs/agent/v3/windows.
|
||||||
|
|
||||||
|
# Instructions
|
||||||
|
|
||||||
|
# VM creation:
|
||||||
|
# In Google Cloud Platform, create a Compute Engine instance.
|
||||||
|
# We recommend machine type n1-standard-16 (16 vCPUs, 60 GB memory).
|
||||||
|
# Use a recent windows boot disk with container support such as
|
||||||
|
# "Windows Server version 1803 Datacenter Core for Containers", and add a 128GB SSD disk.
|
||||||
|
# Give it a name, then click "Create".
|
||||||
|
|
||||||
|
# VM setup:
|
||||||
|
# In the Compute Engine menu, select "VM Instances". Click on the VM name you chose before.
|
||||||
|
# Click "Set Windows Password" to choose a username and password.
|
||||||
|
# Click RDP to open a remote desktop via browser, using the username and password.
|
||||||
|
# In the Windows command prompt start an elevated powershell by inputing
|
||||||
|
# "powershell -Command "Start-Process PowerShell -Verb RunAs" followed by Enter.
|
||||||
|
# Download and execute this script from GitHub, passing the token (mandatory), tags (optional)
|
||||||
|
# and number of agents (optional) as args:
|
||||||
|
# ```
|
||||||
|
# Invoke-WebRequest -Uri https://raw.githubusercontent.com/angular/angular/master/.buildkite/provision-windows-buildkite.ps1 -OutFile provision.ps1
|
||||||
|
# .\provision.ps1 -token "MY_TOKEN" -tags "windows=true,another_tag=true" -agents 4
|
||||||
|
# ```
|
||||||
|
# The VM should restart and be fully configured.
|
||||||
|
|
||||||
|
# Creating extra VMs
|
||||||
|
# You can create an image of the current VM by following the instructions below.
|
||||||
|
# https://cloud.google.com/compute/docs/instances/windows/creating-windows-os-image
|
||||||
|
# Then create a new VM and choose "Custom images".
|
||||||
|
|
||||||
|
|
||||||
|
# Script proper.
|
||||||
|
|
||||||
|
# Get the token and tags from arguments.
|
||||||
|
param (
|
||||||
|
[Parameter(Mandatory=$true)][string]$token,
|
||||||
|
[string]$tags = "",
|
||||||
|
[Int]$agents = 1
|
||||||
|
)
|
||||||
|
|
||||||
|
# Allow HTTPS
|
||||||
|
[Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
|
||||||
|
|
||||||
|
# Helper to add to PATH.
|
||||||
|
# Will take current PATH so avoid running it after anything to modifies only the powershell session path.
|
||||||
|
function Add-Path ([string]$newPathItem) {
|
||||||
|
$Env:Path+= ";" + $newPathItem + ";"
|
||||||
|
[Environment]::SetEnvironmentVariable("Path",$env:Path, [System.EnvironmentVariableTarget]::Machine)
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install Git for Windows
|
||||||
|
Write-Host "Installing Git for Windows."
|
||||||
|
Invoke-WebRequest -Uri https://github.com/git-for-windows/git/releases/download/v2.19.1.windows.1/Git-2.19.1-64-bit.exe -OutFile git.exe
|
||||||
|
.\git.exe /VERYSILENT /NORESTART /NOCANCEL /SP- /CLOSEAPPLICATIONS /RESTARTAPPLICATIONS /COMPONENTS="icons,ext\reg\shellhere,assoc,assoc_sh" /DIR="C:\git"
|
||||||
|
Add-Path "C:\git\bin"
|
||||||
|
# Sleep for 15s while git is installed. Trying to remove the git.exe before it finishes install causes an error.
|
||||||
|
Start-Sleep -s 15
|
||||||
|
Remove-Item git.exe
|
||||||
|
|
||||||
|
# Download NSSM (https://nssm.cc/) to run the BuildKite agent as a service.
|
||||||
|
Write-Host "Downloading NSSM."
|
||||||
|
Invoke-WebRequest -Uri https://nssm.cc/ci/nssm-2.24-101-g897c7ad.zip -OutFile nssm.zip
|
||||||
|
Expand-Archive -Path nssm.zip -DestinationPath C:\nssm
|
||||||
|
Add-Path "C:\nssm\nssm-2.24-101-g897c7ad\win64"
|
||||||
|
Remove-Item nssm.zip
|
||||||
|
|
||||||
|
# Run the BuildKite agent install script
|
||||||
|
Write-Host "Installing BuildKite agent."
|
||||||
|
$env:buildkiteAgentToken = $token
|
||||||
|
$env:buildkiteAgentTags = $tags
|
||||||
|
Set-ExecutionPolicy Bypass -Scope Process -Force
|
||||||
|
iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/buildkite/agent/master/install.ps1'))
|
||||||
|
|
||||||
|
# Configure the BuildKite agent clone and timestamp behavior
|
||||||
|
Add-Content C:\buildkite-agent\buildkite-agent.cfg "`ngit-clone-flags=--config core.autocrlf=input --config core.eol=lf --config core.longpaths=true --config core.symlinks=true`n"
|
||||||
|
Add-Content C:\buildkite-agent\buildkite-agent.cfg "`ntimestamp-lines=true`n"
|
||||||
|
|
||||||
|
# Register the BuildKite agent service using NSSM, so that it persists through restarts and is
|
||||||
|
# restarted if the process dies.
|
||||||
|
for ($i=1; $i -le $agents; $i++)
|
||||||
|
{
|
||||||
|
$agentName = "buildkite-agent-$i"
|
||||||
|
Write-Host "Registering $agentName as a service."
|
||||||
|
nssm.exe install $agentName "C:\buildkite-agent\bin\buildkite-agent.exe" "start"
|
||||||
|
nssm.exe set $agentName AppStdout "C:\buildkite-agent\$agentName.log"
|
||||||
|
nssm.exe set $agentName AppStderr "C:\buildkite-agent\$agentName.log"
|
||||||
|
nssm.exe status $agentName
|
||||||
|
nssm.exe start $agentName
|
||||||
|
nssm.exe status $agentName
|
||||||
|
}
|
||||||
|
|
||||||
|
# Restart the machine.
|
||||||
|
Restart-Computer
|
@ -1,15 +0,0 @@
|
|||||||
# Settings in this file should be OS agnostic. Use the bazel.<OS>.rc files for OS specific settings.
|
|
||||||
|
|
||||||
# Don't be spammy in the logs
|
|
||||||
build --noshow_progress
|
|
||||||
|
|
||||||
# Print all the options that apply to the build.
|
|
||||||
# This helps us diagnose which options override others
|
|
||||||
# (e.g. /etc/bazel.bazelrc vs. tools/bazel.rc)
|
|
||||||
build --announce_rc
|
|
||||||
|
|
||||||
# Retry in the event of flakes, eg. https://circleci.com/gh/angular/angular/31309
|
|
||||||
test --flaky_test_attempts=2
|
|
||||||
|
|
||||||
# More details on failures
|
|
||||||
build --verbose_failures=true
|
|
@ -2,16 +2,29 @@
|
|||||||
# We do this by copying this file to /etc/bazel.bazelrc at the start of the build.
|
# We do this by copying this file to /etc/bazel.bazelrc at the start of the build.
|
||||||
# See documentation in /docs/BAZEL.md
|
# See documentation in /docs/BAZEL.md
|
||||||
|
|
||||||
# Import config items common to both Linux and Windows setups.
|
|
||||||
# https://docs.bazel.build/versions/master/guide.html#bazelrc-syntax-and-semantics
|
|
||||||
import %workspace%/.circleci/bazel.common.rc
|
|
||||||
|
|
||||||
# Save downloaded repositories in a location that can be cached by CircleCI. This helps us
|
# Save downloaded repositories in a location that can be cached by CircleCI. This helps us
|
||||||
# speeding up the analysis time significantly with Bazel managed node dependencies on the CI.
|
# speeding up the analysis time significantly with Bazel managed node dependencies on the CI.
|
||||||
build --repository_cache=/home/circleci/bazel_repository_cache
|
build --repository_cache=/home/circleci/bazel_repository_cache
|
||||||
|
|
||||||
|
# Don't be spammy in the logs
|
||||||
|
# TODO(gmagolan): Hide progress again once build performance improves
|
||||||
|
# Presently, CircleCI can timeout during bazel test ... with the following
|
||||||
|
# error: Too long with no output (exceeded 10m0s)
|
||||||
|
# build --noshow_progress
|
||||||
|
|
||||||
|
# Print all the options that apply to the build.
|
||||||
|
# This helps us diagnose which options override others
|
||||||
|
# (e.g. /etc/bazel.bazelrc vs. tools/bazel.rc)
|
||||||
|
build --announce_rc
|
||||||
|
|
||||||
# Workaround https://github.com/bazelbuild/bazel/issues/3645
|
# Workaround https://github.com/bazelbuild/bazel/issues/3645
|
||||||
# Bazel doesn't calculate the memory ceiling correctly when running under Docker.
|
# Bazel doesn't calculate the memory ceiling correctly when running under Docker.
|
||||||
# Limit Bazel to consuming resources that fit in CircleCI "xlarge" class
|
# Limit Bazel to consuming resources that fit in CircleCI "xlarge" class
|
||||||
# https://circleci.com/docs/2.0/configuration-reference/#resource_class
|
# https://circleci.com/docs/2.0/configuration-reference/#resource_class
|
||||||
build --local_resources=14336,8.0,1.0
|
build --local_resources=14336,8.0,1.0
|
||||||
|
|
||||||
|
# Retry in the event of flakes, eg. https://circleci.com/gh/angular/angular/31309
|
||||||
|
test --flaky_test_attempts=2
|
||||||
|
|
||||||
|
# More details on failures
|
||||||
|
build --verbose_failures=true
|
@ -1,14 +0,0 @@
|
|||||||
# These options are enabled when running on CI
|
|
||||||
# We do this by copying this file to $env:ProgramData\bazel.bazelrc at the start of the build.
|
|
||||||
# See documentation in /docs/BAZEL.md
|
|
||||||
|
|
||||||
# Import config items common to both Linux and Windows setups.
|
|
||||||
# https://docs.bazel.build/versions/master/guide.html#bazelrc-syntax-and-semantics
|
|
||||||
import %workspace%/.circleci/bazel.common.rc
|
|
||||||
|
|
||||||
# Save downloaded repositories in a location that can be cached by CircleCI. This helps us
|
|
||||||
# speeding up the analysis time significantly with Bazel managed node dependencies on the CI.
|
|
||||||
build --repository_cache=C:/Users/circleci/bazel_repository_cache
|
|
||||||
|
|
||||||
# All windows jobs run on master and should use http caching
|
|
||||||
build --config=remote-http-caching
|
|
File diff suppressed because it is too large
Load Diff
@ -19,20 +19,16 @@ setPublicVar PROJECT_ROOT "$projectDir";
|
|||||||
setPublicVar CI_AIO_MIN_PWA_SCORE "95";
|
setPublicVar CI_AIO_MIN_PWA_SCORE "95";
|
||||||
# This is the branch being built; e.g. `pull/12345` for PR builds.
|
# This is the branch being built; e.g. `pull/12345` for PR builds.
|
||||||
setPublicVar CI_BRANCH "$CIRCLE_BRANCH";
|
setPublicVar CI_BRANCH "$CIRCLE_BRANCH";
|
||||||
setPublicVar CI_BUILD_URL "$CIRCLE_BUILD_URL";
|
|
||||||
# ChromeDriver version compatible with the Chrome version included in the docker image used in
|
# ChromeDriver version compatible with the Chrome version included in the docker image used in
|
||||||
# `.circleci/config.yml`. See http://chromedriver.chromium.org/downloads for a list of versions.
|
# `.circleci/config.yml`. See http://chromedriver.chromium.org/downloads for a list of versions.
|
||||||
# This variable is intended to be passed as an arg to the `webdriver-manager update` command (e.g.
|
# This variable is intended to be passed as an arg to the `webdriver-manager update` command (e.g.
|
||||||
# `"postinstall": "webdriver-manager update $CI_CHROMEDRIVER_VERSION_ARG"`).
|
# `"postinstall": "webdriver-manager update $CI_CHROMEDRIVER_VERSION_ARG"`).
|
||||||
setPublicVar CI_CHROMEDRIVER_VERSION_ARG "--versions.chrome 75.0.3770.90";
|
setPublicVar CI_CHROMEDRIVER_VERSION_ARG "--versions.chrome 75.0.3770.90";
|
||||||
setPublicVar CI_COMMIT "$CIRCLE_SHA1";
|
setPublicVar CI_COMMIT "$CIRCLE_SHA1";
|
||||||
# `CI_COMMIT_RANGE` is only used on push builds (a.k.a. non-PR, non-scheduled builds and rerun
|
# `CI_COMMIT_RANGE` will only be available when `CIRCLE_COMPARE_URL` is also available (or can be
|
||||||
# workflows of such builds).
|
# retrieved via `get-compare-url.js`), i.e. on push builds (a.k.a. non-PR, non-scheduled builds and
|
||||||
# NOTE: With [CircleCI Pipelines](https://circleci.com/docs/2.0/build-processing) enabled,
|
# rerun workflows of such builds). That is fine, since we only need it in push builds.
|
||||||
# `CIRCLE_COMPARE_URL` is no longer available and the commit range cannot be reliably
|
setPublicVar CI_COMMIT_RANGE "`[[ ${CIRCLE_PR_NUMBER:-false} != false ]] && echo "" || node $getCommitRangePath "$CIRCLE_BUILD_NUM" "$CIRCLE_COMPARE_URL"`";
|
||||||
# detected. Fall back to only considering the last commit (which is accurate in the majority
|
|
||||||
# of cases for push builds).
|
|
||||||
setPublicVar CI_COMMIT_RANGE "`[[ ${CIRCLE_PR_NUMBER:-false} != false ]] && echo "" || echo "$CIRCLE_SHA1~1...$CIRCLE_SHA1"`";
|
|
||||||
setPublicVar CI_PULL_REQUEST "${CIRCLE_PR_NUMBER:-false}";
|
setPublicVar CI_PULL_REQUEST "${CIRCLE_PR_NUMBER:-false}";
|
||||||
setPublicVar CI_REPO_NAME "$CIRCLE_PROJECT_REPONAME";
|
setPublicVar CI_REPO_NAME "$CIRCLE_PROJECT_REPONAME";
|
||||||
setPublicVar CI_REPO_OWNER "$CIRCLE_PROJECT_USERNAME";
|
setPublicVar CI_REPO_OWNER "$CIRCLE_PROJECT_USERNAME";
|
||||||
@ -65,7 +61,6 @@ else
|
|||||||
setPublicVar SAUCE_USERNAME "angular-ci";
|
setPublicVar SAUCE_USERNAME "angular-ci";
|
||||||
setSecretVar SAUCE_ACCESS_KEY "9b988f434ff8-fbca-8aa4-4ae3-35442987";
|
setSecretVar SAUCE_ACCESS_KEY "9b988f434ff8-fbca-8aa4-4ae3-35442987";
|
||||||
fi
|
fi
|
||||||
# TODO(josephperrott): Remove environment variables once all saucelabs tests are via bazel method.
|
|
||||||
setPublicVar SAUCE_LOG_FILE /tmp/angular/sauce-connect.log
|
setPublicVar SAUCE_LOG_FILE /tmp/angular/sauce-connect.log
|
||||||
setPublicVar SAUCE_READY_FILE /tmp/angular/sauce-connect-ready-file.lock
|
setPublicVar SAUCE_READY_FILE /tmp/angular/sauce-connect-ready-file.lock
|
||||||
setPublicVar SAUCE_PID_FILE /tmp/angular/sauce-connect-pid-file.lock
|
setPublicVar SAUCE_PID_FILE /tmp/angular/sauce-connect-pid-file.lock
|
||||||
@ -82,9 +77,7 @@ setPublicVar SAUCE_READY_FILE_TIMEOUT 120
|
|||||||
# their separate build setups.
|
# their separate build setups.
|
||||||
setPublicVar MATERIAL_REPO_TMP_DIR "/tmp/material2"
|
setPublicVar MATERIAL_REPO_TMP_DIR "/tmp/material2"
|
||||||
setPublicVar MATERIAL_REPO_URL "https://github.com/angular/material2.git"
|
setPublicVar MATERIAL_REPO_URL "https://github.com/angular/material2.git"
|
||||||
setPublicVar MATERIAL_REPO_BRANCH "master"
|
setPublicVar MATERIAL_REPO_BRANCH "ivy-2019"
|
||||||
# **NOTE**: When updating the commit SHA, also update the cache key in the CircleCI "config.yml".
|
|
||||||
setPublicVar MATERIAL_REPO_COMMIT "bc1c454391370e75cf604f94bc2e9131e9aef94e"
|
|
||||||
|
|
||||||
# Source `$BASH_ENV` to make the variables available immediately.
|
# Source `$BASH_ENV` to make the variables available immediately.
|
||||||
source $BASH_ENV;
|
source $BASH_ENV;
|
||||||
|
Binary file not shown.
@ -10,13 +10,6 @@
|
|||||||
* format of the `CIRCLE_COMPARE_URL` environment variable, or by retrieving the equivalent of
|
* format of the `CIRCLE_COMPARE_URL` environment variable, or by retrieving the equivalent of
|
||||||
* `CIRCLE_COMPARE_URL` for jobs that are part of a rerun workflow and extracting it from there.
|
* `CIRCLE_COMPARE_URL` for jobs that are part of a rerun workflow and extracting it from there.
|
||||||
*
|
*
|
||||||
* > !!! WARNING !!!
|
|
||||||
* > !!
|
|
||||||
* > !! When [CircleCI Pipelines](https://circleci.com/docs/2.0/build-processing) is enabled, the
|
|
||||||
* > !! `CIRCLE_COMPARE_URL` environment variable is not available at all and this script does not
|
|
||||||
* > !! work.
|
|
||||||
* > !!!!!!!!!!!!!!!
|
|
||||||
*
|
|
||||||
* **Context:**
|
* **Context:**
|
||||||
* CircleCI sets the `CIRCLE_COMPARE_URL` environment variable (from which we can extract the commit
|
* CircleCI sets the `CIRCLE_COMPARE_URL` environment variable (from which we can extract the commit
|
||||||
* range) on push builds (a.k.a. non-PR, non-scheduled builds). Yet, when a workflow is rerun
|
* range) on push builds (a.k.a. non-PR, non-scheduled builds). Yet, when a workflow is rerun
|
||||||
@ -28,7 +21,7 @@
|
|||||||
* (undocumented) fact that the workspace ID happens to be the same as the workflow ID that first
|
* (undocumented) fact that the workspace ID happens to be the same as the workflow ID that first
|
||||||
* created it.
|
* created it.
|
||||||
*
|
*
|
||||||
* For example, for a job on push build workflows, the CircleCI API will return data that look like:
|
* For example, for a job on push build workflow, the CircleCI API will return data that look like:
|
||||||
* ```js
|
* ```js
|
||||||
* {
|
* {
|
||||||
* compare: 'THE_COMPARE_URL_WE_ARE_LOOKING_FOR',
|
* compare: 'THE_COMPARE_URL_WE_ARE_LOOKING_FOR',
|
||||||
|
@ -1,20 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
set -u -e -o pipefail
|
|
||||||
|
|
||||||
# The path of the .bazelrc.user file to update should be passed as first parameter to this script.
|
|
||||||
# This allows to setup RBE for both the Angular repo and the Material repo.
|
|
||||||
bazelrc_user="$1"
|
|
||||||
|
|
||||||
echo "Writing RBE configuration to ${bazelrc_user}"
|
|
||||||
|
|
||||||
touch ${bazelrc_user}
|
|
||||||
echo -e 'build --config=remote\n' >> ${bazelrc_user}
|
|
||||||
echo -e 'build:remote --remote_accept_cached=true\n' >> ${bazelrc_user}
|
|
||||||
echo "Reading from remote cache for bazel remote jobs."
|
|
||||||
if [[ "$CI_PULL_REQUEST" == "false" ]]; then
|
|
||||||
echo -e 'build:remote --remote_upload_local_results=true\n' >> ${bazelrc_user}
|
|
||||||
echo "Uploading local build results to remote cache."
|
|
||||||
else
|
|
||||||
echo -e 'build:remote --remote_upload_local_results=false\n' >> ${bazelrc_user}
|
|
||||||
echo "Not uploading local build results to remote cache."
|
|
||||||
fi
|
|
@ -1,41 +0,0 @@
|
|||||||
# Install Bazel pre-reqs on Windows
|
|
||||||
# https://docs.bazel.build/versions/master/install-windows.html
|
|
||||||
# https://docs.bazel.build/versions/master/windows.html
|
|
||||||
# Install MSYS2 and packages
|
|
||||||
choco install msys2 --version 20180531.0.0 --no-progress --package-parameters "/NoUpdate"
|
|
||||||
C:\tools\msys64\usr\bin\bash.exe -l -c "pacman --needed --noconfirm -S zip unzip patch diffutils git"
|
|
||||||
|
|
||||||
# Add PATH modifications to the Powershell profile. This is the win equivalent of .bash_profile.
|
|
||||||
# https://docs.microsoft.com/en-us/previous-versions//bb613488(v=vs.85)
|
|
||||||
new-item -path $profile -itemtype file -force
|
|
||||||
# Paths for nodejs, npm, yarn, and msys2. Use single quotes to prevent interpolation.
|
|
||||||
# Add before the original path to use msys2 instead of the installed gitbash.
|
|
||||||
Add-Content $profile '$Env:path = "${Env:ProgramFiles}\nodejs\;C:\Users\circleci\AppData\Roaming\npm\;${Env:ProgramFiles(x86)}\Yarn\bin\;C:\Users\circleci\AppData\Local\Yarn\bin\;C:\tools\msys64\usr\bin\;" + $Env:path'
|
|
||||||
# Environment variables for Bazel
|
|
||||||
Add-Content $profile '$Env:BAZEL_SH = "C:\tools\msys64\usr\bin\bash.exe"'
|
|
||||||
|
|
||||||
# Get the bazel version devdep and store it in a global var for use in the circleci job.
|
|
||||||
$bazelVersion = & ${Env:ProgramFiles}\nodejs\node.exe -e "console.log(require('./package.json').devDependencies['@bazel/bazel'])"
|
|
||||||
# This is a tricky situation: we want $bazelVersion to be evaluated but not $Env:BAZEL_VERSION.
|
|
||||||
# Formatting works https://stackoverflow.com/questions/32127583/expand-variable-inside-single-quotes
|
|
||||||
$bazelVersionGlobalVar = '$Env:BAZEL_VERSION = "{0}"' -f $bazelVersion
|
|
||||||
Add-Content $profile $bazelVersionGlobalVar
|
|
||||||
|
|
||||||
# Remove the CircleCI checkout SSH override, because it breaks cloning repositories through Bazel.
|
|
||||||
# See https://circleci.com/gh/angular/angular/401454 for an example.
|
|
||||||
# TODO: is this really needed? Maybe there's a better way. It doesn't happen on Linux or on Codefresh.
|
|
||||||
git config --global --unset url.ssh://git@github.com.insteadOf
|
|
||||||
|
|
||||||
|
|
||||||
# These Bazel prereqs aren't needed because the CircleCI image already includes them.
|
|
||||||
# choco install nodejs --version 10.16.0 --no-progress
|
|
||||||
# choco install yarn --version 1.16.0 --no-progress
|
|
||||||
# choco install vcredist2015 --version 14.0.24215.20170201
|
|
||||||
|
|
||||||
# We don't need VS Build Tools for the tested bazel targets.
|
|
||||||
# If it's needed again, uncomment these lines.
|
|
||||||
# VS Build Tools are needed for Bazel C++ targets (like com_google_protobuf)
|
|
||||||
# choco install visualstudio2019buildtools --version 16.1.2.0 --no-progress --package-parameters "--add Microsoft.VisualStudio.Workload.VCTools --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64 --add Microsoft.Component.VC.Runtime.UCRTSDK --add Microsoft.VisualStudio.Component.Windows10SDK.17763"
|
|
||||||
# Add-Content $profile '$Env:BAZEL_VC = "${Env:ProgramFiles(x86)}\Microsoft Visual Studio\2019\BuildTools\VC\"'
|
|
||||||
# Python is needed for Bazel Python targets
|
|
||||||
# choco install python --version 3.5.1 --no-progress
|
|
103
.codefresh/Dockerfile.win-1809
Normal file
103
.codefresh/Dockerfile.win-1809
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
ARG core=mcr.microsoft.com/windows/servercore:1809
|
||||||
|
ARG target=mcr.microsoft.com/powershell:windowsservercore-1809
|
||||||
|
|
||||||
|
FROM $core as download
|
||||||
|
|
||||||
|
ARG node_version=10.13.0
|
||||||
|
ARG yarn_version=1.13.0
|
||||||
|
|
||||||
|
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
|
||||||
|
|
||||||
|
ENV GPG_VERSION 2.3.4
|
||||||
|
|
||||||
|
RUN Invoke-WebRequest $('https://files.gpg4win.org/gpg4win-vanilla-{0}.exe' -f $env:GPG_VERSION) -OutFile 'gpg4win.exe' -UseBasicParsing ; \
|
||||||
|
Start-Process .\gpg4win.exe -ArgumentList '/S' -NoNewWindow -Wait
|
||||||
|
|
||||||
|
RUN @( \
|
||||||
|
'94AE36675C464D64BAFA68DD7434390BDBE9B9C5', \
|
||||||
|
'FD3A5288F042B6850C66B31F09FE44734EB7990E', \
|
||||||
|
'71DCFD284A79C3B38668286BC97EC7A07EDE3FC1', \
|
||||||
|
'DD8F2338BAE7501E3DD5AC78C273792F7D83545D', \
|
||||||
|
'C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8', \
|
||||||
|
'B9AE9905FFD7803F25714661B63B535A4C206CA9', \
|
||||||
|
'77984A986EBC2AA786BC0F66B01FBB92821C587A', \
|
||||||
|
'8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600', \
|
||||||
|
'4ED778F539E3634C779C87C6D7062848A1AB005C', \
|
||||||
|
'A48C2BEE680E841632CD4E44F07496B3EB3C1762', \
|
||||||
|
'B9E2F5981AA6E0CD28160D9FF13993A75599653C' \
|
||||||
|
) | foreach { \
|
||||||
|
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys $_ ; \
|
||||||
|
}
|
||||||
|
|
||||||
|
ENV NODE_VERSION=$node_version
|
||||||
|
|
||||||
|
RUN Invoke-WebRequest $('https://nodejs.org/dist/v{0}/SHASUMS256.txt.asc' -f $env:NODE_VERSION) -OutFile 'SHASUMS256.txt.asc' -UseBasicParsing ; \
|
||||||
|
gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc
|
||||||
|
|
||||||
|
RUN Invoke-WebRequest $('https://nodejs.org/dist/v{0}/node-v{0}-win-x64.zip' -f $env:NODE_VERSION) -OutFile 'node.zip' -UseBasicParsing ; \
|
||||||
|
$sum = $(cat SHASUMS256.txt.asc | sls $(' node-v{0}-win-x64.zip' -f $env:NODE_VERSION)) -Split ' ' ; \
|
||||||
|
if ((Get-FileHash node.zip -Algorithm sha256).Hash -ne $sum[0]) { Write-Error 'SHA256 mismatch' } ; \
|
||||||
|
Expand-Archive node.zip -DestinationPath C:\ ; \
|
||||||
|
Rename-Item -Path $('C:\node-v{0}-win-x64' -f $env:NODE_VERSION) -NewName 'C:\nodejs'
|
||||||
|
|
||||||
|
ENV YARN_VERSION=$yarn_version
|
||||||
|
|
||||||
|
RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 ; \
|
||||||
|
Invoke-WebRequest $('https://yarnpkg.com/downloads/{0}/yarn-{0}.msi' -f $env:YARN_VERSION) -OutFile yarn.msi -UseBasicParsing ; \
|
||||||
|
$sig = Get-AuthenticodeSignature yarn.msi ; \
|
||||||
|
if ($sig.Status -ne 'Valid') { Write-Error 'Authenticode signature is not valid' } ; \
|
||||||
|
Write-Output $sig.SignerCertificate.Thumbprint ; \
|
||||||
|
if (@( \
|
||||||
|
'7E253367F8A102A91D04829E37F3410F14B68A5F', \
|
||||||
|
'AF764E1EA56C762617BDC757C8B0F3780A0CF5F9' \
|
||||||
|
) -notcontains $sig.SignerCertificate.Thumbprint) { Write-Error 'Unknown signer certificate' } ; \
|
||||||
|
Start-Process msiexec.exe -ArgumentList '/i', 'yarn.msi', '/quiet', '/norestart' -NoNewWindow -Wait
|
||||||
|
|
||||||
|
ENV GIT_VERSION 2.20.1
|
||||||
|
ENV GIT_DOWNLOAD_URL https://github.com/git-for-windows/git/releases/download/v${GIT_VERSION}.windows.1/MinGit-${GIT_VERSION}-busybox-64-bit.zip
|
||||||
|
ENV GIT_SHA256 9817ab455d9cbd0b09d8664b4afbe4bbf78d18b556b3541d09238501a749486c
|
||||||
|
|
||||||
|
RUN [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 ; \
|
||||||
|
Invoke-WebRequest -UseBasicParsing $env:GIT_DOWNLOAD_URL -OutFile git.zip; \
|
||||||
|
if ((Get-FileHash git.zip -Algorithm sha256).Hash -ne $env:GIT_SHA256) {exit 1} ; \
|
||||||
|
Expand-Archive git.zip -DestinationPath C:\git; \
|
||||||
|
Remove-Item git.zip
|
||||||
|
|
||||||
|
FROM $target as baseimage
|
||||||
|
|
||||||
|
ENV NPM_CONFIG_LOGLEVEL info
|
||||||
|
|
||||||
|
COPY --from=download /nodejs /nodejs
|
||||||
|
COPY --from=download [ "/Program Files (x86)/yarn", "/yarn" ]
|
||||||
|
COPY --from=download /git /git
|
||||||
|
|
||||||
|
ARG SETX=/M
|
||||||
|
RUN setx %SETX% PATH "%PATH%;C:\nodejs;C:\yarn\bin;C:\git\cmd;C:\git\mingw64\bin;C:\git\usr\bin"
|
||||||
|
|
||||||
|
CMD [ "node.exe" ]
|
||||||
|
|
||||||
|
FROM baseimage
|
||||||
|
|
||||||
|
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]
|
||||||
|
|
||||||
|
RUN Invoke-WebRequest -UseBasicParsing 'https://www.7-zip.org/a/7z1805-x64.exe' -OutFile 7z.exe; \
|
||||||
|
Start-Process -FilePath 'C:\\7z.exe' -ArgumentList '/S', '/D=C:\\7zip0' -NoNewWindow -Wait; \
|
||||||
|
Invoke-WebRequest -UseBasicParsing 'http://repo.msys2.org/distrib/x86_64/msys2-base-x86_64-20180531.tar.xz' -OutFile msys2.tar.xz; \
|
||||||
|
Start-Process -FilePath 'C:\\7zip\\7z' -ArgumentList 'e', 'msys2.tar.xz' -Wait; \
|
||||||
|
Start-Process -FilePath 'C:\\7zip\\7z' -ArgumentList 'x', 'msys2.tar', '-oC:\\' -Wait; \
|
||||||
|
Remove-Item msys2.tar.xz; \
|
||||||
|
Remove-Item msys2.tar; \
|
||||||
|
Remove-Item 7z.exe; \
|
||||||
|
Remove-Item -Recurse 7zip; \
|
||||||
|
[Environment]::SetEnvironmentVariable('Path', $env:Path + ';C:\msys64\usr\bin', [System.EnvironmentVariableTarget]::Machine); \
|
||||||
|
[Environment]::SetEnvironmentVariable('BAZEL_SH', 'C:\msys64\usr\bin\bash.exe', [System.EnvironmentVariableTarget]::Machine); \
|
||||||
|
Invoke-WebRequest -UseBasicParsing 'https://download.microsoft.com/download/9/3/F/93FCF1E7-E6A4-478B-96E7-D4B285925B00/vc_redist.x64.exe' -OutFile vc_redist.x64.exe; \
|
||||||
|
Start-Process 'c:\\vc_redist.x64.exe' -ArgumentList '/Install', '/Passive', '/NoRestart' -NoNewWindow -Wait; \
|
||||||
|
Remove-Item vc_redist.x64.exe
|
||||||
|
|
||||||
|
# Add a fix for https://github.com/docker/for-win/issues/2920 as entry point to the container.
|
||||||
|
SHELL ["cmd", "/c"]
|
||||||
|
COPY "fix-msys64.cmd" "C:\\fix-msys64.cmd"
|
||||||
|
ENTRYPOINT cmd /C C:\\fix-msys64.cmd && cmd /c
|
||||||
|
|
||||||
|
CMD ["cmd.exe"]
|
33
.codefresh/README.md
Normal file
33
.codefresh/README.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# CodeFresh configuration
|
||||||
|
|
||||||
|
[](https://g.codefresh.io/public/accounts/angular/pipelines/angular/angular/angular)
|
||||||
|
|
||||||
|
This folder contains configuration for the [CodeFresh](<https://codefresh.io/>) based CI checks for this repository.
|
||||||
|
|
||||||
|
## The build pipeline
|
||||||
|
|
||||||
|
CodeFresh uses a several pipeline for each repository. The `codefresh.yml` file defines pipeline [build steps](https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines/) for this repository.
|
||||||
|
|
||||||
|
Run results can be seen in the GitHub checks interface and in the [public pipeline](https://g.codefresh.io/public/accounts/angular/pipelines/angular/angular/angular)
|
||||||
|
|
||||||
|
Although most configuration is done via `pipeline.yml`, some options are only available in the online [pipeline settings](https://g.codefresh.io/pipelines/angular/services?repoOwner=angular&repoName=angular&project=angular%2Fangular&context=github&serviceName=angular%2Fangular), which needs a login to access.
|
||||||
|
|
||||||
|
|
||||||
|
## Caretaker
|
||||||
|
|
||||||
|
CodeFresh status can be found at <http://status.codefresh.io/>.
|
||||||
|
|
||||||
|
Issues related to the CodeFresh setup should be escalated to the Tools Team via the current caretaker, followed by Alex Eagle and Filipe Silva.
|
||||||
|
|
||||||
|
## Rollout strategy
|
||||||
|
|
||||||
|
Currently it is only used for tests on Windows platforms, on the master branch, and without pushing user-facing reports. It's only possible to see current builds in the [public pipeline dashboard](https://g.codefresh.io/public/accounts/angular/pipelines/angular/angular/angular).
|
||||||
|
|
||||||
|
After a week or two of running like this, we should reassess how stable and reliable it is.
|
||||||
|
|
||||||
|
Next steps include:
|
||||||
|
- building PRs
|
||||||
|
- showing build status publicly
|
||||||
|
- blocking PRs that break the build
|
||||||
|
- expanding the test suite
|
||||||
|
|
42
.codefresh/bazel.rc
Normal file
42
.codefresh/bazel.rc
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
# These options are enabled when running on CI
|
||||||
|
# We do this by copying this file to /etc/bazel.bazelrc at the start of the build.
|
||||||
|
# See documentation in /docs/BAZEL.md
|
||||||
|
|
||||||
|
# Save downloaded repositories in a location that can be cached by CodeFresh and shared between
|
||||||
|
# builds. This helps speed up the analysis time significantly with Bazel managed node dependencies
|
||||||
|
# on the CI.
|
||||||
|
# https://codefresh.io/docs/docs/configure-ci-cd-pipeline/introduction-to-codefresh-pipelines/#caching-the-artifacts-of-your-build-system
|
||||||
|
build --repository_cache=C:/codefresh/volume/bazel_repository_cache
|
||||||
|
|
||||||
|
# Don't be spammy in the logs
|
||||||
|
# TODO(gmagolan): Hide progress again once build performance improves
|
||||||
|
# Presently, CircleCI can timeout during bazel test ... with the following
|
||||||
|
# error: Too long with no output (exceeded 10m0s)
|
||||||
|
build --noshow_progress
|
||||||
|
|
||||||
|
# Print all the options that apply to the build.
|
||||||
|
# This helps us diagnose which options override others
|
||||||
|
# (e.g. /etc/bazel.bazelrc vs. tools/bazel.rc)
|
||||||
|
build --announce_rc
|
||||||
|
|
||||||
|
# Workaround https://github.com/bazelbuild/bazel/issues/3645
|
||||||
|
# Bazel doesn't calculate the memory ceiling correctly when running under Docker.
|
||||||
|
# Limit Bazel to consuming resources that fit in CodeFresh VMs
|
||||||
|
# TODO(filipesilva): determine the correct memory limit
|
||||||
|
build --local_resources=8000,8.0,1.0
|
||||||
|
|
||||||
|
# Retry in the event of flakes, eg. https://circleci.com/gh/angular/angular/31309
|
||||||
|
test --flaky_test_attempts=2
|
||||||
|
|
||||||
|
# More details on failures
|
||||||
|
build --verbose_failures=true
|
||||||
|
|
||||||
|
# Include PATH in Windows build/tests
|
||||||
|
# https://github.com/bazelbuild/rules_typescript/pull/356
|
||||||
|
build --action_env=PATH
|
||||||
|
test --action_env=PATH --test_env=PATH
|
||||||
|
|
||||||
|
# Exclude tests known to not work on Windows.
|
||||||
|
|
||||||
|
# Chrome web tests are currently broken.
|
||||||
|
test --test_tag_filters=-browser:chromium-local
|
26
.codefresh/codefresh.yml
Normal file
26
.codefresh/codefresh.yml
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
version: '1.0'
|
||||||
|
|
||||||
|
steps:
|
||||||
|
BuildImage:
|
||||||
|
type: build
|
||||||
|
image_name: node-bazel-windows
|
||||||
|
working_directory: ./.codefresh
|
||||||
|
no_cf_cache: true
|
||||||
|
build_arguments:
|
||||||
|
- node_version=10.13.0
|
||||||
|
- yarn_version=1.13.0
|
||||||
|
dockerfile: ./Dockerfile.win-1809
|
||||||
|
|
||||||
|
RunTests:
|
||||||
|
title: Run Example
|
||||||
|
image: ${{BuildImage}}
|
||||||
|
commands:
|
||||||
|
# Install dependencies
|
||||||
|
- yarn install --frozen-lockfile --non-interactive --network-timeout 100000 --no-progress
|
||||||
|
# Add Bazel CI config
|
||||||
|
- copy .codefresh\bazel.rc %ProgramData%\bazel.bazelrc
|
||||||
|
# Run tests
|
||||||
|
- yarn bazel test //tools/ts-api-guardian:all //packages/language-service/test //packages/compiler/test //packages/compiler-cli/test:ngc //packages/compiler-cli/test/ngtsc:ngtsc
|
||||||
|
- yarn test-ivy-aot //packages/animations/test //packages/common/test //packages/forms/test //packages/http/test //packages/platform-browser/test //packages/platform-browser-dynamic/test //packages/router/test
|
||||||
|
- yarn bazel test //tools/public_api_guard/...
|
||||||
|
- yarn bazel test //packages/compiler-cli/integrationtest:integrationtest //packages/compiler-cli/test/compliance:compliance
|
6
.codefresh/fix-msys64.cmd
Normal file
6
.codefresh/fix-msys64.cmd
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
@echo off
|
||||||
|
REM Fix for https://github.com/docker/for-win/issues/2920
|
||||||
|
REM echo "Fixing msys64 folder..."
|
||||||
|
REM Touch all .dll files inside C:\msys64\
|
||||||
|
forfiles /p C:\msys64\ /s /m *.dll /c "cmd /c Copy /B @path+,, >NUL"
|
||||||
|
REM echo "Fixed msys64 folder."
|
174
.github/CODEOWNERS
vendored
174
.github/CODEOWNERS
vendored
@ -44,19 +44,23 @@
|
|||||||
# alxhub - Alex Rickabaugh
|
# alxhub - Alex Rickabaugh
|
||||||
# AndrewKushnir - Andrew Kushnir
|
# AndrewKushnir - Andrew Kushnir
|
||||||
# andrewseguin - Andrew Seguin
|
# andrewseguin - Andrew Seguin
|
||||||
# atscott - Andrew Scott
|
# benlesh - Ben Lesh
|
||||||
|
# brandonroberts - Brandon Roberts
|
||||||
# devversion - Paul Gschwendtner
|
# devversion - Paul Gschwendtner
|
||||||
# filipesilva - Filipe Silva
|
# filipesilva - Filipe Silva
|
||||||
# gkalpak - George Kalpakas
|
# gkalpak - George Kalpakas
|
||||||
|
# hansl - Hans Larsen
|
||||||
# IgorMinar - Igor Minar
|
# IgorMinar - Igor Minar
|
||||||
|
# jasonaden - Jason Aden
|
||||||
|
# jenniferfell - Jennifer Fell
|
||||||
# JiaLiPassion - Jia Li
|
# JiaLiPassion - Jia Li
|
||||||
# josephperrott - Joey Perrott
|
# josephperrott - Joey Perrott
|
||||||
# kapunahelewong - Kapunahele Wong
|
|
||||||
# kara - Kara Erickson
|
# kara - Kara Erickson
|
||||||
# kyliau - Keen Yee Liau
|
# kyliau - Keen Yee Liau
|
||||||
# matsko - Matias Niemelä
|
# matsko - Matias Niemelä
|
||||||
# mgechev - Minko Gechev
|
# mgechev - Minko Gechev
|
||||||
# mhevery - Misko Hevery
|
# mhevery - Misko Hevery
|
||||||
|
# ocombe - Olivier Combe
|
||||||
# petebacondarwin - Pete Bacon Darwin
|
# petebacondarwin - Pete Bacon Darwin
|
||||||
# pkozlowski-opensource - Pawel Kozlowski
|
# pkozlowski-opensource - Pawel Kozlowski
|
||||||
# robwormald - Rob Wormald
|
# robwormald - Rob Wormald
|
||||||
@ -84,9 +88,9 @@
|
|||||||
# (secret team to avoid review requests, it also doesn't inherit from @angular/framework because nested teams can't be secret)
|
# (secret team to avoid review requests, it also doesn't inherit from @angular/framework because nested teams can't be secret)
|
||||||
#
|
#
|
||||||
# - IgorMinar
|
# - IgorMinar
|
||||||
# - josephperrott
|
|
||||||
# - kara
|
# - kara
|
||||||
# - mhevery
|
# - mhevery
|
||||||
|
# - alexeagle
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
@ -95,8 +99,9 @@
|
|||||||
# Used for approving minor documentation-only changes that don't require engineering review.
|
# Used for approving minor documentation-only changes that don't require engineering review.
|
||||||
# (secret team to avoid review requests, it also doesn't inherit from @angular/framework because nested teams can't be secret)
|
# (secret team to avoid review requests, it also doesn't inherit from @angular/framework because nested teams can't be secret)
|
||||||
#
|
#
|
||||||
|
# - brandonroberts
|
||||||
# - gkalpak
|
# - gkalpak
|
||||||
# - kapunahelewong
|
# - jenniferfell
|
||||||
# - petebacondarwin
|
# - petebacondarwin
|
||||||
|
|
||||||
|
|
||||||
@ -121,9 +126,10 @@
|
|||||||
# @angular/tools-cli
|
# @angular/tools-cli
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
|
# - alexeagle
|
||||||
# - filipesilva
|
# - filipesilva
|
||||||
|
# - hansl
|
||||||
# - mgechev
|
# - mgechev
|
||||||
# - vikerman
|
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
@ -174,7 +180,8 @@
|
|||||||
# @angular/fw-forms
|
# @angular/fw-forms
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
# - AndrewKushnir
|
# - kara
|
||||||
|
# - jasonaden
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
@ -196,7 +203,7 @@
|
|||||||
# @angular/fw-router
|
# @angular/fw-router
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
# - atscott
|
# - jasonaden
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
@ -214,6 +221,7 @@
|
|||||||
#
|
#
|
||||||
# - gkalpak
|
# - gkalpak
|
||||||
# - petebacondarwin
|
# - petebacondarwin
|
||||||
|
# - jasonaden
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
@ -229,7 +237,7 @@
|
|||||||
#
|
#
|
||||||
# - AndrewKushnir
|
# - AndrewKushnir
|
||||||
# - mhevery
|
# - mhevery
|
||||||
# - petebacondarwin
|
# - ocombe
|
||||||
# - vikerman
|
# - vikerman
|
||||||
|
|
||||||
|
|
||||||
@ -261,8 +269,8 @@
|
|||||||
# @angular/fw-integration
|
# @angular/fw-integration
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
|
# - alexeagle
|
||||||
# - IgorMinar
|
# - IgorMinar
|
||||||
# - josephperrott
|
|
||||||
# - mhevery
|
# - mhevery
|
||||||
|
|
||||||
|
|
||||||
@ -270,6 +278,7 @@
|
|||||||
# @angular/docs-infra
|
# @angular/docs-infra
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
|
# - brandonroberts
|
||||||
# - gkalpak
|
# - gkalpak
|
||||||
# - IgorMinar
|
# - IgorMinar
|
||||||
# - petebacondarwin
|
# - petebacondarwin
|
||||||
@ -279,6 +288,8 @@
|
|||||||
# @angular/fw-docs-intro
|
# @angular/fw-docs-intro
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
|
# - jenniferfell
|
||||||
|
# - brandonroberts
|
||||||
# - IgorMinar
|
# - IgorMinar
|
||||||
# - stephenfluin
|
# - stephenfluin
|
||||||
|
|
||||||
@ -287,15 +298,16 @@
|
|||||||
# @angular/fw-docs-observables
|
# @angular/fw-docs-observables
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
# - alxhub
|
# - benlesh
|
||||||
|
# - jasonaden
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
# @angular/fw-docs-packaging
|
# @angular/fw-docs-packaging
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
|
# - alexeagle
|
||||||
# - IgorMinar
|
# - IgorMinar
|
||||||
# - vikerman
|
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
@ -303,9 +315,10 @@
|
|||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
# - alan-agius4
|
# - alan-agius4
|
||||||
|
# - alexeagle
|
||||||
|
# - hansl
|
||||||
# - IgorMinar
|
# - IgorMinar
|
||||||
# - mgechev
|
# - mgechev
|
||||||
# - vikerman
|
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
@ -313,9 +326,11 @@
|
|||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
# - alan-agius4
|
# - alan-agius4
|
||||||
|
# - alexeagle
|
||||||
|
# - hansl
|
||||||
# - IgorMinar
|
# - IgorMinar
|
||||||
# - mgechev
|
# - mgechev
|
||||||
# - vikerman
|
|
||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
@ -334,9 +349,10 @@
|
|||||||
|
|
||||||
|
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
# @angular/dev-infra-framework
|
# @angular/fw-dev-infra
|
||||||
# ===========================================================
|
# ===========================================================
|
||||||
#
|
#
|
||||||
|
# - alexeagle
|
||||||
# - devversion
|
# - devversion
|
||||||
# - filipesilva
|
# - filipesilva
|
||||||
# - gkalpak
|
# - gkalpak
|
||||||
@ -368,44 +384,6 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
|
||||||
# Build, CI & Dev-infra Owners
|
|
||||||
# ================================================
|
|
||||||
|
|
||||||
/* @angular/dev-infra-framework
|
|
||||||
/.buildkite/** @angular/dev-infra-framework
|
|
||||||
/.circleci/** @angular/dev-infra-framework
|
|
||||||
/.devcontainer/** @angular/dev-infra-framework
|
|
||||||
/.github/** @angular/dev-infra-framework
|
|
||||||
/.vscode/** @angular/dev-infra-framework
|
|
||||||
/docs/BAZEL.md @angular/dev-infra-framework
|
|
||||||
/packages/* @angular/dev-infra-framework
|
|
||||||
/packages/examples/test-utils/** @angular/dev-infra-framework
|
|
||||||
/packages/private/** @angular/dev-infra-framework
|
|
||||||
/scripts/** @angular/dev-infra-framework
|
|
||||||
/third_party/** @angular/dev-infra-framework
|
|
||||||
/tools/build/** @angular/dev-infra-framework
|
|
||||||
/tools/cjs-jasmine/** @angular/dev-infra-framework
|
|
||||||
/tools/gulp-tasks/** @angular/dev-infra-framework
|
|
||||||
/tools/ngcontainer/** @angular/dev-infra-framework
|
|
||||||
/tools/npm/** @angular/dev-infra-framework
|
|
||||||
/tools/npm_workspace/** @angular/dev-infra-framework
|
|
||||||
/tools/public_api_guard/** @angular/dev-infra-framework
|
|
||||||
/tools/rxjs/** @angular/dev-infra-framework
|
|
||||||
/tools/size-tracking/** @angular/dev-infra-framework
|
|
||||||
/tools/source-map-test/** @angular/dev-infra-framework
|
|
||||||
/tools/symbol-extractor/** @angular/dev-infra-framework
|
|
||||||
/tools/testing/** @angular/dev-infra-framework
|
|
||||||
/tools/ts-api-guardian/** @angular/dev-infra-framework
|
|
||||||
/tools/tslint/** @angular/dev-infra-framework
|
|
||||||
/tools/validate-commit-message/** @angular/dev-infra-framework
|
|
||||||
/tools/yarn/** @angular/dev-infra-framework
|
|
||||||
/tools/* @angular/dev-infra-framework
|
|
||||||
*.BAZEL @angular/dev-infra-framework
|
|
||||||
*.bzl @angular/dev-infra-framework
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
# @angular/animations
|
# @angular/animations
|
||||||
# ================================================
|
# ================================================
|
||||||
@ -432,7 +410,6 @@
|
|||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
/packages/bazel/** @angular/tools-bazel @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/bazel/** @angular/tools-bazel @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/bazel.md @angular/tools-bazel @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -442,12 +419,8 @@
|
|||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
/packages/compiler/** @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/compiler/** @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/examples/compiler/** @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/packages/compiler-cli/** @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/compiler-cli/** @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/angular-compiler-options.md @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/aot-compiler.md @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/aot-compiler.md @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/aot-metadata-errors.md @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/template-typecheck.md @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -456,7 +429,6 @@
|
|||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
/packages/compiler-cli/ngcc/** @angular/fw-ngcc @angular/framework-global-approvers
|
/packages/compiler-cli/ngcc/** @angular/fw-ngcc @angular/framework-global-approvers
|
||||||
/aio/content/guide/ngcc.md @angular/fw-ngcc @angular/framework-global-approvers
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -467,11 +439,11 @@
|
|||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
/packages/compiler-cli/src/ngtools/** @angular/tools-cli @angular/framework-global-approvers
|
/packages/compiler-cli/src/ngtools/** @angular/tools-cli @angular/framework-global-approvers
|
||||||
/aio/content/guide/cli-builder.md @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/ivy.md @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/ivy.md @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/web-worker.md @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/web-worker.md @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
# @angular/core
|
# @angular/core
|
||||||
# @angular/common (except @angular/common/http)
|
# @angular/common (except @angular/common/http)
|
||||||
@ -482,18 +454,12 @@
|
|||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
/packages/core/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/core/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/examples/core/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/packages/common/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/common/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/platform-browser/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/platform-browser/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/examples/platform-browser/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/packages/platform-browser-dynamic/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/platform-browser-dynamic/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/platform-webworker/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/platform-webworker/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/platform-webworker-dynamic/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/platform-webworker-dynamic/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/examples/common/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/examples/common/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/docs/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
|
|
||||||
/aio/content/guide/accessibility.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/examples/accessibility/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
|
|
||||||
/aio/content/guide/architecture-components.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/architecture-components.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/architecture-modules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/architecture-modules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
@ -550,8 +516,6 @@
|
|||||||
|
|
||||||
/aio/content/guide/hierarchical-dependency-injection.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/hierarchical-dependency-injection.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/hierarchical-dependency-injection/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/hierarchical-dependency-injection/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/providers-viewproviders/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/examples/resolution-modifiers/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
|
|
||||||
/aio/content/guide/lazy-loading-ngmodules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/lazy-loading-ngmodules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/lazy-loading-ngmodules/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/lazy-loading-ngmodules/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
@ -586,12 +550,11 @@
|
|||||||
/aio/content/examples/attribute-binding/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/attribute-binding/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/two-way-binding/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/two-way-binding/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/built-in-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/built-in-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/built-in-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/examples/template-reference-variables/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/template-reference-variables/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/inputs-outputs/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/inputs-outputs/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/inputs-outputs/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/examples/template-expression-operators/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/template-expression-operators/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
|
|
||||||
|
|
||||||
/aio/content/guide/pipes.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/pipes.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/pipes/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/pipes/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/pipes/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/images/guide/pipes/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
@ -624,7 +587,6 @@
|
|||||||
|
|
||||||
/packages/common/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/common/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/examples/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/http.md @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/http.md @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/images/guide/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
@ -647,7 +609,6 @@
|
|||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
/packages/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/examples/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/forms.md @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/forms.md @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/images/guide/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
@ -691,7 +652,6 @@
|
|||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
/packages/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/examples/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/router.md @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/router.md @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/images/guide/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
@ -703,7 +663,6 @@
|
|||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
/packages/service-worker/** @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/service-worker/** @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/examples/service-worker/** @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/service-worker-getting-started.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/service-worker-getting-started.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/service-worker-getting-started/** @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/service-worker-getting-started/** @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/app-shell.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/app-shell.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
@ -730,7 +689,6 @@
|
|||||||
/aio/content/examples/upgrade-phonecat-2-hybrid/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/upgrade-phonecat-2-hybrid/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/upgrade-phonecat-3-final/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/upgrade-phonecat-3-final/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/upgrade-performance.md @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/upgrade-performance.md @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/upgrade-setup.md @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/ajs-quick-reference.md @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/ajs-quick-reference.md @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/ajs-quick-reference/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/ajs-quick-reference/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
|
|
||||||
@ -764,11 +722,11 @@ testing/** @angular/fw-test
|
|||||||
/packages/compiler/src/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/compiler/src/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/compiler/src/render3/view/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/compiler/src/render3/view/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/compiler-cli/src/extract_i18n.ts @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/packages/compiler-cli/src/extract_i18n.ts @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/packages/localize/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/i18n.md @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/i18n.md @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
# @angular security
|
# @angular security
|
||||||
# ================================================
|
# ================================================
|
||||||
@ -819,6 +777,7 @@ testing/** @angular/fw-test
|
|||||||
/aio/tools/** @angular/docs-infra @angular/framework-global-approvers
|
/aio/tools/** @angular/docs-infra @angular/framework-global-approvers
|
||||||
|
|
||||||
# Hidden docs
|
# Hidden docs
|
||||||
|
/aio/content/guide/change-log.md @angular/docs-infra @angular/framework-global-approvers
|
||||||
/aio/content/guide/docs-style-guide.md @angular/docs-infra @angular/framework-global-approvers
|
/aio/content/guide/docs-style-guide.md @angular/docs-infra @angular/framework-global-approvers
|
||||||
/aio/content/examples/docs-style-guide/** @angular/docs-infra @angular/framework-global-approvers
|
/aio/content/examples/docs-style-guide/** @angular/docs-infra @angular/framework-global-approvers
|
||||||
/aio/content/images/guide/docs-style-guide/** @angular/docs-infra @angular/framework-global-approvers
|
/aio/content/images/guide/docs-style-guide/** @angular/docs-infra @angular/framework-global-approvers
|
||||||
@ -831,8 +790,9 @@ testing/** @angular/fw-test
|
|||||||
# Docs: getting started & tutorial
|
# Docs: getting started & tutorial
|
||||||
# ================================================
|
# ================================================
|
||||||
|
|
||||||
/aio/content/guide/setup-local.md @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/quickstart.md @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/setup-local/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/cli-quickstart/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
|
/aio/content/images/guide/cli-quickstart/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/tutorial/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/tutorial/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/toh/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/images/guide/toh/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/toh-pt0/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/toh-pt0/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
@ -844,8 +804,8 @@ testing/** @angular/fw-test
|
|||||||
/aio/content/examples/toh-pt6/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/toh-pt6/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/getting-started-v0/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/getting-started-v0/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/getting-started/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/getting-started/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/start/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/getting-started/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/start/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/images/guide/getting-started/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
@ -871,26 +831,17 @@ testing/** @angular/fw-test
|
|||||||
/aio/content/guide/npm-packages.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/npm-packages.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/browser-support.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/browser-support.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/typescript-configuration.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/typescript-configuration.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
|
/aio/content/guide/setup.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/examples/setup/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/examples/setup/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/build.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/build.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/build/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/images/guide/build/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/deployment.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/deployment.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/images/guide/deployment/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/file-structure.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/file-structure.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/releases.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/releases.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/updating.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/updating.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/workspace-config.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/workspace-config.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/deprecations.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
/aio/content/guide/deprecations.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
||||||
/aio/content/guide/migration-renderer.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/migration-undecorated-classes.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/migration-dynamic-flag.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/migration-injectable.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/migration-localize.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/migration-module-with-providers.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/migration-ngcc.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/updating-to-version-9.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/ivy-compatibility.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
/aio/content/guide/ivy-compatibility-examples.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
@ -926,6 +877,41 @@ testing/** @angular/fw-test
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# ================================================
|
||||||
|
# Build & CI Owners
|
||||||
|
# ================================================
|
||||||
|
|
||||||
|
/* @angular/fw-dev-infra
|
||||||
|
/.buildkite/** @angular/fw-dev-infra
|
||||||
|
/.circleci/** @angular/fw-dev-infra
|
||||||
|
/.codefresh/** @angular/fw-dev-infra
|
||||||
|
/.devcontainer/** @angular/fw-dev-infra
|
||||||
|
/.github/** @angular/fw-dev-infra
|
||||||
|
/.vscode/** @angular/fw-dev-infra
|
||||||
|
/docs/BAZEL.md @angular/fw-dev-infra
|
||||||
|
/packages/* @angular/fw-dev-infra
|
||||||
|
/scripts/** @angular/fw-dev-infra
|
||||||
|
/third_party/** @angular/fw-dev-infra
|
||||||
|
/tools/build/** @angular/fw-dev-infra
|
||||||
|
/tools/cjs-jasmine/** @angular/fw-dev-infra
|
||||||
|
/tools/gulp-tasks/** @angular/fw-dev-infra
|
||||||
|
/tools/ngcontainer/** @angular/fw-dev-infra
|
||||||
|
/tools/npm/** @angular/fw-dev-infra
|
||||||
|
/tools/npm_workspace/** @angular/fw-dev-infra
|
||||||
|
/tools/public_api_guard/** @angular/fw-dev-infra
|
||||||
|
/tools/rxjs/** @angular/fw-dev-infra
|
||||||
|
/tools/source-map-test/** @angular/fw-dev-infra
|
||||||
|
/tools/symbol-extractor/** @angular/fw-dev-infra
|
||||||
|
/tools/testing/** @angular/fw-dev-infra
|
||||||
|
/tools/ts-api-guardian/** @angular/fw-dev-infra
|
||||||
|
/tools/tslint/** @angular/fw-dev-infra
|
||||||
|
/tools/validate-commit-message/** @angular/fw-dev-infra
|
||||||
|
/tools/yarn/** @angular/fw-dev-infra
|
||||||
|
/tools/*
|
||||||
|
*.bzl @angular/fw-dev-infra
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
# Material CI
|
# Material CI
|
||||||
# ================================================
|
# ================================================
|
||||||
@ -946,14 +932,6 @@ testing/** @angular/fw-test
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
|
||||||
# Special cases
|
|
||||||
# ================================================
|
|
||||||
|
|
||||||
/aio/content/guide/static-query-migration.md @kara @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
# CODEOWNERS Owners owners ...
|
# CODEOWNERS Owners owners ...
|
||||||
# ================================================
|
# ================================================
|
||||||
|
13
.github/ISSUE_TEMPLATE/7-angular-components.md
vendored
13
.github/ISSUE_TEMPLATE/7-angular-components.md
vendored
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
name: "\U0001F48EAngular Components"
|
|
||||||
about: Issues and feature requests for Angular Components
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
|
||||||
|
|
||||||
Please file any Angular Components issues at: https://github.com/angular/components/issues/new
|
|
||||||
|
|
||||||
For the time being, we keep Angular Components issues in a separate repository.
|
|
||||||
|
|
||||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
|
13
.github/ISSUE_TEMPLATE/7-angular-material.md
vendored
Normal file
13
.github/ISSUE_TEMPLATE/7-angular-material.md
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
---
|
||||||
|
name: "\U0001F48EAngular Material"
|
||||||
|
about: Issues and feature requests for Angular Material
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
||||||
|
|
||||||
|
Please file any Angular Material issues at: https://github.com/angular/material2/issues/new
|
||||||
|
|
||||||
|
For the time being, we keep Angular Material issues in a separate repository.
|
||||||
|
|
||||||
|
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
6
.github/angular-robot.yml
vendored
6
.github/angular-robot.yml
vendored
@ -52,7 +52,6 @@ merge:
|
|||||||
- "packages/elements/schematics/**"
|
- "packages/elements/schematics/**"
|
||||||
- "packages/examples/**"
|
- "packages/examples/**"
|
||||||
- "packages/language-service/**"
|
- "packages/language-service/**"
|
||||||
- "packages/localize/**"
|
|
||||||
- "packages/private/**"
|
- "packages/private/**"
|
||||||
- "packages/service-worker/**"
|
- "packages/service-worker/**"
|
||||||
- "**/.gitignore"
|
- "**/.gitignore"
|
||||||
@ -62,15 +61,10 @@ merge:
|
|||||||
- "**/third_party/**"
|
- "**/third_party/**"
|
||||||
- "**/tsconfig-build.json"
|
- "**/tsconfig-build.json"
|
||||||
- "**/tsconfig.json"
|
- "**/tsconfig.json"
|
||||||
- "**/rollup.config.js"
|
|
||||||
- "**/BUILD.bazel"
|
- "**/BUILD.bazel"
|
||||||
- "**/*.md"
|
- "**/*.md"
|
||||||
- "packages/**/integrationtest/**"
|
- "packages/**/integrationtest/**"
|
||||||
- "packages/**/test/**"
|
- "packages/**/test/**"
|
||||||
- "packages/zone.js/*"
|
|
||||||
- "packages/zone.js/doc/**"
|
|
||||||
- "packages/zone.js/example/**"
|
|
||||||
- "packages/zone.js/scripts/**"
|
|
||||||
|
|
||||||
# comment that will be added to a PR when there is a conflict, leave empty or set to false to disable
|
# comment that will be added to a PR when there is a conflict, leave empty or set to false to disable
|
||||||
mergeConflictComment: "Hi @{{PRAuthor}}! This PR has merge conflicts due to recent upstream merges.
|
mergeConflictComment: "Hi @{{PRAuthor}}! This PR has merge conflicts due to recent upstream merges.
|
||||||
|
14
.github/workflows/lock-closed.yml
vendored
14
.github/workflows/lock-closed.yml
vendored
@ -1,14 +0,0 @@
|
|||||||
name: Lock closed inactive issues
|
|
||||||
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
# Run at 16:00 every day
|
|
||||||
- cron: '0 16 * * *'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
lock_closed:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: angular/dev-infra/github-actions/lock-closed@66462f6
|
|
||||||
with:
|
|
||||||
lock-bot-key: ${{ secrets.LOCK_BOT_PRIVATE_KEY }}
|
|
5
.gitignore
vendored
5
.gitignore
vendored
@ -4,7 +4,6 @@
|
|||||||
/bazel-out
|
/bazel-out
|
||||||
/integration/bazel/bazel-*
|
/integration/bazel/bazel-*
|
||||||
e2e_test.*
|
e2e_test.*
|
||||||
*.log
|
|
||||||
node_modules
|
node_modules
|
||||||
tools/gulp-tasks/cldr/cldr-data/
|
tools/gulp-tasks/cldr/cldr-data/
|
||||||
|
|
||||||
@ -21,8 +20,6 @@ pubspec.lock
|
|||||||
*.swo
|
*.swo
|
||||||
modules/.settings
|
modules/.settings
|
||||||
modules/.vscode
|
modules/.vscode
|
||||||
.vimrc
|
|
||||||
.nvimrc
|
|
||||||
|
|
||||||
# Don't check in secret files
|
# Don't check in secret files
|
||||||
*secret.js
|
*secret.js
|
||||||
@ -40,5 +37,3 @@ yarn-error.log
|
|||||||
# User specific bazel settings
|
# User specific bazel settings
|
||||||
.bazelrc.user
|
.bazelrc.user
|
||||||
|
|
||||||
.notes.md
|
|
||||||
baseline.json
|
|
||||||
|
31
BUILD.bazel
31
BUILD.bazel
@ -18,15 +18,15 @@ filegroup(
|
|||||||
name = "web_test_bootstrap_scripts",
|
name = "web_test_bootstrap_scripts",
|
||||||
# do not sort
|
# do not sort
|
||||||
srcs = [
|
srcs = [
|
||||||
"@npm//:node_modules/core-js/client/core.js",
|
"@npm//node_modules/core-js:client/core.js",
|
||||||
"//packages/zone.js/dist:zone.js",
|
"@npm//node_modules/zone.js:dist/zone.js",
|
||||||
"//packages/zone.js/dist:zone-testing.js",
|
"@npm//node_modules/zone.js:dist/zone-testing.js",
|
||||||
"//packages/zone.js/dist:task-tracking.js",
|
"@npm//node_modules/zone.js:dist/task-tracking.js",
|
||||||
"//:test-events.js",
|
"//:test-events.js",
|
||||||
"//:shims_for_IE.js",
|
"//:shims_for_IE.js",
|
||||||
# Including systemjs because it defines `__eval`, which produces correct stack traces.
|
# Including systemjs because it defines `__eval`, which produces correct stack traces.
|
||||||
"@npm//:node_modules/systemjs/dist/system.src.js",
|
"@npm//node_modules/systemjs:dist/system.src.js",
|
||||||
"@npm//:node_modules/reflect-metadata/Reflect.js",
|
"@npm//node_modules/reflect-metadata:Reflect.js",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -35,15 +35,15 @@ filegroup(
|
|||||||
srcs = [
|
srcs = [
|
||||||
# We also declare the unminfied AngularJS files since these can be used for
|
# We also declare the unminfied AngularJS files since these can be used for
|
||||||
# local debugging (e.g. see: packages/upgrade/test/common/test_helpers.ts)
|
# local debugging (e.g. see: packages/upgrade/test/common/test_helpers.ts)
|
||||||
"@npm//:node_modules/angular/angular.js",
|
"@npm//node_modules/angular:angular.js",
|
||||||
"@npm//:node_modules/angular/angular.min.js",
|
"@npm//node_modules/angular:angular.min.js",
|
||||||
"@npm//:node_modules/angular-1.5/angular.js",
|
"@npm//node_modules/angular-1.5:angular.js",
|
||||||
"@npm//:node_modules/angular-1.5/angular.min.js",
|
"@npm//node_modules/angular-1.5:angular.min.js",
|
||||||
"@npm//:node_modules/angular-1.6/angular.js",
|
"@npm//node_modules/angular-1.6:angular.js",
|
||||||
"@npm//:node_modules/angular-1.6/angular.min.js",
|
"@npm//node_modules/angular-1.6:angular.min.js",
|
||||||
"@npm//:node_modules/angular-mocks/angular-mocks.js",
|
"@npm//node_modules/angular-mocks:angular-mocks.js",
|
||||||
"@npm//:node_modules/angular-mocks-1.5/angular-mocks.js",
|
"@npm//node_modules/angular-mocks-1.5:angular-mocks.js",
|
||||||
"@npm//:node_modules/angular-mocks-1.6/angular-mocks.js",
|
"@npm//node_modules/angular-mocks-1.6:angular-mocks.js",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -74,7 +74,6 @@ karma_web_test(
|
|||||||
"//packages/core/test:test_lib",
|
"//packages/core/test:test_lib",
|
||||||
"//packages/forms/test:test_lib",
|
"//packages/forms/test:test_lib",
|
||||||
"//packages/http/test:test_lib",
|
"//packages/http/test:test_lib",
|
||||||
"//packages/zone.js/test:karma_jasmine_test_ci",
|
|
||||||
# "//packages/router/test:test_lib",
|
# "//packages/router/test:test_lib",
|
||||||
# //packages/router/test:test_lib fails with:
|
# //packages/router/test:test_lib fails with:
|
||||||
# IE 11.0.0 (Windows 8.1.0.0) bootstrap should restore the scrolling position FAILED
|
# IE 11.0.0 (Windows 8.1.0.0) bootstrap should restore the scrolling position FAILED
|
||||||
|
1203
CHANGELOG.md
1203
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@ -201,7 +201,7 @@ Must be one of the following:
|
|||||||
* **test**: Adding missing tests or correcting existing tests
|
* **test**: Adding missing tests or correcting existing tests
|
||||||
|
|
||||||
### Scope
|
### Scope
|
||||||
The scope should be the name of the npm package affected (as perceived by the person reading the changelog generated from commit messages).
|
The scope should be the name of the npm package affected (as perceived by the person reading the changelog generated from commit messages.
|
||||||
|
|
||||||
The following is the list of supported scopes:
|
The following is the list of supported scopes:
|
||||||
|
|
||||||
@ -222,7 +222,6 @@ The following is the list of supported scopes:
|
|||||||
* **router**
|
* **router**
|
||||||
* **service-worker**
|
* **service-worker**
|
||||||
* **upgrade**
|
* **upgrade**
|
||||||
* **zone.js**
|
|
||||||
|
|
||||||
There are currently a few exceptions to the "use package name" rule:
|
There are currently a few exceptions to the "use package name" rule:
|
||||||
|
|
||||||
@ -233,7 +232,6 @@ There are currently a few exceptions to the "use package name" rule:
|
|||||||
* **docs-infra**: used for docs-app (angular.io) related changes within the /aio directory of the
|
* **docs-infra**: used for docs-app (angular.io) related changes within the /aio directory of the
|
||||||
repo
|
repo
|
||||||
* **ivy**: used for changes to the [Ivy renderer](https://github.com/angular/angular/issues/21706).
|
* **ivy**: used for changes to the [Ivy renderer](https://github.com/angular/angular/issues/21706).
|
||||||
* **ngcc**: used for changes to the [Angular Compatibility Compiler](./packages/compiler-cli/ngcc/README.md)
|
|
||||||
* none/empty string: useful for `style`, `test` and `refactor` changes that are done across all
|
* none/empty string: useful for `style`, `test` and `refactor` changes that are done across all
|
||||||
packages (e.g. `style: add missing semicolons`) and for docs changes that are not related to a
|
packages (e.g. `style: add missing semicolons`) and for docs changes that are not related to a
|
||||||
specific package (e.g. `docs: fix typo in tutorial`).
|
specific package (e.g. `docs: fix typo in tutorial`).
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
# Angular
|
# Angular
|
||||||
|
|
||||||
Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages.
|
Angular is a development platform for building mobile and desktop web applications using Typescript/JavaScript and other languages.
|
||||||
|
|
||||||
## Quickstart
|
## Quickstart
|
||||||
|
|
||||||
|
56
WORKSPACE
56
WORKSPACE
@ -18,19 +18,15 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
|||||||
# Fetch rules_nodejs so we can install our npm dependencies
|
# Fetch rules_nodejs so we can install our npm dependencies
|
||||||
http_archive(
|
http_archive(
|
||||||
name = "build_bazel_rules_nodejs",
|
name = "build_bazel_rules_nodejs",
|
||||||
patch_args = ["-p1"],
|
sha256 = "e04a82a72146bfbca2d0575947daa60fda1878c8d3a3afe868a8ec39a6b968bb",
|
||||||
# Patch https://github.com/bazelbuild/rules_nodejs/pull/903
|
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.31.1/rules_nodejs-0.31.1.tar.gz"],
|
||||||
patches = ["//tools:rollup_bundle_commonjs_ignoreGlobal.patch"],
|
|
||||||
sha256 = "3d7296d834208792fa3b2ded8ec04e75068e3de172fae79db217615bd75a6ff7",
|
|
||||||
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.39.1/rules_nodejs-0.39.1.tar.gz"],
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check the bazel version and download npm dependencies
|
# Check the bazel version and download npm dependencies
|
||||||
load("@build_bazel_rules_nodejs//:index.bzl", "check_bazel_version", "check_rules_nodejs_version", "node_repositories", "yarn_install")
|
load("@build_bazel_rules_nodejs//:defs.bzl", "check_bazel_version", "check_rules_nodejs_version", "node_repositories", "yarn_install")
|
||||||
|
|
||||||
# Bazel version must be at least the following version because:
|
# Bazel version must be at least the following version because:
|
||||||
# - 0.26.0 managed_directories feature added which is required for nodejs rules 0.30.0
|
# - 0.26.0 managed_directories feature added which is required for nodejs rules 0.30.0
|
||||||
# - 0.27.0 has a fix for managed_directories after `rm -rf node_modules`
|
|
||||||
check_bazel_version(
|
check_bazel_version(
|
||||||
message = """
|
message = """
|
||||||
You no longer need to install Bazel on your machine.
|
You no longer need to install Bazel on your machine.
|
||||||
@ -39,7 +35,7 @@ Try running `yarn bazel` instead.
|
|||||||
(If you did run that, check that you've got a fresh `yarn install`)
|
(If you did run that, check that you've got a fresh `yarn install`)
|
||||||
|
|
||||||
""",
|
""",
|
||||||
minimum_bazel_version = "0.27.0",
|
minimum_bazel_version = "0.26.0",
|
||||||
)
|
)
|
||||||
|
|
||||||
# The NodeJS rules version must be at least the following version because:
|
# The NodeJS rules version must be at least the following version because:
|
||||||
@ -50,14 +46,7 @@ Try running `yarn bazel` instead.
|
|||||||
# - 0.27.12 Adds NodeModuleSources provider for transtive npm deps support
|
# - 0.27.12 Adds NodeModuleSources provider for transtive npm deps support
|
||||||
# - 0.30.0 yarn_install now uses symlinked node_modules with new managed directories Bazel 0.26.0 feature
|
# - 0.30.0 yarn_install now uses symlinked node_modules with new managed directories Bazel 0.26.0 feature
|
||||||
# - 0.31.1 entry_point attribute of nodejs_binary & rollup_bundle is now a label
|
# - 0.31.1 entry_point attribute of nodejs_binary & rollup_bundle is now a label
|
||||||
# - 0.32.0 yarn_install and npm_install no longer puts build files under symlinked node_modules
|
check_rules_nodejs_version(minimum_version_string = "0.31.1")
|
||||||
# - 0.32.1 remove override of @bazel/tsetse & exclude typescript lib declarations in node_module_library transitive_declarations
|
|
||||||
# - 0.32.2 resolves bug in @bazel/hide-bazel-files postinstall step
|
|
||||||
# - 0.34.0 introduces protractor rule
|
|
||||||
# - 0.37.1 windows fixes
|
|
||||||
# - 0.38.2 Adds NpmPackageInfo & JSNamedModuleInfo providers
|
|
||||||
# - 0.38.3 all providers loaded from //:providers.bzl
|
|
||||||
check_rules_nodejs_version(minimum_version_string = "0.38.3")
|
|
||||||
|
|
||||||
# Setup the Node.js toolchain
|
# Setup the Node.js toolchain
|
||||||
node_repositories(
|
node_repositories(
|
||||||
@ -68,9 +57,6 @@ node_repositories(
|
|||||||
},
|
},
|
||||||
node_version = "10.16.0",
|
node_version = "10.16.0",
|
||||||
package_json = ["//:package.json"],
|
package_json = ["//:package.json"],
|
||||||
yarn_repositories = {
|
|
||||||
"1.17.3": ("yarn-v1.17.3.tar.gz", "yarn-v1.17.3", "e3835194409f1b3afa1c62ca82f561f1c29d26580c9e220c36866317e043c6f3"),
|
|
||||||
},
|
|
||||||
# yarn 1.13.0 under Bazel has a regression on Windows that causes build errors on rebuilds:
|
# yarn 1.13.0 under Bazel has a regression on Windows that causes build errors on rebuilds:
|
||||||
# ```
|
# ```
|
||||||
# ERROR: Source forest creation failed: C:/.../fyuc5c3n/execroot/angular/external (Directory not empty)
|
# ERROR: Source forest creation failed: C:/.../fyuc5c3n/execroot/angular/external (Directory not empty)
|
||||||
@ -79,12 +65,24 @@ node_repositories(
|
|||||||
# It possible that versions of yarn past 1.13.0 do not have this issue, however, before
|
# It possible that versions of yarn past 1.13.0 do not have this issue, however, before
|
||||||
# advancing this version we need to test manually on Windows that the above error does not
|
# advancing this version we need to test manually on Windows that the above error does not
|
||||||
# happen as the issue is not caught by CI.
|
# happen as the issue is not caught by CI.
|
||||||
yarn_version = "1.17.3",
|
yarn_version = "1.12.1",
|
||||||
)
|
)
|
||||||
|
|
||||||
yarn_install(
|
yarn_install(
|
||||||
name = "npm",
|
name = "npm",
|
||||||
|
data = [
|
||||||
|
"//:tools/npm/@angular_bazel/index.js",
|
||||||
|
"//:tools/npm/@angular_bazel/package.json",
|
||||||
|
"//:tools/postinstall-patches.js",
|
||||||
|
"//:tools/yarn/check-yarn.js",
|
||||||
|
],
|
||||||
package_json = "//:package.json",
|
package_json = "//:package.json",
|
||||||
|
# Don't install devDependencies, they are large and not used under Bazel
|
||||||
|
prod_only = True,
|
||||||
|
# Temporarily disable node_modules symlinking until the fix for
|
||||||
|
# https://github.com/bazelbuild/bazel/issues/8487 makes it into a
|
||||||
|
# future Bazel release
|
||||||
|
symlink_node_modules = False,
|
||||||
yarn_lock = "//:yarn.lock",
|
yarn_lock = "//:yarn.lock",
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -98,27 +96,21 @@ load("//packages/bazel:package.bzl", "rules_angular_dev_dependencies")
|
|||||||
|
|
||||||
rules_angular_dev_dependencies()
|
rules_angular_dev_dependencies()
|
||||||
|
|
||||||
# Load protractor dependencies
|
|
||||||
load("@npm_bazel_protractor//:package.bzl", "npm_bazel_protractor_dependencies")
|
|
||||||
|
|
||||||
npm_bazel_protractor_dependencies()
|
|
||||||
|
|
||||||
# Load karma dependencies
|
# Load karma dependencies
|
||||||
load("@npm_bazel_karma//:package.bzl", "npm_bazel_karma_dependencies")
|
load("@npm_bazel_karma//:package.bzl", "rules_karma_dependencies")
|
||||||
|
|
||||||
npm_bazel_karma_dependencies()
|
rules_karma_dependencies()
|
||||||
|
|
||||||
# Setup the rules_webtesting toolchain
|
# Setup the rules_webtesting toolchain
|
||||||
load("@io_bazel_rules_webtesting//web:repositories.bzl", "web_test_repositories")
|
load("@io_bazel_rules_webtesting//web:repositories.bzl", "web_test_repositories")
|
||||||
|
|
||||||
web_test_repositories()
|
web_test_repositories()
|
||||||
|
|
||||||
load("@io_bazel_rules_webtesting//web/versioned:browsers-0.3.2.bzl", "browser_repositories")
|
# Temporary work-around for https://github.com/angular/angular/issues/28681
|
||||||
|
# TODO(gregmagolan): go back to @io_bazel_rules_webtesting browser_repositories
|
||||||
|
load("//:browser_repositories.bzl", "browser_repositories")
|
||||||
|
|
||||||
browser_repositories(
|
browser_repositories()
|
||||||
chromium = True,
|
|
||||||
firefox = True,
|
|
||||||
)
|
|
||||||
|
|
||||||
# Setup the rules_typescript tooolchain
|
# Setup the rules_typescript tooolchain
|
||||||
load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace")
|
load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace")
|
||||||
|
@ -14,12 +14,10 @@ Here are the most important tasks you might need to use:
|
|||||||
|
|
||||||
* `yarn` - install all the dependencies.
|
* `yarn` - install all the dependencies.
|
||||||
* `yarn setup` - install all the dependencies, boilerplate, stackblitz, zips and run dgeni on the docs.
|
* `yarn setup` - install all the dependencies, boilerplate, stackblitz, zips and run dgeni on the docs.
|
||||||
* `yarn setup-local` - same as `setup`, but build the Angular packages from the source code and use these locally built versions (instead of the ones fetched from npm) for aio and docs examples boilerplate.
|
* `yarn setup-local` - same as `setup`, but use the locally built Angular packages for aio and docs examples boilerplate.
|
||||||
|
|
||||||
* `yarn build` - create a production build of the application (after installing dependencies, boilerplate, etc).
|
* `yarn build` - create a production build of the application (after installing dependencies, boilerplate, etc).
|
||||||
* `yarn build-local` - same as `build`, but use `setup-local` instead of `setup`.
|
* `yarn build-local` - same as `build`, but use `setup-local` instead of `setup`.
|
||||||
* `yarn build-local-with-viewengine` - same as `build-local`, but in addition also turns on `ViewEngine` mode in aio.
|
|
||||||
(Note: Docs examples run in `ViewEngine` mode by default. To turn on `ivy` mode in examples, see `yarn boilerplate:add` below.)
|
|
||||||
|
|
||||||
* `yarn start` - run a development web server that watches the files; then builds the doc-viewer and reloads the page, as necessary.
|
* `yarn start` - run a development web server that watches the files; then builds the doc-viewer and reloads the page, as necessary.
|
||||||
* `yarn serve-and-sync` - run both the `docs-watch` and `start` in the same console.
|
* `yarn serve-and-sync` - run both the `docs-watch` and `start` in the same console.
|
||||||
@ -33,29 +31,16 @@ Here are the most important tasks you might need to use:
|
|||||||
* `yarn docs-lint` - check that the doc gen code follows our style rules.
|
* `yarn docs-lint` - check that the doc gen code follows our style rules.
|
||||||
* `yarn docs-test` - run the unit tests for the doc generation code.
|
* `yarn docs-test` - run the unit tests for the doc generation code.
|
||||||
|
|
||||||
* `yarn boilerplate:add` - generate all the boilerplate code for the examples, so that they can be run locally.
|
* `yarn boilerplate:add` - generate all the boilerplate code for the examples, so that they can be run locally. Add the option `--local` to use your local version of Angular contained in the "dist" folder.
|
||||||
* `yarn boilerplate:add:ivy` - same as `boilerplate:add` but also turns on `ivy` mode.
|
|
||||||
|
|
||||||
* `yarn boilerplate:remove` - remove all the boilerplate code that was added via `yarn boilerplate:add`.
|
* `yarn boilerplate:remove` - remove all the boilerplate code that was added via `yarn boilerplate:add`.
|
||||||
* `yarn generate-stackblitz` - generate the stackblitz files that are used by the `live-example` tags in the docs.
|
* `yarn generate-stackblitz` - generate the stackblitz files that are used by the `live-example` tags in the docs.
|
||||||
* `yarn generate-zips` - generate the zip files from the examples. Zip available via the `live-example` tags in the docs.
|
* `yarn generate-zips` - generate the zip files from the examples. Zip available via the `live-example` tags in the docs.
|
||||||
|
|
||||||
* `yarn example-e2e` - run all e2e tests for examples. Available options:
|
* `yarn example-e2e` - run all e2e tests for examples
|
||||||
- `--setup`: generate boilerplate, force webdriver update & other setup, then run tests.
|
- `yarn example-e2e --setup` - force webdriver update & other setup, then run tests
|
||||||
- `--local`: run e2e tests with the local version of Angular contained in the "dist" folder.
|
- `yarn example-e2e --filter=foo` - limit e2e tests to those containing the word "foo"
|
||||||
_Requires `--setup` in order to take effect._
|
- `yarn example-e2e --setup --local` - run e2e tests with the local version of Angular contained in the "dist" folder
|
||||||
- `--ivy`: run e2e tests in `ivy` mode.
|
|
||||||
- `--filter=foo`: limit e2e tests to those containing the word "foo".
|
|
||||||
|
|
||||||
> **Note for Windows users**
|
|
||||||
>
|
|
||||||
> Setting up the examples involves creating some [symbolic links](https://en.wikipedia.org/wiki/Symbolic_link) (see [here](./tools/examples/README.md#symlinked-node_modules) for details). On Windows, this requires to either have [Developer Mode enabled](https://blogs.windows.com/windowsdeveloper/2016/12/02/symlinks-windows-10) (supported on Windows 10 or newer) or run the setup commands as administrator.
|
|
||||||
>
|
|
||||||
> The affected commands are:
|
|
||||||
> - `yarn setup` / `yarn setup-*`
|
|
||||||
> - `yarn build` / `yarn build-*`
|
|
||||||
> - `yarn boilerplate:add`
|
|
||||||
> - `yarn example-e2e --setup`
|
|
||||||
|
|
||||||
## Using ServiceWorker locally
|
## Using ServiceWorker locally
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
"shelljs": "^0.8.2",
|
"shelljs": "^0.8.2",
|
||||||
"source-map-support": "^0.5.9",
|
"source-map-support": "^0.5.9",
|
||||||
"tar-stream": "^1.6.1",
|
"tar-stream": "^1.6.1",
|
||||||
"tslib": "^1.10.0"
|
"tslib": "^1.9.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/body-parser": "^1.17.0",
|
"@types/body-parser": "^1.17.0",
|
||||||
|
@ -2444,12 +2444,7 @@ touch@^3.1.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
nopt "~1.0.10"
|
nopt "~1.0.10"
|
||||||
|
|
||||||
tslib@^1.10.0:
|
tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.3:
|
||||||
version "1.10.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
|
|
||||||
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
|
|
||||||
|
|
||||||
tslib@^1.8.0, tslib@^1.8.1:
|
|
||||||
version "1.9.3"
|
version "1.9.3"
|
||||||
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
|
||||||
|
|
||||||
|
@ -59,13 +59,7 @@
|
|||||||
"styles": [
|
"styles": [
|
||||||
"src/styles.scss"
|
"src/styles.scss"
|
||||||
],
|
],
|
||||||
"scripts": [],
|
"scripts": []
|
||||||
"budgets": [
|
|
||||||
{
|
|
||||||
"type": "anyComponentStyle",
|
|
||||||
"maximumWarning": "6kb"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
"fast": {
|
"fast": {
|
||||||
|
@ -7,7 +7,7 @@ The Angular CLI is a command-line interface tool that you use to initialize, dev
|
|||||||
Major versions of Angular CLI follow the supported major version of Angular, but minor versions can be released separately.
|
Major versions of Angular CLI follow the supported major version of Angular, but minor versions can be released separately.
|
||||||
|
|
||||||
Install the CLI using the `npm` package manager:
|
Install the CLI using the `npm` package manager:
|
||||||
<code-example language="bash">
|
<code-example format="." language="bash">
|
||||||
npm install -g @angular/cli
|
npm install -g @angular/cli
|
||||||
</code-example>
|
</code-example>
|
||||||
|
|
||||||
@ -20,14 +20,14 @@ Invoke the tool on the command line through the `ng` executable.
|
|||||||
Online help is available on the command line.
|
Online help is available on the command line.
|
||||||
Enter the following to list commands or options for a given command (such as [generate](cli/generate)) with a short description.
|
Enter the following to list commands or options for a given command (such as [generate](cli/generate)) with a short description.
|
||||||
|
|
||||||
<code-example language="bash">
|
<code-example format="." language="bash">
|
||||||
ng help
|
ng help
|
||||||
ng generate --help
|
ng generate --help
|
||||||
</code-example>
|
</code-example>
|
||||||
|
|
||||||
To create, build, and serve a new, basic Angular project on a development server, go to the parent directory of your new workspace use the following commands:
|
To create, build, and serve a new, basic Angular project on a development server, go to the parent directory of your new workspace use the following commands:
|
||||||
|
|
||||||
<code-example language="bash">
|
<code-example format="." language="bash">
|
||||||
ng new my-first-project
|
ng new my-first-project
|
||||||
cd my-first-project
|
cd my-first-project
|
||||||
ng serve
|
ng serve
|
||||||
@ -36,14 +36,6 @@ ng serve
|
|||||||
In your browser, open http://localhost:4200/ to see the new app run.
|
In your browser, open http://localhost:4200/ to see the new app run.
|
||||||
When you use the [ng serve](cli/serve) command to build an app and serve it locally, the server automatically rebuilds the app and reloads the page when you change any of the source files.
|
When you use the [ng serve](cli/serve) command to build an app and serve it locally, the server automatically rebuilds the app and reloads the page when you change any of the source files.
|
||||||
|
|
||||||
<div class="alert is-helpful">
|
|
||||||
|
|
||||||
When you run `ng new my-first-project` a new folder, named `my-first-project`, will be created in the current working directory. Since you want to be able to create files inside that folder, make sure you have sufficient rights in the current working directory before running the command.
|
|
||||||
|
|
||||||
If the current working directory is not the right place for your project, you can change to a more appropriate directory by running `cd <path-to-other-directory>` first.
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
## Workspaces and project files
|
## Workspaces and project files
|
||||||
|
|
||||||
The [ng new](cli/new) command creates an *Angular workspace* folder and generates a new app skeleton.
|
The [ng new](cli/new) command creates an *Angular workspace* folder and generates a new app skeleton.
|
||||||
@ -83,7 +75,7 @@ Command syntax is shown as follows:
|
|||||||
Option aliases are prefixed with a single dash (-).
|
Option aliases are prefixed with a single dash (-).
|
||||||
Arguments are not prefixed.
|
Arguments are not prefixed.
|
||||||
For example:
|
For example:
|
||||||
<code-example language="bash">
|
<code-example format="." language="bash">
|
||||||
ng build my-app -c production
|
ng build my-app -c production
|
||||||
</code-example>
|
</code-example>
|
||||||
|
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
'use strict'; // necessary for es6 output in node
|
|
||||||
|
|
||||||
import { browser, element, by } from 'protractor';
|
|
||||||
|
|
||||||
describe('Accessibility example e2e tests', () => {
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
browser.get('');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should display Accessibility Example', function () {
|
|
||||||
expect(element(by.css('h1')).getText()).toEqual('Accessibility Example');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should take a number and change progressbar width', function () {
|
|
||||||
element(by.css('input')).sendKeys('16');
|
|
||||||
expect(element(by.css('input')).getAttribute('value')).toEqual('016');
|
|
||||||
expect(element(by.css('app-example-progressbar div')).getCssValue('width')).toBe('48px');
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
@ -1,13 +0,0 @@
|
|||||||
<h1>Accessibility Example</h1>
|
|
||||||
<!-- #docregion template -->
|
|
||||||
<label>
|
|
||||||
Enter an example progress value
|
|
||||||
<input type="number" min="0" max="100"
|
|
||||||
[value]="progress" (input)="progress = $event.target.value">
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<!-- The user of the progressbar sets an aria-label to communicate what the progress means. -->
|
|
||||||
<app-example-progressbar [value]="progress" aria-label="Example of a progress bar">
|
|
||||||
</app-example-progressbar>
|
|
||||||
<!-- #enddocregion template -->
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
import { Component } from '@angular/core';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-root',
|
|
||||||
templateUrl: './app.component.html',
|
|
||||||
styleUrls: [ './app.component.css' ]
|
|
||||||
})
|
|
||||||
export class AppComponent {
|
|
||||||
progress = 0;
|
|
||||||
}
|
|
@ -1,12 +0,0 @@
|
|||||||
import { NgModule } from '@angular/core';
|
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
|
||||||
import { ExampleProgressbarComponent } from './progress-bar.component';
|
|
||||||
|
|
||||||
@NgModule({
|
|
||||||
imports: [ BrowserModule ],
|
|
||||||
declarations: [ AppComponent, ExampleProgressbarComponent ],
|
|
||||||
bootstrap: [ AppComponent ]
|
|
||||||
})
|
|
||||||
export class AppModule { }
|
|
@ -1,12 +0,0 @@
|
|||||||
:host {
|
|
||||||
display: block;
|
|
||||||
width: 300px;
|
|
||||||
height: 25px;
|
|
||||||
border: 1px solid black;
|
|
||||||
margin-top: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.bar {
|
|
||||||
background: blue;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
@ -1,28 +0,0 @@
|
|||||||
// #docregion progressbar-component
|
|
||||||
import { Component, Input } from '@angular/core';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Example progressbar component.
|
|
||||||
*/
|
|
||||||
@Component({
|
|
||||||
selector: 'app-example-progressbar',
|
|
||||||
template: `<div class="bar" [style.width.%]="value"></div>`,
|
|
||||||
styleUrls: ['./progress-bar.component.css'],
|
|
||||||
host: {
|
|
||||||
// Sets the role for this component to "progressbar"
|
|
||||||
role: 'progressbar',
|
|
||||||
|
|
||||||
// Sets the minimum and maximum values for the progressbar role.
|
|
||||||
'aria-valuemin': '0',
|
|
||||||
'aria-valuemax': '100',
|
|
||||||
|
|
||||||
// Binding that updates the current value of the progressbar.
|
|
||||||
'[attr.aria-valuenow]': 'value',
|
|
||||||
}
|
|
||||||
})
|
|
||||||
export class ExampleProgressbarComponent {
|
|
||||||
/** Current value of the progressbar. */
|
|
||||||
@Input() value = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// #enddocregion progressbar-component
|
|
@ -1,14 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>Accessibility Example</title>
|
|
||||||
<base href="/">
|
|
||||||
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<link rel="icon" type="image/x-icon" href="favicon.ico">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<app-root>Loading...</app-root>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,11 +0,0 @@
|
|||||||
import { enableProdMode } from '@angular/core';
|
|
||||||
import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
|
|
||||||
|
|
||||||
import { AppModule } from './app/app.module';
|
|
||||||
import { environment } from './environments/environment';
|
|
||||||
|
|
||||||
if (environment.production) {
|
|
||||||
enableProdMode();
|
|
||||||
}
|
|
||||||
|
|
||||||
platformBrowserDynamic().bootstrapModule(AppModule);
|
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"description": "Accessibility",
|
|
||||||
"files": [
|
|
||||||
"!**/*.d.ts",
|
|
||||||
"!**/*.js",
|
|
||||||
"!**/*.[1,2].*"
|
|
||||||
],
|
|
||||||
"file": "src/app/app.component.ts",
|
|
||||||
"tags": ["Accessibility"]
|
|
||||||
}
|
|
@ -36,6 +36,9 @@ import { transAnimation } from './animations';
|
|||||||
})
|
})
|
||||||
])
|
])
|
||||||
])
|
])
|
||||||
|
// #docregion runtime
|
||||||
|
],
|
||||||
|
// #enddocregion runtime
|
||||||
// #enddocregion reusable
|
// #enddocregion reusable
|
||||||
templateUrl: 'open-close.component.html',
|
templateUrl: 'open-close.component.html',
|
||||||
styleUrls: ['open-close.component.css']
|
styleUrls: ['open-close.component.css']
|
||||||
|
@ -25,8 +25,8 @@ describe('Attribute directives', () => {
|
|||||||
greenRb.click();
|
greenRb.click();
|
||||||
browser.actions().mouseMove(highlightedEle).perform();
|
browser.actions().mouseMove(highlightedEle).perform();
|
||||||
|
|
||||||
// Wait for up to 4s for the background color to be updated,
|
// Wait for up to 2s for the background color to be updated,
|
||||||
// to account for slow environments (e.g. CI).
|
// to account for slow environments (e.g. CI).
|
||||||
browser.wait(() => highlightedEle.getCssValue('background-color').then(c => c === lightGreen), 4000);
|
browser.wait(() => highlightedEle.getCssValue('background-color').then(c => c === lightGreen), 2000);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -8,7 +8,7 @@ import { Component, ViewChild, ElementRef } from '@angular/core';
|
|||||||
})
|
})
|
||||||
export class AppComponent {
|
export class AppComponent {
|
||||||
|
|
||||||
@ViewChild('bindingInput') bindingInput: ElementRef;
|
@ViewChild('bindingInput', { static: false }) bindingInput: ElementRef;
|
||||||
|
|
||||||
isUnchanged = true;
|
isUnchanged = true;
|
||||||
|
|
||||||
|
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 32 KiB |
@ -39,7 +39,7 @@ export class CountdownLocalVarParentComponent { }
|
|||||||
})
|
})
|
||||||
export class CountdownViewChildParentComponent implements AfterViewInit {
|
export class CountdownViewChildParentComponent implements AfterViewInit {
|
||||||
|
|
||||||
@ViewChild(CountdownTimerComponent)
|
@ViewChild(CountdownTimerComponent, {static: false})
|
||||||
private timerComponent: CountdownTimerComponent;
|
private timerComponent: CountdownTimerComponent;
|
||||||
|
|
||||||
seconds() { return 0; }
|
seconds() { return 0; }
|
||||||
|
@ -18,7 +18,7 @@ export class AppComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
deleteItem(item: Item) {
|
deleteItem(item: Item) {
|
||||||
alert(`Delete the ${item.name}.`);
|
alert(`Delete the ${item}.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
onClickMe(event?: KeyboardEvent) {
|
onClickMe(event?: KeyboardEvent) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// #docplaster
|
// #docplaster
|
||||||
// #docregion imports
|
// #docregion imports
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { CartService } from '../cart.service';
|
import { CartService } from '../cart.service';
|
||||||
// #enddocregion imports
|
// #enddocregion imports
|
||||||
|
|
||||||
@ -10,14 +10,12 @@ import { CartService } from '../cart.service';
|
|||||||
styleUrls: ['./cart.component.css']
|
styleUrls: ['./cart.component.css']
|
||||||
})
|
})
|
||||||
// #docregion props-services, submit
|
// #docregion props-services, submit
|
||||||
export class CartComponent implements OnInit {
|
export class CartComponent {
|
||||||
items;
|
items;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private cartService: CartService
|
private cartService: CartService
|
||||||
) { }
|
) {
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
this.items = this.cartService.getItems();
|
this.items = this.cartService.getItems();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,17 +16,13 @@
|
|||||||
<!-- #enddocregion checkout-form-1 -->
|
<!-- #enddocregion checkout-form-1 -->
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="name">
|
<label>Name</label>
|
||||||
Name
|
<input type="text" formControlName="name">
|
||||||
</label>
|
|
||||||
<input id="name" type="text" formControlName="name">
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<label for="address">
|
<label>Address</label>
|
||||||
Address
|
<input type="text" formControlName="address">
|
||||||
</label>
|
|
||||||
<input id="address" type="text" formControlName="address">
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<button class="button" type="submit">Purchase</button>
|
<button class="button" type="submit">Purchase</button>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// #docplaster
|
// #docplaster
|
||||||
// #docregion imports
|
// #docregion imports
|
||||||
import { Component, OnInit } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
import { CartService } from '../cart.service';
|
import { CartService } from '../cart.service';
|
||||||
// #enddocregion
|
// #enddocregion
|
||||||
@ -11,7 +11,7 @@ import { CartService } from '../cart.service';
|
|||||||
styleUrls: ['./shipping.component.css']
|
styleUrls: ['./shipping.component.css']
|
||||||
})
|
})
|
||||||
// #docregion props, ctor
|
// #docregion props, ctor
|
||||||
export class ShippingComponent implements OnInit {
|
export class ShippingComponent {
|
||||||
shippingCosts;
|
shippingCosts;
|
||||||
// #enddocregion props
|
// #enddocregion props
|
||||||
|
|
||||||
@ -19,12 +19,10 @@ export class ShippingComponent implements OnInit {
|
|||||||
constructor(
|
constructor(
|
||||||
private cartService: CartService
|
private cartService: CartService
|
||||||
) {
|
) {
|
||||||
|
// #enddocregion inject-cart-service
|
||||||
|
this.shippingCosts = this.cartService.getShippingPrices();
|
||||||
|
// #docregion inject-cart-service
|
||||||
}
|
}
|
||||||
// #enddocregion inject-cart-service
|
// #enddocregion inject-cart-service
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
this.shippingCosts = this.cartService.getShippingPrices();
|
|
||||||
}
|
|
||||||
|
|
||||||
// #docregion props
|
// #docregion props
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<h1>HTTP Sample</h1>
|
<h1>HTTP Sample</h1>
|
||||||
<div>
|
<div>
|
||||||
<input type="checkbox" id="heroes" [checked]="showHeroes" (click)="toggleHeroes()">
|
<input type="checkbox" id="heroes" [checked]="toggleHeroes" (click)="toggleHeroes()">
|
||||||
<label for="heroes">Heroes</label>
|
<label for="heroes">Heroes</label>
|
||||||
|
|
||||||
<input type="checkbox" id="config" [checked]="showConfig" (click)="toggleConfig()">
|
<input type="checkbox" id="config" [checked]="showConfig" (click)="toggleConfig()">
|
||||||
|
@ -28,9 +28,9 @@ describe('HeroesService', () => {
|
|||||||
|
|
||||||
// Inject the http, test controller, and service-under-test
|
// Inject the http, test controller, and service-under-test
|
||||||
// as they will be referenced by each test.
|
// as they will be referenced by each test.
|
||||||
httpClient = TestBed.inject(HttpClient);
|
httpClient = TestBed.get(HttpClient);
|
||||||
httpTestingController = TestBed.inject(HttpTestingController);
|
httpTestingController = TestBed.get(HttpTestingController);
|
||||||
heroService = TestBed.inject(HeroesService);
|
heroService = TestBed.get(HeroesService);
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
@ -44,7 +44,7 @@ describe('HeroesService', () => {
|
|||||||
let expectedHeroes: Hero[];
|
let expectedHeroes: Hero[];
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
heroService = TestBed.inject(HeroesService);
|
heroService = TestBed.get(HeroesService);
|
||||||
expectedHeroes = [
|
expectedHeroes = [
|
||||||
{ id: 1, name: 'A' },
|
{ id: 1, name: 'A' },
|
||||||
{ id: 2, name: 'B' },
|
{ id: 2, name: 'B' },
|
||||||
|
@ -27,8 +27,8 @@ describe('HttpClient testing', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Inject the http service and test controller for each test
|
// Inject the http service and test controller for each test
|
||||||
httpClient = TestBed.inject(HttpClient);
|
httpClient = TestBed.get(HttpClient);
|
||||||
httpTestingController = TestBed.inject(HttpTestingController);
|
httpTestingController = TestBed.get(HttpTestingController);
|
||||||
});
|
});
|
||||||
// #enddocregion setup
|
// #enddocregion setup
|
||||||
// #docregion afterEach
|
// #docregion afterEach
|
||||||
|
@ -12,7 +12,7 @@ if (environment.production) {
|
|||||||
// use the require method provided by webpack
|
// use the require method provided by webpack
|
||||||
declare const require;
|
declare const require;
|
||||||
// we use the webpack raw-loader to return the content as a string
|
// we use the webpack raw-loader to return the content as a string
|
||||||
const translations = require('raw-loader!./locale/messages.fr.xlf').default;
|
const translations = require(`raw-loader!./locale/messages.fr.xlf`);
|
||||||
|
|
||||||
platformBrowserDynamic().bootstrapModule(AppModule, {
|
platformBrowserDynamic().bootstrapModule(AppModule, {
|
||||||
providers: [
|
providers: [
|
||||||
|
@ -10,6 +10,7 @@ export class AppComponent {
|
|||||||
gender = 'female';
|
gender = 'female';
|
||||||
fly = true;
|
fly = true;
|
||||||
logo = 'https://angular.io/assets/images/logos/angular/angular.png';
|
logo = 'https://angular.io/assets/images/logos/angular/angular.png';
|
||||||
|
heroes: string[] = ['Magneta', 'Celeritas', 'Dynama'];
|
||||||
inc(i: number) {
|
inc(i: number) {
|
||||||
this.minutes = Math.min(5, Math.max(0, this.minutes + i));
|
this.minutes = Math.min(5, Math.max(0, this.minutes + i));
|
||||||
}
|
}
|
||||||
|
@ -18,26 +18,26 @@ describe('providers App', () => {
|
|||||||
expect(page.getTitleText()).toEqual('Lazy loading feature modules');
|
expect(page.getTitleText()).toEqual('Lazy loading feature modules');
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Customers', function() {
|
describe('Customers list', function() {
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
customersButton.click();
|
customersButton.click();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should show customers when the button is clicked', function() {
|
it('should show customers list when the button is clicked', function() {
|
||||||
let customersMessage = element(by.css('app-customers > p'));
|
let customersMessage = element(by.css('app-customer-list > p'));
|
||||||
expect(customersMessage.getText()).toBe('customers works!');
|
expect(customersMessage.getText()).toBe('customer-list works!');
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Orders', function() {
|
describe('Orders list', function() {
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
ordersButton.click();
|
ordersButton.click();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should show orders when the button is clicked', function() {
|
it('should show orders list when the button is clicked', function() {
|
||||||
let ordersMessage = element(by.css('app-orders > p'));
|
let ordersMessage = element(by.css('app-order-list > p'));
|
||||||
expect(ordersMessage.getText()).toBe('orders works!');
|
expect(ordersMessage.getText()).toBe('order-list works!');
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
@ -21,16 +21,16 @@ describe('AppComponent', () => {
|
|||||||
expect(app).toBeTruthy();
|
expect(app).toBeTruthy();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it(`should have as title 'customer-app'`, async(() => {
|
it(`should have as title 'app works!'`, async(() => {
|
||||||
const fixture = TestBed.createComponent(AppComponent);
|
const fixture = TestBed.createComponent(AppComponent);
|
||||||
const app = fixture.debugElement.componentInstance;
|
const app = fixture.debugElement.componentInstance;
|
||||||
expect(app.title).toEqual('customer-app');
|
expect(app.title).toEqual('app works!');
|
||||||
}));
|
}));
|
||||||
|
|
||||||
it('should render title in a h1 tag', async(() => {
|
it('should render title in a h1 tag', async(() => {
|
||||||
const fixture = TestBed.createComponent(AppComponent);
|
const fixture = TestBed.createComponent(AppComponent);
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
const compiled = fixture.debugElement.nativeElement;
|
const compiled = fixture.debugElement.nativeElement;
|
||||||
expect(compiled.querySelector('h1').textContent).toContain('customer-app');
|
expect(compiled.querySelector('h1').textContent).toContain('app works!');
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
<p>
|
||||||
|
customer-list works!
|
||||||
|
</p>
|
@ -1,20 +1,20 @@
|
|||||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
import { CustomersComponent } from './customers.component';
|
import { CustomerListComponent } from './customer-list.component';
|
||||||
|
|
||||||
describe('CustomerListComponent', () => {
|
describe('CustomerListComponent', () => {
|
||||||
let component: CustomersComponent;
|
let component: CustomerListComponent;
|
||||||
let fixture: ComponentFixture<CustomersComponent>;
|
let fixture: ComponentFixture<CustomerListComponent>;
|
||||||
|
|
||||||
beforeEach(async(() => {
|
beforeEach(async(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
declarations: [ CustomersComponent ]
|
declarations: [ CustomerListComponent ]
|
||||||
})
|
})
|
||||||
.compileComponents();
|
.compileComponents();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
fixture = TestBed.createComponent(CustomersComponent);
|
fixture = TestBed.createComponent(CustomerListComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
});
|
});
|
@ -0,0 +1,15 @@
|
|||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-customer-list',
|
||||||
|
templateUrl: './customer-list.component.html',
|
||||||
|
styleUrls: ['./customer-list.component.css']
|
||||||
|
})
|
||||||
|
export class CustomerListComponent implements OnInit {
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -3,13 +3,13 @@
|
|||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { Routes, RouterModule } from '@angular/router';
|
import { Routes, RouterModule } from '@angular/router';
|
||||||
|
|
||||||
import { CustomersComponent } from './customers.component';
|
import { CustomerListComponent } from './customer-list/customer-list.component';
|
||||||
|
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{
|
{
|
||||||
path: '',
|
path: '',
|
||||||
component: CustomersComponent
|
component: CustomerListComponent
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
<p>
|
|
||||||
customers works!
|
|
||||||
</p>
|
|
@ -1,15 +0,0 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-customers',
|
|
||||||
templateUrl: './customers.component.html',
|
|
||||||
styleUrls: ['./customers.component.css']
|
|
||||||
})
|
|
||||||
export class CustomersComponent implements OnInit {
|
|
||||||
|
|
||||||
constructor() { }
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -3,14 +3,14 @@
|
|||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
import { CustomersRoutingModule } from './customers-routing.module';
|
import { CustomersRoutingModule } from './customers-routing.module';
|
||||||
import { CustomersComponent } from './customers.component';
|
import { CustomerListComponent } from './customer-list/customer-list.component';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
CustomersRoutingModule
|
CustomersRoutingModule
|
||||||
],
|
],
|
||||||
declarations: [CustomersComponent]
|
declarations: [CustomerListComponent]
|
||||||
})
|
})
|
||||||
export class CustomersModule { }
|
export class CustomersModule { }
|
||||||
// #enddocregion customers-module
|
// #enddocregion customers-module
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
<p>
|
||||||
|
order-list works!
|
||||||
|
</p>
|
@ -1,20 +1,20 @@
|
|||||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
||||||
|
|
||||||
import { OrdersComponent } from './orders.component';
|
import { OrderListComponent } from './order-list.component';
|
||||||
|
|
||||||
describe('OrderListComponent', () => {
|
describe('OrderListComponent', () => {
|
||||||
let component: OrdersComponent;
|
let component: OrderListComponent;
|
||||||
let fixture: ComponentFixture<OrdersComponent>;
|
let fixture: ComponentFixture<OrderListComponent>;
|
||||||
|
|
||||||
beforeEach(async(() => {
|
beforeEach(async(() => {
|
||||||
TestBed.configureTestingModule({
|
TestBed.configureTestingModule({
|
||||||
declarations: [ OrdersComponent ]
|
declarations: [ OrderListComponent ]
|
||||||
})
|
})
|
||||||
.compileComponents();
|
.compileComponents();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
fixture = TestBed.createComponent(OrdersComponent);
|
fixture = TestBed.createComponent(OrderListComponent);
|
||||||
component = fixture.componentInstance;
|
component = fixture.componentInstance;
|
||||||
fixture.detectChanges();
|
fixture.detectChanges();
|
||||||
});
|
});
|
@ -0,0 +1,15 @@
|
|||||||
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
selector: 'app-order-list',
|
||||||
|
templateUrl: './order-list.component.html',
|
||||||
|
styleUrls: ['./order-list.component.css']
|
||||||
|
})
|
||||||
|
export class OrderListComponent implements OnInit {
|
||||||
|
|
||||||
|
constructor() { }
|
||||||
|
|
||||||
|
ngOnInit() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,12 +4,12 @@ import { NgModule } from '@angular/core';
|
|||||||
import { Routes, RouterModule } from '@angular/router';
|
import { Routes, RouterModule } from '@angular/router';
|
||||||
|
|
||||||
// #docregion orders-routing-module-detail
|
// #docregion orders-routing-module-detail
|
||||||
import { OrdersComponent } from './orders.component';
|
import { OrderListComponent } from './order-list/order-list.component';
|
||||||
|
|
||||||
const routes: Routes = [
|
const routes: Routes = [
|
||||||
{
|
{
|
||||||
path: '',
|
path: '',
|
||||||
component: OrdersComponent
|
component: OrderListComponent
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
// #enddocregion orders-routing-module-detail
|
// #enddocregion orders-routing-module-detail
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
<p>
|
|
||||||
orders works!
|
|
||||||
</p>
|
|
@ -1,15 +0,0 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-orders',
|
|
||||||
templateUrl: './orders.component.html',
|
|
||||||
styleUrls: ['./orders.component.css']
|
|
||||||
})
|
|
||||||
export class OrdersComponent implements OnInit {
|
|
||||||
|
|
||||||
constructor() { }
|
|
||||||
|
|
||||||
ngOnInit() {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -2,13 +2,13 @@ import { NgModule } from '@angular/core';
|
|||||||
import { CommonModule } from '@angular/common';
|
import { CommonModule } from '@angular/common';
|
||||||
|
|
||||||
import { OrdersRoutingModule } from './orders-routing.module';
|
import { OrdersRoutingModule } from './orders-routing.module';
|
||||||
import { OrdersComponent } from './orders.component';
|
import { OrderListComponent } from './order-list/order-list.component';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
CommonModule,
|
CommonModule,
|
||||||
OrdersRoutingModule
|
OrdersRoutingModule
|
||||||
],
|
],
|
||||||
declarations: [OrdersComponent]
|
declarations: [OrderListComponent]
|
||||||
})
|
})
|
||||||
export class OrdersModule { }
|
export class OrdersModule { }
|
||||||
|
@ -34,7 +34,7 @@ export class AfterContentComponent implements AfterContentChecked, AfterContentI
|
|||||||
comment = '';
|
comment = '';
|
||||||
|
|
||||||
// Query for a CONTENT child of type `ChildComponent`
|
// Query for a CONTENT child of type `ChildComponent`
|
||||||
@ContentChild(ChildComponent) contentChild: ChildComponent;
|
@ContentChild(ChildComponent, {static: false}) contentChild: ChildComponent;
|
||||||
|
|
||||||
// #enddocregion hooks
|
// #enddocregion hooks
|
||||||
constructor(private logger: LoggerService) {
|
constructor(private logger: LoggerService) {
|
||||||
|
@ -35,7 +35,7 @@ export class AfterViewComponent implements AfterViewChecked, AfterViewInit {
|
|||||||
private prevHero = '';
|
private prevHero = '';
|
||||||
|
|
||||||
// Query for a VIEW child of type `ChildViewComponent`
|
// Query for a VIEW child of type `ChildViewComponent`
|
||||||
@ViewChild(ChildViewComponent) viewChild: ChildViewComponent;
|
@ViewChild(ChildViewComponent, {static: false}) viewChild: ChildViewComponent;
|
||||||
|
|
||||||
// #enddocregion hooks
|
// #enddocregion hooks
|
||||||
constructor(private logger: LoggerService) {
|
constructor(private logger: LoggerService) {
|
||||||
|
@ -81,7 +81,7 @@ export class DoCheckParentComponent {
|
|||||||
hero: Hero;
|
hero: Hero;
|
||||||
power: string;
|
power: string;
|
||||||
title = 'DoCheck';
|
title = 'DoCheck';
|
||||||
@ViewChild(DoCheckComponent) childView: DoCheckComponent;
|
@ViewChild(DoCheckComponent, {static: false}) childView: DoCheckComponent;
|
||||||
|
|
||||||
constructor() { this.reset(); }
|
constructor() { this.reset(); }
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ export class OnChangesParentComponent {
|
|||||||
hero: Hero;
|
hero: Hero;
|
||||||
power: string;
|
power: string;
|
||||||
title = 'OnChanges';
|
title = 'OnChanges';
|
||||||
@ViewChild(OnChangesComponent) childView: OnChangesComponent;
|
@ViewChild(OnChangesComponent, {static: false}) childView: OnChangesComponent;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
this.reset();
|
this.reset();
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
// imports
|
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
|
||||||
import { NgModule } from '@angular/core';
|
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
|
||||||
|
|
||||||
// @NgModule decorator with its metadata
|
|
||||||
@NgModule({
|
|
||||||
declarations: [AppComponent],
|
|
||||||
imports: [BrowserModule],
|
|
||||||
providers: [],
|
|
||||||
bootstrap: [AppComponent]
|
|
||||||
})
|
|
||||||
export class AppModule {}
|
|
@ -1,24 +0,0 @@
|
|||||||
import { browser, element, by } from 'protractor';
|
|
||||||
import { logging } from 'selenium-webdriver';
|
|
||||||
|
|
||||||
describe('Providers and ViewProviders', function () {
|
|
||||||
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
browser.get('');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('shows basic flower emoji', function() {
|
|
||||||
expect(element.all(by.css('p')).get(0).getText()).toContain('🌺');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('shows whale emoji', function() {
|
|
||||||
expect(element.all(by.css('p')).get(1).getText()).toContain('🐳');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('shows sunflower from FlowerService', function() {
|
|
||||||
expect(element.all(by.css('p')).get(8).getText()).toContain('🌻');
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
// #docregion animal-service
|
|
||||||
import { Injectable } from '@angular/core';
|
|
||||||
|
|
||||||
@Injectable({
|
|
||||||
providedIn: 'root'
|
|
||||||
})
|
|
||||||
export class AnimalService {
|
|
||||||
emoji = '🐳';
|
|
||||||
}
|
|
||||||
// #enddocregion animal-service
|
|
@ -1,15 +0,0 @@
|
|||||||
import { Component } from '@angular/core';
|
|
||||||
import { FlowerService } from './flower.service';
|
|
||||||
import { AnimalService } from './animal.service';
|
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-root',
|
|
||||||
templateUrl: './app.component.html',
|
|
||||||
styleUrls: [ './app.component.css' ]
|
|
||||||
})
|
|
||||||
// #docregion injection
|
|
||||||
export class AppComponent {
|
|
||||||
constructor(public flower: FlowerService) {}
|
|
||||||
}
|
|
||||||
// #enddocregion injection
|
|
@ -1,15 +0,0 @@
|
|||||||
|
|
||||||
<h2>From AppComponent:</h2>
|
|
||||||
<!-- #docregion binding-flower -->
|
|
||||||
<p>Emoji from FlowerService: {{flower.emoji}}</p>
|
|
||||||
<!-- #enddocregion binding-flower -->
|
|
||||||
<!-- #docregion binding-animal -->
|
|
||||||
<p>Emoji from AnimalService: {{animal.emoji}}</p>
|
|
||||||
<!-- #enddocregion binding-animal -->
|
|
||||||
|
|
||||||
<hr />
|
|
||||||
|
|
||||||
<h2>From ChildComponent:</h2>
|
|
||||||
<!-- #docregion content-projection -->
|
|
||||||
<app-child><app-inspector></app-inspector></app-child>
|
|
||||||
<!-- #enddocregion content-projection -->
|
|
@ -1,31 +0,0 @@
|
|||||||
import { Component } from '@angular/core';
|
|
||||||
import { FlowerService } from './flower.service';
|
|
||||||
import { AnimalService } from './animal.service';
|
|
||||||
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-root',
|
|
||||||
templateUrl: './app.component.html',
|
|
||||||
styleUrls: [ './app.component.css' ]
|
|
||||||
})
|
|
||||||
// #docregion inject-animal-service
|
|
||||||
export class AppComponent {
|
|
||||||
constructor(public flower: FlowerService, public animal: AnimalService) {}
|
|
||||||
}
|
|
||||||
// #enddocregion inject-animal-service
|
|
||||||
|
|
||||||
// When using @Host() together with @SkipSelf() in
|
|
||||||
// child.component.ts for the AnimalService, add the
|
|
||||||
// following viewProviders array to the @Component metadata:
|
|
||||||
|
|
||||||
// viewProviders: [{ provide: AnimalService, useValue: { emoji: '🦔' } }]
|
|
||||||
|
|
||||||
// So, the entire @ChildComponent() decorator and its
|
|
||||||
// metadata should be as follows:
|
|
||||||
|
|
||||||
// @Component({
|
|
||||||
// selector: 'app-root',
|
|
||||||
// templateUrl: './app.component.html',
|
|
||||||
// styleUrls: [ './app.component.css' ],
|
|
||||||
// viewProviders: [{ provide: AnimalService, useValue: { emoji: '🦔' } }]
|
|
||||||
// })
|
|
@ -1,17 +0,0 @@
|
|||||||
import { NgModule } from '@angular/core';
|
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
|
||||||
import { FormsModule } from '@angular/forms';
|
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
|
||||||
import { ChildComponent } from './child/child.component';
|
|
||||||
import { InspectorComponent } from './inspector/inspector.component';
|
|
||||||
|
|
||||||
// #docregion appmodule
|
|
||||||
@NgModule({
|
|
||||||
imports: [ BrowserModule, FormsModule ],
|
|
||||||
declarations: [ AppComponent, ChildComponent, InspectorComponent ],
|
|
||||||
bootstrap: [ AppComponent ],
|
|
||||||
providers: []
|
|
||||||
})
|
|
||||||
export class AppModule { }
|
|
||||||
// #enddocregion appmodule
|
|
@ -1,19 +0,0 @@
|
|||||||
import { Component, OnInit, Host, SkipSelf, Optional } from '@angular/core';
|
|
||||||
import { FlowerService } from '../flower.service';
|
|
||||||
|
|
||||||
// #docregion flowerservice
|
|
||||||
@Component({
|
|
||||||
selector: 'app-child',
|
|
||||||
templateUrl: './child.component.html',
|
|
||||||
styleUrls: ['./child.component.css'],
|
|
||||||
// use the providers array to provide a service
|
|
||||||
providers: [{ provide: FlowerService, useValue: { emoji: '🌻' } }]
|
|
||||||
})
|
|
||||||
|
|
||||||
export class ChildComponent {
|
|
||||||
// inject the service
|
|
||||||
constructor( public flower: FlowerService) { }
|
|
||||||
}
|
|
||||||
|
|
||||||
// #enddocregion flowerservice
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
|||||||
.container {
|
|
||||||
border: 1px solid darkblue;
|
|
||||||
padding: 1rem;
|
|
||||||
}
|
|
@ -1,24 +0,0 @@
|
|||||||
<!-- #docplaster -->
|
|
||||||
<!-- #docregion child-component -->
|
|
||||||
<!-- #docregion flower-binding -->
|
|
||||||
<p>Emoji from FlowerService: {{flower.emoji}}</p>
|
|
||||||
<!-- #enddocregion flower-binding -->
|
|
||||||
<!-- #docregion animal-binding -->
|
|
||||||
<p>Emoji from AnimalService: {{animal.emoji}}</p>
|
|
||||||
<!-- #enddocregion animal-binding -->
|
|
||||||
|
|
||||||
<div class="container">
|
|
||||||
<h3>Content projection</h3>
|
|
||||||
<!-- #enddocregion child-component -->
|
|
||||||
<p>The following is coming from content. It doesn't get to see the puppy because the puppy is declared inside the view only.</p>
|
|
||||||
<!-- #docregion child-component -->
|
|
||||||
<ng-content></ng-content>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<h3>Inside the view</h3>
|
|
||||||
<!-- #enddocregion child-component -->
|
|
||||||
<p>The following is inside the view so it does see the puppy.</p>
|
|
||||||
<!-- #docregion child-component -->
|
|
||||||
<app-inspector></app-inspector>
|
|
||||||
<!-- #enddocregion child-component -->
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
|||||||
// #docplaster
|
|
||||||
import { Component, OnInit, Host, SkipSelf, Optional } from '@angular/core';
|
|
||||||
import { FlowerService } from '../flower.service';
|
|
||||||
import { AnimalService } from '../animal.service';
|
|
||||||
|
|
||||||
// #docregion provide-animal-service
|
|
||||||
@Component({
|
|
||||||
selector: 'app-child',
|
|
||||||
templateUrl: './child.component.html',
|
|
||||||
styleUrls: ['./child.component.css'],
|
|
||||||
// provide services
|
|
||||||
providers: [{ provide: FlowerService, useValue: { emoji: '🌻' } }],
|
|
||||||
viewProviders: [{ provide: AnimalService, useValue: { emoji: '🐶' } }]
|
|
||||||
})
|
|
||||||
|
|
||||||
export class ChildComponent {
|
|
||||||
// inject service
|
|
||||||
constructor( public flower: FlowerService, public animal: AnimalService) { }
|
|
||||||
// #enddocregion provide-animal-service
|
|
||||||
|
|
||||||
// viewProviders ensures that only the view gets to see this.
|
|
||||||
// With the AnimalService in the viewProviders, the
|
|
||||||
// InspectorComponent doesn't get to see it because the
|
|
||||||
// inspector is in the content.
|
|
||||||
|
|
||||||
|
|
||||||
// constructor( public flower: FlowerService, @Optional() @Host() public animal: AnimalService) { }
|
|
||||||
|
|
||||||
// Comment out the above constructor and alternately
|
|
||||||
// uncomment the two following constructors to see the
|
|
||||||
// effects of @Host() and @Host() + @SkipSelf().
|
|
||||||
|
|
||||||
// constructor(
|
|
||||||
// @Host() public animal : AnimalService,
|
|
||||||
// @Host() @Optional() public flower : FlowerService) { }
|
|
||||||
|
|
||||||
// constructor(
|
|
||||||
// @SkipSelf() @Host() public animal : AnimalService,
|
|
||||||
// @SkipSelf() @Host() @Optional() public flower : FlowerService) { }
|
|
||||||
|
|
||||||
// #docregion provide-animal-service
|
|
||||||
}
|
|
||||||
// #enddocregion provide-animal-service
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
|||||||
import { Injectable } from '@angular/core';
|
|
||||||
|
|
||||||
// #docregion flowerservice
|
|
||||||
@Injectable({
|
|
||||||
providedIn: 'root'
|
|
||||||
})
|
|
||||||
export class FlowerService {
|
|
||||||
emoji = '🌺';
|
|
||||||
}
|
|
||||||
// #enddocregion flowerservice
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user