Compare commits
235 Commits
11.0.0-rc.
...
master
Author | SHA1 | Date | |
---|---|---|---|
![]() |
80073944a1 | ||
![]() |
a2aa45d3c7 | ||
![]() |
0731c7f634 | ||
![]() |
cf2d40e359 | ||
![]() |
0c47b7184c | ||
![]() |
752100487b | ||
![]() |
7a183c9920 | ||
![]() |
eac35a64e1 | ||
![]() |
0348f47f62 | ||
![]() |
79da3e8cd2 | ||
![]() |
67b431603a | ||
![]() |
604bd6e1cb | ||
![]() |
fdf572b3c5 | ||
![]() |
f6936406ca | ||
![]() |
a4909d6aa0 | ||
![]() |
600af0a5f6 | ||
![]() |
a0fcc0b839 | ||
![]() |
cf6efd91ae | ||
![]() |
ee02855bd5 | ||
![]() |
53fd049d12 | ||
![]() |
a025e98ede | ||
![]() |
768f81627e | ||
![]() |
c2924a10e7 | ||
![]() |
5af3281103 | ||
![]() |
0496e59a10 | ||
![]() |
6f07ef5236 | ||
![]() |
0f9ed1d7d6 | ||
![]() |
3aa0ca984c | ||
![]() |
77832458c9 | ||
![]() |
e10a578603 | ||
![]() |
b142d33bbe | ||
![]() |
bcabf710d0 | ||
![]() |
a725fe261a | ||
![]() |
ebee38994f | ||
![]() |
6ebb0246ab | ||
![]() |
c7a054fa31 | ||
![]() |
6ff6acbb21 | ||
![]() |
8a09cb9794 | ||
![]() |
eeb59b4f4d | ||
![]() |
7afbc3a1c1 | ||
![]() |
3da8ebf27e | ||
![]() |
7e33d531ae | ||
![]() |
32577820f4 | ||
![]() |
3686c640d6 | ||
![]() |
cbe53247fa | ||
![]() |
bbbae1065a | ||
![]() |
b5c3bb998d | ||
![]() |
4ff7aeadbb | ||
![]() |
86eaf57d53 | ||
![]() |
ff7b7a9c2f | ||
![]() |
dea267e5c8 | ||
![]() |
07200be358 | ||
![]() |
45e6bb4a74 | ||
![]() |
b44f7b1a5c | ||
![]() |
3c9c40c4b7 | ||
![]() |
15bb08eea6 | ||
![]() |
10953bddcb | ||
![]() |
7b87a797ed | ||
![]() |
4ea5a19a10 | ||
![]() |
ee263f3b97 | ||
![]() |
f73846cd6b | ||
![]() |
b2fd28d2b0 | ||
![]() |
05535d985b | ||
![]() |
4dc8aa2a27 | ||
![]() |
3d084ac910 | ||
![]() |
f8678d7513 | ||
![]() |
c50136e2cb | ||
![]() |
c3b4e0f37e | ||
![]() |
4d33c41e92 | ||
![]() |
eff4e3e3c2 | ||
![]() |
e6c7536d62 | ||
![]() |
5f4a06039e | ||
![]() |
05b9bb71b1 | ||
![]() |
c7cae616e0 | ||
![]() |
14daffecc5 | ||
![]() |
f6ae7d4f49 | ||
![]() |
316d9d5c34 | ||
![]() |
ba99c7792a | ||
![]() |
66a2af0c77 | ||
![]() |
ab87527e1d | ||
![]() |
a0486577a8 | ||
![]() |
6f4c65c029 | ||
![]() |
295f3796c6 | ||
![]() |
6362ec46d5 | ||
![]() |
de2b1c4bb4 | ||
![]() |
6aad16e11f | ||
![]() |
78b657e8f3 | ||
![]() |
ee9e65ecb1 | ||
![]() |
5341121fde | ||
![]() |
265581e525 | ||
![]() |
06da025393 | ||
![]() |
317bbd8f46 | ||
![]() |
9cb99bbaa8 | ||
![]() |
8a70ac0950 | ||
![]() |
9956446ad7 | ||
![]() |
f0865de125 | ||
![]() |
5cb6779305 | ||
![]() |
1e2e9201b2 | ||
![]() |
6062e658db | ||
![]() |
eca92ea193 | ||
![]() |
3177ce1f35 | ||
![]() |
faa17f8959 | ||
![]() |
d42a09e9b6 | ||
![]() |
408d38b223 | ||
![]() |
333a1266cc | ||
![]() |
a4912ff297 | ||
![]() |
a9920d6776 | ||
![]() |
71b1f1ad88 | ||
![]() |
a198e2984c | ||
![]() |
e160d8466c | ||
![]() |
575479a6a1 | ||
![]() |
8b97de61f5 | ||
![]() |
d870e5c309 | ||
![]() |
2da56a70a2 | ||
![]() |
0b2f134680 | ||
![]() |
5d32a199a9 | ||
![]() |
f677c22fba | ||
![]() |
97ae2d3b9b | ||
![]() |
a3fe2de883 | ||
![]() |
7f6c3b3fc1 | ||
![]() |
ab4ab682e5 | ||
![]() |
a69cb738a8 | ||
![]() |
e9eeee5608 | ||
![]() |
d89ab70036 | ||
![]() |
fa82a82a07 | ||
![]() |
39f92d985b | ||
![]() |
da0129b83e | ||
![]() |
c980caecac | ||
![]() |
b88abd81c8 | ||
![]() |
201c38e407 | ||
![]() |
31c53670e7 | ||
![]() |
e169f00193 | ||
![]() |
e1ee231993 | ||
![]() |
7d4aebd603 | ||
![]() |
2cde8da71c | ||
![]() |
6f54c28c87 | ||
![]() |
17841959f5 | ||
![]() |
cfe5fadb3a | ||
![]() |
3cd4a5ded5 | ||
![]() |
36156244a1 | ||
![]() |
a66a804082 | ||
![]() |
d2524eef7f | ||
![]() |
f6d2af17fc | ||
![]() |
a86754b4c4 | ||
![]() |
2968435f81 | ||
![]() |
4096bbfeee | ||
![]() |
0314fd4b6e | ||
![]() |
3f2257f209 | ||
![]() |
271e0f9896 | ||
![]() |
79b5e1891d | ||
![]() |
b4b453d6de | ||
![]() |
06f085560c | ||
![]() |
38fb735551 | ||
![]() |
b0ecee8155 | ||
![]() |
ba46a0c05b | ||
![]() |
0112164c34 | ||
![]() |
f60fafbb2e | ||
![]() |
004079b07a | ||
![]() |
523a1a71d7 | ||
![]() |
d3999d904a | ||
![]() |
63894062d4 | ||
![]() |
5c60a65eaf | ||
![]() |
c387933d3c | ||
![]() |
882336e0e6 | ||
![]() |
e91aa6db32 | ||
![]() |
325b3fd0db | ||
![]() |
84348299b3 | ||
![]() |
e934864a90 | ||
![]() |
920205bc61 | ||
![]() |
0dcc34837e | ||
![]() |
57d8d7fcd4 | ||
![]() |
f26f014ffc | ||
![]() |
134aa72467 | ||
![]() |
a7a8938291 | ||
![]() |
9338556872 | ||
![]() |
28ef4bc441 | ||
![]() |
686f9ae4b2 | ||
![]() |
a57119761b | ||
![]() |
6881149540 | ||
![]() |
4f842e23df | ||
![]() |
47873a339a | ||
![]() |
03e02185d9 | ||
![]() |
e565d97bc8 | ||
![]() |
6bf8d2b356 | ||
![]() |
2981656ebe | ||
![]() |
5ec0ba72cd | ||
![]() |
f020941629 | ||
![]() |
f1a92872a4 | ||
![]() |
9e7ce2c916 | ||
![]() |
788532dc99 | ||
![]() |
54679ea9cc | ||
![]() |
cb0aeaf708 | ||
![]() |
8de04115ec | ||
![]() |
e65e5ea9d0 | ||
![]() |
19b577bf66 | ||
![]() |
ccb0b42ffb | ||
![]() |
1d46ef38d2 | ||
![]() |
06356d806a | ||
![]() |
45847c62ce | ||
![]() |
9cb6bb8535 | ||
![]() |
e9b25a1e98 | ||
![]() |
ad51b996a2 | ||
![]() |
8a05f311b9 | ||
![]() |
e72267bc00 | ||
![]() |
2e0973a814 | ||
![]() |
27092a822a | ||
![]() |
0cd8e48c36 | ||
![]() |
2b95289ee2 | ||
![]() |
5df5ce6463 | ||
![]() |
04ad0077f4 | ||
![]() |
1bf2f118c7 | ||
![]() |
2119abf954 | ||
![]() |
fc728d0cfb | ||
![]() |
dd01edd168 | ||
![]() |
7c3edad3d4 | ||
![]() |
c4d76a65da | ||
![]() |
db394e2b81 | ||
![]() |
92c7145139 | ||
![]() |
d133525502 | ||
![]() |
cd1817bf6d | ||
![]() |
0d1491b1a6 | ||
![]() |
f67774d84b | ||
![]() |
37668d159e | ||
![]() |
38554288f5 | ||
![]() |
04dcc3bceb | ||
![]() |
0910a2fc0d | ||
![]() |
3325cb2f86 | ||
![]() |
a1e8443bfb | ||
![]() |
599d34b41e | ||
![]() |
7fd1733882 | ||
![]() |
2e42123870 | ||
![]() |
4cbb90daf7 | ||
![]() |
cf2663b034 | ||
![]() |
95681b16bd | ||
![]() |
e620827fa8 |
4
.bazelrc
4
.bazelrc
@ -74,8 +74,8 @@ test --test_output=errors
|
|||||||
# Trick bazel into treating BUILD files under integration/bazel as being regular files
|
# Trick bazel into treating BUILD files under integration/bazel as being regular files
|
||||||
# This lets us glob() up all the files inside this integration test to make them inputs to tests
|
# This lets us glob() up all the files inside this integration test to make them inputs to tests
|
||||||
# (Note, we cannot use common --deleted_packages because the bazel version command doesn't support it)
|
# (Note, we cannot use common --deleted_packages because the bazel version command doesn't support it)
|
||||||
build --deleted_packages=integration/bazel,integration/bazel/src,integration/bazel/src/hello-world,integration/bazel/test,integration/bazel/tools,integration/bazel/test/e2e
|
build --deleted_packages=integration/bazel,integration/bazel/src,integration/bazel/src/hello-world,integration/bazel/test,integration/bazel/test/e2e
|
||||||
query --deleted_packages=integration/bazel,integration/bazel/src,integration/bazel/src/hello-world,integration/bazel/test,integration/bazel/tools,integration/bazel/test/e2e
|
query --deleted_packages=integration/bazel,integration/bazel/src,integration/bazel/src/hello-world,integration/bazel/test,integration/bazel/test/e2e
|
||||||
|
|
||||||
################################
|
################################
|
||||||
# Temporary Settings for Ivy #
|
# Temporary Settings for Ivy #
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
3.5.1
|
3.2.0
|
||||||
# [NB: this comment has to be after the first line, see https://github.com/bazelbuild/bazelisk/issues/117]
|
# [NB: this comment has to be after the first line, see https://github.com/bazelbuild/bazelisk/issues/117]
|
||||||
# When updating the Bazel version you also need to update the RBE toolchains version in package.bzl
|
# When updating the Bazel version you also need to update the RBE toolchains version in package.bzl
|
||||||
|
@ -14,8 +14,8 @@ build --repository_cache=/home/circleci/bazel_repository_cache
|
|||||||
# 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_cpu_resources=20
|
build --local_cpu_resources=8
|
||||||
build --local_ram_resources=32768
|
build --local_ram_resources=14336
|
||||||
|
|
||||||
# All build executed remotely should be done using our RBE configuration.
|
# All build executed remotely should be done using our RBE configuration.
|
||||||
build:remote --google_default_credentials
|
build:remote --google_default_credentials
|
||||||
|
@ -6,9 +6,13 @@
|
|||||||
# https://docs.bazel.build/versions/master/guide.html#bazelrc-syntax-and-semantics
|
# https://docs.bazel.build/versions/master/guide.html#bazelrc-syntax-and-semantics
|
||||||
try-import %workspace%/.circleci/bazel.common.rc
|
try-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
|
||||||
|
|
||||||
# Manually set the local resources used in windows CI runs
|
# Manually set the local resources used in windows CI runs
|
||||||
build --local_ram_resources=120000
|
build --local_ram_resources=13500
|
||||||
build --local_cpu_resources=32
|
build --local_cpu_resources=4
|
||||||
|
|
||||||
# All windows jobs run on master and should use http caching
|
# All windows jobs run on master and should use http caching
|
||||||
build --remote_http_cache=https://storage.googleapis.com/angular-team-cache
|
build --remote_http_cache=https://storage.googleapis.com/angular-team-cache
|
||||||
|
@ -27,11 +27,8 @@ var_3: &cache_key v7-angular-node-12-{{ checksum ".bazelversion" }}-{{ checksum
|
|||||||
# folder will contain all previously used versions and ultimately cause the cache restoring to
|
# folder will contain all previously used versions and ultimately cause the cache restoring to
|
||||||
# be slower due to its growing size.
|
# be slower due to its growing size.
|
||||||
var_4: &cache_key_fallback v7-angular-node-12-{{ checksum ".bazelversion" }}
|
var_4: &cache_key_fallback v7-angular-node-12-{{ checksum ".bazelversion" }}
|
||||||
|
var_3_win: &cache_key_win v7-angular-win-node-12-{{ checksum ".bazelversion" }}-{{ checksum "yarn.lock" }}-{{ checksum "WORKSPACE" }}-{{ checksum "packages/bazel/package.bzl" }}-{{ checksum "aio/yarn.lock" }}
|
||||||
# Cache key for the `components-repo-unit-tests` job. **Note** when updating the SHA in the
|
var_4_win: &cache_key_win_fallback v7-angular-win-node-12-{{ checksum ".bazelversion" }}
|
||||||
# cache keys also update the SHA for the "COMPONENTS_REPO_COMMIT" environment variable.
|
|
||||||
var_5: &components_repo_unit_tests_cache_key v9-angular-components-09e68db8ed5b1253f2fe38ff954ef0df019fc25a
|
|
||||||
var_6: &components_repo_unit_tests_cache_key_fallback v9-angular-components-
|
|
||||||
|
|
||||||
# Workspace initially persisted by the `setup` job, and then enhanced by `build-npm-packages` and
|
# Workspace initially persisted by the `setup` job, and then enhanced by `build-npm-packages` and
|
||||||
# `build-ivy-npm-packages`.
|
# `build-ivy-npm-packages`.
|
||||||
@ -78,7 +75,7 @@ executors:
|
|||||||
|
|
||||||
windows-executor:
|
windows-executor:
|
||||||
working_directory: ~/ng
|
working_directory: ~/ng
|
||||||
resource_class: windows.2xlarge
|
resource_class: windows.medium
|
||||||
# CircleCI windows VMs do have the GitBash shell available:
|
# CircleCI windows VMs do have the GitBash shell available:
|
||||||
# https://github.com/CircleCI-Public/windows-preview-docs#shells
|
# https://github.com/CircleCI-Public/windows-preview-docs#shells
|
||||||
# But in this specific case we really should not use it because Bazel must not be ran from
|
# But in this specific case we really should not use it because Bazel must not be ran from
|
||||||
@ -154,39 +151,29 @@ commands:
|
|||||||
git config --global url."ssh://git@github.com".insteadOf "https://github.com" || true
|
git config --global url."ssh://git@github.com".insteadOf "https://github.com" || true
|
||||||
git config --global gc.auto 0 || true
|
git config --global gc.auto 0 || true
|
||||||
|
|
||||||
init_saucelabs_environment:
|
|
||||||
description: Sets up a domain that resolves to the local host.
|
|
||||||
steps:
|
|
||||||
- run:
|
|
||||||
name: Preparing environment for running tests on Sauce Labs.
|
|
||||||
command: |
|
|
||||||
# For SauceLabs jobs, we set up a domain which resolves to the machine which launched
|
|
||||||
# the tunnel. We do this because devices are sometimes not able to properly resolve
|
|
||||||
# `localhost` or `127.0.0.1` through the SauceLabs tunnel. Using a domain that does not
|
|
||||||
# resolve to anything on SauceLabs VMs ensures that such requests are always resolved
|
|
||||||
# through the tunnel, and resolve to the actual tunnel host machine (i.e. the CircleCI VM).
|
|
||||||
# More context can be found in: https://github.com/angular/angular/pull/35171.
|
|
||||||
setPublicVar SAUCE_LOCALHOST_ALIAS_DOMAIN "angular-ci.local"
|
|
||||||
setSecretVar SAUCE_ACCESS_KEY $(echo $SAUCE_ACCESS_KEY | rev)
|
|
||||||
- run:
|
|
||||||
# Sets up a local domain in the machine's host file that resolves to the local
|
|
||||||
# host. This domain is helpful in Sauce Labs tests where devices are not able to
|
|
||||||
# properly resolve `localhost` or `127.0.0.1` through the sauce-connect tunnel.
|
|
||||||
name: Setting up alias domain for local host.
|
|
||||||
command: echo "127.0.0.1 $SAUCE_LOCALHOST_ALIAS_DOMAIN" | sudo tee -a /etc/hosts
|
|
||||||
|
|
||||||
# Normally this would be an individual job instead of a command.
|
# Normally this would be an individual job instead of a command.
|
||||||
# But startup and setup time for each individual windows job are high enough to discourage
|
# But startup and setup time for each individual windows job are high enough to discourage
|
||||||
# many small jobs, so instead we use a command for setup unless the gain becomes significant.
|
# many small jobs, so instead we use a command for setup unless the gain becomes significant.
|
||||||
setup_win:
|
setup_win:
|
||||||
description: Setup windows node environment
|
description: Setup windows node environment
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
# Use the Linux workspace directly, as it already has checkout, rebased and node modules.
|
||||||
|
- custom_attach_workspace
|
||||||
# Install Bazel pre-requisites that aren't in the preconfigured CircleCI Windows VM.
|
# Install Bazel pre-requisites that aren't in the preconfigured CircleCI Windows VM.
|
||||||
- run: ./.circleci/windows-env.ps1
|
- run: ./.circleci/windows-env.ps1
|
||||||
- run: node --version
|
- run: node --version
|
||||||
- run: yarn --version
|
- run: yarn --version
|
||||||
|
- restore_cache:
|
||||||
|
keys:
|
||||||
|
- *cache_key_win
|
||||||
|
- *cache_key_win_fallback
|
||||||
|
# Reinstall to get windows binaries.
|
||||||
- run: yarn install --frozen-lockfile --non-interactive
|
- run: yarn install --frozen-lockfile --non-interactive
|
||||||
|
# Install @bazel/bazelisk globally and use that for the first run.
|
||||||
|
# Workaround for https://github.com/bazelbuild/rules_nodejs/issues/894
|
||||||
|
# NB: the issue was for @bazel/bazel but the same problem applies to @bazel/bazelisk
|
||||||
|
- run: yarn global add @bazel/bazelisk@$env:BAZELISK_VERSION
|
||||||
|
- run: bazelisk info
|
||||||
|
|
||||||
notify_webhook_on_fail:
|
notify_webhook_on_fail:
|
||||||
description: Notify a webhook about failure
|
description: Notify a webhook about failure
|
||||||
@ -259,110 +246,8 @@ jobs:
|
|||||||
- run: yarn -s tslint
|
- run: yarn -s tslint
|
||||||
- run: yarn -s ng-dev format changed $CI_GIT_BASE_REVISION --check
|
- run: yarn -s ng-dev format changed $CI_GIT_BASE_REVISION --check
|
||||||
- run: yarn -s ts-circular-deps:check
|
- run: yarn -s ts-circular-deps:check
|
||||||
- run: yarn -s ng-dev pullapprove verify
|
|
||||||
- run: yarn -s ng-dev ngbot verify
|
|
||||||
- run: yarn -s ng-dev commit-message validate-range --range $CI_COMMIT_RANGE
|
- run: yarn -s ng-dev commit-message validate-range --range $CI_COMMIT_RANGE
|
||||||
|
|
||||||
test:
|
|
||||||
executor:
|
|
||||||
name: default-executor
|
|
||||||
# Now that large integration tests are running locally in parallel (they can't run on RBE yet
|
|
||||||
# as they require network access for yarn install), this test is running out of memory
|
|
||||||
# consistently with the xlarge machine.
|
|
||||||
# TODO: switch back to xlarge once integration tests are running on remote-exec
|
|
||||||
resource_class: 2xlarge+
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
- install_chrome_libs
|
|
||||||
- install_java
|
|
||||||
- run:
|
|
||||||
command: yarn bazel test //... --build_tag_filters=-ivy-only --test_tag_filters=-ivy-only
|
|
||||||
no_output_timeout: 20m
|
|
||||||
|
|
||||||
# Temporary job to test what will happen when we flip the Ivy flag to true
|
|
||||||
test_ivy_aot:
|
|
||||||
executor:
|
|
||||||
name: default-executor
|
|
||||||
resource_class: xlarge
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
- install_chrome_libs
|
|
||||||
# We need to explicitly specify the --symlink_prefix option because otherwise we would
|
|
||||||
# not be able to easily find the output bin directory when uploading artifacts for size
|
|
||||||
# measurements.
|
|
||||||
- run:
|
|
||||||
command: yarn test-ivy-aot //... --symlink_prefix=dist/
|
|
||||||
no_output_timeout: 20m
|
|
||||||
|
|
||||||
# Publish bundle artifacts which will be used to calculate the size change. **Note**: Make
|
|
||||||
# sure that the size plugin from the Angular robot fetches the artifacts from this CircleCI
|
|
||||||
# job (see .github/angular-robot.yml). Additionally any artifacts need to be stored with the
|
|
||||||
# following path format: "{projectName}/{context}/{fileName}". This format is necessary
|
|
||||||
# because otherwise the bot is not able to pick up the artifacts from CircleCI. See:
|
|
||||||
# https://github.com/angular/github-robot/blob/master/functions/src/plugins/size.ts#L392-L394
|
|
||||||
- store_artifacts:
|
|
||||||
path: dist/bin/packages/core/test/bundling/hello_world/bundle.min.js
|
|
||||||
destination: core/hello_world/bundle
|
|
||||||
- store_artifacts:
|
|
||||||
path: dist/bin/packages/core/test/bundling/todo/bundle.min.js
|
|
||||||
destination: core/todo/bundle
|
|
||||||
- store_artifacts:
|
|
||||||
path: dist/bin/packages/core/test/bundling/hello_world/bundle.min.js.br
|
|
||||||
destination: core/hello_world/bundle.br
|
|
||||||
- store_artifacts:
|
|
||||||
path: dist/bin/packages/core/test/bundling/todo/bundle.min.js.br
|
|
||||||
destination: core/todo/bundle.br
|
|
||||||
|
|
||||||
# NOTE: This is currently limited to master builds only. See the `monitoring` configuration.
|
|
||||||
saucelabs_view_engine:
|
|
||||||
executor:
|
|
||||||
name: default-executor
|
|
||||||
# In order to avoid the bottleneck of having a slow host machine, we acquire a better
|
|
||||||
# container for this job. This is necessary because we launch a lot of browsers concurrently
|
|
||||||
# and therefore the tunnel and Karma need to process a lot of file requests and tests.
|
|
||||||
resource_class: xlarge
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
- init_saucelabs_environment
|
|
||||||
- run:
|
|
||||||
name: Run Bazel tests on Saucelabs with ViewEngine
|
|
||||||
# See /tools/saucelabs/README.md for more info
|
|
||||||
command: |
|
|
||||||
yarn bazel run //tools/saucelabs:sauce_service_setup
|
|
||||||
TESTS=$(./node_modules/.bin/bazelisk query --output label '(kind(karma_web_test, ...) intersect attr("tags", "saucelabs", ...)) except attr("tags", "ivy-only", ...) except attr("tags", "fixme-saucelabs-ve", ...)')
|
|
||||||
yarn bazel test --config=saucelabs ${TESTS}
|
|
||||||
yarn bazel run //tools/saucelabs:sauce_service_stop
|
|
||||||
no_output_timeout: 40m
|
|
||||||
- notify_webhook_on_fail:
|
|
||||||
webhook_url_env_var: SLACK_DEV_INFRA_CI_FAILURES_WEBHOOK_URL
|
|
||||||
|
|
||||||
# NOTE: This is currently limited to master builds only. See the `monitoring` configuration.
|
|
||||||
saucelabs_ivy:
|
|
||||||
executor:
|
|
||||||
name: default-executor
|
|
||||||
# In order to avoid the bottleneck of having a slow host machine, we acquire a better
|
|
||||||
# container for this job. This is necessary because we launch a lot of browsers concurrently
|
|
||||||
# and therefore the tunnel and Karma need to process a lot of file requests and tests.
|
|
||||||
resource_class: xlarge
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
- init_saucelabs_environment
|
|
||||||
- run:
|
|
||||||
name: Run Bazel tests on Saucelabs with Ivy
|
|
||||||
# See /tools/saucelabs/README.md for more info
|
|
||||||
command: |
|
|
||||||
yarn bazel run //tools/saucelabs:sauce_service_setup
|
|
||||||
TESTS=$(./node_modules/.bin/bazelisk query --output label '(kind(karma_web_test, ...) intersect attr("tags", "saucelabs", ...)) except attr("tags", "no-ivy-aot", ...) except attr("tags", "fixme-saucelabs-ivy", ...)')
|
|
||||||
yarn bazel test --config=saucelabs --config=ivy ${TESTS}
|
|
||||||
yarn bazel run //tools/saucelabs:sauce_service_stop
|
|
||||||
no_output_timeout: 40m
|
|
||||||
- notify_webhook_on_fail:
|
|
||||||
webhook_url_env_var: SLACK_DEV_INFRA_CI_FAILURES_WEBHOOK_URL
|
|
||||||
|
|
||||||
test_aio:
|
test_aio:
|
||||||
executor: default-executor
|
executor: default-executor
|
||||||
steps:
|
steps:
|
||||||
@ -381,10 +266,6 @@ jobs:
|
|||||||
- run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE
|
- run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE
|
||||||
# Run accessibility tests
|
# Run accessibility tests
|
||||||
- run: yarn --cwd aio test-a11y-score-localhost
|
- run: yarn --cwd aio test-a11y-score-localhost
|
||||||
# Check the bundle sizes.
|
|
||||||
- run: yarn --cwd aio payload-size
|
|
||||||
# Run unit tests for Firebase redirects
|
|
||||||
- run: yarn --cwd aio redirects-test
|
|
||||||
|
|
||||||
deploy_aio:
|
deploy_aio:
|
||||||
executor: default-executor
|
executor: default-executor
|
||||||
@ -414,8 +295,6 @@ jobs:
|
|||||||
- run: yarn --cwd aio e2e --configuration=ci
|
- run: yarn --cwd aio e2e --configuration=ci
|
||||||
# Run PWA-score tests
|
# Run PWA-score tests
|
||||||
- run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE
|
- run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE
|
||||||
# Check the bundle sizes.
|
|
||||||
- run: yarn --cwd aio payload-size aio-local<<# parameters.viewengine >>-viewengine<</ parameters.viewengine >>
|
|
||||||
|
|
||||||
test_aio_tools:
|
test_aio_tools:
|
||||||
executor: default-executor
|
executor: default-executor
|
||||||
@ -429,26 +308,6 @@ jobs:
|
|||||||
- run: yarn --cwd aio tools-test
|
- run: yarn --cwd aio tools-test
|
||||||
- run: ./aio/aio-builds-setup/scripts/test.sh
|
- run: ./aio/aio-builds-setup/scripts/test.sh
|
||||||
|
|
||||||
test_docs_examples:
|
|
||||||
parameters:
|
|
||||||
viewengine:
|
|
||||||
type: boolean
|
|
||||||
default: false
|
|
||||||
executor:
|
|
||||||
name: default-executor
|
|
||||||
resource_class: xlarge
|
|
||||||
parallelism: 5
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
- install_chrome_libs
|
|
||||||
# Install aio
|
|
||||||
- run: yarn --cwd aio install --frozen-lockfile --non-interactive
|
|
||||||
# Run examples tests. The "CIRCLE_NODE_INDEX" will be set if "parallelism" is enabled.
|
|
||||||
# Since the parallelism is set to "5", there will be five parallel CircleCI containers.
|
|
||||||
# with either "0", "1", etc as node index. This can be passed to the "--shard" argument.
|
|
||||||
- run: yarn --cwd aio example-e2e --setup --local <<# parameters.viewengine >>--viewengine<</ parameters.viewengine >> --cliSpecsConcurrency=5 --shard=${CIRCLE_NODE_INDEX}/${CIRCLE_NODE_TOTAL} --retry 2
|
|
||||||
|
|
||||||
# This job should only be run on PR builds, where `CI_PULL_REQUEST` is not `false`.
|
# This job should only be run on PR builds, where `CI_PULL_REQUEST` is not `false`.
|
||||||
aio_preview:
|
aio_preview:
|
||||||
executor: default-executor
|
executor: default-executor
|
||||||
@ -477,7 +336,6 @@ jobs:
|
|||||||
name: Wait for preview and run tests
|
name: Wait for preview and run tests
|
||||||
command: node aio/scripts/test-preview.js $CI_PULL_REQUEST $CI_COMMIT $CI_AIO_MIN_PWA_SCORE
|
command: node aio/scripts/test-preview.js $CI_PULL_REQUEST $CI_COMMIT $CI_AIO_MIN_PWA_SCORE
|
||||||
|
|
||||||
|
|
||||||
# The `build-npm-packages` tasks exist for backwards-compatibility with old scripts and
|
# The `build-npm-packages` tasks exist for backwards-compatibility with old scripts and
|
||||||
# tests that rely on the pre-Bazel `dist/packages-dist` output structure (build.sh).
|
# tests that rely on the pre-Bazel `dist/packages-dist` output structure (build.sh).
|
||||||
# Having multiple jobs that independently build in this manner duplicates some work; we build
|
# Having multiple jobs that independently build in this manner duplicates some work; we build
|
||||||
@ -489,7 +347,7 @@ jobs:
|
|||||||
build-npm-packages:
|
build-npm-packages:
|
||||||
executor:
|
executor:
|
||||||
name: default-executor
|
name: default-executor
|
||||||
resource_class: xlarge
|
resource_class: medium
|
||||||
steps:
|
steps:
|
||||||
- custom_attach_workspace
|
- custom_attach_workspace
|
||||||
- init_environment
|
- init_environment
|
||||||
@ -511,264 +369,6 @@ jobs:
|
|||||||
- "~/bazel_repository_cache"
|
- "~/bazel_repository_cache"
|
||||||
- "~/.cache/bazelisk"
|
- "~/.cache/bazelisk"
|
||||||
|
|
||||||
# Build the ivy npm packages.
|
|
||||||
build-ivy-npm-packages:
|
|
||||||
executor:
|
|
||||||
name: default-executor
|
|
||||||
resource_class: xlarge
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
- run: node scripts/build/build-ivy-npm-packages.js
|
|
||||||
|
|
||||||
# Save the npm packages from //packages/... for other workflow jobs to read
|
|
||||||
- persist_to_workspace:
|
|
||||||
root: *workspace_location
|
|
||||||
paths:
|
|
||||||
- ng/dist/packages-dist-ivy-aot
|
|
||||||
- ng/dist/zone.js-dist-ivy-aot
|
|
||||||
|
|
||||||
# This job creates compressed tarballs (`.tgz` files) for all Angular packages and stores them as
|
|
||||||
# build artifacts. This makes it easy to try out changes from a PR build for testing purposes.
|
|
||||||
# More info CircleCI build artifacts: https://circleci.com/docs/2.0/artifacts
|
|
||||||
#
|
|
||||||
# NOTE: Currently, this job only runs for PR builds. See `publish_snapshot` for non-PR builds.
|
|
||||||
publish_packages_as_artifacts:
|
|
||||||
executor: default-executor
|
|
||||||
environment:
|
|
||||||
NG_PACKAGES_DIR: &ng_packages_dir 'dist/packages-dist'
|
|
||||||
NG_PACKAGES_ARCHIVES_DIR: &ng_packages_archives_dir 'dist/packages-dist-archives'
|
|
||||||
ZONEJS_PACKAGES_DIR: &zonejs_packages_dir 'dist/zone.js-dist'
|
|
||||||
ZONEJS_PACKAGES_ARCHIVES_DIR: &zonejs_packages_archives_dir 'dist/zone.js-dist-archives'
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
# Publish `@angular/*` packages.
|
|
||||||
- run:
|
|
||||||
name: Create artifacts for @angular/* packages
|
|
||||||
command: ./scripts/ci/create-package-archives.sh $CI_BRANCH $CI_COMMIT $NG_PACKAGES_DIR $NG_PACKAGES_ARCHIVES_DIR
|
|
||||||
- store_artifacts:
|
|
||||||
path: *ng_packages_archives_dir
|
|
||||||
destination: angular
|
|
||||||
# Publish `zone.js` package.
|
|
||||||
- run:
|
|
||||||
name: Create artifacts for zone.js package
|
|
||||||
command: ./scripts/ci/create-package-archives.sh $CI_BRANCH $CI_COMMIT $ZONEJS_PACKAGES_DIR $ZONEJS_PACKAGES_ARCHIVES_DIR
|
|
||||||
- store_artifacts:
|
|
||||||
path: *zonejs_packages_archives_dir
|
|
||||||
destination: zone.js
|
|
||||||
|
|
||||||
# This job updates the content of repos like github.com/angular/core-builds
|
|
||||||
# for every green build on angular/angular.
|
|
||||||
publish_snapshot:
|
|
||||||
executor: default-executor
|
|
||||||
steps:
|
|
||||||
# See below - ideally this job should not trigger for non-upstream builds.
|
|
||||||
# But since it does, we have to check this condition.
|
|
||||||
- run:
|
|
||||||
name: Skip this job for Pull Requests and Fork builds
|
|
||||||
# Note: Using `CIRCLE_*` env variables (instead of those defined in `env.sh` so that this
|
|
||||||
# step can be run before `init_environment`.
|
|
||||||
command: >
|
|
||||||
if [[ -n "${CIRCLE_PR_NUMBER}" ]] ||
|
|
||||||
[[ "$CIRCLE_PROJECT_USERNAME" != "angular" ]] ||
|
|
||||||
[[ "$CIRCLE_PROJECT_REPONAME" != "angular" ]]; then
|
|
||||||
circleci step halt
|
|
||||||
fi
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
# CircleCI has a config setting to force SSH for all github connections
|
|
||||||
# This is not compatible with our mechanism of using a Personal Access Token
|
|
||||||
# Clear the global setting
|
|
||||||
- run: git config --global --unset "url.ssh://git@github.com.insteadof"
|
|
||||||
- run:
|
|
||||||
name: Decrypt github credentials
|
|
||||||
# We need ensure that the same default digest is used for encoding and decoding with
|
|
||||||
# OpenSSL. OpenSSL versions might have different default digests which can cause
|
|
||||||
# decryption failures based on the installed OpenSSL version. https://stackoverflow.com/a/39641378/4317734
|
|
||||||
command: 'openssl aes-256-cbc -d -in .circleci/github_token -md md5 -k "${KEY}" -out ~/.git_credentials'
|
|
||||||
- run: ./scripts/ci/publish-build-artifacts.sh
|
|
||||||
|
|
||||||
aio_monitoring_stable:
|
|
||||||
executor: default-executor
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
- install_chrome_libs
|
|
||||||
- run: setPublicVar_CI_STABLE_BRANCH
|
|
||||||
- run:
|
|
||||||
name: Check out `aio/` and yarn from the stable branch
|
|
||||||
command: |
|
|
||||||
git fetch origin $CI_STABLE_BRANCH
|
|
||||||
git checkout --force origin/$CI_STABLE_BRANCH -- aio/ .yarn/ .yarnrc
|
|
||||||
# Ignore yarn's engines check, because we checked out `aio/package.json` from the stable
|
|
||||||
# branch and there could be a node version skew, which is acceptable in this monitoring job.
|
|
||||||
- run: yarn config set ignore-engines true
|
|
||||||
- run:
|
|
||||||
name: Run tests against https://angular.io/
|
|
||||||
command: ./aio/scripts/test-production.sh https://angular.io/ $CI_AIO_MIN_PWA_SCORE
|
|
||||||
- notify_webhook_on_fail:
|
|
||||||
webhook_url_env_var: SLACK_CARETAKER_WEBHOOK_URL
|
|
||||||
- notify_webhook_on_fail:
|
|
||||||
webhook_url_env_var: SLACK_DEV_INFRA_CI_FAILURES_WEBHOOK_URL
|
|
||||||
|
|
||||||
aio_monitoring_next:
|
|
||||||
executor: default-executor
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
- install_chrome_libs
|
|
||||||
- run:
|
|
||||||
name: Run tests against https://next.angular.io/
|
|
||||||
command: ./aio/scripts/test-production.sh https://next.angular.io/ $CI_AIO_MIN_PWA_SCORE
|
|
||||||
- notify_webhook_on_fail:
|
|
||||||
webhook_url_env_var: SLACK_CARETAKER_WEBHOOK_URL
|
|
||||||
- notify_webhook_on_fail:
|
|
||||||
webhook_url_env_var: SLACK_DEV_INFRA_CI_FAILURES_WEBHOOK_URL
|
|
||||||
|
|
||||||
legacy-unit-tests-saucelabs:
|
|
||||||
executor:
|
|
||||||
name: default-executor
|
|
||||||
# In order to avoid the bottleneck of having a slow host machine, we acquire a better
|
|
||||||
# container for this job. This is necessary because we launch a lot of browsers concurrently
|
|
||||||
# and therefore the tunnel and Karma need to process a lot of file requests and tests.
|
|
||||||
resource_class: xlarge
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
- init_saucelabs_environment
|
|
||||||
- run:
|
|
||||||
name: Starting Saucelabs tunnel service
|
|
||||||
command: ./tools/saucelabs/sauce-service.sh run
|
|
||||||
background: true
|
|
||||||
# add module umd tsc compile option so the test can work
|
|
||||||
# properly in the legacy browsers
|
|
||||||
- run: yarn tsc -p packages --module UMD
|
|
||||||
- run: yarn tsc -p modules --module UMD
|
|
||||||
- run: yarn bazel build //packages/zone.js:npm_package
|
|
||||||
# Build test fixtures for a test that rely on Bazel-generated fixtures. Note that disabling
|
|
||||||
# specific tests which are reliant on such generated fixtures is not an option as SystemJS
|
|
||||||
# in the Saucelabs legacy job always fetches referenced files, even if the imports would be
|
|
||||||
# guarded by an check to skip in the Saucelabs legacy job. We should be good running such
|
|
||||||
# test in all supported browsers on Saucelabs anyway until this job can be removed.
|
|
||||||
- run:
|
|
||||||
name: Preparing Bazel-generated fixtures required in legacy tests
|
|
||||||
command: |
|
|
||||||
yarn bazel build //packages/core/test:downleveled_es5_fixture
|
|
||||||
# Needed for the ES5 downlevel reflector test in `packages/core/test/reflection`.
|
|
||||||
cp dist/bin/packages/core/test/reflection/es5_downleveled_inheritance_fixture.js \
|
|
||||||
dist/all/@angular/core/test/reflection/es5_downleveled_inheritance_fixture.js
|
|
||||||
- run:
|
|
||||||
# Waiting on ready ensures that we don't run tests too early without Saucelabs not being ready.
|
|
||||||
name: Waiting for Saucelabs tunnel to connect
|
|
||||||
command: ./tools/saucelabs/sauce-service.sh ready-wait
|
|
||||||
- run:
|
|
||||||
name: Running tests on Saucelabs.
|
|
||||||
command: |
|
|
||||||
browsers=$(node -e 'console.log(require("./browser-providers.conf").sauceAliases.CI_REQUIRED.join(","))')
|
|
||||||
yarn karma start ./karma-js.conf.js --single-run --browsers=${browsers}
|
|
||||||
- run:
|
|
||||||
name: Stop Saucelabs tunnel service
|
|
||||||
command: ./tools/saucelabs/sauce-service.sh stop
|
|
||||||
|
|
||||||
# Job that runs all unit tests of the `angular/components` repository.
|
|
||||||
components-repo-unit-tests:
|
|
||||||
executor:
|
|
||||||
name: default-executor
|
|
||||||
resource_class: xlarge
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
# Restore the cache before cloning the repository because the clone script re-uses
|
|
||||||
# the restored repository if present. This reduces the amount of times the components
|
|
||||||
# repository needs to be cloned (this is slow and increases based on commits in the repo).
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- *components_repo_unit_tests_cache_key
|
|
||||||
# Whenever the `angular/components` SHA is updated, the cache key will no longer
|
|
||||||
# match. The fallback cache will still match, and CircleCI will restore the most
|
|
||||||
# recently cached repository folder. Without the fallback cache, we'd need to download
|
|
||||||
# the repository from scratch and it would slow down the job. This is because we can't
|
|
||||||
# clone the repository with reduced `--depth`, but rather need to clone the whole
|
|
||||||
# repository to be able to support arbitrary SHAs.
|
|
||||||
- *components_repo_unit_tests_cache_key_fallback
|
|
||||||
- run:
|
|
||||||
name: "Fetching angular/components repository"
|
|
||||||
command: ./scripts/ci/clone_angular_components_repo.sh
|
|
||||||
- run:
|
|
||||||
# Run yarn install to fetch the Bazel binaries as used in the components repo.
|
|
||||||
name: Installing dependencies.
|
|
||||||
# TODO: remove this once the repo has been updated to use NodeJS v12 and Yarn 1.19.1.
|
|
||||||
# We temporarily ignore the "engines" because the Angular components repository has
|
|
||||||
# minimum dependency on NodeJS v12 and Yarn 1.19.1, but the framework repository uses
|
|
||||||
# older versions.
|
|
||||||
command: yarn --ignore-engines --cwd ${COMPONENTS_REPO_TMP_DIR} install --frozen-lockfile --non-interactive
|
|
||||||
- save_cache:
|
|
||||||
key: *components_repo_unit_tests_cache_key
|
|
||||||
paths:
|
|
||||||
# Temporary directory must be kept in sync with the `$COMPONENTS_REPO_TMP_DIR` env
|
|
||||||
# variable. It needs to be hardcoded here, because env variables interpolation is
|
|
||||||
# not supported.
|
|
||||||
- "/tmp/angular-components-repo"
|
|
||||||
- run:
|
|
||||||
# Updates the `angular/components` `package.json` file to refer to the release output
|
|
||||||
# inside the `packages-dist` directory. Note that it's not necessary to perform a yarn
|
|
||||||
# install as Bazel runs Yarn automatically when needed.
|
|
||||||
name: Setting up release packages.
|
|
||||||
command: node scripts/ci/update-deps-to-dist-packages.js ${COMPONENTS_REPO_TMP_DIR}/package.json dist/packages-dist/
|
|
||||||
- run:
|
|
||||||
name: "Running `angular/components` unit tests"
|
|
||||||
command: ./scripts/ci/run_angular_components_unit_tests.sh
|
|
||||||
|
|
||||||
test_zonejs:
|
|
||||||
executor:
|
|
||||||
name: default-executor
|
|
||||||
resource_class: xlarge
|
|
||||||
steps:
|
|
||||||
- custom_attach_workspace
|
|
||||||
- init_environment
|
|
||||||
# Install
|
|
||||||
- run: yarn --cwd packages/zone.js install --frozen-lockfile --non-interactive
|
|
||||||
# Run zone.js tools tests
|
|
||||||
- run: yarn --cwd packages/zone.js promisetest
|
|
||||||
- run: yarn --cwd packages/zone.js promisefinallytest
|
|
||||||
- run: yarn bazel build //packages/zone.js:npm_package &&
|
|
||||||
cp dist/bin/packages/zone.js/npm_package/bundles/zone-mix.umd.js ./packages/zone.js/test/extra/ &&
|
|
||||||
cp dist/bin/packages/zone.js/npm_package/bundles/zone-patch-electron.umd.js ./packages/zone.js/test/extra/ &&
|
|
||||||
yarn --cwd packages/zone.js electrontest
|
|
||||||
- run: yarn --cwd packages/zone.js jest:test
|
|
||||||
- run: yarn --cwd packages/zone.js jest:nodetest
|
|
||||||
- run: yarn --cwd packages/zone.js/test/typings install --frozen-lockfile --non-interactive
|
|
||||||
- run: yarn --cwd packages/zone.js/test/typings test
|
|
||||||
|
|
||||||
# Windows jobs
|
|
||||||
# Docs: https://circleci.com/docs/2.0/hello-world-windows/
|
|
||||||
test_win:
|
|
||||||
executor: windows-executor
|
|
||||||
steps:
|
|
||||||
- setup_win
|
|
||||||
- run:
|
|
||||||
name: Build all windows CI targets
|
|
||||||
command: yarn bazel build --build_tag_filters=-ivy-only //packages/compiler-cli/... //tools/ts-api-guardian/...
|
|
||||||
no_output_timeout: 15m
|
|
||||||
- run:
|
|
||||||
name: Test all windows CI targets
|
|
||||||
command: yarn bazel test --test_tag_filters="-ivy-only,-browser:chromium-local" //packages/compiler-cli/... //tools/ts-api-guardian/...
|
|
||||||
no_output_timeout: 15m
|
|
||||||
|
|
||||||
test_ivy_aot_win:
|
|
||||||
executor: windows-executor
|
|
||||||
steps:
|
|
||||||
- setup_win
|
|
||||||
- run:
|
|
||||||
name: Build all windows CI targets
|
|
||||||
command: yarn bazel build --config=ivy --build_tag_filters=-no-ivy-aot,-fixme-ivy-aot //packages/compiler-cli/... //tools/ts-api-guardian/...
|
|
||||||
no_output_timeout: 15m
|
|
||||||
- run:
|
|
||||||
name: Test all windows CI targets
|
|
||||||
command: yarn bazel test --config=ivy --test_tag_filters="-no-ivy-aot,-fixme-ivy-aot,-browser:chromium-local" //packages/compiler-cli/... //tools/ts-api-guardian/...
|
|
||||||
no_output_timeout: 15m
|
|
||||||
|
|
||||||
|
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
version: 2
|
||||||
@ -781,21 +381,9 @@ workflows:
|
|||||||
- lint:
|
- lint:
|
||||||
requires:
|
requires:
|
||||||
- setup
|
- setup
|
||||||
- test:
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
- test_ivy_aot:
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
- build-npm-packages:
|
- build-npm-packages:
|
||||||
requires:
|
requires:
|
||||||
- setup
|
- setup
|
||||||
- build-ivy-npm-packages:
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
- legacy-unit-tests-saucelabs:
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
- test_aio:
|
- test_aio:
|
||||||
requires:
|
requires:
|
||||||
- setup
|
- setup
|
||||||
@ -805,22 +393,9 @@ workflows:
|
|||||||
- test_aio_local:
|
- test_aio_local:
|
||||||
requires:
|
requires:
|
||||||
- build-npm-packages
|
- build-npm-packages
|
||||||
- test_aio_local:
|
|
||||||
name: test_aio_local_viewengine
|
|
||||||
viewengine: true
|
|
||||||
requires:
|
|
||||||
- build-npm-packages
|
|
||||||
- test_aio_tools:
|
- test_aio_tools:
|
||||||
requires:
|
requires:
|
||||||
- build-npm-packages
|
- build-npm-packages
|
||||||
- test_docs_examples:
|
|
||||||
requires:
|
|
||||||
- build-npm-packages
|
|
||||||
- test_docs_examples:
|
|
||||||
name: test_docs_examples_viewengine
|
|
||||||
viewengine: true
|
|
||||||
requires:
|
|
||||||
- build-npm-packages
|
|
||||||
- aio_preview:
|
- aio_preview:
|
||||||
# Only run on PR builds. (There can be no previews for non-PR builds.)
|
# Only run on PR builds. (There can be no previews for non-PR builds.)
|
||||||
<<: *only_on_pull_requests
|
<<: *only_on_pull_requests
|
||||||
@ -829,77 +404,3 @@ workflows:
|
|||||||
- test_aio_preview:
|
- test_aio_preview:
|
||||||
requires:
|
requires:
|
||||||
- aio_preview
|
- aio_preview
|
||||||
- publish_packages_as_artifacts:
|
|
||||||
requires:
|
|
||||||
- build-npm-packages
|
|
||||||
- publish_snapshot:
|
|
||||||
# Note: no filters on this job because we want it to run for all upstream branches
|
|
||||||
# We'd really like to filter out pull requests here, but not yet available:
|
|
||||||
# https://discuss.circleci.com/t/workflows-pull-request-filter/14396/4
|
|
||||||
# Instead, the job just exits immediately at the first step.
|
|
||||||
requires:
|
|
||||||
# Only publish if tests and integration tests pass
|
|
||||||
- test
|
|
||||||
- test_ivy_aot
|
|
||||||
# Only publish if `aio`/`docs` tests using the locally built Angular packages pass
|
|
||||||
- test_aio_local
|
|
||||||
- test_aio_local_viewengine
|
|
||||||
- test_docs_examples
|
|
||||||
- test_docs_examples_viewengine
|
|
||||||
# Get the artifacts to publish from the build-packages-dist job
|
|
||||||
# since the publishing script expects the legacy outputs layout.
|
|
||||||
- build-npm-packages
|
|
||||||
- build-ivy-npm-packages
|
|
||||||
- legacy-unit-tests-saucelabs
|
|
||||||
# Temporarily disabled components-repo-unit-tests to update rules_nodejs to 2.0.0. Breaking changes in
|
|
||||||
# rules_nodejs create a dependency sandwich between angular/angular & angular/components that are very
|
|
||||||
# difficult and time consuming to resolve and involve patching @angular/bazel in components repo such
|
|
||||||
# as https://github.com/angular/components/commit/9e7ba251207df77164d73d66620e619bcbc4d2ad. It is simpler to
|
|
||||||
# 1) land angular/angular upgrade to rule_nodejs 2.0.0 which has breaking changes
|
|
||||||
# 2) land angular/components upgrade to rules_nodejs 2.0.0 using the @angular/bazel builds snapshot
|
|
||||||
# 3) update angular/angular to the landed components commit and re-enable these tests
|
|
||||||
# - components-repo-unit-tests:
|
|
||||||
# requires:
|
|
||||||
# - build-npm-packages
|
|
||||||
- test_zonejs:
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
- test_win:
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
- test_ivy_aot_win:
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
|
|
||||||
monitoring:
|
|
||||||
jobs:
|
|
||||||
- setup
|
|
||||||
- aio_monitoring_stable:
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
- aio_monitoring_next:
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
- saucelabs_ivy:
|
|
||||||
# Testing saucelabs via Bazel currently taking longer than the legacy saucelabs job as it
|
|
||||||
# each karma_web_test target is provisioning and tearing down browsers which is adding
|
|
||||||
# a lot of overhead. Running once daily on master only to avoid wasting resources and
|
|
||||||
# slowing down CI for PRs.
|
|
||||||
# TODO: Run this job on all branches (including PRs) once karma_web_test targets can
|
|
||||||
# share provisioned browsers and we can remove the legacy saucelabs job.
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
- saucelabs_view_engine:
|
|
||||||
# Testing saucelabs via Bazel currently taking longer than the legacy saucelabs job as it
|
|
||||||
# each karma_web_test target is provisioning and tearing down browsers which is adding
|
|
||||||
# a lot of overhead. Running once daily on master only to avoid wasting resources and
|
|
||||||
# slowing down CI for PRs.
|
|
||||||
# TODO: Run this job on all branches (including PRs) once karma_web_test targets can
|
|
||||||
# share provisioned browsers and we can remove the legacy saucelabs job.
|
|
||||||
requires:
|
|
||||||
- setup
|
|
||||||
triggers:
|
|
||||||
- schedule:
|
|
||||||
<<: *only_on_master
|
|
||||||
# Runs monitoring jobs at 10:00AM every day.
|
|
||||||
cron: "0 10 * * *"
|
|
||||||
|
@ -17,7 +17,7 @@ echo "source $envHelpersPath;" >> $BASH_ENV;
|
|||||||
####################################################################################################
|
####################################################################################################
|
||||||
setPublicVar CI "$CI"
|
setPublicVar CI "$CI"
|
||||||
setPublicVar PROJECT_ROOT "$projectDir";
|
setPublicVar PROJECT_ROOT "$projectDir";
|
||||||
setPublicVar CI_AIO_MIN_PWA_SCORE "95";
|
setPublicVar CI_AIO_MIN_PWA_SCORE "62";
|
||||||
# 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";
|
setPublicVar CI_BUILD_URL "$CIRCLE_BUILD_URL";
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
# https://docs.bazel.build/versions/master/install-windows.html
|
# https://docs.bazel.build/versions/master/install-windows.html
|
||||||
# https://docs.bazel.build/versions/master/windows.html
|
# https://docs.bazel.build/versions/master/windows.html
|
||||||
# Install MSYS2 and packages
|
# Install MSYS2 and packages
|
||||||
choco install msys2 --version 20200903.0.0 --no-progress --package-parameters "/NoUpdate"
|
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"
|
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.
|
# 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)
|
# https://docs.microsoft.com/en-us/previous-versions//bb613488(v=vs.85)
|
||||||
@ -41,8 +41,7 @@ copy .circleci\bazel.windows.rc ${Env:USERPROFILE}\.bazelrc
|
|||||||
####################################################################################################
|
####################################################################################################
|
||||||
# Install specific version of node.
|
# Install specific version of node.
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
nvm install 12.14.1
|
choco install nodejs --version 12.14.1 --no-progress
|
||||||
nvm use 12.14.1
|
|
||||||
|
|
||||||
# These Bazel prereqs aren't needed because the CircleCI image already includes them.
|
# These Bazel prereqs aren't needed because the CircleCI image already includes them.
|
||||||
# choco install yarn --version 1.16.0 --no-progress
|
# choco install yarn --version 1.16.0 --no-progress
|
||||||
|
69
.github/ISSUE_TEMPLATE/1-bug-report.md
vendored
69
.github/ISSUE_TEMPLATE/1-bug-report.md
vendored
@ -1,69 +0,0 @@
|
|||||||
---
|
|
||||||
name: "\U0001F41E Bug report"
|
|
||||||
about: Report a bug in the Angular Framework
|
|
||||||
---
|
|
||||||
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
|
|
||||||
|
|
||||||
Oh hi there! 😄
|
|
||||||
|
|
||||||
To expedite issue processing please search open and closed issues before submitting a new one.
|
|
||||||
Existing issues often contain information about workarounds, resolution, or progress updates.
|
|
||||||
|
|
||||||
🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅-->
|
|
||||||
|
|
||||||
|
|
||||||
# 🐞 bug report
|
|
||||||
|
|
||||||
### Affected Package
|
|
||||||
<!-- Can you pin-point one or more @angular/* packages as the source of the bug? -->
|
|
||||||
<!-- ✍️edit: --> The issue is caused by package @angular/....
|
|
||||||
|
|
||||||
|
|
||||||
### Is this a regression?
|
|
||||||
|
|
||||||
<!-- Did this behavior use to work in the previous version? -->
|
|
||||||
<!-- ✍️--> Yes, the previous version in which this bug was not present was: ....
|
|
||||||
|
|
||||||
|
|
||||||
### Description
|
|
||||||
|
|
||||||
<!-- ✍️--> A clear and concise description of the problem...
|
|
||||||
|
|
||||||
|
|
||||||
## 🔬 Minimal Reproduction
|
|
||||||
<!--
|
|
||||||
Please create and share minimal reproduction of the issue starting with this template: https://stackblitz.com/fork/angular-ivy
|
|
||||||
-->
|
|
||||||
<!-- ✍️--> https://stackblitz.com/...
|
|
||||||
|
|
||||||
<!--
|
|
||||||
If StackBlitz is not suitable for reproduction of your issue, please create a minimal GitHub repository with the reproduction of the issue.
|
|
||||||
A good way to make a minimal reproduction is to create a new app via `ng new repro-app` and add the minimum possible code to show the problem.
|
|
||||||
Share the link to the repo below along with step-by-step instructions to reproduce the problem, as well as expected and actual behavior.
|
|
||||||
|
|
||||||
Issues that don't have enough info and can't be reproduced will be closed.
|
|
||||||
|
|
||||||
You can read more about issue submission guidelines here: https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-submitting-an-issue
|
|
||||||
-->
|
|
||||||
|
|
||||||
## 🔥 Exception or Error
|
|
||||||
<pre><code>
|
|
||||||
<!-- If the issue is accompanied by an exception or an error, please share it below: -->
|
|
||||||
<!-- ✍️-->
|
|
||||||
|
|
||||||
</code></pre>
|
|
||||||
|
|
||||||
|
|
||||||
## 🌍 Your Environment
|
|
||||||
|
|
||||||
**Angular Version:**
|
|
||||||
<pre><code>
|
|
||||||
<!-- run `ng version` and paste output below -->
|
|
||||||
<!-- ✍️-->
|
|
||||||
|
|
||||||
</code></pre>
|
|
||||||
|
|
||||||
**Anything else relevant?**
|
|
||||||
<!-- ✍️Is this a browser specific issue? If so, please specify the browser and version. -->
|
|
||||||
|
|
||||||
<!-- ✍️Do any of these matter: operating system, IDE, package manager, HTTP server, ...? If so, please mention it below. -->
|
|
32
.github/ISSUE_TEMPLATE/2-feature-request.md
vendored
32
.github/ISSUE_TEMPLATE/2-feature-request.md
vendored
@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
name: "\U0001F680 Feature request"
|
|
||||||
about: Suggest a feature for Angular Framework
|
|
||||||
|
|
||||||
---
|
|
||||||
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
|
|
||||||
|
|
||||||
Oh hi there! 😄
|
|
||||||
|
|
||||||
To expedite issue processing please search open and closed issues before submitting a new one.
|
|
||||||
Existing issues often contain information about workarounds, resolution, or progress updates.
|
|
||||||
|
|
||||||
🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅-->
|
|
||||||
|
|
||||||
|
|
||||||
# 🚀 feature request
|
|
||||||
|
|
||||||
### Relevant Package
|
|
||||||
<!-- Can you pin-point one or more @angular/* packages the are relevant for this feature request? -->
|
|
||||||
<!-- ✍️edit: --> This feature request is for @angular/....
|
|
||||||
|
|
||||||
|
|
||||||
### Description
|
|
||||||
<!-- ✍️--> A clear and concise description of the problem or missing capability...
|
|
||||||
|
|
||||||
|
|
||||||
### Describe the solution you'd like
|
|
||||||
<!-- ✍️--> If you have a solution in mind, please describe it.
|
|
||||||
|
|
||||||
|
|
||||||
### Describe alternatives you've considered
|
|
||||||
<!-- ✍️--> Have you considered any alternative solutions or workarounds?
|
|
55
.github/ISSUE_TEMPLATE/3-docs-bug.md
vendored
55
.github/ISSUE_TEMPLATE/3-docs-bug.md
vendored
@ -1,55 +0,0 @@
|
|||||||
---
|
|
||||||
name: "📚 Docs or angular.io issue report"
|
|
||||||
about: Report an issue in Angular's documentation or angular.io application
|
|
||||||
|
|
||||||
---
|
|
||||||
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
|
|
||||||
|
|
||||||
Oh hi there! 😄
|
|
||||||
|
|
||||||
To expedite issue processing please search open and closed issues before submitting a new one.
|
|
||||||
Existing issues often contain information about workarounds, resolution, or progress updates.
|
|
||||||
|
|
||||||
🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅-->
|
|
||||||
|
|
||||||
# 📚 Docs or angular.io bug report
|
|
||||||
|
|
||||||
### Description
|
|
||||||
|
|
||||||
<!-- ✍️edit:--> A clear and concise description of the problem...
|
|
||||||
|
|
||||||
|
|
||||||
## 🔬 Minimal Reproduction
|
|
||||||
|
|
||||||
### What's the affected URL?**
|
|
||||||
<!-- ✍️edit:--> https://angular.io/...
|
|
||||||
|
|
||||||
### Reproduction Steps**
|
|
||||||
<!-- If applicable please list the steps to take to reproduce the issue -->
|
|
||||||
<!-- ✍️edit:-->
|
|
||||||
|
|
||||||
### Expected vs Actual Behavior**
|
|
||||||
<!-- If applicable please describe the difference between the expected and actual behavior after following the repro steps. -->
|
|
||||||
<!-- ✍️edit:-->
|
|
||||||
|
|
||||||
|
|
||||||
## 📷Screenshot
|
|
||||||
<!-- Often a screenshot can help to capture the issue better than a long description. -->
|
|
||||||
<!-- ✍️upload a screenshot:-->
|
|
||||||
|
|
||||||
|
|
||||||
## 🔥 Exception or Error
|
|
||||||
<pre><code>
|
|
||||||
<!-- If the issue is accompanied by an exception or an error, please share it below: -->
|
|
||||||
<!-- ✍️-->
|
|
||||||
|
|
||||||
</code></pre>
|
|
||||||
|
|
||||||
|
|
||||||
## 🌍 Your Environment
|
|
||||||
|
|
||||||
### Browser info
|
|
||||||
<!-- ✍️Is this a browser specific issue? If so, please specify the device, browser, and version. -->
|
|
||||||
|
|
||||||
### Anything else relevant?
|
|
||||||
<!-- ✍️Please provide additional info if necessary. -->
|
|
@ -1,11 +0,0 @@
|
|||||||
---
|
|
||||||
name: ⚠️ Security issue disclosure
|
|
||||||
about: Report a security issue in Angular Framework, Material, or CLI
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
|
||||||
|
|
||||||
Please read https://angular.io/guide/security#report-issues on how to disclose security related issues.
|
|
||||||
|
|
||||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
|
16
.github/ISSUE_TEMPLATE/5-support-request.md
vendored
16
.github/ISSUE_TEMPLATE/5-support-request.md
vendored
@ -1,16 +0,0 @@
|
|||||||
---
|
|
||||||
name: "❓ Support request"
|
|
||||||
about: Questions and requests for support
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
|
||||||
|
|
||||||
Please do not file questions or support requests on the GitHub issues tracker.
|
|
||||||
|
|
||||||
You can get your questions answered using other communication channels. Please see:
|
|
||||||
https://github.com/angular/angular/blob/master/CONTRIBUTING.md#question
|
|
||||||
|
|
||||||
Thank you!
|
|
||||||
|
|
||||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
|
13
.github/ISSUE_TEMPLATE/6-angular-cli.md
vendored
13
.github/ISSUE_TEMPLATE/6-angular-cli.md
vendored
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
name: "\U0001F6E0️ Angular CLI"
|
|
||||||
about: Issues and feature requests for Angular CLI
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
|
||||||
|
|
||||||
Please file any Angular CLI issues at: https://github.com/angular/angular-cli/issues/new
|
|
||||||
|
|
||||||
For the time being, we keep Angular CLI issues in a separate repository.
|
|
||||||
|
|
||||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
|
13
.github/ISSUE_TEMPLATE/7-angular-components.md
vendored
13
.github/ISSUE_TEMPLATE/7-angular-components.md
vendored
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
name: "\U0001F48E Angular 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.
|
|
||||||
|
|
||||||
🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑🛑
|
|
22
.github/ISSUE_TEMPLATE/8-translate-docs.md
vendored
Normal file
22
.github/ISSUE_TEMPLATE/8-translate-docs.md
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
---
|
||||||
|
name: "📚Traducir doc al español"
|
||||||
|
about: Solicitud para traducir ciertos docs al español
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
📚Traducir: <!-- ✍️ editar: --> creating-libraries.md
|
||||||
|
|
||||||
|
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
|
||||||
|
|
||||||
|
Traducción de la documentación oficial de Angular a español
|
||||||
|
|
||||||
|
🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅-->
|
||||||
|
|
||||||
|
|
||||||
|
## Nombre del archivo:
|
||||||
|
<!-- ✍️ editar: --> creating-libraries.md
|
||||||
|
|
||||||
|
|
||||||
|
## Ruta donde se encuentra el archivo dentro del proyecto de Angular
|
||||||
|
|
||||||
|
<!-- ✍️ editar: --> https://github.com/angular-hispano/angular/blob/master/aio/content/guide/creating-libraries.md
|
62
.github/PULL_REQUEST_TEMPLATE.md
vendored
62
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,43 +1,35 @@
|
|||||||
## PR Checklist
|
## Lista de Verificación del PR
|
||||||
Please check if your PR fulfills the following requirements:
|
Comprueba si tu PR cumple los siguientes requisitos:
|
||||||
|
|
||||||
- [ ] The commit message follows our guidelines: https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit
|
- [ ] El mensaje de commit esta conforme con [nuestras reglas](https://github.com/angular-hispano/angular/blob/master/CONTRIBUTING.md#-formato-para-el-mensaje-de-los-commits)
|
||||||
- [ ] Tests for the changes have been added (for bug fixes / features)
|
- [ ] Probe los cambios que agregué (arreglo de bugs / funcionalidades)
|
||||||
- [ ] Docs have been added / updated (for bug fixes / features)
|
- [ ] Revisé previamente las traducciones o cambios de contenido
|
||||||
|
- [ ] Consulté el [diccionario de términos](https://github.com/angular-hispano/angular/blob/master/aio/diccionario-de-términos.md) en español
|
||||||
|
- [ ] He creado dos archivos con la extensión correspondiente(.en.md para el archivo en inglés y .md para el Archivo en español)
|
||||||
|
- [ ] He enlazado el commit con el issue correspondiente <!-- ejemplo Fixes #X -->
|
||||||
|
|
||||||
|
|
||||||
## PR Type
|
## Tipo de PR
|
||||||
What kind of change does this PR introduce?
|
¿Qué tipo de cambio introduce este PR?
|
||||||
|
|
||||||
<!-- Please check the one that applies to this PR using "x". -->
|
<!-- Marca con una "x" las opciones que aplican. -->
|
||||||
|
|
||||||
- [ ] Bugfix
|
- [ ] Bugfix
|
||||||
- [ ] Feature
|
- [ ] Funcionalidad
|
||||||
- [ ] Code style update (formatting, local variables)
|
- [ ] Actualización de el estilo del código (formato, variables locales)
|
||||||
- [ ] Refactoring (no functional changes, no api changes)
|
- [ ] Refactorización (no cambios en la funcionalidad, no cambios en el api)
|
||||||
- [ ] Build related changes
|
- [ ] Cambios relacionados al build
|
||||||
- [ ] CI related changes
|
- [ ] Cambios relacionados al CI (Integración continua)
|
||||||
- [ ] Documentation content changes
|
- [ ] Cambios en el contenido de la documentación
|
||||||
- [ ] angular.io application / infrastructure changes
|
- [ ] Cambios en la aplicación / infraestructura de angular.io
|
||||||
- [ ] Other... Please describe:
|
- [ ] Otro... Por favor describe la:
|
||||||
|
|
||||||
|
## ¿Cuál es el comportamiento actual?
|
||||||
|
<!-- Describe el comportamiento actual que está modificando o vincule a un problema relevante.
|
||||||
|
-->
|
||||||
|
|
||||||
|
|
||||||
## What is the current behavior?
|
## ¿Cuál es el nuevo comportamiento?
|
||||||
<!-- Please describe the current behavior that you are modifying, or link to a relevant issue. -->
|
<!--
|
||||||
|
Ejemplo: Archivo en inglés traducido al español
|
||||||
Issue Number: N/A
|
-->
|
||||||
|
|
||||||
|
|
||||||
## What is the new behavior?
|
|
||||||
|
|
||||||
|
|
||||||
## Does this PR introduce a breaking change?
|
|
||||||
|
|
||||||
- [ ] Yes
|
|
||||||
- [ ] No
|
|
||||||
|
|
||||||
|
|
||||||
<!-- If this PR contains a breaking change, please describe the impact and migration path for existing applications below. -->
|
|
||||||
|
|
||||||
|
|
||||||
## Other information
|
|
||||||
|
55
.github/angular-robot.yml
vendored
55
.github/angular-robot.yml
vendored
@ -38,7 +38,6 @@ merge:
|
|||||||
- "modules/benchmarks/**"
|
- "modules/benchmarks/**"
|
||||||
- "modules/system.d.ts"
|
- "modules/system.d.ts"
|
||||||
- "packages/**"
|
- "packages/**"
|
||||||
- "dev-infra/benchmark/driver-utilities/**"
|
|
||||||
# list of patterns to ignore for the files changed by the PR
|
# list of patterns to ignore for the files changed by the PR
|
||||||
exclude:
|
exclude:
|
||||||
- "packages/*"
|
- "packages/*"
|
||||||
@ -48,10 +47,7 @@ merge:
|
|||||||
- "packages/bazel/src/ng_package/**"
|
- "packages/bazel/src/ng_package/**"
|
||||||
- "packages/bazel/src/protractor/**"
|
- "packages/bazel/src/protractor/**"
|
||||||
- "packages/bazel/src/schematics/**"
|
- "packages/bazel/src/schematics/**"
|
||||||
- "packages/compiler-cli/src/ngcc/**"
|
|
||||||
- "packages/compiler-cli/linker/**"
|
|
||||||
- "packages/compiler-cli/ngcc/**"
|
- "packages/compiler-cli/ngcc/**"
|
||||||
- "packages/compiler-cli/src/ngtsc/sourcemaps/**"
|
|
||||||
- "packages/docs/**"
|
- "packages/docs/**"
|
||||||
- "packages/elements/schematics/**"
|
- "packages/elements/schematics/**"
|
||||||
- "packages/examples/**"
|
- "packages/examples/**"
|
||||||
@ -59,8 +55,6 @@ merge:
|
|||||||
- "packages/localize/**"
|
- "packages/localize/**"
|
||||||
- "packages/private/**"
|
- "packages/private/**"
|
||||||
- "packages/service-worker/**"
|
- "packages/service-worker/**"
|
||||||
- "packages/common/locales/**"
|
|
||||||
- "packages/http/**"
|
|
||||||
- "**/.gitignore"
|
- "**/.gitignore"
|
||||||
- "**/.gitkeep"
|
- "**/.gitkeep"
|
||||||
- "**/yarn.lock"
|
- "**/yarn.lock"
|
||||||
@ -74,20 +68,20 @@ merge:
|
|||||||
- "packages/**/integrationtest/**"
|
- "packages/**/integrationtest/**"
|
||||||
- "packages/**/test/**"
|
- "packages/**/test/**"
|
||||||
- "packages/zone.js/*"
|
- "packages/zone.js/*"
|
||||||
- "packages/zone.js/dist/**"
|
|
||||||
- "packages/zone.js/doc/**"
|
- "packages/zone.js/doc/**"
|
||||||
- "packages/zone.js/example/**"
|
- "packages/zone.js/example/**"
|
||||||
- "packages/zone.js/scripts/**"
|
- "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.\nPlease help to unblock it by resolving these conflicts. Thanks!"
|
mergeConflictComment: "Hi @{{PRAuthor}}! This PR has merge conflicts due to recent upstream merges.
|
||||||
|
\nPlease help to unblock it by resolving these conflicts. Thanks!"
|
||||||
|
|
||||||
# label to monitor
|
# label to monitor
|
||||||
mergeLabel: "action: merge"
|
mergeLabel: "PR action: merge"
|
||||||
|
|
||||||
# adding any of these labels will also add the merge label
|
# adding any of these labels will also add the merge label
|
||||||
mergeLinkedLabels:
|
mergeLinkedLabels:
|
||||||
- "action: merge-assistance"
|
- "PR action: merge-assistance"
|
||||||
|
|
||||||
# list of checks that will determine if the merge label can be added
|
# list of checks that will determine if the merge label can be added
|
||||||
checks:
|
checks:
|
||||||
@ -100,17 +94,17 @@ merge:
|
|||||||
|
|
||||||
# whether the PR shouldn't have a conflict with the base branch
|
# whether the PR shouldn't have a conflict with the base branch
|
||||||
noConflict: true
|
noConflict: true
|
||||||
# list of labels that a PR needs to have, checked with a regexp (e.g. "target:" will work for the label "target: master")
|
# list of labels that a PR needs to have, checked with a regexp (e.g. "PR target:" will work for the label "PR target: master")
|
||||||
requiredLabels:
|
requiredLabels:
|
||||||
- "target: *"
|
- "PR target: *"
|
||||||
- "cla: yes"
|
- "cla: yes"
|
||||||
|
|
||||||
# list of labels that a PR shouldn't have, checked after the required labels with a regexp
|
# list of labels that a PR shouldn't have, checked after the required labels with a regexp
|
||||||
forbiddenLabels:
|
forbiddenLabels:
|
||||||
- "target: TBD"
|
- "PR target: TBD"
|
||||||
- "action: cleanup"
|
- "PR action: cleanup"
|
||||||
- "action: review"
|
- "PR action: review"
|
||||||
- "state: blocked"
|
- "PR state: blocked"
|
||||||
- "cla: no"
|
- "cla: no"
|
||||||
|
|
||||||
# list of PR statuses that need to be successful
|
# list of PR statuses that need to be successful
|
||||||
@ -127,7 +121,12 @@ merge:
|
|||||||
# the comment that will be added when the merge label is added despite failing checks, leave empty or set to false to disable
|
# the comment that will be added when the merge label is added despite failing checks, leave empty or set to false to disable
|
||||||
# {{MERGE_LABEL}} will be replaced by the value of the mergeLabel option
|
# {{MERGE_LABEL}} will be replaced by the value of the mergeLabel option
|
||||||
# {{PLACEHOLDER}} will be replaced by the list of failing checks
|
# {{PLACEHOLDER}} will be replaced by the list of failing checks
|
||||||
mergeRemovedComment: "I see that you just added the `{{MERGE_LABEL}}` label, but the following checks are still failing:\n{{PLACEHOLDER}}\n\n**If you want your PR to be merged, it has to pass all the CI checks.**\n\nIf you can't get the PR to a green state due to flakes or broken master, please try rebasing to master and/or restarting the CI job. If that fails and you believe that the issue is not due to your change, please contact the caretaker and ask for help."
|
mergeRemovedComment: "I see that you just added the `{{MERGE_LABEL}}` label, but the following checks are still failing:
|
||||||
|
\n{{PLACEHOLDER}}
|
||||||
|
\n
|
||||||
|
\n**If you want your PR to be merged, it has to pass all the CI checks.**
|
||||||
|
\n
|
||||||
|
\nIf you can't get the PR to a green state due to flakes or broken master, please try rebasing to master and/or restarting the CI job. If that fails and you believe that the issue is not due to your change, please contact the caretaker and ask for help."
|
||||||
|
|
||||||
# options for the triage plugin
|
# options for the triage plugin
|
||||||
triage:
|
triage:
|
||||||
@ -142,28 +141,24 @@ triage:
|
|||||||
# arrays of labels that determine if an issue has been fully triaged
|
# arrays of labels that determine if an issue has been fully triaged
|
||||||
l2TriageLabels:
|
l2TriageLabels:
|
||||||
-
|
-
|
||||||
- "P0"
|
- "type: bug/fix"
|
||||||
|
- "severity*"
|
||||||
|
- "freq*"
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
-
|
-
|
||||||
- "P1"
|
- "type: feature"
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
-
|
-
|
||||||
- "P2"
|
- "type: refactor"
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
-
|
-
|
||||||
- "P3"
|
- "type: RFC / Discussion / question"
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
-
|
-
|
||||||
- "P4"
|
- "type: confusing"
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
-
|
-
|
||||||
- "P5"
|
- "type: use-case"
|
||||||
- "comp: *"
|
|
||||||
-
|
|
||||||
- "feature"
|
|
||||||
- "comp: *"
|
|
||||||
-
|
|
||||||
- "discussion"
|
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
|
|
||||||
# options for the triage PR plugin
|
# options for the triage PR plugin
|
||||||
@ -191,4 +186,4 @@ rerunCircleCI:
|
|||||||
# set to true to disable
|
# set to true to disable
|
||||||
disabled: false
|
disabled: false
|
||||||
# the label which when added triggers a rerun of the default CircleCI workflow
|
# the label which when added triggers a rerun of the default CircleCI workflow
|
||||||
triggerRerunLabel: "action: rerun CI at HEAD"
|
triggerRerunLabel: "PR action: rerun CI at HEAD"
|
||||||
|
2
.github/workflows/lock-closed.yml
vendored
2
.github/workflows/lock-closed.yml
vendored
@ -10,6 +10,6 @@ jobs:
|
|||||||
if: github.repository == 'angular/angular'
|
if: github.repository == 'angular/angular'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: angular/dev-infra/github-actions/lock-closed@414834b2b24dd2df37c6ed00808387ee6fd91b66
|
- uses: angular/dev-infra/github-actions/lock-closed@66462f6
|
||||||
with:
|
with:
|
||||||
lock-bot-key: ${{ secrets.LOCK_BOT_PRIVATE_KEY }}
|
lock-bot-key: ${{ secrets.LOCK_BOT_PRIVATE_KEY }}
|
||||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -40,14 +40,8 @@ yarn-error.log
|
|||||||
# User specific bazel settings
|
# User specific bazel settings
|
||||||
.bazelrc.user
|
.bazelrc.user
|
||||||
|
|
||||||
# User specific ng-dev settings
|
|
||||||
.ng-dev.user*
|
|
||||||
|
|
||||||
.notes.md
|
.notes.md
|
||||||
baseline.json
|
baseline.json
|
||||||
|
|
||||||
# Ignore .history for the xyz.local-history VSCode extension
|
# Ignore .history for the xyz.local-history VSCode extension
|
||||||
.history
|
.history
|
||||||
|
|
||||||
# CLDR data
|
|
||||||
tools/gulp-tasks/cldr/cldr-data/
|
|
||||||
|
@ -105,9 +105,9 @@ Fixes #<issue number>
|
|||||||
# │ │
|
# │ │
|
||||||
# │ └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core|
|
# │ └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core|
|
||||||
# │ elements|forms|http|language-service|localize|platform-browser|
|
# │ elements|forms|http|language-service|localize|platform-browser|
|
||||||
# │ platform-browser-dynamic|platform-server|router|service-worker|
|
# │ platform-browser-dynamic|platform-server|platform-webworker|
|
||||||
# │ upgrade|zone.js|packaging|changelog|dev-infra|docs-infra|migrations|
|
# │ platform-webworker-dynamic|router|service-worker|upgrade|zone.js|
|
||||||
# │ ngcc|ve
|
# │ packaging|changelog|dev-infra|docs-infra|migrations|ngcc|ve
|
||||||
# │ https://github.com/angular/angular/blob/master/CONTRIBUTING.md#scope
|
# │ https://github.com/angular/angular/blob/master/CONTRIBUTING.md#scope
|
||||||
# │
|
# │
|
||||||
# └─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|style|test
|
# └─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|style|test
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
import {CaretakerConfig} from '../dev-infra/caretaker/config';
|
|
||||||
|
|
||||||
/** The configuration for `ng-dev caretaker` commands. */
|
|
||||||
export const caretaker: CaretakerConfig = {
|
|
||||||
githubQueries: [
|
|
||||||
{
|
|
||||||
name: 'Merge Queue',
|
|
||||||
query: `is:pr is:open status:success label:"action: merge"`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Merge Assistance Queue',
|
|
||||||
query: `is:pr is:open label:"action: merge-assistance"`,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'Initial Triage Queue',
|
|
||||||
query: `is:open no:milestone`,
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
@ -6,7 +6,20 @@ import {CommitMessageConfig} from '../dev-infra/commit-message/config';
|
|||||||
export const commitMessage: CommitMessageConfig = {
|
export const commitMessage: CommitMessageConfig = {
|
||||||
maxLineLength: 120,
|
maxLineLength: 120,
|
||||||
minBodyLength: 20,
|
minBodyLength: 20,
|
||||||
minBodyLengthTypeExcludes: ['docs'],
|
minBodyLengthTypeExcludes: ['docs', 'upstream'],
|
||||||
|
types: [
|
||||||
|
'build',
|
||||||
|
'ci',
|
||||||
|
'docs',
|
||||||
|
'feat',
|
||||||
|
'fix',
|
||||||
|
'perf',
|
||||||
|
'refactor',
|
||||||
|
'release',
|
||||||
|
'style',
|
||||||
|
'test',
|
||||||
|
'upstream',
|
||||||
|
],
|
||||||
scopes: [
|
scopes: [
|
||||||
'animations',
|
'animations',
|
||||||
'bazel',
|
'bazel',
|
||||||
|
@ -1,15 +1,11 @@
|
|||||||
import {caretaker} from './caretaker';
|
|
||||||
import {commitMessage} from './commit-message';
|
import {commitMessage} from './commit-message';
|
||||||
import {format} from './format';
|
import {format} from './format';
|
||||||
import {github} from './github';
|
import {github} from './github';
|
||||||
import {merge} from './merge';
|
import {merge} from './merge';
|
||||||
import {release} from './release';
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
commitMessage,
|
commitMessage,
|
||||||
format,
|
format,
|
||||||
github,
|
github,
|
||||||
merge,
|
merge,
|
||||||
caretaker,
|
|
||||||
release,
|
|
||||||
};
|
};
|
||||||
|
@ -1,28 +1,38 @@
|
|||||||
import {DevInfraMergeConfig} from '../dev-infra/pr/merge/config';
|
import {MergeConfig} from '../dev-infra/pr/merge/config';
|
||||||
import {getDefaultTargetLabelConfiguration} from '../dev-infra/pr/merge/defaults';
|
|
||||||
import {github} from './github';
|
|
||||||
import {release} from './release';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration for the merge tool in `ng-dev`. This sets up the labels which
|
* Configuration for the merge tool in `ng-dev`. This sets up the labels which
|
||||||
* are respected by the merge script (e.g. the target labels).
|
* are respected by the merge script (e.g. the target labels).
|
||||||
*/
|
*/
|
||||||
export const merge: DevInfraMergeConfig['merge'] = async api => {
|
export const merge = (): MergeConfig => {
|
||||||
|
// TODO: resume dynamically determining patch branch
|
||||||
|
const patch = '10.0.x';
|
||||||
return {
|
return {
|
||||||
githubApiMerge: false,
|
githubApiMerge: false,
|
||||||
claSignedLabel: 'cla: yes',
|
claSignedLabel: 'cla: yes',
|
||||||
mergeReadyLabel: /^action: merge(-assistance)?/,
|
mergeReadyLabel: /^PR action: merge(-assistance)?/,
|
||||||
caretakerNoteLabel: 'action: merge-assistance',
|
caretakerNoteLabel: 'PR action: merge-assistance',
|
||||||
commitMessageFixupLabel: 'commit message fixup',
|
commitMessageFixupLabel: 'commit message fixup',
|
||||||
// We can pick any of the NPM packages as we are in a monorepo where all packages are
|
labels: [
|
||||||
// published together with the same version and branching.
|
{
|
||||||
labels: await getDefaultTargetLabelConfiguration(api, github, release),
|
pattern: 'PR target: master-only',
|
||||||
|
branches: ['master'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: 'PR target: patch-only',
|
||||||
|
branches: [patch],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
pattern: 'PR target: master & patch',
|
||||||
|
branches: ['master', patch],
|
||||||
|
},
|
||||||
|
],
|
||||||
requiredBaseCommits: {
|
requiredBaseCommits: {
|
||||||
// PRs that target either `master` or the patch branch, need to be rebased
|
// PRs that target either `master` or the patch branch, need to be rebased
|
||||||
// on top of the latest commit message validation fix.
|
// on top of the latest commit message validation fix.
|
||||||
// These SHAs are the commits that update the required license text in the header.
|
// These SHAs are the commits that update the required license text in the header.
|
||||||
'master': '5aeb9a4124922d8ac08eb73b8f322905a32b0b3a',
|
'master': '5aeb9a4124922d8ac08eb73b8f322905a32b0b3a',
|
||||||
'10.0.x': '27b95ba64a5d99757f4042073fd1860e20e3ed24',
|
[patch]: '27b95ba64a5d99757f4042073fd1860e20e3ed24'
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
import {join} from 'path';
|
|
||||||
import {exec} from 'shelljs';
|
|
||||||
import {ReleaseConfig} from '../dev-infra/release/config';
|
|
||||||
|
|
||||||
/** Configuration for the `ng-dev release` command. */
|
|
||||||
export const release: ReleaseConfig = {
|
|
||||||
npmPackages: [
|
|
||||||
'@angular/animations',
|
|
||||||
'@angular/bazel',
|
|
||||||
'@angular/common',
|
|
||||||
'@angular/compiler',
|
|
||||||
'@angular/compiler-cli',
|
|
||||||
'@angular/core',
|
|
||||||
'@angular/elements',
|
|
||||||
'@angular/forms',
|
|
||||||
'@angular/language-service',
|
|
||||||
'@angular/localize',
|
|
||||||
'@angular/platform-browser',
|
|
||||||
'@angular/platform-browser-dynamic',
|
|
||||||
'@angular/platform-server',
|
|
||||||
'@angular/platform-webworker',
|
|
||||||
'@angular/platform-webworker-dynamic',
|
|
||||||
'@angular/router',
|
|
||||||
'@angular/service-worker',
|
|
||||||
'@angular/upgrade',
|
|
||||||
],
|
|
||||||
// TODO: Implement release package building here.
|
|
||||||
buildPackages: async () => [],
|
|
||||||
// TODO: This can be removed once there is an org-wide tool for changelog generation.
|
|
||||||
generateReleaseNotesForHead: async () => {
|
|
||||||
exec('yarn -s gulp changelog', {cwd: join(__dirname, '../')});
|
|
||||||
},
|
|
||||||
};
|
|
@ -186,7 +186,6 @@ groups:
|
|||||||
- IgorMinar # Igor Minar
|
- IgorMinar # Igor Minar
|
||||||
- jbogarthyde # Judy Bogart
|
- jbogarthyde # Judy Bogart
|
||||||
- jelbourn # Jeremy Elbourn
|
- jelbourn # Jeremy Elbourn
|
||||||
- jessicajaniuk # Jessica Janiuk
|
|
||||||
- JiaLiPassion # Jia Li
|
- JiaLiPassion # Jia Li
|
||||||
- JoostK # Joost Koehoorn
|
- JoostK # Joost Koehoorn
|
||||||
- josephperrott # Joey Perrott
|
- josephperrott # Joey Perrott
|
||||||
@ -285,7 +284,7 @@ groups:
|
|||||||
users:
|
users:
|
||||||
- alxhub
|
- alxhub
|
||||||
- crisbeto
|
- crisbeto
|
||||||
# OOO as of 2020-09-28 - devversion
|
- devversion
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
@ -304,6 +303,8 @@ groups:
|
|||||||
'packages/platform-browser/**',
|
'packages/platform-browser/**',
|
||||||
'packages/examples/platform-browser/**',
|
'packages/examples/platform-browser/**',
|
||||||
'packages/platform-browser-dynamic/**',
|
'packages/platform-browser-dynamic/**',
|
||||||
|
'packages/platform-webworker/**',
|
||||||
|
'packages/platform-webworker-dynamic/**',
|
||||||
'packages/examples/common/**',
|
'packages/examples/common/**',
|
||||||
'packages/docs/**',
|
'packages/docs/**',
|
||||||
'aio/content/guide/accessibility.md',
|
'aio/content/guide/accessibility.md',
|
||||||
@ -324,10 +325,7 @@ groups:
|
|||||||
'aio/content/guide/component-interaction.md',
|
'aio/content/guide/component-interaction.md',
|
||||||
'aio/content/examples/component-interaction/**',
|
'aio/content/examples/component-interaction/**',
|
||||||
'aio/content/images/guide/component-interaction/**',
|
'aio/content/images/guide/component-interaction/**',
|
||||||
'aio/content/guide/component-overview.md',
|
|
||||||
'aio/content/examples/component-overview/**',
|
|
||||||
'aio/content/guide/component-styles.md',
|
'aio/content/guide/component-styles.md',
|
||||||
'aio/content/guide/view-encapsulation.md',
|
|
||||||
'aio/content/examples/component-styles/**',
|
'aio/content/examples/component-styles/**',
|
||||||
'aio/content/guide/dependency-injection.md',
|
'aio/content/guide/dependency-injection.md',
|
||||||
'aio/content/examples/dependency-injection/**',
|
'aio/content/examples/dependency-injection/**',
|
||||||
@ -380,7 +378,6 @@ groups:
|
|||||||
'aio/content/examples/binding-syntax/**',
|
'aio/content/examples/binding-syntax/**',
|
||||||
'aio/content/guide/property-binding.md',
|
'aio/content/guide/property-binding.md',
|
||||||
'aio/content/examples/property-binding/**',
|
'aio/content/examples/property-binding/**',
|
||||||
'aio/content/guide/property-binding-best-practices.md',
|
|
||||||
'aio/content/guide/attribute-binding.md',
|
'aio/content/guide/attribute-binding.md',
|
||||||
'aio/content/examples/attribute-binding/**',
|
'aio/content/examples/attribute-binding/**',
|
||||||
'aio/content/guide/two-way-binding.md',
|
'aio/content/guide/two-way-binding.md',
|
||||||
@ -409,7 +406,6 @@ groups:
|
|||||||
'aio/content/guide/structural-directives.md',
|
'aio/content/guide/structural-directives.md',
|
||||||
'aio/content/examples/structural-directives/**',
|
'aio/content/examples/structural-directives/**',
|
||||||
'aio/content/guide/svg-in-templates.md',
|
'aio/content/guide/svg-in-templates.md',
|
||||||
'aio/content/guide/style-precedence.md',
|
|
||||||
'aio/content/images/guide/structural-directives/**',
|
'aio/content/images/guide/structural-directives/**',
|
||||||
'aio/content/guide/template-statements.md',
|
'aio/content/guide/template-statements.md',
|
||||||
'aio/content/guide/user-input.md',
|
'aio/content/guide/user-input.md',
|
||||||
@ -423,7 +419,7 @@ groups:
|
|||||||
- atscott
|
- atscott
|
||||||
- ~kara # do not request reviews from Kara, but allow her to approve PRs
|
- ~kara # do not request reviews from Kara, but allow her to approve PRs
|
||||||
- mhevery
|
- mhevery
|
||||||
# OOO as of 2020-09-28 - pkozlowski-opensource
|
- pkozlowski-opensource
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
@ -513,8 +509,8 @@ groups:
|
|||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files, [
|
||||||
'packages/core/src/i18n/**',
|
'packages/core/src/i18n/**',
|
||||||
'packages/core/src/render3/i18n/**',
|
'packages/core/src/render3/i18n.ts',
|
||||||
'packages/core/src/render3/instructions/i18n.ts',
|
'packages/core/src/render3/i18n.md',
|
||||||
'packages/core/src/render3/interfaces/i18n.ts',
|
'packages/core/src/render3/interfaces/i18n.ts',
|
||||||
'packages/common/locales/**',
|
'packages/common/locales/**',
|
||||||
'packages/common/src/i18n/**',
|
'packages/common/src/i18n/**',
|
||||||
@ -666,7 +662,7 @@ groups:
|
|||||||
users:
|
users:
|
||||||
- AndrewKushnir
|
- AndrewKushnir
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
# OOO as of 2020-09-28 - pkozlowski-opensource
|
- pkozlowski-opensource
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
@ -683,7 +679,7 @@ groups:
|
|||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
# OOO as of 2020-09-28 - pkozlowski-opensource
|
- pkozlowski-opensource
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
@ -701,7 +697,7 @@ groups:
|
|||||||
users:
|
users:
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- jelbourn
|
- jelbourn
|
||||||
# OOO as of 2020-09-28 - pkozlowski-opensource
|
- pkozlowski-opensource
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
@ -727,7 +723,7 @@ groups:
|
|||||||
- IgorMinar
|
- IgorMinar
|
||||||
- mhevery
|
- mhevery
|
||||||
- jelbourn
|
- jelbourn
|
||||||
# OOO as of 2020-09-28 - pkozlowski-opensource
|
- pkozlowski-opensource
|
||||||
reviews:
|
reviews:
|
||||||
request: -1 # request reviews from everyone
|
request: -1 # request reviews from everyone
|
||||||
required: 2 # require at least 2 approvals
|
required: 2 # require at least 2 approvals
|
||||||
@ -1119,13 +1115,11 @@ groups:
|
|||||||
'docs/DEBUG.md',
|
'docs/DEBUG.md',
|
||||||
'docs/DEBUG_COMPONENTS_REPO_IVY.md',
|
'docs/DEBUG_COMPONENTS_REPO_IVY.md',
|
||||||
'docs/DEVELOPER.md',
|
'docs/DEVELOPER.md',
|
||||||
'docs/FIXUP_COMMITS.md',
|
|
||||||
'docs/GITHUB_PROCESS.md',
|
'docs/GITHUB_PROCESS.md',
|
||||||
'docs/PR_REVIEW.md',
|
'docs/PR_REVIEW.md',
|
||||||
'docs/SAVED_REPLIES.md',
|
'docs/SAVED_REPLIES.md',
|
||||||
'docs/TOOLS.md',
|
'docs/TOOLS.md',
|
||||||
'docs/TRIAGE_AND_LABELS.md',
|
'docs/TRIAGE_AND_LABELS.md',
|
||||||
'docs/images/**',
|
|
||||||
'goldens/*',
|
'goldens/*',
|
||||||
'modules/*',
|
'modules/*',
|
||||||
'packages/*',
|
'packages/*',
|
||||||
@ -1156,7 +1150,7 @@ groups:
|
|||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
# OOO as of 2020-09-28 - devversion
|
- devversion
|
||||||
- filipesilva
|
- filipesilva
|
||||||
- gkalpak
|
- gkalpak
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
@ -1190,7 +1184,7 @@ groups:
|
|||||||
- atscott
|
- atscott
|
||||||
- jelbourn
|
- jelbourn
|
||||||
- petebacondarwin
|
- petebacondarwin
|
||||||
# OOO as of 2020-09-28 - pkozlowski-opensource
|
- pkozlowski-opensource
|
||||||
reviews:
|
reviews:
|
||||||
request: 4 # Request reviews from four people
|
request: 4 # Request reviews from four people
|
||||||
required: 3 # Require that three people approve
|
required: 3 # Require that three people approve
|
||||||
@ -1218,7 +1212,7 @@ groups:
|
|||||||
- atscott
|
- atscott
|
||||||
- jelbourn
|
- jelbourn
|
||||||
- petebacondarwin
|
- petebacondarwin
|
||||||
# OOO as of 2020-09-28 - pkozlowski-opensource
|
- pkozlowski-opensource
|
||||||
reviews:
|
reviews:
|
||||||
request: 4 # Request reviews from four people
|
request: 4 # Request reviews from four people
|
||||||
required: 2 # Require that two people approve
|
required: 2 # Require that two people approve
|
||||||
@ -1246,7 +1240,7 @@ groups:
|
|||||||
- atscott
|
- atscott
|
||||||
- jelbourn
|
- jelbourn
|
||||||
- petebacondarwin
|
- petebacondarwin
|
||||||
# OOO as of 2020-09-28 - pkozlowski-opensource
|
- pkozlowski-opensource
|
||||||
|
|
||||||
|
|
||||||
####################################################################################
|
####################################################################################
|
||||||
|
@ -44654,7 +44654,7 @@ const FOLDERS_IGNORE = [
|
|||||||
const DEFAULT_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([...FOLDERS_IGNORE,
|
const DEFAULT_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([...FOLDERS_IGNORE,
|
||||||
|
|
||||||
// ignore cruft
|
// ignore cruft
|
||||||
'yarn.lock', '.lock-wscript', '.wafpickle-{0..9}', '*.swp', '._*', 'npm-debug.log', 'yarn-error.log', '.npmrc', '.yarnrc', '.yarnrc.yml', '.npmignore', '.gitignore', '.DS_Store']);
|
'yarn.lock', '.lock-wscript', '.wafpickle-{0..9}', '*.swp', '._*', 'npm-debug.log', 'yarn-error.log', '.npmrc', '.yarnrc', '.npmignore', '.gitignore', '.DS_Store']);
|
||||||
|
|
||||||
const NEVER_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([
|
const NEVER_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([
|
||||||
// never ignore these files
|
// never ignore these files
|
||||||
@ -44663,7 +44663,6 @@ const NEVER_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([
|
|||||||
function packWithIgnoreAndHeaders(cwd, ignoreFunction, { mapHeader } = {}) {
|
function packWithIgnoreAndHeaders(cwd, ignoreFunction, { mapHeader } = {}) {
|
||||||
return tar.pack(cwd, {
|
return tar.pack(cwd, {
|
||||||
ignore: ignoreFunction,
|
ignore: ignoreFunction,
|
||||||
sort: true,
|
|
||||||
map: header => {
|
map: header => {
|
||||||
const suffix = header.name === '.' ? '' : `/${header.name}`;
|
const suffix = header.name === '.' ? '' : `/${header.name}`;
|
||||||
header.name = `package${suffix}`;
|
header.name = `package${suffix}`;
|
||||||
@ -46679,7 +46678,7 @@ function mkdirfix (name, opts, cb) {
|
|||||||
/* 194 */
|
/* 194 */
|
||||||
/***/ (function(module, exports) {
|
/***/ (function(module, exports) {
|
||||||
|
|
||||||
module.exports = {"name":"yarn","installationMethod":"unknown","version":"1.22.5","license":"BSD-2-Clause","preferGlobal":true,"description":"📦🐈 Fast, reliable, and secure dependency management.","dependencies":{"@zkochan/cmd-shim":"^3.1.0","babel-runtime":"^6.26.0","bytes":"^3.0.0","camelcase":"^4.0.0","chalk":"^2.1.0","cli-table3":"^0.4.0","commander":"^2.9.0","death":"^1.0.0","debug":"^3.0.0","deep-equal":"^1.0.1","detect-indent":"^5.0.0","dnscache":"^1.0.1","glob":"^7.1.1","gunzip-maybe":"^1.4.0","hash-for-dep":"^1.2.3","imports-loader":"^0.8.0","ini":"^1.3.4","inquirer":"^6.2.0","invariant":"^2.2.0","is-builtin-module":"^2.0.0","is-ci":"^1.0.10","is-webpack-bundle":"^1.0.0","js-yaml":"^3.13.1","leven":"^2.0.0","loud-rejection":"^1.2.0","micromatch":"^2.3.11","mkdirp":"^0.5.1","node-emoji":"^1.6.1","normalize-url":"^2.0.0","npm-logical-tree":"^1.2.1","object-path":"^0.11.2","proper-lockfile":"^2.0.0","puka":"^1.0.0","read":"^1.0.7","request":"^2.87.0","request-capture-har":"^1.2.2","rimraf":"^2.5.0","semver":"^5.1.0","ssri":"^5.3.0","strip-ansi":"^4.0.0","strip-bom":"^3.0.0","tar-fs":"^1.16.0","tar-stream":"^1.6.1","uuid":"^3.0.1","v8-compile-cache":"^2.0.0","validate-npm-package-license":"^3.0.4","yn":"^2.0.0"},"devDependencies":{"babel-core":"^6.26.0","babel-eslint":"^7.2.3","babel-loader":"^6.2.5","babel-plugin-array-includes":"^2.0.3","babel-plugin-inline-import":"^3.0.0","babel-plugin-transform-builtin-extend":"^1.1.2","babel-plugin-transform-inline-imports-commonjs":"^1.0.0","babel-plugin-transform-runtime":"^6.4.3","babel-preset-env":"^1.6.0","babel-preset-flow":"^6.23.0","babel-preset-stage-0":"^6.0.0","babylon":"^6.5.0","commitizen":"^2.9.6","cz-conventional-changelog":"^2.0.0","eslint":"^4.3.0","eslint-config-fb-strict":"^22.0.0","eslint-plugin-babel":"^5.0.0","eslint-plugin-flowtype":"^2.35.0","eslint-plugin-jasmine":"^2.6.2","eslint-plugin-jest":"^21.0.0","eslint-plugin-jsx-a11y":"^6.0.2","eslint-plugin-prefer-object-spread":"^1.2.1","eslint-plugin-prettier":"^2.1.2","eslint-plugin-react":"^7.1.0","eslint-plugin-relay":"^0.0.28","eslint-plugin-yarn-internal":"file:scripts/eslint-rules","execa":"^0.11.0","fancy-log":"^1.3.2","flow-bin":"^0.66.0","git-release-notes":"^3.0.0","gulp":"^4.0.0","gulp-babel":"^7.0.0","gulp-if":"^2.0.1","gulp-newer":"^1.0.0","gulp-plumber":"^1.0.1","gulp-sourcemaps":"^2.2.0","jest":"^22.4.4","jsinspect":"^0.12.6","minimatch":"^3.0.4","mock-stdin":"^0.3.0","prettier":"^1.5.2","string-replace-loader":"^2.1.1","temp":"^0.8.3","webpack":"^2.1.0-beta.25","yargs":"^6.3.0"},"resolutions":{"sshpk":"^1.14.2"},"engines":{"node":">=4.0.0"},"repository":"yarnpkg/yarn","bin":{"yarn":"./bin/yarn.js","yarnpkg":"./bin/yarn.js"},"scripts":{"build":"gulp build","build-bundle":"node ./scripts/build-webpack.js","build-chocolatey":"powershell ./scripts/build-chocolatey.ps1","build-deb":"./scripts/build-deb.sh","build-dist":"bash ./scripts/build-dist.sh","build-win-installer":"scripts\\build-windows-installer.bat","changelog":"git-release-notes $(git describe --tags --abbrev=0 $(git describe --tags --abbrev=0)^)..$(git describe --tags --abbrev=0) scripts/changelog.md","dupe-check":"yarn jsinspect ./src","lint":"eslint . && flow check","pkg-tests":"yarn --cwd packages/pkg-tests jest yarn.test.js","prettier":"eslint src __tests__ --fix","release-branch":"./scripts/release-branch.sh","test":"yarn lint && yarn test-only","test-only":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --verbose","test-only-debug":"node --inspect-brk --max_old_space_size=4096 node_modules/jest/bin/jest.js --runInBand --verbose","test-coverage":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --coverage --verbose","watch":"gulp watch","commit":"git-cz"},"jest":{"collectCoverageFrom":["src/**/*.js"],"testEnvironment":"node","modulePathIgnorePatterns":["__tests__/fixtures/","packages/pkg-tests/pkg-tests-fixtures","dist/"],"testPathIgnorePatterns":["__tests__/(fixtures|__mocks__)/","updates/","_(temp|mock|install|init|helpers).js$","packages/pkg-tests"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}}}
|
module.exports = {"name":"yarn","installationMethod":"unknown","version":"1.22.4","license":"BSD-2-Clause","preferGlobal":true,"description":"📦🐈 Fast, reliable, and secure dependency management.","dependencies":{"@zkochan/cmd-shim":"^3.1.0","babel-runtime":"^6.26.0","bytes":"^3.0.0","camelcase":"^4.0.0","chalk":"^2.1.0","cli-table3":"^0.4.0","commander":"^2.9.0","death":"^1.0.0","debug":"^3.0.0","deep-equal":"^1.0.1","detect-indent":"^5.0.0","dnscache":"^1.0.1","glob":"^7.1.1","gunzip-maybe":"^1.4.0","hash-for-dep":"^1.2.3","imports-loader":"^0.8.0","ini":"^1.3.4","inquirer":"^6.2.0","invariant":"^2.2.0","is-builtin-module":"^2.0.0","is-ci":"^1.0.10","is-webpack-bundle":"^1.0.0","js-yaml":"^3.13.1","leven":"^2.0.0","loud-rejection":"^1.2.0","micromatch":"^2.3.11","mkdirp":"^0.5.1","node-emoji":"^1.6.1","normalize-url":"^2.0.0","npm-logical-tree":"^1.2.1","object-path":"^0.11.2","proper-lockfile":"^2.0.0","puka":"^1.0.0","read":"^1.0.7","request":"^2.87.0","request-capture-har":"^1.2.2","rimraf":"^2.5.0","semver":"^5.1.0","ssri":"^5.3.0","strip-ansi":"^4.0.0","strip-bom":"^3.0.0","tar-fs":"^1.16.0","tar-stream":"^1.6.1","uuid":"^3.0.1","v8-compile-cache":"^2.0.0","validate-npm-package-license":"^3.0.4","yn":"^2.0.0"},"devDependencies":{"babel-core":"^6.26.0","babel-eslint":"^7.2.3","babel-loader":"^6.2.5","babel-plugin-array-includes":"^2.0.3","babel-plugin-inline-import":"^3.0.0","babel-plugin-transform-builtin-extend":"^1.1.2","babel-plugin-transform-inline-imports-commonjs":"^1.0.0","babel-plugin-transform-runtime":"^6.4.3","babel-preset-env":"^1.6.0","babel-preset-flow":"^6.23.0","babel-preset-stage-0":"^6.0.0","babylon":"^6.5.0","commitizen":"^2.9.6","cz-conventional-changelog":"^2.0.0","eslint":"^4.3.0","eslint-config-fb-strict":"^22.0.0","eslint-plugin-babel":"^5.0.0","eslint-plugin-flowtype":"^2.35.0","eslint-plugin-jasmine":"^2.6.2","eslint-plugin-jest":"^21.0.0","eslint-plugin-jsx-a11y":"^6.0.2","eslint-plugin-prefer-object-spread":"^1.2.1","eslint-plugin-prettier":"^2.1.2","eslint-plugin-react":"^7.1.0","eslint-plugin-relay":"^0.0.28","eslint-plugin-yarn-internal":"file:scripts/eslint-rules","execa":"^0.11.0","fancy-log":"^1.3.2","flow-bin":"^0.66.0","git-release-notes":"^3.0.0","gulp":"^4.0.0","gulp-babel":"^7.0.0","gulp-if":"^2.0.1","gulp-newer":"^1.0.0","gulp-plumber":"^1.0.1","gulp-sourcemaps":"^2.2.0","jest":"^22.4.4","jsinspect":"^0.12.6","minimatch":"^3.0.4","mock-stdin":"^0.3.0","prettier":"^1.5.2","string-replace-loader":"^2.1.1","temp":"^0.8.3","webpack":"^2.1.0-beta.25","yargs":"^6.3.0"},"resolutions":{"sshpk":"^1.14.2"},"engines":{"node":">=4.0.0"},"repository":"yarnpkg/yarn","bin":{"yarn":"./bin/yarn.js","yarnpkg":"./bin/yarn.js"},"scripts":{"build":"gulp build","build-bundle":"node ./scripts/build-webpack.js","build-chocolatey":"powershell ./scripts/build-chocolatey.ps1","build-deb":"./scripts/build-deb.sh","build-dist":"bash ./scripts/build-dist.sh","build-win-installer":"scripts\\build-windows-installer.bat","changelog":"git-release-notes $(git describe --tags --abbrev=0 $(git describe --tags --abbrev=0)^)..$(git describe --tags --abbrev=0) scripts/changelog.md","dupe-check":"yarn jsinspect ./src","lint":"eslint . && flow check","pkg-tests":"yarn --cwd packages/pkg-tests jest yarn.test.js","prettier":"eslint src __tests__ --fix","release-branch":"./scripts/release-branch.sh","test":"yarn lint && yarn test-only","test-only":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --verbose","test-only-debug":"node --inspect-brk --max_old_space_size=4096 node_modules/jest/bin/jest.js --runInBand --verbose","test-coverage":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --coverage --verbose","watch":"gulp watch","commit":"git-cz"},"jest":{"collectCoverageFrom":["src/**/*.js"],"testEnvironment":"node","modulePathIgnorePatterns":["__tests__/fixtures/","packages/pkg-tests/pkg-tests-fixtures","dist/"],"testPathIgnorePatterns":["__tests__/(fixtures|__mocks__)/","updates/","_(temp|mock|install|init|helpers).js$","packages/pkg-tests"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}}}
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
/* 195 */
|
/* 195 */
|
||||||
@ -98339,7 +98338,7 @@ var _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).def
|
|||||||
|
|
||||||
const bundle = yield fetchBundle(config, bundleUrl);
|
const bundle = yield fetchBundle(config, bundleUrl);
|
||||||
|
|
||||||
const yarnPath = path.resolve(config.lockfileFolder, `.yarn/releases/yarn-${bundleVersion}.cjs`);
|
const yarnPath = path.resolve(config.lockfileFolder, `.yarn/releases/yarn-${bundleVersion}.js`);
|
||||||
reporter.log(`Saving it into ${chalk.magenta(yarnPath)}...`);
|
reporter.log(`Saving it into ${chalk.magenta(yarnPath)}...`);
|
||||||
yield (_fs || _load_fs()).mkdirp(path.dirname(yarnPath));
|
yield (_fs || _load_fs()).mkdirp(path.dirname(yarnPath));
|
||||||
yield (_fs || _load_fs()).writeFile(yarnPath, bundle);
|
yield (_fs || _load_fs()).writeFile(yarnPath, bundle);
|
||||||
@ -100191,7 +100190,7 @@ let main = exports.main = (() => {
|
|||||||
|
|
||||||
const config = new (_config || _load_config()).default(reporter);
|
const config = new (_config || _load_config()).default(reporter);
|
||||||
const outputWrapperEnabled = (0, (_conversion || _load_conversion()).boolifyWithDefault)(process.env.YARN_WRAP_OUTPUT, true);
|
const outputWrapperEnabled = (0, (_conversion || _load_conversion()).boolifyWithDefault)(process.env.YARN_WRAP_OUTPUT, true);
|
||||||
const shouldWrapOutput = outputWrapperEnabled && !(_commander || _load_commander()).default.json && command.hasWrapper((_commander || _load_commander()).default, (_commander || _load_commander()).default.args) && !(commandName === 'init' && (_commander || _load_commander()).default[`2`]);
|
const shouldWrapOutput = outputWrapperEnabled && !(_commander || _load_commander()).default.json && command.hasWrapper((_commander || _load_commander()).default, (_commander || _load_commander()).default.args);
|
||||||
|
|
||||||
if (shouldWrapOutput) {
|
if (shouldWrapOutput) {
|
||||||
reporter.header(commandName, { name: 'yarn', version: (_yarnVersion || _load_yarnVersion()).version });
|
reporter.header(commandName, { name: 'yarn', version: (_yarnVersion || _load_yarnVersion()).version });
|
||||||
@ -100605,7 +100604,7 @@ let start = (() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (/\.[cm]?js$/.test(yarnPath)) {
|
if (yarnPath.endsWith(`.js`)) {
|
||||||
exitCode = yield (0, (_child || _load_child()).spawnp)(process.execPath, [yarnPath, ...argv], opts);
|
exitCode = yield (0, (_child || _load_child()).spawnp)(process.execPath, [yarnPath, ...argv], opts);
|
||||||
} else {
|
} else {
|
||||||
exitCode = yield (0, (_child || _load_child()).spawnp)(yarnPath, argv, opts);
|
exitCode = yield (0, (_child || _load_child()).spawnp)(yarnPath, argv, opts);
|
2
.yarnrc
2
.yarnrc
@ -2,4 +2,4 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
yarn-path ".yarn/releases/yarn-1.22.5.js"
|
yarn-path ".yarn/releases/yarn-1.22.4.js"
|
||||||
|
@ -34,7 +34,7 @@ filegroup(
|
|||||||
filegroup(
|
filegroup(
|
||||||
name = "angularjs_scripts",
|
name = "angularjs_scripts",
|
||||||
srcs = [
|
srcs = [
|
||||||
# We also declare the unminified 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",
|
||||||
@ -47,9 +47,3 @@ filegroup(
|
|||||||
"@npm//:node_modules/angular-mocks-1.6/angular-mocks.js",
|
"@npm//:node_modules/angular-mocks-1.6/angular-mocks.js",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
# Detect if the build is running under --stamp
|
|
||||||
config_setting(
|
|
||||||
name = "stamp",
|
|
||||||
values = {"stamp": "true"},
|
|
||||||
)
|
|
||||||
|
670
CHANGELOG.md
670
CHANGELOG.md
@ -1,586 +1,19 @@
|
|||||||
<a name="11.0.0-rc.0"></a>
|
<a name="10.1.0-next.4"></a>
|
||||||
# 11.0.0-rc.0 (2020-10-21)
|
# 10.1.0-next.4 (2020-08-04)
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
* **common:** update locales using new CLDR data ([#39343](https://github.com/angular/angular/issues/39343)) ([3738233](https://github.com/angular/angular/commit/3738233))
|
|
||||||
* **compiler:** promote constants in templates to Trusted Types ([#39211](https://github.com/angular/angular/issues/39211)) ([6e18d2d](https://github.com/angular/angular/commit/6e18d2d))
|
|
||||||
* **core:** guard reading of global `ngDevMode` for undefined. ([#36055](https://github.com/angular/angular/issues/36055)) ([f541e5f](https://github.com/angular/angular/commit/f541e5f))
|
|
||||||
* **language-service:** [Ivy] create compiler only when program changes ([#39231](https://github.com/angular/angular/issues/39231)) ([8f1317f](https://github.com/angular/angular/commit/8f1317f))
|
|
||||||
* **ngcc:** ensure that "inline exports" can be interpreted correctly ([#39267](https://github.com/angular/angular/issues/39267)) ([822b838](https://github.com/angular/angular/commit/822b838))
|
|
||||||
* **platform-server:** Resolve absolute URL from baseUrl ([#39334](https://github.com/angular/angular/issues/39334)) ([b4e8399](https://github.com/angular/angular/commit/b4e8399))
|
|
||||||
* **router:** incorrect signature for createUrlTree ([#39347](https://github.com/angular/angular/issues/39347)) ([161b278](https://github.com/angular/angular/commit/161b278))
|
|
||||||
|
|
||||||
|
|
||||||
### Code Refactoring
|
|
||||||
|
|
||||||
* **compiler:** remove support for TypeScript 3.9 ([#39313](https://github.com/angular/angular/issues/39313)) ([736e064](https://github.com/angular/angular/commit/736e064))
|
|
||||||
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* **platform-server:** If you use `useAbsoluteUrl` to setup `platform-server`, you now need to
|
|
||||||
also specify `baseUrl`.
|
|
||||||
We are intentionally making this a breaking change in a minor release,
|
|
||||||
because if `useAbsoluteUrl` is set to `true` then the behavior of the
|
|
||||||
application could be unpredictable, resulting in issues that are hard to
|
|
||||||
discover but could be affecting production environments.
|
|
||||||
* **compiler:** TypeScript 3.9 is no longer supported, please upgrade to TypeScript 4.0.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="11.0.0-next.6"></a>
|
|
||||||
# 11.0.0-next.6 (2020-10-14)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **compiler-cli:** type checking of expressions within ICUs ([#39072](https://github.com/angular/angular/issues/39072)) ([0a16e60](https://github.com/angular/angular/commit/0a16e60)), closes [#39064](https://github.com/angular/angular/issues/39064)
|
|
||||||
* **core:** migrate relative link resolution with single quotes ([#39102](https://github.com/angular/angular/issues/39102)) ([049b453](https://github.com/angular/angular/commit/049b453)), closes [#39082](https://github.com/angular/angular/issues/39082)
|
|
||||||
* **core:** use Trusted Types policy in inert DOM builder ([#39208](https://github.com/angular/angular/issues/39208)) ([7d49299](https://github.com/angular/angular/commit/7d49299))
|
|
||||||
* **core:** use Trusted Types policy in named_array_type ([#39209](https://github.com/angular/angular/issues/39209)) ([f6d5cdf](https://github.com/angular/angular/commit/f6d5cdf))
|
|
||||||
* **router:** Allow undefined inputs on routerLink ([#39151](https://github.com/angular/angular/issues/39151)) ([b0b4953](https://github.com/angular/angular/commit/b0b4953))
|
|
||||||
* **router:** create schematic for preserveQueryParams ([#38762](https://github.com/angular/angular/issues/38762)) ([93ee05d](https://github.com/angular/angular/commit/93ee05d))
|
|
||||||
* **router:** remove preserveQueryParams symbol ([#38762](https://github.com/angular/angular/issues/38762)) ([783a5bd](https://github.com/angular/angular/commit/783a5bd))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **core:** add automated migration to replace async with waitForAsync ([#39212](https://github.com/angular/angular/issues/39212)) ([5ce71e0](https://github.com/angular/angular/commit/5ce71e0))
|
|
||||||
* **core:** add automated migration to replace ViewEncapsulation.Native ([#38882](https://github.com/angular/angular/issues/38882)) ([0e733f3](https://github.com/angular/angular/commit/0e733f3))
|
|
||||||
* **core:** add initialNavigation schematic ([#36926](https://github.com/angular/angular/issues/36926)) ([0ec7043](https://github.com/angular/angular/commit/0ec7043))
|
|
||||||
* **core:** add Trusted Types workaround for Function constructor ([#39209](https://github.com/angular/angular/issues/39209)) ([5913e5c](https://github.com/angular/angular/commit/5913e5c))
|
|
||||||
* **core:** create internal Trusted Types module ([#39207](https://github.com/angular/angular/issues/39207)) ([0875fd2](https://github.com/angular/angular/commit/0875fd2))
|
|
||||||
* **core:** depend on type definitions for Trusted Types ([#39207](https://github.com/angular/angular/issues/39207)) ([c4266fb](https://github.com/angular/angular/commit/c4266fb))
|
|
||||||
* **core:** remove ViewEncapsulation.Native ([#38882](https://github.com/angular/angular/issues/38882)) ([4a1c12c](https://github.com/angular/angular/commit/4a1c12c))
|
|
||||||
* **language-service:** [Ivy] getSemanticDiagnostics for external templates ([#39065](https://github.com/angular/angular/issues/39065)) ([63624a2](https://github.com/angular/angular/commit/63624a2))
|
|
||||||
* **language-service:** Add getTypeDefinitionAtPosition (go to type definition) ([#39145](https://github.com/angular/angular/issues/39145)) ([a84976f](https://github.com/angular/angular/commit/a84976f))
|
|
||||||
* **language-service:** Add module name to directive quick info ([#39121](https://github.com/angular/angular/issues/39121)) ([4604fe9](https://github.com/angular/angular/commit/4604fe9))
|
|
||||||
* **router:** add new initialNavigation options to replace legacy ([#37480](https://github.com/angular/angular/issues/37480)) ([c4becca](https://github.com/angular/angular/commit/c4becca))
|
|
||||||
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* **router:** * The `initialNavigation` property for the options in
|
|
||||||
`RouterModule.forRoot` no longer supports `legacy_disabled`,
|
|
||||||
`legacy_enabled`, `true`, or `false` as valid values.
|
|
||||||
`legacy_enabled` (the old default) is instead `enabledNonBlocking`
|
|
||||||
* `enabled` is deprecated as a valid value for the
|
|
||||||
`RouterModule.forRoot` `initialNavigation` option. `enabledBlocking`
|
|
||||||
has been introduced to replace it
|
|
||||||
* **router:** preserveQueryParams has been removed, use
|
|
||||||
queryParamsHandling="preserve" instead
|
|
||||||
* **router:** If you were accessing the `RouterLink` values of `queryParams`,
|
|
||||||
`fragment` or `queryParamsHandling` you might need to relax the typing to also
|
|
||||||
accept `undefined` and `null`. ([#39151](https://github.com/angular/angular/issues/39151))
|
|
||||||
* **core:** * `ViewEncapsulation.Native` has been removed. Use `ViewEncapsulation.ShadowDom` instead. Existing
|
|
||||||
usages will be updated automatically by `ng update`.
|
|
||||||
* **compiler-cli:** Expressions within ICUs are now type-checked again, fixing a regression
|
|
||||||
in Ivy. This may cause compilation failures if errors are found in
|
|
||||||
expressions that appear within an ICU. Please correct these expressions
|
|
||||||
to resolve the type-check errors.
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.1.6"></a>
|
|
||||||
## 10.1.6 (2020-10-14)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **compiler:** incorrectly encapsulating [@import](https://github.com/import) containing colons and semicolons ([#38716](https://github.com/angular/angular/issues/38716)) ([52a0c6b](https://github.com/angular/angular/commit/52a0c6b)), closes [#38587](https://github.com/angular/angular/issues/38587)
|
|
||||||
* **compiler-cli:** support namespaced query types in directives ([#38959](https://github.com/angular/angular/issues/38959)) ([#39272](https://github.com/angular/angular/issues/39272)) ([f752ab9](https://github.com/angular/angular/commit/f752ab9))
|
|
||||||
* **elements:** detect matchesSelector prototype without IIFE ([#37799](https://github.com/angular/angular/issues/37799)) ([952fd86](https://github.com/angular/angular/commit/952fd86)), closes [#24551](https://github.com/angular/angular/issues/24551)
|
|
||||||
* **ngcc:** ensure that "inline exports" can be interpreted correctly ([#39272](https://github.com/angular/angular/issues/39272)) ([e08d021](https://github.com/angular/angular/commit/e08d021))
|
|
||||||
* **ngcc:** handle aliases in UMD export declarations ([#38959](https://github.com/angular/angular/issues/38959)) ([#39272](https://github.com/angular/angular/issues/39272)) ([9963c5d](https://github.com/angular/angular/commit/9963c5d)), closes [#38947](https://github.com/angular/angular/issues/38947)
|
|
||||||
* **ngcc:** map `exports` to the current module in UMD files ([#38959](https://github.com/angular/angular/issues/38959)) ([#39272](https://github.com/angular/angular/issues/39272)) ([13c4a7b](https://github.com/angular/angular/commit/13c4a7b))
|
|
||||||
* **ngcc:** support inline export declarations in UMD files ([#38959](https://github.com/angular/angular/issues/38959)) ([#39272](https://github.com/angular/angular/issues/39272)) ([9c875b3](https://github.com/angular/angular/commit/9c875b3)), closes [#38947](https://github.com/angular/angular/issues/38947)
|
|
||||||
|
|
||||||
|
|
||||||
### build
|
|
||||||
|
|
||||||
* upgrade angular build, integration/bazel and [@angular](https://github.com/angular)/bazel package to rule_nodejs 2.2.0 ([#39182](https://github.com/angular/angular/issues/39182)) ([7628c36](https://github.com/angular/angular/commit/7628c36))
|
|
||||||
|
|
||||||
|
|
||||||
### Performance Improvements
|
|
||||||
|
|
||||||
* **ngcc:** do not rescan program source files when referenced from multiple root files ([#39254](https://github.com/angular/angular/issues/39254)) ([5221df8](https://github.com/angular/angular/commit/5221df8)), closes [#39240](https://github.com/angular/angular/issues/39240)
|
|
||||||
|
|
||||||
|
|
||||||
<a name="11.0.0-next.5"></a>
|
|
||||||
# 11.0.0-next.5 (2020-10-07)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **common:** add boolean to valid json for testing ([#37893](https://github.com/angular/angular/issues/37893)) ([3c474ec](https://github.com/angular/angular/commit/3c474ec)), closes [#20690](https://github.com/angular/angular/issues/20690)
|
|
||||||
* **core:** use single quotes for relative link resolution migration to align with style guide ([#39070](https://github.com/angular/angular/issues/39070)) ([8894706](https://github.com/angular/angular/commit/8894706))
|
|
||||||
* **forms:** improve types of directive constructor arguments ([#38944](https://github.com/angular/angular/issues/38944)) ([246de9a](https://github.com/angular/angular/commit/246de9a))
|
|
||||||
* **forms:** include null in .parent of abstract control ([#32671](https://github.com/angular/angular/issues/32671)) ([f4f1bcc](https://github.com/angular/angular/commit/f4f1bcc)), closes [#16999](https://github.com/angular/angular/issues/16999)
|
|
||||||
* **language-service:** [Ivy] hybrid visitor should not locate let keyword ([#39061](https://github.com/angular/angular/issues/39061)) ([70e13dc](https://github.com/angular/angular/commit/70e13dc))
|
|
||||||
* **router:** properly assign ExtraOptions to Router in RouterTestingModule ([#39096](https://github.com/angular/angular/issues/39096)) ([d8c0534](https://github.com/angular/angular/commit/d8c0534)), closes [#23347](https://github.com/angular/angular/issues/23347)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **compiler-cli:** support getting resource dependencies for a source file ([#38048](https://github.com/angular/angular/issues/38048)) ([5dbf357](https://github.com/angular/angular/commit/5dbf357))
|
|
||||||
* **forms:** add migration for AbstractControl.parent accesses ([#39009](https://github.com/angular/angular/issues/39009)) ([aeec223](https://github.com/angular/angular/commit/aeec223)), closes [#32671](https://github.com/angular/angular/issues/32671)
|
|
||||||
* **language-service:** Add getDefinitionAndBoundSpan (go to definition) ([#39101](https://github.com/angular/angular/issues/39101)) ([3975dd9](https://github.com/angular/angular/commit/3975dd9))
|
|
||||||
* **language-service:** add quick info for inline templates in ivy ([#39060](https://github.com/angular/angular/issues/39060)) ([904adb7](https://github.com/angular/angular/commit/904adb7))
|
|
||||||
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* **forms:** Directives in the `@angular/forms` package used to have `any[]` as a type of `validators` and
|
|
||||||
`asyncValidators` arguments in constructors. Now these arguments are properly typed, so if your
|
|
||||||
code relies on directive constructor types it may require some updates to improve type safety.
|
|
||||||
* **forms:** Type of AbstractFormControl.parent now includes null
|
|
||||||
|
|
||||||
`null` is now included in the types of .parent. If you don't already have a check for this case,
|
|
||||||
the TypeScript compiler might compain. A v11 migration exists which adds the not-null assertion
|
|
||||||
operator where necessary.
|
|
||||||
|
|
||||||
In an unlikely case your code was testing the parnet against undefined with sitrct equality,
|
|
||||||
you'll need to change this to `=== null` instead, since the parent is not explicily initialized
|
|
||||||
with `null` instead of being left `undefined`.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.1.5"></a>
|
|
||||||
## 10.1.5 (2020-10-07)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **router:** update getRouteGuards to check if the context outlet is activated ([#39049](https://github.com/angular/angular/issues/39049)) ([771f731](https://github.com/angular/angular/commit/771f731)), closes [#39030](https://github.com/angular/angular/issues/39030)
|
|
||||||
* **compiler:** Recover on malformed keyed reads and keyed writes ([#39004](https://github.com/angular/angular/issues/39004)) ([f50313f](https://github.com/angular/angular/commit/f50313f)), closes [#38596](https://github.com/angular/angular/issues/38596)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="11.0.0-next.4"></a>
|
|
||||||
# 11.0.0-next.4 (2020-09-30)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **common:** correct and simplify typing of `KeyValuePipe` ([#37447](https://github.com/angular/angular/issues/37447)) ([4dfe0fa](https://github.com/angular/angular/commit/4dfe0fa))
|
|
||||||
* **common:** correct and simplify typing of AsyncPipe ([#37447](https://github.com/angular/angular/issues/37447)) ([5f815c0](https://github.com/angular/angular/commit/5f815c0))
|
|
||||||
* **common:** correct and simplify typing of I18nPluralPipe ([#37447](https://github.com/angular/angular/issues/37447)) ([3b919ef](https://github.com/angular/angular/commit/3b919ef))
|
|
||||||
* **common:** correct typing and implementation of `SlicePipe` ([#37447](https://github.com/angular/angular/issues/37447)) ([4744c22](https://github.com/angular/angular/commit/4744c22))
|
|
||||||
* **common:** let case conversion pipes accept type unions with `null` ([#36259](https://github.com/angular/angular/issues/36259)) ([#37447](https://github.com/angular/angular/issues/37447)) ([c7d5555](https://github.com/angular/angular/commit/c7d5555))
|
|
||||||
* **compiler-cli:** perform DOM schema checks even in basic mode in g3 ([#38943](https://github.com/angular/angular/issues/38943)) ([40975e0](https://github.com/angular/angular/commit/40975e0))
|
|
||||||
* **language-service:** hybrid visitor returns parent node of BoundAttribute ([#38995](https://github.com/angular/angular/issues/38995)) ([323be39](https://github.com/angular/angular/commit/323be39))
|
|
||||||
* **packaging:** remove polyfills needed to run tests on IE9 and IE 10 ([#38931](https://github.com/angular/angular/issues/38931)) ([4ca1c73](https://github.com/angular/angular/commit/4ca1c73))
|
|
||||||
* **platform-webworker:** remove platform-webworker and platform-webworker-dynamic ([#38846](https://github.com/angular/angular/issues/38846)) ([93c3d8f](https://github.com/angular/angular/commit/93c3d8f))
|
|
||||||
* **router:** make relativeLinkResolution corrected by default ([#25609](https://github.com/angular/angular/issues/25609)) ([837889f](https://github.com/angular/angular/commit/837889f)), closes [#22394](https://github.com/angular/angular/issues/22394)
|
|
||||||
|
|
||||||
|
|
||||||
### Code Refactoring
|
|
||||||
|
|
||||||
* **router:** Adjust type of parameter in navigateByUrl and createUrlTree to be more accurate ([#38227](https://github.com/angular/angular/issues/38227)) ([e4f4d18](https://github.com/angular/angular/commit/e4f4d18)), closes [#18798](https://github.com/angular/angular/issues/18798)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **common:** stricter types for DatePipe ([#37447](https://github.com/angular/angular/issues/37447)) ([daf8b7f](https://github.com/angular/angular/commit/daf8b7f))
|
|
||||||
* **common:** stricter types for number pipes ([#37447](https://github.com/angular/angular/issues/37447)) ([7b2aac9](https://github.com/angular/angular/commit/7b2aac9))
|
|
||||||
* **compiler:** Add keySpan to Variable Node ([#38965](https://github.com/angular/angular/issues/38965)) ([239968d](https://github.com/angular/angular/commit/239968d))
|
|
||||||
* **router:** Add `relativeLinkResolution` migration to update default value ([#38698](https://github.com/angular/angular/issues/38698)) ([15ea811](https://github.com/angular/angular/commit/15ea811))
|
|
||||||
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* **packaging:** In v10, IE 9, 10, and IE mobile support was deprecated. In v11, Angular framework removes IE 9,
|
|
||||||
10, and IE mobile support completely.
|
|
||||||
Supporting outdated browsers like these increases bundle size, code complexity, and test load,
|
|
||||||
and also requires time and effort that could be spent on improvements to the framework.
|
|
||||||
For example, fixing issues can be more difficult, as a straightforward fix for modern browsers
|
|
||||||
could break old ones that have quirks due to not receiving updates from vendors.
|
|
||||||
* **platform-webworker:** @angular/platform-webworker and @angular/platform-webworker-dynamic
|
|
||||||
have been removed as they were deprecated in v8
|
|
||||||
* **common:** The `slice` pipe now returns `null` for the `undefined` input value,
|
|
||||||
which is consistent with the behavior of most pipes. If you rely on
|
|
||||||
`undefined` being the result in that case, you now need to check for it
|
|
||||||
explicitly.
|
|
||||||
* **common:** The typing of the `keyvalue` pipe has been fixed to report that for
|
|
||||||
input objects that have `number` keys, the result will contain the
|
|
||||||
string representation of the keys. This was already the case and the
|
|
||||||
code has simply been updated to reflect this. Please update the
|
|
||||||
consumers of the pipe output if they were relying on the incorrect
|
|
||||||
types. Note that this does not affect use cases where the input values
|
|
||||||
are `Map`s, so if you need to preserve `number`s, this is an effective
|
|
||||||
way.
|
|
||||||
* **common:** The signatures of the number pipes now explicitly state which types are
|
|
||||||
accepted. This should only cause issues in corner cases, as any other
|
|
||||||
values would result in runtime exceptions.
|
|
||||||
* **common:** The signature of the `date` pipe now explicitly states which types are
|
|
||||||
accepted. This should only cause issues in corner cases, as any other
|
|
||||||
values would result in runtime exceptions.
|
|
||||||
* **common:** The async pipe no longer claims to return `undefined` for an input that
|
|
||||||
was typed as `undefined`. Note that the code actually returned `null` on
|
|
||||||
`undefined` inputs. In the unlikely case you were relying on this,
|
|
||||||
please fix the typing of the consumers of the pipe output.
|
|
||||||
* **common:** The case conversion pipes no longer let falsy values through. They now
|
|
||||||
map both `null` and `undefined` to `null` and raise an exception on
|
|
||||||
invalid input (`0`, `false`, `NaN`) just like most "common pipes". If
|
|
||||||
your code required falsy values to pass through, you need to handle them
|
|
||||||
explicitly.
|
|
||||||
* **router:** While the new parameter types allow a variable of type
|
|
||||||
`NavigationExtras` to be passed in, they will not allow object literals,
|
|
||||||
as they may only specify known properties. They will also not accept
|
|
||||||
types that do not have properties in common with the ones in the `Pick`.
|
|
||||||
To fix this error, only specify properties from the `NavigationExtras` which are
|
|
||||||
actually used in the respective function calls or use a type assertion
|
|
||||||
on the object or variable: `as NavigationExtras`.
|
|
||||||
* **router:** This commit changes the default value of
|
|
||||||
`relativeLinkResolution` from `'legacy'` to `'default'`. If your
|
|
||||||
application previously used the default by not specifying a value in the
|
|
||||||
`ExtraOptions` and uses relative links when navigating from children of
|
|
||||||
empty path routes, you will need to update your `RouterModule` to
|
|
||||||
specifically specify `'legacy'` for `relativeLinkResolution`.
|
|
||||||
See https://angular.io/api/router/ExtraOptions#relativeLinkResolution
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.1.4"></a>
|
|
||||||
## 10.1.4 (2020-09-30)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **compiler-cli:** enable [@types](https://github.com/types) discovery in incremental rebuilds ([#39011](https://github.com/angular/angular/issues/39011)) ([6e99427](https://github.com/angular/angular/commit/6e99427)), closes [#38979](https://github.com/angular/angular/issues/38979)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="11.0.0-next.3"></a>
|
|
||||||
# 11.0.0-next.3 (2020-09-23)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **common:** add `params` and `reportProgress` options to `HttpClient.put()` overload ([#37873](https://github.com/angular/angular/issues/37873)) ([dd8d8c8](https://github.com/angular/angular/commit/dd8d8c8)), closes [#23600](https://github.com/angular/angular/issues/23600)
|
|
||||||
* **compiler-cli:** generate `let` statements in ES2015+ mode ([#38775](https://github.com/angular/angular/issues/38775)) ([123bff7](https://github.com/angular/angular/commit/123bff7))
|
|
||||||
* **core:** ensure TestBed is not instantiated before override provider ([#38717](https://github.com/angular/angular/issues/38717)) ([c8f056b](https://github.com/angular/angular/commit/c8f056b))
|
|
||||||
* **forms:** type NG_VALUE_ACCESSOR injection token as array ([#29723](https://github.com/angular/angular/issues/29723)) ([2b1b718](https://github.com/angular/angular/commit/2b1b718)), closes [#29351](https://github.com/angular/angular/issues/29351)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **common:** Add ISO week-numbering year formats support to formatDate ([#38828](https://github.com/angular/angular/issues/38828)) ([984ed39](https://github.com/angular/angular/commit/984ed39))
|
|
||||||
* **compiler:** Parse and recover on incomplete opening HTML tags ([#38681](https://github.com/angular/angular/issues/38681)) ([6ae3b68](https://github.com/angular/angular/commit/6ae3b68)), closes [#38596](https://github.com/angular/angular/issues/38596)
|
|
||||||
* **router:** add migration to update calls to navigateByUrl and createUrlTree with invalid parameters ([#38825](https://github.com/angular/angular/issues/38825)) ([7849fdd](https://github.com/angular/angular/commit/7849fdd)), closes [#38227](https://github.com/angular/angular/issues/38227)
|
|
||||||
* **service-worker:** add the option to prefer network for navigation requests ([#38565](https://github.com/angular/angular/issues/38565)) ([a206852](https://github.com/angular/angular/commit/a206852)), closes [#38194](https://github.com/angular/angular/issues/38194)
|
|
||||||
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* **core:** If you call `TestBed.overrideProvider` after TestBed initialization, provider overrides are not applied. This
|
|
||||||
behavior is consistent with other override methods (such as `TestBed.overrideDirective`, etc) but they
|
|
||||||
throw an error to indicate that, when the check was missing in the `TestBed.overrideProvider` function.
|
|
||||||
Now calling `TestBed.overrideProvider` after TestBed initialization also triggers an
|
|
||||||
error, thus there is a chance that some tests (where `TestBed.overrideProvider` is
|
|
||||||
called after TestBed initialization) will start to fail and require updates to move `TestBed.overrideProvider` calls
|
|
||||||
before TestBed initialization is completed.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.1.3"></a>
|
|
||||||
## 10.1.3 (2020-09-23)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **http:** Fix error message when we call jsonp without importing HttpClientJsonpModule ([#38756](https://github.com/angular/angular/issues/38756)) ([3902ec0](https://github.com/angular/angular/commit/3902ec0))
|
|
||||||
* **ngcc:** fix compilation of `ChangeDetectorRef` in pipe constructors ([#38892](https://github.com/angular/angular/issues/38892)) ([093c3a1](https://github.com/angular/angular/commit/093c3a1)), closes [#38666](https://github.com/angular/angular/issues/38666) [#38883](https://github.com/angular/angular/issues/38883)
|
|
||||||
|
|
||||||
|
|
||||||
### Reverts
|
|
||||||
|
|
||||||
* feat(router): better warning message when a router outlet has not been instantiated ([#38920](https://github.com/angular/angular/issues/38920)) ([04d0aa6](https://github.com/angular/angular/commit/04d0aa6))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="11.0.0-next.2"></a>
|
|
||||||
# 11.0.0-next.2 (2020-09-16)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **common:** do not round up fractions of a millisecond in `DatePipe` ([#38009](https://github.com/angular/angular/issues/38009)) ([26f2820](https://github.com/angular/angular/commit/26f2820)), closes [/www.ecma-international.org/ecma-262/5.1/#sec-15](https://github.com//www.ecma-international.org/ecma-262/5.1//issues/sec-15) [#37989](https://github.com/angular/angular/issues/37989)
|
|
||||||
* **common:** mark locale data arrays as readonly ([#30397](https://github.com/angular/angular/issues/30397)) ([6acea54](https://github.com/angular/angular/commit/6acea54)), closes [#27003](https://github.com/angular/angular/issues/27003)
|
|
||||||
* **compiler:** source span for microsyntax text att should be key span ([#38766](https://github.com/angular/angular/issues/38766)) ([8f349b2](https://github.com/angular/angular/commit/8f349b2))
|
|
||||||
* **router:** Fix arguments order for call to shouldReuseRoute ([#26949](https://github.com/angular/angular/issues/26949)) ([3817e5f](https://github.com/angular/angular/commit/3817e5f)), closes [#16192](https://github.com/angular/angular/issues/16192) [#16192](https://github.com/angular/angular/issues/16192)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **compiler-cli:** `TemplateTypeChecker` operation to get `Symbol` from a template node ([#38618](https://github.com/angular/angular/issues/38618)) ([c4556db](https://github.com/angular/angular/commit/c4556db))
|
|
||||||
* **compiler-cli:** Add ability to get `Symbol` of `Template`s and `Element`s in component template ([#38618](https://github.com/angular/angular/issues/38618)) ([cf2e8b9](https://github.com/angular/angular/commit/cf2e8b9))
|
|
||||||
* **compiler-cli:** Add ability to get `Symbol` of AST expression in component template ([#38618](https://github.com/angular/angular/issues/38618)) ([f56ece4](https://github.com/angular/angular/commit/f56ece4))
|
|
||||||
* **compiler-cli:** add ability to get symbol of reference or variable ([#38618](https://github.com/angular/angular/issues/38618)) ([19598b4](https://github.com/angular/angular/commit/19598b4))
|
|
||||||
* **compiler-cli:** define interfaces to be used for TemplateTypeChecker ([#38618](https://github.com/angular/angular/issues/38618)) ([9e77bd3](https://github.com/angular/angular/commit/9e77bd3))
|
|
||||||
|
|
||||||
|
|
||||||
### Performance Improvements
|
|
||||||
|
|
||||||
* **compiler-cli:** only emit directive/pipe references that are used ([#38539](https://github.com/angular/angular/issues/38539)) ([077f516](https://github.com/angular/angular/commit/077f516))
|
|
||||||
* **compiler-cli:** optimize computation of type-check scope information ([#38539](https://github.com/angular/angular/issues/38539)) ([297c060](https://github.com/angular/angular/commit/297c060))
|
|
||||||
* **router:** use `ngDevMode` to tree-shake error messages in router ([#38674](https://github.com/angular/angular/issues/38674)) ([db21c4f](https://github.com/angular/angular/commit/db21c4f))
|
|
||||||
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* **router:** This change corrects the argument order when calling
|
|
||||||
RouteReuseStrategy#shouldReuseRoute. Previously, when evaluating child
|
|
||||||
routes, they would be called with the future and current arguments would
|
|
||||||
be swapped. If your RouteReuseStrategy relies specifically on only the future
|
|
||||||
or current snapshot state, you may need to update the shouldReuseRoute
|
|
||||||
implementation's use of "future" and "current" ActivateRouteSnapshots.
|
|
||||||
* **common:** The locale data API has been marked as returning readonly arrays, rather
|
|
||||||
than mutable arrays, since these arrays are shared across calls to the
|
|
||||||
API. If you were mutating them (e.g. calling `sort()`, `push()`, `splice()`, etc)
|
|
||||||
then your code will not longer compile. If you need to mutate the array, you
|
|
||||||
should now take a copy (e.g. by calling `slice()`) and mutate the copy.
|
|
||||||
* **common:** When passing a date-time formatted string to the `DatePipe` in a format that contains
|
|
||||||
fractions of a millisecond, the milliseconds will now always be rounded down rather than
|
|
||||||
to the nearest millisecond.
|
|
||||||
|
|
||||||
Most applications will not be affected by this change. If this is not the desired behaviour
|
|
||||||
then consider pre-processing the string to round the millisecond part before passing
|
|
||||||
it to the `DatePipe`.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.1.2"></a>
|
|
||||||
## 10.1.2 (2020-09-16)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **compiler:** detect pipes in ICUs in template binder ([#38810](https://github.com/angular/angular/issues/38810)) ([ec2dbe7](https://github.com/angular/angular/commit/ec2dbe7)), closes [#38539](https://github.com/angular/angular/issues/38539) [#38539](https://github.com/angular/angular/issues/38539) [#38539](https://github.com/angular/angular/issues/38539)
|
|
||||||
* **core:** clear the `RefreshTransplantedView` when detached ([#38768](https://github.com/angular/angular/issues/38768)) ([edb7f90](https://github.com/angular/angular/commit/edb7f90)), closes [#38619](https://github.com/angular/angular/issues/38619)
|
|
||||||
* **localize:** ensure that `formatOptions` is optional ([#38787](https://github.com/angular/angular/issues/38787)) ([a47383d](https://github.com/angular/angular/commit/a47383d))
|
|
||||||
* **router:** Ensure routes are processed in priority order and only if needed ([#38780](https://github.com/angular/angular/issues/38780)) ([9c51ba3](https://github.com/angular/angular/commit/9c51ba3)), closes [#38691](https://github.com/angular/angular/issues/38691)
|
|
||||||
* **upgrade:** add try/catch when downgrading injectables ([#38671](https://github.com/angular/angular/issues/38671)) ([5de2ac3](https://github.com/angular/angular/commit/5de2ac3)), closes [#37579](https://github.com/angular/angular/issues/37579)
|
|
||||||
|
|
||||||
|
|
||||||
### Performance Improvements
|
|
||||||
|
|
||||||
* **compiler-cli:** only emit directive/pipe references that are used ([#38843](https://github.com/angular/angular/issues/38843)) ([5658405](https://github.com/angular/angular/commit/5658405))
|
|
||||||
* **compiler-cli:** optimize computation of type-check scope information ([#38843](https://github.com/angular/angular/issues/38843)) ([ebede67](https://github.com/angular/angular/commit/ebede67))
|
|
||||||
* **ngcc:** introduce cache for sharing data across entry-points ([#38840](https://github.com/angular/angular/issues/38840)) ([58411e7](https://github.com/angular/angular/commit/58411e7))
|
|
||||||
* **ngcc:** reduce maximum worker count ([#38840](https://github.com/angular/angular/issues/38840)) ([ea36466](https://github.com/angular/angular/commit/ea36466))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="11.0.0-next.1"></a>
|
|
||||||
# 11.0.0-next.1 (2020-09-09)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **compiler-cli:** compute source-mappings for localized strings ([#38645](https://github.com/angular/angular/issues/38645)) ([7e0b3fd](https://github.com/angular/angular/commit/7e0b3fd)), closes [#38588](https://github.com/angular/angular/issues/38588)
|
|
||||||
* **core:** remove CollectionChangeRecord symbol ([#38668](https://github.com/angular/angular/issues/38668)) ([fdea180](https://github.com/angular/angular/commit/fdea180))
|
|
||||||
* **router:** support lazy loading for empty path named outlets ([#38379](https://github.com/angular/angular/issues/38379)) ([926ffcd](https://github.com/angular/angular/commit/926ffcd)), closes [#12842](https://github.com/angular/angular/issues/12842)
|
|
||||||
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* **core:** CollectionChangeRecord has been removed, use IterableChangeRecord
|
|
||||||
instead
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.1.1"></a>
|
|
||||||
## 10.1.1 (2020-09-09)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **compiler:** correct confusion between field and property names ([#38685](https://github.com/angular/angular/issues/38685)) ([a1c34c6](https://github.com/angular/angular/commit/a1c34c6))
|
|
||||||
* **compiler-cli:** compute source-mappings for localized strings ([#38747](https://github.com/angular/angular/issues/38747)) ([b4eb016](https://github.com/angular/angular/commit/b4eb016)), closes [#38588](https://github.com/angular/angular/issues/38588)
|
|
||||||
* **compiler-cli:** ensure that a declaration is available in type-to-value conversion ([#38684](https://github.com/angular/angular/issues/38684)) ([56d5ff2](https://github.com/angular/angular/commit/56d5ff2)), closes [#38670](https://github.com/angular/angular/issues/38670)
|
|
||||||
* **core:** reset `tView` between tests in Ivy TestBed ([#38659](https://github.com/angular/angular/issues/38659)) ([efc7606](https://github.com/angular/angular/commit/efc7606)), closes [#38600](https://github.com/angular/angular/issues/38600)
|
|
||||||
* **localize:** do not expose NodeJS typings in $localize runtime code ([#38700](https://github.com/angular/angular/issues/38700)) ([4de8dc3](https://github.com/angular/angular/commit/4de8dc3)), closes [#38692](https://github.com/angular/angular/issues/38692)
|
|
||||||
* **localize:** enable whitespace preservation marker in XLIFF files ([#38737](https://github.com/angular/angular/issues/38737)) ([190dca0](https://github.com/angular/angular/commit/190dca0)), closes [#38679](https://github.com/angular/angular/issues/38679)
|
|
||||||
* **localize:** install `[@angular](https://github.com/angular)/localize` in `devDependencies` by default ([#38680](https://github.com/angular/angular/issues/38680)) ([dbab744](https://github.com/angular/angular/commit/dbab744)), closes [#38329](https://github.com/angular/angular/issues/38329)
|
|
||||||
* **localize:** render context of translation file parse errors ([#38673](https://github.com/angular/angular/issues/38673)) ([32f33f0](https://github.com/angular/angular/commit/32f33f0)), closes [#38377](https://github.com/angular/angular/issues/38377)
|
|
||||||
* **localize:** render location in XLIFF 2 even if there is no metadata ([#38713](https://github.com/angular/angular/issues/38713)) ([ab4f953](https://github.com/angular/angular/commit/ab4f953)), closes [#38705](https://github.com/angular/angular/issues/38705)
|
|
||||||
* **ngcc:** use aliased exported types correctly ([#38666](https://github.com/angular/angular/issues/38666)) ([6a28675](https://github.com/angular/angular/commit/6a28675)), closes [#38238](https://github.com/angular/angular/issues/38238)
|
|
||||||
* **router:** If users are using the Alt key when clicking the router links, prioritize browser’s default behavior ([#38375](https://github.com/angular/angular/issues/38375)) ([309709d](https://github.com/angular/angular/commit/309709d))
|
|
||||||
|
|
||||||
|
|
||||||
### Performance Improvements
|
|
||||||
|
|
||||||
* **core:** use `ngDevMode` to tree-shake error messages ([#38612](https://github.com/angular/angular/issues/38612)) ([b084bff](https://github.com/angular/angular/commit/b084bff))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="11.0.0-next.0"></a>
|
|
||||||
# 11.0.0-next.0 (2020-09-02)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **forms:** ensure to emit `statusChanges` on subsequent value update/validations ([#38354](https://github.com/angular/angular/issues/38354)) ([d9fea85](https://github.com/angular/angular/commit/d9fea85)), closes [#20424](https://github.com/angular/angular/issues/20424) [#14542](https://github.com/angular/angular/issues/14542)
|
|
||||||
* **service-worker:** fix condition to check for a cache-busted request ([#36847](https://github.com/angular/angular/issues/36847)) ([5be4edf](https://github.com/angular/angular/commit/5be4edf))
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **service-worker:** add `UnrecoverableStateError` ([#36847](https://github.com/angular/angular/issues/36847)) ([036a2fa](https://github.com/angular/angular/commit/036a2fa)), closes [#36539](https://github.com/angular/angular/issues/36539)
|
|
||||||
|
|
||||||
|
|
||||||
### BREAKING CHANGES
|
|
||||||
|
|
||||||
* **forms:** Previously if FormControl, FormGroup and FormArray class instances had async validators
|
|
||||||
defined at initialization time, the status change event was not emitted once async validator
|
|
||||||
completed. After this change the status event is emitted into the `statusChanges` observable.
|
|
||||||
If your code relies on the old behavior, you can filter/ignore this additional status change
|
|
||||||
event.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.1.0"></a>
|
|
||||||
# 10.1.0 (2020-09-02)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
|
||||||
|
|
||||||
* **bazel:** provide LinkablePackageInfo from ng_module ([#37623](https://github.com/angular/angular/issues/37623)) ([6898eab](https://github.com/angular/angular/commit/6898eab))
|
|
||||||
* **common:** add ReadonlyMap in place of Map in keyValuePipe ([#37311](https://github.com/angular/angular/issues/37311)) ([3373453](https://github.com/angular/angular/commit/3373453)), closes [#37308](https://github.com/angular/angular/issues/37308)
|
|
||||||
* **compiler-cli:** add `SourceFile.getOriginalLocation()` to sourcemaps package ([#32912](https://github.com/angular/angular/issues/32912)) ([6abb8d0](https://github.com/angular/angular/commit/6abb8d0))
|
|
||||||
* **compiler-cli:** Add compiler option to report errors when assigning to restricted input fields ([#38249](https://github.com/angular/angular/issues/38249)) ([71138f6](https://github.com/angular/angular/commit/71138f6))
|
|
||||||
* **compiler-cli:** add support for TypeScript 4.0 ([#38076](https://github.com/angular/angular/issues/38076)) ([0fc44e0](https://github.com/angular/angular/commit/0fc44e0))
|
|
||||||
* **compiler-cli:** explain why an expression cannot be used in AOT compilations ([#37587](https://github.com/angular/angular/issues/37587)) ([712f1bd](https://github.com/angular/angular/commit/712f1bd))
|
|
||||||
* **compiler:** support unary operators for more accurate type checking ([#37918](https://github.com/angular/angular/issues/37918)) ([874792d](https://github.com/angular/angular/commit/874792d)), closes [#20845](https://github.com/angular/angular/issues/20845) [#36178](https://github.com/angular/angular/issues/36178)
|
|
||||||
* **core:** rename async to waitForAsync to avoid confusing ([#37583](https://github.com/angular/angular/issues/37583)) ([8f07429](https://github.com/angular/angular/commit/8f07429))
|
|
||||||
* **core:** support injection token as predicate in queries ([#37506](https://github.com/angular/angular/issues/37506)) ([97dc85b](https://github.com/angular/angular/commit/97dc85b)), closes [#21152](https://github.com/angular/angular/issues/21152) [#36144](https://github.com/angular/angular/issues/36144)
|
|
||||||
* **core:** update reference and doc to change `async` to `waitAsync`. ([#37583](https://github.com/angular/angular/issues/37583)) ([8fbf40b](https://github.com/angular/angular/commit/8fbf40b))
|
|
||||||
* **forms:** AbstractControl to store raw validators in addition to combined validators function ([#37881](https://github.com/angular/angular/issues/37881)) ([ad7046b](https://github.com/angular/angular/commit/ad7046b))
|
|
||||||
* **localize:** allow duplicate messages to be handled during extraction ([#38082](https://github.com/angular/angular/issues/38082)) ([cf9a47b](https://github.com/angular/angular/commit/cf9a47b)), closes [#38077](https://github.com/angular/angular/issues/38077)
|
|
||||||
* **localize:** expose `canParse()` diagnostics ([#37909](https://github.com/angular/angular/issues/37909)) ([ec32eba](https://github.com/angular/angular/commit/ec32eba)), closes [#37901](https://github.com/angular/angular/issues/37901)
|
|
||||||
* **localize:** implement message extraction tool ([#32912](https://github.com/angular/angular/issues/32912)) ([190561d](https://github.com/angular/angular/commit/190561d))
|
|
||||||
* **platform-browser:** Allow `sms`-URLs ([#31463](https://github.com/angular/angular/issues/31463)) ([fc5c34d](https://github.com/angular/angular/commit/fc5c34d)), closes [#31462](https://github.com/angular/angular/issues/31462)
|
|
||||||
* **platform-server:** add option for absolute URL HTTP support ([#37539](https://github.com/angular/angular/issues/37539)) ([d37049a](https://github.com/angular/angular/commit/d37049a)), closes [#37071](https://github.com/angular/angular/issues/37071)
|
|
||||||
* **router:** better warning message when a router outlet has not been instantiated ([#30246](https://github.com/angular/angular/issues/30246)) ([1609815](https://github.com/angular/angular/commit/1609815))
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **bazel:** fix integration test for bazel building ([#38629](https://github.com/angular/angular/issues/38629)) ([dd82f2f](https://github.com/angular/angular/commit/dd82f2f))
|
|
||||||
* **common:** date pipe gives wrong week number ([#37632](https://github.com/angular/angular/issues/37632)) ([ef1fb6d](https://github.com/angular/angular/commit/ef1fb6d)), closes [#33961](https://github.com/angular/angular/issues/33961)
|
|
||||||
* **common:** narrow `NgIf` context variables in template type checker ([#36627](https://github.com/angular/angular/issues/36627)) ([9c8bc4a](https://github.com/angular/angular/commit/9c8bc4a))
|
* **common:** narrow `NgIf` context variables in template type checker ([#36627](https://github.com/angular/angular/issues/36627)) ([9c8bc4a](https://github.com/angular/angular/commit/9c8bc4a))
|
||||||
* **compiler-cli:** avoid creating value expressions for symbols from type-only imports ([#37912](https://github.com/angular/angular/issues/37912)) ([18098d3](https://github.com/angular/angular/commit/18098d3)), closes [#37900](https://github.com/angular/angular/issues/37900)
|
|
||||||
* **compiler-cli:** ensure source-maps can handle webpack:// protocol ([#32912](https://github.com/angular/angular/issues/32912)) ([decd95e](https://github.com/angular/angular/commit/decd95e))
|
|
||||||
* **compiler-cli:** only read source-map comment from last line ([#32912](https://github.com/angular/angular/issues/32912)) ([07a07e3](https://github.com/angular/angular/commit/07a07e3))
|
|
||||||
* **compiler-cli:** type-check inputs that include undefined when there's coercion members ([#38273](https://github.com/angular/angular/issues/38273)) ([7525f3a](https://github.com/angular/angular/commit/7525f3a))
|
|
||||||
* **compiler:** incorrectly inferring namespace for HTML nodes inside SVG ([#38477](https://github.com/angular/angular/issues/38477)) ([0dda97e](https://github.com/angular/angular/commit/0dda97e)), closes [#37218](https://github.com/angular/angular/issues/37218)
|
|
||||||
* **compiler:** mark `NgModuleFactory` construction as not side effectful ([#38147](https://github.com/angular/angular/issues/38147)) ([7f8c222](https://github.com/angular/angular/commit/7f8c222))
|
* **compiler:** mark `NgModuleFactory` construction as not side effectful ([#38147](https://github.com/angular/angular/issues/38147)) ([7f8c222](https://github.com/angular/angular/commit/7f8c222))
|
||||||
* **core:** Allow modification of lifecycle hooks any time before bootstrap ([#35464](https://github.com/angular/angular/issues/35464)) ([737506e](https://github.com/angular/angular/commit/737506e)), closes [#30497](https://github.com/angular/angular/issues/30497)
|
|
||||||
* **core:** detect DI parameters in JIT mode for downleveled ES2015 classes ([#38463](https://github.com/angular/angular/issues/38463)) ([ca07da4](https://github.com/angular/angular/commit/ca07da4)), closes [#38453](https://github.com/angular/angular/issues/38453)
|
|
||||||
* **core:** determine required DOMParser feature availability ([#36578](https://github.com/angular/angular/issues/36578)) ([#36578](https://github.com/angular/angular/issues/36578)) ([c509243](https://github.com/angular/angular/commit/c509243))
|
|
||||||
* **core:** do not trigger CSP alert/report in Firefox and Chrome ([#36578](https://github.com/angular/angular/issues/36578)) ([#36578](https://github.com/angular/angular/issues/36578)) ([b950d46](https://github.com/angular/angular/commit/b950d46)), closes [#25214](https://github.com/angular/angular/issues/25214)
|
|
||||||
* **core:** move generated i18n statements to the `consts` field of ComponentDef ([#38404](https://github.com/angular/angular/issues/38404)) ([cb05c01](https://github.com/angular/angular/commit/cb05c01))
|
|
||||||
* **elements:** run strategy methods in correct zone ([#37814](https://github.com/angular/angular/issues/37814)) ([8df888d](https://github.com/angular/angular/commit/8df888d)), closes [#24181](https://github.com/angular/angular/issues/24181)
|
|
||||||
* **forms:** handle form groups/arrays own pending async validation ([#22575](https://github.com/angular/angular/issues/22575)) ([77b62a5](https://github.com/angular/angular/commit/77b62a5)), closes [#10064](https://github.com/angular/angular/issues/10064)
|
|
||||||
* **language-service:** non-existent module format in package output ([#37623](https://github.com/angular/angular/issues/37623)) ([413a0fb](https://github.com/angular/angular/commit/413a0fb))
|
|
||||||
* **localize:** ensure required XLIFF parameters are serialized ([#38575](https://github.com/angular/angular/issues/38575)) ([f0af387](https://github.com/angular/angular/commit/f0af387)), closes [#38570](https://github.com/angular/angular/issues/38570)
|
|
||||||
* **localize:** extract the correct message ids ([#38498](https://github.com/angular/angular/issues/38498)) ([ac461e1](https://github.com/angular/angular/commit/ac461e1))
|
|
||||||
* **localize:** render ICU placeholders in extracted translation files ([#38484](https://github.com/angular/angular/issues/38484)) ([81c3e80](https://github.com/angular/angular/commit/81c3e80))
|
|
||||||
* **localize:** render text of extracted placeholders ([#38536](https://github.com/angular/angular/issues/38536)) ([14e90be](https://github.com/angular/angular/commit/14e90be))
|
|
||||||
* **ngcc:** detect synthesized delegate constructors for downleveled ES2015 classes ([#38463](https://github.com/angular/angular/issues/38463)) ([3b9c802](https://github.com/angular/angular/commit/3b9c802)), closes [#38453](https://github.com/angular/angular/issues/38453) [#38453](https://github.com/angular/angular/issues/38453)
|
|
||||||
* **router:** defer loading of wildcard module until needed ([#38348](https://github.com/angular/angular/issues/38348)) ([8f708b5](https://github.com/angular/angular/commit/8f708b5)), closes [#25494](https://github.com/angular/angular/issues/25494)
|
|
||||||
* **router:** fix navigation ignoring logic to compare to the browser url ([#37716](https://github.com/angular/angular/issues/37716)) ([a5ffca0](https://github.com/angular/angular/commit/a5ffca0)), closes [#16710](https://github.com/angular/angular/issues/16710) [#13586](https://github.com/angular/angular/issues/13586)
|
|
||||||
* **router:** properly compare array queryParams for equality ([#37709](https://github.com/angular/angular/issues/37709)) ([#37860](https://github.com/angular/angular/issues/37860)) ([1801d0c](https://github.com/angular/angular/commit/1801d0c))
|
|
||||||
* **router:** remove parenthesis for primary outlet segment after removing auxiliary outlet segment ([#24656](https://github.com/angular/angular/issues/24656)) ([#37163](https://github.com/angular/angular/issues/37163)) ([71f008f](https://github.com/angular/angular/commit/71f008f))
|
|
||||||
* **router:** restore 'history.state' object for navigations coming from Angular router ([#28108](https://github.com/angular/angular/issues/28108)) ([#28176](https://github.com/angular/angular/issues/28176)) ([df76a20](https://github.com/angular/angular/commit/df76a20))
|
|
||||||
|
|
||||||
### Code Refactoring
|
|
||||||
* **router:** export DefaultRouteReuseStrategy to Router public_api ([#31575](https://github.com/angular/angular/issues/31575)) ([ca79880](https://github.com/angular/angular/commit/ca79880))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### Performance Improvements
|
|
||||||
* **compiler-cli:** don't emit template guards when child scope is empty ([#38418](https://github.com/angular/angular/issues/38418)) ([1388c17](https://github.com/angular/angular/commit/1388c17))
|
|
||||||
* **compiler-cli:** fix regressions in incremental program reuse ([#37641](https://github.com/angular/angular/issues/37641)) ([5103d90](https://github.com/angular/angular/commit/5103d90))
|
|
||||||
* **compiler-cli:** only generate directive declarations when used ([#38418](https://github.com/angular/angular/issues/38418)) ([fb8f4b4](https://github.com/angular/angular/commit/fb8f4b4))
|
|
||||||
* **compiler-cli:** only generate type-check code for referenced DOM elements ([#38418](https://github.com/angular/angular/issues/38418)) ([f42e6ce](https://github.com/angular/angular/commit/f42e6ce))
|
|
||||||
* **forms:** use internal `ngDevMode` flag to tree-shake error messages in prod builds ([#37821](https://github.com/angular/angular/issues/37821)) ([201a546](https://github.com/angular/angular/commit/201a546)), closes [#37697](https://github.com/angular/angular/issues/37697)
|
|
||||||
* **ngcc:** shortcircuit tokenizing in ESM dependency host ([#37639](https://github.com/angular/angular/issues/37639)) ([bd7f440](https://github.com/angular/angular/commit/bd7f440))
|
|
||||||
* **ngcc:** use `EntryPointManifest` to speed up noop `ProgramBaseEntryPointFinder` ([#37665](https://github.com/angular/angular/issues/37665)) ([9318e23](https://github.com/angular/angular/commit/9318e23))
|
|
||||||
* **router:** apply prioritizedGuardValue operator to optimize CanLoad guards ([#37523](https://github.com/angular/angular/issues/37523)) ([d7dd295](https://github.com/angular/angular/commit/d7dd295))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.0.14"></a>
|
|
||||||
## 10.0.14 (2020-08-26)
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.0.12"></a>
|
|
||||||
## 10.0.12 (2020-08-24)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **compiler-cli:** adding references to const enums in runtime code ([#38542](https://github.com/angular/angular/issues/38542)) ([814b436](https://github.com/angular/angular/commit/814b436)), closes [#38513](https://github.com/angular/angular/issues/38513)
|
|
||||||
* **core:** remove closing body tag from inert DOM builder ([#38454](https://github.com/angular/angular/issues/38454)) ([5528536](https://github.com/angular/angular/commit/5528536))
|
|
||||||
* **localize:** include the last placeholder in parsed translation text ([#38452](https://github.com/angular/angular/issues/38452)) ([57d1a48](https://github.com/angular/angular/commit/57d1a48))
|
|
||||||
* **localize:** parse all parts of a translation with nested HTML ([#38452](https://github.com/angular/angular/issues/38452)) ([07b99f5](https://github.com/angular/angular/commit/07b99f5)), closes [#38422](https://github.com/angular/angular/issues/38422)
|
|
||||||
|
|
||||||
|
|
||||||
### Features
|
### Features
|
||||||
|
|
||||||
* **language-service:** introduce hybrid visitor to locate AST node ([#38540](https://github.com/angular/angular/issues/38540)) ([66d8c22](https://github.com/angular/angular/commit/66d8c22))
|
* **core:** rename async to waitForAsync to avoid confusing ([#37583](https://github.com/angular/angular/issues/37583)) ([8f07429](https://github.com/angular/angular/commit/8f07429))
|
||||||
|
* **core:** update reference and doc to change `async` to `waitAsync`. ([#37583](https://github.com/angular/angular/issues/37583)) ([8fbf40b](https://github.com/angular/angular/commit/8fbf40b))
|
||||||
|
|
||||||
|
|
||||||
<a name="10.0.11"></a>
|
|
||||||
## 10.0.11 (2020-08-19)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **router:** ensure routerLinkActive updates when associated routerLinks change (resubmit of [#38349](https://github.com/angular/angular/issues/38349)) ([#38511](https://github.com/angular/angular/issues/38511)) ([0af9533](https://github.com/angular/angular/commit/0af9533)), closes [#18469](https://github.com/angular/angular/issues/18469)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.0.10"></a>
|
|
||||||
## 10.0.10 (2020-08-17)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **common:** Allow scrolling when browser supports scrollTo ([#38468](https://github.com/angular/angular/issues/38468)) ([b32126c](https://github.com/angular/angular/commit/b32126c)), closes [#30630](https://github.com/angular/angular/issues/30630)
|
|
||||||
* **core:** detect DI parameters in JIT mode for downleveled ES2015 classes ([#38500](https://github.com/angular/angular/issues/38500)) ([863acb6](https://github.com/angular/angular/commit/863acb6)), closes [#38453](https://github.com/angular/angular/issues/38453)
|
|
||||||
* **core:** error if CSS custom property in host binding has number in name ([#38432](https://github.com/angular/angular/issues/38432)) ([cb83b8a](https://github.com/angular/angular/commit/cb83b8a)), closes [#37292](https://github.com/angular/angular/issues/37292)
|
|
||||||
* **core:** fix multiple nested views removal from ViewContainerRef ([#38317](https://github.com/angular/angular/issues/38317)) ([d5e09f4](https://github.com/angular/angular/commit/d5e09f4)), closes [#38201](https://github.com/angular/angular/issues/38201)
|
|
||||||
* **ngcc:** detect synthesized delegate constructors for downleveled ES2015 classes ([#38500](https://github.com/angular/angular/issues/38500)) ([f3dd6c2](https://github.com/angular/angular/commit/f3dd6c2)), closes [#38453](https://github.com/angular/angular/issues/38453) [#38453](https://github.com/angular/angular/issues/38453)
|
|
||||||
* **router:** ensure routerLinkActive updates when associated routerLinks change ([#38349](https://github.com/angular/angular/issues/38349)) ([989e8a1](https://github.com/angular/angular/commit/989e8a1)), closes [#18469](https://github.com/angular/angular/issues/18469)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.0.9"></a>
|
|
||||||
## 10.0.9 (2020-08-12)
|
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
|
|
||||||
* **common:** ensure scrollRestoration is writable ([#30630](https://github.com/angular/angular/issues/30630)) ([#38357](https://github.com/angular/angular/issues/38357)) ([58f4b3a](https://github.com/angular/angular/commit/58f4b3a)), closes [#30629](https://github.com/angular/angular/issues/30629)
|
|
||||||
* **compiler:** evaluate safe navigation expressions in correct binding order ([#37911](https://github.com/angular/angular/issues/37911)) ([f5b9d87](https://github.com/angular/angular/commit/f5b9d87)), closes [#37194](https://github.com/angular/angular/issues/37194)
|
|
||||||
* **compiler-cli:** avoid creating value expressions for symbols from type-only imports ([#38415](https://github.com/angular/angular/issues/38415)) ([ca2b4bc](https://github.com/angular/angular/commit/ca2b4bc)), closes [#37912](https://github.com/angular/angular/issues/37912)
|
|
||||||
* **compiler-cli:** infer quote expressions as any type in type checker ([#37917](https://github.com/angular/angular/issues/37917)) ([5b87c67](https://github.com/angular/angular/commit/5b87c67)), closes [#36568](https://github.com/angular/angular/issues/36568)
|
|
||||||
* **compiler-cli:** mark eager `NgModuleFactory` construction as not side effectful ([#38320](https://github.com/angular/angular/issues/38320)) ([016a41b](https://github.com/angular/angular/commit/016a41b)), closes [#38147](https://github.com/angular/angular/issues/38147)
|
|
||||||
* **compiler-cli:** match wrapHost parameter types within plugin interface ([#38004](https://github.com/angular/angular/issues/38004)) ([df01a82](https://github.com/angular/angular/commit/df01a82))
|
|
||||||
* **compiler-cli:** preserve quotes in class member names ([#38387](https://github.com/angular/angular/issues/38387)) ([c9acb7b](https://github.com/angular/angular/commit/c9acb7b)), closes [#38311](https://github.com/angular/angular/issues/38311)
|
|
||||||
* **core:** prevent NgModule scope being overwritten in JIT compiler ([#37795](https://github.com/angular/angular/issues/37795)) ([3acebdc](https://github.com/angular/angular/commit/3acebdc)), closes [#37105](https://github.com/angular/angular/issues/37105)
|
|
||||||
* **core:** queries not matching string injection tokens ([#38321](https://github.com/angular/angular/issues/38321)) ([32109dc](https://github.com/angular/angular/commit/32109dc)), closes [#38313](https://github.com/angular/angular/issues/38313) [#38315](https://github.com/angular/angular/issues/38315)
|
|
||||||
* **core:** Store the currently selected ICU in `LView` ([#38345](https://github.com/angular/angular/issues/38345)) ([ee5123f](https://github.com/angular/angular/commit/ee5123f))
|
|
||||||
* **platform-server:** remove styles added by ServerStylesHost on destruction ([#38367](https://github.com/angular/angular/issues/38367)) ([7f11149](https://github.com/angular/angular/commit/7f11149))
|
|
||||||
* **router:** prevent calling unsubscribe on undefined subscription in RouterPreloader ([#38344](https://github.com/angular/angular/issues/38344)) ([4151314](https://github.com/angular/angular/commit/4151314))
|
|
||||||
* **service-worker:** fix the chrome debugger syntax highlighter ([#38332](https://github.com/angular/angular/issues/38332)) ([f5d5bac](https://github.com/angular/angular/commit/f5d5bac))
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.0.8"></a>
|
<a name="10.0.8"></a>
|
||||||
## 10.0.8 (2020-08-04)
|
## 10.0.8 (2020-08-04)
|
||||||
@ -603,6 +36,16 @@ event.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="10.1.0-next.3"></a>
|
||||||
|
# 10.1.0-next.3 (2020-07-28)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **elements:** run strategy methods in correct zone ([#37814](https://github.com/angular/angular/issues/37814)) ([8df888d](https://github.com/angular/angular/commit/8df888d)), closes [#24181](https://github.com/angular/angular/issues/24181)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.0.6"></a>
|
<a name="10.0.6"></a>
|
||||||
## 10.0.6 (2020-07-28)
|
## 10.0.6 (2020-07-28)
|
||||||
|
|
||||||
@ -616,6 +59,23 @@ event.
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="10.1.0-next.2"></a>
|
||||||
|
# 10.1.0-next.2 (2020-07-22)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **core:** Allow modification of lifecycle hooks any time before bootstrap ([#35464](https://github.com/angular/angular/issues/35464)) ([737506e](https://github.com/angular/angular/commit/737506e)), closes [#30497](https://github.com/angular/angular/issues/30497)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **common:** add ReadonlyMap in place of Map in keyValuePipe ([#37311](https://github.com/angular/angular/issues/37311)) ([3373453](https://github.com/angular/angular/commit/3373453)), closes [#37308](https://github.com/angular/angular/issues/37308)
|
||||||
|
* **forms:** AbstractControl to store raw validators in addition to combined validators function ([#37881](https://github.com/angular/angular/issues/37881)) ([ad7046b](https://github.com/angular/angular/commit/ad7046b))
|
||||||
|
* **localize:** allow duplicate messages to be handled during extraction ([#38082](https://github.com/angular/angular/issues/38082)) ([cf9a47b](https://github.com/angular/angular/commit/cf9a47b)), closes [#38077](https://github.com/angular/angular/issues/38077)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.0.5"></a>
|
<a name="10.0.5"></a>
|
||||||
## 10.0.5 (2020-07-22)
|
## 10.0.5 (2020-07-22)
|
||||||
|
|
||||||
@ -650,6 +110,62 @@ event.
|
|||||||
* **bazel:** provide LinkablePackageInfo from ng_module ([#37778](https://github.com/angular/angular/issues/37778)) ([6cd10a1](https://github.com/angular/angular/commit/6cd10a1)), closes [/github.com/bazelbuild/rules_nodejs/blob/9a5de3728b05bf1647bbb87ad99f54e626604705/internal/linker/link_node_modules.bzl#L144-L146](https://github.com//github.com/bazelbuild/rules_nodejs/blob/9a5de3728b05bf1647bbb87ad99f54e626604705/internal/linker/link_node_modules.bzl/issues/L144-L146)
|
* **bazel:** provide LinkablePackageInfo from ng_module ([#37778](https://github.com/angular/angular/issues/37778)) ([6cd10a1](https://github.com/angular/angular/commit/6cd10a1)), closes [/github.com/bazelbuild/rules_nodejs/blob/9a5de3728b05bf1647bbb87ad99f54e626604705/internal/linker/link_node_modules.bzl#L144-L146](https://github.com//github.com/bazelbuild/rules_nodejs/blob/9a5de3728b05bf1647bbb87ad99f54e626604705/internal/linker/link_node_modules.bzl/issues/L144-L146)
|
||||||
|
|
||||||
|
|
||||||
|
<a name="10.1.0-next.1"></a>
|
||||||
|
# 10.1.0-next.1 (2020-07-15)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **bazel:** ng_module rule does not expose flat module information in Ivy ([#36971](https://github.com/angular/angular/issues/36971)) ([1550663](https://github.com/angular/angular/commit/1550663))
|
||||||
|
* **compiler:** check more cases for pipe usage inside host bindings ([#37883](https://github.com/angular/angular/issues/37883)) ([9322b9a](https://github.com/angular/angular/commit/9322b9a)), closes [#34655](https://github.com/angular/angular/issues/34655) [#37610](https://github.com/angular/angular/issues/37610)
|
||||||
|
* **compiler-cli:** ensure file_system handles mixed Windows drives ([#37959](https://github.com/angular/angular/issues/37959)) ([6b31155](https://github.com/angular/angular/commit/6b31155)), closes [#36777](https://github.com/angular/angular/issues/36777)
|
||||||
|
* **language-service:** remove completion for string ([#37983](https://github.com/angular/angular/issues/37983)) ([10aba15](https://github.com/angular/angular/commit/10aba15))
|
||||||
|
* **ngcc:** report a warning if ngcc tries to use a solution-style tsconfig ([#38003](https://github.com/angular/angular/issues/38003)) ([b358495](https://github.com/angular/angular/commit/b358495)), closes [#36386](https://github.com/angular/angular/issues/36386)
|
||||||
|
* **router:** ensure duplicate popstate/hashchange events are handled correctly ([#37674](https://github.com/angular/angular/issues/37674)) ([9185c6e](https://github.com/angular/angular/commit/9185c6e)), closes [/github.com/angular/angular/issues/16710#issuecomment-646919529](https://github.com//github.com/angular/angular/issues/16710/issues/issuecomment-646919529) [#16710](https://github.com/angular/angular/issues/16710)
|
||||||
|
* **service-worker:** correctly handle relative base href ([#37922](https://github.com/angular/angular/issues/37922)) ([d19ef65](https://github.com/angular/angular/commit/d19ef65)), closes [#25055](https://github.com/angular/angular/issues/25055) [#25055](https://github.com/angular/angular/issues/25055)
|
||||||
|
* **service-worker:** correctly serve `ngsw/state` with a non-root SW scope ([#37922](https://github.com/angular/angular/issues/37922)) ([2156bee](https://github.com/angular/angular/commit/2156bee)), closes [#30505](https://github.com/angular/angular/issues/30505)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a name="10.1.0-next.0"></a>
|
||||||
|
# 10.1.0-next.0 (2020-07-08)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **common:** date pipe gives wrong week number ([#37632](https://github.com/angular/angular/issues/37632)) ([ef1fb6d](https://github.com/angular/angular/commit/ef1fb6d)), closes [#33961](https://github.com/angular/angular/issues/33961)
|
||||||
|
* **compiler-cli:** ensure source-maps can handle webpack:// protocol ([#32912](https://github.com/angular/angular/issues/32912)) ([decd95e](https://github.com/angular/angular/commit/decd95e))
|
||||||
|
* **compiler-cli:** only read source-map comment from last line ([#32912](https://github.com/angular/angular/issues/32912)) ([07a07e3](https://github.com/angular/angular/commit/07a07e3))
|
||||||
|
* **core:** determine required DOMParser feature availability ([#36578](https://github.com/angular/angular/issues/36578)) ([#36578](https://github.com/angular/angular/issues/36578)) ([c509243](https://github.com/angular/angular/commit/c509243))
|
||||||
|
* **core:** do not trigger CSP alert/report in Firefox and Chrome ([#36578](https://github.com/angular/angular/issues/36578)) ([#36578](https://github.com/angular/angular/issues/36578)) ([b950d46](https://github.com/angular/angular/commit/b950d46)), closes [#25214](https://github.com/angular/angular/issues/25214)
|
||||||
|
* **forms:** handle form groups/arrays own pending async validation ([#22575](https://github.com/angular/angular/issues/22575)) ([77b62a5](https://github.com/angular/angular/commit/77b62a5)), closes [#10064](https://github.com/angular/angular/issues/10064)
|
||||||
|
* **language-service:** non-existent module format in package output ([#37623](https://github.com/angular/angular/issues/37623)) ([413a0fb](https://github.com/angular/angular/commit/413a0fb))
|
||||||
|
* **router:** fix navigation ignoring logic to compare to the browser url ([#37716](https://github.com/angular/angular/issues/37716)) ([a5ffca0](https://github.com/angular/angular/commit/a5ffca0)), closes [#16710](https://github.com/angular/angular/issues/16710) [#13586](https://github.com/angular/angular/issues/13586)
|
||||||
|
* **router:** properly compare array queryParams for equality ([#37709](https://github.com/angular/angular/issues/37709)) ([#37860](https://github.com/angular/angular/issues/37860)) ([1801d0c](https://github.com/angular/angular/commit/1801d0c))
|
||||||
|
* **router:** remove parenthesis for primary outlet segment after removing auxiliary outlet segment ([#24656](https://github.com/angular/angular/issues/24656)) ([#37163](https://github.com/angular/angular/issues/37163)) ([71f008f](https://github.com/angular/angular/commit/71f008f))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **bazel:** provide LinkablePackageInfo from ng_module ([#37623](https://github.com/angular/angular/issues/37623)) ([6898eab](https://github.com/angular/angular/commit/6898eab))
|
||||||
|
* **compiler-cli:** add `SourceFile.getOriginalLocation()` to sourcemaps package ([#32912](https://github.com/angular/angular/issues/32912)) ([6abb8d0](https://github.com/angular/angular/commit/6abb8d0))
|
||||||
|
* **compiler-cli:** explain why an expression cannot be used in AOT compilations ([#37587](https://github.com/angular/angular/issues/37587)) ([712f1bd](https://github.com/angular/angular/commit/712f1bd))
|
||||||
|
* **core:** support injection token as predicate in queries ([#37506](https://github.com/angular/angular/issues/37506)) ([97dc85b](https://github.com/angular/angular/commit/97dc85b)), closes [#21152](https://github.com/angular/angular/issues/21152) [#36144](https://github.com/angular/angular/issues/36144)
|
||||||
|
* **localize:** expose `canParse()` diagnostics ([#37909](https://github.com/angular/angular/issues/37909)) ([ec32eba](https://github.com/angular/angular/commit/ec32eba)), closes [#37901](https://github.com/angular/angular/issues/37901)
|
||||||
|
* **localize:** implement message extraction tool ([#32912](https://github.com/angular/angular/issues/32912)) ([190561d](https://github.com/angular/angular/commit/190561d))
|
||||||
|
* **platform-browser:** Allow `sms`-URLs ([#31463](https://github.com/angular/angular/issues/31463)) ([fc5c34d](https://github.com/angular/angular/commit/fc5c34d)), closes [#31462](https://github.com/angular/angular/issues/31462)
|
||||||
|
* **platform-server:** add option for absolute URL HTTP support ([#37539](https://github.com/angular/angular/issues/37539)) ([d37049a](https://github.com/angular/angular/commit/d37049a)), closes [#37071](https://github.com/angular/angular/issues/37071)
|
||||||
|
|
||||||
|
|
||||||
|
### Performance Improvements
|
||||||
|
|
||||||
|
* **compiler-cli:** fix regressions in incremental program reuse ([#37641](https://github.com/angular/angular/issues/37641)) ([5103d90](https://github.com/angular/angular/commit/5103d90))
|
||||||
|
* **ngcc:** shortcircuit tokenizing in ESM dependency host ([#37639](https://github.com/angular/angular/issues/37639)) ([bd7f440](https://github.com/angular/angular/commit/bd7f440))
|
||||||
|
* **ngcc:** use `EntryPointManifest` to speed up noop `ProgramBaseEntryPointFinder` ([#37665](https://github.com/angular/angular/issues/37665)) ([9318e23](https://github.com/angular/angular/commit/9318e23))
|
||||||
|
* **router:** apply prioritizedGuardValue operator to optimize CanLoad guards ([#37523](https://github.com/angular/angular/issues/37523)) ([d7dd295](https://github.com/angular/angular/commit/d7dd295))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="10.0.3"></a>
|
<a name="10.0.3"></a>
|
||||||
## 10.0.3 (2020-07-08)
|
## 10.0.3 (2020-07-08)
|
||||||
|
|
||||||
@ -931,12 +447,12 @@ https://github.com/microsoft/TypeScript/issues/38374 for more
|
|||||||
information and updates.
|
information and updates.
|
||||||
|
|
||||||
If you used Closure Compiler with Angular in the past, you will likely
|
If you used Closure Compiler with Angular in the past, you will likely
|
||||||
be better off consuming Angular packages built from sources directly
|
be better off consuming Angular packages built from sources directly
|
||||||
rather than consuming the version we publish on npm,
|
rather than consuming the version we publish on npm,
|
||||||
which is primarily optimized for Webpack/Rollup + Terser build pipeline.
|
which is primarily optimized for Webpack/Rollup + Terser build pipeline.
|
||||||
|
|
||||||
As a temporary workaround, you might consider using your current build
|
As a temporary workaround, you might consider using your current build
|
||||||
pipeline with Closure flag `--compilation_level=SIMPLE`. This flag
|
pipeline with Closure flag `--compilation_level=SIMPLE`. This flag
|
||||||
will ensure that your build pipeline produces buildable and
|
will ensure that your build pipeline produces buildable and
|
||||||
runnable artifacts, at the cost of increased payload size due to
|
runnable artifacts, at the cost of increased payload size due to
|
||||||
advanced optimizations being disabled.
|
advanced optimizations being disabled.
|
||||||
@ -944,17 +460,17 @@ advanced optimizations being disabled.
|
|||||||
If you were affected by this change, please help us understand your
|
If you were affected by this change, please help us understand your
|
||||||
needs by leaving a comment on https://github.com/angular/angular/issues/37234.
|
needs by leaving a comment on https://github.com/angular/angular/issues/37234.
|
||||||
|
|
||||||
* **core:** make generic mandatory for ModuleWithProviders
|
* **core:** make generic mandatory for ModuleWithProviders
|
||||||
|
|
||||||
A generic type parameter has always been required for the `ModuleWithProviders` pattern to work with Ivy, but prior to this commit, View Engine allowed the generic type to be omitted (though support was officially deprecated).
|
A generic type parameter has always been required for the `ModuleWithProviders` pattern to work with Ivy, but prior to this commit, View Engine allowed the generic type to be omitted (though support was officially deprecated).
|
||||||
If you're using `ModuleWithProviders` without a generic type in your application code, a v10 migration will update your code for you.
|
If you're using `ModuleWithProviders` without a generic type in your application code, a v10 migration will update your code for you.
|
||||||
|
|
||||||
However, if you are using View Engine and also depending on a library that omits the generic type, you will now get a build time error similar to:
|
However, if you are using View Engine and also depending on a library that omits the generic type, you will now get a build time error similar to:
|
||||||
|
|
||||||
```
|
```
|
||||||
error TS2314: Generic type 'ModuleWithProviders<T>' requires 1 type argument(s).
|
error TS2314: Generic type 'ModuleWithProviders<T>' requires 1 type argument(s).
|
||||||
```
|
```
|
||||||
|
|
||||||
In this case, ngcc won't help you (because it's Ivy-only) and the migration only covers application code.
|
In this case, ngcc won't help you (because it's Ivy-only) and the migration only covers application code.
|
||||||
You should contact the library author to fix their library to provide a type parameter when they use this class.
|
You should contact the library author to fix their library to provide a type parameter when they use this class.
|
||||||
|
|
||||||
@ -2282,7 +1798,7 @@ API surface going forward.
|
|||||||
* **core:** Injector.get now accepts abstract classes to return
|
* **core:** Injector.get now accepts abstract classes to return
|
||||||
type-safe values. Previous implementation returned `any` through the
|
type-safe values. Previous implementation returned `any` through the
|
||||||
deprecated implementation.
|
deprecated implementation.
|
||||||
* Angular now compiles with Ivy by default ([#32219](https://github.com/angular/angular/issues/32219)) ([ec4381d](https://github.com/angular/angular/commit/ec4381d)).
|
* Angular now compiles with Ivy by default ([#32219](https://github.com/angular/angular/issues/32219)) ([ec4381d](https://github.com/angular/angular/commit/ec4381d)).
|
||||||
|
|
||||||
If you aren't familiar with Ivy, read our [blog post about the Ivy preview](https://blog.angular.io/its-time-for-the-compatibility-opt-in-preview-of-ivy-38f3542a282f?gi=8bfeb44b05c) and see the list of changes [here](https://docs.google.com/document/d/1Dije0AsJ0PxL3NaeNPxpYDeapj30b_QC0xfeIvIIzgg/preview).
|
If you aren't familiar with Ivy, read our [blog post about the Ivy preview](https://blog.angular.io/its-time-for-the-compatibility-opt-in-preview-of-ivy-38f3542a282f?gi=8bfeb44b05c) and see the list of changes [here](https://docs.google.com/document/d/1Dije0AsJ0PxL3NaeNPxpYDeapj30b_QC0xfeIvIIzgg/preview).
|
||||||
|
|
||||||
|
@ -1,12 +1,72 @@
|
|||||||
# Contributor Code of Conduct
|
# Código de Conducta
|
||||||
## Version 0.3b-angular
|
|
||||||
|
|
||||||
As contributors and maintainers of the Angular project, we pledge to respect everyone who contributes by posting issues, updating documentation, submitting pull requests, providing feedback in comments, and any other activities.
|
## 1. Propósito
|
||||||
|
|
||||||
Communication through any of Angular's channels (GitHub, Discord, Gitter, IRC, mailing lists, Twitter, etc.) must be constructive and never resort to personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
“Prometemos brindar cortesía y respeto a cualquier persona involucrada en esta comunidad, sin importar el género con el que se identifique, su orientación sexual, limitación física, edad, raza, etnia, religión o nivel de conocimiento. Esperamos que cualquiera que desee contribuir en este proyecto brinde el mismo comportamiento”
|
||||||
|
|
||||||
We promise to extend courtesy and respect to everyone involved in this project regardless of gender, gender identity, sexual orientation, disability, age, race, ethnicity, religion, or level of experience. We expect anyone contributing to the Angular project to do the same.
|
Bajo ese principio queremos enfocar esta comunidad, una comunidad de respeto por el otro, donde cualquiera que sienta pasión por Angular y desee involucrarse con cualquier tipo de actividad deberá ayudar a mantener una atmósfera de cortesía por el otro, respetando los pensamientos, acciones, ideales y propuestas del otro.
|
||||||
|
|
||||||
If any member of the community violates this code of conduct, the maintainers of the Angular project may take action, removing issues, comments, and PRs or blocking accounts as deemed appropriate.
|
## 2. Comportamiento esperado
|
||||||
|
|
||||||
If you are subject to or witness unacceptable behavior, or have any other concerns, please email us at [conduct@angular.io](mailto:conduct@angular.io).
|
- Evitar usar expresiones o gestos insultantes, humillantes o intimidatorios para referirnos a otros.
|
||||||
|
- Ejercita la consideración y el respeto en tus comunicaciones y acciones.
|
||||||
|
- Absténte de adoptar una conducta y un lenguaje degradantes, discriminatorios, abusivos o acosadores.
|
||||||
|
- Evitar comportamientos que agredan las expresiones de identidad, género, creencias religiosas, acciones que lastimen o los aíslen a otros.
|
||||||
|
- Evitar comentarios sobre ideas políticas.
|
||||||
|
- No se toleran conductas físicas y actitudes dirigidas al descrédito personal, físico o emocional de cualquier persona.
|
||||||
|
- No se toleran chistes y comentarios excluyentes, sexistas y racistas.
|
||||||
|
- Se rechaza actitudes de hostigamiento.
|
||||||
|
- Se rechaza el acoso: este se entiende como cualquier tipo de comentario verbal que refuerce discriminación por género, identidad y expresión de género, orientación sexual, discapacidad, apariencia física, tamaño corporal, raza, edad o religión en contextos laborales o sociales.
|
||||||
|
- No se tolera el contacto físico y/o la atención sexual no deseada.
|
||||||
|
- Promover la igualdad de oportunidades de formación, educación, intercambio y retroalimentación antes, durante y después de los eventos.
|
||||||
|
- Intenta colaborar en lugar de generar conflicto.
|
||||||
|
- Sé consciente de tu entorno y de tus compañeros participantes. Alerta a líderes de la comunidad si notas una situación peligrosa, alguien en apuros, o violaciones de este Código de Conducta, incluso si parecen intrascendentes.
|
||||||
|
|
||||||
|
## 3. Comportamiento inaceptable
|
||||||
|
Comportamientos inaceptables incluyen: intimidación, acoso, abuso, discriminación, comunicación despectiva o degradante o acciones por cualquier participante en nuestra comunidad ya sea virtual, o en las comunicaciones uno-a-uno que se realizan en el contexto de la comunidad. Por favor ser respetuoso con todos.
|
||||||
|
|
||||||
|
El acoso incluye: comentarios nocivos o perjudiciales, verbales o escritos relacionados con el género, la orientación sexual, raza, religión, discapacidad; uso inadecuado de desnudos y / o imágenes sexuales en espacios públicos (incluyendo la presentación diapositivas); intimidación deliberada, acecho o seguimiento; fotografías o grabaciones acosadoras; interrupción sostenida de charlas y otros eventos; contacto físico inapropiado, y atención sexual no deseada.
|
||||||
|
|
||||||
|
## 4. Consecuencias de comportamiento inaceptable
|
||||||
|
Se espera que personas a quienes se les solicite que detengan su comportamiento inaceptable lo hagan de manera inmediata esto será válido para cualquier miembro de la comunidad.
|
||||||
|
|
||||||
|
En caso de presentarse una violación al código de conducta de manera repetida se tendrá cero tolerancia a este comportamiento por parte de los organizadores.
|
||||||
|
|
||||||
|
Si un miembro de la comunidad participa en una conducta inaceptable, los organizadores pueden tomar cualquier acción que consideren apropiada, hasta e incluyendo una prohibición temporal o expulsión permanente de la comunidad, sin previo aviso.
|
||||||
|
|
||||||
|
Priorizamos la seguridad de las personas marginadas sobre la comodidad de las personas privilegiadas. Nos reservamos el derecho de no actuar sobre las quejas relacionadas con:
|
||||||
|
|
||||||
|
- El "racismo inverso", "sexismo inverso" y "cisfobia".
|
||||||
|
- Comunicación razonable de límites, como "déjame en paz", "vete" o "no estoy discutiendo esto contigo".
|
||||||
|
- Al comunicarse en un "tono", no se encuentra agradable.
|
||||||
|
- Identificando comportamientos o suposiciones racistas, sexistas, cissexistas u opresivas.
|
||||||
|
|
||||||
|
## 5. ¿Qué hacer si se incumple el código de conducta?
|
||||||
|
Si eres víctima o testigo de una conducta inaceptable, o tienes cualquier inquietud, por favor comunícate con el equipo organizador lo antes posible:
|
||||||
|
|
||||||
|
- Mensaje directo: Michael Prentice (@splaktar)
|
||||||
|
- Mensaje directo: Jorge Cano (@jorgeucano)
|
||||||
|
- Mensaje directo: Andrés Villanueva (@villanuevand)
|
||||||
|
- Email: [soporte@angular.lat](mailto:soporte@angular.lat)
|
||||||
|
|
||||||
|
### ¿Qué pasa después?
|
||||||
|
- Una vez haya sido notificada el no cumplimiento de la norma, el equipo de liderazgo se reunirán y analizarán el caso.
|
||||||
|
- Los incidentes presentados se manejarán con discreción.
|
||||||
|
- Los organizadores se comunicarán con la persona que incumplió la norma y tomarán las medidas respectivas.
|
||||||
|
- Se realizará un acompañamiento a la persona agredida y se apoyará.
|
||||||
|
- Si el incidente se hace público, Angular Hispano no se hace responsable de los perjuicios que esto pueda ocasionar en el agresor o el agredido.
|
||||||
|
|
||||||
|
## 6. Alcance
|
||||||
|
Esperamos que todos los participantes de la comunidad (organizadores, voluntarios, contribuyentes pagados o de otro modo; patrocinadores; y otros invitados) se atengan a este Código de Conducta en todos los espacios virtuales y presenciales, así como en todas las comunicaciones de uno-a-uno pertinentes la comunidad.
|
||||||
|
|
||||||
|
### Colaboradores
|
||||||
|
|
||||||
|
- Alejandra Giraldo
|
||||||
|
- Vanessa Marely
|
||||||
|
- Mariano Alvarez
|
||||||
|
- Andrés Villanueva
|
||||||
|
- Michael Prentice
|
||||||
|
- javascript&friends
|
||||||
|
- Angular
|
||||||
|
- She Codes Angular
|
||||||
|
- Colombia dev
|
359
CONTRIBUTING.en.md
Normal file
359
CONTRIBUTING.en.md
Normal file
@ -0,0 +1,359 @@
|
|||||||
|
# Contributing to Angular
|
||||||
|
|
||||||
|
We would love for you to contribute to Angular and help make it even better than it is today!
|
||||||
|
As a contributor, here are the guidelines we would like you to follow:
|
||||||
|
|
||||||
|
- [Code of Conduct](#coc)
|
||||||
|
- [Question or Problem?](#question)
|
||||||
|
- [Issues and Bugs](#issue)
|
||||||
|
- [Feature Requests](#feature)
|
||||||
|
- [Submission Guidelines](#submit)
|
||||||
|
- [Coding Rules](#rules)
|
||||||
|
- [Commit Message Guidelines](#commit)
|
||||||
|
- [Signing the CLA](#cla)
|
||||||
|
|
||||||
|
|
||||||
|
## <a name="coc"></a> Code of Conduct
|
||||||
|
|
||||||
|
Help us keep Angular open and inclusive.
|
||||||
|
Please read and follow our [Code of Conduct][coc].
|
||||||
|
|
||||||
|
|
||||||
|
## <a name="question"></a> Got a Question or Problem?
|
||||||
|
|
||||||
|
Do not open issues for general support questions as we want to keep GitHub issues for bug reports and feature requests.
|
||||||
|
Instead, we recommend using [Stack Overflow](https://stackoverflow.com/questions/tagged/angular) to ask support-related questions. When creating a new question on Stack Overflow, make sure to add the `angular` tag.
|
||||||
|
|
||||||
|
Stack Overflow is a much better place to ask questions since:
|
||||||
|
|
||||||
|
- there are thousands of people willing to help on Stack Overflow
|
||||||
|
- questions and answers stay available for public viewing so your question/answer might help someone else
|
||||||
|
- Stack Overflow's voting system assures that the best answers are prominently visible.
|
||||||
|
|
||||||
|
To save your and our time, we will systematically close all issues that are requests for general support and redirect people to Stack Overflow.
|
||||||
|
|
||||||
|
If you would like to chat about the question in real-time, you can reach out via [our gitter channel][gitter].
|
||||||
|
|
||||||
|
|
||||||
|
## <a name="issue"></a> Found a Bug?
|
||||||
|
|
||||||
|
If you find a bug in the source code, you can help us by [submitting an issue](#submit-issue) to our [GitHub Repository][github].
|
||||||
|
Even better, you can [submit a Pull Request](#submit-pr) with a fix.
|
||||||
|
|
||||||
|
|
||||||
|
## <a name="feature"></a> Missing a Feature?
|
||||||
|
You can *request* a new feature by [submitting an issue](#submit-issue) to our GitHub Repository.
|
||||||
|
If you would like to *implement* a new feature, please consider the size of the change in order to determine the right steps to proceed:
|
||||||
|
|
||||||
|
* For a **Major Feature**, first open an issue and outline your proposal so that it can be discussed.
|
||||||
|
This process allows us to better coordinate our efforts, prevent duplication of work, and help you to craft the change so that it is successfully accepted into the project.
|
||||||
|
|
||||||
|
**Note**: Adding a new topic to the documentation, or significantly re-writing a topic, counts as a major feature.
|
||||||
|
|
||||||
|
* **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr).
|
||||||
|
|
||||||
|
|
||||||
|
## <a name="submit"></a> Submission Guidelines
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="submit-issue"></a> Submitting an Issue
|
||||||
|
|
||||||
|
Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available.
|
||||||
|
|
||||||
|
We want to fix all the issues as soon as possible, but before fixing a bug we need to reproduce and confirm it.
|
||||||
|
In order to reproduce bugs, we require that you provide a minimal reproduction.
|
||||||
|
Having a minimal reproducible scenario gives us a wealth of important information without going back and forth to you with additional questions.
|
||||||
|
|
||||||
|
A minimal reproduction allows us to quickly confirm a bug (or point out a coding problem) as well as confirm that we are fixing the right problem.
|
||||||
|
|
||||||
|
We require a minimal reproduction to save maintainers' time and ultimately be able to fix more bugs.
|
||||||
|
Often, developers find coding problems themselves while preparing a minimal reproduction.
|
||||||
|
We understand that sometimes it might be hard to extract essential bits of code from a larger codebase but we really need to isolate the problem before we can fix it.
|
||||||
|
|
||||||
|
Unfortunately, we are not able to investigate / fix bugs without a minimal reproduction, so if we don't hear back from you, we are going to close an issue that doesn't have enough info to be reproduced.
|
||||||
|
|
||||||
|
You can file new issues by selecting from our [new issue templates](https://github.com/angular/angular/issues/new/choose) and filling out the issue template.
|
||||||
|
|
||||||
|
|
||||||
|
### <a name="submit-pr"></a> Submitting a Pull Request (PR)
|
||||||
|
|
||||||
|
Before you submit your Pull Request (PR) consider the following guidelines:
|
||||||
|
|
||||||
|
1. Search [GitHub](https://github.com/angular/angular/pulls) for an open or closed PR that relates to your submission.
|
||||||
|
You don't want to duplicate existing efforts.
|
||||||
|
|
||||||
|
2. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add.
|
||||||
|
Discussing the design upfront helps to ensure that we're ready to accept your work.
|
||||||
|
|
||||||
|
3. Please sign our [Contributor License Agreement (CLA)](#cla) before sending PRs.
|
||||||
|
We cannot accept code without a signed CLA.
|
||||||
|
Make sure you author all contributed Git commits with email address associated with your CLA signature.
|
||||||
|
|
||||||
|
4. Fork the angular/angular repo.
|
||||||
|
|
||||||
|
5. Make your changes in a new git branch:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git checkout -b my-fix-branch master
|
||||||
|
```
|
||||||
|
|
||||||
|
6. Create your patch, **including appropriate test cases**.
|
||||||
|
|
||||||
|
7. Follow our [Coding Rules](#rules).
|
||||||
|
|
||||||
|
8. Run the full Angular test suite, as described in the [developer documentation][dev-doc], and ensure that all tests pass.
|
||||||
|
|
||||||
|
9. Commit your changes using a descriptive commit message that follows our [commit message conventions](#commit).
|
||||||
|
Adherence to these conventions is necessary because release notes are automatically generated from these messages.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git commit -a
|
||||||
|
```
|
||||||
|
Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
|
||||||
|
|
||||||
|
10. Push your branch to GitHub:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git push origin my-fix-branch
|
||||||
|
```
|
||||||
|
|
||||||
|
11. In GitHub, send a pull request to `angular:master`.
|
||||||
|
|
||||||
|
If we ask for changes via code reviews then:
|
||||||
|
|
||||||
|
* Make the required updates.
|
||||||
|
* Re-run the Angular test suites to ensure tests are still passing.
|
||||||
|
* Rebase your branch and force push to your GitHub repository (this will update your Pull Request):
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git rebase master -i
|
||||||
|
git push -f
|
||||||
|
```
|
||||||
|
|
||||||
|
That's it! Thank you for your contribution!
|
||||||
|
|
||||||
|
|
||||||
|
#### After your pull request is merged
|
||||||
|
|
||||||
|
After your pull request is merged, you can safely delete your branch and pull the changes from the main (upstream) repository:
|
||||||
|
|
||||||
|
* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git push origin --delete my-fix-branch
|
||||||
|
```
|
||||||
|
|
||||||
|
* Check out the master branch:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git checkout master -f
|
||||||
|
```
|
||||||
|
|
||||||
|
* Delete the local branch:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git branch -D my-fix-branch
|
||||||
|
```
|
||||||
|
|
||||||
|
* Update your master with the latest upstream version:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git pull --ff upstream master
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## <a name="rules"></a> Coding Rules
|
||||||
|
To ensure consistency throughout the source code, keep these rules in mind as you are working:
|
||||||
|
|
||||||
|
* All features or bug fixes **must be tested** by one or more specs (unit-tests).
|
||||||
|
* All public API methods **must be documented**.
|
||||||
|
* We follow [Google's JavaScript Style Guide][js-style-guide], but wrap all code at **100 characters**.
|
||||||
|
|
||||||
|
An automated formatter is available, see [DEVELOPER.md](docs/DEVELOPER.md#clang-format).
|
||||||
|
|
||||||
|
|
||||||
|
## <a name="commit"></a> Commit Message Format
|
||||||
|
|
||||||
|
*This specification is inspired and supersedes the [AngularJS commit message format][commit-message-format].*
|
||||||
|
|
||||||
|
We have very precise rules over how our Git commit messages must be formatted.
|
||||||
|
This format leads to **easier to read commit history**.
|
||||||
|
|
||||||
|
Each commit message consists of a **header**, a **body**, and a **footer**.
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
<header>
|
||||||
|
<BLANK LINE>
|
||||||
|
<body>
|
||||||
|
<BLANK LINE>
|
||||||
|
<footer>
|
||||||
|
```
|
||||||
|
|
||||||
|
The `header` is mandatory and must conform to the [Commit Message Header](#commit-header) format.
|
||||||
|
|
||||||
|
The `body` is mandatory for all commits except for those of scope "docs".
|
||||||
|
When the body is required it must be at least 20 characters long.
|
||||||
|
|
||||||
|
The `footer` is optional.
|
||||||
|
|
||||||
|
Any line of the commit message cannot be longer than 100 characters.
|
||||||
|
|
||||||
|
|
||||||
|
#### <a href="commit-header"></a>Commit Message Header
|
||||||
|
|
||||||
|
```
|
||||||
|
<type>(<scope>): <short summary>
|
||||||
|
│ │ │
|
||||||
|
│ │ └─⫸ Summary in present tense. Not capitalized. No period at the end.
|
||||||
|
│ │
|
||||||
|
│ └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core|
|
||||||
|
│ elements|forms|http|language-service|localize|platform-browser|
|
||||||
|
│ platform-browser-dynamic|platform-server|platform-webworker|
|
||||||
|
│ platform-webworker-dynamic|router|service-worker|upgrade|zone.js|
|
||||||
|
│ packaging|changelog|dev-infra|docs-infra|migrations|ngcc|ve
|
||||||
|
│
|
||||||
|
└─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|style|test
|
||||||
|
```
|
||||||
|
|
||||||
|
The `<type>` and `<summary>` fields are mandatory, the `(<scope>)` field is optional.
|
||||||
|
|
||||||
|
|
||||||
|
##### Type
|
||||||
|
|
||||||
|
Must be one of the following:
|
||||||
|
|
||||||
|
* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
|
||||||
|
* **ci**: Changes to our CI configuration files and scripts (example scopes: Circle, BrowserStack, SauceLabs)
|
||||||
|
* **docs**: Documentation only changes
|
||||||
|
* **feat**: A new feature
|
||||||
|
* **fix**: A bug fix
|
||||||
|
* **perf**: A code change that improves performance
|
||||||
|
* **refactor**: A code change that neither fixes a bug nor adds a feature
|
||||||
|
* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
|
||||||
|
* **test**: Adding missing tests or correcting existing tests
|
||||||
|
|
||||||
|
|
||||||
|
##### 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 following is the list of supported scopes:
|
||||||
|
|
||||||
|
* `animations`
|
||||||
|
* `bazel`
|
||||||
|
* `benchpress`
|
||||||
|
* `common`
|
||||||
|
* `compiler`
|
||||||
|
* `compiler-cli`
|
||||||
|
* `core`
|
||||||
|
* `elements`
|
||||||
|
* `forms`
|
||||||
|
* `http`
|
||||||
|
* `language-service`
|
||||||
|
* `localize`
|
||||||
|
* `platform-browser`
|
||||||
|
* `platform-browser-dynamic`
|
||||||
|
* `platform-server`
|
||||||
|
* `platform-webworker`
|
||||||
|
* `platform-webworker-dynamic`
|
||||||
|
* `router`
|
||||||
|
* `service-worker`
|
||||||
|
* `upgrade`
|
||||||
|
* `zone.js`
|
||||||
|
|
||||||
|
There are currently a few exceptions to the "use package name" rule:
|
||||||
|
|
||||||
|
* `packaging`: used for changes that change the npm package layout in all of our packages, e.g. public path changes, package.json changes done to all packages, d.ts file/format changes, changes to bundles, etc.
|
||||||
|
|
||||||
|
* `changelog`: used for updating the release notes in CHANGELOG.md
|
||||||
|
|
||||||
|
* `dev-infra`: used for dev-infra related changes within the directories /scripts, /tools and /dev-infra
|
||||||
|
|
||||||
|
* `docs-infra`: used for docs-app (angular.io) related changes within the /aio directory of the repo
|
||||||
|
|
||||||
|
* `migrations`: used for changes to the `ng update` migrations.
|
||||||
|
|
||||||
|
* `ngcc`: used for changes to the [Angular Compatibility Compiler](./packages/compiler-cli/ngcc/README.md)
|
||||||
|
|
||||||
|
* `ve`: used for changes specific to ViewEngine (legacy compiler/renderer).
|
||||||
|
|
||||||
|
* 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 specific package (e.g. `docs: fix typo in tutorial`).
|
||||||
|
|
||||||
|
|
||||||
|
##### Summary
|
||||||
|
|
||||||
|
Use the summary field to provide a succinct description of the change:
|
||||||
|
|
||||||
|
* use the imperative, present tense: "change" not "changed" nor "changes"
|
||||||
|
* don't capitalize the first letter
|
||||||
|
* no dot (.) at the end
|
||||||
|
|
||||||
|
|
||||||
|
#### Commit Message Body
|
||||||
|
|
||||||
|
Just as in the summary, use the imperative, present tense: "fix" not "fixed" nor "fixes".
|
||||||
|
|
||||||
|
Explain the motivation for the change in the commit message body. This commit message should explain _why_ you are making the change.
|
||||||
|
You can include a comparison of the previous behavior with the new behavior in order to illustrate the impact of the change.
|
||||||
|
|
||||||
|
|
||||||
|
#### Commit Message Footer
|
||||||
|
|
||||||
|
The footer can contain information about breaking changes and is also the place to reference GitHub issues, Jira tickets, and other PRs that this commit closes or is related to.
|
||||||
|
|
||||||
|
```
|
||||||
|
BREAKING CHANGE: <breaking change summary>
|
||||||
|
<BLANK LINE>
|
||||||
|
<breaking change description + migration instructions>
|
||||||
|
<BLANK LINE>
|
||||||
|
<BLANK LINE>
|
||||||
|
Fixes #<issue number>
|
||||||
|
```
|
||||||
|
|
||||||
|
Breaking Change section should start with the phrase "BREAKING CHANGE: " followed by a summary of the breaking change, a blank line, and a detailed description of the breaking change that also includes migration instructions.
|
||||||
|
|
||||||
|
|
||||||
|
### Revert commits
|
||||||
|
|
||||||
|
If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit.
|
||||||
|
|
||||||
|
The content of the commit message body should contain:
|
||||||
|
|
||||||
|
- information about the SHA of the commit being reverted in the following format: `This reverts commit <SHA>`,
|
||||||
|
- a clear description of the reason for reverting the commit message.
|
||||||
|
|
||||||
|
|
||||||
|
## <a name="cla"></a> Signing the CLA
|
||||||
|
|
||||||
|
Please sign our Contributor License Agreement (CLA) before sending pull requests. For any code
|
||||||
|
changes to be accepted, the CLA must be signed. It's a quick process, we promise!
|
||||||
|
|
||||||
|
* For individuals, we have a [simple click-through form][individual-cla].
|
||||||
|
* For corporations, we'll need you to
|
||||||
|
[print, sign and one of scan+email, fax or mail the form][corporate-cla].
|
||||||
|
|
||||||
|
If you have more than one GitHub accounts, or multiple email addresses associated with a single GitHub account, you must sign the CLA using the primary email address of the GitHub account used to author Git commits and send pull requests.
|
||||||
|
|
||||||
|
The following documents can help you sort out issues with GitHub accounts and multiple email addresses:
|
||||||
|
|
||||||
|
* https://help.github.com/articles/setting-your-commit-email-address-in-git/
|
||||||
|
* https://stackoverflow.com/questions/37245303/what-does-usera-committed-with-userb-13-days-ago-on-github-mean
|
||||||
|
* https://help.github.com/articles/about-commit-email-addresses/
|
||||||
|
* https://help.github.com/articles/blocking-command-line-pushes-that-expose-your-personal-email-address/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[angular-group]: https://groups.google.com/forum/#!forum/angular
|
||||||
|
[coc]: https://github.com/angular/code-of-conduct/blob/master/CODE_OF_CONDUCT.md
|
||||||
|
[commit-message-format]: https://docs.google.com/document/d/1QrDFcIiPjSLDn3EL15IJygNPiHORgU1_OOAqWjiDU5Y/edit#
|
||||||
|
[corporate-cla]: http://code.google.com/legal/corporate-cla-v1.0.html
|
||||||
|
[dev-doc]: https://github.com/angular/angular/blob/master/docs/DEVELOPER.md
|
||||||
|
[github]: https://github.com/angular/angular
|
||||||
|
[gitter]: https://gitter.im/angular/angular
|
||||||
|
[individual-cla]: http://code.google.com/legal/individual-cla-v1.0.html
|
||||||
|
[js-style-guide]: https://google.github.io/styleguide/jsguide.html
|
||||||
|
[jsfiddle]: http://jsfiddle.net
|
||||||
|
[plunker]: http://plnkr.co/edit
|
||||||
|
[runnable]: http://runnable.com
|
||||||
|
[stackoverflow]: http://stackoverflow.com/questions/tagged/angular
|
365
CONTRIBUTING.md
365
CONTRIBUTING.md
@ -1,277 +1,243 @@
|
|||||||
# Contributing to Angular
|
# Contribuye a Angular
|
||||||
|
|
||||||
We would love for you to contribute to Angular and help make it even better than it is today!
|
¡Nos encantaría que contribuyeras a Angular y que ayudaras a hacerlo aún mejor de lo que es hoy!
|
||||||
As a contributor, here are the guidelines we would like you to follow:
|
Como colaborador, estos son los lineamientos que nos gustaría que siguieras:
|
||||||
|
|
||||||
- [Code of Conduct](#coc)
|
- [Código de conducta](#coc)
|
||||||
- [Question or Problem?](#question)
|
- [¿Preguntas o problemas?](#question)
|
||||||
- [Issues and Bugs](#issue)
|
- [_Issues_ y _bugs_](#issue)
|
||||||
- [Feature Requests](#feature)
|
- [Solicitud de funcionalidades](#feature)
|
||||||
- [Submission Guidelines](#submit)
|
- [Guía para la creación de issues y PRs](#submit)
|
||||||
- [Coding Rules](#rules)
|
- [Reglas del código](#rules)
|
||||||
- [Commit Message Guidelines](#commit)
|
- [Convención para el mensaje de los _commits_](#commit)
|
||||||
- [Signing the CLA](#cla)
|
- [Firma del Acuerdo de Licencia de Colaborador (CLA)](#cla)
|
||||||
|
|
||||||
|
|
||||||
## <a name="coc"></a> Code of Conduct
|
## <a name="coc"></a> Código de conducta
|
||||||
|
|
||||||
Help us keep Angular open and inclusive.
|
Ayúdanos a mantener Angular abierto e inclusivo.
|
||||||
Please read and follow our [Code of Conduct][coc].
|
Por favor lee y sigue nuestro [Código de conducta][coc].
|
||||||
|
|
||||||
|
|
||||||
## <a name="question"></a> Got a Question or Problem?
|
## <a name="question"></a> ¿Tienes alguna pregunta o problema?
|
||||||
|
|
||||||
Do not open issues for general support questions as we want to keep GitHub issues for bug reports and feature requests.
|
No abras *issues* para preguntas de soporte general ya que queremos mantener los *issues* de GitHub para reporte de *bugs* y solicitud de funcionalidades.
|
||||||
Instead, we recommend using [Stack Overflow](https://stackoverflow.com/questions/tagged/angular) to ask support-related questions. When creating a new question on Stack Overflow, make sure to add the `angular` tag.
|
En su lugar, recomendamos utilizar [Stack Overflow](https://stackoverflow.com/questions/tagged/angular) para hacer preguntas relacionadas con soporte. Al crear una nueva pregunta en Stack Overflow, asegúrate de agregar el etiqueta (tag) de `angular`.
|
||||||
|
|
||||||
Stack Overflow is a much better place to ask questions since:
|
Stack Overflow es mucho mejor para hacer preguntas ya que:
|
||||||
|
|
||||||
- there are thousands of people willing to help on Stack Overflow
|
- Hay miles de personas dispuestas a ayudar en preguntas y respuestas de Stack Overflow
|
||||||
- questions and answers stay available for public viewing so your question/answer might help someone else
|
que permanecen disponibles para el público, por lo que tu pregunta o respuesta podría ayudar a otra persona.
|
||||||
- Stack Overflow's voting system assures that the best answers are prominently visible.
|
- El sistema de votación de Stack Overflow asegura que las mejores respuestas sobresalgan y sean visibles.
|
||||||
|
|
||||||
To save your and our time, we will systematically close all issues that are requests for general support and redirect people to Stack Overflow.
|
Para ahorrar tu tiempo y el nuestro, cerraremos sistemáticamente todos los *issues* que sean solicitudes de soporte general y redirigiremos a las personas a Stack Overflow.
|
||||||
|
|
||||||
If you would like to chat about the question in real-time, you can reach out via [our Discord server][discord].
|
Si deseas chatear sobre alguna pregunta en tiempo real, puedes hacerlo a través de nuestro [canal de Gitter][gitter].
|
||||||
|
|
||||||
|
|
||||||
## <a name="issue"></a> Found a Bug?
|
## <a name="issue"></a> ¿Encontraste un Bug?
|
||||||
|
|
||||||
If you find a bug in the source code, you can help us by [submitting an issue](#submit-issue) to our [GitHub Repository][github].
|
Si encontraste un error en el código fuente, puedes ayudarnos [creando un *issue*](#submit-issue) en nuestro [repositorio de GitHub][github].
|
||||||
Even better, you can [submit a Pull Request](#submit-pr) with a fix.
|
O incluso mejor, puedes [crear un *Pull Request*](#submit-pr) con la solución.
|
||||||
|
|
||||||
|
|
||||||
## <a name="feature"></a> Missing a Feature?
|
## <a name="feature"></a> ¿Falta alguna funcionalidad?
|
||||||
You can *request* a new feature by [submitting an issue](#submit-issue) to our GitHub Repository.
|
Puedes solicitar una nueva funcionalidad [creando un *issue*](#submit-issue) en nuestro repositorio de GitHub.
|
||||||
If you would like to *implement* a new feature, please consider the size of the change in order to determine the right steps to proceed:
|
Si deseas implementar una nueva funcionalidad, por favor considera el tamaño del cambio para determinar los pasos correctos para continuar:
|
||||||
|
|
||||||
* For a **Major Feature**, first open an issue and outline your proposal so that it can be discussed.
|
* Para un **cambio significativo**, primero abre un *issue* y describe tu propuesta para que pueda ser discutida.
|
||||||
This process allows us to better coordinate our efforts, prevent duplication of work, and help you to craft the change so that it is successfully accepted into the project.
|
Este proceso nos permite coordinar mejor nuestros esfuerzos, evitar trabajo duplicado y ayudarte a diseñar el cambio para que sea aceptado con éxito en el proyecto.
|
||||||
|
|
||||||
**Note**: Adding a new topic to the documentation, or significantly re-writing a topic, counts as a major feature.
|
**Nota**: Agregar un nuevo tema a la documentación o reescribir significativamente un tema, también cuenta como *cambio significativo*.
|
||||||
|
|
||||||
* **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr).
|
* **Cambios pequeños** pueden ser elaborados y directamente [creados como un _pull request_](#submit-pr).
|
||||||
|
|
||||||
|
|
||||||
## <a name="submit"></a> Submission Guidelines
|
## <a name="submit"></a> Guía para la creación de issues y PRs
|
||||||
|
|
||||||
|
|
||||||
### <a name="submit-issue"></a> Submitting an Issue
|
### <a name="submit-issue"></a> Creación de _issues_
|
||||||
|
|
||||||
Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available.
|
Antes de crear un *issue*, por favor busca en el el *issue tracker*, quizá un *issue* para tu problema ya existe y la discusión puede informarte sobre soluciones alternativas disponibles.
|
||||||
|
|
||||||
We want to fix all the issues as soon as possible, but before fixing a bug we need to reproduce and confirm it.
|
Queremos solucionar todos los problemas lo antes posible, pero antes de corregir un bug necesitamos reproducirlo y confirmarlo.
|
||||||
In order to reproduce bugs, we require that you provide a minimal reproduction.
|
Para reproducir errores, requerimos que proporciones una reproducción mínima.
|
||||||
Having a minimal reproducible scenario gives us a wealth of important information without going back and forth to you with additional questions.
|
Tener un escenario reproducible mínimo nos brinda una gran cantidad de información importante sin tener que ir y venir con preguntas adicionales.
|
||||||
|
|
||||||
A minimal reproduction allows us to quickly confirm a bug (or point out a coding problem) as well as confirm that we are fixing the right problem.
|
Una reproducción mínima nos permite confirmar rápidamente un bug (o señalar un problema de código), así también confirmar que estamos solucionando el problema correcto.
|
||||||
|
|
||||||
We require a minimal reproduction to save maintainers' time and ultimately be able to fix more bugs.
|
Requerimos una reproducción mínima para ahorrar tiempo a los encargados del mantenimiento y en última instancia, poder corregir más bugs.
|
||||||
Often, developers find coding problems themselves while preparing a minimal reproduction.
|
A menudo los desarrolladores encuentran problemas de código mientras preparan una reproducción mínima.
|
||||||
We understand that sometimes it might be hard to extract essential bits of code from a larger codebase but we really need to isolate the problem before we can fix it.
|
Entendemos que a veces puede ser difícil extraer porciones esenciales de código de un código más grande, pero realmente necesitamos aislar el problema antes de poder solucionarlo.
|
||||||
|
|
||||||
Unfortunately, we are not able to investigate / fix bugs without a minimal reproduction, so if we don't hear back from you, we are going to close an issue that doesn't have enough info to be reproduced.
|
Desafortunadamente no podemos investigar/corregir errores sin una reproducción mínima, por lo que si no tenemos tu retroalimentación del bug, vamos a cerrar el *issue* ya que no tiene suficiente información para reproducirse.
|
||||||
|
|
||||||
You can file new issues by selecting from our [new issue templates](https://github.com/angular/angular/issues/new/choose) and filling out the issue template.
|
Puedes presentar nuevos *issues* seleccionando nuestra [plantilla de _issues_](https://github.com/angular/angular/issues/new/choose) y complentando la plantilla.
|
||||||
|
|
||||||
|
|
||||||
### <a name="submit-pr"></a> Submitting a Pull Request (PR)
|
### <a name="submit-pr"></a> Creación de un Pull Requests (PR)
|
||||||
|
|
||||||
Before you submit your Pull Request (PR) consider the following guidelines:
|
Antes de crear tu Pull Request (PR) considera los siguientes lineamientos:
|
||||||
|
|
||||||
1. Search [GitHub](https://github.com/angular/angular/pulls) for an open or closed PR that relates to your submission.
|
1. Busca en [GitHub](https://github.com/angular/angular/pulls) PRs que estén abiertos o cerrados y que estén relacionados con el que vas a crear.
|
||||||
You don't want to duplicate existing efforts.
|
No deseas duplicar los esfuerzos existentes.
|
||||||
|
|
||||||
2. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add.
|
2. Asegúrate de que el PR describa el problema que estás solucionando o que documente el diseño de la funcionalidad que deseas agregar.
|
||||||
Discussing the design upfront helps to ensure that we're ready to accept your work.
|
Discutir el diseño por adelantado ayuda a garantizar que estemos listos para aceptar tu trabajo.
|
||||||
|
|
||||||
3. Please sign our [Contributor License Agreement (CLA)](#cla) before sending PRs.
|
3. Por favor firma nuestro [Acuerdo de Licencia de Colaborador (CLA)](#cla) antes de crear PRs.
|
||||||
We cannot accept code without a signed CLA.
|
No podemos aceptar el código sin el Acuerdo de Licencia de Colaborador (CLA) firmado.
|
||||||
Make sure you author all contributed Git commits with email address associated with your CLA signature.
|
Asegúrate de crear todas las contribuciones de Git con la dirección de correo electrónico asociada con tu firma del Acuerdo de Licencia de Colaborador (CLA).
|
||||||
|
|
||||||
4. Fork the angular/angular repo.
|
4. Haz *fork* del repositorio angular/angular.
|
||||||
|
|
||||||
5. Make your changes in a new git branch:
|
5. Haz tus cambios en una nueva rama de Git:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git checkout -b my-fix-branch master
|
git checkout -b my-fix-branch master
|
||||||
```
|
```
|
||||||
|
|
||||||
6. Create your patch, **including appropriate test cases**.
|
6. Crea tu correción, **incluyendo casos de prueba apropiados**.
|
||||||
|
|
||||||
7. Follow our [Coding Rules](#rules).
|
7. Sigue nuestras [Reglas de código](#rules).
|
||||||
|
|
||||||
8. Run the full Angular test suite, as described in the [developer documentation][dev-doc], and ensure that all tests pass.
|
8. Ejecuta todo el conjunto de pruebas de Angular, tal como está descrito en la [documentación del desarrollador][dev-doc], y asegúrate de que todas las pruebas pasen.
|
||||||
|
|
||||||
9. Commit your changes using a descriptive commit message that follows our [commit message conventions](#commit).
|
9. Crea un commit de tus cambios utilizando un mensaje de commit descriptivo que siga nuestra [convención para el mensaje de los commits](#commit).
|
||||||
Adherence to these conventions is necessary because release notes are automatically generated from these messages.
|
Es necesario cumplir con estas convenciones porque las notas de las versiones se generan automáticamente a partir de estos mensajes.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git commit --all
|
git commit -a
|
||||||
```
|
```
|
||||||
Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
|
Nota: la opción de la línea de comandos de Git `-a` automaticamente hará "add" y "rm" a los archivos editados.
|
||||||
|
|
||||||
10. Push your branch to GitHub:
|
10. Haz push de tu rama a GitHub:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git push origin my-fix-branch
|
git push origin my-fix-branch
|
||||||
```
|
```
|
||||||
|
|
||||||
11. In GitHub, send a pull request to `angular:master`.
|
11. En GitHub, crea un pull request a `angular:master`.
|
||||||
|
|
||||||
|
Si solicitamos cambios a través de revisiones de código, sigue las siguientes indicaciones:
|
||||||
|
|
||||||
|
* Haz los cambios requeridos.
|
||||||
|
* Ejecuta nuevamente el conjunto de pruebas de Angular para asegurar que todas las pruebas aún están pasando.
|
||||||
|
* Haz rebase de tu rama a la rama master y haz push con la opción `-f` a tu repositorio de Github (esto actualizará tu Pull Request):
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git rebase master -i
|
||||||
|
git push -f
|
||||||
|
```
|
||||||
|
|
||||||
|
¡Es todo! ¡Muchas gracias por tu contribución!
|
||||||
|
|
||||||
|
|
||||||
#### Addressing review feedback
|
#### Después del merge de tu pull request
|
||||||
|
|
||||||
If we ask for changes via code reviews then:
|
Después de que se hizo merge de tu pull request, puedes eliminar de forma segura tu rama y hacer pull de los cambios del repositorio principal (upstream):
|
||||||
|
|
||||||
1. Make the required updates to the code.
|
* Elimina la rama remota en GitHub a través de la interfaz de usuario web de GitHub o en tu línea de comandos de la siguiente manera:
|
||||||
|
|
||||||
2. Re-run the Angular test suites to ensure tests are still passing.
|
|
||||||
|
|
||||||
3. Create a fixup commit and push to your GitHub repository (this will update your Pull Request):
|
|
||||||
|
|
||||||
```shell
|
|
||||||
git commit --all --fixup HEAD
|
|
||||||
git push
|
|
||||||
```
|
|
||||||
|
|
||||||
For more info on working with fixup commits see [here](docs/FIXUP_COMMITS.md).
|
|
||||||
|
|
||||||
That's it! Thank you for your contribution!
|
|
||||||
|
|
||||||
|
|
||||||
##### Updating the commit message
|
|
||||||
|
|
||||||
A reviewer might often suggest changes to a commit message (for example, to add more context for a change or adhere to our [commit message guidelines](#commit)).
|
|
||||||
In order to update the commit message of the last commit on your branch:
|
|
||||||
|
|
||||||
1. Check out your branch:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
git checkout my-fix-branch
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Amend the last commit and modify the commit message:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
git commit --amend
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Push to your GitHub repository:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
git push --force-with-lease
|
|
||||||
```
|
|
||||||
|
|
||||||
> NOTE:<br />
|
|
||||||
> If you need to update the commit message of an earlier commit, you can use `git rebase` in interactive mode.
|
|
||||||
> See the [git docs](https://git-scm.com/docs/git-rebase#_interactive_mode) for more details.
|
|
||||||
|
|
||||||
|
|
||||||
#### After your pull request is merged
|
|
||||||
|
|
||||||
After your pull request is merged, you can safely delete your branch and pull the changes from the main (upstream) repository:
|
|
||||||
|
|
||||||
* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:
|
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git push origin --delete my-fix-branch
|
git push origin --delete my-fix-branch
|
||||||
```
|
```
|
||||||
|
|
||||||
* Check out the master branch:
|
* Muévete a la rama master:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git checkout master -f
|
git checkout master -f
|
||||||
```
|
```
|
||||||
|
|
||||||
* Delete the local branch:
|
* Elimina tu rama local:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git branch -D my-fix-branch
|
git branch -D my-fix-branch
|
||||||
```
|
```
|
||||||
|
|
||||||
* Update your master with the latest upstream version:
|
* Actualiza tu rama master con la última versión del fork (upstream):
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git pull --ff upstream master
|
git pull --ff upstream master
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## <a name="rules"></a> Coding Rules
|
## <a name="rules"></a> Reglas del código
|
||||||
To ensure consistency throughout the source code, keep these rules in mind as you are working:
|
Para garantizar la coherencia en todo el código fuente, ten en cuenta estas reglas mientras trabajas:
|
||||||
|
|
||||||
* All features or bug fixes **must be tested** by one or more specs (unit-tests).
|
* Todas las funcionalidades o solución de bugs **deben ser probadas** por una o más pruebas (pruebas unitarias).
|
||||||
* All public API methods **must be documented**.
|
* Todos los métodos públicos del API **deben ser documentados**.
|
||||||
* We follow [Google's JavaScript Style Guide][js-style-guide], but wrap all code at **100 characters**.
|
* Seguimos la [guía de estilo JavaScript de Google][js-style-guide], pero cada línea no debe exceder **100 caracteres**.
|
||||||
|
|
||||||
An automated formatter is available, see [DEVELOPER.md](docs/DEVELOPER.md#clang-format).
|
Un formateador automatizado está disponible, revisar [DEVELOPER.md](docs/DEVELOPER.md#clang-format).
|
||||||
|
|
||||||
|
|
||||||
## <a name="commit"></a> Commit Message Format
|
## <a name="commit"></a> Formato para el mensaje de los commits
|
||||||
|
|
||||||
*This specification is inspired and supersedes the [AngularJS commit message format][commit-message-format].*
|
*Esta especificación está inspirada y reemplaza el [Formato de mensaje de commits de AngularJS][commit-message-format].*
|
||||||
|
|
||||||
We have very precise rules over how our Git commit messages must be formatted.
|
Tenemos reglas muy precisas sobre cómo deben formatearse nuestros mensajes de los commits de Git.
|
||||||
This format leads to **easier to read commit history**.
|
Este formato permite tener **un historial de commits más facil de leer**.
|
||||||
|
|
||||||
Each commit message consists of a **header**, a **body**, and a **footer**.
|
Cada mensaje de un commit consta del **header**, el **body**, y el **footer**.
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
<header>
|
<header>
|
||||||
<BLANK LINE>
|
<LINEA VACIA>
|
||||||
<body>
|
<body>
|
||||||
<BLANK LINE>
|
<LINEA VACIA>
|
||||||
<footer>
|
<footer>
|
||||||
```
|
```
|
||||||
|
|
||||||
The `header` is mandatory and must conform to the [Commit Message Header](#commit-header) format.
|
El `header` es obligatorio y debe ajustarse al formato del [mensaje del header del commit](#commit-header).
|
||||||
|
|
||||||
The `body` is mandatory for all commits except for those of scope "docs".
|
El `body` es obligatorio para todos los commits excepto los que tenga scope "docs".
|
||||||
When the body is required it must be at least 20 characters long.
|
Cuando el body es requerido debe tener al menos 20 caracteres.
|
||||||
|
|
||||||
The `footer` is optional.
|
El `footer` es opcional.
|
||||||
|
|
||||||
Any line of the commit message cannot be longer than 100 characters.
|
Cualquier línea del mensaje del commit no puede tener más de 100 caracteres.
|
||||||
|
|
||||||
|
|
||||||
#### <a href="commit-header"></a>Commit Message Header
|
#### <a href="commit-header"></a>Mensaje del header del commit
|
||||||
|
|
||||||
```
|
```
|
||||||
<type>(<scope>): <short summary>
|
<tipo>(<alcance>): <resumen>
|
||||||
│ │ │
|
│ │ │
|
||||||
│ │ └─⫸ Summary in present tense. Not capitalized. No period at the end.
|
│ │ └─⫸ Resumen corto escrito en modo imperativo, tiempo presente. Sin mayúsculas. Sin punto final.
|
||||||
│ │
|
│ │
|
||||||
│ └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core|
|
│ └─⫸ Alcance del commit: animations|bazel|benchpress|common|compiler|compiler-cli|core|
|
||||||
│ elements|forms|http|language-service|localize|platform-browser|
|
│ elements|forms|http|language-service|localize|platform-browser|
|
||||||
│ platform-browser-dynamic|platform-server|router|service-worker|
|
│ platform-browser-dynamic|platform-server|platform-webworker|
|
||||||
│ upgrade|zone.js|packaging|changelog|dev-infra|docs-infra|migrations|
|
│ platform-webworker-dynamic|router|service-worker|upgrade|zone.js|
|
||||||
│ ngcc|ve
|
│ packaging|changelog|dev-infra|docs-infra|migrations|ngcc|ve
|
||||||
│
|
│
|
||||||
└─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|test
|
└─⫸ Tipo de commit: build|ci|docs|feat|fix|perf|refactor|style|test
|
||||||
```
|
```
|
||||||
|
|
||||||
The `<type>` and `<summary>` fields are mandatory, the `(<scope>)` field is optional.
|
El `<tipo>` y `<resumen>` son obligatorios, el `(<alcance>)` es opcional.
|
||||||
|
|
||||||
|
|
||||||
##### Type
|
##### Tipo
|
||||||
|
|
||||||
Must be one of the following:
|
El tipo debe ser uno de los siguientes:
|
||||||
|
|
||||||
* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
|
* **build**: cambios que afectan el sistema de compilación o dependencias externas (ejemplos de scopes: gulp, broccoli, npm)
|
||||||
* **ci**: Changes to our CI configuration files and scripts (example scopes: Circle, BrowserStack, SauceLabs)
|
* **ci**: cambios en nuestros archivos y scripts de configuración de CI (ejemplos de scopes: Circle, BrowserStack, SauceLabs)
|
||||||
* **docs**: Documentation only changes
|
* **docs**: cambios en la documentación
|
||||||
* **feat**: A new feature
|
* **feat**: una nueva funcionalidad
|
||||||
* **fix**: A bug fix
|
* **fix**: una solución de un bug
|
||||||
* **perf**: A code change that improves performance
|
* **perf**: un cambio de código que mejora el rendimiento.
|
||||||
* **refactor**: A code change that neither fixes a bug nor adds a feature
|
* **refactor**: un cambio de código que no corrige ningún error ni agrega ninguna funcionalidad
|
||||||
* **test**: Adding missing tests or correcting existing tests
|
* **style**: cambios que no afectan el significado del código (espacios en blanco, formato, falta de punto y coma, etc.)
|
||||||
|
* **test**: se agregan pruebas faltantes o se corrigen pruebas existentes
|
||||||
|
|
||||||
|
|
||||||
##### Scope
|
##### Alcance
|
||||||
The scope should be the name of the npm package affected (as perceived by the person reading the changelog generated from commit messages).
|
El alcance debe ser el nombre del paquete npm afectado (tal como lo percibe la persona que lee el registro de cambios generado a partir de los mensajes de commit).
|
||||||
|
|
||||||
The following is the list of supported scopes:
|
La siguiente es la lista de alcances permitidos:
|
||||||
|
|
||||||
* `animations`
|
* `animations`
|
||||||
* `bazel`
|
* `bazel`
|
||||||
@ -288,85 +254,80 @@ The following is the list of supported scopes:
|
|||||||
* `platform-browser`
|
* `platform-browser`
|
||||||
* `platform-browser-dynamic`
|
* `platform-browser-dynamic`
|
||||||
* `platform-server`
|
* `platform-server`
|
||||||
|
* `platform-webworker`
|
||||||
|
* `platform-webworker-dynamic`
|
||||||
* `router`
|
* `router`
|
||||||
* `service-worker`
|
* `service-worker`
|
||||||
* `upgrade`
|
* `upgrade`
|
||||||
* `zone.js`
|
* `zone.js`
|
||||||
|
|
||||||
There are currently a few exceptions to the "use package name" rule:
|
Actualmente hay algunas excepciones a la regla "usar el nombre de paquete":
|
||||||
|
|
||||||
* `packaging`: used for changes that change the npm package layout in all of our packages, e.g. public path changes, package.json changes done to all packages, d.ts file/format changes, changes to bundles, etc.
|
* `packaging`: usado para cambios que cambian el diseño de los paquetes de npm en todos nuestros paquetes. Ejemplos: cambios de la ruta públic, package.json cambios hechos a todos los paquetes, cambios a archivos o formatos d.ts, cambios a bundles, etc.
|
||||||
|
|
||||||
* `changelog`: used for updating the release notes in CHANGELOG.md
|
* `changelog`: utilizado para actualizar las notas de la versión en CHANGELOG.md
|
||||||
|
|
||||||
* `dev-infra`: used for dev-infra related changes within the directories /scripts, /tools and /dev-infra
|
* `dev-infra`: utilizado para cambios relacionados con dev-infra dentro de los directorios /scripts, /tools y /dev-infra
|
||||||
|
|
||||||
* `docs-infra`: used for docs-app (angular.io) related changes within the /aio directory of the repo
|
* `docs-infra`: utilizado para cambios relacionados con la documentación (angular.io) dentro del directorio /aio del repositorio
|
||||||
|
|
||||||
* `migrations`: used for changes to the `ng update` migrations.
|
* `migrations`: utilizado para los cambios en las migraciones `ng update`.
|
||||||
|
|
||||||
* `ngcc`: used for changes to the [Angular Compatibility Compiler](./packages/compiler-cli/ngcc/README.md)
|
* `ngcc`: usado para los cambios del [Compilador de compatibilidad de Angular](./packages/compiler-cli/ngcc/README.md)
|
||||||
|
|
||||||
* `ve`: used for changes specific to ViewEngine (legacy compiler/renderer).
|
* `ve`: utilizado para cambios específicos de ViewEngine (legacy compiler/renderer).
|
||||||
|
|
||||||
* none/empty string: useful for `test` and `refactor` changes that are done across all packages (e.g. `test: add missing unit tests`) and for docs changes that are not related to a specific package (e.g. `docs: fix typo in tutorial`).
|
* alcance vacío: útil para cambios de `style`, `test` y `refactor` que se realizan en todos los paquetes (ejemplo: `style: add missing semicolons`) y para cambios de la documentación que no están relacionados a un paquete en específico(ejemplo: `docs: corrige error gramatical en el tutorial`).
|
||||||
|
|
||||||
|
|
||||||
##### Summary
|
##### Resumen
|
||||||
|
|
||||||
Use the summary field to provide a succinct description of the change:
|
Usa el campo resumen para proporcionar una descripción breve del cambio:
|
||||||
|
|
||||||
* use the imperative, present tense: "change" not "changed" nor "changes"
|
* usa el modo imperativo, tiempo presente: "cambia" no "cambió" o "cambios"
|
||||||
* don't capitalize the first letter
|
* no debe de contener ninguna letra mayúscula
|
||||||
* no dot (.) at the end
|
* no debe de conter punto (.) al final
|
||||||
|
|
||||||
|
|
||||||
#### Commit Message Body
|
#### Mensaje del cuerpo del commit
|
||||||
|
|
||||||
Just as in the summary, use the imperative, present tense: "fix" not "fixed" nor "fixes".
|
Tal como en el resumen, usa el modo imperativo, tiempo presente: "cambia" no "cambió" o "cambios".
|
||||||
|
|
||||||
Explain the motivation for the change in the commit message body. This commit message should explain _why_ you are making the change.
|
Explica la razón del cambio en el el mensaje del cuerpo del commit. Este mensaje de confirmación debe explicar _por qué_ está realizando el cambio.
|
||||||
You can include a comparison of the previous behavior with the new behavior in order to illustrate the impact of the change.
|
Puedes incluir una comparación del comportamiento anterior con el nuevo comportamiento para ilustrar el impacto del cambio.
|
||||||
|
|
||||||
|
|
||||||
#### Commit Message Footer
|
#### Mensaje del footer del commit
|
||||||
|
|
||||||
The footer can contain information about breaking changes and is also the place to reference GitHub issues, Jira tickets, and other PRs that this commit closes or is related to.
|
El footer puede contener información sobre cambios significativos y también es el lugar para hacer referencia a issues de GitHub, tickets de Jira y otros PRs que están relacionados con el commit.
|
||||||
|
|
||||||
```
|
```
|
||||||
BREAKING CHANGE: <breaking change summary>
|
CAMBIO SIGNIFICATIVO: <resumen del cambio significativo>
|
||||||
<BLANK LINE>
|
<LINEA VACIA>
|
||||||
<breaking change description + migration instructions>
|
<descripción del cambio significativo + instrucciones para la migración>
|
||||||
<BLANK LINE>
|
<LINEA VACIA>
|
||||||
<BLANK LINE>
|
<LINEA VACIA>
|
||||||
Fixes #<issue number>
|
Fix #<issue número>
|
||||||
```
|
```
|
||||||
|
|
||||||
Breaking Change section should start with the phrase "BREAKING CHANGE: " followed by a summary of the breaking change, a blank line, and a detailed description of the breaking change that also includes migration instructions.
|
La sección de cambios significativos debería comenzar con la frase "CAMBIO SIGNIFICATIVO: " seguido de un resumen del cambio significativo, una línea en blanco y una descripción detallada del cambio significativo que también incluya instrucciones de migración.
|
||||||
|
|
||||||
|
|
||||||
### Revert commits
|
### Revirtiendo commits
|
||||||
|
|
||||||
If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit.
|
Si el commit revierte un commit previo, el commit debería comenzar con `revert: `, seguido por el header del commit revertido.
|
||||||
|
|
||||||
The content of the commit message body should contain:
|
El contenido del mensaje del commit debería contener:
|
||||||
|
|
||||||
- information about the SHA of the commit being reverted in the following format: `This reverts commit <SHA>`,
|
- Información sobre el SHA del commit que se revierte en el siguiente formato: `Esto revierte el commit <SHA>`,
|
||||||
- a clear description of the reason for reverting the commit message.
|
- Una descripción clara de la razón para revertir el mensaje del _commit_.
|
||||||
|
|
||||||
|
|
||||||
## <a name="cla"></a> Signing the CLA
|
## <a name="cla"></a> Firma del Acuerdo de Licencia de Colaborador (CLA)
|
||||||
|
|
||||||
Please sign our Contributor License Agreement (CLA) before sending pull requests. For any code
|
Por favor firma nuestro Acuerdo de Licencia de Colaborador (CLA) cuando creas tu primer pull request. Para que cualquier cambio de código sea aceptado, el Acuerdo de Licencia de Colaborador (CLA) debe ser firmado. Es un proceso rápido con nuestro CLA assistant que está integrado con nuestro CI.
|
||||||
changes to be accepted, the CLA must be signed. It's a quick process, we promise!
|
|
||||||
|
|
||||||
* For individuals, we have a [simple click-through form][individual-cla].
|
Los siguientes documentos pueden ayudarte a resolver problemas con cuentas de GitHub y múltiples direcciones de correo electrónico:
|
||||||
* For corporations, we'll need you to
|
|
||||||
[print, sign and one of scan+email, fax or mail the form][corporate-cla].
|
|
||||||
|
|
||||||
If you have more than one GitHub accounts, or multiple email addresses associated with a single GitHub account, you must sign the CLA using the primary email address of the GitHub account used to author Git commits and send pull requests.
|
|
||||||
|
|
||||||
The following documents can help you sort out issues with GitHub accounts and multiple email addresses:
|
|
||||||
|
|
||||||
* https://help.github.com/articles/setting-your-commit-email-address-in-git/
|
* https://help.github.com/articles/setting-your-commit-email-address-in-git/
|
||||||
* https://stackoverflow.com/questions/37245303/what-does-usera-committed-with-userb-13-days-ago-on-github-mean
|
* https://stackoverflow.com/questions/37245303/what-does-usera-committed-with-userb-13-days-ago-on-github-mean
|
||||||
@ -382,7 +343,7 @@ The following documents can help you sort out issues with GitHub accounts and mu
|
|||||||
[corporate-cla]: http://code.google.com/legal/corporate-cla-v1.0.html
|
[corporate-cla]: http://code.google.com/legal/corporate-cla-v1.0.html
|
||||||
[dev-doc]: https://github.com/angular/angular/blob/master/docs/DEVELOPER.md
|
[dev-doc]: https://github.com/angular/angular/blob/master/docs/DEVELOPER.md
|
||||||
[github]: https://github.com/angular/angular
|
[github]: https://github.com/angular/angular
|
||||||
[discord]: https://discord.gg/angular
|
[gitter]: https://gitter.im/angular/angular
|
||||||
[individual-cla]: http://code.google.com/legal/individual-cla-v1.0.html
|
[individual-cla]: http://code.google.com/legal/individual-cla-v1.0.html
|
||||||
[js-style-guide]: https://google.github.io/styleguide/jsguide.html
|
[js-style-guide]: https://google.github.io/styleguide/jsguide.html
|
||||||
[jsfiddle]: http://jsfiddle.net
|
[jsfiddle]: http://jsfiddle.net
|
||||||
|
26
README.en.md
Normal file
26
README.en.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
[](https://circleci.com/gh/angular/workflows/angular/tree/master)
|
||||||
|
[](https://gitter.im/angular/angular?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
[](https://www.npmjs.com/@angular/core)
|
||||||
|
|
||||||
|
|
||||||
|
# Angular
|
||||||
|
|
||||||
|
Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages.
|
||||||
|
|
||||||
|
## Quickstart
|
||||||
|
|
||||||
|
[Get started in 5 minutes][quickstart].
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
[Learn about the latest improvements][changelog].
|
||||||
|
|
||||||
|
## Want to help?
|
||||||
|
|
||||||
|
Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our
|
||||||
|
guidelines for [contributing][contributing] and then check out one of our issues in the [hotlist: community-help](https://github.com/angular/angular/labels/hotlist%3A%20community-help).
|
||||||
|
|
||||||
|
[contributing]: https://github.com/angular/angular/blob/master/CONTRIBUTING.md
|
||||||
|
[quickstart]: https://angular.io/start
|
||||||
|
[changelog]: https://github.com/angular/angular/blob/master/CHANGELOG.md
|
||||||
|
[ng]: https://angular.io
|
156
README.md
156
README.md
@ -1,151 +1,25 @@
|
|||||||
<h1 align="center">Angular - One framework. Mobile & desktop.</h1>
|
# Angular en español
|
||||||
|
|
||||||
<p align="center">
|
Angular es una plataforma de desarrollo para construir aplicaciones web y móviles que usa
|
||||||
<img src="aio/src/assets/images/logos/angular/angular.png" alt="angular-logo" width="120px" height="120px"/>
|
TypeScript/JavaScript y otros lenguajes de programación.
|
||||||
<br>
|
|
||||||
<i>Angular is a development platform for building mobile and desktop web applications
|
|
||||||
<br> using Typescript/JavaScript and other languages.</i>
|
|
||||||
<br>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
## ¿Quieres ayudar?
|
||||||
<a href="https://www.angular.io"><strong>www.angular.io</strong></a>
|
|
||||||
<br>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
### Documentación en español
|
||||||
<a href="CONTRIBUTING.md">Contributing Guidelines</a>
|
|
||||||
·
|
|
||||||
<a href="https://github.com/angular/angular/issues">Submit an Issue</a>
|
|
||||||
·
|
|
||||||
<a href="https://blog.angular.io/">Blog</a>
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
¿Quieres mejorar la documentación? ¡Excelente! Lee nuestras pautas para
|
||||||
<a href="https://circleci.com/gh/angular/workflows/angular/tree/master">
|
[colaborar](CONTRIBUTING.md) y luego revisa algunos de nuestras
|
||||||
<img src="https://img.shields.io/circleci/build/github/angular/angular/master.svg?logo=circleci&logoColor=fff&label=CircleCI" alt="CI status" />
|
[issues](https://github.com/angular-hispano/angular/issues).
|
||||||
</a>
|
|
||||||
<a href="https://www.npmjs.com/@angular/core">
|
|
||||||
<img src="https://img.shields.io/npm/v/@angular/core.svg?logo=npm&logoColor=fff&label=NPM+package&color=limegreen" alt="Angular on npm" />
|
|
||||||
</a>
|
|
||||||
<a href="https://discord.gg/angular">
|
|
||||||
<img src="https://img.shields.io/discord/463752820026376202.svg?logo=discord&logoColor=fff&label=Discord&color=7389d8" alt="Discord conversation" />
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<hr>
|
### El framework
|
||||||
|
|
||||||
## Documentation
|
La colaboración para corregir errores y agregar funciones en el framework debe realizarse en inglés a través
|
||||||
|
del repositorio [angular/angular](https://github.com/angular/angular) upstream.
|
||||||
|
|
||||||
Get started with Angular, learn the fundamentals and explore advanced topics on our documentation website.
|
## Guía rápida
|
||||||
|
|
||||||
- [Getting Started][quickstart]
|
[Comienza a usarlo en 5 minutos](https://docs.angular.lat/start).
|
||||||
- [Architecture][architecture]
|
|
||||||
- [Components and Templates][componentstemplates]
|
|
||||||
- [Forms][forms]
|
|
||||||
- [API][api]
|
|
||||||
|
|
||||||
### Advanced
|
## Registro de cambios (Changelog)
|
||||||
|
|
||||||
- [Angular Elements][angularelements]
|
[Últimas mejoras realizadas](CHANGELOG.md).
|
||||||
- [Server Side Rendering][ssr]
|
|
||||||
- [Schematics][schematics]
|
|
||||||
- [Lazy Loading][lazyloading]
|
|
||||||
|
|
||||||
## Development Setup
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
- Install [Node.js] which includes [Node Package Manager][npm]
|
|
||||||
|
|
||||||
### Setting Up a Project
|
|
||||||
|
|
||||||
Intall the Angular CLI globally:
|
|
||||||
|
|
||||||
```
|
|
||||||
npm install -g @angular/cli
|
|
||||||
```
|
|
||||||
|
|
||||||
Create workspace:
|
|
||||||
|
|
||||||
```
|
|
||||||
ng new [PROJECT NAME]
|
|
||||||
```
|
|
||||||
|
|
||||||
Run the application:
|
|
||||||
|
|
||||||
```
|
|
||||||
cd [PROJECT NAME]
|
|
||||||
ng serve
|
|
||||||
```
|
|
||||||
|
|
||||||
## Quickstart
|
|
||||||
|
|
||||||
[Get started in 5 minutes][quickstart].
|
|
||||||
|
|
||||||
## Ecosystem
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<img src="/docs/images/angular-ecosystem-logos.png" alt="angular ecosystem logos" width="500px" height="auto">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
- [Angular Command Line (CLI)][cli]
|
|
||||||
- [Angular Material][angularmaterial]
|
|
||||||
|
|
||||||
## Changelog
|
|
||||||
|
|
||||||
[Learn about the latest improvements][changelog].
|
|
||||||
|
|
||||||
## Upgrading
|
|
||||||
|
|
||||||
Check out our [upgrade guide](https://update.angular.io/) to find out the best way to upgrade your project.
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
### Contributing Guidelines
|
|
||||||
|
|
||||||
Read through our [contributing guidelines][contributing] to learn about our submission process, coding rules and more.
|
|
||||||
|
|
||||||
### Want to Help?
|
|
||||||
|
|
||||||
Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our guidelines for [contributing][contributing] and then check out one of our issues in the [hotlist: community-help](https://github.com/angular/angular/labels/hotlist%3A%20community-help).
|
|
||||||
|
|
||||||
### Code of Conduct
|
|
||||||
|
|
||||||
Help us keep Angular open and inclusive. Please read and follow our [Code of Conduct][codeofconduct].
|
|
||||||
|
|
||||||
## Community
|
|
||||||
|
|
||||||
Join the conversation and help the community.
|
|
||||||
|
|
||||||
- [Twitter][twitter]
|
|
||||||
- [Gitter][gitter]
|
|
||||||
- Find a Local [Meetup][meetup]
|
|
||||||
|
|
||||||
[](https://www.github.com/angular/angular)
|
|
||||||
|
|
||||||
**Love Angular? Give our repo a star :star: :arrow_up:.**
|
|
||||||
|
|
||||||
[contributing]: CONTRIBUTING.md
|
|
||||||
[quickstart]: https://angular.io/start
|
|
||||||
[changelog]: CHANGELOG.md
|
|
||||||
[ng]: https://angular.io
|
|
||||||
[documentation]: https://angular.io/docs
|
|
||||||
[angularmaterial]: https://material.angular.io/
|
|
||||||
[cli]: https://cli.angular.io/
|
|
||||||
[architecture]: https://angular.io/guide/architecture
|
|
||||||
[componentstemplates]: https://angular.io/guide/displaying-data
|
|
||||||
[forms]: https://angular.io/guide/forms-overview
|
|
||||||
[api]: https://angular.io/api
|
|
||||||
[angularelements]: https://angular.io/guide/elements
|
|
||||||
[ssr]: https://angular.io/guide/universal
|
|
||||||
[schematics]: https://angular.io/guide/schematics
|
|
||||||
[lazyloading]: https://angular.io/guide/lazy-loading-ngmodules
|
|
||||||
[node.js]: https://nodejs.org/
|
|
||||||
[npm]: https://www.npmjs.com/get-npm
|
|
||||||
[codeofconduct]: CODE_OF_CONDUCT.md
|
|
||||||
[twitter]: https://www.twitter.com/angular
|
|
||||||
[gitter]: https://gitter.im/angular/angular
|
|
||||||
[meetup]: https://www.meetup.com/find/?keywords=angular"
|
|
||||||
|
24
WORKSPACE
24
WORKSPACE
@ -8,8 +8,8 @@ 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",
|
||||||
sha256 = "4952ef879704ab4ad6729a29007e7094aef213ea79e9f2e94cbe1c9a753e63ef",
|
sha256 = "84abf7ac4234a70924628baa9a73a5a5cbad944c4358cf9abdb4aab29c9a5b77",
|
||||||
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/2.2.0/rules_nodejs-2.2.0.tar.gz"],
|
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/1.7.0/rules_nodejs-1.7.0.tar.gz"],
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check the rules_nodejs version and download npm dependencies
|
# Check the rules_nodejs version and download npm dependencies
|
||||||
@ -17,7 +17,7 @@ http_archive(
|
|||||||
# assert on that.
|
# assert on that.
|
||||||
load("@build_bazel_rules_nodejs//:index.bzl", "check_rules_nodejs_version", "node_repositories", "yarn_install")
|
load("@build_bazel_rules_nodejs//:index.bzl", "check_rules_nodejs_version", "node_repositories", "yarn_install")
|
||||||
|
|
||||||
check_rules_nodejs_version(minimum_version_string = "2.2.0")
|
check_rules_nodejs_version(minimum_version_string = "1.7.0")
|
||||||
|
|
||||||
# Setup the Node.js toolchain
|
# Setup the Node.js toolchain
|
||||||
node_repositories(
|
node_repositories(
|
||||||
@ -39,18 +39,23 @@ yarn_install(
|
|||||||
yarn_lock = "//:yarn.lock",
|
yarn_lock = "//:yarn.lock",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Install all bazel dependencies of the @npm npm packages
|
||||||
|
load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies")
|
||||||
|
|
||||||
|
install_bazel_dependencies()
|
||||||
|
|
||||||
# Load angular dependencies
|
# Load angular dependencies
|
||||||
load("//packages/bazel:package.bzl", "rules_angular_dev_dependencies")
|
load("//packages/bazel:package.bzl", "rules_angular_dev_dependencies")
|
||||||
|
|
||||||
rules_angular_dev_dependencies()
|
rules_angular_dev_dependencies()
|
||||||
|
|
||||||
# Load protractor dependencies
|
# Load protractor dependencies
|
||||||
load("@npm//@bazel/protractor:package.bzl", "npm_bazel_protractor_dependencies")
|
load("@npm_bazel_protractor//:package.bzl", "npm_bazel_protractor_dependencies")
|
||||||
|
|
||||||
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", "npm_bazel_karma_dependencies")
|
||||||
|
|
||||||
npm_bazel_karma_dependencies()
|
npm_bazel_karma_dependencies()
|
||||||
|
|
||||||
@ -63,6 +68,11 @@ load("//dev-infra/browsers:browser_repositories.bzl", "browser_repositories")
|
|||||||
|
|
||||||
browser_repositories()
|
browser_repositories()
|
||||||
|
|
||||||
|
# Setup the rules_typescript tooolchain
|
||||||
|
load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace")
|
||||||
|
|
||||||
|
ts_setup_workspace()
|
||||||
|
|
||||||
# Setup the rules_sass toolchain
|
# Setup the rules_sass toolchain
|
||||||
load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories")
|
load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories")
|
||||||
|
|
||||||
@ -81,8 +91,8 @@ rbe_autoconfig(
|
|||||||
# Need to specify a base container digest in order to ensure that we can use the checked-in
|
# Need to specify a base container digest in order to ensure that we can use the checked-in
|
||||||
# platform configurations for the "ubuntu16_04" image. Otherwise the autoconfig rule would
|
# platform configurations for the "ubuntu16_04" image. Otherwise the autoconfig rule would
|
||||||
# need to pull the image and run it in order determine the toolchain configuration. See:
|
# need to pull the image and run it in order determine the toolchain configuration. See:
|
||||||
# https://github.com/bazelbuild/bazel-toolchains/blob/3.5.1/configs/ubuntu16_04_clang/versions.bzl
|
# https://github.com/bazelbuild/bazel-toolchains/blob/3.2.0/configs/ubuntu16_04_clang/versions.bzl
|
||||||
base_container_digest = "sha256:f6568d8168b14aafd1b707019927a63c2d37113a03bcee188218f99bd0327ea1",
|
base_container_digest = "sha256:5e750dd878df9fcf4e185c6f52b9826090f6e532b097f286913a428290622332",
|
||||||
# Note that if you change the `digest`, you might also need to update the
|
# Note that if you change the `digest`, you might also need to update the
|
||||||
# `base_container_digest` to make sure marketplace.gcr.io/google/rbe-ubuntu16-04-webtest:<digest>
|
# `base_container_digest` to make sure marketplace.gcr.io/google/rbe-ubuntu16-04-webtest:<digest>
|
||||||
# and marketplace.gcr.io/google/rbe-ubuntu16-04:<base_container_digest> have
|
# and marketplace.gcr.io/google/rbe-ubuntu16-04:<base_container_digest> have
|
||||||
|
169
aio/README.md
169
aio/README.md
@ -1,142 +1,131 @@
|
|||||||
# Angular documentation project (https://angular.io)
|
# Proyecto de documentación Angular (https://docs.angular.lat)
|
||||||
|
|
||||||
Everything in this folder is part of the documentation project. This includes
|
Todo en esta carpeta es parte del proyecto de documentación. Esto incluye:
|
||||||
|
|
||||||
* the web site for displaying the documentation
|
* El sitio web para mostrar la documentación
|
||||||
* the dgeni configuration for converting source files to rendered files that can be viewed in the web site.
|
* La configuración de dgeni para convertir los archivos de origen a archivos renderizados que se pueden vizualizar en el sitio web.
|
||||||
* the tooling for setting up examples for development; and generating live-example and zip files from the examples.
|
* Las herramientas para establecer ejemplos para el desarrollo; y generar archivos en tiempo real y archivos zip desde los ejemplos.
|
||||||
|
|
||||||
<a name="developer-tasks"></a>
|
## Tareas de desarrollador
|
||||||
## Developer tasks
|
|
||||||
|
|
||||||
We use [Yarn](https://yarnpkg.com) to manage the dependencies and to run build tasks.
|
Nosotros usamos [Yarn](https://yarnpkg.com) para gestionar las dependencias y crear tareas de compilación.
|
||||||
You should run all these tasks from the `angular/aio` folder.
|
Debes ejecutar todas estas tareas desde la carpeta `angular/aio`.
|
||||||
Here are the most important tasks you might need to use:
|
Aquí están las tareas más importantes que podrías necesitar usar:
|
||||||
|
|
||||||
* `yarn` - install all the dependencies.
|
* `yarn` - instalar todas las dependencias.
|
||||||
* `yarn setup` - install all the dependencies, boilerplate, stackblitz, zips and run dgeni on the docs.
|
* `yarn setup` - instalar todas las dependencias, boilerplate, stackblitz, zips y ejecuta dgeni en los documentos.
|
||||||
* `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` - igual que `setup`, pero crea los paquetes de Angular a partir del código y usa estas versiones construidas localmente (en lugar de las recuperadas desde npm) para aio y ejemplos de documentos boilerplate.
|
||||||
|
|
||||||
* `yarn build` - create a production build of the application (after installing dependencies, boilerplate, etc).
|
* `yarn build` - crear una compilación de producción de la aplicación (después de instalar dependencias, boilerplate, etc).
|
||||||
* `yarn build-local` - same as `build`, but use `setup-local` instead of `setup`.
|
* `yarn build-local` - igual que `build`, pero usa `setup-local` en lugar de `setup`.
|
||||||
* `yarn build-local-with-viewengine` - same as `build-local`, but in addition also turns on `ViewEngine` (pre-Ivy) mode in aio.
|
* `yarn build-local-with-viewengine` - igual que `build-local`, pero además también enciende el modo `ViewEngine` (pre-Ivy) en aio.
|
||||||
(Note: To turn on `ViewEngine` mode in docs examples, see `yarn boilerplate:add:viewengine` below.)
|
(Nota: Encender el modo `ViewEngine` en ejemplos de documentos, ver `yarn boilerplate:add:viewengine` abajo.)
|
||||||
|
|
||||||
* `yarn start` - run a development web server that watches the files; then builds the doc-viewer and reloads the page, as necessary.
|
* `yarn start` - ejecutar un servidor web de desarrollo que observa los archivos; luego crea el doc-viewer y vuelve a cargar la página, según sea necesario.
|
||||||
* `yarn serve-and-sync` - run both the `docs-watch` and `start` in the same console.
|
* `yarn serve-and-sync` - ejecutar ambos, el `docs-watch` y `start` en la misma consola.
|
||||||
* `yarn lint` - check that the doc-viewer code follows our style rules.
|
* `yarn lint` - comprobar que el código del doc-viewer sigue nuestras reglas de estilo.
|
||||||
* `yarn test` - watch all the source files, for the doc-viewer, and run all the unit tests when any change.
|
* `yarn test` - observar todos los archivos de origen, para el doc-viewer, y ejecuta todas las pruebas unitarias cuando haya algún cambio.
|
||||||
* `yarn test --watch=false` - run all the unit tests once.
|
* `yarn test --watch=false` -ejecutar todas las pruebas unitarias una sola vez.
|
||||||
* `yarn e2e` - run all the e2e tests for the doc-viewer.
|
* `yarn e2e` - ejecutar todas las pruebas de e2e para el doc-viewer.
|
||||||
|
|
||||||
* `yarn docs` - generate all the docs from the source files.
|
* `yarn docs` - generar toda la documentación desde los archivos fuente.
|
||||||
* `yarn docs-watch` - watch the Angular source and the docs files and run a short-circuited doc-gen for the docs that changed.
|
* `yarn docs-watch` - observar el código Angular, los archivos de documentación y ejecutar un 'doc-gen' en corto circuito para los documentos que fueron cambiados.
|
||||||
* `yarn docs-lint` - check that the doc gen code follows our style rules.
|
* `yarn docs-lint` - comprobar que el código del documento generado sigue nuestras reglas de estilo.
|
||||||
* `yarn docs-test` - run the unit tests for the doc generation code.
|
* `yarn docs-test` - ejecutar las pruebas unitarias para el código de generación de doc.
|
||||||
|
|
||||||
* `yarn boilerplate:add` - generate all the boilerplate code for the examples, so that they can be run locally.
|
* `yarn boilerplate:add` - generar todo el código boilerplate para los ejemplos, para que puedan ejecutarse localmente.
|
||||||
* `yarn boilerplate:add:viewengine` - same as `boilerplate:add` but also turns on `ViewEngine` (pre-Ivy) mode.
|
* `yarn boilerplate:add:viewengine` - igual que `boilerplate:add` pero también enciende el modo `ViewEngine` (pre-Ivy).
|
||||||
* `yarn boilerplate:remove` - remove all the boilerplate code that was added via `yarn boilerplate:add`.
|
|
||||||
* `yarn create-example` - create a new example directory containing initial source files.
|
|
||||||
|
|
||||||
* `yarn generate-stackblitz` - generate the stackblitz files that are used by the `live-example` tags in the docs.
|
* `yarn boilerplate:remove` - eliminar todo el código boilerplate que fue añadido a través`yarn boilerplate:add`.
|
||||||
* `yarn generate-zips` - generate the zip files from the examples. Zip available via the `live-example` tags in the docs.
|
* `yarn generate-stackblitz` - generar los archivos stackblitz que están usados por la etiqueta `live-example` en documentos.
|
||||||
|
* `yarn generate-zips` - generar los archivos zip desde los ejemplos. Zip está disponible a través de la etiqueta `live-example` en los documentos.
|
||||||
|
|
||||||
* `yarn example-e2e` - run all e2e tests for examples. Available options:
|
* `yarn example-e2e` - ejecutar todas las pruebas e2e para ejemplos. Opciones disponibles:
|
||||||
- `--setup`: generate boilerplate, force webdriver update & other setup, then run tests.
|
- `--setup`: generar boilerplate, forzar la actualización del controlador web y otras configuraciones, luego ejecutar las pruebas.
|
||||||
- `--local`: run e2e tests with the local version of Angular contained in the "dist" folder.
|
- `--local`: ejecutar pruebas e2e con la versión local de Angular contenida en la carpeta "dist".
|
||||||
_Requires `--setup` in order to take effect._
|
_Requiere `--setup` para que surta efecto._
|
||||||
- `--viewengine`: run e2e tests in `ViewEngine` (pre-Ivy) mode.
|
- `--viewengine`: ejecutar pruebas e2e en modo `ViewEngine` (pre-Ivy).
|
||||||
- `--filter=foo`: limit e2e tests to those containing the word "foo".
|
- `--filter=foo`: limitar pruebas e2e a las que contienen la palabra "foo".
|
||||||
|
|
||||||
> **Note for Windows users**
|
> **Nota para usuarios Windows**
|
||||||
>
|
>
|
||||||
> 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.
|
> Configurar los ejemplos implica crear algunos [enlaces simbólicos](https://es.wikipedia.org/wiki/Enlace_simb%C3%B3lico) (ver [Aquí](./tools/examples/README.md#symlinked-node_modules) para más detalles). En Windows, esto requiere tener [Habilitado el Modo de desarrollador ](https://blogs.windows.com/windowsdeveloper/2016/12/02/symlinks-windows-10) (compatible con Windows 10 o más reciente) o ejecutar los comandos de configuración cómo administrador.
|
||||||
>
|
>
|
||||||
> The affected commands are:
|
> Los comandos afectados son:
|
||||||
> - `yarn setup` / `yarn setup-*`
|
> - `yarn setup` / `yarn setup-*`
|
||||||
> - `yarn build` / `yarn build-*`
|
> - `yarn build` / `yarn build-*`
|
||||||
> - `yarn boilerplate:add`
|
> - `yarn boilerplate:add`
|
||||||
> - `yarn example-e2e --setup`
|
> - `yarn example-e2e --setup`
|
||||||
|
|
||||||
## Using ServiceWorker locally
|
## Usando ServiceWorker localmente
|
||||||
|
|
||||||
Running `yarn start` (even when explicitly targeting production mode) does not set up the
|
Ejecutando `yarn start` (incluso cuando se apunta explícitamente al modo de producción) no configura el
|
||||||
ServiceWorker. If you want to test the ServiceWorker locally, you can use `yarn build` and then
|
ServiceWorker. Si quieres probar el ServiceWorker localmente, puedes usar `yarn build` y luego
|
||||||
serve the files in `dist/` with `yarn http-server dist -p 4200`.
|
ejecutar los archivos en `dist/` con `yarn http-server dist -p 4200`.
|
||||||
|
|
||||||
|
|
||||||
## Guide to authoring
|
## Guía de autoría
|
||||||
|
Existen dos tipos de contenido en la documentación:
|
||||||
|
|
||||||
There are two types of content in the documentation:
|
* **Documentación de API**: descripciones de los módulos, clases, interfaces, decoradores, etc que son parte de la plataforma Angular.
|
||||||
|
La documentacion de API está generada directamente desde el código fuente.
|
||||||
|
El código fuente está contenido en archivos TypeScript , almacenados en la carpeta `angular/packages`.
|
||||||
|
Cada elemento de la API puede tener un comentario anterior, el cual contiene etiquetas y contenido de estilos JSDoc.
|
||||||
|
El contenido está escrito en markdown.
|
||||||
|
|
||||||
* **API docs**: descriptions of the modules, classes, interfaces, decorators, etc that make up the Angular platform.
|
* **Otro contenido**: guias, tutoriales, y otro material de marketing.
|
||||||
API docs are generated directly from the source code.
|
Todos los demás contenidos se escriben utilizando markdown en archivos de texto, ubicados en la carpeta `angular/aio/content`.
|
||||||
The source code is contained in TypeScript files, located in the `angular/packages` folder.
|
Más específicamente, hay subcarpetas que contienen tipos particulares de contenido: guías, tutoriales y marketing.
|
||||||
Each API item may have a preceding comment, which contains JSDoc style tags and content.
|
|
||||||
The content is written in markdown.
|
|
||||||
|
|
||||||
* **Other content**: guides, tutorials, and other marketing material.
|
* **Ejempos de código**: los ejemplos de código deben ser comprobables para garantizar su precisión.
|
||||||
All other content is written using markdown in text files, located in the `angular/aio/content` folder.
|
Además, nuestros ejemplos tienen un aspecto específico y permiten al usuario copiar el código fuente. Para mayor
|
||||||
More specifically, there are sub-folders that contain particular types of content: guides, tutorial and marketing.
|
ejemplos se representan en una interfaz con pestañas (e.g. template, HTML, y TypeScript en pestañas separadas). Adicionalmente, algunos son ejemplos en acción, que proporcionan enlaces donde se puede editar el código, ejecutar, y/o descargar. Para obtener más detalles sobre cómo trabajar con ejemplos de código, lea los [fragmentos de código](https://docs.angular.lat/guide/docs-style-guide#code-snippets), [código fuente de marcado ](https://docs.angular.lat/guide/docs-style-guide#source-code-markup), y [ ejemplos en acción ](https://docs.angular.lat/guide/docs-style-guide#live-examples) paginas de los [ autores de guías de estilo ](https://docs.angular.lat/guide/docs-style-guide).
|
||||||
|
|
||||||
* **Code examples**: code examples need to be testable to ensure their accuracy.
|
Usamos la herramienta [dgeni](https://github.com/angular/dgeni) para convertir estos archivos en docs que se pueden ver en el doc-viewer.
|
||||||
Also, our examples have a specific look and feel and allow the user to copy the source code. For larger
|
Las [guías de estilo para Autores](https://docs.angular.lat/guide/docs-style-guide) prescriben pautas para
|
||||||
examples they are rendered in a tabbed interface (e.g. template, HTML, and TypeScript on separate
|
escribir páginas de guía, explica cómo usar la documentación de clases y componentes, y cómo marcar el código fuente para producir fragmentos de código.
|
||||||
tabs). Additionally, some are live examples, which provide links where the code can be edited, executed, and/or downloaded. For details on working with code examples, please read the [Code snippets](https://angular.io/guide/docs-style-guide#code-snippets), [Source code markup](https://angular.io/guide/docs-style-guide#source-code-markup), and [Live examples](https://angular.io/guide/docs-style-guide#live-examples) pages of the [Authors Style Guide](https://angular.io/guide/docs-style-guide).
|
|
||||||
|
|
||||||
We use the [dgeni](https://github.com/angular/dgeni) tool to convert these files into docs that can be viewed in the doc-viewer.
|
### Generando documentos completos
|
||||||
|
|
||||||
The [Authors Style Guide](https://angular.io/guide/docs-style-guide) prescribes guidelines for
|
La principal tarea para generar los documentos es `yarn docs`. Esto procesará todos los archivos fuente (API y otros), extrayendo la documentación y generando archivos JSON que pueden ser consumidos por el doc-viewer.
|
||||||
writing guide pages, explains how to use the documentation classes and components, and how to markup sample source code to produce code snippets.
|
|
||||||
|
|
||||||
### Generating the complete docs
|
### Generación parcial de doc para editores
|
||||||
|
|
||||||
The main task for generating the docs is `yarn docs`. This will process all the source files (API and other),
|
La generación completa de documentos puede llevar hasta un minuto. Eso es demasiado lento para la creación y edición eficiente de documentos.
|
||||||
extracting the documentation and generating JSON files that can be consumed by the doc-viewer.
|
|
||||||
|
|
||||||
### Partial doc generation for editors
|
Puedes ealizar pequeños cambios en un editor inteligente que muestre un markdown con formato:
|
||||||
|
>En VS Code, _Cmd-K, V_ abre la vista previa de markdown en el panel lateral; _Cmd-B_ alterna la barra izquierda
|
||||||
|
|
||||||
Full doc generation can take up to one minute. That's too slow for efficient document creation and editing.
|
Puedes también mirar los cambios que se muestran correctamente en el doc-viewer
|
||||||
|
con un tiempo de ciclo rápido de edición / visualización.
|
||||||
|
|
||||||
You can make small changes in a smart editor that displays formatted markdown:
|
Para este propósito, usa la tarea `yarn docs-watch`, que observa los cambios en los archivos de origen y solo vuelve a procesar los archivos necesarios para generar los documentos relacionados con el archivo que ha cambiado.
|
||||||
>In VS Code, _Cmd-K, V_ opens markdown preview in side pane; _Cmd-B_ toggles left sidebar
|
Dado que esta tarea tiene accesos directos, es mucho más rápido (a menudo menos de 1 segundo) pero no producirá contenido de fidelidad completa. Por ejemplo, los enlaces a otros documentoss y ejemplos de código pueden no mostrarse correctamente. Esto se nota especialmente en los enlaces a otros documentos y en los ejemplos incrustados, que no siempre se representan correctamente.
|
||||||
|
|
||||||
You also want to see those changes displayed properly in the doc viewer
|
La configuración general es la siguiente:
|
||||||
with a quick, edit/view cycle time.
|
|
||||||
|
|
||||||
For this purpose, use the `yarn docs-watch` task, which watches for changes to source files and only
|
* Abrir una terminal, estar seguro que las dependencias están instaladas; ejecutar una generación inicial del doc; luego iniciar el doc-viewer:
|
||||||
re-processes the files necessary to generate the docs that are related to the file that has changed.
|
|
||||||
Since this task takes shortcuts, it is much faster (often less than 1 second) but it won't produce full
|
|
||||||
fidelity content. For example, links to other docs and code examples may not render correctly. This is
|
|
||||||
most particularly noticed in links to other docs and in the embedded examples, which may not always render
|
|
||||||
correctly.
|
|
||||||
|
|
||||||
The general setup is as follows:
|
|
||||||
|
|
||||||
* Open a terminal, ensure the dependencies are installed; run an initial doc generation; then start the doc-viewer:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn setup
|
yarn setup
|
||||||
yarn start
|
yarn start
|
||||||
```
|
```
|
||||||
|
|
||||||
* Open a second terminal and start watching the docs
|
* Abrir una segunda terminal e iniciar el observador de documentos.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn docs-watch
|
yarn docs-watch
|
||||||
```
|
```
|
||||||
|
|
||||||
>Alternatively, try the consolidated `serve-and-sync` command that builds, watches and serves in the same terminal window
|
>Alternativamente, prueba el comando fusionado `serve-and-sync` que crea, observa y ejecuta en la misma ventana de la terminal
|
||||||
```bash
|
```bash
|
||||||
yarn serve-and-sync
|
yarn serve-and-sync
|
||||||
```
|
```
|
||||||
|
|
||||||
* Open a browser at https://localhost:4200/ and navigate to the document on which you want to work.
|
* Abre un navegador con la siguiente dirección https://localhost:4200/ y navega hasta el documento en el que quieras trabajar.
|
||||||
You can automatically open the browser by using `yarn start -o` in the first terminal.
|
Puedes automáticamente abrir el navegador utilizando `yarn start -o` en la primera terminal.
|
||||||
|
|
||||||
* Make changes to the page's associated doc or example files. Every time a file is saved, the doc will
|
* Realiza cambios en la página de documentación asociada o en los archivos de ejemplo. Cada vez que un archivo es guardado, la documentación se regenerará, la aplicación se reconstruirá y la página se volverá a cargar.
|
||||||
be regenerated, the app will rebuild and the page will reload.
|
|
||||||
|
|
||||||
* If you get a build error complaining about examples or any other odd behavior, be sure to consult
|
*Si recibes un error de compilación acerca de los ejemplos o cualquier otro error, asegúrate de consultar las
|
||||||
the [Authors Style Guide](https://angular.io/guide/docs-style-guide).
|
[guías de estilo para Autores](https://angular.io/guide/docs-style-guide) para más información.
|
||||||
|
@ -16,6 +16,13 @@ import {BuildNums, PrNums, SHA} from './constants';
|
|||||||
|
|
||||||
const logger = new Logger('mock-external-apis');
|
const logger = new Logger('mock-external-apis');
|
||||||
|
|
||||||
|
const log = (...args: any[]) => {
|
||||||
|
// Filter out non-matching URL checks
|
||||||
|
if (!/^matching.+: false$/.test(args[0])) {
|
||||||
|
logger.log(...args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const AIO_CIRCLE_CI_TOKEN = getEnvVar('AIO_CIRCLE_CI_TOKEN');
|
const AIO_CIRCLE_CI_TOKEN = getEnvVar('AIO_CIRCLE_CI_TOKEN');
|
||||||
const AIO_GITHUB_TOKEN = getEnvVar('AIO_GITHUB_TOKEN');
|
const AIO_GITHUB_TOKEN = getEnvVar('AIO_GITHUB_TOKEN');
|
||||||
|
|
||||||
@ -84,8 +91,8 @@ const createArchive = (buildNum: number, prNum: number, sha: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Create request scopes
|
// Create request scopes
|
||||||
const circleCiApi = nock(CIRCLE_CI_API_HOST).persist();
|
const circleCiApi = nock(CIRCLE_CI_API_HOST).log(log).persist();
|
||||||
const githubApi = nock(GITHUB_API_HOST).persist().matchHeader('Authorization', `token ${AIO_GITHUB_TOKEN}`);
|
const githubApi = nock(GITHUB_API_HOST).log(log).persist().matchHeader('Authorization', `token ${AIO_GITHUB_TOKEN}`);
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
|
|
||||||
|
@ -27,28 +27,28 @@
|
|||||||
"body-parser": "^1.19.0",
|
"body-parser": "^1.19.0",
|
||||||
"delete-empty": "^3.0.0",
|
"delete-empty": "^3.0.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"jasmine": "^3.6.1",
|
"jasmine": "^3.5.0",
|
||||||
"nock": "^13.0.4",
|
"nock": "^12.0.3",
|
||||||
"node-fetch": "^2.6.1",
|
"node-fetch": "^2.6.0",
|
||||||
"shelljs": "^0.8.4",
|
"shelljs": "^0.8.4",
|
||||||
"source-map-support": "^0.5.19",
|
"source-map-support": "^0.5.19",
|
||||||
"tar-stream": "^2.1.3",
|
"tar-stream": "^2.1.2",
|
||||||
"tslib": "^2.0.1"
|
"tslib": "^1.11.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/body-parser": "^1.19.0",
|
"@types/body-parser": "^1.19.0",
|
||||||
"@types/express": "^4.17.8",
|
"@types/express": "^4.17.6",
|
||||||
"@types/jasmine": "^3.5.14",
|
"@types/jasmine": "^3.5.10",
|
||||||
"@types/nock": "^11.1.0",
|
"@types/nock": "^11.1.0",
|
||||||
"@types/node": "^14.6.4",
|
"@types/node": "^13.13.2",
|
||||||
"@types/node-fetch": "^2.5.7",
|
"@types/node-fetch": "^2.5.7",
|
||||||
"@types/shelljs": "^0.8.8",
|
"@types/shelljs": "^0.8.7",
|
||||||
"@types/supertest": "^2.0.10",
|
"@types/supertest": "^2.0.8",
|
||||||
"nodemon": "^2.0.4",
|
"nodemon": "^2.0.3",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"supertest": "^4.0.2",
|
"supertest": "^4.0.2",
|
||||||
"tslint": "^6.1.3",
|
"tslint": "^6.1.1",
|
||||||
"tslint-jasmine-noSkipOrFocus": "^1.0.9",
|
"tslint-jasmine-noSkipOrFocus": "^1.0.9",
|
||||||
"typescript": "^4.0.2"
|
"typescript": "^3.8.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,24 +214,23 @@ describe('GithubApi', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should call \'https.request()\' with the correct options', async () => {
|
it('should call \'https.request()\' with the correct options', () => {
|
||||||
const requestHandler = nock('https://api.github.com')
|
const requestHandler = nock('https://api.github.com')
|
||||||
.intercept('/path', 'method')
|
.intercept('/path', 'method')
|
||||||
.reply(200);
|
.reply(200);
|
||||||
|
|
||||||
await (api as any).request('method', '/path');
|
(api as any).request('method', '/path');
|
||||||
requestHandler.done();
|
requestHandler.done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should add the \'Authorization\' header containing the \'githubToken\'', async () => {
|
it('should add the \'Authorization\' header containing the \'githubToken\'', () => {
|
||||||
const requestHandler = nock('https://api.github.com')
|
const requestHandler = nock('https://api.github.com')
|
||||||
.intercept('/path', 'method', undefined, {
|
.intercept('/path', 'method', undefined, {
|
||||||
reqheaders: {Authorization: 'token 12345'},
|
reqheaders: {Authorization: 'token 12345'},
|
||||||
})
|
})
|
||||||
.reply(200);
|
.reply(200);
|
||||||
|
(api as any).request('method', '/path');
|
||||||
await (api as any).request('method', '/path');
|
|
||||||
requestHandler.done();
|
requestHandler.done();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -245,13 +244,12 @@ describe('GithubApi', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should \'JSON.stringify\' and send the data along with the request', async () => {
|
it('should \'JSON.stringify\' and send the data along with the request', () => {
|
||||||
const data = {key: 'value'};
|
const data = {key: 'value'};
|
||||||
const requestHandler = nock('https://api.github.com')
|
const requestHandler = nock('https://api.github.com')
|
||||||
.intercept('/path', 'method', JSON.stringify(data))
|
.intercept('/path', 'method', JSON.stringify(data))
|
||||||
.reply(200);
|
.reply(200);
|
||||||
|
(api as any).request('method', '/path', data);
|
||||||
await (api as any).request('method', '/path', data);
|
|
||||||
requestHandler.done();
|
requestHandler.done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -22,7 +22,7 @@ you don't need to specify values for those.
|
|||||||
The domain name of the server.
|
The domain name of the server.
|
||||||
|
|
||||||
- `AIO_GITHUB_ORGANIZATION`:
|
- `AIO_GITHUB_ORGANIZATION`:
|
||||||
The GitHub organization whose teams are trusted for accepting build artifacts.
|
The GitHub organization whose teams are whitelisted for accepting build artifacts.
|
||||||
See also `AIO_GITHUB_TEAM_SLUGS`.
|
See also `AIO_GITHUB_TEAM_SLUGS`.
|
||||||
|
|
||||||
- `AIO_GITHUB_REPO`:
|
- `AIO_GITHUB_REPO`:
|
||||||
|
@ -98,7 +98,7 @@ This section describes how each of the aforementioned sub-tasks is accomplished:
|
|||||||
Such a label can only have been added by a maintainer (with the necessary rights) and
|
Such a label can only have been added by a maintainer (with the necessary rights) and
|
||||||
designates that they have manually verified the PR contents.
|
designates that they have manually verified the PR contents.
|
||||||
2. We can verify (again using the GitHub API) the author's membership in one of the
|
2. We can verify (again using the GitHub API) the author's membership in one of the
|
||||||
trusted GitHub teams. For this operation, we need a Personal Access Token with the
|
whitelisted/trusted GitHub teams. For this operation, we need a Personal Access Token with the
|
||||||
`read:org` scope issued by a user that can "see" the specified GitHub organization.
|
`read:org` scope issued by a user that can "see" the specified GitHub organization.
|
||||||
Here too, we use the token by @mary-poppins.
|
Here too, we use the token by @mary-poppins.
|
||||||
|
|
||||||
|
4
aio/content/examples/.gitignore
vendored
4
aio/content/examples/.gitignore
vendored
@ -17,7 +17,6 @@
|
|||||||
**/e2e/tsconfig.e2e.json
|
**/e2e/tsconfig.e2e.json
|
||||||
**/src/karma.conf.js
|
**/src/karma.conf.js
|
||||||
**/.angular-cli.json
|
**/.angular-cli.json
|
||||||
**/.browserslistrc
|
|
||||||
**/.editorconfig
|
**/.editorconfig
|
||||||
**/.gitignore
|
**/.gitignore
|
||||||
**/angular.json
|
**/angular.json
|
||||||
@ -31,9 +30,8 @@
|
|||||||
**/tslint.json
|
**/tslint.json
|
||||||
**/karma-test-shim.js
|
**/karma-test-shim.js
|
||||||
**/browser-test-shim.js
|
**/browser-test-shim.js
|
||||||
|
**/browserslist
|
||||||
**/node_modules
|
**/node_modules
|
||||||
**/yarn.lock
|
|
||||||
**/package-lock.json
|
|
||||||
|
|
||||||
# built files
|
# built files
|
||||||
*.map
|
*.map
|
||||||
|
@ -12,7 +12,7 @@ describe('Accessibility example e2e tests', () => {
|
|||||||
|
|
||||||
it('should take a number and change progressbar width', () => {
|
it('should take a number and change progressbar width', () => {
|
||||||
element(by.css('input')).sendKeys('16');
|
element(by.css('input')).sendKeys('16');
|
||||||
expect(element(by.css('input')).getAttribute('value')).toEqual('16');
|
expect(element(by.css('input')).getAttribute('value')).toEqual('016');
|
||||||
expect(element(by.css('app-example-progressbar div')).getCssValue('width')).toBe('48px');
|
expect(element(by.css('app-example-progressbar div')).getCssValue('width')).toBe('48px');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<label>
|
<label>
|
||||||
Enter an example progress value
|
Enter an example progress value
|
||||||
<input type="number" min="0" max="100"
|
<input type="number" min="0" max="100"
|
||||||
[value]="progress" (input)="setProgress($event)">
|
[value]="progress" (input)="progress = $event.target.value">
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
<!-- The user of the progressbar sets an aria-label to communicate what the progress means. -->
|
<!-- The user of the progressbar sets an aria-label to communicate what the progress means. -->
|
||||||
|
@ -7,8 +7,4 @@ import { Component } from '@angular/core';
|
|||||||
})
|
})
|
||||||
export class AppComponent {
|
export class AppComponent {
|
||||||
progress = 0;
|
progress = 0;
|
||||||
|
|
||||||
setProgress($event: Event) {
|
|
||||||
this.progress = +($event.target as HTMLInputElement).value;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,8 @@
|
|||||||
<h2>Attribute binding</h2>
|
<h2>Attribute binding</h2>
|
||||||
<!-- #docregion attrib-binding-colspan -->
|
<!-- #docregion attrib-binding-colspan -->
|
||||||
<table border=1>
|
<table border=1>
|
||||||
<!-- #docregion colspan -->
|
|
||||||
<!-- expression calculates colspan=2 -->
|
<!-- expression calculates colspan=2 -->
|
||||||
<tr><td [attr.colspan]="1 + 1">One-Two</td></tr>
|
<tr><td [attr.colspan]="1 + 1">One-Two</td></tr>
|
||||||
<!-- #enddocregion colspan -->
|
|
||||||
|
|
||||||
<!-- ERROR: There is no `colspan` property to set!
|
<!-- ERROR: There is no `colspan` property to set!
|
||||||
<tr><td colspan="{{1 + 1}}">Three-Four</td></tr>
|
<tr><td colspan="{{1 + 1}}">Three-Four</td></tr>
|
||||||
@ -34,31 +32,31 @@
|
|||||||
<!-- #docregion basic-specificity -->
|
<!-- #docregion basic-specificity -->
|
||||||
<h3>Basic specificity</h3>
|
<h3>Basic specificity</h3>
|
||||||
|
|
||||||
<!-- The `class.special` binding overrides any value for the `special` class in `classExpression`. -->
|
<!-- The `class.special` binding will override any value for the `special` class in `classExpr`. -->
|
||||||
<div [class.special]="isSpecial" [class]="classExpression">Some text.</div>
|
<div [class.special]="isSpecial" [class]="classExpr">Some text.</div>
|
||||||
|
|
||||||
<!-- The `style.color` binding overrides any value for the `color` property in `styleExpression`. -->
|
<!-- The `style.color` binding will override any value for the `color` property in `styleExpr`. -->
|
||||||
<div [style.color]="color" [style]="styleExpression">Some text.</div>
|
<div [style.color]="color" [style]="styleExpr">Some text.</div>
|
||||||
<!-- #enddocregion basic-specificity -->
|
<!-- #enddocregion basic-specificity -->
|
||||||
|
|
||||||
<!-- #docregion source-specificity -->
|
<!-- #docregion source-specificity -->
|
||||||
<h3>Source specificity</h3>
|
<h3>Source specificity</h3>
|
||||||
|
|
||||||
<!-- The `class.special` template binding overrides any host binding to the `special` class set by `dirWithClassBinding` or `comp-with-host-binding`.-->
|
<!-- The `class.special` template binding will override any host binding to the `special` class set by `dirWithClassBinding` or `comp-with-host-binding`.-->
|
||||||
<comp-with-host-binding [class.special]="isSpecial" dirWithClassBinding>Some text.</comp-with-host-binding>
|
<comp-with-host-binding [class.special]="isSpecial" dirWithClassBinding>Some text.</comp-with-host-binding>
|
||||||
|
|
||||||
<!-- The `style.color` template binding overrides any host binding to the `color` property set by `dirWithStyleBinding` or `comp-with-host-binding`. -->
|
<!-- The `style.color` template binding will override any host binding to the `color` property set by `dirWithStyleBinding` or `comp-with-host-binding`. -->
|
||||||
<comp-with-host-binding [style.color]="color" dirWithStyleBinding>Some text.</comp-with-host-binding>
|
<comp-with-host-binding [style.color]="color" dirWithStyleBinding>Some text.</comp-with-host-binding>
|
||||||
<!-- #enddocregion source-specificity -->
|
<!-- #enddocregion source-specificity -->
|
||||||
|
|
||||||
<!-- #docregion dynamic-priority -->
|
<!-- #docregion dynamic-priority -->
|
||||||
<h3>Dynamic vs static</h3>
|
<h3>Dynamic vs static</h3>
|
||||||
|
|
||||||
<!-- If `classExpression` has a value for the `special` class, this value overrides the `class="special"` below -->
|
<!-- If `classExpr` has a value for the `special` class, this value will override the `class="special"` below -->
|
||||||
<div class="special" [class]="classExpression">Some text.</div>
|
<div class="special" [class]="classExpr">Some text.</div>
|
||||||
|
|
||||||
<!-- If `styleExpression` has a value for the `color` property, this value overrides the `style="color: blue"` below -->
|
<!-- If `styleExpr` has a value for the `color` property, this value will override the `style="color: blue"` below -->
|
||||||
<div style="color: blue" [style]="styleExpression">Some text.</div>
|
<div style="color: blue" [style]="styleExpr">Some text.</div>
|
||||||
|
|
||||||
<!-- #enddocregion dynamic-priority -->
|
<!-- #enddocregion dynamic-priority -->
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ export class AppComponent {
|
|||||||
actionName = 'Go for it';
|
actionName = 'Go for it';
|
||||||
isSpecial = true;
|
isSpecial = true;
|
||||||
canSave = true;
|
canSave = true;
|
||||||
classExpression = 'special clearance';
|
classExpr = 'special clearance';
|
||||||
styleExpression = 'color: red';
|
styleExpr = 'color: red';
|
||||||
color = 'blue';
|
color = 'blue';
|
||||||
}
|
}
|
||||||
|
@ -11,9 +11,6 @@ export class CompWithHostBindingComponent {
|
|||||||
@HostBinding('style.color')
|
@HostBinding('style.color')
|
||||||
color = 'green';
|
color = 'green';
|
||||||
|
|
||||||
// #docregion hostbinding
|
|
||||||
@HostBinding('style.width')
|
@HostBinding('style.width')
|
||||||
width = '200px';
|
width = '200px';
|
||||||
// #enddocregion hostbinding
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -21,13 +21,11 @@ import { ItemDirective } from './item.directive';
|
|||||||
ItemDirective
|
ItemDirective
|
||||||
],
|
],
|
||||||
// #enddocregion declarations
|
// #enddocregion declarations
|
||||||
// #docregion imports
|
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
FormsModule,
|
FormsModule,
|
||||||
HttpClientModule
|
HttpClientModule
|
||||||
],
|
],
|
||||||
// #enddocregion imports
|
|
||||||
providers: [],
|
providers: [],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent]
|
||||||
})
|
})
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
/*
|
|
||||||
* This example project is special in that it is not a cli app. To run tests appropriate for this
|
|
||||||
* project, the test command is overwritten in `aio/content/examples/observables/example-config.json`.
|
|
||||||
*
|
|
||||||
* This is an empty placeholder file to ensure that `aio/tools/examples/run-example-e2e.js` runs
|
|
||||||
* tests for this project.
|
|
||||||
*
|
|
||||||
* TODO: Fix our infrastructure/tooling, so that this hack is not necessary.
|
|
||||||
*/
|
|
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"tests": [
|
|
||||||
{
|
|
||||||
"cmd": "yarn",
|
|
||||||
"args": ["tsc", "--project", "tsconfig.spec.json", "--module", "commonjs"]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"cmd": "yarn",
|
|
||||||
"args": ["jasmine", "out-tsc/**/*.spec.js"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
import { docRegionChain, docRegionObservable, docRegionUnsubscribe } from './observables';
|
|
||||||
|
|
||||||
describe('observables', () => {
|
|
||||||
it('should print 2', (doneFn: DoneFn) => {
|
|
||||||
const consoleLogSpy = spyOn(console, 'log');
|
|
||||||
const observable = docRegionObservable(console);
|
|
||||||
observable.subscribe(() => {
|
|
||||||
expect(consoleLogSpy).toHaveBeenCalledTimes(1);
|
|
||||||
expect(consoleLogSpy).toHaveBeenCalledWith(2);
|
|
||||||
doneFn();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should close the subscription', () => {
|
|
||||||
const subscription = docRegionUnsubscribe();
|
|
||||||
expect(subscription.closed).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should chain an observable', (doneFn: DoneFn) => {
|
|
||||||
const observable = docRegionChain();
|
|
||||||
observable.subscribe(value => {
|
|
||||||
expect(value).toBe(4);
|
|
||||||
doneFn();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,72 +1,40 @@
|
|||||||
// #docplaster
|
|
||||||
|
|
||||||
import { Observable } from 'rxjs';
|
|
||||||
import { map } from 'rxjs/operators';
|
import { map } from 'rxjs/operators';
|
||||||
|
import { Observable } from 'rxjs';
|
||||||
|
|
||||||
export function docRegionObservable(console: Console) {
|
// #docregion observable
|
||||||
// #docregion observable
|
|
||||||
|
|
||||||
// declare a publishing operation
|
// declare a publishing operation
|
||||||
const observable = new Observable<number>(observer => {
|
const observable = new Observable<number>(observer => {
|
||||||
// Subscriber fn...
|
// Subscriber fn...
|
||||||
// #enddocregion observable
|
});
|
||||||
// The below code is used for unit testing only
|
|
||||||
observer.next(2);
|
|
||||||
// #docregion observable
|
|
||||||
});
|
|
||||||
|
|
||||||
// initiate execution
|
// initiate execution
|
||||||
observable.subscribe(value => {
|
observable.subscribe(() => {
|
||||||
// observer handles notifications
|
// observer handles notifications
|
||||||
// #enddocregion observable
|
});
|
||||||
// The below code is used for unit testing only
|
|
||||||
console.log(value);
|
|
||||||
// #docregion observable
|
|
||||||
});
|
|
||||||
|
|
||||||
// #enddocregion observable
|
// #enddocregion observable
|
||||||
return observable;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function docRegionUnsubscribe() {
|
// #docregion unsubscribe
|
||||||
const observable = new Observable<number>(() => {
|
|
||||||
// Subscriber fn...
|
|
||||||
});
|
|
||||||
// #docregion unsubscribe
|
|
||||||
|
|
||||||
const subscription = observable.subscribe(() => {
|
const subscription = observable.subscribe(() => {
|
||||||
// observer handles notifications
|
// observer handles notifications
|
||||||
});
|
});
|
||||||
|
|
||||||
subscription.unsubscribe();
|
subscription.unsubscribe();
|
||||||
|
|
||||||
// #enddocregion unsubscribe
|
// #enddocregion unsubscribe
|
||||||
return subscription;
|
|
||||||
}
|
|
||||||
|
|
||||||
export function docRegionError() {
|
// #docregion error
|
||||||
const observable = new Observable<number>(() => {
|
|
||||||
// Subscriber fn...
|
|
||||||
});
|
|
||||||
|
|
||||||
// #docregion error
|
observable.subscribe(() => {
|
||||||
observable.subscribe(() => {
|
throw Error('my error');
|
||||||
throw new Error('my error');
|
});
|
||||||
});
|
|
||||||
// #enddocregion error
|
|
||||||
}
|
|
||||||
|
|
||||||
export function docRegionChain() {
|
// #enddocregion error
|
||||||
let observable = new Observable<number>(observer => {
|
|
||||||
// Subscriber fn...
|
|
||||||
observer.next(2);
|
|
||||||
});
|
|
||||||
|
|
||||||
observable =
|
// #docregion chain
|
||||||
// #docregion chain
|
|
||||||
|
|
||||||
observable.pipe(map(v => 2 * v));
|
observable.pipe(map(v => 2 * v));
|
||||||
|
|
||||||
// #enddocregion chain
|
// #enddocregion chain
|
||||||
return observable;
|
|
||||||
}
|
|
||||||
|
@ -1,23 +0,0 @@
|
|||||||
import { docRegionError, docRegionPromise } from './promises';
|
|
||||||
|
|
||||||
describe('promises', () => {
|
|
||||||
it('should print 2', (doneFn: DoneFn) => {
|
|
||||||
const consoleLogSpy = spyOn(console, 'log');
|
|
||||||
const pr = docRegionPromise(console, 2);
|
|
||||||
pr.then((value) => {
|
|
||||||
expect(consoleLogSpy).toHaveBeenCalledTimes(1);
|
|
||||||
expect(consoleLogSpy).toHaveBeenCalledWith(2);
|
|
||||||
expect(value).toBe(4);
|
|
||||||
doneFn();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should throw an error', (doneFn: DoneFn) => {
|
|
||||||
const promise = docRegionError();
|
|
||||||
promise
|
|
||||||
.then(() => {
|
|
||||||
throw new Error('Promise should be rejected.');
|
|
||||||
},
|
|
||||||
() => doneFn());
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,44 +1,25 @@
|
|||||||
// #docplaster
|
// #docregion promise
|
||||||
|
// initiate execution
|
||||||
|
const promise = new Promise<number>((resolve, reject) => {
|
||||||
|
// Executer fn...
|
||||||
|
});
|
||||||
|
|
||||||
export function docRegionPromise(console: Console, inputValue: number) {
|
promise.then(value => {
|
||||||
// #docregion promise
|
// handle result here
|
||||||
// initiate execution
|
});
|
||||||
let promise = new Promise<number>((resolve, reject) => {
|
|
||||||
// Executer fn...
|
|
||||||
// #enddocregion promise
|
|
||||||
// The below is used in the unit tests.
|
|
||||||
resolve(inputValue);
|
|
||||||
// #docregion promise
|
|
||||||
});
|
|
||||||
// #enddocregion promise
|
|
||||||
promise =
|
|
||||||
// #docregion promise
|
|
||||||
promise.then(value => {
|
|
||||||
// handle result here
|
|
||||||
// #enddocregion promise
|
|
||||||
// The below is used in the unit tests.
|
|
||||||
console.log(value);
|
|
||||||
return value;
|
|
||||||
// #docregion promise
|
|
||||||
});
|
|
||||||
// #enddocregion promise
|
|
||||||
promise =
|
|
||||||
// #docregion chain
|
|
||||||
promise.then(v => 2 * v);
|
|
||||||
// #enddocregion chain
|
|
||||||
|
|
||||||
return promise;
|
// #enddocregion promise
|
||||||
}
|
|
||||||
|
|
||||||
export function docRegionError() {
|
// #docregion chain
|
||||||
let promise = Promise.resolve();
|
|
||||||
promise =
|
|
||||||
// #docregion error
|
|
||||||
|
|
||||||
promise.then(() => {
|
promise.then(v => 2 * v);
|
||||||
throw new Error('my error');
|
|
||||||
});
|
|
||||||
|
|
||||||
// #enddocregion error
|
// #enddocregion chain
|
||||||
return promise;
|
|
||||||
}
|
// #docregion error
|
||||||
|
|
||||||
|
promise.then(() => {
|
||||||
|
throw Error('my error');
|
||||||
|
});
|
||||||
|
|
||||||
|
// #enddocregion error
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
import { browser, by, element } from 'protractor';
|
import { browser, element, by } from 'protractor';
|
||||||
|
|
||||||
describe('Component Communication Cookbook Tests', () => {
|
describe('Component Communication Cookbook Tests', () => {
|
||||||
|
|
||||||
beforeEach(() => browser.get(browser.baseUrl));
|
// Note: '?e2e' which app can read to know it is running in protractor
|
||||||
|
// e.g. `if (!/e2e/.test(location.search)) { ...`
|
||||||
|
beforeAll(() => {
|
||||||
|
browser.get('?e2e');
|
||||||
|
});
|
||||||
|
|
||||||
describe('Parent-to-child communication', () => {
|
describe('Parent-to-child communication', () => {
|
||||||
// #docregion parent-to-child
|
// #docregion parent-to-child
|
||||||
@ -11,7 +15,7 @@ describe('Component Communication Cookbook Tests', () => {
|
|||||||
const masterName = 'Master';
|
const masterName = 'Master';
|
||||||
|
|
||||||
it('should pass properties to children properly', () => {
|
it('should pass properties to children properly', () => {
|
||||||
const parent = element(by.tagName('app-hero-parent'));
|
const parent = element.all(by.tagName('app-hero-parent')).get(0);
|
||||||
const heroes = parent.all(by.tagName('app-hero-child'));
|
const heroes = parent.all(by.tagName('app-hero-child'));
|
||||||
|
|
||||||
for (let i = 0; i < heroNames.length; i++) {
|
for (let i = 0; i < heroNames.length; i++) {
|
||||||
@ -31,7 +35,7 @@ describe('Component Communication Cookbook Tests', () => {
|
|||||||
it('should display trimmed, non-empty names', () => {
|
it('should display trimmed, non-empty names', () => {
|
||||||
const nonEmptyNameIndex = 0;
|
const nonEmptyNameIndex = 0;
|
||||||
const nonEmptyName = '"Dr IQ"';
|
const nonEmptyName = '"Dr IQ"';
|
||||||
const parent = element(by.tagName('app-name-parent'));
|
const parent = element.all(by.tagName('app-name-parent')).get(0);
|
||||||
const hero = parent.all(by.tagName('app-name-child')).get(nonEmptyNameIndex);
|
const hero = parent.all(by.tagName('app-name-child')).get(nonEmptyNameIndex);
|
||||||
|
|
||||||
const displayName = hero.element(by.tagName('h3')).getText();
|
const displayName = hero.element(by.tagName('h3')).getText();
|
||||||
@ -41,7 +45,7 @@ describe('Component Communication Cookbook Tests', () => {
|
|||||||
it('should replace empty name with default name', () => {
|
it('should replace empty name with default name', () => {
|
||||||
const emptyNameIndex = 1;
|
const emptyNameIndex = 1;
|
||||||
const defaultName = '"<no name set>"';
|
const defaultName = '"<no name set>"';
|
||||||
const parent = element(by.tagName('app-name-parent'));
|
const parent = element.all(by.tagName('app-name-parent')).get(0);
|
||||||
const hero = parent.all(by.tagName('app-name-child')).get(emptyNameIndex);
|
const hero = parent.all(by.tagName('app-name-child')).get(emptyNameIndex);
|
||||||
|
|
||||||
const displayName = hero.element(by.tagName('h3')).getText();
|
const displayName = hero.element(by.tagName('h3')).getText();
|
||||||
@ -66,36 +70,38 @@ describe('Component Communication Cookbook Tests', () => {
|
|||||||
expect(actual.logs.get(0).getText()).toBe(initialLog);
|
expect(actual.logs.get(0).getText()).toBe(initialLog);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set expected values after clicking \'Minor\' twice', async () => {
|
it('should set expected values after clicking \'Minor\' twice', () => {
|
||||||
const repoTag = element(by.tagName('app-version-parent'));
|
const repoTag = element(by.tagName('app-version-parent'));
|
||||||
const newMinorButton = repoTag.all(by.tagName('button')).get(0);
|
const newMinorButton = repoTag.all(by.tagName('button')).get(0);
|
||||||
|
|
||||||
await newMinorButton.click();
|
newMinorButton.click().then(() => {
|
||||||
await newMinorButton.click();
|
newMinorButton.click().then(() => {
|
||||||
|
const actual = getActual();
|
||||||
|
|
||||||
const actual = getActual();
|
const labelAfter2Minor = 'Version 1.25';
|
||||||
|
const logAfter2Minor = 'minor changed from 24 to 25';
|
||||||
|
|
||||||
const labelAfter2Minor = 'Version 1.25';
|
expect(actual.label).toBe(labelAfter2Minor);
|
||||||
const logAfter2Minor = 'minor changed from 24 to 25';
|
expect(actual.count).toBe(3);
|
||||||
|
expect(actual.logs.get(2).getText()).toBe(logAfter2Minor);
|
||||||
expect(actual.label).toBe(labelAfter2Minor);
|
});
|
||||||
expect(actual.count).toBe(3);
|
});
|
||||||
expect(actual.logs.get(2).getText()).toBe(logAfter2Minor);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set expected values after clicking \'Major\' once', async () => {
|
it('should set expected values after clicking \'Major\' once', () => {
|
||||||
const repoTag = element(by.tagName('app-version-parent'));
|
const repoTag = element(by.tagName('app-version-parent'));
|
||||||
const newMajorButton = repoTag.all(by.tagName('button')).get(1);
|
const newMajorButton = repoTag.all(by.tagName('button')).get(1);
|
||||||
|
|
||||||
await newMajorButton.click();
|
newMajorButton.click().then(() => {
|
||||||
const actual = getActual();
|
const actual = getActual();
|
||||||
|
|
||||||
const labelAfterMajor = 'Version 2.0';
|
const labelAfterMajor = 'Version 2.0';
|
||||||
const logAfterMajor = 'major changed from 1 to 2, minor changed from 23 to 0';
|
const logAfterMajor = 'major changed from 1 to 2, minor changed from 25 to 0';
|
||||||
|
|
||||||
expect(actual.label).toBe(labelAfterMajor);
|
expect(actual.label).toBe(labelAfterMajor);
|
||||||
expect(actual.count).toBe(2);
|
expect(actual.count).toBe(4);
|
||||||
expect(actual.logs.get(1).getText()).toBe(logAfterMajor);
|
expect(actual.logs.get(3).getText()).toBe(logAfterMajor);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
function getActual() {
|
function getActual() {
|
||||||
@ -112,125 +118,110 @@ describe('Component Communication Cookbook Tests', () => {
|
|||||||
}
|
}
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion parent-to-child-onchanges
|
// #enddocregion parent-to-child-onchanges
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Child-to-parent communication', () => {
|
describe('Child-to-parent communication', () => {
|
||||||
// #docregion child-to-parent
|
// #docregion child-to-parent
|
||||||
// ...
|
// ...
|
||||||
it('should not emit the event initially', () => {
|
it('should not emit the event initially', () => {
|
||||||
const voteLabel = element(by.tagName('app-vote-taker')).element(by.tagName('h3'));
|
const voteLabel = element(by.tagName('app-vote-taker'))
|
||||||
expect(voteLabel.getText()).toBe('Agree: 0, Disagree: 0');
|
.element(by.tagName('h3')).getText();
|
||||||
|
expect(voteLabel).toBe('Agree: 0, Disagree: 0');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should process Agree vote', async () => {
|
it('should process Agree vote', () => {
|
||||||
const voteLabel = element(by.tagName('app-vote-taker')).element(by.tagName('h3'));
|
|
||||||
const agreeButton1 = element.all(by.tagName('app-voter')).get(0)
|
const agreeButton1 = element.all(by.tagName('app-voter')).get(0)
|
||||||
.all(by.tagName('button')).get(0);
|
.all(by.tagName('button')).get(0);
|
||||||
|
agreeButton1.click().then(() => {
|
||||||
await agreeButton1.click();
|
const voteLabel = element(by.tagName('app-vote-taker'))
|
||||||
|
.element(by.tagName('h3')).getText();
|
||||||
expect(voteLabel.getText()).toBe('Agree: 1, Disagree: 0');
|
expect(voteLabel).toBe('Agree: 1, Disagree: 0');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should process Disagree vote', async () => {
|
it('should process Disagree vote', () => {
|
||||||
const voteLabel = element(by.tagName('app-vote-taker')).element(by.tagName('h3'));
|
|
||||||
const agreeButton1 = element.all(by.tagName('app-voter')).get(1)
|
const agreeButton1 = element.all(by.tagName('app-voter')).get(1)
|
||||||
.all(by.tagName('button')).get(1);
|
.all(by.tagName('button')).get(1);
|
||||||
|
agreeButton1.click().then(() => {
|
||||||
await agreeButton1.click();
|
const voteLabel = element(by.tagName('app-vote-taker'))
|
||||||
|
.element(by.tagName('h3')).getText();
|
||||||
expect(voteLabel.getText()).toBe('Agree: 0, Disagree: 1');
|
expect(voteLabel).toBe('Agree: 1, Disagree: 1');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion child-to-parent
|
// #enddocregion child-to-parent
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Parent calls child via local var', () => {
|
// Can't run timer tests in protractor because
|
||||||
countDownTimerTests('app-countdown-parent-lv');
|
// interaction w/ zones causes all tests to freeze & timeout.
|
||||||
|
xdescribe('Parent calls child via local var', () => {
|
||||||
|
countDownTimerTests('countdown-parent-lv');
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Parent calls ViewChild', () => {
|
xdescribe('Parent calls ViewChild', () => {
|
||||||
countDownTimerTests('app-countdown-parent-vc');
|
countDownTimerTests('countdown-parent-vc');
|
||||||
});
|
});
|
||||||
|
|
||||||
function countDownTimerTests(parentTag: string) {
|
function countDownTimerTests(parentTag: string) {
|
||||||
// #docregion countdown-timer-tests
|
// #docregion countdown-timer-tests
|
||||||
// ...
|
// ...
|
||||||
// The tests trigger periodic asynchronous operations (via `setInterval()`), which will prevent
|
it('timer and parent seconds should match', () => {
|
||||||
// the app from stabilizing. See https://angular.io/api/core/ApplicationRef#is-stable-examples
|
|
||||||
// for more details.
|
|
||||||
// To allow the tests to complete, we will disable automatically waiting for the Angular app to
|
|
||||||
// stabilize.
|
|
||||||
beforeEach(() => browser.waitForAngularEnabled(false));
|
|
||||||
afterEach(() => browser.waitForAngularEnabled(true));
|
|
||||||
|
|
||||||
it('timer and parent seconds should match', async () => {
|
|
||||||
const parent = element(by.tagName(parentTag));
|
const parent = element(by.tagName(parentTag));
|
||||||
const startButton = parent.element(by.buttonText('Start'));
|
const message = parent.element(by.tagName('app-countdown-timer')).getText();
|
||||||
const seconds = parent.element(by.className('seconds'));
|
browser.sleep(10); // give `seconds` a chance to catchup with `message`
|
||||||
const timer = parent.element(by.tagName('app-countdown-timer'));
|
const seconds = parent.element(by.className('seconds')).getText();
|
||||||
|
expect(message).toContain(seconds);
|
||||||
await startButton.click();
|
|
||||||
|
|
||||||
// Wait for `<app-countdown-timer>` to be populated with any text.
|
|
||||||
await browser.wait(() => timer.getText(), 2000);
|
|
||||||
|
|
||||||
expect(await timer.getText()).toContain(await seconds.getText());
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should stop the countdown', async () => {
|
it('should stop the countdown', () => {
|
||||||
const parent = element(by.tagName(parentTag));
|
const parent = element(by.tagName(parentTag));
|
||||||
const startButton = parent.element(by.buttonText('Start'));
|
const stopButton = parent.all(by.tagName('button')).get(1);
|
||||||
const stopButton = parent.element(by.buttonText('Stop'));
|
|
||||||
const timer = parent.element(by.tagName('app-countdown-timer'));
|
|
||||||
|
|
||||||
await startButton.click();
|
stopButton.click().then(() => {
|
||||||
expect(await timer.getText()).not.toContain('Holding');
|
const message = parent.element(by.tagName('app-countdown-timer')).getText();
|
||||||
|
expect(message).toContain('Holding');
|
||||||
await stopButton.click();
|
});
|
||||||
expect(await timer.getText()).toContain('Holding');
|
|
||||||
});
|
});
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion countdown-timer-tests
|
// #enddocregion countdown-timer-tests
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
describe('Parent and children communicate via a service', () => {
|
describe('Parent and children communicate via a service', () => {
|
||||||
// #docregion bidirectional-service
|
// #docregion bidirectional-service
|
||||||
// ...
|
// ...
|
||||||
it('should announce a mission', async () => {
|
it('should announce a mission', () => {
|
||||||
const missionControl = element(by.tagName('app-mission-control'));
|
const missionControl = element(by.tagName('app-mission-control'));
|
||||||
const announceButton = missionControl.all(by.tagName('button')).get(0);
|
const announceButton = missionControl.all(by.tagName('button')).get(0);
|
||||||
const history = missionControl.all(by.tagName('li'));
|
announceButton.click().then(() => {
|
||||||
|
const history = missionControl.all(by.tagName('li'));
|
||||||
await announceButton.click();
|
expect(history.count()).toBe(1);
|
||||||
|
expect(history.get(0).getText()).toMatch(/Mission.* announced/);
|
||||||
expect(history.count()).toBe(1);
|
});
|
||||||
expect(history.get(0).getText()).toMatch(/Mission.* announced/);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should confirm the mission by Lovell', async () => {
|
it('should confirm the mission by Lovell', () => {
|
||||||
await testConfirmMission(1, 'Lovell');
|
testConfirmMission(1, 2, 'Lovell');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should confirm the mission by Haise', async () => {
|
it('should confirm the mission by Haise', () => {
|
||||||
await testConfirmMission(3, 'Haise');
|
testConfirmMission(3, 3, 'Haise');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should confirm the mission by Swigert', async () => {
|
it('should confirm the mission by Swigert', () => {
|
||||||
await testConfirmMission(2, 'Swigert');
|
testConfirmMission(2, 4, 'Swigert');
|
||||||
});
|
});
|
||||||
|
|
||||||
async function testConfirmMission(buttonIndex: number, astronaut: string) {
|
function testConfirmMission(buttonIndex: number, expectedLogCount: number, astronaut: string) {
|
||||||
|
const confirmedLog = ' confirmed the mission';
|
||||||
const missionControl = element(by.tagName('app-mission-control'));
|
const missionControl = element(by.tagName('app-mission-control'));
|
||||||
const announceButton = missionControl.all(by.tagName('button')).get(0);
|
|
||||||
const confirmButton = missionControl.all(by.tagName('button')).get(buttonIndex);
|
const confirmButton = missionControl.all(by.tagName('button')).get(buttonIndex);
|
||||||
const history = missionControl.all(by.tagName('li'));
|
confirmButton.click().then(() => {
|
||||||
|
const history = missionControl.all(by.tagName('li'));
|
||||||
await announceButton.click();
|
expect(history.count()).toBe(expectedLogCount);
|
||||||
await confirmButton.click();
|
expect(history.get(expectedLogCount - 1).getText()).toBe(astronaut + confirmedLog);
|
||||||
|
});
|
||||||
expect(history.count()).toBe(2);
|
|
||||||
expect(history.get(1).getText()).toBe(`${astronaut} confirmed the mission`);
|
|
||||||
}
|
}
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion bidirectional-service
|
// #enddocregion bidirectional-service
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"cmd": "yarn",
|
||||||
|
"args": [
|
||||||
|
"e2e",
|
||||||
|
"--protractor-config=e2e/protractor-puppeteer.conf.js",
|
||||||
|
"--no-webdriver-update",
|
||||||
|
"--port={PORT}"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -30,21 +30,22 @@
|
|||||||
<app-vote-taker></app-vote-taker>
|
<app-vote-taker></app-vote-taker>
|
||||||
</div>
|
</div>
|
||||||
<a href="#top" class="to-top">Back to Top</a>
|
<a href="#top" class="to-top">Back to Top</a>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<div id="parent-to-child-local-var">
|
<div id="parent-to-child-local-var">
|
||||||
<app-countdown-parent-lv></app-countdown-parent-lv>
|
<app-countdown-parent-lv></app-countdown-parent-lv>
|
||||||
</div>
|
</div>
|
||||||
<a href="#top" class="to-top">Back to Top</a>
|
<a href="#top" class="to-top">Back to Top</a>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<div id="parent-to-view-child">
|
<div id="parent-to-view-child">
|
||||||
<app-countdown-parent-vc></app-countdown-parent-vc>
|
<app-countdown-parent-vc></app-countdown-parent-vc>
|
||||||
</div>
|
</div>
|
||||||
<a href="#top" class="to-top">Back to Top</a>
|
<a href="#top" class="to-top">Back to Top</a>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<div id="bidirectional-service">
|
<div id="bidirectional-service">
|
||||||
<app-mission-control></app-mission-control>
|
<app-mission-control></app-mission-control>
|
||||||
</div>
|
</div>
|
||||||
<a href="#top" class="to-top">Back to Top</a>
|
<a href="#top" class="to-top">Back to Top</a>
|
||||||
|
<hr>
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { NgModule } from '@angular/core';
|
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
@ -15,17 +15,10 @@ import { VersionParentComponent } from './version-parent.component';
|
|||||||
import { VoterComponent } from './voter.component';
|
import { VoterComponent } from './voter.component';
|
||||||
import { VoteTakerComponent } from './votetaker.component';
|
import { VoteTakerComponent } from './votetaker.component';
|
||||||
|
|
||||||
|
const directives: any[] = [
|
||||||
@NgModule({
|
|
||||||
imports: [
|
|
||||||
BrowserModule,
|
|
||||||
],
|
|
||||||
declarations: [
|
|
||||||
AppComponent,
|
AppComponent,
|
||||||
AstronautComponent,
|
AstronautComponent,
|
||||||
CountdownLocalVarParentComponent,
|
|
||||||
CountdownTimerComponent,
|
CountdownTimerComponent,
|
||||||
CountdownViewChildParentComponent,
|
|
||||||
HeroChildComponent,
|
HeroChildComponent,
|
||||||
HeroParentComponent,
|
HeroParentComponent,
|
||||||
MissionControlComponent,
|
MissionControlComponent,
|
||||||
@ -34,8 +27,28 @@ import { VoteTakerComponent } from './votetaker.component';
|
|||||||
VersionChildComponent,
|
VersionChildComponent,
|
||||||
VersionParentComponent,
|
VersionParentComponent,
|
||||||
VoterComponent,
|
VoterComponent,
|
||||||
VoteTakerComponent,
|
VoteTakerComponent
|
||||||
|
];
|
||||||
|
|
||||||
|
const schemas: any[] = [];
|
||||||
|
|
||||||
|
// Include Countdown examples
|
||||||
|
// unless in e2e tests which they break.
|
||||||
|
if (!/e2e/.test(location.search)) {
|
||||||
|
console.log('adding countdown timer examples');
|
||||||
|
directives.push(CountdownLocalVarParentComponent);
|
||||||
|
directives.push(CountdownViewChildParentComponent);
|
||||||
|
} else {
|
||||||
|
// In e2e test use CUSTOM_ELEMENTS_SCHEMA to suppress unknown element errors
|
||||||
|
schemas.push(CUSTOM_ELEMENTS_SCHEMA);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
BrowserModule
|
||||||
],
|
],
|
||||||
|
declarations: directives,
|
||||||
bootstrap: [ AppComponent ],
|
bootstrap: [ AppComponent ],
|
||||||
|
schemas
|
||||||
})
|
})
|
||||||
export class AppModule { }
|
export class AppModule { }
|
||||||
|
@ -1,16 +1,19 @@
|
|||||||
// #docregion
|
// #docregion
|
||||||
import { Component, OnDestroy } from '@angular/core';
|
import { Component, OnDestroy, OnInit } from '@angular/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-countdown-timer',
|
selector: 'app-countdown-timer',
|
||||||
template: '<p>{{message}}</p>'
|
template: '<p>{{message}}</p>'
|
||||||
})
|
})
|
||||||
export class CountdownTimerComponent implements OnDestroy {
|
export class CountdownTimerComponent implements OnInit, OnDestroy {
|
||||||
|
|
||||||
intervalId = 0;
|
intervalId = 0;
|
||||||
message = '';
|
message = '';
|
||||||
seconds = 11;
|
seconds = 11;
|
||||||
|
|
||||||
|
clearTimer() { clearInterval(this.intervalId); }
|
||||||
|
|
||||||
|
ngOnInit() { this.start(); }
|
||||||
ngOnDestroy() { this.clearTimer(); }
|
ngOnDestroy() { this.clearTimer(); }
|
||||||
|
|
||||||
start() { this.countDown(); }
|
start() { this.countDown(); }
|
||||||
@ -19,8 +22,6 @@ export class CountdownTimerComponent implements OnDestroy {
|
|||||||
this.message = `Holding at T-${this.seconds} seconds`;
|
this.message = `Holding at T-${this.seconds} seconds`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private clearTimer() { clearInterval(this.intervalId); }
|
|
||||||
|
|
||||||
private countDown() {
|
private countDown() {
|
||||||
this.clearTimer();
|
this.clearTimer();
|
||||||
this.intervalId = window.setInterval(() => {
|
this.intervalId = window.setInterval(() => {
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
import { browser, element, by } from 'protractor';
|
|
||||||
|
|
||||||
describe('Component Overview', () => {
|
|
||||||
|
|
||||||
beforeAll(() => {
|
|
||||||
browser.get('');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should display component overview works ', () => {
|
|
||||||
expect(element(by.css('p')).getText()).toEqual('component-overview works!');
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
@ -1 +0,0 @@
|
|||||||
<app-component-overview></app-component-overview>
|
|
@ -1,31 +0,0 @@
|
|||||||
import { TestBed, async } from '@angular/core/testing';
|
|
||||||
import { AppComponent } from './app.component';
|
|
||||||
|
|
||||||
describe('AppComponent', () => {
|
|
||||||
beforeEach(async(() => {
|
|
||||||
TestBed.configureTestingModule({
|
|
||||||
declarations: [
|
|
||||||
AppComponent
|
|
||||||
],
|
|
||||||
}).compileComponents();
|
|
||||||
}));
|
|
||||||
|
|
||||||
it('should create the app', () => {
|
|
||||||
const fixture = TestBed.createComponent(AppComponent);
|
|
||||||
const app = fixture.componentInstance;
|
|
||||||
expect(app).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it(`should have as title 'component-overview'`, () => {
|
|
||||||
const fixture = TestBed.createComponent(AppComponent);
|
|
||||||
const app = fixture.componentInstance;
|
|
||||||
expect(app.title).toEqual('component-overview');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should render title', () => {
|
|
||||||
const fixture = TestBed.createComponent(AppComponent);
|
|
||||||
fixture.detectChanges();
|
|
||||||
const compiled = fixture.nativeElement;
|
|
||||||
expect(compiled.querySelector('.content span').textContent).toContain('component-overview app is running!');
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,10 +0,0 @@
|
|||||||
import { Component } from '@angular/core';
|
|
||||||
|
|
||||||
@Component({
|
|
||||||
selector: 'app-root',
|
|
||||||
templateUrl: './app.component.html',
|
|
||||||
styleUrls: ['./app.component.css']
|
|
||||||
})
|
|
||||||
export class AppComponent {
|
|
||||||
title = 'component-overview';
|
|
||||||
}
|
|
@ -1,18 +0,0 @@
|
|||||||
import { BrowserModule } from '@angular/platform-browser';
|
|
||||||
import { NgModule } from '@angular/core';
|
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
|
||||||
import { ComponentOverviewComponent } from './component-overview/component-overview.component';
|
|
||||||
|
|
||||||
@NgModule({
|
|
||||||
declarations: [
|
|
||||||
AppComponent,
|
|
||||||
ComponentOverviewComponent
|
|
||||||
],
|
|
||||||
imports: [
|
|
||||||
BrowserModule
|
|
||||||
],
|
|
||||||
providers: [],
|
|
||||||
bootstrap: [AppComponent]
|
|
||||||
})
|
|
||||||
export class AppModule { }
|
|
@ -1,14 +0,0 @@
|
|||||||
// #docplaster
|
|
||||||
import { Component } from '@angular/core';
|
|
||||||
|
|
||||||
// #docregion template
|
|
||||||
@Component({
|
|
||||||
selector: 'app-component-overview',
|
|
||||||
template: '<h1>Hello World!</h1>',
|
|
||||||
})
|
|
||||||
// #enddocregion template
|
|
||||||
|
|
||||||
export class ComponentOverviewComponent {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
|||||||
// #docplaster
|
|
||||||
import { Component } from '@angular/core';
|
|
||||||
|
|
||||||
// #docregion templatebacktick
|
|
||||||
@Component({
|
|
||||||
selector: 'app-component-overview',
|
|
||||||
template: `<h1>Hello World!</h1>
|
|
||||||
<p>This template definition spans
|
|
||||||
multiple lines.</p>`
|
|
||||||
})
|
|
||||||
// #enddocregion templatebacktick
|
|
||||||
|
|
||||||
export class ComponentOverviewComponent {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
// #docplaster
|
|
||||||
import { Component } from '@angular/core';
|
|
||||||
|
|
||||||
// #docregion styles
|
|
||||||
@Component({
|
|
||||||
selector: 'app-component-overview',
|
|
||||||
template: '<h1>Hello World!</h1>',
|
|
||||||
styles: ['h1 { font-weight: normal; }']
|
|
||||||
})
|
|
||||||
// #enddocregion styles
|
|
||||||
|
|
||||||
export class ComponentOverviewComponent {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
@ -1 +0,0 @@
|
|||||||
<p>component-overview works!</p>
|
|
@ -1,25 +0,0 @@
|
|||||||
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
|
|
||||||
|
|
||||||
import { ComponentOverviewComponent } from './component-overview.component';
|
|
||||||
|
|
||||||
describe('ComponentOverviewComponent', () => {
|
|
||||||
let component: ComponentOverviewComponent;
|
|
||||||
let fixture: ComponentFixture<ComponentOverviewComponent>;
|
|
||||||
|
|
||||||
beforeEach(async(() => {
|
|
||||||
TestBed.configureTestingModule({
|
|
||||||
declarations: [ ComponentOverviewComponent ]
|
|
||||||
})
|
|
||||||
.compileComponents();
|
|
||||||
}));
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
fixture = TestBed.createComponent(ComponentOverviewComponent);
|
|
||||||
component = fixture.componentInstance;
|
|
||||||
fixture.detectChanges();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create', () => {
|
|
||||||
expect(component).toBeTruthy();
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,22 +0,0 @@
|
|||||||
// #docplaster
|
|
||||||
// #docregion import
|
|
||||||
import { Component } from '@angular/core';
|
|
||||||
// #enddocregion import
|
|
||||||
|
|
||||||
// #docregion decorator, decorator-skeleton, selector, templateUrl
|
|
||||||
@Component({
|
|
||||||
// #enddocregion decorator-skeleton
|
|
||||||
selector: 'app-component-overview',
|
|
||||||
// #enddocregion selector
|
|
||||||
templateUrl: './component-overview.component.html',
|
|
||||||
// #enddocregion templateUrl
|
|
||||||
styleUrls: ['./component-overview.component.css']
|
|
||||||
// #docregion decorator-skeleton, selector, templateUrl
|
|
||||||
})
|
|
||||||
// #enddocregion decorator, decorator-skeleton, selector, templateUrl
|
|
||||||
|
|
||||||
// #docregion class
|
|
||||||
export class ComponentOverviewComponent {
|
|
||||||
|
|
||||||
}
|
|
||||||
// #enddocregion class
|
|
@ -1,13 +0,0 @@
|
|||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>ComponentOverview</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></app-root>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,12 +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)
|
|
||||||
.catch(err => console.error(err));
|
|
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"description": "Component Overview",
|
|
||||||
"files":[
|
|
||||||
"!**/*.d.ts",
|
|
||||||
"!**/*.js"
|
|
||||||
],
|
|
||||||
"tags":["overview", "component"]
|
|
||||||
}
|
|
@ -13,8 +13,8 @@ import { Component, ViewEncapsulation } from '@angular/core';
|
|||||||
export class QuestSummaryComponent { }
|
export class QuestSummaryComponent { }
|
||||||
// #enddocregion
|
// #enddocregion
|
||||||
/*
|
/*
|
||||||
// #docregion encapsulation.shadow
|
// #docregion encapsulation.native
|
||||||
// warning: few browsers support shadow DOM encapsulation at this time
|
// warning: few browsers support shadow DOM encapsulation at this time
|
||||||
encapsulation: ViewEncapsulation.ShadowDom
|
encapsulation: ViewEncapsulation.Native
|
||||||
// #enddocregion encapsulation.shadow
|
// #enddocregion encapsulation.native
|
||||||
*/
|
*/
|
||||||
|
@ -24,7 +24,7 @@ export class UploaderService {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
upload(file: File) {
|
upload(file: File) {
|
||||||
if (!file) { return of<string>(); }
|
if (!file) { return; }
|
||||||
|
|
||||||
// COULD HAVE WRITTEN:
|
// COULD HAVE WRITTEN:
|
||||||
// return this.http.post('/upload/file', file, {
|
// return this.http.post('/upload/file', file, {
|
||||||
|
@ -41,6 +41,7 @@
|
|||||||
<!-- #enddocregion translated-plural -->
|
<!-- #enddocregion translated-plural -->
|
||||||
<!-- #docregion translated-select -->
|
<!-- #docregion translated-select -->
|
||||||
<!-- #docregion translate-select-1 -->
|
<!-- #docregion translate-select-1 -->
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="f99f34ac9bd4606345071bd813858dec29f3b7d1" datatype="html">
|
<trans-unit id="f99f34ac9bd4606345071bd813858dec29f3b7d1" datatype="html">
|
||||||
<source>The author is <x id="ICU" equiv-text="{gender, select, male {...} female {...} other {...}}"/></source>
|
<source>The author is <x id="ICU" equiv-text="{gender, select, male {...} female {...} other {...}}"/></source>
|
||||||
<target>L'auteur est <x id="ICU" equiv-text="{gender, select, male {...} female {...} other {...}}"/></target>
|
<target>L'auteur est <x id="ICU" equiv-text="{gender, select, male {...} female {...} other {...}}"/></target>
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
// TODO: Add unit tests for this file.
|
|
||||||
// tslint:disable: no-output-native
|
// tslint:disable: no-output-native
|
||||||
// #docregion
|
// #docregion
|
||||||
import { Component, Output, OnInit, EventEmitter, NgModule } from '@angular/core';
|
import { Component, Output, OnInit, EventEmitter, NgModule } from '@angular/core';
|
||||||
|
@ -2,11 +2,7 @@
|
|||||||
"tests": [
|
"tests": [
|
||||||
{
|
{
|
||||||
"cmd": "yarn",
|
"cmd": "yarn",
|
||||||
"args": ["tsc", "--project", "tsconfig.spec.json", "--module", "commonjs"]
|
"args": [ "tsc", "--project", "./tsconfig.app.json" ]
|
||||||
},
|
|
||||||
{
|
|
||||||
"cmd": "yarn",
|
|
||||||
"args": ["jasmine", "out-tsc/**/*.spec.js"]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
import { docRegionFromEvent, docRegionSubscriber } from './creating';
|
|
||||||
|
|
||||||
describe('observables', () => {
|
|
||||||
it('should create an observable using the constructor', () => {
|
|
||||||
const console = {log: jasmine.createSpy('log')};
|
|
||||||
docRegionSubscriber(console);
|
|
||||||
expect(console.log).toHaveBeenCalledTimes(4);
|
|
||||||
expect(console.log.calls.allArgs()).toEqual([
|
|
||||||
[1],
|
|
||||||
[2],
|
|
||||||
[3],
|
|
||||||
['Finished sequence'],
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should listen to input changes', () => {
|
|
||||||
let triggerInputChange;
|
|
||||||
const input = {
|
|
||||||
value: 'Test',
|
|
||||||
addEventListener: jasmine
|
|
||||||
.createSpy('addEvent')
|
|
||||||
.and.callFake((eventName: string, cb: (e) => void) => {
|
|
||||||
if (eventName === 'keydown') {
|
|
||||||
triggerInputChange = cb;
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
removeEventListener: jasmine.createSpy('removeEventListener'),
|
|
||||||
};
|
|
||||||
|
|
||||||
const document = { getElementById: () => input };
|
|
||||||
docRegionFromEvent(document);
|
|
||||||
triggerInputChange({keyCode: 65});
|
|
||||||
expect(input.value).toBe('Test');
|
|
||||||
|
|
||||||
triggerInputChange({keyCode: 27});
|
|
||||||
expect(input.value).toBe('');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should call removeEventListener when unsubscribing', (doneFn: DoneFn) => {
|
|
||||||
const input = {
|
|
||||||
addEventListener: jasmine.createSpy('addEvent'),
|
|
||||||
removeEventListener: jasmine
|
|
||||||
.createSpy('removeEvent')
|
|
||||||
.and.callFake((eventName: string, cb: (e) => void) => {
|
|
||||||
if (eventName === 'keydown') {
|
|
||||||
doneFn();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
const document = { getElementById: () => input };
|
|
||||||
const subscription = docRegionFromEvent(document);
|
|
||||||
subscription.unsubscribe();
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,39 +1,38 @@
|
|||||||
// #docplaster
|
|
||||||
|
|
||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
|
|
||||||
export function docRegionSubscriber(console) {
|
// #docregion subscriber
|
||||||
// #docregion subscriber
|
|
||||||
// This function runs when subscribe() is called
|
|
||||||
function sequenceSubscriber(observer) {
|
|
||||||
// synchronously deliver 1, 2, and 3, then complete
|
|
||||||
observer.next(1);
|
|
||||||
observer.next(2);
|
|
||||||
observer.next(3);
|
|
||||||
observer.complete();
|
|
||||||
|
|
||||||
// unsubscribe function doesn't need to do anything in this
|
// This function runs when subscribe() is called
|
||||||
// because values are delivered synchronously
|
function sequenceSubscriber(observer) {
|
||||||
return {unsubscribe() {}};
|
// synchronously deliver 1, 2, and 3, then complete
|
||||||
}
|
observer.next(1);
|
||||||
|
observer.next(2);
|
||||||
|
observer.next(3);
|
||||||
|
observer.complete();
|
||||||
|
|
||||||
// Create a new Observable that will deliver the above sequence
|
// unsubscribe function doesn't need to do anything in this
|
||||||
const sequence = new Observable(sequenceSubscriber);
|
// because values are delivered synchronously
|
||||||
|
return {unsubscribe() {}};
|
||||||
// execute the Observable and print the result of each notification
|
|
||||||
sequence.subscribe({
|
|
||||||
next(num) { console.log(num); },
|
|
||||||
complete() { console.log('Finished sequence'); }
|
|
||||||
});
|
|
||||||
|
|
||||||
// Logs:
|
|
||||||
// 1
|
|
||||||
// 2
|
|
||||||
// 3
|
|
||||||
// Finished sequence
|
|
||||||
// #enddocregion subscriber
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a new Observable that will deliver the above sequence
|
||||||
|
const sequence = new Observable(sequenceSubscriber);
|
||||||
|
|
||||||
|
// execute the Observable and print the result of each notification
|
||||||
|
sequence.subscribe({
|
||||||
|
next(num) { console.log(num); },
|
||||||
|
complete() { console.log('Finished sequence'); }
|
||||||
|
});
|
||||||
|
|
||||||
|
// Logs:
|
||||||
|
// 1
|
||||||
|
// 2
|
||||||
|
// 3
|
||||||
|
// Finished sequence
|
||||||
|
|
||||||
|
// #enddocregion subscriber
|
||||||
|
|
||||||
// #docregion fromevent
|
// #docregion fromevent
|
||||||
|
|
||||||
function fromEvent(target, eventName) {
|
function fromEvent(target, eventName) {
|
||||||
@ -52,18 +51,16 @@ function fromEvent(target, eventName) {
|
|||||||
|
|
||||||
// #enddocregion fromevent
|
// #enddocregion fromevent
|
||||||
|
|
||||||
export function docRegionFromEvent(document) {
|
// #docregion fromevent_use
|
||||||
// #docregion fromevent_use
|
|
||||||
|
|
||||||
const ESC_KEY = 27;
|
const ESC_KEY = 27;
|
||||||
const nameInput = document.getElementById('name') as HTMLInputElement;
|
const nameInput = document.getElementById('name') as HTMLInputElement;
|
||||||
|
|
||||||
const subscription = fromEvent(nameInput, 'keydown').subscribe((e: KeyboardEvent) => {
|
const subscription = fromEvent(nameInput, 'keydown')
|
||||||
|
.subscribe((e: KeyboardEvent) => {
|
||||||
if (e.keyCode === ESC_KEY) {
|
if (e.keyCode === ESC_KEY) {
|
||||||
nameInput.value = '';
|
nameInput.value = '';
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// #enddocregion fromevent_use
|
|
||||||
return subscription;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// #enddocregion fromevent_use
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// TODO: Add unit tests for this file.
|
|
||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
|
|
||||||
// #docregion
|
// #docregion
|
||||||
|
|
||||||
// Create an Observable that will start listening to geolocation updates
|
// Create an Observable that will start listening to geolocation updates
|
||||||
|
@ -1,48 +0,0 @@
|
|||||||
import { docRegionDelaySequence, docRegionMulticastSequence } from './multicasting';
|
|
||||||
|
|
||||||
describe('multicasting', () => {
|
|
||||||
let console;
|
|
||||||
beforeEach(() => {
|
|
||||||
jasmine.clock().install();
|
|
||||||
console = {log: jasmine.createSpy('log')};
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
jasmine.clock().uninstall();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create an observable and emit in sequence', () => {
|
|
||||||
docRegionDelaySequence(console);
|
|
||||||
jasmine.clock().tick(10000);
|
|
||||||
expect(console.log).toHaveBeenCalledTimes(12);
|
|
||||||
expect(console.log.calls.allArgs()).toEqual([
|
|
||||||
[1],
|
|
||||||
['1st subscribe: 1'],
|
|
||||||
['2nd subscribe: 1'],
|
|
||||||
[2],
|
|
||||||
['1st subscribe: 2'],
|
|
||||||
['2nd subscribe: 2'],
|
|
||||||
[3],
|
|
||||||
['Finished sequence'],
|
|
||||||
['1st subscribe: 3'],
|
|
||||||
['1st sequence finished.'],
|
|
||||||
['2nd subscribe: 3'],
|
|
||||||
['2nd sequence finished.']
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should create an observable and multicast the emissions', () => {
|
|
||||||
docRegionMulticastSequence(console);
|
|
||||||
jasmine.clock().tick(10000);
|
|
||||||
expect(console.log).toHaveBeenCalledTimes(7);
|
|
||||||
expect(console.log.calls.allArgs()).toEqual([
|
|
||||||
['1st subscribe: 1'],
|
|
||||||
['1st subscribe: 2'],
|
|
||||||
['2nd subscribe: 2'],
|
|
||||||
['1st subscribe: 3'],
|
|
||||||
['2nd subscribe: 3'],
|
|
||||||
['1st sequence finished.'],
|
|
||||||
['2nd sequence finished.']
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,160 +1,155 @@
|
|||||||
// #docplaster
|
|
||||||
|
|
||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
|
|
||||||
export function docRegionDelaySequence(console) {
|
// #docregion delay_sequence
|
||||||
// #docregion delay_sequence
|
|
||||||
function sequenceSubscriber(observer) {
|
|
||||||
const seq = [1, 2, 3];
|
|
||||||
let timeoutId;
|
|
||||||
|
|
||||||
// Will run through an array of numbers, emitting one value
|
function sequenceSubscriber(observer) {
|
||||||
// per second until it gets to the end of the array.
|
const seq = [1, 2, 3];
|
||||||
function doInSequence(arr, idx) {
|
let timeoutId;
|
||||||
timeoutId = setTimeout(() => {
|
|
||||||
observer.next(arr[idx]);
|
|
||||||
if (idx === arr.length - 1) {
|
|
||||||
observer.complete();
|
|
||||||
} else {
|
|
||||||
doInSequence(arr, ++idx);
|
|
||||||
}
|
|
||||||
}, 1000);
|
|
||||||
}
|
|
||||||
|
|
||||||
doInSequence(seq, 0);
|
// Will run through an array of numbers, emitting one value
|
||||||
|
|
||||||
// Unsubscribe should clear the timeout to stop execution
|
|
||||||
return {
|
|
||||||
unsubscribe() {
|
|
||||||
clearTimeout(timeoutId);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a new Observable that will deliver the above sequence
|
|
||||||
const sequence = new Observable(sequenceSubscriber);
|
|
||||||
|
|
||||||
sequence.subscribe({
|
|
||||||
next(num) { console.log(num); },
|
|
||||||
complete() { console.log('Finished sequence'); }
|
|
||||||
});
|
|
||||||
|
|
||||||
// Logs:
|
|
||||||
// (at 1 second): 1
|
|
||||||
// (at 2 seconds): 2
|
|
||||||
// (at 3 seconds): 3
|
|
||||||
// (at 3 seconds): Finished sequence
|
|
||||||
|
|
||||||
// #enddocregion delay_sequence
|
|
||||||
|
|
||||||
// #docregion subscribe_twice
|
|
||||||
|
|
||||||
// Subscribe starts the clock, and will emit after 1 second
|
|
||||||
sequence.subscribe({
|
|
||||||
next(num) { console.log('1st subscribe: ' + num); },
|
|
||||||
complete() { console.log('1st sequence finished.'); }
|
|
||||||
});
|
|
||||||
|
|
||||||
// After 1/2 second, subscribe again.
|
|
||||||
setTimeout(() => {
|
|
||||||
sequence.subscribe({
|
|
||||||
next(num) { console.log('2nd subscribe: ' + num); },
|
|
||||||
complete() { console.log('2nd sequence finished.'); }
|
|
||||||
});
|
|
||||||
}, 500);
|
|
||||||
|
|
||||||
// Logs:
|
|
||||||
// (at 1 second): 1st subscribe: 1
|
|
||||||
// (at 1.5 seconds): 2nd subscribe: 1
|
|
||||||
// (at 2 seconds): 1st subscribe: 2
|
|
||||||
// (at 2.5 seconds): 2nd subscribe: 2
|
|
||||||
// (at 3 seconds): 1st subscribe: 3
|
|
||||||
// (at 3 seconds): 1st sequence finished
|
|
||||||
// (at 3.5 seconds): 2nd subscribe: 3
|
|
||||||
// (at 3.5 seconds): 2nd sequence finished
|
|
||||||
|
|
||||||
// #enddocregion subscribe_twice
|
|
||||||
}
|
|
||||||
|
|
||||||
export function docRegionMulticastSequence(console) {
|
|
||||||
// #docregion multicast_sequence
|
|
||||||
function multicastSequenceSubscriber() {
|
|
||||||
const seq = [1, 2, 3];
|
|
||||||
// Keep track of each observer (one for every active subscription)
|
|
||||||
const observers = [];
|
|
||||||
// Still a single timeoutId because there will only ever be one
|
|
||||||
// set of values being generated, multicasted to each subscriber
|
|
||||||
let timeoutId;
|
|
||||||
|
|
||||||
// Return the subscriber function (runs when subscribe()
|
|
||||||
// function is invoked)
|
|
||||||
return observer => {
|
|
||||||
observers.push(observer);
|
|
||||||
// When this is the first subscription, start the sequence
|
|
||||||
if (observers.length === 1) {
|
|
||||||
timeoutId = doSequence({
|
|
||||||
next(val) {
|
|
||||||
// Iterate through observers and notify all subscriptions
|
|
||||||
observers.forEach(obs => obs.next(val));
|
|
||||||
},
|
|
||||||
complete() {
|
|
||||||
// Notify all complete callbacks
|
|
||||||
observers.slice(0).forEach(obs => obs.complete());
|
|
||||||
}
|
|
||||||
}, seq, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
unsubscribe() {
|
|
||||||
// Remove from the observers array so it's no longer notified
|
|
||||||
observers.splice(observers.indexOf(observer), 1);
|
|
||||||
// If there's no more listeners, do cleanup
|
|
||||||
if (observers.length === 0) {
|
|
||||||
clearTimeout(timeoutId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
// Run through an array of numbers, emitting one value
|
|
||||||
// per second until it gets to the end of the array.
|
// per second until it gets to the end of the array.
|
||||||
function doSequence(observer, arr, idx) {
|
function doInSequence(arr, idx) {
|
||||||
return setTimeout(() => {
|
timeoutId = setTimeout(() => {
|
||||||
observer.next(arr[idx]);
|
observer.next(arr[idx]);
|
||||||
if (idx === arr.length - 1) {
|
if (idx === arr.length - 1) {
|
||||||
observer.complete();
|
observer.complete();
|
||||||
} else {
|
} else {
|
||||||
doSequence(observer, arr, ++idx);
|
doInSequence(arr, ++idx);
|
||||||
}
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new Observable that will deliver the above sequence
|
doInSequence(seq, 0);
|
||||||
const multicastSequence = new Observable(multicastSequenceSubscriber());
|
|
||||||
|
|
||||||
// Subscribe starts the clock, and begins to emit after 1 second
|
// Unsubscribe should clear the timeout to stop execution
|
||||||
multicastSequence.subscribe({
|
return {unsubscribe() {
|
||||||
next(num) { console.log('1st subscribe: ' + num); },
|
clearTimeout(timeoutId);
|
||||||
complete() { console.log('1st sequence finished.'); }
|
}};
|
||||||
});
|
|
||||||
|
|
||||||
// After 1 1/2 seconds, subscribe again (should "miss" the first value).
|
|
||||||
setTimeout(() => {
|
|
||||||
multicastSequence.subscribe({
|
|
||||||
next(num) { console.log('2nd subscribe: ' + num); },
|
|
||||||
complete() { console.log('2nd sequence finished.'); }
|
|
||||||
});
|
|
||||||
}, 1500);
|
|
||||||
|
|
||||||
// Logs:
|
|
||||||
// (at 1 second): 1st subscribe: 1
|
|
||||||
// (at 2 seconds): 1st subscribe: 2
|
|
||||||
// (at 2 seconds): 2nd subscribe: 2
|
|
||||||
// (at 3 seconds): 1st subscribe: 3
|
|
||||||
// (at 3 seconds): 1st sequence finished
|
|
||||||
// (at 3 seconds): 2nd subscribe: 3
|
|
||||||
// (at 3 seconds): 2nd sequence finished
|
|
||||||
|
|
||||||
// #enddocregion multicast_sequence
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create a new Observable that will deliver the above sequence
|
||||||
|
const sequence = new Observable(sequenceSubscriber);
|
||||||
|
|
||||||
|
sequence.subscribe({
|
||||||
|
next(num) { console.log(num); },
|
||||||
|
complete() { console.log('Finished sequence'); }
|
||||||
|
});
|
||||||
|
|
||||||
|
// Logs:
|
||||||
|
// (at 1 second): 1
|
||||||
|
// (at 2 seconds): 2
|
||||||
|
// (at 3 seconds): 3
|
||||||
|
// (at 3 seconds): Finished sequence
|
||||||
|
|
||||||
|
// #enddocregion delay_sequence
|
||||||
|
|
||||||
|
// #docregion subscribe_twice
|
||||||
|
|
||||||
|
// Subscribe starts the clock, and will emit after 1 second
|
||||||
|
sequence.subscribe({
|
||||||
|
next(num) { console.log('1st subscribe: ' + num); },
|
||||||
|
complete() { console.log('1st sequence finished.'); }
|
||||||
|
});
|
||||||
|
|
||||||
|
// After 1/2 second, subscribe again.
|
||||||
|
setTimeout(() => {
|
||||||
|
sequence.subscribe({
|
||||||
|
next(num) { console.log('2nd subscribe: ' + num); },
|
||||||
|
complete() { console.log('2nd sequence finished.'); }
|
||||||
|
});
|
||||||
|
}, 500);
|
||||||
|
|
||||||
|
// Logs:
|
||||||
|
// (at 1 second): 1st subscribe: 1
|
||||||
|
// (at 1.5 seconds): 2nd subscribe: 1
|
||||||
|
// (at 2 seconds): 1st subscribe: 2
|
||||||
|
// (at 2.5 seconds): 2nd subscribe: 2
|
||||||
|
// (at 3 seconds): 1st subscribe: 3
|
||||||
|
// (at 3 seconds): 1st sequence finished
|
||||||
|
// (at 3.5 seconds): 2nd subscribe: 3
|
||||||
|
// (at 3.5 seconds): 2nd sequence finished
|
||||||
|
|
||||||
|
// #enddocregion subscribe_twice
|
||||||
|
|
||||||
|
// #docregion multicast_sequence
|
||||||
|
|
||||||
|
function multicastSequenceSubscriber() {
|
||||||
|
const seq = [1, 2, 3];
|
||||||
|
// Keep track of each observer (one for every active subscription)
|
||||||
|
const observers = [];
|
||||||
|
// Still a single timeoutId because there will only ever be one
|
||||||
|
// set of values being generated, multicasted to each subscriber
|
||||||
|
let timeoutId;
|
||||||
|
|
||||||
|
// Return the subscriber function (runs when subscribe()
|
||||||
|
// function is invoked)
|
||||||
|
return (observer) => {
|
||||||
|
observers.push(observer);
|
||||||
|
// When this is the first subscription, start the sequence
|
||||||
|
if (observers.length === 1) {
|
||||||
|
timeoutId = doSequence({
|
||||||
|
next(val) {
|
||||||
|
// Iterate through observers and notify all subscriptions
|
||||||
|
observers.forEach(obs => obs.next(val));
|
||||||
|
},
|
||||||
|
complete() {
|
||||||
|
// Notify all complete callbacks
|
||||||
|
observers.slice(0).forEach(obs => obs.complete());
|
||||||
|
}
|
||||||
|
}, seq, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
unsubscribe() {
|
||||||
|
// Remove from the observers array so it's no longer notified
|
||||||
|
observers.splice(observers.indexOf(observer), 1);
|
||||||
|
// If there's no more listeners, do cleanup
|
||||||
|
if (observers.length === 0) {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run through an array of numbers, emitting one value
|
||||||
|
// per second until it gets to the end of the array.
|
||||||
|
function doSequence(observer, arr, idx) {
|
||||||
|
return setTimeout(() => {
|
||||||
|
observer.next(arr[idx]);
|
||||||
|
if (idx === arr.length - 1) {
|
||||||
|
observer.complete();
|
||||||
|
} else {
|
||||||
|
doSequence(observer, arr, ++idx);
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a new Observable that will deliver the above sequence
|
||||||
|
const multicastSequence = new Observable(multicastSequenceSubscriber());
|
||||||
|
|
||||||
|
// Subscribe starts the clock, and begins to emit after 1 second
|
||||||
|
multicastSequence.subscribe({
|
||||||
|
next(num) { console.log('1st subscribe: ' + num); },
|
||||||
|
complete() { console.log('1st sequence finished.'); }
|
||||||
|
});
|
||||||
|
|
||||||
|
// After 1 1/2 seconds, subscribe again (should "miss" the first value).
|
||||||
|
setTimeout(() => {
|
||||||
|
multicastSequence.subscribe({
|
||||||
|
next(num) { console.log('2nd subscribe: ' + num); },
|
||||||
|
complete() { console.log('2nd sequence finished.'); }
|
||||||
|
});
|
||||||
|
}, 1500);
|
||||||
|
|
||||||
|
// Logs:
|
||||||
|
// (at 1 second): 1st subscribe: 1
|
||||||
|
// (at 2 seconds): 1st subscribe: 2
|
||||||
|
// (at 2 seconds): 2nd subscribe: 2
|
||||||
|
// (at 3 seconds): 1st subscribe: 3
|
||||||
|
// (at 3 seconds): 1st sequence finished
|
||||||
|
// (at 3 seconds): 2nd subscribe: 3
|
||||||
|
// (at 3 seconds): 2nd sequence finished
|
||||||
|
|
||||||
|
// #enddocregion multicast_sequence
|
||||||
|
@ -1,19 +0,0 @@
|
|||||||
import { docRegionObserver } from './subscribing';
|
|
||||||
|
|
||||||
describe('subscribing', () => {
|
|
||||||
it('should subscribe and emit', () => {
|
|
||||||
const console = {log: jasmine.createSpy('log')};
|
|
||||||
docRegionObserver(console);
|
|
||||||
expect(console.log).toHaveBeenCalledTimes(8);
|
|
||||||
expect(console.log.calls.allArgs()).toEqual([
|
|
||||||
['Observer got a next value: 1'],
|
|
||||||
['Observer got a next value: 2'],
|
|
||||||
['Observer got a next value: 3'],
|
|
||||||
['Observer got a complete notification'],
|
|
||||||
['Observer got a next value: 1'],
|
|
||||||
['Observer got a next value: 2'],
|
|
||||||
['Observer got a next value: 3'],
|
|
||||||
['Observer got a complete notification'],
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,35 +1,32 @@
|
|||||||
// #docplaster
|
|
||||||
import { of } from 'rxjs';
|
|
||||||
|
|
||||||
export function docRegionObserver(console) {
|
import { Observable, of } from 'rxjs';
|
||||||
// #docregion observer
|
|
||||||
|
|
||||||
// Create simple observable that emits three values
|
// #docregion observer
|
||||||
const myObservable = of(1, 2, 3);
|
|
||||||
|
|
||||||
// Create observer object
|
// Create simple observable that emits three values
|
||||||
const myObserver = {
|
const myObservable = of(1, 2, 3);
|
||||||
next: x => console.log('Observer got a next value: ' + x),
|
|
||||||
error: err => console.error('Observer got an error: ' + err),
|
|
||||||
complete: () => console.log('Observer got a complete notification'),
|
|
||||||
};
|
|
||||||
|
|
||||||
// Execute with the observer object
|
// Create observer object
|
||||||
myObservable.subscribe(myObserver);
|
const myObserver = {
|
||||||
|
next: x => console.log('Observer got a next value: ' + x),
|
||||||
|
error: err => console.error('Observer got an error: ' + err),
|
||||||
|
complete: () => console.log('Observer got a complete notification'),
|
||||||
|
};
|
||||||
|
|
||||||
// Logs:
|
// Execute with the observer object
|
||||||
// Observer got a next value: 1
|
myObservable.subscribe(myObserver);
|
||||||
// Observer got a next value: 2
|
// Logs:
|
||||||
// Observer got a next value: 3
|
// Observer got a next value: 1
|
||||||
// Observer got a complete notification
|
// Observer got a next value: 2
|
||||||
|
// Observer got a next value: 3
|
||||||
|
// Observer got a complete notification
|
||||||
|
|
||||||
// #enddocregion observer
|
// #enddocregion observer
|
||||||
|
|
||||||
// #docregion sub_fn
|
// #docregion sub_fn
|
||||||
myObservable.subscribe(
|
myObservable.subscribe(
|
||||||
x => console.log('Observer got a next value: ' + x),
|
x => console.log('Observer got a next value: ' + x),
|
||||||
err => console.error('Observer got an error: ' + err),
|
err => console.error('Observer got an error: ' + err),
|
||||||
() => console.log('Observer got a complete notification')
|
() => console.log('Observer got a complete notification')
|
||||||
);
|
);
|
||||||
// #enddocregion sub_fn
|
// #enddocregion sub_fn
|
||||||
}
|
|
||||||
|
@ -2,11 +2,7 @@
|
|||||||
"tests": [
|
"tests": [
|
||||||
{
|
{
|
||||||
"cmd": "yarn",
|
"cmd": "yarn",
|
||||||
"args": ["tsc", "--project", "tsconfig.spec.json", "--module", "commonjs"]
|
"args": [ "tsc", "--project", "./tsconfig.app.json" ]
|
||||||
},
|
|
||||||
{
|
|
||||||
"cmd": "yarn",
|
|
||||||
"args": ["jasmine", "out-tsc/**/*.spec.js"]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,70 +0,0 @@
|
|||||||
import { interval } from 'rxjs';
|
|
||||||
import { tap } from 'rxjs/operators';
|
|
||||||
import { backoff } from './backoff';
|
|
||||||
|
|
||||||
describe('backoff()', () => {
|
|
||||||
beforeEach(() => jasmine.clock().install());
|
|
||||||
afterEach(() => jasmine.clock().uninstall());
|
|
||||||
|
|
||||||
it('should retry in case of error', () => {
|
|
||||||
const mockConsole = {log: jasmine.createSpy('log')};
|
|
||||||
const source = interval(10).pipe(
|
|
||||||
tap(i => {
|
|
||||||
if (i > 0) {
|
|
||||||
throw new Error('Test error');
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
backoff(3, 100),
|
|
||||||
);
|
|
||||||
source.subscribe({
|
|
||||||
next: v => mockConsole.log(`Emitted: ${v}`),
|
|
||||||
error: e => mockConsole.log(`Errored: ${e.message || e}`),
|
|
||||||
complete: () => mockConsole.log('Completed'),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Initial try:
|
|
||||||
// Errors on second emission and schedules retrying (with delay).
|
|
||||||
jasmine.clock().tick(10);
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([['Emitted: 0']]);
|
|
||||||
|
|
||||||
jasmine.clock().tick(10);
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([['Emitted: 0']]);
|
|
||||||
mockConsole.log.calls.reset();
|
|
||||||
|
|
||||||
// First re-attempt after 100ms:
|
|
||||||
// Errors again on second emission and schedules retrying (with larger delay).
|
|
||||||
jasmine.clock().tick(100);
|
|
||||||
expect(mockConsole.log).not.toHaveBeenCalled();
|
|
||||||
|
|
||||||
jasmine.clock().tick(10);
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([['Emitted: 0']]);
|
|
||||||
|
|
||||||
jasmine.clock().tick(10);
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([['Emitted: 0']]);
|
|
||||||
mockConsole.log.calls.reset();
|
|
||||||
|
|
||||||
// Second re-attempt after 400ms:
|
|
||||||
// Errors again on second emission and schedules retrying (with even larger delay).
|
|
||||||
jasmine.clock().tick(400);
|
|
||||||
expect(mockConsole.log).not.toHaveBeenCalled();
|
|
||||||
|
|
||||||
jasmine.clock().tick(10);
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([['Emitted: 0']]);
|
|
||||||
|
|
||||||
jasmine.clock().tick(10);
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([['Emitted: 0']]);
|
|
||||||
mockConsole.log.calls.reset();
|
|
||||||
|
|
||||||
// Third re-attempt after 900ms:
|
|
||||||
// Errors again on second emission and gives up (no retrying).
|
|
||||||
jasmine.clock().tick(900);
|
|
||||||
expect(mockConsole.log).not.toHaveBeenCalled();
|
|
||||||
|
|
||||||
jasmine.clock().tick(10);
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([['Emitted: 0']]);
|
|
||||||
mockConsole.log.calls.reset();
|
|
||||||
|
|
||||||
jasmine.clock().tick(10);
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([['Errored: Test error']]);
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,32 +1,23 @@
|
|||||||
// #docplaster
|
|
||||||
// #docregion
|
|
||||||
import { of, pipe, range, throwError, timer, zip } from 'rxjs';
|
|
||||||
import { ajax } from 'rxjs/ajax';
|
|
||||||
import { map, mergeMap, retryWhen } from 'rxjs/operators';
|
|
||||||
|
|
||||||
export function backoff(maxTries, delay) {
|
import { pipe, range, timer, zip } from 'rxjs';
|
||||||
return pipe(
|
import { ajax } from 'rxjs/ajax';
|
||||||
retryWhen(attempts =>
|
import { retryWhen, map, mergeMap } from 'rxjs/operators';
|
||||||
zip(range(1, maxTries + 1), attempts).pipe(
|
|
||||||
mergeMap(([i, err]) => (i > maxTries) ? throwError(err) : of(i)),
|
function backoff(maxTries, ms) {
|
||||||
map(i => i * i),
|
return pipe(
|
||||||
mergeMap(v => timer(v * delay)),
|
retryWhen(attempts => zip(range(1, maxTries), attempts)
|
||||||
),
|
.pipe(
|
||||||
),
|
map(([i]) => i * i),
|
||||||
);
|
mergeMap(i => timer(i * ms))
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// #enddocregion
|
|
||||||
/*
|
|
||||||
This function declaration is necessary to ensure that it does not get called
|
|
||||||
when running the unit tests. It will not get rendered into the docs.
|
|
||||||
The indentation needs to start in the leftmost level position as well because of how
|
|
||||||
the docplaster combines the different regions together.
|
|
||||||
*/
|
|
||||||
function docRegionAjaxCall() {
|
|
||||||
// #docregion
|
|
||||||
ajax('/api/endpoint')
|
ajax('/api/endpoint')
|
||||||
.pipe(backoff(3, 250))
|
.pipe(backoff(3, 250))
|
||||||
.subscribe(function handleData(data) { /* ... */ });
|
.subscribe(data => handleData(data));
|
||||||
// #enddocregion
|
|
||||||
|
function handleData(data) {
|
||||||
|
// ...
|
||||||
}
|
}
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
import { of } from 'rxjs';
|
|
||||||
import { docRegionTypeahead } from './typeahead';
|
|
||||||
|
|
||||||
describe('typeahead', () => {
|
|
||||||
let document;
|
|
||||||
let ajax;
|
|
||||||
let triggertInputChange;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
jasmine.clock().install();
|
|
||||||
const input = {
|
|
||||||
addEventListener: jasmine
|
|
||||||
.createSpy('addEvent')
|
|
||||||
.and.callFake((eventName: string, cb: (e) => void) => {
|
|
||||||
if (eventName === 'input') {
|
|
||||||
triggertInputChange = cb;
|
|
||||||
}
|
|
||||||
}),
|
|
||||||
removeEventListener: jasmine.createSpy('removeEvent'),
|
|
||||||
};
|
|
||||||
|
|
||||||
document = { getElementById: (id: string) => input };
|
|
||||||
ajax = jasmine.createSpy('ajax').and.callFake((url: string) => of('foo bar'));
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
jasmine.clock().uninstall();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should make an ajax call to the corrent endpoint', () => {
|
|
||||||
docRegionTypeahead(document, ajax);
|
|
||||||
triggertInputChange({ target: { value: 'foo' } });
|
|
||||||
jasmine.clock().tick(11);
|
|
||||||
expect(ajax).toHaveBeenCalledWith('/api/endpoint?search=foo');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not make an ajax call, when the input length < 3', () => {
|
|
||||||
docRegionTypeahead(document, ajax);
|
|
||||||
triggertInputChange({ target: { value: '' } });
|
|
||||||
jasmine.clock().tick(11);
|
|
||||||
expect(ajax).not.toHaveBeenCalled();
|
|
||||||
triggertInputChange({ target: { value: 'fo' } });
|
|
||||||
jasmine.clock().tick(11);
|
|
||||||
expect(ajax).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not make an ajax call for intermediate values when debouncing', () => {
|
|
||||||
docRegionTypeahead(document, ajax);
|
|
||||||
triggertInputChange({ target: { value: 'foo' } });
|
|
||||||
jasmine.clock().tick(9);
|
|
||||||
triggertInputChange({ target: { value: 'bar' } });
|
|
||||||
jasmine.clock().tick(9);
|
|
||||||
triggertInputChange({ target: { value: 'baz' } });
|
|
||||||
jasmine.clock().tick(9);
|
|
||||||
triggertInputChange({ target: { value: 'qux' } });
|
|
||||||
expect(ajax).not.toHaveBeenCalled();
|
|
||||||
jasmine.clock().tick(10);
|
|
||||||
expect(ajax).toHaveBeenCalledTimes(1);
|
|
||||||
expect(ajax).toHaveBeenCalledWith('/api/endpoint?search=qux');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should not make an ajax call, when the input value has not changed', () => {
|
|
||||||
docRegionTypeahead(document, ajax);
|
|
||||||
triggertInputChange({ target: { value: 'foo' } });
|
|
||||||
jasmine.clock().tick(11);
|
|
||||||
expect(ajax).toHaveBeenCalled();
|
|
||||||
ajax.calls.reset();
|
|
||||||
triggertInputChange({ target: { value: 'foo' } });
|
|
||||||
jasmine.clock().tick(11);
|
|
||||||
expect(ajax).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,32 +1,18 @@
|
|||||||
/*
|
import { fromEvent } from 'rxjs';
|
||||||
Because of how the code is merged together using the doc regions,
|
import { ajax } from 'rxjs/ajax';
|
||||||
we need to indent the imports with the function below.
|
import { debounceTime, distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators';
|
||||||
*/
|
|
||||||
// #docplaster
|
|
||||||
// #docregion
|
|
||||||
import { fromEvent } from 'rxjs';
|
|
||||||
import { ajax } from 'rxjs/ajax';
|
|
||||||
import { debounceTime, distinctUntilChanged, filter, map, switchMap } from 'rxjs/operators';
|
|
||||||
|
|
||||||
// #enddocregion
|
|
||||||
/* tslint:disable:no-shadowed-variable */
|
|
||||||
/* tslint:disable:align */
|
|
||||||
export function docRegionTypeahead(document, ajax) {
|
|
||||||
// #docregion
|
|
||||||
const searchBox = document.getElementById('search-box');
|
|
||||||
|
|
||||||
const typeahead = fromEvent(searchBox, 'input').pipe(
|
const searchBox = document.getElementById('search-box');
|
||||||
map((e: KeyboardEvent) => (e.target as HTMLInputElement).value),
|
|
||||||
filter(text => text.length > 2),
|
|
||||||
debounceTime(10),
|
|
||||||
distinctUntilChanged(),
|
|
||||||
switchMap(searchTerm => ajax(`/api/endpoint?search=${searchTerm}`))
|
|
||||||
);
|
|
||||||
|
|
||||||
typeahead.subscribe(data => {
|
const typeahead = fromEvent(searchBox, 'input').pipe(
|
||||||
// Handle the data from the API
|
map((e: KeyboardEvent) => (e.target as HTMLInputElement).value),
|
||||||
});
|
filter(text => text.length > 2),
|
||||||
|
debounceTime(10),
|
||||||
|
distinctUntilChanged(),
|
||||||
|
switchMap(() => ajax('/api/endpoint'))
|
||||||
|
);
|
||||||
|
|
||||||
// #enddocregion
|
typeahead.subscribe(data => {
|
||||||
return typeahead;
|
// Handle the data from the API
|
||||||
}
|
});
|
||||||
|
@ -7,15 +7,9 @@ import { Component } from '@angular/core';
|
|||||||
styleUrls: ['./app.component.css']
|
styleUrls: ['./app.component.css']
|
||||||
})
|
})
|
||||||
export class AppComponent {
|
export class AppComponent {
|
||||||
// #docregion item-image
|
|
||||||
itemImageUrl = '../assets/phone.png';
|
itemImageUrl = '../assets/phone.png';
|
||||||
// #enddocregion item-image
|
|
||||||
// #docregion boolean
|
|
||||||
isUnchanged = true;
|
isUnchanged = true;
|
||||||
// #enddocregion boolean
|
|
||||||
// #docregion directive-property
|
|
||||||
classes = 'special';
|
classes = 'special';
|
||||||
// #enddocregion directive-property
|
|
||||||
// #docregion parent-data-type
|
// #docregion parent-data-type
|
||||||
parentItem = 'lamp';
|
parentItem = 'lamp';
|
||||||
// #enddocregion parent-data-type
|
// #enddocregion parent-data-type
|
||||||
|
@ -2,11 +2,7 @@
|
|||||||
"tests": [
|
"tests": [
|
||||||
{
|
{
|
||||||
"cmd": "yarn",
|
"cmd": "yarn",
|
||||||
"args": ["tsc", "--project", "tsconfig.spec.json", "--module", "commonjs"]
|
"args": [ "tsc", "--project", "./tsconfig.app.json" ]
|
||||||
},
|
|
||||||
{
|
|
||||||
"cmd": "yarn",
|
|
||||||
"args": ["jasmine", "out-tsc/**/*.spec.js"]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -1,46 +0,0 @@
|
|||||||
import { Subject, throwError } from 'rxjs';
|
|
||||||
import { docRegionDefault } from './error-handling';
|
|
||||||
|
|
||||||
describe('error-handling', () => {
|
|
||||||
let mockConsole;
|
|
||||||
let ajaxSubject;
|
|
||||||
let ajax;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
mockConsole = {log: jasmine.createSpy('log')};
|
|
||||||
ajaxSubject = new Subject();
|
|
||||||
ajax = jasmine
|
|
||||||
.createSpy('ajax')
|
|
||||||
.and.callFake((url: string) => ajaxSubject);
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => ajaxSubject.unsubscribe());
|
|
||||||
|
|
||||||
it('should return the response object', () => {
|
|
||||||
docRegionDefault(mockConsole, ajax);
|
|
||||||
|
|
||||||
ajaxSubject.next({response: {foo: 'bar'}});
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([
|
|
||||||
['data: ', {foo: 'bar'}]
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return an empty array when using an object without a `response` property', () => {
|
|
||||||
docRegionDefault(mockConsole, ajax);
|
|
||||||
|
|
||||||
ajaxSubject.next({foo: 'bar'});
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([
|
|
||||||
['data: ', []]
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('should return an empty array when the ajax observable errors', () => {
|
|
||||||
ajax.and.returnValue(throwError('Test Error'));
|
|
||||||
|
|
||||||
docRegionDefault(mockConsole, ajax);
|
|
||||||
|
|
||||||
expect(mockConsole.log.calls.allArgs()).toEqual([
|
|
||||||
['data: ', []]
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,36 +1,25 @@
|
|||||||
// #docplaster
|
|
||||||
/*
|
import { of } from 'rxjs';
|
||||||
Because of how the code is merged together using the doc regions,
|
|
||||||
we need to indent the imports with the function below.
|
|
||||||
*/
|
|
||||||
/* tslint:disable:no-shadowed-variable */
|
|
||||||
/* tslint:disable:align */
|
|
||||||
// #docregion
|
// #docregion
|
||||||
import { of } from 'rxjs';
|
|
||||||
import { ajax } from 'rxjs/ajax';
|
import { ajax } from 'rxjs/ajax';
|
||||||
import { map, catchError } from 'rxjs/operators';
|
import { map, catchError } from 'rxjs/operators';
|
||||||
|
// Return "response" from the API. If an error happens,
|
||||||
|
// return an empty array.
|
||||||
|
const apiData = ajax('/api/data').pipe(
|
||||||
|
map(res => {
|
||||||
|
if (!res.response) {
|
||||||
|
throw new Error('Value expected!');
|
||||||
|
}
|
||||||
|
return res.response;
|
||||||
|
}),
|
||||||
|
catchError(err => of([]))
|
||||||
|
);
|
||||||
|
|
||||||
|
apiData.subscribe({
|
||||||
|
next(x) { console.log('data: ', x); },
|
||||||
|
error(err) { console.log('errors already caught... will not run'); }
|
||||||
|
});
|
||||||
|
|
||||||
// #enddocregion
|
// #enddocregion
|
||||||
|
|
||||||
export function docRegionDefault(console, ajax) {
|
|
||||||
// #docregion
|
|
||||||
// Return "response" from the API. If an error happens,
|
|
||||||
// return an empty array.
|
|
||||||
const apiData = ajax('/api/data').pipe(
|
|
||||||
map((res: any) => {
|
|
||||||
if (!res.response) {
|
|
||||||
throw new Error('Value expected!');
|
|
||||||
}
|
|
||||||
return res.response;
|
|
||||||
}),
|
|
||||||
catchError(err => of([]))
|
|
||||||
);
|
|
||||||
|
|
||||||
apiData.subscribe({
|
|
||||||
next(x) { console.log('data: ', x); },
|
|
||||||
error(err) { console.log('errors already caught... will not run'); }
|
|
||||||
});
|
|
||||||
|
|
||||||
// #enddocregion
|
|
||||||
return apiData;
|
|
||||||
}
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user