From 2e3cc45c7489726f934dce433c7ef4643b075556 Mon Sep 17 00:00:00 2001 From: Cody Schroeder Date: Wed, 13 Feb 2019 09:16:27 -0800 Subject: [PATCH 0001/1073] build(bazel): specify tsconfig-test dependency (#28696) PR Close #28696 --- packages/BUILD.bazel | 8 +++++++- packages/examples/testing/BUILD.bazel | 2 +- tools/defaults.bzl | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 19740997a1..e418573b1a 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -2,10 +2,10 @@ package(default_visibility = ["//visibility:public"]) exports_files([ "tsconfig-build.json", - "tsconfig-test.json", "tsconfig.json", ]) +load("@build_bazel_rules_typescript//:defs.bzl", "ts_config") load("//tools:defaults.bzl", "ts_library") ts_library( @@ -17,6 +17,12 @@ ts_library( ], ) +ts_config( + name = "tsconfig-test", + src = "tsconfig-test.json", + deps = [":tsconfig-build.json"], +) + exports_files([ "license-banner.txt", "README.md", diff --git a/packages/examples/testing/BUILD.bazel b/packages/examples/testing/BUILD.bazel index c8c586c77d..00d2cae68d 100644 --- a/packages/examples/testing/BUILD.bazel +++ b/packages/examples/testing/BUILD.bazel @@ -5,7 +5,7 @@ load("//tools:defaults.bzl", "ts_library") ts_library( name = "testing_examples", srcs = glob(["**/*.ts"]), - tsconfig = "//packages:tsconfig-test.json", + tsconfig = "//packages:tsconfig-test", deps = [ "@ngdeps//@types/jasmine", "@ngdeps//@types/node", diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 377c7057a1..514484d7ce 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -7,7 +7,7 @@ load("//packages/bazel:index.bzl", _ng_module = "ng_module", _ng_package = "ng_p load("//packages/bazel/src:ng_rollup_bundle.bzl", _ng_rollup_bundle = "ng_rollup_bundle") _DEFAULT_TSCONFIG_BUILD = "//packages:tsconfig-build.json" -_DEFAULT_TSCONFIG_TEST = "//packages:tsconfig-test.json" +_DEFAULT_TSCONFIG_TEST = "//packages:tsconfig-test" _DEFAULT_TS_TYPINGS = "@ngdeps//typescript:typescript__typings" _DEFAULT_KARMA_BIN = "@ngdeps//@bazel/karma/bin:karma" _INTERNAL_NG_MODULE_COMPILER = "//packages/bazel/src/ngc-wrapped" From c1094cf46f292796ecd25f9096a7d91744498ed8 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 14 Feb 2019 16:28:31 +0100 Subject: [PATCH 0002/1073] refactor(ivy): remove duplicated getRootView function (#28732) PR Close #28732 --- packages/core/src/render3/component.ts | 4 ++-- packages/core/src/render3/discovery_utils.ts | 25 +------------------- 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/packages/core/src/render3/component.ts b/packages/core/src/render3/component.ts index 12f99a30c0..d586a2640e 100644 --- a/packages/core/src/render3/component.ts +++ b/packages/core/src/render3/component.ts @@ -18,12 +18,12 @@ import {getComponentDef} from './definition'; import {diPublicInInjector, getOrCreateNodeInjectorForNode} from './di'; import {publishDefaultGlobalUtils} from './global_utils'; import {registerPostOrderHooks, registerPreOrderHooks} from './hooks'; -import {CLEAN_PROMISE, addToViewTree, createLView, createNodeAtIndex, createTNode, createTView, getOrCreateTView, initNodeFlags, instantiateRootComponent, invokeHostBindingsInCreationMode, locateHostElement, queueComponentIndexForCheck, refreshDescendantViews} from './instructions'; +import {CLEAN_PROMISE, addToViewTree, createLView, createNodeAtIndex, createTView, getOrCreateTView, initNodeFlags, instantiateRootComponent, invokeHostBindingsInCreationMode, locateHostElement, queueComponentIndexForCheck, refreshDescendantViews} from './instructions'; import {ComponentDef, ComponentType, RenderFlags} from './interfaces/definition'; import {TElementNode, TNode, TNodeFlags, TNodeType} from './interfaces/node'; import {PlayerHandler} from './interfaces/player'; import {RElement, Renderer3, RendererFactory3, domRendererFactory3} from './interfaces/renderer'; -import {CONTEXT, FLAGS, HEADER_OFFSET, HOST, LView, LViewFlags, RootContext, RootContextFlags, TVIEW, T_HOST} from './interfaces/view'; +import {CONTEXT, FLAGS, HEADER_OFFSET, LView, LViewFlags, RootContext, RootContextFlags, TVIEW} from './interfaces/view'; import {enterView, getPreviousOrParentTNode, leaveView, resetComponentState, setCurrentDirectiveDef} from './state'; import {applyOnCreateInstructions, defaultScheduler, getRootView, readPatchedLView, renderStringify} from './util'; diff --git a/packages/core/src/render3/discovery_utils.ts b/packages/core/src/render3/discovery_utils.ts index 31701cd30c..a24f83be4b 100644 --- a/packages/core/src/render3/discovery_utils.ts +++ b/packages/core/src/render3/discovery_utils.ts @@ -8,14 +8,13 @@ import {Injector} from '../di/injector'; -import {assertDefined} from '../util/assert'; import {discoverLocalRefs, getComponentAtNodeIndex, getDirectivesAtNodeIndex, getLContext} from './context_discovery'; import {NodeInjector} from './di'; import {LContext} from './interfaces/context'; import {DirectiveDef} from './interfaces/definition'; import {TElementNode, TNode, TNodeProviderIndexes} from './interfaces/node'; import {CLEANUP, CONTEXT, FLAGS, HOST, LView, LViewFlags, PARENT, RootContext, TVIEW} from './interfaces/view'; -import {readElementValue, readPatchedLView, renderStringify} from './util'; +import {getRootView, readElementValue, renderStringify} from './util'; @@ -207,28 +206,6 @@ export function loadLContext(target: {}, throwOnNotFound: boolean = true): LCont return context; } -/** - * Retrieve the root view from any component by walking the parent `LView` until - * reaching the root `LView`. - * - * @param componentOrView any component or view - * - */ -export function getRootView(componentOrView: LView | {}): LView { - let lView: LView; - if (Array.isArray(componentOrView)) { - ngDevMode && assertDefined(componentOrView, 'lView'); - lView = componentOrView as LView; - } else { - ngDevMode && assertDefined(componentOrView, 'component'); - lView = readPatchedLView(componentOrView) !; - } - while (lView && !(lView[FLAGS] & LViewFlags.IsRoot)) { - lView = lView[PARENT] !; - } - return lView; -} - /** * Retrieve map of local references. * From 911599d9a325625fa515595c49fb801ea41efec2 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Thu, 14 Feb 2019 12:00:47 -0800 Subject: [PATCH 0003/1073] test(ivy): mark unknown binding test modifiedInIvy (#28740) This commit turns off an unknown binding test that is specific to the View Engine implementation. In Ivy, we do property validation at runtime for jit, so this test does not apply. PR Close #28740 --- .../core/test/linker/source_map_integration_node_only_spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/linker/source_map_integration_node_only_spec.ts b/packages/core/test/linker/source_map_integration_node_only_spec.ts index 1ea8e36f62..09ea288ace 100644 --- a/packages/core/test/linker/source_map_integration_node_only_spec.ts +++ b/packages/core/test/linker/source_map_integration_node_only_spec.ts @@ -261,7 +261,7 @@ describe('jit source mapping', () => { })); - fixmeIvy('FW-511: Report template typing errors') + modifiedInIvy('Unknown binding errors have been moved to runtime in Ivy') .it('should use the right source url in template parse errors', fakeAsync(() => { const template = '
\n
'; @Component({...templateDecorator(template)}) From 04a1923af7958e2c454cdd270ac7bd0c6badb7d1 Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Thu, 14 Feb 2019 17:25:48 -0800 Subject: [PATCH 0004/1073] ci: add /packages/* to the @angular/fw-dev-infra CODEOWNERS group (#28745) It was previously missing which is a bug. PR Close #28745 --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 6e593be73a..779cb813e4 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -744,6 +744,7 @@ testing/** @angular/fw-test /.circleci/** @angular/fw-dev-infra /.github/** @angular/fw-dev-infra /docs/BAZEL.md @angular/fw-dev-infra +/packages/* @angular/fw-dev-infra /scripts/** @angular/fw-dev-infra /third_party/** @angular/fw-dev-infra /tools/** @angular/fw-dev-infra From 1e6ed52cbad3979f594dd43780aeae653befd6d6 Mon Sep 17 00:00:00 2001 From: Marc Laval Date: Fri, 15 Feb 2019 12:53:58 +0100 Subject: [PATCH 0005/1073] fix(docs-infra): all examples should get Ivy boilerplate (#28757) PR Close #28757 --- aio/tools/examples/example-boilerplate.js | 7 ++++--- aio/tools/examples/run-example-e2e.js | 3 --- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/aio/tools/examples/example-boilerplate.js b/aio/tools/examples/example-boilerplate.js index 53fecd1d2a..6268181bc6 100644 --- a/aio/tools/examples/example-boilerplate.js +++ b/aio/tools/examples/example-boilerplate.js @@ -124,9 +124,10 @@ class ExampleBoilerPlate { BOILERPLATE_PATHS.common.forEach(filePath => this.copyFile(BOILERPLATE_COMMON_BASE_PATH, exampleFolder, filePath)); // Copy Ivy specific files - if (ivy && BOILERPLATE_PATHS.ivy[boilerPlateType]) { - const ivyBoilerPlateBasePath = path.resolve(BOILERPLATE_BASE_PATH, 'ivy', boilerPlateType); - BOILERPLATE_PATHS.ivy[boilerPlateType].forEach(filePath => this.copyFile(ivyBoilerPlateBasePath, exampleFolder, filePath)); + if (ivy) { + const ivyBoilerPlateType = boilerPlateType === 'systemjs' ? 'systemjs' : 'cli'; + const ivyBoilerPlateBasePath = path.resolve(BOILERPLATE_BASE_PATH, 'ivy', ivyBoilerPlateType); + BOILERPLATE_PATHS.ivy[ivyBoilerPlateType].forEach(filePath => this.copyFile(ivyBoilerPlateBasePath, exampleFolder, filePath)); } }); } diff --git a/aio/tools/examples/run-example-e2e.js b/aio/tools/examples/run-example-e2e.js index 4049a2b1f3..91207ab776 100644 --- a/aio/tools/examples/run-example-e2e.js +++ b/aio/tools/examples/run-example-e2e.js @@ -23,9 +23,6 @@ const IGNORED_EXAMPLES = [ const fixmeIvyExamples = [ // fixmeIvy('unknown') failed content projection and applied styles 'component-styles', - // fixmeIvy('unknown') ERROR Error: Unable to find context associated with [object - // HTMLInputElement] - 'http', // fixmeIvy('unknown') app fails at runtime due to missing external service (goog is undefined) 'i18n' ]; From fdca0013d58bebf2ae7957252ce2135f3e69a964 Mon Sep 17 00:00:00 2001 From: Adam Plumer Date: Fri, 15 Feb 2019 15:18:44 -0600 Subject: [PATCH 0006/1073] feat: upgrade domino to v2.1.2 (#28767) PR Close #28767 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f4340a285e..abc164a37b 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "convert-source-map": "^1.5.1", "dependency-graph": "^0.7.2", "diff": "^3.5.0", - "domino": "2.1.0", + "domino": "2.1.2", "fs-extra": "4.0.2", "hammerjs": "2.0.8", "incremental-dom": "0.4.1", diff --git a/yarn.lock b/yarn.lock index 1134230fdd..f2e89c7ee9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2983,10 +2983,10 @@ domain-browser@^1.1.1: resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -domino@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.0.tgz#653ba7d331441113b42e40ba05f24253ec86e02e" - integrity sha512-xINSODvrnuQcm3eXJN4IkBR+JxqLrJN8Ge4fd00y1b7HsY0A4huKN5BflSS/oo8quBWmocTfWdFvrw2H8TjGqQ== +domino@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.2.tgz#70e8367839ee8ad8bde3aeb4857cf3d93bd98b85" + integrity sha512-nzg76s4Smji9teyLwOnqqUCdFVOho+OQFqUwp+42Wo+SEZ1FGw7uhemv6OKk2qp8YIgnGB3jVt0sJWU96wbPgA== dot-prop@^3.0.0: version "3.0.0" From 3c7ce823a3c8809f71667a8849a1f136c824a621 Mon Sep 17 00:00:00 2001 From: Marc Laval Date: Fri, 15 Feb 2019 16:43:48 +0100 Subject: [PATCH 0007/1073] test(ivy): add root cause for failing component-styles docs e2e tests (#28760) PR Close #28760 --- aio/tools/examples/run-example-e2e.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/tools/examples/run-example-e2e.js b/aio/tools/examples/run-example-e2e.js index 91207ab776..25e9f03804 100644 --- a/aio/tools/examples/run-example-e2e.js +++ b/aio/tools/examples/run-example-e2e.js @@ -21,7 +21,7 @@ const IGNORED_EXAMPLES = [ ]; const fixmeIvyExamples = [ - // fixmeIvy('unknown') failed content projection and applied styles + // fixmeIvy('FW-1069: ngtsc does not support inline ` tags, whose content would be converted to HTML text nodes. In order to fix this, the sanitizer's behavior was changed in #25879 to ignore the content of _all_ unsafe elements. While this fixed the problem with `` tags, it unnecessarily removed the contents for _any_ unsafe element. This was an unneeded breaking change. This commit partially restores the old sanitizer behavior (namely traversing content of unsafe elements), but introduces a list of elements whose content should not be traversed if the elements themselves are considered unsafe. Currently, this list contains `style`, `script` and `template`. Related to #25879 and #26007. Fixes #28427 PR Close #28804 --- .../core/src/sanitization/html_sanitizer.ts | 25 ++++++---- .../test/sanitization/html_sanitizer_spec.ts | 49 ++++++++++++------- 2 files changed, 48 insertions(+), 26 deletions(-) diff --git a/packages/core/src/sanitization/html_sanitizer.ts b/packages/core/src/sanitization/html_sanitizer.ts index eb39f31a13..c6c9a89cae 100644 --- a/packages/core/src/sanitization/html_sanitizer.ts +++ b/packages/core/src/sanitization/html_sanitizer.ts @@ -83,6 +83,13 @@ const HTML_ATTRS = tagSet( export const VALID_ATTRS = merge(URI_ATTRS, SRCSET_ATTRS, HTML_ATTRS); +// Elements whose content should not be traversed/preserved, if the elements themselves are invalid. +// +// Typically, `Some content` would traverse (and in this case preserve) +// `Some content`, but strip `invalid-element` opening/closing tags. For some elements, though, we +// don't want to preserve the content, if the elements themselves are going to be removed. +const SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS = tagSet('script,style,template'); + /** * SanitizingHtmlSerializer serializes a DOM fragment, stripping out any unsafe elements and unsafe * attributes. @@ -98,17 +105,17 @@ class SanitizingHtmlSerializer { // However this code never accesses properties off of `document` before deleting its contents // again, so it shouldn't be vulnerable to DOM clobbering. let current: Node = el.firstChild !; - let elementValid = true; + let traverseContent = true; while (current) { if (current.nodeType === Node.ELEMENT_NODE) { - elementValid = this.startElement(current as Element); + traverseContent = this.startElement(current as Element); } else if (current.nodeType === Node.TEXT_NODE) { this.chars(current.nodeValue !); } else { // Strip non-element, non-text nodes. this.sanitizedSomething = true; } - if (elementValid && current.firstChild) { + if (traverseContent && current.firstChild) { current = current.firstChild !; continue; } @@ -132,18 +139,18 @@ class SanitizingHtmlSerializer { } /** - * Outputs only valid Elements. + * Sanitizes an opening element tag (if valid) and returns whether the element's contents should + * be traversed. Element content must always be traversed (even if the element itself is not + * valid/safe), unless the element is one of `SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS`. * - * Invalid elements are skipped. - * - * @param element element to sanitize - * Returns true if the element is valid. + * @param element The element to sanitize. + * @return True if the element's contents should be traversed. */ private startElement(element: Element): boolean { const tagName = element.nodeName.toLowerCase(); if (!VALID_ELEMENTS.hasOwnProperty(tagName)) { this.sanitizedSomething = true; - return false; + return !SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS.hasOwnProperty(tagName); } this.buf.push('<'); this.buf.push(tagName); diff --git a/packages/core/test/sanitization/html_sanitizer_spec.ts b/packages/core/test/sanitization/html_sanitizer_spec.ts index 5f64b0abee..8d114f10a0 100644 --- a/packages/core/test/sanitization/html_sanitizer_spec.ts +++ b/packages/core/test/sanitization/html_sanitizer_spec.ts @@ -36,8 +36,8 @@ import {_sanitizeHtml} from '../../src/sanitization/html_sanitizer'; .toEqual('

Hello
World

'); }); - it('supports removal of namespaced elements', - () => { expect(_sanitizeHtml(defaultDoc, 'abc')).toEqual('a'); }); + it('supports namespaced elements', + () => { expect(_sanitizeHtml(defaultDoc, 'abc')).toEqual('abc'); }); it('supports namespaced attributes', () => { expect(_sanitizeHtml(defaultDoc, 't')) @@ -85,7 +85,7 @@ import {_sanitizeHtml} from '../../src/sanitization/html_sanitizer'; .toEqual('

Hello

'); // NB: quote encoded as ASCII ". }); - describe('should strip dangerous elements and its content', () => { + describe('should strip dangerous elements (but potentially traverse their content)', () => { const dangerousTags = [ 'form', 'object', @@ -93,32 +93,40 @@ import {_sanitizeHtml} from '../../src/sanitization/html_sanitizer'; 'button', 'option', 'select', - 'script', - 'style', ]; - for (const tag of dangerousTags) { - it(`${tag}`, - () => { expect(_sanitizeHtml(defaultDoc, `<${tag}>evil!`)).toEqual(''); }); + it(tag, + () => { expect(_sanitizeHtml(defaultDoc, `<${tag}>evil!`)).toEqual('evil!'); }); } + const dangerousSelfClosingTags = [ - 'frameset', - 'embed', - 'input', - 'param', 'base', 'basefont', - 'param', + 'embed', + 'frameset', + 'input', 'link', + 'param', ]; - for (const tag of dangerousSelfClosingTags) { - it(`${tag}`, () => { + it(tag, () => { expect(_sanitizeHtml(defaultDoc, `before<${tag}>After`)).toEqual('beforeAfter'); }); } - it(`swallows frame entirely`, () => { + const dangerousSkipContentTags = [ + 'script', + 'style', + 'template', + ]; + for (const tag of dangerousSkipContentTags) { + it(tag, () => { expect(_sanitizeHtml(defaultDoc, `<${tag}>evil!`)).toEqual(''); }); + } + + it(`frame`, () => { + // `` is special, because different browsers treat it differently (e.g. remove it + // altogether). // We just verify that (one way or another), there is no `` element + // after sanitization. expect(_sanitizeHtml(defaultDoc, `evil!`)).not.toContain(''); }); }); @@ -133,6 +141,13 @@ import {_sanitizeHtml} from '../../src/sanitization/html_sanitizer'; } }); + it('ignores content of script elements', () => { + expect(_sanitizeHtml(defaultDoc, '')).toEqual(''); + expect(_sanitizeHtml(defaultDoc, '
hi
')) + .toEqual('
hi
'); + expect(_sanitizeHtml(defaultDoc, '')).toEqual(''); + }); + it('ignores content of style elements', () => { expect(_sanitizeHtml(defaultDoc, '
hi
')) .toEqual('
hi
'); @@ -186,7 +201,7 @@ import {_sanitizeHtml} from '../../src/sanitization/html_sanitizer'; // PlatformBrowser output '

' : // PlatformServer output - ''); + '

'); }); if (browserDetection.isWebkit) { From 5a4c4026631e1136711aff9cc270d1be1b45209d Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Tue, 26 Feb 2019 16:33:01 -0800 Subject: [PATCH 0141/1073] docs: release notes for the v7.2.7 release --- CHANGELOG.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bbf842c98..c9a1473632 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,13 @@ + +## [7.2.7](https://github.com/angular/angular/compare/7.2.6...7.2.7) (2019-02-27) + + +### Bug Fixes + +* **bazel:** pin browser repositories using [@npm](https://github.com/npm)_bazel_karma//:browser_repositories.bzl in bazel schematics ([#28896](https://github.com/angular/angular/issues/28896)) ([b686449](https://github.com/angular/angular/commit/b686449)) +* **core:** traverse and sanitize content of unsafe elements ([#28804](https://github.com/angular/angular/issues/28804)) ([fdcf877](https://github.com/angular/angular/commit/fdcf877)), closes [#25879](https://github.com/angular/angular/issues/25879) [#25879](https://github.com/angular/angular/issues/25879) [#26007](https://github.com/angular/angular/issues/26007) [#28427](https://github.com/angular/angular/issues/28427) +* **language-service:** Fix completions for input/output with alias ([#28904](https://github.com/angular/angular/issues/28904)) ([d0018e6](https://github.com/angular/angular/commit/d0018e6)), closes [#27959](https://github.com/angular/angular/issues/27959) + # [8.0.0-beta.5](https://github.com/angular/angular/compare/8.0.0-beta.4...8.0.0-beta.5) (2019-02-20) From f3802633937f800ed2993422ce6e0c7d9b5602ce Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Tue, 26 Feb 2019 16:37:10 -0800 Subject: [PATCH 0142/1073] release: cut the v8.0.0-beta.6 release --- CHANGELOG.md | 19 +++++++++++++++++++ package.json | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9a1473632..4ca67a7c80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ + +# [8.0.0-beta.6](https://github.com/angular/angular/compare/8.0.0-beta.5...8.0.0-beta.6) (2019-02-27) + + +### Bug Fixes + +* **bazel:** Pin browsers for schematics ([#28913](https://github.com/angular/angular/issues/28913)) ([1145bdb](https://github.com/angular/angular/commit/1145bdb)) +* **bazel:** rxjs_umd_modules should always be present ([#28881](https://github.com/angular/angular/issues/28881)) ([9ae14db](https://github.com/angular/angular/commit/9ae14db)) +* **compiler:** use correct variable in invalid function ([#28656](https://github.com/angular/angular/issues/28656)) ([f75acbd](https://github.com/angular/angular/commit/f75acbd)) +* **core:** traverse and sanitize content of unsafe elements ([#28804](https://github.com/angular/angular/issues/28804)) ([262ba67](https://github.com/angular/angular/commit/262ba67)), closes [#25879](https://github.com/angular/angular/issues/25879) [#25879](https://github.com/angular/angular/issues/25879) [#26007](https://github.com/angular/angular/issues/26007) [#28427](https://github.com/angular/angular/issues/28427) +* **language-service:** Fix completions for input/output with alias ([#28904](https://github.com/angular/angular/issues/28904)) ([ad4a9bf](https://github.com/angular/angular/commit/ad4a9bf)), closes [#27959](https://github.com/angular/angular/issues/27959) + + +### Features + +* **bazel:** add ts_config extending support for ng_module ([#21883](https://github.com/angular/angular/issues/21883)) ([edb6c2d](https://github.com/angular/angular/commit/edb6c2d)) + + + ## [7.2.7](https://github.com/angular/angular/compare/7.2.6...7.2.7) (2019-02-27) diff --git a/package.json b/package.json index 082b957820..095e05c969 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "8.0.0-beta.5", + "version": "8.0.0-beta.6", "private": true, "branchPattern": "2.0.*", "description": "Angular - a web framework for modern web apps", From dc335194abd249445fdcedf00b4e2b63c9d4b8c8 Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Tue, 26 Feb 2019 14:53:42 -0800 Subject: [PATCH 0143/1073] fix(bazel): Add SHA256 for rules_sass (#28994) This will make the debugging output go away DEBUG: Rule 'io_bazel_rules_sass' modified arguments {"sha256": "6caffb8277b3033d6b5117b77437faaa6cd3c6679d6d6c81284511225aa54711"} PR Close #28994 --- .../src/schematics/bazel-workspace/files/WORKSPACE.template | 4 ++-- packages/bazel/src/schematics/bazel-workspace/index.ts | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template b/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template index 4c5f7d5599..a8138b433b 100644 --- a/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template +++ b/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template @@ -13,10 +13,9 @@ workspace(name = "<%= utils.underscore(name) %>") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") RULES_NODEJS_VERSION = "<%= RULES_NODEJS_VERSION %>" -RULES_NODEJS_SHA256 = "<%= RULES_NODEJS_SHA256 %>" http_archive( name = "build_bazel_rules_nodejs", - sha256 = "%s" % RULES_NODEJS_SHA256, + sha256 = "<%= RULES_NODEJS_SHA256 %>", url = "https://github.com/bazelbuild/rules_nodejs/releases/download/%s/rules_nodejs-%s.tar.gz" % (RULES_NODEJS_VERSION, RULES_NODEJS_VERSION), ) @@ -25,6 +24,7 @@ http_archive( RULES_SASS_VERSION = "<%= RULES_SASS_VERSION %>" http_archive( name = "io_bazel_rules_sass", + sha256 = "<%= RULES_SASS_SHA256 %>", url = "https://github.com/bazelbuild/rules_sass/archive/%s.zip" % RULES_SASS_VERSION, strip_prefix = "rules_sass-%s" % RULES_SASS_VERSION, ) diff --git a/packages/bazel/src/schematics/bazel-workspace/index.ts b/packages/bazel/src/schematics/bazel-workspace/index.ts index 2ce48cc016..1c9e716ab1 100644 --- a/packages/bazel/src/schematics/bazel-workspace/index.ts +++ b/packages/bazel/src/schematics/bazel-workspace/index.ts @@ -59,7 +59,8 @@ export default function(options: BazelWorkspaceOptions): Rule { const workspaceVersions = { 'RULES_NODEJS_VERSION': '0.18.6', 'RULES_NODEJS_SHA256': '1416d03823fed624b49a0abbd9979f7c63bbedfd37890ddecedd2fe25cccebc6', - 'RULES_SASS_VERSION': '1.17.0', + 'RULES_SASS_VERSION': '1.17.2', + 'RULES_SASS_SHA256': 'e5316ee8a09d1cbb732d3938b400836bf94dba91a27476e9e27706c4c0edae1f', }; return mergeWith(apply(url('./files'), [ From ce68b4d839aa232022948cf80fa86bc5cb70df6d Mon Sep 17 00:00:00 2001 From: Wassim Chegham Date: Wed, 16 Jan 2019 10:19:01 +0100 Subject: [PATCH 0144/1073] style: enforce buildifier lint on CI (#28186) PR Close #28186 --- BUILD.bazel | 4 +- WORKSPACE | 4 +- integration/bazel/src/BUILD.bazel | 2 + integration/bazel/src/hello-world/BUILD.bazel | 2 + modules/benchmarks/src/BUILD.bazel | 4 +- modules/benchmarks/src/largetable/BUILD.bazel | 4 +- .../src/largetable/render3/BUILD.bazel | 2 + modules/benchmarks/src/tree/BUILD.bazel | 4 +- .../benchmarks/src/tree/render3/BUILD.bazel | 2 + modules/e2e_util/BUILD.bazel | 4 +- package.json | 2 +- packages/BUILD.bazel | 2 + packages/animations/BUILD.bazel | 4 +- packages/animations/browser/BUILD.bazel | 4 +- .../animations/browser/testing/BUILD.bazel | 4 +- packages/bazel/index.bzl | 4 +- packages/bazel/src/BUILD.bazel | 2 - packages/bazel/src/builders/BUILD.bazel | 4 +- packages/bazel/src/esm5.bzl | 5 ++ packages/bazel/src/ng_module.bzl | 49 ++++++++++++------- packages/bazel/src/ng_package/BUILD.bazel | 2 - packages/bazel/src/ng_package/ng_package.bzl | 16 ++++-- packages/bazel/src/ng_rollup_bundle.bzl | 12 ++--- .../src/protractor/protractor_web_test.bzl | 30 ++++++------ .../bazel/src/protractor/utils/BUILD.bazel | 2 + packages/bazel/src/schematics/BUILD.bazel | 4 +- .../schematics/bazel-workspace/BUILD.bazel | 4 +- .../bazel/src/schematics/ng-new/BUILD.bazel | 4 +- .../bazel/test/ng_package/example/BUILD.bazel | 4 +- .../ng_package/example/secondary/BUILD.bazel | 4 +- packages/benchpress/BUILD.bazel | 4 +- packages/common/BUILD.bazel | 4 +- packages/common/http/BUILD.bazel | 4 +- packages/common/http/testing/BUILD.bazel | 4 +- packages/common/locales/BUILD.bazel | 12 ++--- packages/common/testing/BUILD.bazel | 4 +- packages/compiler-cli/BUILD.bazel | 2 + .../bazel/injectable_def/app/BUILD.bazel | 4 +- .../bazel/injectable_def/app/test/BUILD.bazel | 4 +- .../bazel/injectable_def/lib1/BUILD.bazel | 4 +- .../bazel/injectable_def/lib2/BUILD.bazel | 4 +- .../injector_def/ivy_build/app/BUILD.bazel | 5 +- .../ivy_build/app/test/BUILD.bazel | 4 +- .../bazel/ng_module/BUILD.bazel | 6 +-- packages/compiler-cli/src/ngcc/BUILD.bazel | 4 +- .../compiler-cli/src/ngcc/test/BUILD.bazel | 4 +- .../src/ngtsc/annotations/BUILD.bazel | 7 ++- .../src/ngtsc/annotations/test/BUILD.bazel | 4 +- .../src/ngtsc/diagnostics/BUILD.bazel | 7 ++- .../src/ngtsc/entry_point/BUILD.bazel | 7 ++- .../src/ngtsc/entry_point/test/BUILD.bazel | 4 +- .../src/ngtsc/imports/BUILD.bazel | 7 ++- .../src/ngtsc/partial_evaluator/BUILD.bazel | 7 ++- .../ngtsc/partial_evaluator/test/BUILD.bazel | 4 +- .../src/ngtsc/reflection/BUILD.bazel | 7 ++- .../src/ngtsc/reflection/test/BUILD.bazel | 4 +- .../compiler-cli/src/ngtsc/shims/BUILD.bazel | 7 ++- .../src/ngtsc/shims/test/BUILD.bazel | 4 +- .../compiler-cli/src/ngtsc/switch/BUILD.bazel | 7 ++- .../src/ngtsc/testing/BUILD.bazel | 4 +- .../src/ngtsc/transform/BUILD.bazel | 7 ++- .../src/ngtsc/translator/BUILD.bazel | 4 +- .../src/ngtsc/typecheck/BUILD.bazel | 4 +- .../src/ngtsc/typecheck/test/BUILD.bazel | 4 +- .../compiler-cli/src/ngtsc/util/BUILD.bazel | 5 +- .../src/ngtsc/util/test/BUILD.bazel | 4 +- .../test/ngtsc/fake_core/BUILD.bazel | 4 +- packages/compiler/BUILD.bazel | 4 +- packages/compiler/testing/BUILD.bazel | 4 +- packages/core/BUILD.bazel | 4 +- packages/core/src/compiler/BUILD.bazel | 4 +- packages/core/src/di/interface/BUILD.bazel | 4 +- packages/core/src/interface/BUILD.bazel | 4 +- packages/core/src/reflection/BUILD.bazel | 4 +- packages/core/src/util/BUILD.bazel | 4 +- packages/core/test/BUILD.bazel | 4 +- .../test/bundling/animation_world/BUILD.bazel | 2 + .../test/bundling/hello_world/BUILD.bazel | 2 + .../bundling/hello_world_i18n/BUILD.bazel | 2 + .../test/bundling/hello_world_r2/BUILD.bazel | 2 + .../core/test/bundling/injection/BUILD.bazel | 6 +-- packages/core/test/bundling/todo/BUILD.bazel | 2 + .../core/test/bundling/todo_i18n/BUILD.bazel | 2 + .../core/test/bundling/todo_r2/BUILD.bazel | 2 + packages/core/test/bundling/util/BUILD.bazel | 4 +- packages/core/test/render3/BUILD.bazel | 4 +- packages/core/test/render3/ivy/BUILD.bazel | 4 +- packages/core/test/view/BUILD.bazel | 4 +- packages/core/testing/BUILD.bazel | 4 +- packages/elements/BUILD.bazel | 4 +- packages/elements/schematics/BUILD.bazel | 4 +- .../elements/schematics/ng-add/BUILD.bazel | 15 +++--- packages/elements/test/BUILD.bazel | 2 +- packages/forms/BUILD.bazel | 4 +- packages/http/BUILD.bazel | 4 +- packages/http/testing/BUILD.bazel | 4 +- packages/language-service/BUILD.bazel | 4 +- packages/language-service/bundles/BUILD.bazel | 4 +- packages/platform-browser-dynamic/BUILD.bazel | 4 +- .../testing/BUILD.bazel | 4 +- packages/platform-browser/BUILD.bazel | 4 +- .../platform-browser/animations/BUILD.bazel | 4 +- packages/platform-browser/testing/BUILD.bazel | 4 +- packages/platform-server/BUILD.bazel | 4 +- packages/platform-server/testing/BUILD.bazel | 4 +- .../platform-webworker-dynamic/BUILD.bazel | 4 +- packages/platform-webworker/BUILD.bazel | 4 +- packages/private/testing/BUILD.bazel | 2 - packages/router/BUILD.bazel | 4 +- .../test/aot_ngsummary_test/BUILD.bazel | 2 +- packages/router/testing/BUILD.bazel | 4 +- packages/router/upgrade/BUILD.bazel | 4 +- packages/service-worker/BUILD.bazel | 4 +- packages/service-worker/cli/BUILD.bazel | 4 +- packages/service-worker/config/BUILD.bazel | 4 +- .../service-worker/config/testing/BUILD.bazel | 4 +- packages/service-worker/testing/BUILD.bazel | 4 +- packages/service-worker/worker/BUILD.bazel | 4 +- .../service-worker/worker/testing/BUILD.bazel | 4 +- packages/upgrade/BUILD.bazel | 4 +- packages/upgrade/static/BUILD.bazel | 4 +- packages/upgrade/test/BUILD.bazel | 2 +- tools/defaults.bzl | 1 + tools/ng_setup_workspace.bzl | 4 +- tools/public_api_guard/BUILD.bazel | 2 +- tools/symbol-extractor/BUILD.bazel | 4 +- tools/testing/BUILD.bazel | 4 +- tools/ts-api-guardian/BUILD.bazel | 2 - yarn.lock | 28 +++++------ 129 files changed, 333 insertions(+), 302 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index f9f73b000c..86f2622049 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,3 +1,5 @@ +load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") + package(default_visibility = ["//visibility:public"]) load("@build_bazel_rules_nodejs//:defs.bzl", "node_modules_filegroup") @@ -44,8 +46,6 @@ filegroup( ], ) -load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") - # A nodejs_binary for @angular/bazel/ngc-wrapped to use by default in # ng_module that depends on @npm//@angular/bazel instead of the # output of the //packages/bazel/src/ngc-wrapped ts_library rule. This diff --git a/WORKSPACE b/WORKSPACE index 2ace4e6428..a48369410e 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -41,7 +41,9 @@ Angular has a dependency on the @bazel/bazel package which supplies it. Try running `yarn bazel` instead. (If you did run that, check that you've got a fresh `yarn install`) -""") +""", + minimum_bazel_version = "0.21.0", +) # Setup the Node.js toolchain node_repositories( diff --git a/integration/bazel/src/BUILD.bazel b/integration/bazel/src/BUILD.bazel index 1014cdd936..7ea70c2a09 100644 --- a/integration/bazel/src/BUILD.bazel +++ b/integration/bazel/src/BUILD.bazel @@ -5,6 +5,8 @@ load("@build_bazel_rules_nodejs//:defs.bzl", "http_server", "nodejs_binary", "ro load("@build_bazel_rules_nodejs//internal/web_package:web_package.bzl", "web_package") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +package(default_visibility = ["//visibility:public"]) + # Allow targets under sub-packages to reference the tsconfig.json file exports_files(["tsconfig.json"]) diff --git a/integration/bazel/src/hello-world/BUILD.bazel b/integration/bazel/src/hello-world/BUILD.bazel index e081522371..abadf03c1b 100644 --- a/integration/bazel/src/hello-world/BUILD.bazel +++ b/integration/bazel/src/hello-world/BUILD.bazel @@ -5,6 +5,8 @@ load("@npm_bazel_typescript//:defs.bzl", "ts_library") load("@io_bazel_rules_sass//sass:sass.bzl", "sass_binary") load("@npm_angular_bazel//:index.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + sass_binary( name = "hello-world-styles", src = "hello-world.component.scss", diff --git a/modules/benchmarks/src/BUILD.bazel b/modules/benchmarks/src/BUILD.bazel index fd7fb9848a..6e3313d759 100644 --- a/modules/benchmarks/src/BUILD.bazel +++ b/modules/benchmarks/src/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "util_lib", srcs = ["util.ts"], diff --git a/modules/benchmarks/src/largetable/BUILD.bazel b/modules/benchmarks/src/largetable/BUILD.bazel index 85706c9c97..3b2888efd0 100644 --- a/modules/benchmarks/src/largetable/BUILD.bazel +++ b/modules/benchmarks/src/largetable/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "util_lib", srcs = ["util.ts"], diff --git a/modules/benchmarks/src/largetable/render3/BUILD.bazel b/modules/benchmarks/src/largetable/render3/BUILD.bazel index a4ae3675cb..306be43e2b 100644 --- a/modules/benchmarks/src/largetable/render3/BUILD.bazel +++ b/modules/benchmarks/src/largetable/render3/BUILD.bazel @@ -4,6 +4,8 @@ load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "largetable_lib", srcs = glob(["**/*.ts"]), diff --git a/modules/benchmarks/src/tree/BUILD.bazel b/modules/benchmarks/src/tree/BUILD.bazel index 05d485954b..1941513d5c 100644 --- a/modules/benchmarks/src/tree/BUILD.bazel +++ b/modules/benchmarks/src/tree/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "util_lib", srcs = ["util.ts"], diff --git a/modules/benchmarks/src/tree/render3/BUILD.bazel b/modules/benchmarks/src/tree/render3/BUILD.bazel index 705018b0eb..b51b4d9656 100644 --- a/modules/benchmarks/src/tree/render3/BUILD.bazel +++ b/modules/benchmarks/src/tree/render3/BUILD.bazel @@ -4,6 +4,8 @@ load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "tree_lib", srcs = glob(["**/*.ts"]), diff --git a/modules/e2e_util/BUILD.bazel b/modules/e2e_util/BUILD.bazel index 647b53205e..3dc9b959c9 100644 --- a/modules/e2e_util/BUILD.bazel +++ b/modules/e2e_util/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "e2e_util", testonly = 1, diff --git a/package.json b/package.json index 095e05c969..3f1d47db43 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "url": "https://github.com/angular/angular.git" }, "scripts": { - "bazel:format": "find . -type f \\( -name \"*.bzl\" -or -name BUILD -or -name BUILD.bazel -or -name WORKSPACE \\) ! -path \"*/node_modules/*\" | xargs buildifier -v", + "bazel:format": "find . -type f \\( -name \"*.bzl\" -or -name WORKSPACE -or -name BUILD -or -name BUILD.bazel \\) ! -path \"*/node_modules/*\" | xargs buildifier -v --warnings=args-order,attr-cfg,attr-license,attr-non-empty,attr-output-default,attr-single-file,constant-glob,ctx-args,depset-iteration,depset-union,dict-concatenation,duplicated-name,filetype,git-repository,http-archive,integer-division,load,load-on-top,native-build,native-package,out-of-order-load,output-group,package-name,package-on-top,positional-args,redefined-variable,repository-name,same-origin-load,string-iteration,unsorted-dict-items,unused-variable", "bazel:lint": "yarn bazel:format --lint=warn", "bazel:lint-fix": "yarn bazel:format --lint=fix", "preinstall": "node tools/yarn/check-yarn.js", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 65ff743075..8c5112d4a5 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -1,3 +1,5 @@ +load("//tools:defaults.bzl", "ts_library") + package(default_visibility = ["//visibility:public"]) exports_files([ diff --git a/packages/animations/BUILD.bazel b/packages/animations/BUILD.bazel index a922e86aca..f1738a206a 100644 --- a/packages/animations/BUILD.bazel +++ b/packages/animations/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "animations", srcs = glob( diff --git a/packages/animations/browser/BUILD.bazel b/packages/animations/browser/BUILD.bazel index d2d9712be4..8e87cf98a7 100644 --- a/packages/animations/browser/BUILD.bazel +++ b/packages/animations/browser/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "browser", srcs = glob( diff --git a/packages/animations/browser/testing/BUILD.bazel b/packages/animations/browser/testing/BUILD.bazel index 22ccc1934f..e1adf2cf6d 100644 --- a/packages/animations/browser/testing/BUILD.bazel +++ b/packages/animations/browser/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob(["**/*.ts"]), diff --git a/packages/bazel/index.bzl b/packages/bazel/index.bzl index 2daee51d54..18b55abe3d 100644 --- a/packages/bazel/index.bzl +++ b/packages/bazel/index.bzl @@ -7,14 +7,14 @@ Users should not load files under "/src" """ -load("//packages/bazel/src:ng_module.bzl", _ng_module = "ng_module") -load("//packages/bazel/src:ng_setup_workspace.bzl", _ng_setup_workspace = "ng_setup_workspace") load("//packages/bazel/src/ng_package:ng_package.bzl", _ng_package = "ng_package") load( "//packages/bazel/src/protractor:protractor_web_test.bzl", _protractor_web_test = "protractor_web_test", _protractor_web_test_suite = "protractor_web_test_suite", ) +load("//packages/bazel/src:ng_module.bzl", _ng_module = "ng_module") +load("//packages/bazel/src:ng_setup_workspace.bzl", _ng_setup_workspace = "ng_setup_workspace") ng_module = _ng_module ng_package = _ng_package diff --git a/packages/bazel/src/BUILD.bazel b/packages/bazel/src/BUILD.bazel index 6f806fbfec..04767652e0 100644 --- a/packages/bazel/src/BUILD.bazel +++ b/packages/bazel/src/BUILD.bazel @@ -8,8 +8,6 @@ filegroup( # For generating skydoc exports_files(glob(["*.bzl"])) -load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") - nodejs_binary( name = "rollup_with_build_optimizer", data = [ diff --git a/packages/bazel/src/builders/BUILD.bazel b/packages/bazel/src/builders/BUILD.bazel index 93134df6e1..175ce6d437 100644 --- a/packages/bazel/src/builders/BUILD.bazel +++ b/packages/bazel/src/builders/BUILD.bazel @@ -1,3 +1,5 @@ +load("//tools:defaults.bzl", "ts_library") + package(default_visibility = ["//visibility:public"]) filegroup( @@ -8,8 +10,6 @@ filegroup( visibility = ["//packages/bazel:__subpackages__"], ) -load("//tools:defaults.bzl", "ts_library") - ts_library( name = "builders", srcs = [ diff --git a/packages/bazel/src/esm5.bzl b/packages/bazel/src/esm5.bzl index 57d2157ca3..e0f3fd6ba9 100644 --- a/packages/bazel/src/esm5.bzl +++ b/packages/bazel/src/esm5.bzl @@ -170,6 +170,11 @@ esm5_outputs_aspect = aspect( executable = True, cfg = "host", ), + "_tsc_wrapped": attr.label( + default = Label("@build_bazel_rules_typescript//:@bazel/typescript/tsc_wrapped"), + executable = True, + cfg = "host", + ), }, ) diff --git a/packages/bazel/src/ng_module.bzl b/packages/bazel/src/ng_module.bzl index 66d3538019..183a08fb75 100644 --- a/packages/bazel/src/ng_module.bzl +++ b/packages/bazel/src/ng_module.bzl @@ -244,6 +244,8 @@ def _expected_outs(ctx): # TODO(alxhub): i18n is only produced by the legacy compiler currently. This should be re-enabled # when ngtsc can extract messages if is_legacy_ngc: + # TODO(manekinekko): due to bazelbuild/bazel#4858 we cannot fix the call to ctx.new_file(genfiles_dir) + # so the rule is turned off for now. i18n_messages_files = [ctx.new_file(ctx.genfiles_dir, ctx.label.name + "_ngc_messages.xmb")] else: i18n_messages_files = [] @@ -268,9 +270,9 @@ def _ngc_tsconfig(ctx, files, srcs, **kwargs): expected_outs = outs.closure_js angular_compiler_options = { - "enableResourceInlining": ctx.attr.inline_resources, - "generateCodeForLibraries": False, "allowEmptyCodegenFiles": True, + "enableIvy": _enable_ivy_value(ctx), + "enableResourceInlining": ctx.attr.inline_resources, # Summaries are only enabled if Angular outputs are to be produced. "enableSummariesForJit": is_legacy_ngc, "enableIvy": _enable_ivy_value(ctx), @@ -537,8 +539,8 @@ def ng_module_impl(ctx, ts_compile_actions): if is_legacy_ngc: providers["angular"] = { - "summaries": outs.summaries, "metadata": outs.metadata, + "summaries": outs.summaries, } providers["ngc_messages"] = outs.i18n_messages @@ -568,13 +570,6 @@ local_deps_aspects = [collect_node_modules_aspect, _collect_summaries_aspect] NG_MODULE_ATTRIBUTES = { "srcs": attr.label_list(allow_files = [".ts"]), - - # Note: DEPS_ASPECTS is already a list, we add the cast to workaround - # https://github.com/bazelbuild/skydoc/issues/21 - "deps": attr.label_list( - doc = "Targets that are imported by this target", - aspects = local_deps_aspects, - ), "assets": attr.label_list( doc = ".html and .css files needed by the Angular compiler", allow_files = [ @@ -583,14 +578,6 @@ NG_MODULE_ATTRIBUTES = { ".html", ], ), - "factories": attr.label_list( - allow_files = [".ts", ".html"], - mandatory = False, - ), - "filter_summaries": attr.bool(default = False), - "type_check": attr.bool(default = True), - "inline_resources": attr.bool(default = True), - "no_i18n": attr.bool(default = False), "compiler": attr.label( doc = """Sets a different ngc compiler binary to use for this library. @@ -605,16 +592,40 @@ NG_MODULE_ATTRIBUTES = { executable = True, cfg = "host", ), + "factories": attr.label_list( + allow_files = [".ts", ".html"], + mandatory = False, + ), + "filter_summaries": attr.bool(default = False), + "inline_resources": attr.bool(default = True), "ng_xi18n": attr.label( default = Label(DEFAULT_NG_XI18N), executable = True, cfg = "host", ), + "no_i18n": attr.bool(default = False), + "type_check": attr.bool(default = True), + + # Note: DEPS_ASPECTS is already a list, we add the cast to workaround + # https://github.com/bazelbuild/skydoc/issues/21 + "deps": attr.label_list( + doc = "Targets that are imported by this target", + aspects = local_deps_aspects, + ), "_supports_workers": attr.bool(default = True), } NG_MODULE_RULE_ATTRS = dict(dict(COMMON_ATTRIBUTES, **NG_MODULE_ATTRIBUTES), **{ - "tsconfig": attr.label(allow_files = True, single_file = True), + "entry_point": attr.string(), + + # Default is %{name}_public_index + # The suffix points to the generated "bundle index" files that users import from + # The default is intended to avoid collisions with the users input files. + # Later packaging rules will point to these generated files as the entry point + # into the package. + # See the flatModuleOutFile documentation in + # https://github.com/angular/angular/blob/master/packages/compiler-cli/src/transformers/api.ts + "flat_module_out_file": attr.string(), "node_modules": attr.label( doc = """The npm packages which should be available during the compile. diff --git a/packages/bazel/src/ng_package/BUILD.bazel b/packages/bazel/src/ng_package/BUILD.bazel index 8cfc2cfab3..1fa7a41652 100644 --- a/packages/bazel/src/ng_package/BUILD.bazel +++ b/packages/bazel/src/ng_package/BUILD.bazel @@ -1,5 +1,3 @@ -package(default_visibility = ["//visibility:public"]) - load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") # BEGIN-DEV-ONLY diff --git a/packages/bazel/src/ng_package/ng_package.bzl b/packages/bazel/src/ng_package/ng_package.bzl index c1b4c64492..3fff5ac467 100644 --- a/packages/bazel/src/ng_package/ng_package.bzl +++ b/packages/bazel/src/ng_package/ng_package.bzl @@ -16,6 +16,12 @@ specification of this format at https://goo.gl/jB3GVv load("@build_bazel_rules_nodejs//internal/common:collect_es6_sources.bzl", "collect_es6_sources") load("@build_bazel_rules_nodejs//internal/common:node_module_info.bzl", "NodeModuleInfo") load("@build_bazel_rules_nodejs//internal/common:sources_aspect.bzl", "sources_aspect") +load( + "@build_bazel_rules_nodejs//:internal/npm_package/npm_package.bzl", + "NPM_PACKAGE_ATTRS", + "NPM_PACKAGE_OUTPUTS", + "create_package", +) load( "@build_bazel_rules_nodejs//:internal/rollup/rollup_bundle.bzl", "ROLLUP_ATTRS", @@ -32,6 +38,7 @@ load( load("//packages/bazel/src:external.bzl", "FLAT_DTS_FILE_SUFFIX") load("//packages/bazel/src:esm5.bzl", "esm5_outputs_aspect", "esm5_root_dir", "flatten_esm5") load("//packages/bazel/src/ng_package:collect-type-definitions.bzl", "collect_type_definitions") +load("//packages/bazel/src:esm5.bzl", "esm5_outputs_aspect", "esm5_root_dir", "flatten_esm5") _DEFAULT_NG_PACKAGER = "@npm//@angular/bazel/bin:packager" @@ -336,8 +343,8 @@ def _ng_package_impl(ctx): packager_inputs.extend([m.metadata_file]) metadata_arg[m.module_name] = { "index": m.typings_file.path.replace(".d.ts", ".js"), - "typings": m.typings_file.path, "metadata": m.metadata_file.path, + "typings": m.typings_file.path, } packager_args.add(str(metadata_arg)) @@ -401,7 +408,6 @@ DEPS_ASPECTS = [esm5_outputs_aspect, sources_aspect] NG_PACKAGE_ATTRS = dict(NPM_PACKAGE_ATTRS, **dict(ROLLUP_ATTRS, **{ "srcs": attr.label_list(allow_files = True), - "deps": attr.label_list(aspects = DEPS_ASPECTS), "data": attr.label_list( doc = "Additional, non-Angular files to be added to the package, e.g. global CSS assets.", allow_files = True, @@ -412,11 +418,15 @@ NG_PACKAGE_ATTRS = dict(NPM_PACKAGE_ATTRS, **dict(ROLLUP_ATTRS, **{ "entry_point_name": attr.string( doc = "Name to use when generating bundle files for the primary entry-point.", ), + "globals": attr.string_dict(default = {}), + "include_devmode_srcs": attr.bool(default = False), "ng_packager": attr.label( default = Label(_DEFAULT_NG_PACKAGER), executable = True, cfg = "host", ), + "readme_md": attr.label(allow_single_file = [".md"]), + "deps": attr.label_list(aspects = DEPS_ASPECTS), "_rollup": attr.label( default = Label("@build_bazel_rules_nodejs//internal/rollup"), executable = True, @@ -479,8 +489,8 @@ def ng_package_outputs(name, entry_point, entry_point_name): basename = primary_entry_point_name(name, entry_point, entry_point_name) outputs = { - "fesm5": "fesm5/%s.js" % basename, "fesm2015": "fesm2015/%s.js" % basename, + "fesm5": "fesm5/%s.js" % basename, "umd": "%s.umd.js" % basename, "umd_min": "%s.umd.min.js" % basename, } diff --git a/packages/bazel/src/ng_rollup_bundle.bzl b/packages/bazel/src/ng_rollup_bundle.bzl index 0905ff49aa..d6992fc24e 100644 --- a/packages/bazel/src/ng_rollup_bundle.bzl +++ b/packages/bazel/src/ng_rollup_bundle.bzl @@ -91,7 +91,7 @@ def _run_tsc(ctx, input, output): args.add(input) args.add("--outFile", output) - ctx.action( + ctx.actions.run( executable = ctx.executable._tsc, inputs = [input], outputs = [output], @@ -170,16 +170,16 @@ ng_rollup_bundle = rule( Typically this will be `ts_library` or `ng_module` targets.""", aspects = DEPS_ASPECTS, ), - "_rollup": attr.label( - executable = True, - cfg = "host", - default = Label("@angular//packages/bazel/src:rollup_with_build_optimizer"), - ), "_brotli": attr.label( executable = True, cfg = "host", default = Label("@org_brotli//:brotli"), ), + "_rollup": attr.label( + executable = True, + cfg = "host", + default = Label("@angular//packages/bazel/src:rollup_with_build_optimizer"), + ), }), outputs = dict(ROLLUP_OUTPUTS, **{ "build_es5_min_compressed": "%{name}.min.js.br", diff --git a/packages/bazel/src/protractor/protractor_web_test.bzl b/packages/bazel/src/protractor/protractor_web_test.bzl index eb2fc06914..aaf06f0f09 100644 --- a/packages/bazel/src/protractor/protractor_web_test.bzl +++ b/packages/bazel/src/protractor/protractor_web_test.bzl @@ -62,9 +62,9 @@ def _protractor_web_test_impl(ctx): substitutions = { "TMPL_config": expand_path_into_runfiles(ctx, configuration_file.short_path) if configuration_file else "", "TMPL_on_prepare": expand_path_into_runfiles(ctx, on_prepare_file.short_path) if on_prepare_file else "", - "TMPL_workspace": ctx.workspace_name, "TMPL_server": ctx.executable.server.short_path if ctx.executable.server else "", "TMPL_specs": "\n".join([" '%s'," % e for e in specs]), + "TMPL_workspace": ctx.workspace_name, }, ) @@ -121,14 +121,17 @@ _protractor_web_test = rule( test = True, executable = True, attrs = { + "srcs": attr.label_list( + doc = "A list of JavaScript test files", + allow_files = [".js"], + ), "configuration": attr.label( doc = "Protractor configuration file", allow_single_file = True, aspects = [sources_aspect], ), - "srcs": attr.label_list( - doc = "A list of JavaScript test files", - allow_files = [".js"], + "data": attr.label_list( + doc = "Runtime dependencies", ), "on_prepare": attr.label( doc = """A file with a node.js script to run once before all tests run. @@ -137,27 +140,22 @@ _protractor_web_test = rule( allow_single_file = True, aspects = [sources_aspect], ), - "deps": attr.label_list( - doc = "Other targets which produce JavaScript such as `ts_library`", + "protractor": attr.label( + doc = "Protractor executable target (set by protractor_web_test macro)", + executable = True, + cfg = "target", allow_files = True, - aspects = [sources_aspect], - ), - "data": attr.label_list( - doc = "Runtime dependencies", ), "server": attr.label( doc = "Optional server executable target", executable = True, cfg = "target", - single_file = False, allow_files = True, ), - "protractor": attr.label( - doc = "Protractor executable target (set by protractor_web_test macro)", - executable = True, - cfg = "target", - single_file = False, + "deps": attr.label_list( + doc = "Other targets which produce JavaScript such as `ts_library`", allow_files = True, + aspects = [sources_aspect], ), "_conf_tmpl": attr.label( default = Label(_CONF_TMPL), diff --git a/packages/bazel/src/protractor/utils/BUILD.bazel b/packages/bazel/src/protractor/utils/BUILD.bazel index fd461d9610..0035bfa749 100644 --- a/packages/bazel/src/protractor/utils/BUILD.bazel +++ b/packages/bazel/src/protractor/utils/BUILD.bazel @@ -2,6 +2,8 @@ package(default_visibility = ["//visibility:public"]) load("@npm_bazel_typescript//:defs.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "utils", srcs = ["index.ts"], diff --git a/packages/bazel/src/schematics/BUILD.bazel b/packages/bazel/src/schematics/BUILD.bazel index fe90035725..16e9cf968e 100644 --- a/packages/bazel/src/schematics/BUILD.bazel +++ b/packages/bazel/src/schematics/BUILD.bazel @@ -1,3 +1,5 @@ +load("//tools:defaults.bzl", "jasmine_node_test") + package(default_visibility = ["//visibility:public"]) filegroup( @@ -8,8 +10,6 @@ filegroup( visibility = ["//packages/bazel:__subpackages__"], ) -load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") - jasmine_node_test( name = "test", bootstrap = ["angular/tools/testing/init_node_spec.js"], diff --git a/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel b/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel index 26f75310f5..44945a27e8 100644 --- a/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel +++ b/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "bazel-workspace", srcs = [ diff --git a/packages/bazel/src/schematics/ng-new/BUILD.bazel b/packages/bazel/src/schematics/ng-new/BUILD.bazel index 6227329322..45a103934b 100644 --- a/packages/bazel/src/schematics/ng-new/BUILD.bazel +++ b/packages/bazel/src/schematics/ng-new/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "ng-new", srcs = [ diff --git a/packages/bazel/test/ng_package/example/BUILD.bazel b/packages/bazel/test/ng_package/example/BUILD.bazel index 6bf8a00242..3e5733ae7b 100644 --- a/packages/bazel/test/ng_package/example/BUILD.bazel +++ b/packages/bazel/test/ng_package/example/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//packages/bazel/test:__subpackages__"]) - load("//tools:defaults.bzl", "ng_module", "ng_package", "npm_package") +package(default_visibility = ["//packages/bazel/test:__subpackages__"]) + ng_module( name = "example", srcs = glob(["*.ts"]), diff --git a/packages/bazel/test/ng_package/example/secondary/BUILD.bazel b/packages/bazel/test/ng_package/example/secondary/BUILD.bazel index e223cd26f2..f66a3af590 100644 --- a/packages/bazel/test/ng_package/example/secondary/BUILD.bazel +++ b/packages/bazel/test/ng_package/example/secondary/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//packages/bazel/test:__subpackages__"]) - load("//tools:defaults.bzl", "ng_module") +package(default_visibility = ["//packages/bazel/test:__subpackages__"]) + ng_module( name = "secondary", srcs = glob(["*.ts"]), diff --git a/packages/benchpress/BUILD.bazel b/packages/benchpress/BUILD.bazel index 188f8910de..b418569d6e 100644 --- a/packages/benchpress/BUILD.bazel +++ b/packages/benchpress/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "npm_package", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "benchpress", srcs = glob( diff --git a/packages/common/BUILD.bazel b/packages/common/BUILD.bazel index ebdd72f73c..7e429d92ec 100644 --- a/packages/common/BUILD.bazel +++ b/packages/common/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "common", srcs = glob( diff --git a/packages/common/http/BUILD.bazel b/packages/common/http/BUILD.bazel index 7fb75cfbd8..120fb214f5 100644 --- a/packages/common/http/BUILD.bazel +++ b/packages/common/http/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "http", srcs = glob( diff --git a/packages/common/http/testing/BUILD.bazel b/packages/common/http/testing/BUILD.bazel index 2679e45ed3..74fab73105 100644 --- a/packages/common/http/testing/BUILD.bazel +++ b/packages/common/http/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob( diff --git a/packages/common/locales/BUILD.bazel b/packages/common/locales/BUILD.bazel index 1ab81ae5b1..3a36a04ad9 100644 --- a/packages/common/locales/BUILD.bazel +++ b/packages/common/locales/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "npm_package", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "locales", srcs = glob( @@ -14,6 +14,10 @@ npm_package( name = "package", srcs = ["package.json"], replacements = { + + # Workaround for `.d.ts`` containing `/// ` + # which are generated in TypeScript v2.9, but not before. + "/// ": "", # Workaround for https://github.com/angular/angular/issues/23217 # Webpack will detect that the UMD outputs from TypeScript pass the # `require` function into the module, and cannot accurately track @@ -21,10 +25,6 @@ npm_package( # We don't actually import anything in the locale code so we can # null out the require reference passed into the module. "factory\(require, exports\)": "factory(null, exports)", - - # Workaround for `.d.ts`` containing `/// ` - # which are generated in TypeScript v2.9, but not before. - "/// ": "", }, deps = [":locales"], ) diff --git a/packages/common/testing/BUILD.bazel b/packages/common/testing/BUILD.bazel index c5028e1b31..9addcc00c3 100644 --- a/packages/common/testing/BUILD.bazel +++ b/packages/common/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob(["**/*.ts"]), diff --git a/packages/compiler-cli/BUILD.bazel b/packages/compiler-cli/BUILD.bazel index 65550129bb..9ce5738d5e 100644 --- a/packages/compiler-cli/BUILD.bazel +++ b/packages/compiler-cli/BUILD.bazel @@ -3,6 +3,8 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "npm_package", "ts_library") load("@npm_bazel_typescript//:defs.bzl", "ts_config") +package(default_visibility = ["//visibility:public"]) + ts_config( name = "tsconfig", src = "tsconfig-build.json", diff --git a/packages/compiler-cli/integrationtest/bazel/injectable_def/app/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injectable_def/app/BUILD.bazel index 489eeba8c2..524b44082a 100644 --- a/packages/compiler-cli/integrationtest/bazel/injectable_def/app/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injectable_def/app/BUILD.bazel @@ -1,6 +1,6 @@ -package(default_visibility = ["//visibility:public"]) +load("//tools:defaults.bzl", "ng_module") -load("//tools:defaults.bzl", "ng_module", "ts_library") +package(default_visibility = ["//visibility:public"]) ng_module( name = "app", diff --git a/packages/compiler-cli/integrationtest/bazel/injectable_def/app/test/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injectable_def/app/test/BUILD.bazel index d4c43d3479..6999d6c26a 100644 --- a/packages/compiler-cli/integrationtest/bazel/injectable_def/app/test/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injectable_def/app/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/integrationtest/bazel/injectable_def/lib1/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injectable_def/lib1/BUILD.bazel index 1541ba9e83..efa1d38972 100644 --- a/packages/compiler-cli/integrationtest/bazel/injectable_def/lib1/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injectable_def/lib1/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "lib1", srcs = glob( diff --git a/packages/compiler-cli/integrationtest/bazel/injectable_def/lib2/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injectable_def/lib2/BUILD.bazel index aee1ff6d32..e29a00e29c 100644 --- a/packages/compiler-cli/integrationtest/bazel/injectable_def/lib2/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injectable_def/lib2/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "lib2", srcs = glob( diff --git a/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/BUILD.bazel index a603a75afb..bd8a754c72 100644 --- a/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/BUILD.bazel @@ -1,7 +1,6 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module") -load("//packages/bazel/src:ng_rollup_bundle.bzl", "ng_rollup_bundle") + +package(default_visibility = ["//visibility:public"]) ng_module( name = "app", diff --git a/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/test/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/test/BUILD.bazel index 6cb9248d7e..ab1ed5eb0b 100644 --- a/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/test/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel index b65c58d7ce..e42d728325 100644 --- a/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel @@ -1,4 +1,6 @@ load("//packages/bazel:index.bzl", "ng_module") +load("//tools:defaults.bzl", "jasmine_node_test") +load(":extract_flat_module_index.bzl", "extract_flat_module_index") ng_module( name = "test_module", @@ -21,16 +23,12 @@ ng_module( ], ) -load(":extract_flat_module_index.bzl", "extract_flat_module_index") - extract_flat_module_index( name = "flat_module_index", testonly = True, deps = [":test_module"], ) -load("//tools:defaults.bzl", "jasmine_node_test") - jasmine_node_test( name = "test", srcs = ["spec.js"], diff --git a/packages/compiler-cli/src/ngcc/BUILD.bazel b/packages/compiler-cli/src/ngcc/BUILD.bazel index 54b7ed1a8e..271f47f2de 100644 --- a/packages/compiler-cli/src/ngcc/BUILD.bazel +++ b/packages/compiler-cli/src/ngcc/BUILD.bazel @@ -1,6 +1,6 @@ -package(default_visibility = ["//visibility:public"]) +load("//tools:defaults.bzl", "ts_library") -load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) ts_library( name = "ngcc", diff --git a/packages/compiler-cli/src/ngcc/test/BUILD.bazel b/packages/compiler-cli/src/ngcc/test/BUILD.bazel index f1b6941b95..f2e51149d1 100644 --- a/packages/compiler-cli/src/ngcc/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngcc/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/src/ngtsc/annotations/BUILD.bazel b/packages/compiler-cli/src/ngtsc/annotations/BUILD.bazel index a9e04b3cdc..ea3eb2f159 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/annotations/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "annotations", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), deps = [ diff --git a/packages/compiler-cli/src/ngtsc/annotations/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/annotations/test/BUILD.bazel index cf13057e6a..e6da783313 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/annotations/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/BUILD.bazel b/packages/compiler-cli/src/ngtsc/diagnostics/BUILD.bazel index 2b0efabac8..965c7ae178 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/diagnostics/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "diagnostics", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), deps = [ diff --git a/packages/compiler-cli/src/ngtsc/entry_point/BUILD.bazel b/packages/compiler-cli/src/ngtsc/entry_point/BUILD.bazel index c0c7c991bf..77c0d8fc55 100644 --- a/packages/compiler-cli/src/ngtsc/entry_point/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/entry_point/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "entry_point", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), module_name = "@angular/compiler-cli/src/ngtsc/entry_point", diff --git a/packages/compiler-cli/src/ngtsc/entry_point/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/entry_point/test/BUILD.bazel index e149fa0f33..cb761a55da 100644 --- a/packages/compiler-cli/src/ngtsc/entry_point/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/entry_point/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/src/ngtsc/imports/BUILD.bazel b/packages/compiler-cli/src/ngtsc/imports/BUILD.bazel index 6f8cb487a9..07db415e02 100644 --- a/packages/compiler-cli/src/ngtsc/imports/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/imports/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "imports", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/*.ts", ]), deps = [ diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/BUILD.bazel b/packages/compiler-cli/src/ngtsc/partial_evaluator/BUILD.bazel index 95c2478682..02979fd2da 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "partial_evaluator", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/*.ts", ]), module_name = "@angular/compiler-cli/src/ngtsc/partial_evaluator", diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/BUILD.bazel index c79c44c2cb..d4caa3a9ed 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/src/ngtsc/reflection/BUILD.bazel b/packages/compiler-cli/src/ngtsc/reflection/BUILD.bazel index 6047781396..591bba9075 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/reflection/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "reflection", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), deps = ["@ngdeps//typescript"], diff --git a/packages/compiler-cli/src/ngtsc/reflection/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/reflection/test/BUILD.bazel index c9301bc16d..55e21e18e8 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/reflection/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/src/ngtsc/shims/BUILD.bazel b/packages/compiler-cli/src/ngtsc/shims/BUILD.bazel index 7f8e78488e..f25ef3e838 100644 --- a/packages/compiler-cli/src/ngtsc/shims/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/shims/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "shims", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), deps = [ diff --git a/packages/compiler-cli/src/ngtsc/shims/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/shims/test/BUILD.bazel index 505ca31152..381f9cdd88 100644 --- a/packages/compiler-cli/src/ngtsc/shims/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/shims/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/src/ngtsc/switch/BUILD.bazel b/packages/compiler-cli/src/ngtsc/switch/BUILD.bazel index e5f9ad5d80..cb758ef2bb 100644 --- a/packages/compiler-cli/src/ngtsc/switch/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/switch/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "switch", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), deps = [ diff --git a/packages/compiler-cli/src/ngtsc/testing/BUILD.bazel b/packages/compiler-cli/src/ngtsc/testing/BUILD.bazel index db42c39981..7509f42d95 100644 --- a/packages/compiler-cli/src/ngtsc/testing/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/testing/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "testing", testonly = True, diff --git a/packages/compiler-cli/src/ngtsc/transform/BUILD.bazel b/packages/compiler-cli/src/ngtsc/transform/BUILD.bazel index e438e91560..d3a6fe38da 100644 --- a/packages/compiler-cli/src/ngtsc/transform/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/transform/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "transform", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), deps = [ diff --git a/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel b/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel index df6dd0884f..5da5a9dcac 100644 --- a/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "translator", srcs = glob(["**/*.ts"]), diff --git a/packages/compiler-cli/src/ngtsc/typecheck/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/BUILD.bazel index f76e8d5b0a..12725051a4 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/typecheck/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "typecheck", srcs = glob(["**/*.ts"]), diff --git a/packages/compiler-cli/src/ngtsc/typecheck/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/test/BUILD.bazel index 233796c5ff..cc73dee179 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/typecheck/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/src/ngtsc/util/BUILD.bazel b/packages/compiler-cli/src/ngtsc/util/BUILD.bazel index 4f385af484..2ae5def318 100644 --- a/packages/compiler-cli/src/ngtsc/util/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/util/BUILD.bazel @@ -1,11 +1,10 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "util", srcs = glob([ - "index.ts", "src/**/*.ts", ]), deps = [ diff --git a/packages/compiler-cli/src/ngtsc/util/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/util/test/BUILD.bazel index 88ddde2ad7..0aaa4f777c 100644 --- a/packages/compiler-cli/src/ngtsc/util/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/util/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/compiler-cli/test/ngtsc/fake_core/BUILD.bazel b/packages/compiler-cli/test/ngtsc/fake_core/BUILD.bazel index b8af5238a3..e15812685b 100644 --- a/packages/compiler-cli/test/ngtsc/fake_core/BUILD.bazel +++ b/packages/compiler-cli/test/ngtsc/fake_core/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_package", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "fake_core", srcs = [ diff --git a/packages/compiler/BUILD.bazel b/packages/compiler/BUILD.bazel index a2d2e78bc4..717982e2ea 100644 --- a/packages/compiler/BUILD.bazel +++ b/packages/compiler/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_package", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "compiler", srcs = glob( diff --git a/packages/compiler/testing/BUILD.bazel b/packages/compiler/testing/BUILD.bazel index f47ee11d51..188ec1260c 100644 --- a/packages/compiler/testing/BUILD.bazel +++ b/packages/compiler/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob( diff --git a/packages/core/BUILD.bazel b/packages/core/BUILD.bazel index bacfc259d3..193bdf0cf5 100644 --- a/packages/core/BUILD.bazel +++ b/packages/core/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "core", srcs = glob( diff --git a/packages/core/src/compiler/BUILD.bazel b/packages/core/src/compiler/BUILD.bazel index eabb68ecff..457eb5db78 100644 --- a/packages/core/src/compiler/BUILD.bazel +++ b/packages/core/src/compiler/BUILD.bazel @@ -1,11 +1,11 @@ +load("//tools:defaults.bzl", "ts_library") + package(default_visibility = [ "//packages/compiler/test:__pkg__", "//packages/core:__subpackages__", "//tools/public_api_guard:__pkg__", ]) -load("//tools:defaults.bzl", "ts_library") - ts_library( name = "compiler", srcs = glob( diff --git a/packages/core/src/di/interface/BUILD.bazel b/packages/core/src/di/interface/BUILD.bazel index 11b110996f..c27b5da5f0 100644 --- a/packages/core/src/di/interface/BUILD.bazel +++ b/packages/core/src/di/interface/BUILD.bazel @@ -1,10 +1,10 @@ +load("//tools:defaults.bzl", "ts_library") + package(default_visibility = [ "//packages/core:__subpackages__", "//tools/public_api_guard:__pkg__", ]) -load("//tools:defaults.bzl", "ts_library") - ts_library( name = "interface", srcs = glob( diff --git a/packages/core/src/interface/BUILD.bazel b/packages/core/src/interface/BUILD.bazel index 57391b768e..8f38896a4d 100644 --- a/packages/core/src/interface/BUILD.bazel +++ b/packages/core/src/interface/BUILD.bazel @@ -1,10 +1,10 @@ +load("//tools:defaults.bzl", "ts_library") + package(default_visibility = [ "//packages/core:__subpackages__", "//tools/public_api_guard:__pkg__", ]) -load("//tools:defaults.bzl", "ts_library") - ts_library( name = "interface", srcs = glob( diff --git a/packages/core/src/reflection/BUILD.bazel b/packages/core/src/reflection/BUILD.bazel index 73d9f570cd..baeae5551a 100644 --- a/packages/core/src/reflection/BUILD.bazel +++ b/packages/core/src/reflection/BUILD.bazel @@ -1,10 +1,10 @@ +load("//tools:defaults.bzl", "ts_library") + package(default_visibility = [ "//packages/core:__subpackages__", "//tools/public_api_guard:__pkg__", ]) -load("//tools:defaults.bzl", "ts_library") - ts_library( name = "reflection", srcs = glob( diff --git a/packages/core/src/util/BUILD.bazel b/packages/core/src/util/BUILD.bazel index 7cf01e30b2..f1752340de 100644 --- a/packages/core/src/util/BUILD.bazel +++ b/packages/core/src/util/BUILD.bazel @@ -1,10 +1,10 @@ +load("//tools:defaults.bzl", "ts_library") + package(default_visibility = [ "//packages/core:__subpackages__", "//tools/public_api_guard:__pkg__", ]) -load("//tools:defaults.bzl", "ts_library") - ts_library( name = "util", srcs = glob( diff --git a/packages/core/test/BUILD.bazel b/packages/core/test/BUILD.bazel index face8ab22b..c14aad99c1 100644 --- a/packages/core/test/BUILD.bazel +++ b/packages/core/test/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library", "ts_web_test_suite") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "test_lib", testonly = True, diff --git a/packages/core/test/bundling/animation_world/BUILD.bazel b/packages/core/test/bundling/animation_world/BUILD.bazel index c16b41d6b1..42dc72553b 100644 --- a/packages/core/test/bundling/animation_world/BUILD.bazel +++ b/packages/core/test/bundling/animation_world/BUILD.bazel @@ -3,6 +3,8 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle", "ts_library") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "animation_world", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/hello_world/BUILD.bazel b/packages/core/test/bundling/hello_world/BUILD.bazel index 4a48c199b4..36cb746bb3 100644 --- a/packages/core/test/bundling/hello_world/BUILD.bazel +++ b/packages/core/test/bundling/hello_world/BUILD.bazel @@ -4,6 +4,8 @@ load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle load("//tools/symbol-extractor:index.bzl", "js_expected_symbol_test") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "hello_world", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/hello_world_i18n/BUILD.bazel b/packages/core/test/bundling/hello_world_i18n/BUILD.bazel index f19fdffa30..489410577d 100644 --- a/packages/core/test/bundling/hello_world_i18n/BUILD.bazel +++ b/packages/core/test/bundling/hello_world_i18n/BUILD.bazel @@ -3,6 +3,8 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle", "ts_library") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "hello_world_i18n", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/hello_world_r2/BUILD.bazel b/packages/core/test/bundling/hello_world_r2/BUILD.bazel index 1601c9b57b..9d1d446a2d 100644 --- a/packages/core/test/bundling/hello_world_r2/BUILD.bazel +++ b/packages/core/test/bundling/hello_world_r2/BUILD.bazel @@ -3,6 +3,8 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle", "ts_library") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "hello_world", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/injection/BUILD.bazel b/packages/core/test/bundling/injection/BUILD.bazel index 170bf48536..8caa0a1f01 100644 --- a/packages/core/test/bundling/injection/BUILD.bazel +++ b/packages/core/test/bundling/injection/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - -load("//tools:defaults.bzl", "jasmine_node_test", "ng_rollup_bundle", "ts_library") load("//tools/symbol-extractor:index.bzl", "js_expected_symbol_test") +load("//tools:defaults.bzl", "jasmine_node_test", "ng_rollup_bundle", "ts_library") + +package(default_visibility = ["//visibility:public"]) ts_library( name = "injection", diff --git a/packages/core/test/bundling/todo/BUILD.bazel b/packages/core/test/bundling/todo/BUILD.bazel index eb60ff4618..0d6cbbf46c 100644 --- a/packages/core/test/bundling/todo/BUILD.bazel +++ b/packages/core/test/bundling/todo/BUILD.bazel @@ -5,6 +5,8 @@ load("//tools/symbol-extractor:index.bzl", "js_expected_symbol_test") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "todo", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/todo_i18n/BUILD.bazel b/packages/core/test/bundling/todo_i18n/BUILD.bazel index 94da2d7409..cb61d0b738 100644 --- a/packages/core/test/bundling/todo_i18n/BUILD.bazel +++ b/packages/core/test/bundling/todo_i18n/BUILD.bazel @@ -4,6 +4,8 @@ load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "todo_i18n", srcs = [ diff --git a/packages/core/test/bundling/todo_r2/BUILD.bazel b/packages/core/test/bundling/todo_r2/BUILD.bazel index 3eeed75691..6ce564bc0b 100644 --- a/packages/core/test/bundling/todo_r2/BUILD.bazel +++ b/packages/core/test/bundling/todo_r2/BUILD.bazel @@ -4,6 +4,8 @@ load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "todo", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/util/BUILD.bazel b/packages/core/test/bundling/util/BUILD.bazel index 185c23677b..c596830d96 100644 --- a/packages/core/test/bundling/util/BUILD.bazel +++ b/packages/core/test/bundling/util/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + # Either loads reflect-metadata or is a no-op, depending on whether compilation is in JIT mode. ts_library( name = "reflect_metadata", diff --git a/packages/core/test/render3/BUILD.bazel b/packages/core/test/render3/BUILD.bazel index c2ad02cac1..0cd5a39ce6 100644 --- a/packages/core/test/render3/BUILD.bazel +++ b/packages/core/test/render3/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library", "ts_web_test_suite") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "render3_lib", testonly = True, diff --git a/packages/core/test/render3/ivy/BUILD.bazel b/packages/core/test/render3/ivy/BUILD.bazel index efd2b58d8e..39e0a8ce87 100644 --- a/packages/core/test/render3/ivy/BUILD.bazel +++ b/packages/core/test/render3/ivy/BUILD.bazel @@ -1,6 +1,6 @@ -package(default_visibility = ["//visibility:public"]) +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") -load("//tools:defaults.bzl", "jasmine_node_test", "ts_library", "ts_web_test_suite") +package(default_visibility = ["//visibility:public"]) ts_library( name = "ivy_lib", diff --git a/packages/core/test/view/BUILD.bazel b/packages/core/test/view/BUILD.bazel index e4b7fb7200..306a050734 100644 --- a/packages/core/test/view/BUILD.bazel +++ b/packages/core/test/view/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library", "ts_web_test_suite") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "view_lib", testonly = True, diff --git a/packages/core/testing/BUILD.bazel b/packages/core/testing/BUILD.bazel index 8e20a93e78..774fd2ad42 100644 --- a/packages/core/testing/BUILD.bazel +++ b/packages/core/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob( diff --git a/packages/elements/BUILD.bazel b/packages/elements/BUILD.bazel index f53290fb5a..30ab2b5ab3 100644 --- a/packages/elements/BUILD.bazel +++ b/packages/elements/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "elements", srcs = glob( diff --git a/packages/elements/schematics/BUILD.bazel b/packages/elements/schematics/BUILD.bazel index 3a3c20fa78..f3d17d4571 100644 --- a/packages/elements/schematics/BUILD.bazel +++ b/packages/elements/schematics/BUILD.bazel @@ -1,6 +1,6 @@ -package(default_visibility = ["//visibility:public"]) +load("//tools:defaults.bzl", "npm_package") -load("//tools:defaults.bzl", "npm_package", "ts_library") +package(default_visibility = ["//visibility:public"]) exports_files([ "package.json", diff --git a/packages/elements/schematics/ng-add/BUILD.bazel b/packages/elements/schematics/ng-add/BUILD.bazel index 5c1703fe3b..c7825948bd 100644 --- a/packages/elements/schematics/ng-add/BUILD.bazel +++ b/packages/elements/schematics/ng-add/BUILD.bazel @@ -1,15 +1,14 @@ -package(default_visibility = ["//visibility:public"]) +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") -load("//tools:defaults.bzl", "jasmine_node_test", "npm_package", "ts_library") +package(default_visibility = ["//visibility:public"]) ts_library( name = "ng-add", - srcs = glob( + srcs = [ "index.ts", "schema.ts", ], - ), deps = [ "//packages/common", "//packages/core", @@ -21,11 +20,9 @@ ts_library( ts_library( name = "test_lib", testonly = True, - srcs = glob( - [ - "index_spec.ts", - ], - ), + srcs = [ + "index_spec.ts", + ], deps = [ ":ng-add", "//packages/common", diff --git a/packages/elements/test/BUILD.bazel b/packages/elements/test/BUILD.bazel index 06549ecf4a..71bea73873 100644 --- a/packages/elements/test/BUILD.bazel +++ b/packages/elements/test/BUILD.bazel @@ -1,4 +1,4 @@ -load("//tools:defaults.bzl", "jasmine_node_test", "ts_library", "ts_web_test_suite") +load("//tools:defaults.bzl", "ts_library", "ts_web_test_suite") ts_library( name = "test_lib", diff --git a/packages/forms/BUILD.bazel b/packages/forms/BUILD.bazel index f5f87572fe..ec38d66fd6 100644 --- a/packages/forms/BUILD.bazel +++ b/packages/forms/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "forms", srcs = glob( diff --git a/packages/http/BUILD.bazel b/packages/http/BUILD.bazel index 13559eb7d8..b43f975831 100644 --- a/packages/http/BUILD.bazel +++ b/packages/http/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "http", srcs = glob( diff --git a/packages/http/testing/BUILD.bazel b/packages/http/testing/BUILD.bazel index cc00a93b2e..b2cfc00ea5 100644 --- a/packages/http/testing/BUILD.bazel +++ b/packages/http/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob(["**/*.ts"]), diff --git a/packages/language-service/BUILD.bazel b/packages/language-service/BUILD.bazel index 4454b2a11c..e1c9a382c9 100644 --- a/packages/language-service/BUILD.bazel +++ b/packages/language-service/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "npm_package", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "language-service", srcs = glob( diff --git a/packages/language-service/bundles/BUILD.bazel b/packages/language-service/bundles/BUILD.bazel index edc67cde63..951be9ef5e 100644 --- a/packages/language-service/bundles/BUILD.bazel +++ b/packages/language-service/bundles/BUILD.bazel @@ -4,9 +4,9 @@ ls_rollup_bundle( name = "language-service", entry_point = "packages/language-service/index.js", globals = { - "typescript": "ts", - "path": "path", "fs": "fs", + "path": "path", + "typescript": "ts", }, license_banner = "banner.js.txt", visibility = ["//packages/language-service:__pkg__"], diff --git a/packages/platform-browser-dynamic/BUILD.bazel b/packages/platform-browser-dynamic/BUILD.bazel index be5a391d27..644680e019 100644 --- a/packages/platform-browser-dynamic/BUILD.bazel +++ b/packages/platform-browser-dynamic/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "platform-browser-dynamic", srcs = glob( diff --git a/packages/platform-browser-dynamic/testing/BUILD.bazel b/packages/platform-browser-dynamic/testing/BUILD.bazel index 860821fe91..b832166efa 100644 --- a/packages/platform-browser-dynamic/testing/BUILD.bazel +++ b/packages/platform-browser-dynamic/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob(["**/*.ts"]), diff --git a/packages/platform-browser/BUILD.bazel b/packages/platform-browser/BUILD.bazel index 1be13db7f1..35ceb82f5f 100644 --- a/packages/platform-browser/BUILD.bazel +++ b/packages/platform-browser/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "platform-browser", srcs = glob( diff --git a/packages/platform-browser/animations/BUILD.bazel b/packages/platform-browser/animations/BUILD.bazel index 95208ba8dd..f806e76519 100644 --- a/packages/platform-browser/animations/BUILD.bazel +++ b/packages/platform-browser/animations/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "animations", srcs = glob( diff --git a/packages/platform-browser/testing/BUILD.bazel b/packages/platform-browser/testing/BUILD.bazel index 650c7e35e9..85ebed9b67 100644 --- a/packages/platform-browser/testing/BUILD.bazel +++ b/packages/platform-browser/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob(["**/*.ts"]), diff --git a/packages/platform-server/BUILD.bazel b/packages/platform-server/BUILD.bazel index f8b77b017f..b94304cc54 100644 --- a/packages/platform-server/BUILD.bazel +++ b/packages/platform-server/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "platform-server", srcs = glob( diff --git a/packages/platform-server/testing/BUILD.bazel b/packages/platform-server/testing/BUILD.bazel index 45a2ce183b..66ea22d96e 100644 --- a/packages/platform-server/testing/BUILD.bazel +++ b/packages/platform-server/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob(["**/*.ts"]), diff --git a/packages/platform-webworker-dynamic/BUILD.bazel b/packages/platform-webworker-dynamic/BUILD.bazel index f43e4269a7..fec50fa318 100644 --- a/packages/platform-webworker-dynamic/BUILD.bazel +++ b/packages/platform-webworker-dynamic/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "platform-webworker-dynamic", srcs = glob( diff --git a/packages/platform-webworker/BUILD.bazel b/packages/platform-webworker/BUILD.bazel index f162b993b6..d3a1057105 100644 --- a/packages/platform-webworker/BUILD.bazel +++ b/packages/platform-webworker/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "platform-webworker", srcs = glob( diff --git a/packages/private/testing/BUILD.bazel b/packages/private/testing/BUILD.bazel index 90299288c5..9981322971 100644 --- a/packages/private/testing/BUILD.bazel +++ b/packages/private/testing/BUILD.bazel @@ -5,8 +5,6 @@ package(default_visibility = [ exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", testonly = True, diff --git a/packages/router/BUILD.bazel b/packages/router/BUILD.bazel index d6c244852f..97e0c52a3c 100644 --- a/packages/router/BUILD.bazel +++ b/packages/router/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "router", srcs = glob( diff --git a/packages/router/test/aot_ngsummary_test/BUILD.bazel b/packages/router/test/aot_ngsummary_test/BUILD.bazel index 65d4c197cc..5a4b60bf49 100644 --- a/packages/router/test/aot_ngsummary_test/BUILD.bazel +++ b/packages/router/test/aot_ngsummary_test/BUILD.bazel @@ -1,4 +1,4 @@ -load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ts_library", "ts_web_test_suite") +load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ts_library") ng_module( name = "aot_routing_module", diff --git a/packages/router/testing/BUILD.bazel b/packages/router/testing/BUILD.bazel index cc75d95dcb..5061eeeec6 100644 --- a/packages/router/testing/BUILD.bazel +++ b/packages/router/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "testing", srcs = glob(["**/*.ts"]), diff --git a/packages/router/upgrade/BUILD.bazel b/packages/router/upgrade/BUILD.bazel index eb0452285d..9004665b68 100644 --- a/packages/router/upgrade/BUILD.bazel +++ b/packages/router/upgrade/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "upgrade", srcs = glob( diff --git a/packages/service-worker/BUILD.bazel b/packages/service-worker/BUILD.bazel index 5f46c64007..7eb0955228 100644 --- a/packages/service-worker/BUILD.bazel +++ b/packages/service-worker/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "service-worker", srcs = glob( diff --git a/packages/service-worker/cli/BUILD.bazel b/packages/service-worker/cli/BUILD.bazel index 97d0adb3d0..ce2c48bee4 100644 --- a/packages/service-worker/cli/BUILD.bazel +++ b/packages/service-worker/cli/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_rollup_bundle", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "cli", srcs = glob( diff --git a/packages/service-worker/config/BUILD.bazel b/packages/service-worker/config/BUILD.bazel index 2b052804ee..638a39301a 100644 --- a/packages/service-worker/config/BUILD.bazel +++ b/packages/service-worker/config/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "config", srcs = glob([ diff --git a/packages/service-worker/config/testing/BUILD.bazel b/packages/service-worker/config/testing/BUILD.bazel index e1498fd1e4..3c1ba46fdc 100644 --- a/packages/service-worker/config/testing/BUILD.bazel +++ b/packages/service-worker/config/testing/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ts_library") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ts_library") - ts_library( name = "testing", srcs = glob([ diff --git a/packages/service-worker/testing/BUILD.bazel b/packages/service-worker/testing/BUILD.bazel index 3878b16b95..25b06c37e3 100644 --- a/packages/service-worker/testing/BUILD.bazel +++ b/packages/service-worker/testing/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "testing", testonly = True, diff --git a/packages/service-worker/worker/BUILD.bazel b/packages/service-worker/worker/BUILD.bazel index 84fe858dca..c4ec4e90c6 100644 --- a/packages/service-worker/worker/BUILD.bazel +++ b/packages/service-worker/worker/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_rollup_bundle", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "worker", srcs = glob( diff --git a/packages/service-worker/worker/testing/BUILD.bazel b/packages/service-worker/worker/testing/BUILD.bazel index a593be6cb1..1c98b537da 100644 --- a/packages/service-worker/worker/testing/BUILD.bazel +++ b/packages/service-worker/worker/testing/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "testing", testonly = True, diff --git a/packages/upgrade/BUILD.bazel b/packages/upgrade/BUILD.bazel index 12be6dcffa..af9f35723a 100644 --- a/packages/upgrade/BUILD.bazel +++ b/packages/upgrade/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ng_module", "ng_package") +package(default_visibility = ["//visibility:public"]) + ng_module( name = "upgrade", srcs = glob( diff --git a/packages/upgrade/static/BUILD.bazel b/packages/upgrade/static/BUILD.bazel index ec750a8b9a..6f9bfc7b15 100644 --- a/packages/upgrade/static/BUILD.bazel +++ b/packages/upgrade/static/BUILD.bazel @@ -1,9 +1,9 @@ +load("//tools:defaults.bzl", "ng_module") + package(default_visibility = ["//visibility:public"]) exports_files(["package.json"]) -load("//tools:defaults.bzl", "ng_module") - ng_module( name = "static", # Note: There is Bazel issue where Windows symlinks diff --git a/packages/upgrade/test/BUILD.bazel b/packages/upgrade/test/BUILD.bazel index e8cae7a5b6..d36a265c91 100644 --- a/packages/upgrade/test/BUILD.bazel +++ b/packages/upgrade/test/BUILD.bazel @@ -1,4 +1,4 @@ -load("//tools:defaults.bzl", "jasmine_node_test", "ts_library", "ts_web_test_suite") +load("//tools:defaults.bzl", "ts_library", "ts_web_test_suite") ts_library( name = "test_lib", diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 776cd8c555..078ef8068a 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -6,6 +6,7 @@ load("@npm_bazel_karma//:defs.bzl", _karma_web_test = "karma_web_test", _karma_w load("@npm_bazel_typescript//:defs.bzl", _ts_library = "ts_library") load("//packages/bazel:index.bzl", _ng_module = "ng_module", _ng_package = "ng_package") load("//packages/bazel/src:ng_rollup_bundle.bzl", _ng_rollup_bundle = "ng_rollup_bundle") +load("//packages/bazel:index.bzl", _ng_module = "ng_module", _ng_package = "ng_package") _DEFAULT_TSCONFIG_BUILD = "//packages:tsconfig-build.json" _DEFAULT_TSCONFIG_TEST = "//packages:tsconfig-test" diff --git a/tools/ng_setup_workspace.bzl b/tools/ng_setup_workspace.bzl index a705f91e37..259c96af1a 100644 --- a/tools/ng_setup_workspace.bzl +++ b/tools/ng_setup_workspace.bzl @@ -5,9 +5,9 @@ "Install angular source dependencies" -load("@build_bazel_rules_nodejs//:package.bzl", "check_rules_nodejs_version") -load("@build_bazel_rules_nodejs//:defs.bzl", "yarn_install") load("@angular//packages/bazel/src:ng_setup_workspace.bzl", _ng_setup_workspace = "ng_setup_workspace") +load("@build_bazel_rules_nodejs//:defs.bzl", "yarn_install") +load("@build_bazel_rules_nodejs//:package.bzl", "check_rules_nodejs_version") def ng_setup_workspace(): """This repository rule should be called from your WORKSPACE file. diff --git a/tools/public_api_guard/BUILD.bazel b/tools/public_api_guard/BUILD.bazel index 918bae387c..2b3b335791 100644 --- a/tools/public_api_guard/BUILD.bazel +++ b/tools/public_api_guard/BUILD.bazel @@ -1,7 +1,7 @@ load("//tools/ts-api-guardian:index.bzl", "ts_api_guardian_test") load(":public_api_guard.bzl", "generate_targets") -generate_targets(glob( +generate_targets(golden_files = glob( ["*/**/*.d.ts"], # exclude the following target because we have an explicit target for it bellow, see :core_api exclude = ["core/core.d.ts"], diff --git a/tools/symbol-extractor/BUILD.bazel b/tools/symbol-extractor/BUILD.bazel index d3f8cfb55b..68945a07dd 100644 --- a/tools/symbol-extractor/BUILD.bazel +++ b/tools/symbol-extractor/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "lib", testonly = True, diff --git a/tools/testing/BUILD.bazel b/tools/testing/BUILD.bazel index 0af43b2a7a..2f0d7bf928 100644 --- a/tools/testing/BUILD.bazel +++ b/tools/testing/BUILD.bazel @@ -1,7 +1,7 @@ -package(default_visibility = ["//visibility:public"]) - load("//tools:defaults.bzl", "ts_library") +package(default_visibility = ["//visibility:public"]) + ts_library( name = "browser", testonly = 1, diff --git a/tools/ts-api-guardian/BUILD.bazel b/tools/ts-api-guardian/BUILD.bazel index 191aa162e0..eb6c2f2f07 100644 --- a/tools/ts-api-guardian/BUILD.bazel +++ b/tools/ts-api-guardian/BUILD.bazel @@ -1,8 +1,6 @@ load( "@build_bazel_rules_nodejs//:defs.bzl", "jasmine_node_test", - "node_modules_filegroup", - "nodejs_binary", "npm_package", ) load("@npm_bazel_typescript//:defs.bzl", "ts_library") diff --git a/yarn.lock b/yarn.lock index 2f4acfb2ed..5a624242a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -82,23 +82,23 @@ "@bazel/bazel-linux_x64" "0.22.0" "@bazel/bazel-win32_x64" "0.22.0" -"@bazel/buildifier-darwin_x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@bazel/buildifier-darwin_x64/-/buildifier-darwin_x64-0.19.2.tgz#1182862b4a3578fb9367ab42e807131187a61702" - integrity sha512-f6CITRj8jFhhZFrQkIao3IgJjZAXGYwUkW/QBSeAu0HIltBerJ0FTt/Nmu9ji1QZYT2aO4RpZ8oJksG6xv1dcQ== +"@bazel/buildifier-darwin_x64@0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@bazel/buildifier-darwin_x64/-/buildifier-darwin_x64-0.20.0.tgz#1aeceb5a1a57a62eef6415377dbe95091781a7d4" + integrity sha512-yV7niwbdpDDPUw1vgyk1wIjPl3+YOM4o5FPgFmnFgzf48JUqrF3PK6Blg95Z8SqGOVoJAOChRC1GvopzEUzwZA== -"@bazel/buildifier-linux_x64@0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@bazel/buildifier-linux_x64/-/buildifier-linux_x64-0.19.2.tgz#8b26eaf1f091cd3846a7dd7ea94008b55498401e" - integrity sha512-kJjzbrjuAW4yVms5mbTWSHpJF6ogDLkuq4MjVP6a03umQ7E15o9YoxbDoiN+CzAj9ZMWPWfc5/N5TouiwXkGzA== +"@bazel/buildifier-linux_x64@0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@bazel/buildifier-linux_x64/-/buildifier-linux_x64-0.20.0.tgz#8cb6c8f999dbd8a9ee183906f202b698571d771b" + integrity sha512-djbBtcacgERWZoxjEm8lGmMyEaOYB3moiz0kioHTQc2F96wNLfm6Cikd4Ojrcj5VNQCMW9oy3YFTu+c5mIrCcA== -"@bazel/buildifier@^0.19.2": - version "0.19.2" - resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-0.19.2.tgz#3e077de346ad98561cee703297aa8db50cfb3c76" - integrity sha512-MwkuoQdOdZ/VYKJvZe3qVCn3/20pLJyJpzNl3cBmaccWeUtdDKhtOm8YlLU08lxrt0VcKNcTYt4uiA62e/315A== +"@bazel/buildifier@^0.20.0": + version "0.20.0" + resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-0.20.0.tgz#24a10e485fe65dbd75ef812cf37635df1fb91d0d" + integrity sha512-dahQRtE1KEp+efUV23q/JtOCSbQEk5C/+H3J33g8wP5roxMUa8mfDto85eloJ+gRPW7yOybxknuRYc4KSpgT7w== optionalDependencies: - "@bazel/buildifier-darwin_x64" "0.19.2" - "@bazel/buildifier-linux_x64" "0.19.2" + "@bazel/buildifier-darwin_x64" "0.20.0" + "@bazel/buildifier-linux_x64" "0.20.0" "@bazel/ibazel@~0.9.0": version "0.9.0" From dad5a258b860de83ff6a48e19063151efba24644 Mon Sep 17 00:00:00 2001 From: Wassim Chegham Date: Tue, 26 Feb 2019 13:30:44 +0100 Subject: [PATCH 0145/1073] style: enforce buildifier lint on CI (#28186) PR Close #28186 --- BUILD.bazel | 1 - WORKSPACE | 3 +- integration/bazel/WORKSPACE | 7 ++- integration/bazel/src/BUILD.bazel | 4 +- integration/bazel/src/hello-world/BUILD.bazel | 2 - .../benchmarks/src/largetable/iv/BUILD.bazel | 1 - .../src/largetable/render3/BUILD.bazel | 2 - .../benchmarks/src/tree/render3/BUILD.bazel | 2 - .../src/zippy_component/BUILD.bazel | 2 +- package.json | 2 +- packages/BUILD.bazel | 2 - packages/bazel/src/BUILD.bazel | 2 + packages/bazel/src/esm5.bzl | 5 -- packages/bazel/src/ng_module.bzl | 49 +++++++------------ packages/bazel/src/ng_package/BUILD.bazel | 2 + packages/bazel/src/ng_package/ng_package.bzl | 16 ++---- .../bazel/src/protractor/utils/BUILD.bazel | 2 - packages/compiler-cli/BUILD.bazel | 2 - .../compiler-cli/src/ngtsc/cycles/BUILD.bazel | 3 +- .../compiler-cli/src/ngtsc/path/BUILD.bazel | 3 +- .../src/ngtsc/routing/BUILD.bazel | 3 +- .../compiler-cli/src/ngtsc/scope/BUILD.bazel | 3 +- .../test/ngtsc/fake_core/BUILD.bazel | 4 +- .../test/bundling/animation_world/BUILD.bazel | 4 +- .../test/bundling/hello_world/BUILD.bazel | 2 - .../bundling/hello_world_i18n/BUILD.bazel | 4 +- .../test/bundling/hello_world_r2/BUILD.bazel | 2 - packages/core/test/bundling/todo/BUILD.bazel | 2 - .../core/test/bundling/todo_i18n/BUILD.bazel | 2 - .../core/test/bundling/todo_r2/BUILD.bazel | 2 - packages/private/testing/BUILD.bazel | 2 + tools/defaults.bzl | 1 - yarn.lock | 28 +++++------ 33 files changed, 60 insertions(+), 111 deletions(-) diff --git a/BUILD.bazel b/BUILD.bazel index 86f2622049..021a333ee9 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -2,7 +2,6 @@ load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") package(default_visibility = ["//visibility:public"]) -load("@build_bazel_rules_nodejs//:defs.bzl", "node_modules_filegroup") load("//tools:defaults.bzl", "karma_web_test") exports_files([ diff --git a/WORKSPACE b/WORKSPACE index a48369410e..bc2dcc6ca9 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -35,7 +35,8 @@ load("@build_bazel_rules_nodejs//:defs.bzl", "check_bazel_version", "node_reposi # Bazel version must be at least v0.21.0 because: # - 0.21.0 Using --incompatible_strict_action_env flag fixes cache when running `yarn bazel` # (see https://github.com/angular/angular/issues/27514#issuecomment-451438271) -check_bazel_version("0.21.0", """ +check_bazel_version( + message = """ You no longer need to install Bazel on your machine. Angular has a dependency on the @bazel/bazel package which supplies it. Try running `yarn bazel` instead. diff --git a/integration/bazel/WORKSPACE b/integration/bazel/WORKSPACE index 2d77e96a3a..86c1470cac 100644 --- a/integration/bazel/WORKSPACE +++ b/integration/bazel/WORKSPACE @@ -23,13 +23,16 @@ load("@build_bazel_rules_nodejs//:defs.bzl", "check_bazel_version", "node_reposi # Bazel version must be at least v0.21.0 because: # - 0.21.0 Using --incompatible_strict_action_env flag fixes cache when running `yarn bazel` # (see https://github.com/angular/angular/issues/27514#issuecomment-451438271) -check_bazel_version("0.21.0", """ +check_bazel_version( + message = """ You no longer need to install Bazel on your machine. Angular has a dependency on the @bazel/bazel package which supplies it. Try running `yarn bazel` instead. (If you did run that, check that you've got a fresh `yarn install`) -""") +""", + minimum_bazel_version = "0.21.0", +) # Setup the Node.js toolchain node_repositories( diff --git a/integration/bazel/src/BUILD.bazel b/integration/bazel/src/BUILD.bazel index 7ea70c2a09..e04abde8c5 100644 --- a/integration/bazel/src/BUILD.bazel +++ b/integration/bazel/src/BUILD.bazel @@ -1,12 +1,10 @@ package(default_visibility = ["//visibility:public"]) load("@npm_angular_bazel//:index.bzl", "ng_module") -load("@build_bazel_rules_nodejs//:defs.bzl", "http_server", "nodejs_binary", "rollup_bundle") +load("@build_bazel_rules_nodejs//:defs.bzl", "http_server", "rollup_bundle") load("@build_bazel_rules_nodejs//internal/web_package:web_package.bzl", "web_package") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") -package(default_visibility = ["//visibility:public"]) - # Allow targets under sub-packages to reference the tsconfig.json file exports_files(["tsconfig.json"]) diff --git a/integration/bazel/src/hello-world/BUILD.bazel b/integration/bazel/src/hello-world/BUILD.bazel index abadf03c1b..e081522371 100644 --- a/integration/bazel/src/hello-world/BUILD.bazel +++ b/integration/bazel/src/hello-world/BUILD.bazel @@ -5,8 +5,6 @@ load("@npm_bazel_typescript//:defs.bzl", "ts_library") load("@io_bazel_rules_sass//sass:sass.bzl", "sass_binary") load("@npm_angular_bazel//:index.bzl", "ng_module", "ng_package") -package(default_visibility = ["//visibility:public"]) - sass_binary( name = "hello-world-styles", src = "hello-world.component.scss", diff --git a/modules/benchmarks/src/largetable/iv/BUILD.bazel b/modules/benchmarks/src/largetable/iv/BUILD.bazel index d7b68d723d..2c87ddba91 100644 --- a/modules/benchmarks/src/largetable/iv/BUILD.bazel +++ b/modules/benchmarks/src/largetable/iv/BUILD.bazel @@ -1,4 +1,3 @@ -load("//tools:defaults.bzl", "ts_library") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") diff --git a/modules/benchmarks/src/largetable/render3/BUILD.bazel b/modules/benchmarks/src/largetable/render3/BUILD.bazel index 306be43e2b..a4ae3675cb 100644 --- a/modules/benchmarks/src/largetable/render3/BUILD.bazel +++ b/modules/benchmarks/src/largetable/render3/BUILD.bazel @@ -4,8 +4,6 @@ load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") -package(default_visibility = ["//visibility:public"]) - ng_module( name = "largetable_lib", srcs = glob(["**/*.ts"]), diff --git a/modules/benchmarks/src/tree/render3/BUILD.bazel b/modules/benchmarks/src/tree/render3/BUILD.bazel index b51b4d9656..705018b0eb 100644 --- a/modules/benchmarks/src/tree/render3/BUILD.bazel +++ b/modules/benchmarks/src/tree/render3/BUILD.bazel @@ -4,8 +4,6 @@ load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") -package(default_visibility = ["//visibility:public"]) - ng_module( name = "tree_lib", srcs = glob(["**/*.ts"]), diff --git a/modules/playground/src/zippy_component/BUILD.bazel b/modules/playground/src/zippy_component/BUILD.bazel index 22cc107de6..c4779d184d 100644 --- a/modules/playground/src/zippy_component/BUILD.bazel +++ b/modules/playground/src/zippy_component/BUILD.bazel @@ -6,7 +6,7 @@ package(default_visibility = ["//modules/playground:__subpackages__"]) ng_module( name = "zippy_component", srcs = glob(["**/*.ts"]), - assets = glob(["app/zippy.html"]), + assets = ["app/zippy.html"], tsconfig = "//modules/playground:tsconfig-build.json", # TODO: FW-1004 Type checking is currently not complete. type_check = False, diff --git a/package.json b/package.json index 3f1d47db43..7d54afad2a 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ "url": "https://github.com/angular/angular.git" }, "scripts": { - "bazel:format": "find . -type f \\( -name \"*.bzl\" -or -name WORKSPACE -or -name BUILD -or -name BUILD.bazel \\) ! -path \"*/node_modules/*\" | xargs buildifier -v --warnings=args-order,attr-cfg,attr-license,attr-non-empty,attr-output-default,attr-single-file,constant-glob,ctx-args,depset-iteration,depset-union,dict-concatenation,duplicated-name,filetype,git-repository,http-archive,integer-division,load,load-on-top,native-build,native-package,out-of-order-load,output-group,package-name,package-on-top,positional-args,redefined-variable,repository-name,same-origin-load,string-iteration,unsorted-dict-items,unused-variable", + "bazel:format": "find . -type f \\( -name \"*.bzl\" -or -name WORKSPACE -or -name BUILD -or -name BUILD.bazel \\) ! -path \"*/node_modules/*\" | xargs buildifier -v --warnings=args-order,attr-cfg,attr-license,attr-non-empty,attr-output-default,attr-single-file,constant-glob,ctx-args,depset-iteration,depset-union,dict-concatenation,duplicated-name,filetype,git-repository,http-archive,integer-division,load,load-on-top,native-build,native-package,output-group,package-name,package-on-top,positional-args,redefined-variable,repository-name,same-origin-load,string-iteration,unused-variable", "bazel:lint": "yarn bazel:format --lint=warn", "bazel:lint-fix": "yarn bazel:format --lint=fix", "preinstall": "node tools/yarn/check-yarn.js", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 8c5112d4a5..65ff743075 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -1,5 +1,3 @@ -load("//tools:defaults.bzl", "ts_library") - package(default_visibility = ["//visibility:public"]) exports_files([ diff --git a/packages/bazel/src/BUILD.bazel b/packages/bazel/src/BUILD.bazel index 04767652e0..6f806fbfec 100644 --- a/packages/bazel/src/BUILD.bazel +++ b/packages/bazel/src/BUILD.bazel @@ -8,6 +8,8 @@ filegroup( # For generating skydoc exports_files(glob(["*.bzl"])) +load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") + nodejs_binary( name = "rollup_with_build_optimizer", data = [ diff --git a/packages/bazel/src/esm5.bzl b/packages/bazel/src/esm5.bzl index e0f3fd6ba9..57d2157ca3 100644 --- a/packages/bazel/src/esm5.bzl +++ b/packages/bazel/src/esm5.bzl @@ -170,11 +170,6 @@ esm5_outputs_aspect = aspect( executable = True, cfg = "host", ), - "_tsc_wrapped": attr.label( - default = Label("@build_bazel_rules_typescript//:@bazel/typescript/tsc_wrapped"), - executable = True, - cfg = "host", - ), }, ) diff --git a/packages/bazel/src/ng_module.bzl b/packages/bazel/src/ng_module.bzl index 183a08fb75..416927ff3d 100644 --- a/packages/bazel/src/ng_module.bzl +++ b/packages/bazel/src/ng_module.bzl @@ -244,8 +244,6 @@ def _expected_outs(ctx): # TODO(alxhub): i18n is only produced by the legacy compiler currently. This should be re-enabled # when ngtsc can extract messages if is_legacy_ngc: - # TODO(manekinekko): due to bazelbuild/bazel#4858 we cannot fix the call to ctx.new_file(genfiles_dir) - # so the rule is turned off for now. i18n_messages_files = [ctx.new_file(ctx.genfiles_dir, ctx.label.name + "_ngc_messages.xmb")] else: i18n_messages_files = [] @@ -270,9 +268,9 @@ def _ngc_tsconfig(ctx, files, srcs, **kwargs): expected_outs = outs.closure_js angular_compiler_options = { - "allowEmptyCodegenFiles": True, - "enableIvy": _enable_ivy_value(ctx), "enableResourceInlining": ctx.attr.inline_resources, + "generateCodeForLibraries": False, + "allowEmptyCodegenFiles": True, # Summaries are only enabled if Angular outputs are to be produced. "enableSummariesForJit": is_legacy_ngc, "enableIvy": _enable_ivy_value(ctx), @@ -539,8 +537,8 @@ def ng_module_impl(ctx, ts_compile_actions): if is_legacy_ngc: providers["angular"] = { - "metadata": outs.metadata, "summaries": outs.summaries, + "metadata": outs.metadata, } providers["ngc_messages"] = outs.i18n_messages @@ -570,6 +568,13 @@ local_deps_aspects = [collect_node_modules_aspect, _collect_summaries_aspect] NG_MODULE_ATTRIBUTES = { "srcs": attr.label_list(allow_files = [".ts"]), + + # Note: DEPS_ASPECTS is already a list, we add the cast to workaround + # https://github.com/bazelbuild/skydoc/issues/21 + "deps": attr.label_list( + doc = "Targets that are imported by this target", + aspects = local_deps_aspects, + ), "assets": attr.label_list( doc = ".html and .css files needed by the Angular compiler", allow_files = [ @@ -578,6 +583,14 @@ NG_MODULE_ATTRIBUTES = { ".html", ], ), + "factories": attr.label_list( + allow_files = [".ts", ".html"], + mandatory = False, + ), + "filter_summaries": attr.bool(default = False), + "type_check": attr.bool(default = True), + "inline_resources": attr.bool(default = True), + "no_i18n": attr.bool(default = False), "compiler": attr.label( doc = """Sets a different ngc compiler binary to use for this library. @@ -592,40 +605,16 @@ NG_MODULE_ATTRIBUTES = { executable = True, cfg = "host", ), - "factories": attr.label_list( - allow_files = [".ts", ".html"], - mandatory = False, - ), - "filter_summaries": attr.bool(default = False), - "inline_resources": attr.bool(default = True), "ng_xi18n": attr.label( default = Label(DEFAULT_NG_XI18N), executable = True, cfg = "host", ), - "no_i18n": attr.bool(default = False), - "type_check": attr.bool(default = True), - - # Note: DEPS_ASPECTS is already a list, we add the cast to workaround - # https://github.com/bazelbuild/skydoc/issues/21 - "deps": attr.label_list( - doc = "Targets that are imported by this target", - aspects = local_deps_aspects, - ), "_supports_workers": attr.bool(default = True), } NG_MODULE_RULE_ATTRS = dict(dict(COMMON_ATTRIBUTES, **NG_MODULE_ATTRIBUTES), **{ - "entry_point": attr.string(), - - # Default is %{name}_public_index - # The suffix points to the generated "bundle index" files that users import from - # The default is intended to avoid collisions with the users input files. - # Later packaging rules will point to these generated files as the entry point - # into the package. - # See the flatModuleOutFile documentation in - # https://github.com/angular/angular/blob/master/packages/compiler-cli/src/transformers/api.ts - "flat_module_out_file": attr.string(), + "tsconfig": attr.label(allow_single_file = True), "node_modules": attr.label( doc = """The npm packages which should be available during the compile. diff --git a/packages/bazel/src/ng_package/BUILD.bazel b/packages/bazel/src/ng_package/BUILD.bazel index 1fa7a41652..8cfc2cfab3 100644 --- a/packages/bazel/src/ng_package/BUILD.bazel +++ b/packages/bazel/src/ng_package/BUILD.bazel @@ -1,3 +1,5 @@ +package(default_visibility = ["//visibility:public"]) + load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") # BEGIN-DEV-ONLY diff --git a/packages/bazel/src/ng_package/ng_package.bzl b/packages/bazel/src/ng_package/ng_package.bzl index 3fff5ac467..c1b4c64492 100644 --- a/packages/bazel/src/ng_package/ng_package.bzl +++ b/packages/bazel/src/ng_package/ng_package.bzl @@ -16,12 +16,6 @@ specification of this format at https://goo.gl/jB3GVv load("@build_bazel_rules_nodejs//internal/common:collect_es6_sources.bzl", "collect_es6_sources") load("@build_bazel_rules_nodejs//internal/common:node_module_info.bzl", "NodeModuleInfo") load("@build_bazel_rules_nodejs//internal/common:sources_aspect.bzl", "sources_aspect") -load( - "@build_bazel_rules_nodejs//:internal/npm_package/npm_package.bzl", - "NPM_PACKAGE_ATTRS", - "NPM_PACKAGE_OUTPUTS", - "create_package", -) load( "@build_bazel_rules_nodejs//:internal/rollup/rollup_bundle.bzl", "ROLLUP_ATTRS", @@ -38,7 +32,6 @@ load( load("//packages/bazel/src:external.bzl", "FLAT_DTS_FILE_SUFFIX") load("//packages/bazel/src:esm5.bzl", "esm5_outputs_aspect", "esm5_root_dir", "flatten_esm5") load("//packages/bazel/src/ng_package:collect-type-definitions.bzl", "collect_type_definitions") -load("//packages/bazel/src:esm5.bzl", "esm5_outputs_aspect", "esm5_root_dir", "flatten_esm5") _DEFAULT_NG_PACKAGER = "@npm//@angular/bazel/bin:packager" @@ -343,8 +336,8 @@ def _ng_package_impl(ctx): packager_inputs.extend([m.metadata_file]) metadata_arg[m.module_name] = { "index": m.typings_file.path.replace(".d.ts", ".js"), - "metadata": m.metadata_file.path, "typings": m.typings_file.path, + "metadata": m.metadata_file.path, } packager_args.add(str(metadata_arg)) @@ -408,6 +401,7 @@ DEPS_ASPECTS = [esm5_outputs_aspect, sources_aspect] NG_PACKAGE_ATTRS = dict(NPM_PACKAGE_ATTRS, **dict(ROLLUP_ATTRS, **{ "srcs": attr.label_list(allow_files = True), + "deps": attr.label_list(aspects = DEPS_ASPECTS), "data": attr.label_list( doc = "Additional, non-Angular files to be added to the package, e.g. global CSS assets.", allow_files = True, @@ -418,15 +412,11 @@ NG_PACKAGE_ATTRS = dict(NPM_PACKAGE_ATTRS, **dict(ROLLUP_ATTRS, **{ "entry_point_name": attr.string( doc = "Name to use when generating bundle files for the primary entry-point.", ), - "globals": attr.string_dict(default = {}), - "include_devmode_srcs": attr.bool(default = False), "ng_packager": attr.label( default = Label(_DEFAULT_NG_PACKAGER), executable = True, cfg = "host", ), - "readme_md": attr.label(allow_single_file = [".md"]), - "deps": attr.label_list(aspects = DEPS_ASPECTS), "_rollup": attr.label( default = Label("@build_bazel_rules_nodejs//internal/rollup"), executable = True, @@ -489,8 +479,8 @@ def ng_package_outputs(name, entry_point, entry_point_name): basename = primary_entry_point_name(name, entry_point, entry_point_name) outputs = { - "fesm2015": "fesm2015/%s.js" % basename, "fesm5": "fesm5/%s.js" % basename, + "fesm2015": "fesm2015/%s.js" % basename, "umd": "%s.umd.js" % basename, "umd_min": "%s.umd.min.js" % basename, } diff --git a/packages/bazel/src/protractor/utils/BUILD.bazel b/packages/bazel/src/protractor/utils/BUILD.bazel index 0035bfa749..fd461d9610 100644 --- a/packages/bazel/src/protractor/utils/BUILD.bazel +++ b/packages/bazel/src/protractor/utils/BUILD.bazel @@ -2,8 +2,6 @@ package(default_visibility = ["//visibility:public"]) load("@npm_bazel_typescript//:defs.bzl", "ts_library") -package(default_visibility = ["//visibility:public"]) - ts_library( name = "utils", srcs = ["index.ts"], diff --git a/packages/compiler-cli/BUILD.bazel b/packages/compiler-cli/BUILD.bazel index 9ce5738d5e..65550129bb 100644 --- a/packages/compiler-cli/BUILD.bazel +++ b/packages/compiler-cli/BUILD.bazel @@ -3,8 +3,6 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "npm_package", "ts_library") load("@npm_bazel_typescript//:defs.bzl", "ts_config") -package(default_visibility = ["//visibility:public"]) - ts_config( name = "tsconfig", src = "tsconfig-build.json", diff --git a/packages/compiler-cli/src/ngtsc/cycles/BUILD.bazel b/packages/compiler-cli/src/ngtsc/cycles/BUILD.bazel index 990d00b790..f54673ed0f 100644 --- a/packages/compiler-cli/src/ngtsc/cycles/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/cycles/BUILD.bazel @@ -4,8 +4,7 @@ load("//tools:defaults.bzl", "ts_library") ts_library( name = "cycles", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), module_name = "@angular/compiler-cli/src/ngtsc/cycles", diff --git a/packages/compiler-cli/src/ngtsc/path/BUILD.bazel b/packages/compiler-cli/src/ngtsc/path/BUILD.bazel index f041fba829..2435fdc0e9 100644 --- a/packages/compiler-cli/src/ngtsc/path/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/path/BUILD.bazel @@ -4,8 +4,7 @@ load("//tools:defaults.bzl", "ts_library") ts_library( name = "path", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/*.ts", ]), deps = [ diff --git a/packages/compiler-cli/src/ngtsc/routing/BUILD.bazel b/packages/compiler-cli/src/ngtsc/routing/BUILD.bazel index 7d96c18bd7..9670f24f81 100644 --- a/packages/compiler-cli/src/ngtsc/routing/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/routing/BUILD.bazel @@ -4,8 +4,7 @@ load("//tools:defaults.bzl", "ts_library") ts_library( name = "routing", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), module_name = "@angular/compiler-cli/src/ngtsc/routing", diff --git a/packages/compiler-cli/src/ngtsc/scope/BUILD.bazel b/packages/compiler-cli/src/ngtsc/scope/BUILD.bazel index b1ae56776f..655f6d8929 100644 --- a/packages/compiler-cli/src/ngtsc/scope/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/scope/BUILD.bazel @@ -4,8 +4,7 @@ load("//tools:defaults.bzl", "ts_library") ts_library( name = "scope", - srcs = glob([ - "index.ts", + srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), deps = [ diff --git a/packages/compiler-cli/test/ngtsc/fake_core/BUILD.bazel b/packages/compiler-cli/test/ngtsc/fake_core/BUILD.bazel index e15812685b..b8af5238a3 100644 --- a/packages/compiler-cli/test/ngtsc/fake_core/BUILD.bazel +++ b/packages/compiler-cli/test/ngtsc/fake_core/BUILD.bazel @@ -1,7 +1,7 @@ -load("//tools:defaults.bzl", "ng_package", "ts_library") - package(default_visibility = ["//visibility:public"]) +load("//tools:defaults.bzl", "ng_package", "ts_library") + ts_library( name = "fake_core", srcs = [ diff --git a/packages/core/test/bundling/animation_world/BUILD.bazel b/packages/core/test/bundling/animation_world/BUILD.bazel index 42dc72553b..f895027191 100644 --- a/packages/core/test/bundling/animation_world/BUILD.bazel +++ b/packages/core/test/bundling/animation_world/BUILD.bazel @@ -1,10 +1,8 @@ package(default_visibility = ["//visibility:public"]) -load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle", "ts_library") +load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") -package(default_visibility = ["//visibility:public"]) - ng_module( name = "animation_world", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/hello_world/BUILD.bazel b/packages/core/test/bundling/hello_world/BUILD.bazel index 36cb746bb3..4a48c199b4 100644 --- a/packages/core/test/bundling/hello_world/BUILD.bazel +++ b/packages/core/test/bundling/hello_world/BUILD.bazel @@ -4,8 +4,6 @@ load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle load("//tools/symbol-extractor:index.bzl", "js_expected_symbol_test") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") -package(default_visibility = ["//visibility:public"]) - ng_module( name = "hello_world", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/hello_world_i18n/BUILD.bazel b/packages/core/test/bundling/hello_world_i18n/BUILD.bazel index 489410577d..f0b7d00712 100644 --- a/packages/core/test/bundling/hello_world_i18n/BUILD.bazel +++ b/packages/core/test/bundling/hello_world_i18n/BUILD.bazel @@ -1,10 +1,8 @@ package(default_visibility = ["//visibility:public"]) -load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle", "ts_library") +load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") -package(default_visibility = ["//visibility:public"]) - ng_module( name = "hello_world_i18n", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/hello_world_r2/BUILD.bazel b/packages/core/test/bundling/hello_world_r2/BUILD.bazel index 9d1d446a2d..1601c9b57b 100644 --- a/packages/core/test/bundling/hello_world_r2/BUILD.bazel +++ b/packages/core/test/bundling/hello_world_r2/BUILD.bazel @@ -3,8 +3,6 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle", "ts_library") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") -package(default_visibility = ["//visibility:public"]) - ng_module( name = "hello_world", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/todo/BUILD.bazel b/packages/core/test/bundling/todo/BUILD.bazel index 0d6cbbf46c..eb60ff4618 100644 --- a/packages/core/test/bundling/todo/BUILD.bazel +++ b/packages/core/test/bundling/todo/BUILD.bazel @@ -5,8 +5,6 @@ load("//tools/symbol-extractor:index.bzl", "js_expected_symbol_test") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") -package(default_visibility = ["//visibility:public"]) - ng_module( name = "todo", srcs = ["index.ts"], diff --git a/packages/core/test/bundling/todo_i18n/BUILD.bazel b/packages/core/test/bundling/todo_i18n/BUILD.bazel index cb61d0b738..94da2d7409 100644 --- a/packages/core/test/bundling/todo_i18n/BUILD.bazel +++ b/packages/core/test/bundling/todo_i18n/BUILD.bazel @@ -4,8 +4,6 @@ load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") -package(default_visibility = ["//visibility:public"]) - ng_module( name = "todo_i18n", srcs = [ diff --git a/packages/core/test/bundling/todo_r2/BUILD.bazel b/packages/core/test/bundling/todo_r2/BUILD.bazel index 6ce564bc0b..3eeed75691 100644 --- a/packages/core/test/bundling/todo_r2/BUILD.bazel +++ b/packages/core/test/bundling/todo_r2/BUILD.bazel @@ -4,8 +4,6 @@ load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") -package(default_visibility = ["//visibility:public"]) - ng_module( name = "todo", srcs = ["index.ts"], diff --git a/packages/private/testing/BUILD.bazel b/packages/private/testing/BUILD.bazel index 9981322971..90299288c5 100644 --- a/packages/private/testing/BUILD.bazel +++ b/packages/private/testing/BUILD.bazel @@ -5,6 +5,8 @@ package(default_visibility = [ exports_files(["package.json"]) +load("//tools:defaults.bzl", "ng_module") + ng_module( name = "testing", testonly = True, diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 078ef8068a..776cd8c555 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -6,7 +6,6 @@ load("@npm_bazel_karma//:defs.bzl", _karma_web_test = "karma_web_test", _karma_w load("@npm_bazel_typescript//:defs.bzl", _ts_library = "ts_library") load("//packages/bazel:index.bzl", _ng_module = "ng_module", _ng_package = "ng_package") load("//packages/bazel/src:ng_rollup_bundle.bzl", _ng_rollup_bundle = "ng_rollup_bundle") -load("//packages/bazel:index.bzl", _ng_module = "ng_module", _ng_package = "ng_package") _DEFAULT_TSCONFIG_BUILD = "//packages:tsconfig-build.json" _DEFAULT_TSCONFIG_TEST = "//packages:tsconfig-test" diff --git a/yarn.lock b/yarn.lock index 5a624242a0..2f4acfb2ed 100644 --- a/yarn.lock +++ b/yarn.lock @@ -82,23 +82,23 @@ "@bazel/bazel-linux_x64" "0.22.0" "@bazel/bazel-win32_x64" "0.22.0" -"@bazel/buildifier-darwin_x64@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@bazel/buildifier-darwin_x64/-/buildifier-darwin_x64-0.20.0.tgz#1aeceb5a1a57a62eef6415377dbe95091781a7d4" - integrity sha512-yV7niwbdpDDPUw1vgyk1wIjPl3+YOM4o5FPgFmnFgzf48JUqrF3PK6Blg95Z8SqGOVoJAOChRC1GvopzEUzwZA== +"@bazel/buildifier-darwin_x64@0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@bazel/buildifier-darwin_x64/-/buildifier-darwin_x64-0.19.2.tgz#1182862b4a3578fb9367ab42e807131187a61702" + integrity sha512-f6CITRj8jFhhZFrQkIao3IgJjZAXGYwUkW/QBSeAu0HIltBerJ0FTt/Nmu9ji1QZYT2aO4RpZ8oJksG6xv1dcQ== -"@bazel/buildifier-linux_x64@0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@bazel/buildifier-linux_x64/-/buildifier-linux_x64-0.20.0.tgz#8cb6c8f999dbd8a9ee183906f202b698571d771b" - integrity sha512-djbBtcacgERWZoxjEm8lGmMyEaOYB3moiz0kioHTQc2F96wNLfm6Cikd4Ojrcj5VNQCMW9oy3YFTu+c5mIrCcA== +"@bazel/buildifier-linux_x64@0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@bazel/buildifier-linux_x64/-/buildifier-linux_x64-0.19.2.tgz#8b26eaf1f091cd3846a7dd7ea94008b55498401e" + integrity sha512-kJjzbrjuAW4yVms5mbTWSHpJF6ogDLkuq4MjVP6a03umQ7E15o9YoxbDoiN+CzAj9ZMWPWfc5/N5TouiwXkGzA== -"@bazel/buildifier@^0.20.0": - version "0.20.0" - resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-0.20.0.tgz#24a10e485fe65dbd75ef812cf37635df1fb91d0d" - integrity sha512-dahQRtE1KEp+efUV23q/JtOCSbQEk5C/+H3J33g8wP5roxMUa8mfDto85eloJ+gRPW7yOybxknuRYc4KSpgT7w== +"@bazel/buildifier@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@bazel/buildifier/-/buildifier-0.19.2.tgz#3e077de346ad98561cee703297aa8db50cfb3c76" + integrity sha512-MwkuoQdOdZ/VYKJvZe3qVCn3/20pLJyJpzNl3cBmaccWeUtdDKhtOm8YlLU08lxrt0VcKNcTYt4uiA62e/315A== optionalDependencies: - "@bazel/buildifier-darwin_x64" "0.20.0" - "@bazel/buildifier-linux_x64" "0.20.0" + "@bazel/buildifier-darwin_x64" "0.19.2" + "@bazel/buildifier-linux_x64" "0.19.2" "@bazel/ibazel@~0.9.0": version "0.9.0" From 41de05e1ae8d71cedd865ae0cd9b45b01610ee68 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 26 Feb 2019 22:41:49 +0100 Subject: [PATCH 0146/1073] test(ivy): update select root causes (#28989) Updates the root causes for the `MatSelect` failures. A few of them were fixed by https://github.com/angular/material2/pull/15320. PR Close #28989 --- .../angular_material_test_blocklist.js | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 386edcb4cf..59fc89b18b 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -649,29 +649,13 @@ window.testBlocklist = { "error": "TypeError: Cannot read property 'componentInstance' of null", "notes": "FW-1059: DebugNode.query should query nodes in the logical tree" }, - "MatSelect core overlay panel should not throw when attempting to open too early": { - "error": "Error: Expected function not to throw, but it threw TypeError: Cannot read property 'open' of undefined.", - "notes": "Unknown" - }, - "MatSelect core selection logic should handle accessing `optionSelectionChanges` before the options are initialized": { - "error": "TypeError: Cannot read property 'options' of undefined", - "notes": "Unknown" - }, - "MatSelect core keyboard scrolling should skip option group labels": { - "error": "ObjectUnsubscribedError: object unsubscribed", - "notes": "Unknown" - }, "MatSelect when the select's value is accessed on initialization should not throw when trying to access the selected value on init": { "error": "Error: Expected function not to throw, but it threw TypeError: Cannot read property 'selected' of undefined.", - "notes": "Unknown" - }, - "MatSelect with custom value accessor should support use inside a custom value accessor": { - "error": "Error: : could not find an object to spy upon for writeValue()", - "notes": "Unknown" + "notes": "FW-1051: Property values changed in ngOnChanges throw ExpressionChanged errors" }, "MatSelect with custom trigger should allow the user to customize the label": { "error": "TypeError: Cannot read property 'selected' of undefined", - "notes": "Unknown" + "notes": "FW-1051: Property values changed in ngOnChanges throw ExpressionChanged errors" }, "MatSnackBar with TemplateRef should be able to open a snack bar using a TemplateRef": { "error": "Error: Expected ' Fries Pizza ' to contain 'Pasta'.", From c4c3c1231b14d7603121598dd5508847f34823eb Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Tue, 26 Feb 2019 14:58:04 -0800 Subject: [PATCH 0147/1073] build(bazel): allow a user to control a subset of angularCompilerOption in their tsconfig file when using ng_module (#28995) PR Close #28995 --- packages/bazel/src/ngc-wrapped/index.ts | 58 +++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/packages/bazel/src/ngc-wrapped/index.ts b/packages/bazel/src/ngc-wrapped/index.ts index 636d8db08e..7cbad87250 100644 --- a/packages/bazel/src/ngc-wrapped/index.ts +++ b/packages/bazel/src/ngc-wrapped/index.ts @@ -49,6 +49,64 @@ export function runOneBuild(args: string[], inputs?: {[path: string]: string}): return false; } const {options: tsOptions, bazelOpts, files, config} = parsedOptions; + const angularCompilerOptions: {[k: string]: unknown} = config['angularCompilerOptions'] || {}; + + // Allow Bazel users to control some of the bazel options. + // Since TypeScript's "extends" mechanism applies only to "compilerOptions" + // we have to repeat some of their logic to get the user's "angularCompilerOptions". + if (config['extends']) { + // Load the user's config file + // Note: this doesn't handle recursive extends so only a user's top level + // `angularCompilerOptions` will be considered. As this code is going to be + // removed with Ivy, the added complication of handling recursive extends + // is likely not needed. + let userConfigFile = + resolveNormalizedPath(path.dirname(project), config['extends']); + if (!userConfigFile.endsWith('.json')) userConfigFile += '.json'; + const {config: userConfig, error} = + ts.readConfigFile(userConfigFile, ts.sys.readFile); + if (error) { + console.error(ng.formatDiagnostics([error])); + return false; + } + + // All user angularCompilerOptions values that a user has control + // over should be collected here + if (userConfig.angularCompilerOptions) { + angularCompilerOptions.diagnostics = angularCompilerOptions.diagnostics || + userConfig.angularCompilerOptions.diagnostics; + angularCompilerOptions.trace = angularCompilerOptions.trace || + userConfig.angularCompilerOptions.trace; + + angularCompilerOptions.disableExpressionLowering = angularCompilerOptions.disableExpressionLowering || + userConfig.angularCompilerOptions.disableExpressionLowering; + angularCompilerOptions.disableTypeScriptVersionCheck = angularCompilerOptions.disableTypeScriptVersionCheck || + userConfig.angularCompilerOptions.disableTypeScriptVersionCheck; + + angularCompilerOptions.i18nOutLocale = angularCompilerOptions.i18nOutLocale || + userConfig.angularCompilerOptions.i18nOutLocale; + angularCompilerOptions.i18nOutFormat = angularCompilerOptions.i18nOutFormat || + userConfig.angularCompilerOptions.i18nOutFormat; + angularCompilerOptions.i18nOutFile = angularCompilerOptions.i18nOutFile || + userConfig.angularCompilerOptions.i18nOutFile; + + angularCompilerOptions.i18nInFormat = angularCompilerOptions.i18nInFormat || + userConfig.angularCompilerOptions.i18nInFormat; + angularCompilerOptions.i18nInLocale = angularCompilerOptions.i18nInLocale || + userConfig.angularCompilerOptions.i18nInLocale; + angularCompilerOptions.i18nInFile = angularCompilerOptions.i18nInFile || + userConfig.angularCompilerOptions.i18nInFile; + + angularCompilerOptions.i18nInMissingTranslations = angularCompilerOptions.i18nInMissingTranslations || + userConfig.angularCompilerOptions.i18nInMissingTranslations; + angularCompilerOptions.i18nUseExternalIds = angularCompilerOptions.i18nUseExternalIds || + userConfig.angularCompilerOptions.i18nUseExternalIds; + + angularCompilerOptions.preserveWhitespaces = angularCompilerOptions.preserveWhitespaces || + userConfig.angularCompilerOptions.preserveWhitespaces; + } + } + const expectedOuts = config['angularCompilerOptions']['expectedOut']; const {basePath} = ng.calcProjectFileAndBasePath(project); From 7b944c46d3347de9ee77781beb0d483bd85bda8b Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Tue, 26 Feb 2019 15:38:40 -0800 Subject: [PATCH 0148/1073] style: format (#28995) PR Close #28995 --- packages/bazel/src/ngc-wrapped/index.ts | 61 +++++++++++++------------ 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/packages/bazel/src/ngc-wrapped/index.ts b/packages/bazel/src/ngc-wrapped/index.ts index 7cbad87250..62c9993283 100644 --- a/packages/bazel/src/ngc-wrapped/index.ts +++ b/packages/bazel/src/ngc-wrapped/index.ts @@ -60,11 +60,9 @@ export function runOneBuild(args: string[], inputs?: {[path: string]: string}): // `angularCompilerOptions` will be considered. As this code is going to be // removed with Ivy, the added complication of handling recursive extends // is likely not needed. - let userConfigFile = - resolveNormalizedPath(path.dirname(project), config['extends']); + let userConfigFile = resolveNormalizedPath(path.dirname(project), config['extends']); if (!userConfigFile.endsWith('.json')) userConfigFile += '.json'; - const {config: userConfig, error} = - ts.readConfigFile(userConfigFile, ts.sys.readFile); + const {config: userConfig, error} = ts.readConfigFile(userConfigFile, ts.sys.readFile); if (error) { console.error(ng.formatDiagnostics([error])); return false; @@ -73,37 +71,40 @@ export function runOneBuild(args: string[], inputs?: {[path: string]: string}): // All user angularCompilerOptions values that a user has control // over should be collected here if (userConfig.angularCompilerOptions) { - angularCompilerOptions.diagnostics = angularCompilerOptions.diagnostics || - userConfig.angularCompilerOptions.diagnostics; - angularCompilerOptions.trace = angularCompilerOptions.trace || - userConfig.angularCompilerOptions.trace; + angularCompilerOptions.diagnostics = + angularCompilerOptions.diagnostics || userConfig.angularCompilerOptions.diagnostics; + angularCompilerOptions.trace = + angularCompilerOptions.trace || userConfig.angularCompilerOptions.trace; - angularCompilerOptions.disableExpressionLowering = angularCompilerOptions.disableExpressionLowering || - userConfig.angularCompilerOptions.disableExpressionLowering; - angularCompilerOptions.disableTypeScriptVersionCheck = angularCompilerOptions.disableTypeScriptVersionCheck || - userConfig.angularCompilerOptions.disableTypeScriptVersionCheck; + angularCompilerOptions.disableExpressionLowering = + angularCompilerOptions.disableExpressionLowering || + userConfig.angularCompilerOptions.disableExpressionLowering; + angularCompilerOptions.disableTypeScriptVersionCheck = + angularCompilerOptions.disableTypeScriptVersionCheck || + userConfig.angularCompilerOptions.disableTypeScriptVersionCheck; - angularCompilerOptions.i18nOutLocale = angularCompilerOptions.i18nOutLocale || - userConfig.angularCompilerOptions.i18nOutLocale; - angularCompilerOptions.i18nOutFormat = angularCompilerOptions.i18nOutFormat || - userConfig.angularCompilerOptions.i18nOutFormat; - angularCompilerOptions.i18nOutFile = angularCompilerOptions.i18nOutFile || - userConfig.angularCompilerOptions.i18nOutFile; + angularCompilerOptions.i18nOutLocale = + angularCompilerOptions.i18nOutLocale || userConfig.angularCompilerOptions.i18nOutLocale; + angularCompilerOptions.i18nOutFormat = + angularCompilerOptions.i18nOutFormat || userConfig.angularCompilerOptions.i18nOutFormat; + angularCompilerOptions.i18nOutFile = + angularCompilerOptions.i18nOutFile || userConfig.angularCompilerOptions.i18nOutFile; - angularCompilerOptions.i18nInFormat = angularCompilerOptions.i18nInFormat || - userConfig.angularCompilerOptions.i18nInFormat; - angularCompilerOptions.i18nInLocale = angularCompilerOptions.i18nInLocale || - userConfig.angularCompilerOptions.i18nInLocale; - angularCompilerOptions.i18nInFile = angularCompilerOptions.i18nInFile || - userConfig.angularCompilerOptions.i18nInFile; + angularCompilerOptions.i18nInFormat = + angularCompilerOptions.i18nInFormat || userConfig.angularCompilerOptions.i18nInFormat; + angularCompilerOptions.i18nInLocale = + angularCompilerOptions.i18nInLocale || userConfig.angularCompilerOptions.i18nInLocale; + angularCompilerOptions.i18nInFile = + angularCompilerOptions.i18nInFile || userConfig.angularCompilerOptions.i18nInFile; - angularCompilerOptions.i18nInMissingTranslations = angularCompilerOptions.i18nInMissingTranslations || - userConfig.angularCompilerOptions.i18nInMissingTranslations; - angularCompilerOptions.i18nUseExternalIds = angularCompilerOptions.i18nUseExternalIds || - userConfig.angularCompilerOptions.i18nUseExternalIds; + angularCompilerOptions.i18nInMissingTranslations = + angularCompilerOptions.i18nInMissingTranslations || + userConfig.angularCompilerOptions.i18nInMissingTranslations; + angularCompilerOptions.i18nUseExternalIds = angularCompilerOptions.i18nUseExternalIds || + userConfig.angularCompilerOptions.i18nUseExternalIds; - angularCompilerOptions.preserveWhitespaces = angularCompilerOptions.preserveWhitespaces || - userConfig.angularCompilerOptions.preserveWhitespaces; + angularCompilerOptions.preserveWhitespaces = angularCompilerOptions.preserveWhitespaces || + userConfig.angularCompilerOptions.preserveWhitespaces; } } From d127d05dc37e5d98680464b5069ca38310405acd Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 22 Feb 2019 14:11:38 -0800 Subject: [PATCH 0149/1073] fix(ivy): correctly resolve shorthand property declarations (#28936) The partial evaluator in ngtsc can handle a shorthand property declaration in the middle evaluation, but fails if evaluation starts at the shorthand property itself. This is because evaluation starts at the ts.Identifier of the property (the ts.Expression representing it), not the ts.Declaration for the property. The fix for this is to detect in TypeScriptReflectionHost when a ts.Symbol refers to a shorthand property, and to use the ts.TypeChecker method getShorthandAssignmentValueSymbol() to resolve the value of the assignment instead. FW-1089 #resolve PR Close #28936 --- .../ngtsc/partial_evaluator/test/evaluator_spec.ts | 14 ++++++++++++++ .../src/ngtsc/reflection/src/typescript.ts | 10 ++++++++++ 2 files changed, 24 insertions(+) diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts index 640c332b31..ee3b2c83c4 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts @@ -267,6 +267,20 @@ describe('ngtsc metadata', () => { ]); expect(value instanceof Reference).toBe(true); }); + + it('should resolve shorthand properties to values', () => { + const {program} = makeProgram([ + {name: 'entry.ts', contents: `const prop = 42; const target$ = {prop};`}, + ]); + const checker = program.getTypeChecker(); + const reflectionHost = new TypeScriptReflectionHost(checker); + const result = getDeclaration(program, 'entry.ts', 'target$', ts.isVariableDeclaration); + const expr = result.initializer !as ts.ObjectLiteralExpression; + const prop = expr.properties[0] as ts.ShorthandPropertyAssignment; + const evaluator = new PartialEvaluator(reflectionHost, checker); + const resolved = evaluator.evaluate(prop.name); + expect(resolved).toBe(42); + }); }); function owningModuleOf(ref: Reference): string|null { diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts index 460a1e3eea..519e767138 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts @@ -196,6 +196,16 @@ export class TypeScriptReflectionHost implements ReflectionHost { * @internal */ protected getDeclarationOfSymbol(symbol: ts.Symbol): Declaration|null { + // If the symbol points to a ShorthandPropertyAssignment, resolve it. + if (symbol.valueDeclaration !== undefined && + ts.isShorthandPropertyAssignment(symbol.valueDeclaration)) { + const shorthandSymbol = + this.checker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); + if (shorthandSymbol === undefined) { + return null; + } + return this.getDeclarationOfSymbol(shorthandSymbol); + } let viaModule: string|null = null; // Look through the Symbol's immediate declarations, and see if any of them are import-type // statements. From b8d87490f58632c93be389ed0526233570fb433e Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Tue, 26 Feb 2019 19:09:32 -0800 Subject: [PATCH 0150/1073] test(ivy): record root cause of CdkVirtualScrollViewport failures (#28999) PR Close #28999 --- .../angular_material_test_blocklist.js | 104 +++++++++--------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 59fc89b18b..1d6c8be1b0 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -27,211 +27,211 @@ window.testBlocklist = { }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should render initial state": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should get the data length": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should get the viewport size": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should update viewport size": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should get the rendered range": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should get the rendered content offset": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should get the scroll offset": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should get the rendered content size": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should measure range size": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should set total content size": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should set total content size in horizontal mode": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should set a class based on the orientation": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should set the vertical class if an invalid orientation is set": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should set rendered range": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should set content offset to top of content": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should set content offset to bottom of content": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should scroll to offset": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should scroll to index": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should scroll to offset in horizontal mode": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should scroll to index in horizontal mode": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should output scrolled index": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should update viewport as user scrolls down": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should update viewport as user scrolls up": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should render buffer element at the end when scrolled to the top": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should render buffer element at the start and end when scrolled to the middle": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should render buffer element at the start when scrolled to the bottom": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should handle dynamic item size": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should handle dynamic buffer size": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should handle dynamic item array": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should update viewport as user scrolls right in horizontal mode": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should update viewport as user scrolls left in horizontal mode": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should work with an Observable": { "error": "TypeError: Cannot read property 'getRenderedRange' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should work with a DataSource": { "error": "TypeError: Cannot read property 'getRenderedRange' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should trackBy value by default": { "error": "Error: : could not find an object to spy upon for detach()", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should trackBy index when specified": { "error": "Error: : could not find an object to spy upon for detach()", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should recycle views when template cache is large enough to accommodate": { "error": "Error: : could not find an object to spy upon for createEmbeddedView()", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should not recycle views when template cache is full": { "error": "Error: : could not find an object to spy upon for createEmbeddedView()", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should render up to maxBufferPx when buffer dips below minBufferPx": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should throw if maxBufferPx is less than minBufferPx": { "error": "Error: Uncaught (in promise): TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should register and degregister with ScrollDispatcher": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should emit on viewChange inside the Angular zone": { "error": "TypeError: Cannot read property 'viewChange' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with FixedSizeVirtualScrollStrategy should not throw when disposing of a view that will not fit in the cache": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with RTL direction should initially be scrolled all the way right and showing the first item in horizontal mode": { "error": "TypeError: Cannot read property 'elementRef' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with RTL direction should scroll through items as user scrolls to the left in horizontal mode": { "error": "TypeError: Cannot read property 'elementRef' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with RTL direction should interpret scrollToOffset amount as an offset from the right in horizontal mode": { "error": "TypeError: Cannot read property 'elementRef' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with RTL direction should scroll to the correct index in horizontal mode": { "error": "TypeError: Cannot read property 'elementRef' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with RTL direction should emit the scrolled to index in horizontal mode": { "error": "TypeError: Cannot read property 'elementRef' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with RTL direction should set total content size": { "error": "TypeError: Cannot read property 'elementRef' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with RTL direction should set total content size in horizontal mode": { "error": "TypeError: Cannot read property 'elementRef' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with AutoSizeVirtualScrollStrategy should render initial state for uniform items": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with AutoSizeVirtualScrollStrategy should render extra content if first item is smaller than average": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkVirtualScrollViewport with AutoSizeVirtualScrollStrategy should throw if maxBufferPx is less than minBufferPx": { "error": "Error: Uncaught (in promise): TypeError: Cannot read property 'nativeElement' of undefined", - "notes": "Unknown" + "notes": "FW-1114: Ivy doesn't support inserting same view instance multiple times" }, "CdkAccordion should not register nested items to the same accordion": { "error": "TypeError: Cannot read property 'accordion' of undefined", From f16fca41d6d48cd16bc3cce4774a92e6f139698e Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Wed, 27 Feb 2019 09:16:13 +0000 Subject: [PATCH 0151/1073] build(docs-infra): upgrade cli command docs sources to 3b1fe6437 (#29003) Updating [angular#master](https://github.com/angular/angular/tree/master) from [cli-builds#master](https://github.com/angular/cli-builds/tree/master). Relevant changes in [commit range](https://github.com/angular/cli-builds/compare/c91579a2e...3b1fe6437): **Modified** - help/generate.json - help/new.json PR Close #29003 --- aio/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/package.json b/aio/package.json index d8b0d37b95..997d0605a4 100644 --- a/aio/package.json +++ b/aio/package.json @@ -19,7 +19,7 @@ "build-local": "yarn ~~build", "prebuild-with-ivy": "yarn setup-local && yarn ivy-ngcc", "build-with-ivy": "node scripts/build-with-ivy", - "extract-cli-command-docs": "node tools/transforms/cli-docs-package/extract-cli-commands.js c91579a2e", + "extract-cli-command-docs": "node tools/transforms/cli-docs-package/extract-cli-commands.js 3b1fe6437", "lint": "yarn check-env && yarn docs-lint && ng lint && yarn example-lint && yarn tools-lint", "test": "yarn check-env && ng test", "pree2e": "yarn check-env && yarn update-webdriver", From 2dd44d712d7d8dd48aaa643a5818faed159a3e41 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Wed, 27 Feb 2019 18:55:36 +0200 Subject: [PATCH 0152/1073] ci(core): fix `legacy-unit-tests-saucelabs` job (#29009) Karma is not configured to retrieve the imported scripts using those absolute deep paths. Using relative paths instead. See [here][1] for an example failing job. [1]: https://circleci.com/gh/angular/angular/220751 PR Close #29009 --- packages/core/test/render3/debug_spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/test/render3/debug_spec.ts b/packages/core/test/render3/debug_spec.ts index a1492993c0..8c2d2540b7 100644 --- a/packages/core/test/render3/debug_spec.ts +++ b/packages/core/test/render3/debug_spec.ts @@ -6,9 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {RenderFlags, defineComponent, elementEnd, elementStart, text} from '@angular/core/src/render3'; -import {getLContext} from '@angular/core/src/render3/context_discovery'; -import {LViewDebug, toDebug} from '@angular/core/src/render3/debug'; +import {getLContext} from '../../src/render3/context_discovery'; +import {LViewDebug, toDebug} from '../../src/render3/debug'; +import {RenderFlags, defineComponent, elementEnd, elementStart, text} from '../../src/render3/index'; import {ComponentFixture} from './render_util'; @@ -39,4 +39,4 @@ describe('Debug Representation', () => { expect(myCompView.nodes ![0].html).toEqual('
'); expect(myCompView.nodes ![0].nodes ![0].html).toEqual('Hello World'); }); -}); \ No newline at end of file +}); From 034de06ab1a5927c570047dae5a485df4fbb381b Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Mon, 25 Feb 2019 12:42:50 -0800 Subject: [PATCH 0153/1073] fix(ivy): avoid duplicate i18n consts to be present in generated output (#28967) Prior to this change, the logic that outputs i18n consts (like `const MSG_XXX = goog.getMsg(...)`) didn't have a check whether a given const that represent a certain i18n message was already included into the generated output. This commit adds the logic to mark corresponding i18n contexts after translation was generated, to avoid duplicate consts in the output. PR Close #28967 --- .../compliance/r3_view_compiler_i18n_spec.ts | 78 ++++++++++++++++--- .../compiler/src/render3/view/i18n/context.ts | 1 + .../compiler/src/render3/view/template.ts | 5 +- 3 files changed, 72 insertions(+), 12 deletions(-) diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts index 99dbc96717..61539b698b 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts @@ -24,17 +24,22 @@ const angularFiles = setup({ const htmlParser = new HtmlParser(); +// TODO: update translation extraction RegExp to support i18nLocalize calls once #28689 lands. +const EXTRACT_GENERATED_TRANSLATIONS_REGEXP = + /const\s*(.*?)\s*=\s*goog\.getMsg\("(.*?)",?\s*(.*?)\)/g; + const diff = (a: Set, b: Set): Set => new Set([...Array.from(a)].filter(x => !b.has(x))); -const extract = (from: string, regex: any, transformFn: (match: any[]) => any) => { - const result = new Set(); - let item; - while ((item = regex.exec(from)) !== null) { - result.add(transformFn(item)); - } - return result; -}; +const extract = + (from: string, regex: any, transformFn: (match: any[], state?: Set) => any) => { + const result = new Set(); + let item; + while ((item = regex.exec(from)) !== null) { + result.add(transformFn(item, result)); + } + return result; + }; // verify that we extracted all the necessary translations // and their ids match the ones extracted via 'ng xi18n' @@ -73,8 +78,7 @@ const verifyTranslationIds = // placeholders object defined as goog.getMsg function argument const verifyPlaceholdersIntegrity = (output: string) => { const extactTranslations = (from: string) => { - const regex = /const\s*(.*?)\s*=\s*goog\.getMsg\("(.*?)",?\s*(.*?)\)/g; - return extract(from, regex, v => [v[2], v[3]]); + return extract(from, EXTRACT_GENERATED_TRANSLATIONS_REGEXP, v => [v[2], v[3]]); }; const extractPlaceholdersFromBody = (body: string) => { const regex = /{\$(.*?)}/g; @@ -95,6 +99,19 @@ const verifyPlaceholdersIntegrity = (output: string) => { return true; }; +const verifyUniqueConsts = (output: string) => { + extract( + output, EXTRACT_GENERATED_TRANSLATIONS_REGEXP, + (current: string[], state: Set): string => { + const key = current[1]; + if (state.has(key)) { + throw new Error(`Duplicate const ${key} found in generated output!`); + } + return key; + }); + return true; +}; + const getAppFilesWithTemplate = (template: string, args: any = {}) => ({ app: { 'spec.ts': ` @@ -134,6 +151,7 @@ const verify = (input: string, output: string, extra: any = {}): void => { const result = compile(files, angularFiles, opts(false)); maybePrint(result.source, extra.verbose); expect(verifyPlaceholdersIntegrity(result.source)).toBe(true); + expect(verifyUniqueConsts(result.source)).toBe(true); expectEmit(result.source, output, 'Incorrect template'); } @@ -147,6 +165,7 @@ const verify = (input: string, output: string, extra: any = {}): void => { expect(verifyTranslationIds(input, result.source, extra.exceptions, interpolationConfig)) .toBe(true); expect(verifyPlaceholdersIntegrity(result.source)).toBe(true); + expect(verifyUniqueConsts(result.source)).toBe(true); expectEmit(result.source, output, 'Incorrect template'); } }; @@ -1627,6 +1646,45 @@ describe('i18n support in the view compiler', () => { verify(input, output); }); + + it('should not emit duplicate i18n consts for nested s', () => { + const input = ` + + Root content + + Nested content + + + `; + + const output = String.raw ` + const $MSG_EXTERNAL_8537814667662432133$$APP_SPEC_TS__0$ = goog.getMsg(" Root content {$startTagNgContainer} Nested content {$closeTagNgContainer}", { + "startTagNgContainer": "\uFFFD*1:1\uFFFD\uFFFD#1:1\uFFFD", + "closeTagNgContainer": "\uFFFD/#1:1\uFFFD\uFFFD/*1:1\uFFFD" + }); + … + `; + + verify(input, output); + }); + + it('should not emit duplicate i18n consts for elements with the same content', () => { + const input = ` +
Test
+
Test
+ `; + + // TODO(FW-635): currently we generate unique consts for each i18n block even though it might + // contain the same content. This should be optimized by translation statements caching, that + // can be implemented in the future within FW-635. + const output = String.raw ` + const $MSG_EXTERNAL_6563391987554512024$$APP_SPEC_TS_0$ = goog.getMsg("Test"); + const $MSG_EXTERNAL_6563391987554512024$$APP_SPEC_TS_1$ = goog.getMsg("Test"); + … + `; + + verify(input, output); + }); }); describe('whitespace preserving mode', () => { diff --git a/packages/compiler/src/render3/view/i18n/context.ts b/packages/compiler/src/render3/view/i18n/context.ts index 87c50ac6f8..6be118d8d3 100644 --- a/packages/compiler/src/render3/view/i18n/context.ts +++ b/packages/compiler/src/render3/view/i18n/context.ts @@ -42,6 +42,7 @@ export class I18nContext { public readonly id: number; public bindings = new Set(); public placeholders = new Map(); + public isEmitted: boolean = false; private _registry !: any; private _unresolvedCtxCount: number = 0; diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index fb0af532dc..e5048daf71 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -373,8 +373,9 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } i18nUpdateRef(context: I18nContext): void { - const {icus, meta, isRoot, isResolved} = context; - if (isRoot && isResolved && !isSingleI18nIcu(meta)) { + const {icus, meta, isRoot, isResolved, isEmitted} = context; + if (isRoot && isResolved && !isEmitted && !isSingleI18nIcu(meta)) { + context.isEmitted = true; const placeholders = context.getSerializedPlaceholders(); let icuMapping: {[name: string]: o.Expression} = {}; let params: {[name: string]: o.Expression} = From 34bdebcdd2eef9dbb2237978576644d3f0b08cc9 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Sat, 16 Feb 2019 09:30:39 +0100 Subject: [PATCH 0154/1073] feat(ivy): add support for windows concrete types for paths (#28752) This commit introduces support for the windows paths in the new concrete types mechanism that was introduced in this PR https://github.com/angular/angular/pull/28523 Normalized posix paths that start with either a `/` or `C:/` are considered to be an absolute path. Note: `C:/` is used as a reference, as other drive letters are also supported. Fixes #28754 PR Close #28752 --- packages/compiler-cli/src/ngtsc/path/src/logical.ts | 2 ++ packages/compiler-cli/src/ngtsc/path/src/types.ts | 6 +++--- packages/compiler-cli/src/ngtsc/path/src/util.ts | 11 ++++++++++- .../compiler-cli/src/ngtsc/path/test/types_spec.ts | 8 +++++++- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/path/src/logical.ts b/packages/compiler-cli/src/ngtsc/path/src/logical.ts index 217cbb9ab5..40b2502c13 100644 --- a/packages/compiler-cli/src/ngtsc/path/src/logical.ts +++ b/packages/compiler-cli/src/ngtsc/path/src/logical.ts @@ -17,6 +17,8 @@ import {stripExtension} from './util'; /** * A path that's relative to the logical root of a TypeScript project (one of the project's * rootDirs). + * + * Paths in the type system use POSIX format. */ export type LogicalProjectPath = BrandedPath<'LogicalProjectPath'>; diff --git a/packages/compiler-cli/src/ngtsc/path/src/types.ts b/packages/compiler-cli/src/ngtsc/path/src/types.ts index 6c81d54034..3d9fcc8bb4 100644 --- a/packages/compiler-cli/src/ngtsc/path/src/types.ts +++ b/packages/compiler-cli/src/ngtsc/path/src/types.ts @@ -8,7 +8,7 @@ import * as ts from 'typescript'; -import {normalizeSeparators} from './util'; +import {isAbsolutePath, normalizeSeparators} from './util'; /** * A `string` representing a specific type of path, with a particular brand `B`. @@ -41,7 +41,7 @@ export const AbsoluteFsPath = { */ from: function(str: string): AbsoluteFsPath { const normalized = normalizeSeparators(str); - if (!normalized.startsWith('/')) { + if (!isAbsolutePath(normalized)) { throw new Error(`Internal Error: AbsoluteFsPath.from(${str}): path is not absolute`); } return normalized as AbsoluteFsPath; @@ -73,7 +73,7 @@ export const PathSegment = { */ fromFsPath: function(str: string): PathSegment { const normalized = normalizeSeparators(str); - if (normalized.startsWith('/')) { + if (isAbsolutePath(normalized)) { throw new Error(`Internal Error: PathSegment.from(${str}): path is not relative`); } return normalized as PathSegment; diff --git a/packages/compiler-cli/src/ngtsc/path/src/util.ts b/packages/compiler-cli/src/ngtsc/path/src/util.ts index 7ff6c21041..a416450fb0 100644 --- a/packages/compiler-cli/src/ngtsc/path/src/util.ts +++ b/packages/compiler-cli/src/ngtsc/path/src/util.ts @@ -9,9 +9,10 @@ // TODO(alxhub): Unify this file with `util/src/path`. const TS_DTS_JS_EXTENSION = /(?:\.d)?\.ts$|\.js$/; +const ABSOLUTE_PATH = /^([a-zA-Z]\:\/|\/)/; /** - * Convert Windows-style paths to POSIX paths. + * Convert Windows-style separators to POSIX separators. */ export function normalizeSeparators(path: string): string { // TODO: normalize path only for OS that need it. @@ -24,3 +25,11 @@ export function normalizeSeparators(path: string): string { export function stripExtension(path: string): string { return path.replace(TS_DTS_JS_EXTENSION, ''); } + +/** + * Returns true if the normalized path is an absolute path. + */ +export function isAbsolutePath(path: string): boolean { + // TODO: use regExp based on OS in the future + return ABSOLUTE_PATH.test(path); +} diff --git a/packages/compiler-cli/src/ngtsc/path/test/types_spec.ts b/packages/compiler-cli/src/ngtsc/path/test/types_spec.ts index 76793b67c3..41f7582987 100644 --- a/packages/compiler-cli/src/ngtsc/path/test/types_spec.ts +++ b/packages/compiler-cli/src/ngtsc/path/test/types_spec.ts @@ -10,10 +10,16 @@ import {AbsoluteFsPath} from '../src/types'; describe('path types', () => { describe('AbsoluteFsPath', () => { - it('should not throw when creating one from a non-absolute path', + it('should not throw when creating one from an absolute path', () => { expect(AbsoluteFsPath.from('/test.txt')).toEqual('/test.txt'); }); + it('should not throw when creating one from a windows absolute path', + () => { expect(AbsoluteFsPath.from('C:\\test.txt')).toEqual('C:/test.txt'); }); + it('should not throw when creating one from a windows absolute path with POSIX separators', + () => { expect(AbsoluteFsPath.from('C:/test.txt')).toEqual('C:/test.txt'); }); it('should throw when creating one from a non-absolute path', () => { expect(() => AbsoluteFsPath.from('test.txt')).toThrow(); }); + it('should support windows drive letters', + () => { expect(AbsoluteFsPath.from('D:\\foo\\test.txt')).toEqual('D:/foo/test.txt'); }); it('should convert Windows path separators to POSIX separators', () => { expect(AbsoluteFsPath.from('\\foo\\test.txt')).toEqual('/foo/test.txt'); }); }); From 40833ba54b232a189e62321165f593a49bbcc1b4 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Mon, 25 Feb 2019 15:26:10 -0800 Subject: [PATCH 0155/1073] fix(ivy): process property bindings in i18n blocks similar to non-i18n bindings (#28969) Prior to this change i18n block bindings were converted to Expressions right away (once we first access them), when in non-i18n cases we processed them differently: the actual conversion happens at instructions generation. Because of this discrepancy, the output for bindings in i18n blocks was generated incorrectly (with invalid indicies in pipeBindN fns and invalid references to non-existent local variables). Now the bindings processing is unified and i18nExp instructions should contain right bind expressions. PR Close #28969 --- .../compliance/r3_view_compiler_i18n_spec.ts | 53 +++++++++++++++---- .../compiler/src/render3/view/i18n/context.ts | 5 +- .../compiler/src/render3/view/template.ts | 15 +++--- .../compiler/test/render3/view/i18n_spec.ts | 14 +++-- packages/core/test/i18n_integration_spec.ts | 9 ++++ 5 files changed, 71 insertions(+), 25 deletions(-) diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts index 61539b698b..1186e84357 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts @@ -764,6 +764,37 @@ describe('i18n support in the view compiler', () => { verify(input, output, {inputArgs: {interpolation: ['{%', '%}']}}); }); + it('should support interpolations with complex expressions', () => { + const input = ` +
+ {{ valueA | async }} + {{ valueA?.a?.b }} +
+ `; + + const output = String.raw ` + const $MSG_EXTERNAL_1482713963707913023$$APP_SPEC_TS_0$ = goog.getMsg(" {$interpolation} {$interpolation_1} ", { + "interpolation": "\uFFFD0\uFFFD", + "interpolation_1": "\uFFFD1\uFFFD" + }); + … + template: function MyComponent_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵelementStart(0, "div"); + $r3$.ɵi18n(1, $MSG_EXTERNAL_1482713963707913023$$APP_SPEC_TS_0$); + $r3$.ɵpipe(2, "async"); + $r3$.ɵelementEnd(); + } + if (rf & 2) { + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(2, 2, ctx.valueA))); + $r3$.ɵi18nExp($r3$.ɵbind(((ctx.valueA == null) ? null : ((ctx.valueA.a == null) ? null : ctx.valueA.a.b)))); + $r3$.ɵi18nApply(1); + } + } + `; + verify(input, output); + }); + it('should handle i18n attributes with bindings in content', () => { const input = `
My i18n block #{{ one }}
@@ -800,7 +831,7 @@ describe('i18n support in the view compiler', () => { if (rf & 2) { $r3$.ɵi18nExp($r3$.ɵbind(ctx.one)); $r3$.ɵi18nApply(1); - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(4, 0, ctx.two))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(4, 3, ctx.two))); $r3$.ɵi18nApply(3); $r3$.ɵi18nExp($r3$.ɵbind(((ctx.three + ctx.four) + ctx.five))); $r3$.ɵi18nApply(6); @@ -868,7 +899,7 @@ describe('i18n support in the view compiler', () => { if (rf & 2) { $r3$.ɵi18nExp($r3$.ɵbind(ctx.one)); $r3$.ɵi18nApply(1); - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(5, 0, ctx.two))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(5, 3, ctx.two))); $r3$.ɵi18nExp($r3$.ɵbind(ctx.nestedInBlockTwo)); $r3$.ɵi18nApply(4); } @@ -941,7 +972,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵi18nApply(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueE)); $r3$.ɵi18nApply(8); - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(6, 0, ctx.valueD))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(6, 5, ctx.valueD))); $r3$.ɵi18nApply(5); } } @@ -988,7 +1019,7 @@ describe('i18n support in the view compiler', () => { if (rf & 2) { const $ctx_r0$ = $r3$.ɵnextContext(); $r3$.ɵi18nExp($r3$.ɵbind($ctx_r0$.valueA)); - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(4, 0, $ctx_r0$.valueB))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(4, 2, $ctx_r0$.valueB))); $r3$.ɵi18nApply(2); } } @@ -1118,7 +1149,7 @@ describe('i18n support in the view compiler', () => { const $ctx_r0$ = $r3$.ɵnextContext(); $r3$.ɵelementProperty(4, "ngIf", $r3$.ɵbind($ctx_r0$.exists)); $r3$.ɵi18nExp($r3$.ɵbind($ctx_r0$.valueA)); - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(3, 0, $ctx_r0$.valueB))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(3, 3, $ctx_r0$.valueB))); $r3$.ɵi18nApply(0); } } @@ -1148,7 +1179,7 @@ describe('i18n support in the view compiler', () => { if (rf & 2) { const $ctx_r1$ = $r3$.ɵnextContext(); $r3$.ɵi18nExp($r3$.ɵbind(($ctx_r1$.valueE + $ctx_r1$.valueF))); - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(3, 0, $ctx_r1$.valueG))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(3, 2, $ctx_r1$.valueG))); $r3$.ɵi18nApply(0); } } @@ -1347,7 +1378,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementContainerEnd(); } if (rf & 2) { - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(2, 0, ctx.valueA))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(2, 1, ctx.valueA))); $r3$.ɵi18nApply(1); } } @@ -1371,7 +1402,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵpipe(1, "uppercase"); } if (rf & 2) { const $ctx_r0$ = $r3$.ɵnextContext(); - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(1, 0, $ctx_r0$.valueA))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(1, 1, $ctx_r0$.valueA))); $r3$.ɵi18nApply(0); } } @@ -1412,7 +1443,7 @@ describe('i18n support in the view compiler', () => { } if (rf & 2) { const $ctx_r0$ = $r3$.ɵnextContext(); - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(1, 0, $ctx_r0$.valueA))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(1, 1, $ctx_r0$.valueA))); $r3$.ɵi18nApply(0); } } @@ -1431,7 +1462,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(4, 0, ctx.valueB))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(4, 1, ctx.valueB))); $r3$.ɵi18nApply(1); } } @@ -1540,7 +1571,7 @@ describe('i18n support in the view compiler', () => { } if (rf & 2) { const $ctx_r0$ = $r3$.ɵnextContext(); - $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(1, 0, $ctx_r0$.valueA))); + $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(1, 1, $ctx_r0$.valueA))); $r3$.ɵi18nApply(0); } } diff --git a/packages/compiler/src/render3/view/i18n/context.ts b/packages/compiler/src/render3/view/i18n/context.ts index 6be118d8d3..d2573d6f4c 100644 --- a/packages/compiler/src/render3/view/i18n/context.ts +++ b/packages/compiler/src/render3/view/i18n/context.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {AST} from '../../../expression_parser/ast'; import * as i18n from '../../../i18n/i18n_ast'; import * as o from '../../../output/output_ast'; @@ -40,7 +41,7 @@ function setupRegistry() { */ export class I18nContext { public readonly id: number; - public bindings = new Set(); + public bindings = new Set(); public placeholders = new Map(); public isEmitted: boolean = false; @@ -75,7 +76,7 @@ export class I18nContext { } // public API to accumulate i18n-related content - appendBinding(binding: o.Expression) { this.bindings.add(binding); } + appendBinding(binding: AST) { this.bindings.add(binding); } appendIcu(name: string, ref: o.Expression) { updatePlaceholderMap(this._registry.icus, name, ref); } diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index e5048daf71..d7c26c8e03 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -329,12 +329,9 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } i18nAppendBindings(expressions: AST[]) { - if (!this.i18n || !expressions.length) return; - const implicit = o.variable(CONTEXT_NAME); - expressions.forEach(expression => { - const binding = this.convertExpressionBinding(implicit, expression); - this.i18n !.appendBinding(binding); - }); + if (expressions.length > 0) { + expressions.forEach(expression => this.i18n !.appendBinding(expression)); + } } i18nBindProps(props: {[key: string]: t.Text | t.BoundText}): {[key: string]: o.Expression} { @@ -452,7 +449,11 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver // setup accumulated bindings const {index, bindings} = this.i18n; if (bindings.size) { - bindings.forEach(binding => this.updateInstruction(span, R3.i18nExp, [binding])); + bindings.forEach(binding => { + this.updateInstruction( + span, R3.i18nExp, + () => [this.convertPropertyBinding(o.variable(CONTEXT_NAME), binding)]); + }); this.updateInstruction(span, R3.i18nApply, [o.literal(index)]); } if (!selfClosing) { diff --git a/packages/compiler/test/render3/view/i18n_spec.ts b/packages/compiler/test/render3/view/i18n_spec.ts index 62588c98da..8acdd6fc41 100644 --- a/packages/compiler/test/render3/view/i18n_spec.ts +++ b/packages/compiler/test/render3/view/i18n_spec.ts @@ -6,6 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ +import {AST} from '../../../src/expression_parser/ast'; +import {Lexer} from '../../../src/expression_parser/lexer'; +import {Parser} from '../../../src/expression_parser/parser'; import * as i18n from '../../../src/i18n/i18n_ast'; import * as o from '../../../src/output/output_ast'; import * as t from '../../../src/render3/r3_ast'; @@ -15,6 +18,7 @@ import {I18nMeta, formatI18nPlaceholderName, parseI18nMeta} from '../../../src/r import {parseR3 as parse} from './util'; +const expressionParser = new Parser(new Lexer()); const i18nOf = (element: t.Node & {i18n?: i18n.AST}) => element.i18n !; describe('I18nContext', () => { @@ -44,8 +48,8 @@ describe('I18nContext', () => { // binding collection checks expect(ctx.bindings.size).toBe(0); - ctx.appendBinding(o.literal(1)); - ctx.appendBinding(o.literal(2)); + ctx.appendBinding(expressionParser.parseInterpolation('{{ valueA }}', '') as AST); + ctx.appendBinding(expressionParser.parseInterpolation('{{ valueB }}', '') as AST); expect(ctx.bindings.size).toBe(2); }); @@ -72,7 +76,7 @@ describe('I18nContext', () => { // set data for root ctx ctx.appendBoundText(i18nOf(boundTextA)); - ctx.appendBinding(o.literal('valueA')); + ctx.appendBinding(expressionParser.parseInterpolation('{{ valueA }}', '') as AST); ctx.appendElement(i18nOf(elementA), 0); ctx.appendTemplate(i18nOf(templateA), 1); ctx.appendElement(i18nOf(elementA), 0, true); @@ -88,11 +92,11 @@ describe('I18nContext', () => { // set data for child context childCtx.appendElement(i18nOf(elementB), 0); childCtx.appendBoundText(i18nOf(boundTextB)); - childCtx.appendBinding(o.literal('valueB')); + childCtx.appendBinding(expressionParser.parseInterpolation('{{ valueB }}', '') as AST); childCtx.appendElement(i18nOf(elementC), 1); childCtx.appendElement(i18nOf(elementC), 1, true); childCtx.appendBoundText(i18nOf(boundTextC)); - childCtx.appendBinding(o.literal('valueC')); + childCtx.appendBinding(expressionParser.parseInterpolation('{{ valueC }}', '') as AST); childCtx.appendElement(i18nOf(elementB), 0, true); expect(childCtx.bindings.size).toBe(2); diff --git a/packages/core/test/i18n_integration_spec.ts b/packages/core/test/i18n_integration_spec.ts index 06f51e631d..7a9e297d39 100644 --- a/packages/core/test/i18n_integration_spec.ts +++ b/packages/core/test/i18n_integration_spec.ts @@ -23,6 +23,7 @@ class DirectiveWithTplRef { class MyComp { name = 'John'; items = ['1', '2', '3']; + obj = {a: {b: 'value'}}; visible = true; age = 20; count = 2; @@ -42,6 +43,7 @@ const TRANSLATIONS: any = { 'Item {$interpolation}': 'Article {$interpolation}', '\'Single quotes\' and "Double quotes"': '\'Guillemets simples\' et "Guillemets doubles"', 'My logo': 'Mon logo', + '{$interpolation} - {$interpolation_1}': '{$interpolation} - {$interpolation_1} (fr)', '{$startTagSpan}My logo{$tagImg}{$closeTagSpan}': '{$startTagSpan}Mon logo{$tagImg}{$closeTagSpan}', '{$startTagNgTemplate} Hello {$closeTagNgTemplate}{$startTagNgContainer} Bye {$closeTagNgContainer}': @@ -175,6 +177,13 @@ onlyInIvy('Ivy i18n logic').describe('i18n', function() { expect(element).toHaveText('Bonjour John'); }); + it('should support interpolations with complex expressions', () => { + const template = `
{{ name | uppercase }} - {{ obj?.a?.b }}
`; + const fixture = getFixtureWithOverrides({template}); + const element = fixture.nativeElement.firstChild; + expect(element).toHaveText('JOHN - value (fr)'); + }); + it('should properly escape quotes in content', () => { const content = `'Single quotes' and "Double quotes"`; const template = `
${content}
`; From 827e89cfc47ef93f7cb7f25cb19f42cf33da7548 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Tue, 26 Feb 2019 14:48:42 -0800 Subject: [PATCH 0156/1073] feat(ivy): support inline ', + }) + export class TestCmp {} + `); + + env.driveMain(); + const jsContents = env.getContents('test.js'); + expect(jsContents).toContain('styles: ["h1[_ngcontent-%COMP%] {font-size: larger}"]'); + }); + + it('should process inline tags', () => { + env.tsconfig(); + env.write('style.css', `h1 {font-size: larger}`); + env.write('test.ts', ` + import {Component} from '@angular/core'; + + @Component({ + selector: 'test', + template: '', + }) + export class TestCmp {} + `); + + env.driveMain(); + const jsContents = env.getContents('test.js'); + expect(jsContents).toContain('styles: ["h1[_ngcontent-%COMP%] {font-size: larger}"]'); + }); + }); }); function expectTokenAtPosition( diff --git a/packages/compiler/src/render3/r3_template_transform.ts b/packages/compiler/src/render3/r3_template_transform.ts index c8fd92d270..371dda13b4 100644 --- a/packages/compiler/src/render3/r3_template_transform.ts +++ b/packages/compiler/src/render3/r3_template_transform.ts @@ -47,9 +47,12 @@ const IDENT_EVENT_IDX = 10; const TEMPLATE_ATTR_PREFIX = '*'; // Result of the html AST to Ivy AST transformation -export type Render3ParseResult = { - nodes: t.Node[]; errors: ParseError[]; -}; +export interface Render3ParseResult { + nodes: t.Node[]; + errors: ParseError[]; + styles: string[]; + styleUrls: string[]; +} export function htmlAstToRender3Ast( htmlNodes: html.Node[], bindingParser: BindingParser): Render3ParseResult { @@ -68,28 +71,33 @@ export function htmlAstToRender3Ast( return { nodes: ivyNodes, errors: allErrors, + styleUrls: transformer.styleUrls, + styles: transformer.styles, }; } class HtmlAstToIvyAst implements html.Visitor { errors: ParseError[] = []; + styles: string[] = []; + styleUrls: string[] = []; constructor(private bindingParser: BindingParser) {} // HTML visitor visitElement(element: html.Element): t.Node|null { const preparsedElement = preparseElement(element); - if (preparsedElement.type === PreparsedElementType.SCRIPT || - preparsedElement.type === PreparsedElementType.STYLE) { - // Skipping `)).toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'script'], + [lex.TokenType.TAG_OPEN_START, '', 'script'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.RAW_TEXT, 't\ne\ns\nt'], - [lex.TokenType.TAG_CLOSE, null, 'script'], + [lex.TokenType.TAG_CLOSE, '', 'script'], [lex.TokenType.EOF], ]); }); it('should not detect entities', () => { expect(tokenizeAndHumanizeParts(``)).toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'script'], + [lex.TokenType.TAG_OPEN_START, '', 'script'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.RAW_TEXT, '&'], - [lex.TokenType.TAG_CLOSE, null, 'script'], + [lex.TokenType.TAG_CLOSE, '', 'script'], [lex.TokenType.EOF], ]); }); it('should ignore other opening tags', () => { expect(tokenizeAndHumanizeParts(``)).toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'script'], + [lex.TokenType.TAG_OPEN_START, '', 'script'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.RAW_TEXT, 'a
'], - [lex.TokenType.TAG_CLOSE, null, 'script'], + [lex.TokenType.TAG_CLOSE, '', 'script'], [lex.TokenType.EOF], ]); }); it('should ignore other closing tags', () => { expect(tokenizeAndHumanizeParts(``)).toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'script'], + [lex.TokenType.TAG_OPEN_START, '', 'script'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.RAW_TEXT, 'a'], - [lex.TokenType.TAG_CLOSE, null, 'script'], + [lex.TokenType.TAG_CLOSE, '', 'script'], [lex.TokenType.EOF], ]); }); @@ -634,40 +634,40 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u describe('escapable raw text', () => { it('should parse text', () => { expect(tokenizeAndHumanizeParts(`t\ne\rs\r\nt`)).toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'title'], + [lex.TokenType.TAG_OPEN_START, '', 'title'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.ESCAPABLE_RAW_TEXT, 't\ne\ns\nt'], - [lex.TokenType.TAG_CLOSE, null, 'title'], + [lex.TokenType.TAG_CLOSE, '', 'title'], [lex.TokenType.EOF], ]); }); it('should detect entities', () => { expect(tokenizeAndHumanizeParts(`&`)).toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'title'], + [lex.TokenType.TAG_OPEN_START, '', 'title'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.ESCAPABLE_RAW_TEXT, '&'], - [lex.TokenType.TAG_CLOSE, null, 'title'], + [lex.TokenType.TAG_CLOSE, '', 'title'], [lex.TokenType.EOF], ]); }); it('should ignore other opening tags', () => { expect(tokenizeAndHumanizeParts(`a<div>`)).toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'title'], + [lex.TokenType.TAG_OPEN_START, '', 'title'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.ESCAPABLE_RAW_TEXT, 'a
'], - [lex.TokenType.TAG_CLOSE, null, 'title'], + [lex.TokenType.TAG_CLOSE, '', 'title'], [lex.TokenType.EOF], ]); }); it('should ignore other closing tags', () => { expect(tokenizeAndHumanizeParts(`a</test>`)).toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'title'], + [lex.TokenType.TAG_OPEN_START, '', 'title'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.ESCAPABLE_RAW_TEXT, 'a'], - [lex.TokenType.TAG_CLOSE, null, 'title'], + [lex.TokenType.TAG_CLOSE, '', 'title'], [lex.TokenType.EOF], ]); }); @@ -732,9 +732,9 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u expect(tokenizeAndHumanizeParts( '
{a, b, =4 {c}}
', {tokenizeExpansionForms: true})) .toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'div'], + [lex.TokenType.TAG_OPEN_START, '', 'div'], [lex.TokenType.TAG_OPEN_END], - [lex.TokenType.TAG_OPEN_START, null, 'span'], + [lex.TokenType.TAG_OPEN_START, '', 'span'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.EXPANSION_FORM_START], [lex.TokenType.RAW_TEXT, 'a'], @@ -744,8 +744,8 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [lex.TokenType.TEXT, 'c'], [lex.TokenType.EXPANSION_CASE_EXP_END], [lex.TokenType.EXPANSION_FORM_END], - [lex.TokenType.TAG_CLOSE, null, 'span'], - [lex.TokenType.TAG_CLOSE, null, 'div'], + [lex.TokenType.TAG_CLOSE, '', 'span'], + [lex.TokenType.TAG_CLOSE, '', 'div'], [lex.TokenType.EOF], ]); }); @@ -760,10 +760,10 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [lex.TokenType.EXPANSION_CASE_VALUE, '=4'], [lex.TokenType.EXPANSION_CASE_EXP_START], [lex.TokenType.TEXT, 'four '], - [lex.TokenType.TAG_OPEN_START, null, 'b'], + [lex.TokenType.TAG_OPEN_START, '', 'b'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.TEXT, 'a'], - [lex.TokenType.TAG_CLOSE, null, 'b'], + [lex.TokenType.TAG_CLOSE, '', 'b'], [lex.TokenType.EXPANSION_CASE_EXP_END], [lex.TokenType.EXPANSION_FORM_END], [lex.TokenType.EOF], @@ -996,10 +996,10 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u expect(tokenizeAndHumanizeParts( '', {escapedString: true})) .toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'script'], + [lex.TokenType.TAG_OPEN_START, '', 'script'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.RAW_TEXT, 'abc\ndef\nghi\tjkl`\'"mno'], - [lex.TokenType.TAG_CLOSE, null, 'script'], + [lex.TokenType.TAG_CLOSE, '', 'script'], [lex.TokenType.EOF], ]); }); @@ -1008,10 +1008,10 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u expect(tokenizeAndHumanizeParts( 'abc\ndef\\nghi\\tjkl\\`\\\'\\"mno', {escapedString: true})) .toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 'title'], + [lex.TokenType.TAG_OPEN_START, '', 'title'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.ESCAPABLE_RAW_TEXT, 'abc\ndef\nghi\tjkl`\'"mno'], - [lex.TokenType.TAG_CLOSE, null, 'title'], + [lex.TokenType.TAG_CLOSE, '', 'title'], [lex.TokenType.EOF], ]); }); @@ -1019,12 +1019,12 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u it('should parse over escape sequences in tag definitions', () => { expect(tokenizeAndHumanizeParts('', {escapedString: true})) .toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 't'], - [lex.TokenType.ATTR_NAME, null, 'a'], + [lex.TokenType.TAG_OPEN_START, '', 't'], + [lex.TokenType.ATTR_NAME, '', 'a'], [lex.TokenType.ATTR_QUOTE, '"'], [lex.TokenType.ATTR_VALUE, 'b'], [lex.TokenType.ATTR_QUOTE, '"'], - [lex.TokenType.ATTR_NAME, null, 'c'], + [lex.TokenType.ATTR_NAME, '', 'c'], [lex.TokenType.ATTR_QUOTE, '\''], [lex.TokenType.ATTR_VALUE, 'd'], [lex.TokenType.ATTR_QUOTE, '\''], @@ -1059,17 +1059,17 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u ''; expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ - [lex.TokenType.TAG_OPEN_START, null, 't'], [lex.TokenType.TAG_OPEN_END], - [lex.TokenType.TEXT, 'line 1'], [lex.TokenType.TAG_CLOSE, null, 't'], + [lex.TokenType.TAG_OPEN_START, '', 't'], [lex.TokenType.TAG_OPEN_END], + [lex.TokenType.TEXT, 'line 1'], [lex.TokenType.TAG_CLOSE, '', 't'], [lex.TokenType.TEXT, '\n'], - [lex.TokenType.TAG_OPEN_START, null, 't'], [lex.TokenType.TAG_OPEN_END], - [lex.TokenType.TEXT, 'line 2'], [lex.TokenType.TAG_CLOSE, null, 't'], + [lex.TokenType.TAG_OPEN_START, '', 't'], [lex.TokenType.TAG_OPEN_END], + [lex.TokenType.TEXT, 'line 2'], [lex.TokenType.TAG_CLOSE, '', 't'], [lex.TokenType.TEXT, '\n'], - [lex.TokenType.TAG_OPEN_START, null, 't'], [lex.TokenType.TAG_OPEN_END], + [lex.TokenType.TAG_OPEN_START, '', 't'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.TEXT, 'line 3'], // <- line continuation does not appear in token - [lex.TokenType.TAG_CLOSE, null, 't'], + [lex.TokenType.TAG_CLOSE, '', 't'], [lex.TokenType.EOF] ]); From f7c867ebc28d6f1d0f9315c0d816ac0d2ea00269 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Tue, 26 Feb 2019 13:06:26 +0000 Subject: [PATCH 0163/1073] fix(ivy): correctly tokenize escaped characters in templates (#28978) Previously the start of a character indicated by an escape sequence was being incorrectly computed by the lexer, which caused tokens to include the start of the escaped character sequence in the preceding token. In particular this affected the name extracted from opening tags if the name was terminated by an escape sequence. For example, `` would have the name `t\` rather than `t`. This fix refactors the lexer to use a "cursor" object to iterate over the characters in the template source. There are two cursor implementations, one expects a simple string, the other expects a string that contains JavaScript escape sequences that need to be unescaped. PR Close #28978 --- packages/compiler/src/ml_parser/lexer.ts | 751 ++++++++++-------- .../compiler/test/ml_parser/lexer_spec.ts | 72 +- 2 files changed, 476 insertions(+), 347 deletions(-) diff --git a/packages/compiler/src/ml_parser/lexer.ts b/packages/compiler/src/ml_parser/lexer.ts index 0e2f44f2b0..ef798bb3aa 100644 --- a/packages/compiler/src/ml_parser/lexer.ts +++ b/packages/compiler/src/ml_parser/lexer.ts @@ -120,17 +120,10 @@ class _ControlFlowError { // See http://www.w3.org/TR/html51/syntax.html#writing class _Tokenizer { - private _input: string; - private _end: number; + private _cursor: CharacterCursor; private _tokenizeIcu: boolean; private _interpolationConfig: InterpolationConfig; - private _escapedString: boolean; - private _peek: number = -1; - private _nextPeek: number = -1; - private _index: number; - private _line: number; - private _column: number; - private _currentTokenStart: ParseLocation|null = null; + private _currentTokenStart: CharacterCursor|null = null; private _currentTokenType: TokenType|null = null; private _expansionCaseStack: TokenType[] = []; private _inInterpolation: boolean = false; @@ -145,31 +138,18 @@ class _Tokenizer { * @param _interpolationConfig */ constructor( - private _file: ParseSourceFile, private _getTagDefinition: (tagName: string) => TagDefinition, + _file: ParseSourceFile, private _getTagDefinition: (tagName: string) => TagDefinition, options: TokenizeOptions) { this._tokenizeIcu = options.tokenizeExpansionForms || false; this._interpolationConfig = options.interpolationConfig || DEFAULT_INTERPOLATION_CONFIG; - this._escapedString = options.escapedString || false; - this._input = _file.content; - if (options.range) { - this._end = options.range.endPos; - this._index = options.range.startPos; - this._line = options.range.startLine; - this._column = options.range.startCol; - } else { - this._end = this._input.length; - this._index = 0; - this._line = 0; - this._column = 0; - } + const range = + options.range || {endPos: _file.content.length, startPos: 0, startLine: 0, startCol: 0}; + this._cursor = options.escapedString ? new EscapedCharacterCursor(_file, range) : + new PlainCharacterCursor(_file, range); try { - this._initPeek(); + this._cursor.init(); } catch (e) { - if (e instanceof _ControlFlowError) { - this.errors.push(e.error); - } else { - throw e; - } + this.handleError(e); } } @@ -182,8 +162,8 @@ class _Tokenizer { } tokenize(): TokenizeResult { - while (this._peek !== chars.$EOF) { - const start = this._getLocation(); + while (this._cursor.peek() !== chars.$EOF) { + const start = this._cursor.clone(); try { if (this._attemptCharCode(chars.$LT)) { if (this._attemptCharCode(chars.$BANG)) { @@ -203,11 +183,7 @@ class _Tokenizer { this._consumeText(); } } catch (e) { - if (e instanceof _ControlFlowError) { - this.errors.push(e.error); - } else { - throw e; - } + this.handleError(e); } } this._beginToken(TokenType.EOF); @@ -220,17 +196,17 @@ class _Tokenizer { * @internal */ private _tokenizeExpansionForm(): boolean { - if (isExpansionFormStart(this._input, this._index, this._interpolationConfig)) { + if (this.isExpansionFormStart()) { this._consumeExpansionFormStart(); return true; } - if (isExpansionCaseStart(this._peek) && this._isInExpansionForm()) { + if (isExpansionCaseStart(this._cursor.peek()) && this._isInExpansionForm()) { this._consumeExpansionCaseStart(); return true; } - if (this._peek === chars.$RBRACE) { + if (this._cursor.peek() === chars.$RBRACE) { if (this._isInExpansionCase()) { this._consumeExpansionCaseEnd(); return true; @@ -245,34 +221,24 @@ class _Tokenizer { return false; } - private _getLocation(): ParseLocation { - return new ParseLocation(this._file, this._index, this._line, this._column); - } - - private _getSpan( - start: ParseLocation = this._getLocation(), - end: ParseLocation = this._getLocation()): ParseSourceSpan { - return new ParseSourceSpan(start, end); - } - - private _beginToken(type: TokenType, start: ParseLocation = this._getLocation()) { + private _beginToken(type: TokenType, start = this._cursor.clone()) { this._currentTokenStart = start; this._currentTokenType = type; } - private _endToken(parts: string[], end: ParseLocation = this._getLocation()): Token { + private _endToken(parts: string[], end = this._cursor.clone()): Token { if (this._currentTokenStart === null) { throw new TokenError( 'Programming error - attempted to end a token when there was no start to the token', - this._currentTokenType, this._getSpan(end, end)); + this._currentTokenType, this._cursor.getSpan(end)); } if (this._currentTokenType === null) { throw new TokenError( 'Programming error - attempted to end a token which has no token type', null, - this._getSpan(this._currentTokenStart, end)); + this._cursor.getSpan(this._currentTokenStart)); } const token = - new Token(this._currentTokenType, parts, new ParseSourceSpan(this._currentTokenStart, end)); + new Token(this._currentTokenType, parts, this._cursor.getSpan(this._currentTokenStart)); this.tokens.push(token); this._currentTokenStart = null; this._currentTokenType = null; @@ -284,89 +250,57 @@ class _Tokenizer { msg += ` (Do you have an unescaped "{" in your template? Use "{{ '{' }}") to escape it.)`; } const error = new TokenError(msg, this._currentTokenType, span); - this._currentTokenStart = null !; - this._currentTokenType = null !; + this._currentTokenStart = null; + this._currentTokenType = null; return new _ControlFlowError(error); } - private _advance(processingEscapeSequence?: boolean) { - if (this._index >= this._end) { - throw this._createError(_unexpectedCharacterErrorMsg(chars.$EOF), this._getSpan()); + private handleError(e: any) { + if (e instanceof CursorError) { + e = this._createError(e.msg, this._cursor.getSpan(e.cursor)); } - // The actual character in the input might be different to the _peek if we are processing - // escape characters. We only want to track "real" new lines. - const actualChar = this._input.charCodeAt(this._index); - if (actualChar === chars.$LF) { - this._line++; - this._column = 0; - } else if (!chars.isNewLine(actualChar)) { - this._column++; - } - this._index++; - this._initPeek(processingEscapeSequence); - } - - /** - * Initialize the _peek and _nextPeek properties based on the current _index. - * @param processingEscapeSequence whether we are in the middle of processing an escape sequence. - */ - private _initPeek(processingEscapeSequence?: boolean) { - this._peek = this._index >= this._end ? chars.$EOF : this._input.charCodeAt(this._index); - this._nextPeek = - this._index + 1 >= this._end ? chars.$EOF : this._input.charCodeAt(this._index + 1); - if (this._peek === chars.$BACKSLASH && processingEscapeSequence !== true && - this._escapedString) { - this._processEscapeSequence(); - } - } - - /** - * Advance the specific number of characters. - * @param count The number of characters to advance. - * @param processingEscapeSequence Whether we want `advance()` to process escape sequences. - */ - private _advanceN(count: number, processingEscapeSequence?: boolean) { - while (count) { - this._advance(processingEscapeSequence); - count--; + if (e instanceof _ControlFlowError) { + this.errors.push(e.error); + } else { + throw e; } } private _attemptCharCode(charCode: number): boolean { - if (this._peek === charCode) { - this._advance(); + if (this._cursor.peek() === charCode) { + this._cursor.advance(); return true; } return false; } private _attemptCharCodeCaseInsensitive(charCode: number): boolean { - if (compareCharCodeCaseInsensitive(this._peek, charCode)) { - this._advance(); + if (compareCharCodeCaseInsensitive(this._cursor.peek(), charCode)) { + this._cursor.advance(); return true; } return false; } private _requireCharCode(charCode: number) { - const location = this._getLocation(); + const location = this._cursor.clone(); if (!this._attemptCharCode(charCode)) { throw this._createError( - _unexpectedCharacterErrorMsg(this._peek), this._getSpan(location, location)); + _unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(location)); } } private _attemptStr(chars: string): boolean { const len = chars.length; - if (this._index + len > this._end) { + if (this._cursor.charsLeft() < len) { return false; } - const initialPosition = this._savePosition(); + const initialPosition = this._cursor.clone(); for (let i = 0; i < len; i++) { if (!this._attemptCharCode(chars.charCodeAt(i))) { // If attempting to parse the string fails, we want to reset the parser // to where it was before the attempt - this._restorePosition(initialPosition); + this._cursor = initialPosition; return false; } } @@ -383,277 +317,162 @@ class _Tokenizer { } private _requireStr(chars: string) { - const location = this._getLocation(); + const location = this._cursor.clone(); if (!this._attemptStr(chars)) { - throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan(location)); + throw this._createError( + _unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(location)); } } private _attemptCharCodeUntilFn(predicate: (code: number) => boolean) { - while (!predicate(this._peek)) { - this._advance(); + while (!predicate(this._cursor.peek())) { + this._cursor.advance(); } } private _requireCharCodeUntilFn(predicate: (code: number) => boolean, len: number) { - const start = this._getLocation(); + const start = this._cursor.clone(); this._attemptCharCodeUntilFn(predicate); - if (this._index - start.offset < len) { + const end = this._cursor.clone(); + if (end.diff(start) < len) { throw this._createError( - _unexpectedCharacterErrorMsg(this._peek), this._getSpan(start, start)); + _unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(start)); } } private _attemptUntilChar(char: number) { - while (this._peek !== char) { - this._advance(); + while (this._cursor.peek() !== char) { + this._cursor.advance(); } } private _readChar(decodeEntities: boolean): string { - if (decodeEntities && this._peek === chars.$AMPERSAND) { + if (decodeEntities && this._cursor.peek() === chars.$AMPERSAND) { return this._decodeEntity(); } else { // Don't rely upon reading directly from `_input` as the actual char value // may have been generated from an escape sequence. - const char = String.fromCodePoint(this._peek); - this._advance(); + const char = String.fromCodePoint(this._cursor.peek()); + this._cursor.advance(); return char; } } private _decodeEntity(): string { - const start = this._getLocation(); - this._advance(); + const start = this._cursor.clone(); + this._cursor.advance(); if (this._attemptCharCode(chars.$HASH)) { const isHex = this._attemptCharCode(chars.$x) || this._attemptCharCode(chars.$X); - const numberStart = this._getLocation().offset; + const codeStart = this._cursor.clone(); this._attemptCharCodeUntilFn(isDigitEntityEnd); - if (this._peek != chars.$SEMICOLON) { - throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan()); + if (this._cursor.peek() != chars.$SEMICOLON) { + throw this._createError( + _unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan()); } - this._advance(); - const strNum = this._input.substring(numberStart, this._index - 1); + const strNum = this._cursor.getChars(codeStart); + this._cursor.advance(); try { const charCode = parseInt(strNum, isHex ? 16 : 10); return String.fromCharCode(charCode); } catch { - const entity = this._input.substring(start.offset + 1, this._index - 1); - throw this._createError(_unknownEntityErrorMsg(entity), this._getSpan(start)); + throw this._createError( + _unknownEntityErrorMsg(this._cursor.getChars(start)), this._cursor.getSpan()); } } else { - const startPosition = this._savePosition(); + const nameStart = this._cursor.clone(); this._attemptCharCodeUntilFn(isNamedEntityEnd); - if (this._peek != chars.$SEMICOLON) { - this._restorePosition(startPosition); + if (this._cursor.peek() != chars.$SEMICOLON) { + this._cursor = nameStart; return '&'; } - this._advance(); - const name = this._input.substring(start.offset + 1, this._index - 1); + const name = this._cursor.getChars(nameStart); + this._cursor.advance(); const char = NAMED_ENTITIES[name]; if (!char) { - throw this._createError(_unknownEntityErrorMsg(name), this._getSpan(start)); + throw this._createError(_unknownEntityErrorMsg(name), this._cursor.getSpan(start)); } return char; } } - /** - * Process the escape sequence that starts at the current position in the text. - * - * This method is called from `_advance()` to ensure that escape sequences are - * always processed correctly however tokens are being consumed. - * - * But note that this method also calls `_advance()` (re-entering) to move through - * the characters within an escape sequence. In that case it tells `_advance()` not - * to attempt to process further escape sequences by passing `true` as its first - * argument. - */ - private _processEscapeSequence(): void { - this._advance(true); // advance past the backslash - - // First check for standard control char sequences - if (this._peekChar() === chars.$n) { - this._peek = chars.$LF; - } else if (this._peekChar() === chars.$r) { - this._peek = chars.$CR; - } else if (this._peekChar() === chars.$v) { - this._peek = chars.$VTAB; - } else if (this._peekChar() === chars.$t) { - this._peek = chars.$TAB; - } else if (this._peekChar() === chars.$b) { - this._peek = chars.$BSPACE; - } else if (this._peekChar() === chars.$f) { - this._peek = chars.$FF; - } - - // Now consider more complex sequences - - else if (this._peekChar() === chars.$u) { - // Unicode code-point sequence - this._advance(true); // advance past the `u` char - if (this._peekChar() === chars.$LBRACE) { - // Variable length Unicode, e.g. `\x{123}` - this._advance(true); // advance past the `{` char - // Advance past the variable number of hex digits until we hit a `}` char - const start = this._getLocation(); - while (this._peekChar() !== chars.$RBRACE) { - this._advance(true); - } - this._decodeHexDigits(start, this._index - start.offset); - } else { - // Fixed length Unicode, e.g. `\u1234` - this._parseFixedHexSequence(4); - } - } - - else if (this._peekChar() === chars.$x) { - // Hex char code, e.g. `\x2F` - this._advance(true); // advance past the `x` char - this._parseFixedHexSequence(2); - } - - else if (chars.isOctalDigit(this._peekChar())) { - // Octal char code, e.g. `\012`, - const start = this._index; - let length = 1; - // Note that we work with `_nextPeek` because, although we check the next character - // after the sequence to find the end of the sequence, - // we do not want to advance that far to check the character, otherwise we will - // have to back up. - while (chars.isOctalDigit(this._nextPeek) && length < 3) { - this._advance(true); - length++; - } - const octal = this._input.substr(start, length); - this._peek = parseInt(octal, 8); - } - - else if (chars.isNewLine(this._peekChar())) { - // Line continuation `\` followed by a new line - this._advance(true); // advance over the newline - } - - // If none of the `if` blocks were executed then we just have an escaped normal character. - // In that case we just, effectively, skip the backslash from the character. - } - - private _parseFixedHexSequence(length: number) { - const start = this._getLocation(); - this._advanceN(length - 1, true); - this._decodeHexDigits(start, length); - } - - private _decodeHexDigits(start: ParseLocation, length: number) { - const hex = this._input.substr(start.offset, length); - const charCode = parseInt(hex, 16); - if (!isNaN(charCode)) { - this._peek = charCode; - } else { - throw this._createError( - 'Invalid hexadecimal escape sequence', this._getSpan(start, this._getLocation())); - } - } - - /** - * This little helper is to solve a problem where the TS compiler will narrow - * the type of `_peek` after an `if` statment, even if there is a call to a - * method that might mutate the `_peek`. - * - * For example: - * - * ``` - * if (this._peek === 10) { - * this._advance(); // mutates _peek - * if (this._peek === 20) { - * ... - * ``` - * - * The second if statement fails TS compilation because the compiler has determined - * that `_peek` is `10` and so can never be equal to `20`. - */ - private _peekChar(): number { return this._peek; } - - private _consumeRawText( - decodeEntities: boolean, firstCharOfEnd: number, attemptEndRest: () => boolean): Token { - let tagCloseStart: ParseLocation; - const textStart = this._getLocation(); - this._beginToken(decodeEntities ? TokenType.ESCAPABLE_RAW_TEXT : TokenType.RAW_TEXT, textStart); + private _consumeRawText(decodeEntities: boolean, endMarkerPredicate: () => boolean): Token { + this._beginToken(decodeEntities ? TokenType.ESCAPABLE_RAW_TEXT : TokenType.RAW_TEXT); const parts: string[] = []; while (true) { - tagCloseStart = this._getLocation(); - if (this._attemptCharCode(firstCharOfEnd) && attemptEndRest()) { + const tagCloseStart = this._cursor.clone(); + const foundEndMarker = endMarkerPredicate(); + this._cursor = tagCloseStart; + if (foundEndMarker) { break; } - if (this._index > tagCloseStart.offset) { - // add the characters consumed by the previous if statement to the output - parts.push(this._input.substring(tagCloseStart.offset, this._index)); - } - while (this._peek !== firstCharOfEnd) { - parts.push(this._readChar(decodeEntities)); - } + parts.push(this._readChar(decodeEntities)); } - return this._endToken([this._processCarriageReturns(parts.join(''))], tagCloseStart); + return this._endToken([this._processCarriageReturns(parts.join(''))]); } - private _consumeComment(start: ParseLocation) { + private _consumeComment(start: CharacterCursor) { this._beginToken(TokenType.COMMENT_START, start); this._requireCharCode(chars.$MINUS); this._endToken([]); - const textToken = this._consumeRawText(false, chars.$MINUS, () => this._attemptStr('->')); - this._beginToken(TokenType.COMMENT_END, textToken.sourceSpan.end); + this._consumeRawText(false, () => this._attemptStr('-->')); + this._beginToken(TokenType.COMMENT_END); + this._requireStr('-->'); this._endToken([]); } - private _consumeCdata(start: ParseLocation) { + private _consumeCdata(start: CharacterCursor) { this._beginToken(TokenType.CDATA_START, start); this._requireStr('CDATA['); this._endToken([]); - const textToken = this._consumeRawText(false, chars.$RBRACKET, () => this._attemptStr(']>')); - this._beginToken(TokenType.CDATA_END, textToken.sourceSpan.end); + this._consumeRawText(false, () => this._attemptStr(']]>')); + this._beginToken(TokenType.CDATA_END); + this._requireStr(']]>'); this._endToken([]); } - private _consumeDocType(start: ParseLocation) { + private _consumeDocType(start: CharacterCursor) { this._beginToken(TokenType.DOC_TYPE, start); + const contentStart = this._cursor.clone(); this._attemptUntilChar(chars.$GT); - this._advance(); - this._endToken([this._input.substring(start.offset + 2, this._index - 1)]); + const content = this._cursor.getChars(contentStart); + this._cursor.advance(); + this._endToken([content]); } private _consumePrefixAndName(): string[] { - const nameOrPrefixStart = this._index; + const nameOrPrefixStart = this._cursor.clone(); let prefix: string = ''; - while (this._peek !== chars.$COLON && !isPrefixEnd(this._peek)) { - this._advance(); + while (this._cursor.peek() !== chars.$COLON && !isPrefixEnd(this._cursor.peek())) { + this._cursor.advance(); } - let nameStart: number; - if (this._peek === chars.$COLON) { - this._advance(); - prefix = this._input.substring(nameOrPrefixStart, this._index - 1); - nameStart = this._index; + let nameStart: CharacterCursor; + if (this._cursor.peek() === chars.$COLON) { + prefix = this._cursor.getChars(nameOrPrefixStart); + this._cursor.advance(); + nameStart = this._cursor.clone(); } else { nameStart = nameOrPrefixStart; } - this._requireCharCodeUntilFn(isNameEnd, this._index === nameStart ? 1 : 0); - const name = this._input.substring(nameStart, this._index); + this._requireCharCodeUntilFn(isNameEnd, prefix === '' ? 0 : 1); + const name = this._cursor.getChars(nameStart); return [prefix, name]; } - private _consumeTagOpen(start: ParseLocation) { - const savedPos = this._savePosition(); + private _consumeTagOpen(start: CharacterCursor) { let tagName: string; let prefix: string; let openTagToken: Token|undefined; + const innerStart = this._cursor.clone(); try { - if (!chars.isAsciiLetter(this._peek)) { - throw this._createError(_unexpectedCharacterErrorMsg(this._peek), this._getSpan()); + if (!chars.isAsciiLetter(this._cursor.peek())) { + throw this._createError( + _unexpectedCharacterErrorMsg(this._cursor.peek()), this._cursor.getSpan(start)); } openTagToken = this._consumeTagOpenStart(start); prefix = openTagToken.parts[0]; tagName = openTagToken.parts[1]; this._attemptCharCodeUntilFn(isNotWhitespace); - while (this._peek !== chars.$SLASH && this._peek !== chars.$GT) { + while (this._cursor.peek() !== chars.$SLASH && this._cursor.peek() !== chars.$GT) { this._consumeAttributeName(); this._attemptCharCodeUntilFn(isNotWhitespace); if (this._attemptCharCode(chars.$EQ)) { @@ -666,7 +485,10 @@ class _Tokenizer { } catch (e) { if (e instanceof _ControlFlowError) { // When the start tag is invalid, assume we want a "<" - this._restorePosition(savedPos); + this._cursor = innerStart; + if (openTagToken) { + this.tokens.pop(); + } // Back to back text tokens are merged at the end this._beginToken(TokenType.TEXT, start); this._endToken(['<']); @@ -686,18 +508,21 @@ class _Tokenizer { } private _consumeRawTextWithTagClose(prefix: string, tagName: string, decodeEntities: boolean) { - const textToken = this._consumeRawText(decodeEntities, chars.$LT, () => { + const textToken = this._consumeRawText(decodeEntities, () => { + if (!this._attemptCharCode(chars.$LT)) return false; if (!this._attemptCharCode(chars.$SLASH)) return false; this._attemptCharCodeUntilFn(isNotWhitespace); if (!this._attemptStrCaseInsensitive(tagName)) return false; this._attemptCharCodeUntilFn(isNotWhitespace); return this._attemptCharCode(chars.$GT); }); - this._beginToken(TokenType.TAG_CLOSE, textToken.sourceSpan.end); + this._beginToken(TokenType.TAG_CLOSE); + this._requireCharCodeUntilFn(code => code === chars.$GT, 3); + this._cursor.advance(); // Consume the `>` this._endToken([prefix, tagName]); } - private _consumeTagOpenStart(start: ParseLocation) { + private _consumeTagOpenStart(start: CharacterCursor) { this._beginToken(TokenType.TAG_OPEN_START, start); const parts = this._consumePrefixAndName(); return this._endToken(parts); @@ -711,26 +536,26 @@ class _Tokenizer { private _consumeAttributeValue() { let value: string; - if (this._peek === chars.$SQ || this._peek === chars.$DQ) { + if (this._cursor.peek() === chars.$SQ || this._cursor.peek() === chars.$DQ) { this._beginToken(TokenType.ATTR_QUOTE); - const quoteChar = this._peek; - this._advance(); + const quoteChar = this._cursor.peek(); + this._cursor.advance(); this._endToken([String.fromCodePoint(quoteChar)]); this._beginToken(TokenType.ATTR_VALUE); const parts: string[] = []; - while (this._peek !== quoteChar) { + while (this._cursor.peek() !== quoteChar) { parts.push(this._readChar(true)); } value = parts.join(''); this._endToken([this._processCarriageReturns(value)]); this._beginToken(TokenType.ATTR_QUOTE); - this._advance(); + this._cursor.advance(); this._endToken([String.fromCodePoint(quoteChar)]); } else { this._beginToken(TokenType.ATTR_VALUE); - const valueStart = this._index; + const valueStart = this._cursor.clone(); this._requireCharCodeUntilFn(isNameEnd, 1); - value = this._input.substring(valueStart, this._index); + value = this._cursor.getChars(valueStart); this._endToken([this._processCarriageReturns(value)]); } } @@ -743,7 +568,7 @@ class _Tokenizer { this._endToken([]); } - private _consumeTagClose(start: ParseLocation) { + private _consumeTagClose(start: CharacterCursor) { this._beginToken(TokenType.TAG_CLOSE, start); this._attemptCharCodeUntilFn(isNotWhitespace); const prefixAndName = this._consumePrefixAndName(); @@ -753,50 +578,50 @@ class _Tokenizer { } private _consumeExpansionFormStart() { - this._beginToken(TokenType.EXPANSION_FORM_START, this._getLocation()); + this._beginToken(TokenType.EXPANSION_FORM_START); this._requireCharCode(chars.$LBRACE); this._endToken([]); this._expansionCaseStack.push(TokenType.EXPANSION_FORM_START); - this._beginToken(TokenType.RAW_TEXT, this._getLocation()); + this._beginToken(TokenType.RAW_TEXT); const condition = this._readUntil(chars.$COMMA); - this._endToken([condition], this._getLocation()); + this._endToken([condition]); this._requireCharCode(chars.$COMMA); this._attemptCharCodeUntilFn(isNotWhitespace); - this._beginToken(TokenType.RAW_TEXT, this._getLocation()); + this._beginToken(TokenType.RAW_TEXT); const type = this._readUntil(chars.$COMMA); - this._endToken([type], this._getLocation()); + this._endToken([type]); this._requireCharCode(chars.$COMMA); this._attemptCharCodeUntilFn(isNotWhitespace); } private _consumeExpansionCaseStart() { - this._beginToken(TokenType.EXPANSION_CASE_VALUE, this._getLocation()); + this._beginToken(TokenType.EXPANSION_CASE_VALUE); const value = this._readUntil(chars.$LBRACE).trim(); - this._endToken([value], this._getLocation()); + this._endToken([value]); this._attemptCharCodeUntilFn(isNotWhitespace); - this._beginToken(TokenType.EXPANSION_CASE_EXP_START, this._getLocation()); + this._beginToken(TokenType.EXPANSION_CASE_EXP_START); this._requireCharCode(chars.$LBRACE); - this._endToken([], this._getLocation()); + this._endToken([]); this._attemptCharCodeUntilFn(isNotWhitespace); this._expansionCaseStack.push(TokenType.EXPANSION_CASE_EXP_START); } private _consumeExpansionCaseEnd() { - this._beginToken(TokenType.EXPANSION_CASE_EXP_END, this._getLocation()); + this._beginToken(TokenType.EXPANSION_CASE_EXP_END); this._requireCharCode(chars.$RBRACE); - this._endToken([], this._getLocation()); + this._endToken([]); this._attemptCharCodeUntilFn(isNotWhitespace); this._expansionCaseStack.pop(); } private _consumeExpansionFormEnd() { - this._beginToken(TokenType.EXPANSION_FORM_END, this._getLocation()); + this._beginToken(TokenType.EXPANSION_FORM_END); this._requireCharCode(chars.$RBRACE); this._endToken([]); @@ -804,7 +629,7 @@ class _Tokenizer { } private _consumeText() { - const start = this._getLocation(); + const start = this._cursor.clone(); this._beginToken(TokenType.TEXT, start); const parts: string[] = []; @@ -826,17 +651,17 @@ class _Tokenizer { } private _isTextEnd(): boolean { - if (this._peek === chars.$LT || this._peek === chars.$EOF) { + if (this._cursor.peek() === chars.$LT || this._cursor.peek() === chars.$EOF) { return true; } if (this._tokenizeIcu && !this._inInterpolation) { - if (isExpansionFormStart(this._input, this._index, this._interpolationConfig)) { + if (this.isExpansionFormStart()) { // start of an expansion form return true; } - if (this._peek === chars.$RBRACE && this._isInExpansionCase()) { + if (this._cursor.peek() === chars.$RBRACE && this._isInExpansionCase()) { // end of and expansion case return true; } @@ -845,26 +670,10 @@ class _Tokenizer { return false; } - private _savePosition(): [number, number, number, number, number] { - return [this._peek, this._index, this._column, this._line, this.tokens.length]; - } - private _readUntil(char: number): string { - const start = this._index; + const start = this._cursor.clone(); this._attemptUntilChar(char); - return this._input.substring(start, this._index); - } - - private _restorePosition(position: [number, number, number, number, number]): void { - this._peek = position[0]; - this._index = position[1]; - this._column = position[2]; - this._line = position[3]; - const nbTokens = position[4]; - if (nbTokens < this.tokens.length) { - // remove any extra tokens - this.tokens = this.tokens.slice(0, nbTokens); - } + return this._cursor.getChars(start); } private _isInExpansionCase(): boolean { @@ -878,6 +687,19 @@ class _Tokenizer { this._expansionCaseStack[this._expansionCaseStack.length - 1] === TokenType.EXPANSION_FORM_START; } + + private isExpansionFormStart(): boolean { + if (this._cursor.peek() !== chars.$LBRACE) { + return false; + } + if (this._interpolationConfig) { + const start = this._cursor.clone(); + const isInterpolation = this._attemptStr(this._interpolationConfig.start); + this._cursor = start; + return !isInterpolation; + } + return true; + } } function isNotWhitespace(code: number): boolean { @@ -902,14 +724,6 @@ function isNamedEntityEnd(code: number): boolean { return code == chars.$SEMICOLON || code == chars.$EOF || !chars.isAsciiLetter(code); } -function isExpansionFormStart( - input: string, offset: number, interpolationConfig: InterpolationConfig): boolean { - const isInterpolationStart = - interpolationConfig ? input.indexOf(interpolationConfig.start, offset) == offset : false; - - return input.charCodeAt(offset) == chars.$LBRACE && !isInterpolationStart; -} - function isExpansionCaseStart(peek: number): boolean { return peek === chars.$EQ || chars.isAsciiLetter(peek) || chars.isDigit(peek); } @@ -928,7 +742,7 @@ function mergeTextTokens(srcTokens: Token[]): Token[] { for (let i = 0; i < srcTokens.length; i++) { const token = srcTokens[i]; if (lastDstToken && lastDstToken.type == TokenType.TEXT && token.type == TokenType.TEXT) { - lastDstToken.parts[0] += token.parts[0]; + lastDstToken.parts[0] ! += token.parts[0]; lastDstToken.sourceSpan.end = token.sourceSpan.end; } else { lastDstToken = token; @@ -938,3 +752,258 @@ function mergeTextTokens(srcTokens: Token[]): Token[] { return dstTokens; } + + +/** + * The _Tokenizer uses objects of this type to move through the input text, + * extracting "parsed characters". These could be more than one actual character + * if the text contains escape sequences. + */ +interface CharacterCursor { + /** Initialize the cursor. */ + init(): void; + /** The parsed character at the current cursor position. */ + peek(): number; + /** Advance the cursor by one parsed character. */ + advance(): void; + /** Get a span from the marked start point to the current point. */ + getSpan(start?: this): ParseSourceSpan; + /** Get the parsed characters from the marked start point to the current point. */ + getChars(start: this): string; + /** The number of characters left before the end of the cursor. */ + charsLeft(): number; + /** The number of characters between `this` cursor and `other` cursor. */ + diff(other: this): number; + /** Make a copy of this cursor */ + clone(): CharacterCursor; +} + +interface CursorState { + peek: number; + offset: number; + line: number; + column: number; +} + +class PlainCharacterCursor implements CharacterCursor { + protected state: CursorState; + protected file: ParseSourceFile; + protected input: string; + protected end: number; + + constructor(fileOrCursor: PlainCharacterCursor); + constructor(fileOrCursor: ParseSourceFile, range: LexerRange); + constructor(fileOrCursor: ParseSourceFile|PlainCharacterCursor, range?: LexerRange) { + if (fileOrCursor instanceof PlainCharacterCursor) { + this.file = fileOrCursor.file; + this.input = fileOrCursor.input; + this.end = fileOrCursor.end; + this.state = {...fileOrCursor.state}; + } else { + if (!range) { + throw new Error( + 'Programming error: the range argument must be provided with a file argument.'); + } + this.file = fileOrCursor; + this.input = fileOrCursor.content; + this.end = range.endPos; + this.state = { + peek: -1, + offset: range.startPos, + line: range.startLine, + column: range.startCol, + }; + } + } + + clone(): PlainCharacterCursor { return new PlainCharacterCursor(this); } + + peek() { return this.state.peek; } + charsLeft() { return this.end - this.state.offset; } + diff(other: this) { return this.state.offset - other.state.offset; } + + advance(): void { this.advanceState(this.state); } + + init(): void { this.updatePeek(this.state); } + + getSpan(start?: this): ParseSourceSpan { + start = start || this; + return new ParseSourceSpan( + new ParseLocation(start.file, start.state.offset, start.state.line, start.state.column), + new ParseLocation(this.file, this.state.offset, this.state.line, this.state.column)); + } + + getChars(start: this): string { + return this.input.substring(start.state.offset, this.state.offset); + } + + charAt(pos: number): number { return this.input.charCodeAt(pos); } + + protected advanceState(state: CursorState) { + if (state.offset >= this.end) { + this.state = state; + throw new CursorError('Unexpected character "EOF"', this); + } + const currentChar = this.charAt(state.offset); + if (currentChar === chars.$LF) { + state.line++; + state.column = 0; + } else if (!chars.isNewLine(currentChar)) { + state.column++; + } + state.offset++; + this.updatePeek(state); + } + + protected updatePeek(state: CursorState): void { + state.peek = state.offset >= this.end ? chars.$EOF : this.charAt(state.offset); + } +} + +class EscapedCharacterCursor extends PlainCharacterCursor { + protected internalState: CursorState; + + constructor(fileOrCursor: EscapedCharacterCursor); + constructor(fileOrCursor: ParseSourceFile, range: LexerRange); + constructor(fileOrCursor: ParseSourceFile|EscapedCharacterCursor, range?: LexerRange) { + if (fileOrCursor instanceof EscapedCharacterCursor) { + super(fileOrCursor); + this.internalState = {...fileOrCursor.internalState}; + } else { + super(fileOrCursor, range !); + this.internalState = this.state; + } + } + + advance(): void { + this.state = this.internalState; + super.advance(); + this.processEscapeSequence(); + } + + init(): void { + super.init(); + this.processEscapeSequence(); + } + + clone(): EscapedCharacterCursor { return new EscapedCharacterCursor(this); } + + getChars(start: this): string { + const cursor = start.clone(); + let chars = ''; + while (cursor.internalState.offset < this.internalState.offset) { + chars += String.fromCodePoint(cursor.peek()); + cursor.advance(); + } + return chars; + } + + /** + * Process the escape sequence that starts at the current position in the text. + * + * This method is called to ensure that `peek` has the unescaped value of escape sequences. + */ + protected processEscapeSequence(): void { + const peek = () => this.internalState.peek; + + if (peek() === chars.$BACKSLASH) { + // We have hit an escape sequence so we need the internal state to become independent + // of the external state. + this.internalState = {...this.state}; + + // Move past the backslash + this.advanceState(this.internalState); + + // First check for standard control char sequences + if (peek() === chars.$n) { + this.state.peek = chars.$LF; + } else if (peek() === chars.$r) { + this.state.peek = chars.$CR; + } else if (peek() === chars.$v) { + this.state.peek = chars.$VTAB; + } else if (peek() === chars.$t) { + this.state.peek = chars.$TAB; + } else if (peek() === chars.$b) { + this.state.peek = chars.$BSPACE; + } else if (peek() === chars.$f) { + this.state.peek = chars.$FF; + } + + // Now consider more complex sequences + else if (peek() === chars.$u) { + // Unicode code-point sequence + this.advanceState(this.internalState); // advance past the `u` char + if (peek() === chars.$LBRACE) { + // Variable length Unicode, e.g. `\x{123}` + this.advanceState(this.internalState); // advance past the `{` char + // Advance past the variable number of hex digits until we hit a `}` char + const digitStart = this.clone(); + let length = 0; + while (peek() !== chars.$RBRACE) { + this.advanceState(this.internalState); + length++; + } + this.state.peek = this.decodeHexDigits(digitStart, length); + } else { + // Fixed length Unicode, e.g. `\u1234` + const digitStart = this.clone(); + this.advanceState(this.internalState); + this.advanceState(this.internalState); + this.advanceState(this.internalState); + this.state.peek = this.decodeHexDigits(digitStart, 4); + } + } + + else if (peek() === chars.$x) { + // Hex char code, e.g. `\x2F` + this.advanceState(this.internalState); // advance past the `x` char + const digitStart = this.clone(); + this.advanceState(this.internalState); + this.state.peek = this.decodeHexDigits(digitStart, 2); + } + + else if (chars.isOctalDigit(peek())) { + // Octal char code, e.g. `\012`, + let octal = ''; + let length = 0; + let previous = this.clone(); + while (chars.isOctalDigit(peek()) && length < 3) { + previous = this.clone(); + octal += String.fromCodePoint(peek()); + this.advanceState(this.internalState); + length++; + } + this.state.peek = parseInt(octal, 8); + // Backup one char + this.internalState = previous.internalState; + } + + else if (chars.isNewLine(this.internalState.peek)) { + // Line continuation `\` followed by a new line + this.advanceState(this.internalState); // advance over the newline + this.state = this.internalState; + } + + else { + // If none of the `if` blocks were executed then we just have an escaped normal character. + // In that case we just, effectively, skip the backslash from the character. + this.state.peek = this.internalState.peek; + } + } + } + + protected decodeHexDigits(start: EscapedCharacterCursor, length: number): number { + const hex = this.input.substr(start.internalState.offset, length); + const charCode = parseInt(hex, 16); + if (!isNaN(charCode)) { + return charCode; + } else { + start.state = start.internalState; + throw new CursorError('Invalid hexadecimal escape sequence', start); + } + } +} + +export class CursorError { + constructor(public msg: string, public cursor: CharacterCursor) {} +} diff --git a/packages/compiler/test/ml_parser/lexer_spec.ts b/packages/compiler/test/ml_parser/lexer_spec.ts index 7f527d4e65..897ff19654 100644 --- a/packages/compiler/test/ml_parser/lexer_spec.ts +++ b/packages/compiler/test/ml_parser/lexer_spec.ts @@ -456,7 +456,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u lex.TokenType.TEXT, 'Unknown entity "tbo" - use the "&#;" or "&#x;" syntax', '0:0' ]]); - expect(tokenizeAndHumanizeErrors('&#asdf;')).toEqual([ + expect(tokenizeAndHumanizeErrors('sdf;')).toEqual([ [lex.TokenType.TEXT, 'Unexpected character "s"', '0:3'] ]); expect(tokenizeAndHumanizeErrors(' sdf;')).toEqual([ @@ -891,7 +891,6 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u .toEqual([ [lex.TokenType.TEXT, '\' \" \` \\ \n \n \v \t \b \f'], [lex.TokenType.EOF], - ]); }); @@ -1033,6 +1032,68 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u ]); }); + it('should parse over escaped new line in tag definitions', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [lex.TokenType.TAG_OPEN_START, '', 't'], + [lex.TokenType.TAG_OPEN_END], + [lex.TokenType.TAG_CLOSE, '', 't'], + [lex.TokenType.EOF], + ]); + }); + + it('should parse over escaped characters in tag definitions', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [lex.TokenType.TAG_OPEN_START, '', 't'], + [lex.TokenType.TAG_OPEN_END], + [lex.TokenType.TAG_CLOSE, '', 't'], + [lex.TokenType.EOF], + ]); + }); + + it('should unescape characters in tag names', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [lex.TokenType.TAG_OPEN_START, '', 'td'], + [lex.TokenType.TAG_OPEN_END], + [lex.TokenType.TAG_CLOSE, '', 'td'], + [lex.TokenType.EOF], + ]); + expect(tokenizeAndHumanizeSourceSpans(text, {escapedString: true})).toEqual([ + [lex.TokenType.TAG_OPEN_START, ''], + [lex.TokenType.TAG_CLOSE, ''], + [lex.TokenType.EOF, ''], + ]); + }); + + it('should unescape characters in attributes', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [lex.TokenType.TAG_OPEN_START, '', 't'], + [lex.TokenType.ATTR_NAME, '', 'd'], + [lex.TokenType.ATTR_QUOTE, '"'], + [lex.TokenType.ATTR_VALUE, 'e'], + [lex.TokenType.ATTR_QUOTE, '"'], + [lex.TokenType.TAG_OPEN_END], + [lex.TokenType.TAG_CLOSE, '', 't'], + [lex.TokenType.EOF], + ]); + }); + + it('should parse over escaped new line in attribute values', () => { + const text = ''; + expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ + [lex.TokenType.TAG_OPEN_START, '', 't'], + [lex.TokenType.ATTR_NAME, '', 'a'], + [lex.TokenType.ATTR_VALUE, 'b'], + [lex.TokenType.TAG_OPEN_END], + [lex.TokenType.TAG_CLOSE, '', 't'], + [lex.TokenType.EOF], + ]); + }); + it('should tokenize the correct span when there are escape sequences', () => { const text = 'selector: "app-root",\ntemplate: "line 1\\n\\"line 2\\"\\nline 3",\ninputs: []'; @@ -1057,7 +1118,6 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u 'line 2\\n' + // <- escaped line break 'line 3\\\n' + // <- line continuation ''; - expect(tokenizeAndHumanizeParts(text, {escapedString: true})).toEqual([ [lex.TokenType.TAG_OPEN_START, '', 't'], [lex.TokenType.TAG_OPEN_END], [lex.TokenType.TEXT, 'line 1'], [lex.TokenType.TAG_CLOSE, '', 't'], @@ -1084,7 +1144,7 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [lex.TokenType.TAG_OPEN_END, '1:2'], [lex.TokenType.TEXT, '1:3'], [lex.TokenType.TAG_CLOSE, '1:9'], - [lex.TokenType.TEXT, '1:14'], // <- escaped newline does not increment the row + [lex.TokenType.TEXT, '1:13'], // <- escaped newline does not increment the row [lex.TokenType.TAG_OPEN_START, '1:15'], [lex.TokenType.TAG_OPEN_END, '1:17'], @@ -1099,8 +1159,8 @@ import {ParseLocation, ParseSourceFile, ParseSourceSpan} from '../../src/parse_u [lex.TokenType.TEXT, '\n'], [lex.TokenType.TAG_OPEN_START, ''], - [lex.TokenType.TEXT, 'line 2'], [lex.TokenType.TAG_CLOSE, '\\'], - [lex.TokenType.TEXT, 'n'], + [lex.TokenType.TEXT, 'line 2'], [lex.TokenType.TAG_CLOSE, ''], + [lex.TokenType.TEXT, '\\n'], [lex.TokenType.TAG_OPEN_START, ''], [lex.TokenType.TEXT, 'line 3\\\n'], [lex.TokenType.TAG_CLOSE, ''], From cb20b3b40a76bdebed375ce7fffadc723bc0de63 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Wed, 27 Feb 2019 08:31:59 +0000 Subject: [PATCH 0164/1073] docs(compiler): correct lexer argument descriptions (#28978) PR Close #28978 --- packages/compiler/src/ml_parser/lexer.ts | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/compiler/src/ml_parser/lexer.ts b/packages/compiler/src/ml_parser/lexer.ts index ef798bb3aa..57d12756d7 100644 --- a/packages/compiler/src/ml_parser/lexer.ts +++ b/packages/compiler/src/ml_parser/lexer.ts @@ -132,10 +132,9 @@ class _Tokenizer { errors: TokenError[] = []; /** - * @param _file The html source - * @param _getTagDefinition - * @param _tokenizeIcu Whether to tokenize ICU messages (considered as text nodes when false) - * @param _interpolationConfig + * @param _file The html source file being tokenized. + * @param _getTagDefinition A function that will retrieve a tag definition for a given tag name. + * @param options Configuration of the tokenization. */ constructor( _file: ParseSourceFile, private _getTagDefinition: (tagName: string) => TagDefinition, From 3a6e443e198157d9c002157d3498569fb1e37026 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Sun, 17 Feb 2019 15:10:32 +0200 Subject: [PATCH 0165/1073] build: update VSCode settings to limit auto-formatting on save to JS/TS files (#28784) Previously, auto-formatting on save was enabled for all file types, which meant also using default VSCode formatting settings for files where this was not desirable - for example HTML files (such as angular.io and docs examples templates) and JSON files (such as Firebase configurations). This was problematic for the following reasons: - Unlike with JS/TS files, the formatting of other file types is not checked/enforced on CI. - Formatting is subject to default VSCode settings and everyone's local VSCode settings overrides. - Especially for docs examples files, changing the layout might require updating the wording in corresponding guides (e.g. when referring to line-numbers). If we decide that we do want to lint those other file types as well (which sounds like a good idea), we should do it in a way that ensures consistent formatting and check the formatting on CI. PR Close #28784 --- .vscode/settings.json | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 0fa0d13829..b51f0348c6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,10 @@ { - "editor.formatOnSave": true, + "[javascript]": { + "editor.formatOnSave": true, + }, + "[typescript]": { + "editor.formatOnSave": true, + }, // Please install http://clang.llvm.org/docs/ClangFormat.html in VSCode to take advantage of clang-format "clang-format.executable": "${workspaceRoot}/node_modules/.bin/clang-format", "files.watcherExclude": { @@ -16,4 +21,4 @@ "**/dist": true, }, "git.ignoreLimitWarning": true, -} \ No newline at end of file +} From 2b974d401262faec617de81bfdfbd47614b19004 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Sun, 17 Feb 2019 15:23:53 +0200 Subject: [PATCH 0166/1073] build: add VSCode extension recommendations (#28784) Previously, the VSCode settings for the workspace specified the `clang-format.executable` setting to configure auto-formatting to use `clang-format`. Yet, this setting has no effect without the extension that provides that configuration option namely [xaver.clang-format][1]). For people that didn't have the extension installed, VSCode would use the default formatters, resulting in vastly different file fomatting. This commit adds a set of [rcommended workspace extensions][2], to help people get the right extensions when checking out the repository. The recommended extensions are: - [gkalpak.aio-docs-utils][3]: Utilities to aid in authoring/viewing Angular documentation source code. Currently, mainly aid in working with `{@example}`/`` tags. - [ms-vscode.vscode-typescript-tslint-plugin][4]: Add auto-linting for TS files using `tslint` while editing. - [xaver.clang-format][1]: Add auto-formatting for JS/TS files using `clang-format`. [1]: https://marketplace.visualstudio.com/items?itemName=xaver.clang-format [2]: http://go.microsoft.com/fwlink/?LinkId=827846 [3]: https://marketplace.visualstudio.com/items?itemName=gkalpak.aio-docs-utils [4]: https://marketplace.visualstudio.com/items?itemName=ms-vscode.vscode-typescript-tslint-plugin PR Close #28784 --- .vscode/extensions.json | 11 +++++++++++ .vscode/settings.json | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000000..eba8ef7fde --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,11 @@ +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. + // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp + + // List of extensions which should be recommended for users of this workspace. + "recommendations": [ + "gkalpak.aio-docs-utils", + "ms-vscode.vscode-typescript-tslint-plugin", + "xaver.clang-format", + ], +} diff --git a/.vscode/settings.json b/.vscode/settings.json index b51f0348c6..aa218980f7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -5,7 +5,8 @@ "[typescript]": { "editor.formatOnSave": true, }, - // Please install http://clang.llvm.org/docs/ClangFormat.html in VSCode to take advantage of clang-format + // Please install https://marketplace.visualstudio.com/items?itemName=xaver.clang-format to take advantage of `clang-format` in VSCode. + // (See https://clang.llvm.org/docs/ClangFormat.html for more info `clang-format`.) "clang-format.executable": "${workspaceRoot}/node_modules/.bin/clang-format", "files.watcherExclude": { "**/.git/objects/**": true, From 03d2e5cb1d28fc612c459e6c820e78f6320168e1 Mon Sep 17 00:00:00 2001 From: Rado Kirov Date: Fri, 22 Feb 2019 14:30:10 -0800 Subject: [PATCH 0167/1073] refactor: Consistently use index access on index signature types. (#28937) This change helps highlight certain misoptimizations with Closure compiler. It is also stylistically preferable to consistently use index access on index sig types. Roughly, when one sees '.foo' they know it is always checked for typos in the prop name by the type system (unless 'any'), while "['foo']" is always not. Once all angular repos are conforming this will become a tsetse.info check, enforced by bazel. PR Close #28937 --- .../src/render/css_keyframes/css_keyframes_driver.ts | 2 +- .../src/transformers/inline_resources.ts | 4 ++-- packages/compiler/src/aot/static_symbol_resolver.ts | 12 ++++++------ packages/compiler/src/aot/summary_serializer.ts | 2 +- packages/core/src/compiler/compiler_facade.ts | 2 +- .../src/render3/styling/class_and_style_bindings.ts | 2 +- packages/forms/src/form_builder.ts | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/animations/browser/src/render/css_keyframes/css_keyframes_driver.ts b/packages/animations/browser/src/render/css_keyframes/css_keyframes_driver.ts index 289308b6fd..c69ee499c9 100644 --- a/packages/animations/browser/src/render/css_keyframes/css_keyframes_driver.ts +++ b/packages/animations/browser/src/render/css_keyframes/css_keyframes_driver.ts @@ -45,7 +45,7 @@ export class CssKeyframesDriver implements AnimationDriver { let tab = ''; keyframes.forEach(kf => { tab = TAB_SPACE; - const offset = parseFloat(kf.offset); + const offset = parseFloat(kf['offset']); keyframeStr += `${tab}${offset * 100}% {\n`; tab += TAB_SPACE; Object.keys(kf).forEach(prop => { diff --git a/packages/compiler-cli/src/transformers/inline_resources.ts b/packages/compiler-cli/src/transformers/inline_resources.ts index cf2a4c401c..9ac282814c 100644 --- a/packages/compiler-cli/src/transformers/inline_resources.ts +++ b/packages/compiler-cli/src/transformers/inline_resources.ts @@ -65,7 +65,7 @@ export class InlineResourcesMetadataTransformer implements MetadataTransformer { updateDecoratorMetadata(loader: StaticResourceLoader, arg: MetadataObject): MetadataObject { if (arg['templateUrl']) { arg['template'] = loader.get(arg['templateUrl']); - delete arg.templateUrl; + delete arg['templateUrl']; } const styles = arg['styles'] || []; @@ -76,7 +76,7 @@ export class InlineResourcesMetadataTransformer implements MetadataTransformer { styles.push(...styleUrls.map(styleUrl => loader.get(styleUrl))); if (styles.length > 0) { arg['styles'] = styles; - delete arg.styleUrls; + delete arg['styleUrls']; } return arg; diff --git a/packages/compiler/src/aot/static_symbol_resolver.ts b/packages/compiler/src/aot/static_symbol_resolver.ts index 8a3b72ce18..959f973a33 100644 --- a/packages/compiler/src/aot/static_symbol_resolver.ts +++ b/packages/compiler/src/aot/static_symbol_resolver.ts @@ -420,18 +420,18 @@ export class StaticSymbolResolver { if (!filePath) { return { __symbolic: 'error', - message: - `Could not resolve ${module} relative to ${self.host.getMetadataFor(sourceSymbol.filePath)}.`, - line: map.line, - character: map.character, + message: `Could not resolve ${module} relative to ${ + self.host.getMetadataFor(sourceSymbol.filePath)}.`, + line: map['line'], + character: map['character'], fileName: getOriginalName() }; } return { __symbolic: 'resolved', symbol: self.getStaticSymbol(filePath, name), - line: map.line, - character: map.character, + line: map['line'], + character: map['character'], fileName: getOriginalName() }; } else if (functionParams.indexOf(name) >= 0) { diff --git a/packages/compiler/src/aot/summary_serializer.ts b/packages/compiler/src/aot/summary_serializer.ts index f8981565a9..fbc7941491 100644 --- a/packages/compiler/src/aot/summary_serializer.ts +++ b/packages/compiler/src/aot/summary_serializer.ts @@ -249,7 +249,7 @@ class ToJsonSerializer extends ValueTransformer { */ visitStringMap(map: {[key: string]: any}, context: any): any { if (map['__symbolic'] === 'resolved') { - return visitValue(map.symbol, this, context); + return visitValue(map['symbol'], this, context); } if (map['__symbolic'] === 'error') { delete map['line']; diff --git a/packages/core/src/compiler/compiler_facade.ts b/packages/core/src/compiler/compiler_facade.ts index 1515cf50e1..b8aeb53e81 100644 --- a/packages/core/src/compiler/compiler_facade.ts +++ b/packages/core/src/compiler/compiler_facade.ts @@ -10,7 +10,7 @@ import {CompilerFacade, ExportedCompilerFacade} from './compiler_facade_interfac export * from './compiler_facade_interface'; export function getCompilerFacade(): CompilerFacade { - const globalNg: ExportedCompilerFacade = global.ng; + const globalNg: ExportedCompilerFacade = global['ng']; if (!globalNg || !globalNg.ɵcompilerFacade) { throw new Error( `Angular JIT compilation failed: '@angular/compiler' not loaded!\n` + diff --git a/packages/core/src/render3/styling/class_and_style_bindings.ts b/packages/core/src/render3/styling/class_and_style_bindings.ts index 85d47fa232..d8f43405d0 100644 --- a/packages/core/src/render3/styling/class_and_style_bindings.ts +++ b/packages/core/src/render3/styling/class_and_style_bindings.ts @@ -568,7 +568,7 @@ export function updateStylingMap( const classesValue = classesPlayerBuilder ? (classesInput as BoundPlayerFactory<{[key: string]: any}|string>) !.value : classesInput; - const stylesValue = stylesPlayerBuilder ? stylesInput !.value : stylesInput; + const stylesValue = stylesPlayerBuilder ? stylesInput !['value'] : stylesInput; let classNames: string[] = EMPTY_ARRAY; let applyAllClasses = false; diff --git a/packages/forms/src/form_builder.ts b/packages/forms/src/form_builder.ts index 1d672c20ab..3b21ad0316 100644 --- a/packages/forms/src/form_builder.ts +++ b/packages/forms/src/form_builder.ts @@ -70,8 +70,8 @@ export class FormBuilder { updateOn = options.updateOn != null ? options.updateOn : undefined; } else { // `options` are legacy form group options - validators = options.validator != null ? options.validator : null; - asyncValidators = options.asyncValidator != null ? options.asyncValidator : null; + validators = options['validator'] != null ? options['validator'] : null; + asyncValidators = options['asyncValidator'] != null ? options['asyncValidator'] : null; } } From 5fdf24e84372600ff5e33882b9c3c4ab070b31f0 Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Wed, 27 Feb 2019 15:51:56 -0800 Subject: [PATCH 0168/1073] fix(bazel): add favicon to web package (#29017) This would fix the RESOURCE_NOT_FOUND error. PR Close #29017 --- .../bazel-workspace/files/src/BUILD.bazel.template | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template b/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template index c4e9bb8862..c9fc7845d6 100644 --- a/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template +++ b/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template @@ -53,7 +53,7 @@ web_package( ":bundle.min.js", ], data = [ - ":bundle", + "favicon.ico", ], index_html = "index.html", ) @@ -89,6 +89,9 @@ ts_devserver( static_files = [ "@npm//node_modules/zone.js:dist/zone.min.js", ], + data = [ + "favicon.ico", + ], index_html = "index.html", deps = [":src"], ) From d207c4894a76c6bcd5a8902c89abe537ccbcbe74 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Thu, 28 Feb 2019 17:23:54 +0200 Subject: [PATCH 0169/1073] ci: speed up `publish_artifacts` CircleCI job for PRs (#29028) PR Close #29028 --- .circleci/config.yml | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9796a2648e..7c4681d963 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -461,18 +461,20 @@ jobs: publish_snapshot: <<: *job_defaults steps: - - *attach_workspace - - *init_environment # 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, `|| true` on the end makes this step always exit 0 - command: '[[ - "$CI_PULL_REQUEST" != "false" - || "$CI_REPO_OWNER" != "angular" - || "$CI_REPO_NAME" != "angular" - ]] && circleci step halt || true' + # 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 + - *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 From 587424749437a3f6103bf58b8a7f1c5e2e96271a Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 26 Feb 2019 20:15:52 +0100 Subject: [PATCH 0170/1073] build(docs-infra): examples should not run ngcc for all formats (#28984) Currently when adding the example boilerplate to all examples with Ivy enabled, we run Ngcc and transform all found formats. This potentially slows down the build and is not necessary as we only need the "fesm5" and "fesm2015" bundles. PR Close #28984 --- aio/tools/examples/example-boilerplate.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/aio/tools/examples/example-boilerplate.js b/aio/tools/examples/example-boilerplate.js index 6268181bc6..612243857b 100644 --- a/aio/tools/examples/example-boilerplate.js +++ b/aio/tools/examples/example-boilerplate.js @@ -104,7 +104,12 @@ class ExampleBoilerPlate { } if (ivy) { - shelljs.exec(`yarn --cwd ${SHARED_PATH} ivy-ngcc`); + // We only need the "fesm5" bundles as the CLI webpack build does not need + // any other formats for building and serving. Ngcc currently only updates + // the module typings if we specified an "es2015" format. This means that + // we also need to build with "fesm2015" in order to get updated typings + // which are needed for compilation. + shelljs.exec(`yarn --cwd ${SHARED_PATH} ivy-ngcc --formats fesm2015 fesm5`); } exampleFolders.forEach(exampleFolder => { From 2e43e15e12aed3cb6825b532de52846aae40df53 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 26 Feb 2019 20:17:25 +0100 Subject: [PATCH 0171/1073] ci: "test_docs_examples_ivy" should attach ivy package output (#28984) Currently the "test_docs_examples_ivy" job attaches the legacy package output, while we can also attach the Ivy NPM package output. We don't need Ngcc to downlevel the Angular packages in order to run the docs examples with Ivy. PR Close #28984 --- .circleci/config.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7c4681d963..6874de04fd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -346,6 +346,12 @@ jobs: - *init_environment # Install aio - run: yarn --cwd aio install --frozen-lockfile --non-interactive + # Rename the Ivy packages dist folder to "dist/packages-dist" as the AIO + # package installer picks up the locally built packages from that location. + # *Note*: We could also adjust the packages installer, but given we won't have + # two different folders of Angular distributions in the future, we should keep + # the packages installer unchanged. + - run: mv dist/packages-dist-ivy-aot dist/packages-dist # Run examples tests with ivy. The "CIRCLE_NODE_INDEX" will be set if "parallelism" is enabled. # Since the parallelism is set to "3", there will be three parallel CircleCI containers # with either "0", "1" or "2" as node index. This can be passed to the "--shard" argument. @@ -596,7 +602,7 @@ workflows: - build-npm-packages - test_docs_examples_ivy: requires: - - build-npm-packages + - build-ivy-npm-packages - aio_preview: requires: - setup From 58198075f2734ee9ddb3e5296d91f753fd1a046a Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 26 Feb 2019 20:24:04 +0100 Subject: [PATCH 0172/1073] ci: increase parallelism for "test_docs_examples" jobs (#28984) Currently the docs example tests (`test_docs_examples_ivy` and `test_docs_examples`) are the culprits for a slow-down in our overall CI turnaround. We need to increase parallelism in order to make our CI turnaround more _acceptable_. This is temporary and the long-term goal is to move these tests to Bazel with remote build execution. References #28940 PR Close #28984 --- .circleci/config.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6874de04fd..df4f727eda 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -324,7 +324,7 @@ jobs: docker: # Needed because the example e2e tests depend on Chrome. - image: *browsers_docker_image - parallelism: 3 + parallelism: 4 steps: - *attach_workspace - *init_environment @@ -340,7 +340,10 @@ jobs: docker: # Needed because the example e2e tests depend on Chrome. - image: *browsers_docker_image - parallelism: 3 + # We increase the parallelism here to five while the "test_docs_examples" job runs with + # a parallelism of four. This is necessary because this job also need to run NGCC which + # takes up more time and we don't want these jobs to impact the overall CI turnaround. + parallelism: 5 steps: - *attach_workspace - *init_environment From 1d4dde2adcf036229cdf7ec1f7a4f2b47dc92d77 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Wed, 27 Feb 2019 19:57:28 +0100 Subject: [PATCH 0173/1073] ci(docs-infra): disable failing ivy jit systemjs examples (#28984) As a side effect of 09b34bae8655d4251516655c317b150c46cd3653, we fixed that the docs systemjs examples currently do not run with Ivy in JIT mode. This now uncovered new failures with the JIT resource loading. e.g. ``` zone.js:665 Unhandled Promise rejection: Component 'PhoneListComponent' is not resolved: - templateUrl: ./phone-list.template.html Did you run and wait for 'resolveComponentResources()'? ; Zone: ; Task: Promise.then ; Value: Error: Component 'PhoneListComponent' is not resolved: - templateUrl: ./phone-list.template.html Did you run and wait for 'resolveComponentResources()'? at Function.get (directive.ts:54) at getComponentDef (definition.ts:648) at verifyDeclarationsHaveDefinitions (module.ts:185) at Array.forEach () at verifySemanticsOfNgModuleDef (module.ts:159) at Function.get (module.ts:132) at getInjectorDef (defs.ts:181) at R3Injector.processInjectorType (r3_injector.ts:230) at eval (r3_injector.ts:114) at eval (r3_injector.ts:451) Error: Component 'PhoneListComponent' is not resolved: ``` We temporarily disable these two failing SystemJS examples by adding them to the `fixmeIvyExamples` list. PR Close #28984 --- aio/tools/examples/run-example-e2e.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/aio/tools/examples/run-example-e2e.js b/aio/tools/examples/run-example-e2e.js index 27bba29d50..9245168b2f 100644 --- a/aio/tools/examples/run-example-e2e.js +++ b/aio/tools/examples/run-example-e2e.js @@ -22,7 +22,11 @@ const IGNORED_EXAMPLES = [ const fixmeIvyExamples = [ // fixmeIvy('unknown') app fails at runtime due to missing external service (goog is undefined) - 'i18n' + 'i18n', + // fixmeIvy('unknown') JIT app fails with external resources not loaded. + 'upgrade-phonecat-2-hybrid', + // fixmeIvy('unknown') JIT app fails with external resources not loaded. + 'upgrade-phonecat-3-final', ]; if (argv.ivy) { From cd83a4346294dc5921dd4c14f7915bdb68c32dca Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Thu, 28 Feb 2019 10:28:53 -0800 Subject: [PATCH 0174/1073] build(bazel): revert back to non-vendored yarn in node_repositories() (#29034) Resolves Windows issue https://github.com/bazelbuild/rules_nodejs/issues/588 PR Close #29034 --- WORKSPACE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index bc2dcc6ca9..d551c641dd 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -51,7 +51,7 @@ node_repositories( node_version = "10.9.0", package_json = ["//:package.json"], preserve_symlinks = True, - vendored_yarn = "@angular//third_party/github.com/yarnpkg/yarn/releases/download:v1.13.0", + yarn_version = "1.12.1", ) # Setup the angular toolchain which installs npm dependencies into @ngdeps From ea09430039fe3a40dceac86ac8001286bb0ea584 Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Wed, 20 Feb 2019 09:54:42 -0800 Subject: [PATCH 0175/1073] build: rules_nodejs 0.26.0 & use @npm instead of @ngdeps now that downstream angular build uses angular bundles (#28871) PR Close #28871 --- BUILD.bazel | 46 +++++--------- WORKSPACE | 50 ++++++++++------ index.bzl | 28 --------- integration/bazel/WORKSPACE | 14 +---- integration/bazel/src/BUILD.bazel | 2 +- integration/bazel/src/hello-world/BUILD.bazel | 4 +- integration/bazel/src/package.json | 2 +- integration/bazel/test/e2e/BUILD.bazel | 2 +- karma-js.conf.js | 2 +- modules/benchmarks/benchmark_test.bzl | 4 +- modules/benchmarks/src/largeform/BUILD.bazel | 4 +- .../benchmarks/src/largeform/ng2/BUILD.bazel | 8 +-- modules/benchmarks/src/largetable/BUILD.bazel | 2 +- .../src/largetable/baseline/BUILD.bazel | 2 +- .../largetable/incremental_dom/BUILD.bazel | 4 +- .../benchmarks/src/largetable/ng2/BUILD.bazel | 8 +-- .../src/largetable/ng2_switch/BUILD.bazel | 8 +-- .../src/largetable/render3/BUILD.bazel | 6 +- modules/benchmarks/src/tree/BUILD.bazel | 6 +- .../benchmarks/src/tree/baseline/BUILD.bazel | 2 +- .../src/tree/incremental_dom/BUILD.bazel | 6 +- modules/benchmarks/src/tree/iv/BUILD.bazel | 2 +- modules/benchmarks/src/tree/ng1/BUILD.bazel | 4 +- modules/benchmarks/src/tree/ng2/BUILD.bazel | 8 +-- .../benchmarks/src/tree/ng2_next/BUILD.bazel | 4 +- .../src/tree/ng2_static/BUILD.bazel | 8 +-- .../src/tree/ng2_switch/BUILD.bazel | 8 +-- .../benchmarks/src/tree/render3/BUILD.bazel | 6 +- .../src/tree/render3_function/BUILD.bazel | 4 +- modules/e2e_util/BUILD.bazel | 12 ++-- modules/playground/e2e_test/example_test.bzl | 14 ++--- modules/playground/src/animate/BUILD.bazel | 8 +-- modules/playground/src/async/BUILD.bazel | 8 +-- modules/playground/src/benchpress/BUILD.bazel | 2 +- modules/playground/src/gestures/BUILD.bazel | 12 ++-- .../playground/src/hello_world/BUILD.bazel | 8 +-- modules/playground/src/http/BUILD.bazel | 10 ++-- modules/playground/src/jsonp/BUILD.bazel | 8 +-- modules/playground/src/key_events/BUILD.bazel | 8 +-- .../src/model_driven_forms/BUILD.bazel | 8 +-- .../src/order_management/BUILD.bazel | 8 +-- .../src/person_management/BUILD.bazel | 8 +-- .../src/relative_assets/BUILD.bazel | 10 ++-- modules/playground/src/routing/BUILD.bazel | 14 ++--- modules/playground/src/routing/index.html | 6 +- modules/playground/src/sourcemap/BUILD.bazel | 8 +-- modules/playground/src/svg/BUILD.bazel | 8 +-- .../src/template_driven_forms/BUILD.bazel | 8 +-- modules/playground/src/todo/BUILD.bazel | 8 +-- modules/playground/src/upgrade/BUILD.bazel | 10 ++-- .../playground/src/web_workers/BUILD.bazel | 6 +- .../src/web_workers/animations/BUILD.bazel | 10 ++-- .../src/web_workers/images/BUILD.bazel | 20 +++---- .../src/web_workers/images/loader.js | 2 +- .../src/web_workers/input/BUILD.bazel | 10 ++-- .../src/web_workers/kitchen_sink/BUILD.bazel | 10 ++-- .../web_workers/message_broker/BUILD.bazel | 10 ++-- .../src/web_workers/router/BUILD.bazel | 12 ++-- .../src/web_workers/todo/BUILD.bazel | 10 ++-- .../src/web_workers/worker-configure.js | 8 +-- .../src/zippy_component/BUILD.bazel | 8 +-- modules/playground/systemjs-config.js | 4 +- package.json | 7 ++- packages/BUILD.bazel | 6 +- packages/bazel/BUILD.bazel | 2 - packages/bazel/docs/BUILD.bazel | 1 - packages/bazel/index.bzl | 9 ++- packages/bazel/package.json | 2 +- packages/bazel/src/BUILD.bazel | 12 ++-- packages/bazel/src/api-extractor/BUILD.bazel | 10 ++-- packages/bazel/src/builders/BUILD.bazel | 8 +-- packages/bazel/src/external.bzl | 2 +- packages/bazel/src/ng_package/BUILD.bazel | 10 ++-- packages/bazel/src/ng_rollup_bundle.bzl | 2 +- packages/bazel/src/ng_setup_workspace.bzl | 13 ---- packages/bazel/src/ngc-wrapped/BUILD.bazel | 18 +++--- .../bazel/src/protractor/utils/BUILD.bazel | 6 +- .../schematics/bazel-workspace/BUILD.bazel | 8 +-- .../bazel-workspace/files/WORKSPACE.template | 4 +- .../files/e2e/BUILD.bazel.template | 2 +- .../files/src/BUILD.bazel.template | 4 +- .../src/schematics/bazel-workspace/index.ts | 4 +- .../bazel/src/schematics/ng-add/BUILD.bazel | 10 ++-- packages/bazel/src/schematics/ng-add/index.ts | 2 +- .../bazel/src/schematics/ng-new/BUILD.bazel | 6 +- .../bazel/src/schematics/utility/BUILD.bazel | 12 ++-- packages/bazel/test/ng_package/BUILD.bazel | 16 ++--- .../bazel/test/ng_package/example/BUILD.bazel | 2 +- .../ng_package/example/secondary/BUILD.bazel | 2 +- packages/bazel/test/ngc-wrapped/BUILD.bazel | 2 +- .../bazel/test/ngc-wrapped/empty/BUILD.bazel | 2 +- .../test/ngc-wrapped/tsconfig_template.ts | 2 +- packages/bazel/test/protractor-2/BUILD.bazel | 10 ++-- .../bazel/test/protractor-utils/BUILD.bazel | 2 +- packages/bazel/test/protractor/BUILD.bazel | 8 +-- packages/benchpress/BUILD.bazel | 4 +- packages/benchpress/test/BUILD.bazel | 4 +- packages/common/BUILD.bazel | 2 +- packages/common/http/BUILD.bazel | 2 +- packages/common/http/test/BUILD.bazel | 2 +- packages/common/http/testing/BUILD.bazel | 2 +- packages/common/http/testing/test/BUILD.bazel | 2 +- packages/common/testing/BUILD.bazel | 2 +- packages/compiler-cli/BUILD.bazel | 10 ++-- .../compiler-cli/integrationtest/BUILD.bazel | 34 +++++------ .../bazel/injectable_def/app/BUILD.bazel | 4 +- .../bazel/injectable_def/lib1/BUILD.bazel | 2 +- .../bazel/injectable_def/lib2/BUILD.bazel | 2 +- .../injector_def/ivy_build/app/BUILD.bazel | 2 +- .../bazel/ng_module/BUILD.bazel | 4 +- packages/compiler-cli/integrationtest/test.js | 2 +- .../integrationtest/test_helpers.js | 20 +++---- packages/compiler-cli/src/ngcc/BUILD.bazel | 20 +++---- .../compiler-cli/src/ngcc/test/BUILD.bazel | 14 ++--- .../src/ngtsc/annotations/BUILD.bazel | 4 +- .../src/ngtsc/annotations/test/BUILD.bazel | 2 +- .../compiler-cli/src/ngtsc/cycles/BUILD.bazel | 2 +- .../src/ngtsc/cycles/test/BUILD.bazel | 2 +- .../src/ngtsc/diagnostics/BUILD.bazel | 2 +- .../src/ngtsc/entry_point/BUILD.bazel | 4 +- .../src/ngtsc/entry_point/test/BUILD.bazel | 2 +- .../src/ngtsc/imports/BUILD.bazel | 4 +- .../src/ngtsc/partial_evaluator/BUILD.bazel | 4 +- .../ngtsc/partial_evaluator/test/BUILD.bazel | 2 +- .../compiler-cli/src/ngtsc/path/BUILD.bazel | 4 +- .../src/ngtsc/reflection/BUILD.bazel | 2 +- .../src/ngtsc/reflection/test/BUILD.bazel | 2 +- .../src/ngtsc/routing/BUILD.bazel | 4 +- .../compiler-cli/src/ngtsc/scope/BUILD.bazel | 2 +- .../src/ngtsc/scope/test/BUILD.bazel | 2 +- .../compiler-cli/src/ngtsc/shims/BUILD.bazel | 4 +- .../compiler-cli/src/ngtsc/switch/BUILD.bazel | 2 +- .../src/ngtsc/testing/BUILD.bazel | 2 +- .../src/ngtsc/transform/BUILD.bazel | 2 +- .../src/ngtsc/translator/BUILD.bazel | 2 +- .../src/ngtsc/typecheck/BUILD.bazel | 2 +- .../src/ngtsc/typecheck/test/BUILD.bazel | 2 +- .../compiler-cli/src/ngtsc/util/BUILD.bazel | 4 +- .../src/ngtsc/util/test/BUILD.bazel | 2 +- packages/compiler-cli/test/BUILD.bazel | 18 +++--- .../compiler-cli/test/compliance/BUILD.bazel | 2 +- .../compiler-cli/test/diagnostics/BUILD.bazel | 8 +-- .../compiler-cli/test/metadata/BUILD.bazel | 2 +- packages/compiler-cli/test/ngcc/BUILD.bazel | 12 ++-- packages/compiler-cli/test/ngtsc/BUILD.bazel | 8 +-- packages/compiler-cli/test/test_support.ts | 2 +- .../test/transformers/BUILD.bazel | 4 +- packages/compiler/test/BUILD.bazel | 8 +-- packages/compiler/testing/BUILD.bazel | 2 +- packages/core/BUILD.bazel | 4 +- packages/core/src/di/interface/BUILD.bazel | 2 +- packages/core/src/util/BUILD.bazel | 2 +- packages/core/test/BUILD.bazel | 10 ++-- packages/core/test/acceptance/BUILD.bazel | 8 +-- .../test/bundling/animation_world/BUILD.bazel | 2 +- .../test/bundling/cyclic_import/BUILD.bazel | 2 +- .../test/bundling/hello_world/BUILD.bazel | 2 +- .../bundling/hello_world_i18n/BUILD.bazel | 2 +- .../test/bundling/hello_world_r2/BUILD.bazel | 2 +- .../core/test/bundling/injection/BUILD.bazel | 2 +- packages/core/test/bundling/todo/BUILD.bazel | 6 +- .../core/test/bundling/todo_i18n/BUILD.bazel | 6 +- .../core/test/bundling/todo_r2/BUILD.bazel | 6 +- packages/core/test/bundling/util/BUILD.bazel | 2 +- packages/core/test/render3/BUILD.bazel | 6 +- packages/core/testing/BUILD.bazel | 4 +- packages/elements/BUILD.bazel | 2 +- .../elements/schematics/ng-add/BUILD.bazel | 10 ++-- packages/elements/test/BUILD.bazel | 10 ++-- packages/examples/common/BUILD.bazel | 18 +++--- packages/examples/core/BUILD.bazel | 18 +++--- packages/examples/core/testing/ts/BUILD.bazel | 4 +- packages/examples/forms/BUILD.bazel | 16 ++--- packages/examples/test-utils/BUILD.bazel | 2 +- packages/examples/testing/BUILD.bazel | 4 +- packages/examples/upgrade/upgrade_example.bzl | 20 +++---- packages/forms/BUILD.bazel | 2 +- packages/forms/test/BUILD.bazel | 2 +- packages/http/BUILD.bazel | 2 +- packages/http/test/BUILD.bazel | 2 +- packages/http/testing/BUILD.bazel | 2 +- packages/language-service/BUILD.bazel | 4 +- packages/language-service/bundles/BUILD.bazel | 4 +- packages/language-service/test/BUILD.bazel | 2 +- packages/platform-browser/BUILD.bazel | 4 +- .../animations/test/BUILD.bazel | 2 +- packages/platform-browser/test/BUILD.bazel | 2 +- packages/platform-browser/testing/BUILD.bazel | 4 +- packages/platform-server/BUILD.bazel | 6 +- packages/platform-server/test/BUILD.bazel | 2 +- packages/platform-webworker/BUILD.bazel | 2 +- packages/router/BUILD.bazel | 2 +- packages/router/test/BUILD.bazel | 2 +- .../test/aot_ngsummary_test/BUILD.bazel | 2 +- packages/router/testing/BUILD.bazel | 2 +- packages/service-worker/BUILD.bazel | 2 +- packages/service-worker/cli/BUILD.bazel | 2 +- packages/service-worker/test/BUILD.bazel | 2 +- packages/service-worker/testing/BUILD.bazel | 2 +- packages/service-worker/worker/BUILD.bazel | 2 +- .../service-worker/worker/testing/BUILD.bazel | 2 +- packages/upgrade/BUILD.bazel | 2 +- packages/upgrade/test/BUILD.bazel | 2 +- packages/upgrade/test/common/test_helpers.ts | 2 +- tools/BUILD.bazel | 2 +- tools/defaults.bzl | 60 ++++++++----------- tools/ng_setup_workspace.bzl | 46 -------------- tools/npm/@angular_bazel/index.js | 1 + tools/npm/@angular_bazel/package.json | 6 ++ .../npm_workspace/@angular/bazel/BUILD.bazel | 8 --- .../@bazel/typescript/BUILD.bazel | 8 --- .../@bazel/typescript/bin/BUILD.bazel | 7 --- tools/npm_workspace/BUILD.bazel | 1 - tools/npm_workspace/WORKSPACE | 1 - tools/rxjs/BUILD.bazel | 2 +- tools/symbol-extractor/BUILD.bazel | 4 +- tools/symbol-extractor/index.bzl | 2 +- tools/testing/BUILD.bazel | 2 +- tools/ts-api-guardian/BUILD.bazel | 2 +- yarn.lock | 27 +++++---- 220 files changed, 660 insertions(+), 781 deletions(-) delete mode 100644 index.bzl delete mode 100644 packages/bazel/src/ng_setup_workspace.bzl delete mode 100644 tools/ng_setup_workspace.bzl create mode 100755 tools/npm/@angular_bazel/index.js create mode 100644 tools/npm/@angular_bazel/package.json delete mode 100644 tools/npm_workspace/@angular/bazel/BUILD.bazel delete mode 100644 tools/npm_workspace/@bazel/typescript/BUILD.bazel delete mode 100644 tools/npm_workspace/@bazel/typescript/bin/BUILD.bazel delete mode 100644 tools/npm_workspace/BUILD.bazel delete mode 100644 tools/npm_workspace/WORKSPACE diff --git a/BUILD.bazel b/BUILD.bazel index 021a333ee9..09ebe562dd 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -16,15 +16,15 @@ filegroup( name = "web_test_bootstrap_scripts", # do not sort srcs = [ - "@ngdeps//node_modules/core-js:client/core.js", - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/zone.js:dist/zone-testing.js", - "@ngdeps//node_modules/zone.js:dist/task-tracking.js", + "@npm//node_modules/core-js:client/core.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/zone-testing.js", + "@npm//node_modules/zone.js:dist/task-tracking.js", "//:test-events.js", "//:shims_for_IE.js", # Including systemjs because it defines `__eval`, which produces correct stack traces. - "@ngdeps//node_modules/systemjs:dist/system.src.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/systemjs:dist/system.src.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], ) @@ -33,34 +33,18 @@ filegroup( srcs = [ # 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) - "@ngdeps//node_modules/angular:angular.js", - "@ngdeps//node_modules/angular:angular.min.js", - "@ngdeps//node_modules/angular-1.5:angular.js", - "@ngdeps//node_modules/angular-1.5:angular.min.js", - "@ngdeps//node_modules/angular-1.6:angular.js", - "@ngdeps//node_modules/angular-1.6:angular.min.js", - "@ngdeps//node_modules/angular-mocks:angular-mocks.js", - "@ngdeps//node_modules/angular-mocks-1.5:angular-mocks.js", - "@ngdeps//node_modules/angular-mocks-1.6:angular-mocks.js", + "@npm//node_modules/angular:angular.js", + "@npm//node_modules/angular:angular.min.js", + "@npm//node_modules/angular-1.5:angular.js", + "@npm//node_modules/angular-1.5:angular.min.js", + "@npm//node_modules/angular-1.6:angular.js", + "@npm//node_modules/angular-1.6:angular.min.js", + "@npm//node_modules/angular-mocks:angular-mocks.js", + "@npm//node_modules/angular-mocks-1.5:angular-mocks.js", + "@npm//node_modules/angular-mocks-1.6:angular-mocks.js", ], ) -# A nodejs_binary for @angular/bazel/ngc-wrapped to use by default in -# ng_module that depends on @npm//@angular/bazel instead of the -# output of the //packages/bazel/src/ngc-wrapped ts_library rule. This -# default is for downstream users that depend on the @angular/bazel npm -# package. The generated @npm//@angular/bazel/ngc-wrapped target -# does not work because it does not have the node `--expose-gc` flag -# set which is required to support the call to `global.gc()`. -nodejs_binary( - name = "@angular/bazel/ngc-wrapped", - configuration_env_vars = ["compile"], - data = ["@npm//@angular/bazel"], - entry_point = "@angular/bazel/src/ngc-wrapped/index.js", - install_source_map_support = False, - templated_args = ["--node_options=--expose-gc"], -) - # To run a karma_web_test target locally on SauceLabs: # 1) have SAUCE_USERNAME, SAUCE_ACCESS_KEY (and optionally a SAUCE_TUNNEL_IDENTIFIER) set in your environment # 2) open a sauce connection with `./scripts/saucelabs/start-tunnel.sh` diff --git a/WORKSPACE b/WORKSPACE index d551c641dd..2743d71434 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,22 +15,13 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") # Fetch rules_nodejs so we can install our npm dependencies http_archive( name = "build_bazel_rules_nodejs", - sha256 = "86ea92217dfd4a84e1e335cc07dfd942b12899796b080492546b947f12c5ab77", - urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.26.0-beta.0/rules_nodejs-0.26.0-beta.0.tar.gz"], -) - -# Use a mock @npm repository while we are building angular from source -# downstream. Angular will get its npm dependencies with in @ngdeps which -# is setup in ng_setup_workspace(). -# TODO(gregmagolan): remove @ngdeps once angular is no longer build from source -# downstream and have build use @npm for npm dependencies -local_repository( - name = "npm", - path = "tools/npm_workspace", + sha256 = "5c86b055c57e15bf32d9009a15bcd6d8e190c41b1ff2fb18037b75e0012e4e7c", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.26.0/rules_nodejs-0.26.0.tar.gz"], ) # Check the bazel version and download npm dependencies -load("@build_bazel_rules_nodejs//:defs.bzl", "check_bazel_version", "node_repositories") +load("@build_bazel_rules_nodejs//:defs.bzl", "check_bazel_version", "node_repositories", "yarn_install") +load("@build_bazel_rules_nodejs//:package.bzl", "check_rules_nodejs_version") # Bazel version must be at least v0.21.0 because: # - 0.21.0 Using --incompatible_strict_action_env flag fixes cache when running `yarn bazel` @@ -46,6 +37,12 @@ Try running `yarn bazel` instead. minimum_bazel_version = "0.21.0", ) +# The NodeJS rules version must be at least v0.15.3 because: +# - 0.15.2 Re-introduced the prod_only attribute on yarn_install +# - 0.15.3 Includes a fix for the `jasmine_node_test` rule ignoring target tags +# - 0.16.8 Supports npm installed bazel workspaces +check_rules_nodejs_version("0.16.8") + # Setup the Node.js toolchain node_repositories( node_version = "10.9.0", @@ -54,13 +51,28 @@ node_repositories( yarn_version = "1.12.1", ) -# Setup the angular toolchain which installs npm dependencies into @ngdeps -load("//tools:ng_setup_workspace.bzl", "ng_setup_workspace") +yarn_install( + name = "npm", + data = [ + "//:tools/npm/@angular_bazel/index.js", + "//:tools/npm/@angular_bazel/package.json", + "//:tools/postinstall-patches.js", + "//:tools/yarn/check-yarn.js", + ], + package_json = "//:package.json", + # Don't install devDependencies, they are large and not used under Bazel + prod_only = True, + yarn_lock = "//:yarn.lock", +) -ng_setup_workspace() +yarn_install( + name = "ts-api-guardian_deps", + package_json = "@angular//tools/ts-api-guardian:package.json", + yarn_lock = "@angular//tools/ts-api-guardian:yarn.lock", +) -# Install all bazel dependencies of the @ngdeps npm packages -load("@ngdeps//:install_bazel_dependencies.bzl", "install_bazel_dependencies") +# Install all bazel dependencies of the @npm npm packages +load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies") install_bazel_dependencies() @@ -86,7 +98,7 @@ load("@npm_bazel_karma//:browser_repositories.bzl", "browser_repositories") browser_repositories() # Setup the rules_typescript tooolchain -load("@npm_bazel_typescript//:defs.bzl", "ts_setup_workspace") +load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace") ts_setup_workspace() diff --git a/index.bzl b/index.bzl deleted file mode 100644 index f5d5e80371..0000000000 --- a/index.bzl +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright Google Inc. All Rights Reserved. -# -# Use of this source code is governed by an MIT-style license that can be -# found in the LICENSE file at https://angular.io/license -""" Public API surface is re-exported here. - -This API is exported for users building angular from source in downstream -projects. The rules from packages/bazel are re-exported here as well -as the ng_setup_workspace repository rule needed when building angular -from source downstream. Alternately, this API is available from the -@angular/bazel npm package if the npm distribution of angular is -used in a downstream project. -""" - -load( - "//packages/bazel:index.bzl", - _ng_module = "ng_module", - _ng_package = "ng_package", - _protractor_web_test = "protractor_web_test", - _protractor_web_test_suite = "protractor_web_test_suite", -) -load("//tools:ng_setup_workspace.bzl", _ng_setup_workspace = "ng_setup_workspace") - -ng_module = _ng_module -ng_package = _ng_package -protractor_web_test = _protractor_web_test -protractor_web_test_suite = _protractor_web_test_suite -ng_setup_workspace = _ng_setup_workspace diff --git a/integration/bazel/WORKSPACE b/integration/bazel/WORKSPACE index 86c1470cac..f718d38b04 100644 --- a/integration/bazel/WORKSPACE +++ b/integration/bazel/WORKSPACE @@ -5,8 +5,8 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") # Fetch rules_nodejs so we can install our npm dependencies http_archive( name = "build_bazel_rules_nodejs", - sha256 = "86ea92217dfd4a84e1e335cc07dfd942b12899796b080492546b947f12c5ab77", - urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.26.0-beta.0/rules_nodejs-0.26.0-beta.0.tar.gz"], + sha256 = "5c86b055c57e15bf32d9009a15bcd6d8e190c41b1ff2fb18037b75e0012e4e7c", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.26.0/rules_nodejs-0.26.0.tar.gz"], ) # Fetch sass rules for compiling sass files @@ -73,7 +73,7 @@ load("@npm_bazel_karma//:browser_repositories.bzl", "browser_repositories") browser_repositories() # Setup the rules_typescript tooolchain -load("@npm_bazel_typescript//:defs.bzl", "ts_setup_workspace") +load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace") ts_setup_workspace() @@ -81,11 +81,3 @@ ts_setup_workspace() load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories") sass_repositories() - -# Setup the angular toolchain. This integration test no longer builds Angular from source, -# but we still need to set up the "angular" workspace since some Bazel rules depend on -# the "ngdeps" repository. This can be fixed if we switched the Angular repository to the -# "npm" repository for the bazel managed dependencies. -load("@npm_angular_bazel//:index.bzl", "ng_setup_workspace") - -ng_setup_workspace() diff --git a/integration/bazel/src/BUILD.bazel b/integration/bazel/src/BUILD.bazel index e04abde8c5..db57258012 100644 --- a/integration/bazel/src/BUILD.bazel +++ b/integration/bazel/src/BUILD.bazel @@ -3,7 +3,7 @@ package(default_visibility = ["//visibility:public"]) load("@npm_angular_bazel//:index.bzl", "ng_module") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server", "rollup_bundle") load("@build_bazel_rules_nodejs//internal/web_package:web_package.bzl", "web_package") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") # Allow targets under sub-packages to reference the tsconfig.json file exports_files(["tsconfig.json"]) diff --git a/integration/bazel/src/hello-world/BUILD.bazel b/integration/bazel/src/hello-world/BUILD.bazel index e081522371..768cff8e41 100644 --- a/integration/bazel/src/hello-world/BUILD.bazel +++ b/integration/bazel/src/hello-world/BUILD.bazel @@ -1,7 +1,7 @@ package(default_visibility = ["//visibility:public"]) -load("@npm_bazel_karma//:defs.bzl", "ts_web_test_suite") -load("@npm_bazel_typescript//:defs.bzl", "ts_library") +load("@npm_bazel_karma//:index.bzl", "ts_web_test_suite") +load("@npm_bazel_typescript//:index.bzl", "ts_library") load("@io_bazel_rules_sass//sass:sass.bzl", "sass_binary") load("@npm_angular_bazel//:index.bzl", "ng_module", "ng_package") diff --git a/integration/bazel/src/package.json b/integration/bazel/src/package.json index acbb72877e..9dac26fb15 100644 --- a/integration/bazel/src/package.json +++ b/integration/bazel/src/package.json @@ -18,7 +18,7 @@ "@angular/bazel": "packages-dist:bazel", "@angular/compiler": "packages-dist:compiler", "@angular/compiler-cli": "packages-dist:compiler-cli", - "@bazel/karma": "0.26.0-beta.0", + "@bazel/karma": "0.26.0", "@types/jasmine": "2.8.8", "@types/source-map": "0.5.1", "protractor": "5.1.2", diff --git a/integration/bazel/test/e2e/BUILD.bazel b/integration/bazel/test/e2e/BUILD.bazel index d41619f827..45f82c4af1 100644 --- a/integration/bazel/test/e2e/BUILD.bazel +++ b/integration/bazel/test/e2e/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm_bazel_typescript//:defs.bzl", "ts_library") +load("@npm_bazel_typescript//:index.bzl", "ts_library") load("@npm_angular_bazel//:index.bzl", "protractor_web_test_suite") ts_library( diff --git a/karma-js.conf.js b/karma-js.conf.js index 4d07a2f369..3381ec2b52 100644 --- a/karma-js.conf.js +++ b/karma-js.conf.js @@ -111,7 +111,7 @@ module.exports = function(config) { // don't need this entire config file. proxies: { '/base/angular/': '/base/', - '/base/ngdeps/': '/base/', + '/base/npm/': '/base/', }, reporters: ['dots'], diff --git a/modules/benchmarks/benchmark_test.bzl b/modules/benchmarks/benchmark_test.bzl index 2f068d8f2a..0948985cdc 100644 --- a/modules/benchmarks/benchmark_test.bzl +++ b/modules/benchmarks/benchmark_test.bzl @@ -18,7 +18,7 @@ def benchmark_test(name, server, deps, tags = []): server = server, tags = tags, deps = [ - "@ngdeps//protractor", - "@ngdeps//yargs", + "@npm//protractor", + "@npm//yargs", ] + deps, ) diff --git a/modules/benchmarks/src/largeform/BUILD.bazel b/modules/benchmarks/src/largeform/BUILD.bazel index 0bfbe75e36..37cf09c97d 100644 --- a/modules/benchmarks/src/largeform/BUILD.bazel +++ b/modules/benchmarks/src/largeform/BUILD.bazel @@ -9,7 +9,7 @@ ts_library( tsconfig = "//modules/benchmarks:tsconfig-e2e.json", deps = [ "//modules/e2e_util", - "@ngdeps//@types/jasminewd2", - "@ngdeps//protractor", + "@npm//@types/jasminewd2", + "@npm//protractor", ], ) diff --git a/modules/benchmarks/src/largeform/ng2/BUILD.bazel b/modules/benchmarks/src/largeform/ng2/BUILD.bazel index f1558418fa..289b6d54b5 100644 --- a/modules/benchmarks/src/largeform/ng2/BUILD.bazel +++ b/modules/benchmarks/src/largeform/ng2/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -29,12 +29,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], tags = ["fixme-ivy-aot"], deps = [":ng2"], diff --git a/modules/benchmarks/src/largetable/BUILD.bazel b/modules/benchmarks/src/largetable/BUILD.bazel index 3b2888efd0..cc00b3f5b8 100644 --- a/modules/benchmarks/src/largetable/BUILD.bazel +++ b/modules/benchmarks/src/largetable/BUILD.bazel @@ -14,6 +14,6 @@ ts_library( srcs = ["largetable_perf.spec.ts"], deps = [ "//modules/e2e_util", - "@ngdeps//protractor", + "@npm//protractor", ], ) diff --git a/modules/benchmarks/src/largetable/baseline/BUILD.bazel b/modules/benchmarks/src/largetable/baseline/BUILD.bazel index 55519ed578..8fda5883d9 100644 --- a/modules/benchmarks/src/largetable/baseline/BUILD.bazel +++ b/modules/benchmarks/src/largetable/baseline/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) diff --git a/modules/benchmarks/src/largetable/incremental_dom/BUILD.bazel b/modules/benchmarks/src/largetable/incremental_dom/BUILD.bazel index 429b80b64e..f3459d5b44 100644 --- a/modules/benchmarks/src/largetable/incremental_dom/BUILD.bazel +++ b/modules/benchmarks/src/largetable/incremental_dom/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -20,7 +20,7 @@ ts_devserver( index_html = "index.html", port = 4200, static_files = [ - "@ngdeps//node_modules/incremental-dom:dist/incremental-dom.js", + "@npm//node_modules/incremental-dom:dist/incremental-dom.js", ], deps = [":incremental_dom"], ) diff --git a/modules/benchmarks/src/largetable/ng2/BUILD.bazel b/modules/benchmarks/src/largetable/ng2/BUILD.bazel index 15b9c0ad66..bcebc73065 100644 --- a/modules/benchmarks/src/largetable/ng2/BUILD.bazel +++ b/modules/benchmarks/src/largetable/ng2/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -28,12 +28,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":ng2"], ) diff --git a/modules/benchmarks/src/largetable/ng2_switch/BUILD.bazel b/modules/benchmarks/src/largetable/ng2_switch/BUILD.bazel index b96d1444c2..07039cd3fd 100644 --- a/modules/benchmarks/src/largetable/ng2_switch/BUILD.bazel +++ b/modules/benchmarks/src/largetable/ng2_switch/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -25,12 +25,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":ng2_switch"], ) diff --git a/modules/benchmarks/src/largetable/render3/BUILD.bazel b/modules/benchmarks/src/largetable/render3/BUILD.bazel index a4ae3675cb..45fabba43a 100644 --- a/modules/benchmarks/src/largetable/render3/BUILD.bazel +++ b/modules/benchmarks/src/largetable/render3/BUILD.bazel @@ -1,7 +1,7 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") ng_module( @@ -14,7 +14,7 @@ ng_module( "//packages:types", "//packages/common", "//packages/core", - "@ngdeps//reflect-metadata", + "@npm//reflect-metadata", ], ) @@ -24,7 +24,7 @@ ng_rollup_bundle( tags = ["ivy-only"], deps = [ ":largetable_lib", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/modules/benchmarks/src/tree/BUILD.bazel b/modules/benchmarks/src/tree/BUILD.bazel index 1941513d5c..3a7c4d5f01 100644 --- a/modules/benchmarks/src/tree/BUILD.bazel +++ b/modules/benchmarks/src/tree/BUILD.bazel @@ -14,7 +14,7 @@ ts_library( srcs = ["tree_perf_test_utils.ts"], deps = [ "//modules/e2e_util", - "@ngdeps//protractor", + "@npm//protractor", ], ) @@ -24,7 +24,7 @@ ts_library( srcs = ["tree_perf.spec.ts"], deps = [ ":test_utils_lib", - "@ngdeps//protractor", + "@npm//protractor", ], ) @@ -34,6 +34,6 @@ ts_library( srcs = ["tree_perf_detect_changes.spec.ts"], deps = [ ":test_utils_lib", - "@ngdeps//protractor", + "@npm//protractor", ], ) diff --git a/modules/benchmarks/src/tree/baseline/BUILD.bazel b/modules/benchmarks/src/tree/baseline/BUILD.bazel index 6712588295..328724542e 100644 --- a/modules/benchmarks/src/tree/baseline/BUILD.bazel +++ b/modules/benchmarks/src/tree/baseline/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) diff --git a/modules/benchmarks/src/tree/incremental_dom/BUILD.bazel b/modules/benchmarks/src/tree/incremental_dom/BUILD.bazel index d0a5c5d47b..67ed3eb167 100644 --- a/modules/benchmarks/src/tree/incremental_dom/BUILD.bazel +++ b/modules/benchmarks/src/tree/incremental_dom/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -11,7 +11,7 @@ ts_library( deps = [ "//modules/benchmarks/src:util_lib", "//modules/benchmarks/src/tree:util_lib", - "@ngdeps//@types/node", + "@npm//@types/node", ], ) @@ -21,7 +21,7 @@ ts_devserver( index_html = "index.html", port = 4200, static_files = [ - "@ngdeps//node_modules/incremental-dom:dist/incremental-dom.js", + "@npm//node_modules/incremental-dom:dist/incremental-dom.js", ], deps = [":incremental_dom"], ) diff --git a/modules/benchmarks/src/tree/iv/BUILD.bazel b/modules/benchmarks/src/tree/iv/BUILD.bazel index 7585cfc884..9452166c28 100644 --- a/modules/benchmarks/src/tree/iv/BUILD.bazel +++ b/modules/benchmarks/src/tree/iv/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) diff --git a/modules/benchmarks/src/tree/ng1/BUILD.bazel b/modules/benchmarks/src/tree/ng1/BUILD.bazel index d1dc388f6d..6caac7ab98 100644 --- a/modules/benchmarks/src/tree/ng1/BUILD.bazel +++ b/modules/benchmarks/src/tree/ng1/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -20,7 +20,7 @@ ts_devserver( index_html = "index.html", port = 4200, static_files = [ - "@ngdeps//node_modules/angular:angular.js", + "@npm//node_modules/angular:angular.js", ], deps = [":ng1"], ) diff --git a/modules/benchmarks/src/tree/ng2/BUILD.bazel b/modules/benchmarks/src/tree/ng2/BUILD.bazel index e7d0059f99..290f02465e 100644 --- a/modules/benchmarks/src/tree/ng2/BUILD.bazel +++ b/modules/benchmarks/src/tree/ng2/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -28,12 +28,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":ng2"], ) diff --git a/modules/benchmarks/src/tree/ng2_next/BUILD.bazel b/modules/benchmarks/src/tree/ng2_next/BUILD.bazel index 8136fb9361..628fd51a64 100644 --- a/modules/benchmarks/src/tree/ng2_next/BUILD.bazel +++ b/modules/benchmarks/src/tree/ng2_next/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -23,7 +23,7 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], deps = [":ng2_next"], diff --git a/modules/benchmarks/src/tree/ng2_static/BUILD.bazel b/modules/benchmarks/src/tree/ng2_static/BUILD.bazel index 7cc98422d2..9fdb2c364d 100644 --- a/modules/benchmarks/src/tree/ng2_static/BUILD.bazel +++ b/modules/benchmarks/src/tree/ng2_static/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -23,12 +23,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":ng2_static"], ) diff --git a/modules/benchmarks/src/tree/ng2_switch/BUILD.bazel b/modules/benchmarks/src/tree/ng2_switch/BUILD.bazel index 03f31005a0..8c1d09fe20 100644 --- a/modules/benchmarks/src/tree/ng2_switch/BUILD.bazel +++ b/modules/benchmarks/src/tree/ng2_switch/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") package(default_visibility = ["//modules/benchmarks:__subpackages__"]) @@ -25,12 +25,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":ng2_switch"], ) diff --git a/modules/benchmarks/src/tree/render3/BUILD.bazel b/modules/benchmarks/src/tree/render3/BUILD.bazel index 705018b0eb..b44eeeaa49 100644 --- a/modules/benchmarks/src/tree/render3/BUILD.bazel +++ b/modules/benchmarks/src/tree/render3/BUILD.bazel @@ -1,7 +1,7 @@ package(default_visibility = ["//modules/benchmarks:__subpackages__"]) load("//tools:defaults.bzl", "ng_module", "ng_rollup_bundle") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") ng_module( @@ -13,7 +13,7 @@ ng_module( "//packages:types", "//packages/common", "//packages/core", - "@ngdeps//reflect-metadata", + "@npm//reflect-metadata", ], ) @@ -23,7 +23,7 @@ ng_rollup_bundle( tags = ["ivy-only"], deps = [ ":tree_lib", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/modules/benchmarks/src/tree/render3_function/BUILD.bazel b/modules/benchmarks/src/tree/render3_function/BUILD.bazel index 2d7a924ebb..d4225ec2e4 100644 --- a/modules/benchmarks/src/tree/render3_function/BUILD.bazel +++ b/modules/benchmarks/src/tree/render3_function/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("//tools:defaults.bzl", "ts_library") load("//modules/benchmarks:benchmark_test.bzl", "benchmark_test") @@ -21,7 +21,7 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], deps = [":render3_function_lib"], diff --git a/modules/e2e_util/BUILD.bazel b/modules/e2e_util/BUILD.bazel index 3dc9b959c9..0fa699b43b 100644 --- a/modules/e2e_util/BUILD.bazel +++ b/modules/e2e_util/BUILD.bazel @@ -9,11 +9,11 @@ ts_library( deps = [ "//packages:types", "//packages/benchpress", - "@ngdeps//@types/fs-extra", - "@ngdeps//@types/selenium-webdriver", - "@ngdeps//fs-extra", - "@ngdeps//node-uuid", - "@ngdeps//protractor", - "@ngdeps//selenium-webdriver", + "@npm//@types/fs-extra", + "@npm//@types/selenium-webdriver", + "@npm//fs-extra", + "@npm//node-uuid", + "@npm//protractor", + "@npm//selenium-webdriver", ], ) diff --git a/modules/playground/e2e_test/example_test.bzl b/modules/playground/e2e_test/example_test.bzl index b9f1b018e0..70eaa43388 100644 --- a/modules/playground/e2e_test/example_test.bzl +++ b/modules/playground/e2e_test/example_test.bzl @@ -10,9 +10,9 @@ def example_test(name, srcs, server, data = [], **kwargs): deps = [ "//modules/e2e_util", "//packages/private/testing", - "@ngdeps//@types/jasminewd2", - "@ngdeps//@types/selenium-webdriver", - "@ngdeps//protractor", + "@npm//@types/jasminewd2", + "@npm//@types/selenium-webdriver", + "@npm//protractor", ], ) @@ -23,10 +23,10 @@ def example_test(name, srcs, server, data = [], **kwargs): server = server, deps = [ ":%s_lib" % name, - "@ngdeps//protractor", - "@ngdeps//selenium-webdriver", - "@ngdeps//yargs", - "@ngdeps//source-map", + "@npm//protractor", + "@npm//selenium-webdriver", + "@npm//yargs", + "@npm//source-map", ], **kwargs ) diff --git a/modules/playground/src/animate/BUILD.bazel b/modules/playground/src/animate/BUILD.bazel index 49855b059f..48ac5c29bb 100644 --- a/modules/playground/src/animate/BUILD.bazel +++ b/modules/playground/src/animate/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -23,10 +23,10 @@ ts_devserver( entry_module = "angular/modules/playground/src/animate/index", index_html = "index.html", port = 4200, - scripts = ["@ngdeps//node_modules/tslib:tslib.js"], + scripts = ["@npm//node_modules/tslib:tslib.js"], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":animate"], ) diff --git a/modules/playground/src/async/BUILD.bazel b/modules/playground/src/async/BUILD.bazel index fe301f8268..4e1d13130d 100644 --- a/modules/playground/src/async/BUILD.bazel +++ b/modules/playground/src/async/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -22,12 +22,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":async"], ) diff --git a/modules/playground/src/benchpress/BUILD.bazel b/modules/playground/src/benchpress/BUILD.bazel index 8b4b173938..5c51cf1ce6 100644 --- a/modules/playground/src/benchpress/BUILD.bazel +++ b/modules/playground/src/benchpress/BUILD.bazel @@ -1,4 +1,4 @@ -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) diff --git a/modules/playground/src/gestures/BUILD.bazel b/modules/playground/src/gestures/BUILD.bazel index 1188d330d6..872534abf4 100644 --- a/modules/playground/src/gestures/BUILD.bazel +++ b/modules/playground/src/gestures/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -14,7 +14,7 @@ ng_module( "//packages/core", "//packages/platform-browser", "//packages/platform-browser-dynamic", - "@ngdeps//@types/hammerjs", + "@npm//@types/hammerjs", ], ) @@ -23,11 +23,11 @@ ts_devserver( entry_module = "angular/modules/playground/src/gestures/index", index_html = "index.html", port = 4200, - scripts = ["@ngdeps//node_modules/tslib:tslib.js"], + scripts = ["@npm//node_modules/tslib:tslib.js"], static_files = [ - "@ngdeps//node_modules/hammerjs:hammer.js", - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/hammerjs:hammer.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":gestures"], ) diff --git a/modules/playground/src/hello_world/BUILD.bazel b/modules/playground/src/hello_world/BUILD.bazel index d90d3efb57..0f802e1b3d 100644 --- a/modules/playground/src/hello_world/BUILD.bazel +++ b/modules/playground/src/hello_world/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -22,12 +22,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":hello_world"], ) diff --git a/modules/playground/src/http/BUILD.bazel b/modules/playground/src/http/BUILD.bazel index 6ba83ed650..1457d17c7f 100644 --- a/modules/playground/src/http/BUILD.bazel +++ b/modules/playground/src/http/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -14,7 +14,7 @@ ng_module( "//packages/http", "//packages/platform-browser", "//packages/platform-browser-dynamic", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -25,12 +25,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":http"], ) diff --git a/modules/playground/src/jsonp/BUILD.bazel b/modules/playground/src/jsonp/BUILD.bazel index 5bc0b47f24..ec9d0f059d 100644 --- a/modules/playground/src/jsonp/BUILD.bazel +++ b/modules/playground/src/jsonp/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -24,12 +24,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":jsonp"], ) diff --git a/modules/playground/src/key_events/BUILD.bazel b/modules/playground/src/key_events/BUILD.bazel index 1ce543a100..2cfec987fb 100644 --- a/modules/playground/src/key_events/BUILD.bazel +++ b/modules/playground/src/key_events/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -22,12 +22,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":key_events"], ) diff --git a/modules/playground/src/model_driven_forms/BUILD.bazel b/modules/playground/src/model_driven_forms/BUILD.bazel index 87af847a9b..271d04298b 100644 --- a/modules/playground/src/model_driven_forms/BUILD.bazel +++ b/modules/playground/src/model_driven_forms/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -23,12 +23,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":model_driven_forms"], ) diff --git a/modules/playground/src/order_management/BUILD.bazel b/modules/playground/src/order_management/BUILD.bazel index ef3c9781e4..c31b1fc06a 100644 --- a/modules/playground/src/order_management/BUILD.bazel +++ b/modules/playground/src/order_management/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -23,12 +23,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":order_management"], ) diff --git a/modules/playground/src/person_management/BUILD.bazel b/modules/playground/src/person_management/BUILD.bazel index d5a8a50c10..71c2c84c5e 100644 --- a/modules/playground/src/person_management/BUILD.bazel +++ b/modules/playground/src/person_management/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -23,12 +23,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":person_management"], ) diff --git a/modules/playground/src/relative_assets/BUILD.bazel b/modules/playground/src/relative_assets/BUILD.bazel index 64ac75e630..539c9a6363 100644 --- a/modules/playground/src/relative_assets/BUILD.bazel +++ b/modules/playground/src/relative_assets/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -17,7 +17,7 @@ ng_module( "//packages/platform-browser", "//packages/platform-browser-dynamic", # Needed because the example uses "module.id" in order to load assets relatively. - "@ngdeps//@types/node", + "@npm//@types/node", ], ) @@ -31,12 +31,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":relative_assets"], ) diff --git a/modules/playground/src/routing/BUILD.bazel b/modules/playground/src/routing/BUILD.bazel index 692c7f9309..ab431b9fbf 100644 --- a/modules/playground/src/routing/BUILD.bazel +++ b/modules/playground/src/routing/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -15,7 +15,7 @@ ng_module( "//packages/platform-browser", "//packages/platform-browser-dynamic", "//packages/router", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -26,15 +26,15 @@ ts_devserver( # there is only one RxJS UMD bundle that re-exports everything at the root. "//modules/playground:systemjs-rxjs-operators.js", "//third_party/fonts.google.com/open-sans", - "@ngdeps//node_modules/rxjs:bundles/rxjs.umd.js", - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", + "@npm//node_modules/tslib:tslib.js", ] + glob(["**/*.css"]), port = 4200, static_files = [ "index.html", - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", - "@ngdeps//node_modules/systemjs:dist/system.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/systemjs:dist/system.js", "//modules/playground:systemjs-config.js", "load-app.js", ], diff --git a/modules/playground/src/routing/index.html b/modules/playground/src/routing/index.html index 414edae61c..49e677877a 100644 --- a/modules/playground/src/routing/index.html +++ b/modules/playground/src/routing/index.html @@ -14,9 +14,9 @@ This is because we want to use SystemJS instead of RequireJS and want to support lazy loading of routes. Read more in the "load-app.js" file. --> - - - + + + diff --git a/modules/playground/src/sourcemap/BUILD.bazel b/modules/playground/src/sourcemap/BUILD.bazel index 2a672d201d..0860b5bb54 100644 --- a/modules/playground/src/sourcemap/BUILD.bazel +++ b/modules/playground/src/sourcemap/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -26,12 +26,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":sourcemap"], ) diff --git a/modules/playground/src/svg/BUILD.bazel b/modules/playground/src/svg/BUILD.bazel index 670a6a15a5..f2e06c727f 100644 --- a/modules/playground/src/svg/BUILD.bazel +++ b/modules/playground/src/svg/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -22,12 +22,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":svg"], ) diff --git a/modules/playground/src/template_driven_forms/BUILD.bazel b/modules/playground/src/template_driven_forms/BUILD.bazel index 3e7d25d50e..46b877a07a 100644 --- a/modules/playground/src/template_driven_forms/BUILD.bazel +++ b/modules/playground/src/template_driven_forms/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -23,12 +23,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":template_driven_forms"], ) diff --git a/modules/playground/src/todo/BUILD.bazel b/modules/playground/src/todo/BUILD.bazel index 8cafae5bd9..401d06405f 100644 --- a/modules/playground/src/todo/BUILD.bazel +++ b/modules/playground/src/todo/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -23,10 +23,10 @@ ts_devserver( entry_module = "angular/modules/playground/src/todo/index", index_html = "index.html", port = 4200, - scripts = ["@ngdeps//node_modules/tslib:tslib.js"], + scripts = ["@npm//node_modules/tslib:tslib.js"], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":todo"], ) diff --git a/modules/playground/src/upgrade/BUILD.bazel b/modules/playground/src/upgrade/BUILD.bazel index bbd0c31cc3..0bc6e6603d 100644 --- a/modules/playground/src/upgrade/BUILD.bazel +++ b/modules/playground/src/upgrade/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -22,13 +22,13 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", - "@ngdeps//node_modules/angular:angular.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/angular:angular.js", ], deps = [":upgrade"], ) diff --git a/modules/playground/src/web_workers/BUILD.bazel b/modules/playground/src/web_workers/BUILD.bazel index 03a0fd21d9..adce10e034 100644 --- a/modules/playground/src/web_workers/BUILD.bazel +++ b/modules/playground/src/web_workers/BUILD.bazel @@ -6,8 +6,8 @@ filegroup( data = [ "//modules/playground:systemjs-config.js", "//modules/playground:systemjs-rxjs-operators.js", - "@ngdeps//reflect-metadata", - "@ngdeps//systemjs", - "@ngdeps//zone.js", + "@npm//reflect-metadata", + "@npm//systemjs", + "@npm//zone.js", ], ) diff --git a/modules/playground/src/web_workers/animations/BUILD.bazel b/modules/playground/src/web_workers/animations/BUILD.bazel index f2cbd59c76..3e9a474b60 100644 --- a/modules/playground/src/web_workers/animations/BUILD.bazel +++ b/modules/playground/src/web_workers/animations/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -22,13 +22,13 @@ ts_devserver( data = [ "loader.js", "//modules/playground/src/web_workers:worker-config", - "@ngdeps//node_modules/rxjs:bundles/rxjs.umd.js", - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", + "@npm//node_modules/tslib:tslib.js", ], entry_module = "angular/modules/playground/src/web_workers/animations/index", index_html = "index.html", port = 4200, - scripts = ["@ngdeps//node_modules/tslib:tslib.js"], - static_files = ["@ngdeps//node_modules/zone.js:dist/zone.js"], + scripts = ["@npm//node_modules/tslib:tslib.js"], + static_files = ["@npm//node_modules/zone.js:dist/zone.js"], deps = [":animations"], ) diff --git a/modules/playground/src/web_workers/images/BUILD.bazel b/modules/playground/src/web_workers/images/BUILD.bazel index b794c2e24c..83347441da 100644 --- a/modules/playground/src/web_workers/images/BUILD.bazel +++ b/modules/playground/src/web_workers/images/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -14,7 +14,7 @@ ng_module( "//packages/core", "//packages/platform-webworker", "//packages/platform-webworker-dynamic", - "@ngdeps//@types/base64-js", + "@npm//@types/base64-js", ], ) @@ -24,20 +24,20 @@ ts_devserver( additional_root_paths = ["angular"], data = [ "//modules/playground/src/web_workers:worker-config", - "@ngdeps//node_modules/base64-js:base64js.min.js", - "@ngdeps//node_modules/rxjs:bundles/rxjs.umd.js", - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/base64-js:base64js.min.js", + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", + "@npm//node_modules/tslib:tslib.js", "loader.js", ] + glob(["**/*.css"]), entry_module = "angular/modules/playground/src/web_workers/images/index", index_html = "index.html", port = 4200, - scripts = ["@ngdeps//node_modules/tslib:tslib.js"], + scripts = ["@npm//node_modules/tslib:tslib.js"], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/materialize-css:dist/js/materialize.min.js", - "@ngdeps//node_modules/materialize-css:dist/css/materialize.min.css", - "@ngdeps//node_modules/jquery:dist/jquery.min.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/materialize-css:dist/js/materialize.min.js", + "@npm//node_modules/materialize-css:dist/css/materialize.min.css", + "@npm//node_modules/jquery:dist/jquery.min.js", "//third_party/github.com/google/material-design-icons", ], deps = [":images"], diff --git a/modules/playground/src/web_workers/images/loader.js b/modules/playground/src/web_workers/images/loader.js index 3612f5426f..c6ea58279a 100644 --- a/modules/playground/src/web_workers/images/loader.js +++ b/modules/playground/src/web_workers/images/loader.js @@ -10,7 +10,7 @@ importScripts('angular/modules/playground/src/web_workers/worker-configure.js'); System.config({ map: { - 'base64-js': 'ngdeps/node_modules/base64-js/base64js.min.js', + 'base64-js': 'npm/node_modules/base64-js/base64js.min.js', }, packages: {'angular/modules/playground/src/web_workers': {defaultExtension: 'js'}} }); diff --git a/modules/playground/src/web_workers/input/BUILD.bazel b/modules/playground/src/web_workers/input/BUILD.bazel index 20fdd641ca..484ecd337c 100644 --- a/modules/playground/src/web_workers/input/BUILD.bazel +++ b/modules/playground/src/web_workers/input/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -21,16 +21,16 @@ ts_devserver( data = [ "loader.js", "//modules/playground/src/web_workers:worker-config", - "@ngdeps//node_modules/rxjs:bundles/rxjs.umd.js", - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", + "@npm//node_modules/tslib:tslib.js", ], entry_module = "angular/modules/playground/src/web_workers/input/index", index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@ngdeps//node_modules/zone.js:dist/zone.js"], + static_files = ["@npm//node_modules/zone.js:dist/zone.js"], deps = [":input"], ) diff --git a/modules/playground/src/web_workers/kitchen_sink/BUILD.bazel b/modules/playground/src/web_workers/kitchen_sink/BUILD.bazel index dfc299b6cf..034e2cb206 100644 --- a/modules/playground/src/web_workers/kitchen_sink/BUILD.bazel +++ b/modules/playground/src/web_workers/kitchen_sink/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -21,16 +21,16 @@ ts_devserver( data = [ "loader.js", "//modules/playground/src/web_workers:worker-config", - "@ngdeps//node_modules/rxjs:bundles/rxjs.umd.js", - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", + "@npm//node_modules/tslib:tslib.js", ], entry_module = "angular/modules/playground/src/web_workers/kitchen_sink/index", index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@ngdeps//node_modules/zone.js:dist/zone.js"], + static_files = ["@npm//node_modules/zone.js:dist/zone.js"], deps = [":kitchen_sink"], ) diff --git a/modules/playground/src/web_workers/message_broker/BUILD.bazel b/modules/playground/src/web_workers/message_broker/BUILD.bazel index 8c032975ca..78354b7e4e 100644 --- a/modules/playground/src/web_workers/message_broker/BUILD.bazel +++ b/modules/playground/src/web_workers/message_broker/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -21,16 +21,16 @@ ts_devserver( data = [ "loader.js", "//modules/playground/src/web_workers:worker-config", - "@ngdeps//node_modules/rxjs:bundles/rxjs.umd.js", - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", + "@npm//node_modules/tslib:tslib.js", ], entry_module = "angular/modules/playground/src/web_workers/message_broker/index", index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@ngdeps//node_modules/zone.js:dist/zone.js"], + static_files = ["@npm//node_modules/zone.js:dist/zone.js"], deps = [":message_broker"], ) diff --git a/modules/playground/src/web_workers/router/BUILD.bazel b/modules/playground/src/web_workers/router/BUILD.bazel index 62bd1ed1c5..c1ad9fedf7 100644 --- a/modules/playground/src/web_workers/router/BUILD.bazel +++ b/modules/playground/src/web_workers/router/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -15,7 +15,7 @@ ng_module( "//packages/platform-webworker", "//packages/platform-webworker-dynamic", "//packages/router", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -24,16 +24,16 @@ ts_devserver( data = [ "loader.js", "//modules/playground/src/web_workers:worker-config", - "@ngdeps//node_modules/rxjs:bundles/rxjs.umd.js", - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", + "@npm//node_modules/tslib:tslib.js", ], entry_module = "angular/modules/playground/src/web_workers/router/index", index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@ngdeps//node_modules/zone.js:dist/zone.js"], + static_files = ["@npm//node_modules/zone.js:dist/zone.js"], deps = [":router"], ) diff --git a/modules/playground/src/web_workers/todo/BUILD.bazel b/modules/playground/src/web_workers/todo/BUILD.bazel index a6c873df0f..d8e2b35ebb 100644 --- a/modules/playground/src/web_workers/todo/BUILD.bazel +++ b/modules/playground/src/web_workers/todo/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -24,16 +24,16 @@ ts_devserver( "css/main.css", "loader.js", "//modules/playground/src/web_workers:worker-config", - "@ngdeps//node_modules/rxjs:bundles/rxjs.umd.js", - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", + "@npm//node_modules/tslib:tslib.js", ], entry_module = "angular/modules/playground/src/web_workers/todo/index", index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@ngdeps//node_modules/zone.js:dist/zone.js"], + static_files = ["@npm//node_modules/zone.js:dist/zone.js"], deps = [":todo"], ) diff --git a/modules/playground/src/web_workers/worker-configure.js b/modules/playground/src/web_workers/worker-configure.js index 96041039ec..0f7906b156 100644 --- a/modules/playground/src/web_workers/worker-configure.js +++ b/modules/playground/src/web_workers/worker-configure.js @@ -6,9 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -importScripts('ngdeps/node_modules/reflect-metadata/Reflect.js'); -importScripts('ngdeps/node_modules/zone.js/dist/zone.js'); -importScripts('ngdeps/node_modules/zone.js/dist/long-stack-trace-zone.js'); -importScripts('ngdeps/node_modules/systemjs/dist/system.js'); +importScripts('npm/node_modules/reflect-metadata/Reflect.js'); +importScripts('npm/node_modules/zone.js/dist/zone.js'); +importScripts('npm/node_modules/zone.js/dist/long-stack-trace-zone.js'); +importScripts('npm/node_modules/systemjs/dist/system.js'); importScripts('angular/modules/playground/systemjs-config.js'); diff --git a/modules/playground/src/zippy_component/BUILD.bazel b/modules/playground/src/zippy_component/BUILD.bazel index c4779d184d..964af8ade7 100644 --- a/modules/playground/src/zippy_component/BUILD.bazel +++ b/modules/playground/src/zippy_component/BUILD.bazel @@ -1,5 +1,5 @@ load("//tools:defaults.bzl", "ng_module") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") package(default_visibility = ["//modules/playground:__subpackages__"]) @@ -23,12 +23,12 @@ ts_devserver( index_html = "index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":zippy_component"], ) diff --git a/modules/playground/systemjs-config.js b/modules/playground/systemjs-config.js index a9f4c0b75d..8e3fbe8f2a 100644 --- a/modules/playground/systemjs-config.js +++ b/modules/playground/systemjs-config.js @@ -30,8 +30,8 @@ const angularPackages = [ const packagesConfig = {}; const mapConfig = { - 'tslib': 'ngdeps/node_modules/tslib/tslib.js', - 'rxjs': 'ngdeps/node_modules/rxjs/bundles/rxjs.umd.js', + 'tslib': 'npm/node_modules/tslib/tslib.js', + 'rxjs': 'npm/node_modules/rxjs/bundles/rxjs.umd.js', 'rxjs/operators': 'angular/modules/playground/systemjs-rxjs-operators.js', }; diff --git a/package.json b/package.json index 7d54afad2a..ae641c65e3 100644 --- a/package.json +++ b/package.json @@ -31,13 +31,14 @@ }, "// 1": "dependencies are used locally and by bazel", "dependencies": { + "@angular/bazel": "file:./tools/npm/@angular_bazel", "@angular-devkit/architect": "^0.13.2", "@angular-devkit/build-optimizer": "^0.13.2", "@angular-devkit/core": "^7.3.2", "@angular-devkit/schematics": "^7.3.2", - "@bazel/jasmine": "0.26.0-beta.0", - "@bazel/karma": "0.26.0-beta.0", - "@bazel/typescript": "0.26.0-beta.0", + "@bazel/jasmine": "0.26.0", + "@bazel/karma": "0.26.0", + "@bazel/typescript": "0.26.0", "@microsoft/api-extractor": "^7.0.17", "@schematics/angular": "^7.3.2", "@types/angular": "^1.6.47", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 65ff743075..b3202fba0d 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -5,15 +5,15 @@ exports_files([ "tsconfig.json", ]) -load("@npm_bazel_typescript//:defs.bzl", "ts_config") +load("@npm_bazel_typescript//:index.bzl", "ts_config") load("//tools:defaults.bzl", "ts_library") ts_library( name = "types", srcs = glob(["*.ts"]), deps = [ - "@ngdeps//@types/hammerjs", - "@ngdeps//zone.js", + "@npm//@types/hammerjs", + "@npm//zone.js", ], ) diff --git a/packages/bazel/BUILD.bazel b/packages/bazel/BUILD.bazel index 3522a3c2e7..1b7410dbb8 100644 --- a/packages/bazel/BUILD.bazel +++ b/packages/bazel/BUILD.bazel @@ -21,8 +21,6 @@ npm_package( replacements = { "(#|\/\/)\\s+BEGIN-DEV-ONLY[\\w\W]+?(#|\/\/)\\s+END-DEV-ONLY": "", "//packages/bazel/": "//", - "@ngdeps//": "@npm//", - "@angular//:@angular/bazel/ngc-wrapped": "@npm//@angular/bazel/bin:ngc-wrapped", "angular/packages/bazel/": "npm_angular_bazel/", }, tags = ["release-with-framework"], diff --git a/packages/bazel/docs/BUILD.bazel b/packages/bazel/docs/BUILD.bazel index 234fb875da..b7d4094d0f 100644 --- a/packages/bazel/docs/BUILD.bazel +++ b/packages/bazel/docs/BUILD.bazel @@ -5,7 +5,6 @@ skylark_doc( srcs = [ "//packages/bazel/src:ng_module.bzl", "//packages/bazel/src:ng_rollup_bundle.bzl", - "//packages/bazel/src:ng_setup_workspace.bzl", "//packages/bazel/src/ng_package:ng_package.bzl", "//packages/bazel/src/protractor:protractor_web_test.bzl", ], diff --git a/packages/bazel/index.bzl b/packages/bazel/index.bzl index 18b55abe3d..11c5eb8509 100644 --- a/packages/bazel/index.bzl +++ b/packages/bazel/index.bzl @@ -14,12 +14,17 @@ load( _protractor_web_test_suite = "protractor_web_test_suite", ) load("//packages/bazel/src:ng_module.bzl", _ng_module = "ng_module") -load("//packages/bazel/src:ng_setup_workspace.bzl", _ng_setup_workspace = "ng_setup_workspace") ng_module = _ng_module ng_package = _ng_package protractor_web_test = _protractor_web_test protractor_web_test_suite = _protractor_web_test_suite -ng_setup_workspace = _ng_setup_workspace # DO NOT ADD PUBLIC API without including in the documentation generation # Run `yarn bazel build //packages/bazel/docs` to verify + +def ng_setup_workspace(): + print("""DEPRECATION WARNING: + ng_setup_workspace is no longer needed, and will be removed in a future release. + We assume you will fetch rules_nodejs in your WORKSPACE file, and no other dependencies remain here. + Simply remove any calls to this function and the corresponding load statement. + """) diff --git a/packages/bazel/package.json b/packages/bazel/package.json index 9d97fca331..8ba57c7d69 100644 --- a/packages/bazel/package.json +++ b/packages/bazel/package.json @@ -21,7 +21,7 @@ "@angular-devkit/architect": "^0.10.6", "@angular-devkit/core": "^7.0.4", "@angular-devkit/schematics": "^7.3.0-rc.0", - "@bazel/typescript": "^0.26.0-beta.0", + "@bazel/typescript": "^0.26.0", "@microsoft/api-extractor": "^7.0.17", "@schematics/angular": "^7.0.4", "@types/node": "6.0.84", diff --git a/packages/bazel/src/BUILD.bazel b/packages/bazel/src/BUILD.bazel index 6f806fbfec..c7cd30b973 100644 --- a/packages/bazel/src/BUILD.bazel +++ b/packages/bazel/src/BUILD.bazel @@ -13,13 +13,13 @@ load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") nodejs_binary( name = "rollup_with_build_optimizer", data = [ - "@ngdeps//@angular-devkit/build-optimizer", - "@ngdeps//is-builtin-module", - "@ngdeps//rollup", - "@ngdeps//rollup-plugin-node-resolve", - "@ngdeps//rollup-plugin-sourcemaps", + "@npm//@angular-devkit/build-optimizer", + "@npm//is-builtin-module", + "@npm//rollup", + "@npm//rollup-plugin-node-resolve", + "@npm//rollup-plugin-sourcemaps", ], - entry_point = "ngdeps/node_modules/rollup/bin/rollup", + entry_point = "npm/node_modules/rollup/bin/rollup", install_source_map_support = False, visibility = ["//visibility:public"], ) diff --git a/packages/bazel/src/api-extractor/BUILD.bazel b/packages/bazel/src/api-extractor/BUILD.bazel index 459e7b5a96..da7d1322eb 100644 --- a/packages/bazel/src/api-extractor/BUILD.bazel +++ b/packages/bazel/src/api-extractor/BUILD.bazel @@ -11,9 +11,9 @@ ts_library( "index.ts", ], deps = [ - "@ngdeps//@bazel/typescript", - "@ngdeps//@microsoft/api-extractor", - "@ngdeps//@types/node", + "@npm//@bazel/typescript", + "@npm//@microsoft/api-extractor", + "@npm//@types/node", ], ) @@ -22,8 +22,8 @@ nodejs_binary( name = "api_extractor", data = [ ":lib", - "@ngdeps//@bazel/typescript", - "@ngdeps//@microsoft/api-extractor", + "@npm//@bazel/typescript", + "@npm//@microsoft/api-extractor", ], entry_point = "angular/packages/bazel/src/api-extractor/index.js", visibility = ["//visibility:public"], diff --git a/packages/bazel/src/builders/BUILD.bazel b/packages/bazel/src/builders/BUILD.bazel index 175ce6d437..23e4a0add8 100644 --- a/packages/bazel/src/builders/BUILD.bazel +++ b/packages/bazel/src/builders/BUILD.bazel @@ -22,9 +22,9 @@ ts_library( ], module_name = "@angular/bazel/src/builders", deps = [ - "@ngdeps//@angular-devkit/architect", - "@ngdeps//@angular-devkit/core", - "@ngdeps//@types/node", - "@ngdeps//rxjs", + "@npm//@angular-devkit/architect", + "@npm//@angular-devkit/core", + "@npm//@types/node", + "@npm//rxjs", ], ) diff --git a/packages/bazel/src/external.bzl b/packages/bazel/src/external.bzl index e96ce98af7..f9bbc98140 100644 --- a/packages/bazel/src/external.bzl +++ b/packages/bazel/src/external.bzl @@ -33,7 +33,7 @@ compile_ts = _compile_ts DEPS_ASPECTS = _DEPS_ASPECTS ts_providers_dict_to_struct = _ts_providers_dict_to_struct -DEFAULT_NG_COMPILER = "@angular//:@angular/bazel/ngc-wrapped" +DEFAULT_NG_COMPILER = "@npm//@angular/bazel/bin:ngc-wrapped" DEFAULT_NG_XI18N = "@npm//@angular/bazel/bin:xi18n" FLAT_DTS_FILE_SUFFIX = ".bundle.d.ts" TsConfigInfo = _TsConfigInfo diff --git a/packages/bazel/src/ng_package/BUILD.bazel b/packages/bazel/src/ng_package/BUILD.bazel index 8cfc2cfab3..c9a0318cc8 100644 --- a/packages/bazel/src/ng_package/BUILD.bazel +++ b/packages/bazel/src/ng_package/BUILD.bazel @@ -3,16 +3,16 @@ package(default_visibility = ["//visibility:public"]) load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") # BEGIN-DEV-ONLY -load("@npm_bazel_typescript//:defs.bzl", "ts_library") +load("@npm_bazel_typescript//:index.bzl", "ts_library") ts_library( name = "lib", srcs = glob(["*.ts"]), - node_modules = "@ngdeps//typescript:typescript__typings", + node_modules = "@npm//typescript:typescript__typings", tsconfig = ":tsconfig.json", deps = [ - "@ngdeps//@types/node", - "@ngdeps//@types/shelljs", + "@npm//@types/node", + "@npm//@types/shelljs", ], ) @@ -21,7 +21,7 @@ nodejs_binary( name = "packager", data = [ "lib", - "@ngdeps//shelljs", + "@npm//shelljs", ], entry_point = "angular/packages/bazel/src/ng_package/packager.js", install_source_map_support = False, diff --git a/packages/bazel/src/ng_rollup_bundle.bzl b/packages/bazel/src/ng_rollup_bundle.bzl index d6992fc24e..502697390f 100644 --- a/packages/bazel/src/ng_rollup_bundle.bzl +++ b/packages/bazel/src/ng_rollup_bundle.bzl @@ -43,7 +43,7 @@ PACKAGES = [ PLUGIN_CONFIG = "{sideEffectFreeModules: [\n%s]}" % ",\n".join( [" '.esm5/{0}'".format(p) for p in PACKAGES], ) -BO_ROLLUP = "ngdeps/node_modules/@angular-devkit/build-optimizer/src/build-optimizer/rollup-plugin.js" +BO_ROLLUP = "npm/node_modules/@angular-devkit/build-optimizer/src/build-optimizer/rollup-plugin.js" BO_PLUGIN = "require('%s').default(%s)" % (BO_ROLLUP, PLUGIN_CONFIG) def _use_plain_rollup(ctx): diff --git a/packages/bazel/src/ng_setup_workspace.bzl b/packages/bazel/src/ng_setup_workspace.bzl deleted file mode 100644 index 4845f7b701..0000000000 --- a/packages/bazel/src/ng_setup_workspace.bzl +++ /dev/null @@ -1,13 +0,0 @@ -# Copyright Google Inc. All Rights Reserved. -# -# Use of this source code is governed by an MIT-style license that can be -# found in the LICENSE file at https://angular.io/license - -"Install toolchain dependencies" - -def ng_setup_workspace(): - """This repository rule should be called from your WORKSPACE file. - - It creates some additional Bazel external repositories that are used internally - by the Angular rules. - """ diff --git a/packages/bazel/src/ngc-wrapped/BUILD.bazel b/packages/bazel/src/ngc-wrapped/BUILD.bazel index 00a5e25958..f419f1075a 100644 --- a/packages/bazel/src/ngc-wrapped/BUILD.bazel +++ b/packages/bazel/src/ngc-wrapped/BUILD.bazel @@ -1,5 +1,5 @@ load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") -load("@npm_bazel_typescript//:defs.bzl", "ts_library") +load("@npm_bazel_typescript//:index.bzl", "ts_library") ts_library( name = "ngc_lib", @@ -8,7 +8,7 @@ ts_library( "index.ts", ], module_name = "@angular/bazel", - node_modules = "@ngdeps//typescript:typescript__typings", + node_modules = "@npm//typescript:typescript__typings", tsconfig = ":tsconfig.json", visibility = [ "//packages/bazel:__pkg__", @@ -20,10 +20,10 @@ ts_library( # Users will get this dependency from node_modules. "//packages/compiler-cli", # END-INTERNAL - "@ngdeps//@bazel/typescript", - "@ngdeps//@types/node", - "@ngdeps//tsickle", - "@ngdeps//typescript", + "@npm//@bazel/typescript", + "@npm//@types/node", + "@npm//tsickle", + "@npm//typescript", ], ) @@ -33,8 +33,8 @@ nodejs_binary( data = [ ":ngc_lib", "//packages/bazel/third_party/github.com/bazelbuild/bazel/src/main/protobuf:worker_protocol.proto", - "@ngdeps//source-map-support", - "@ngdeps//tslib", + "@npm//source-map-support", + "@npm//tslib", ], entry_point = "angular/packages/bazel/src/ngc-wrapped/index.js", visibility = ["//visibility:public"], @@ -44,7 +44,7 @@ nodejs_binary( name = "xi18n", data = [ ":ngc_lib", - "@ngdeps//source-map-support", + "@npm//source-map-support", ], entry_point = "angular/packages/bazel/src/ngc-wrapped/extract_i18n.js", visibility = ["//visibility:public"], diff --git a/packages/bazel/src/protractor/utils/BUILD.bazel b/packages/bazel/src/protractor/utils/BUILD.bazel index fd461d9610..fcfe0ecec8 100644 --- a/packages/bazel/src/protractor/utils/BUILD.bazel +++ b/packages/bazel/src/protractor/utils/BUILD.bazel @@ -1,12 +1,12 @@ package(default_visibility = ["//visibility:public"]) -load("@npm_bazel_typescript//:defs.bzl", "ts_library") +load("@npm_bazel_typescript//:index.bzl", "ts_library") ts_library( name = "utils", srcs = ["index.ts"], module_name = "@angular/bazel/protractor-utils", - node_modules = "@ngdeps//typescript:typescript__typings", + node_modules = "@npm//typescript:typescript__typings", tsconfig = ":tsconfig.json", - deps = ["@ngdeps//@types/node"], + deps = ["@npm//@types/node"], ) diff --git a/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel b/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel index 44945a27e8..a59b2da406 100644 --- a/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel +++ b/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel @@ -12,9 +12,9 @@ ts_library( "schema.json", ], deps = [ - "@ngdeps//@angular-devkit/core", - "@ngdeps//@angular-devkit/schematics", - "@ngdeps//@schematics/angular", + "@npm//@angular-devkit/core", + "@npm//@angular-devkit/schematics", + "@npm//@schematics/angular", ], ) @@ -29,6 +29,6 @@ ts_library( ], deps = [ ":bazel-workspace", - "@ngdeps//@angular-devkit/schematics", + "@npm//@angular-devkit/schematics", ], ) diff --git a/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template b/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template index a8138b433b..5b4d987081 100644 --- a/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template +++ b/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template @@ -55,11 +55,9 @@ web_test_repositories() load("@npm_bazel_karma//:browser_repositories.bzl", "browser_repositories") browser_repositories() -load("@npm_bazel_typescript//:defs.bzl", "ts_setup_workspace") +load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace") ts_setup_workspace() <% if (sass) { %> load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories") sass_repositories() <% } %> -load("@npm_angular_bazel//:index.bzl", "ng_setup_workspace") -ng_setup_workspace() diff --git a/packages/bazel/src/schematics/bazel-workspace/files/e2e/BUILD.bazel.template b/packages/bazel/src/schematics/bazel-workspace/files/e2e/BUILD.bazel.template index 7416073301..b38c34575f 100644 --- a/packages/bazel/src/schematics/bazel-workspace/files/e2e/BUILD.bazel.template +++ b/packages/bazel/src/schematics/bazel-workspace/files/e2e/BUILD.bazel.template @@ -1,4 +1,4 @@ -load("@npm_bazel_typescript//:defs.bzl", "ts_library") +load("@npm_bazel_typescript//:index.bzl", "ts_library") load("@npm_angular_bazel//:index.bzl", "protractor_web_test_suite") ts_library( diff --git a/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template b/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template index c9fc7845d6..237f039881 100644 --- a/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template +++ b/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template @@ -1,10 +1,10 @@ package(default_visibility = ["//visibility:public"]) load("@npm_angular_bazel//:index.bzl", "ng_module") -load("@npm_bazel_karma//:defs.bzl", "ts_web_test_suite") +load("@npm_bazel_karma//:index.bzl", "ts_web_test_suite") load("@build_bazel_rules_nodejs//:defs.bzl", "rollup_bundle", "history_server") load("@build_bazel_rules_nodejs//internal/web_package:web_package.bzl", "web_package") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver", "ts_library") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver", "ts_library") <% if (sass) { %>load("@io_bazel_rules_sass//:defs.bzl", "multi_sass_binary") multi_sass_binary( diff --git a/packages/bazel/src/schematics/bazel-workspace/index.ts b/packages/bazel/src/schematics/bazel-workspace/index.ts index 1c9e716ab1..0fbdf9beb6 100644 --- a/packages/bazel/src/schematics/bazel-workspace/index.ts +++ b/packages/bazel/src/schematics/bazel-workspace/index.ts @@ -57,8 +57,8 @@ export default function(options: BazelWorkspaceOptions): Rule { } const workspaceVersions = { - 'RULES_NODEJS_VERSION': '0.18.6', - 'RULES_NODEJS_SHA256': '1416d03823fed624b49a0abbd9979f7c63bbedfd37890ddecedd2fe25cccebc6', + 'RULES_NODEJS_VERSION': '0.26.0', + 'RULES_NODEJS_SHA256': '5c86b055c57e15bf32d9009a15bcd6d8e190c41b1ff2fb18037b75e0012e4e7c', 'RULES_SASS_VERSION': '1.17.2', 'RULES_SASS_SHA256': 'e5316ee8a09d1cbb732d3938b400836bf94dba91a27476e9e27706c4c0edae1f', }; diff --git a/packages/bazel/src/schematics/ng-add/BUILD.bazel b/packages/bazel/src/schematics/ng-add/BUILD.bazel index 461a1cd924..1a67bbc1c0 100644 --- a/packages/bazel/src/schematics/ng-add/BUILD.bazel +++ b/packages/bazel/src/schematics/ng-add/BUILD.bazel @@ -14,10 +14,10 @@ ts_library( deps = [ "//packages/bazel/src/schematics/bazel-workspace", "//packages/bazel/src/schematics/utility", - "@ngdeps//@angular-devkit/core", - "@ngdeps//@angular-devkit/schematics", - "@ngdeps//@schematics/angular", - "@ngdeps//typescript", + "@npm//@angular-devkit/core", + "@npm//@angular-devkit/schematics", + "@npm//@schematics/angular", + "@npm//typescript", ], ) @@ -32,6 +32,6 @@ ts_library( ], deps = [ ":ng-add", - "@ngdeps//@angular-devkit/schematics", + "@npm//@angular-devkit/schematics", ], ) diff --git a/packages/bazel/src/schematics/ng-add/index.ts b/packages/bazel/src/schematics/ng-add/index.ts index 36dea7bfc7..32730aaedb 100755 --- a/packages/bazel/src/schematics/ng-add/index.ts +++ b/packages/bazel/src/schematics/ng-add/index.ts @@ -46,7 +46,7 @@ function addDevDependenciesToPackageJson(options: Schema) { '@angular/upgrade': angularCoreVersion, '@bazel/bazel': '^0.22.1', '@bazel/ibazel': '^0.9.0', - '@bazel/karma': '^0.25.1', + '@bazel/karma': '^0.26.0', }; const recorder = host.beginUpdate(packageJson); diff --git a/packages/bazel/src/schematics/ng-new/BUILD.bazel b/packages/bazel/src/schematics/ng-new/BUILD.bazel index 45a103934b..10f4836c45 100644 --- a/packages/bazel/src/schematics/ng-new/BUILD.bazel +++ b/packages/bazel/src/schematics/ng-new/BUILD.bazel @@ -13,8 +13,8 @@ ts_library( ], deps = [ "//packages/bazel/src/schematics/ng-add", - "@ngdeps//@angular-devkit/schematics", - "@ngdeps//@schematics/angular", + "@npm//@angular-devkit/schematics", + "@npm//@schematics/angular", ], ) @@ -29,6 +29,6 @@ ts_library( ], deps = [ ":ng-new", - "@ngdeps//@angular-devkit/schematics", + "@npm//@angular-devkit/schematics", ], ) diff --git a/packages/bazel/src/schematics/utility/BUILD.bazel b/packages/bazel/src/schematics/utility/BUILD.bazel index 2c82c9ae28..9420f1a17a 100644 --- a/packages/bazel/src/schematics/utility/BUILD.bazel +++ b/packages/bazel/src/schematics/utility/BUILD.bazel @@ -9,10 +9,10 @@ ts_library( ], module_name = "@angular/bazel/src/schematics/utility", deps = [ - "@ngdeps//@angular-devkit/core", - "@ngdeps//@angular-devkit/schematics", - "@ngdeps//@schematics/angular", - "@ngdeps//typescript", + "@npm//@angular-devkit/core", + "@npm//@angular-devkit/schematics", + "@npm//@schematics/angular", + "@npm//typescript", ], ) @@ -24,7 +24,7 @@ ts_library( ], deps = [ ":utility", - "@ngdeps//@angular-devkit/core", - "@ngdeps//@angular-devkit/schematics", + "@npm//@angular-devkit/core", + "@npm//@angular-devkit/schematics", ], ) diff --git a/packages/bazel/test/ng_package/BUILD.bazel b/packages/bazel/test/ng_package/BUILD.bazel index 0925aa37f6..9c4884b8be 100644 --- a/packages/bazel/test/ng_package/BUILD.bazel +++ b/packages/bazel/test/ng_package/BUILD.bazel @@ -13,7 +13,7 @@ ts_library( deps = [ "//packages:types", "//packages/private/testing", - "@ngdeps//@types/shelljs", + "@npm//@types/shelljs", ], ) @@ -22,8 +22,8 @@ jasmine_node_test( srcs = [":core_spec_lib"], data = [ "//packages/core:npm_package", - "@ngdeps//@types/shelljs", - "@ngdeps//shelljs", + "@npm//@types/shelljs", + "@npm//shelljs", ], ) @@ -34,7 +34,7 @@ ts_library( deps = [ "//packages:types", "//packages/private/testing", - "@ngdeps//@types/shelljs", + "@npm//@types/shelljs", ], ) @@ -43,7 +43,7 @@ jasmine_node_test( srcs = [":common_spec_lib"], data = [ "//packages/common:npm_package", - "@ngdeps//shelljs", + "@npm//shelljs", ], ) @@ -53,7 +53,7 @@ ts_library( srcs = ["example_package.spec.ts"], deps = [ "//packages:types", - "@ngdeps//@types/diff", + "@npm//@types/diff", ], ) @@ -68,7 +68,7 @@ jasmine_node_test( # file is based on non-ivy output and therefore won't work for ngc and Ivy at the same time. # TODO: We should be able to have another golden for ivy-aot as well. tags = ["no-ivy-aot"], - deps = ["@ngdeps//diff"], + deps = ["@npm//diff"], ) nodejs_binary( @@ -78,7 +78,7 @@ nodejs_binary( "example_package.golden", ":example_spec_lib", "//packages/bazel/test/ng_package/example:npm_package", - "@ngdeps//diff", + "@npm//diff", ], entry_point = "angular/packages/bazel/test/ng_package/example_package.spec.js", templated_args = ["--accept"], diff --git a/packages/bazel/test/ng_package/example/BUILD.bazel b/packages/bazel/test/ng_package/example/BUILD.bazel index 3e5733ae7b..948caaaa98 100644 --- a/packages/bazel/test/ng_package/example/BUILD.bazel +++ b/packages/bazel/test/ng_package/example/BUILD.bazel @@ -9,7 +9,7 @@ ng_module( module_name = "example", deps = [ "//packages/bazel/test/ng_package/example/secondary", - "@ngdeps//@types", + "@npm//@types", ], ) diff --git a/packages/bazel/test/ng_package/example/secondary/BUILD.bazel b/packages/bazel/test/ng_package/example/secondary/BUILD.bazel index f66a3af590..a743b6891c 100644 --- a/packages/bazel/test/ng_package/example/secondary/BUILD.bazel +++ b/packages/bazel/test/ng_package/example/secondary/BUILD.bazel @@ -9,6 +9,6 @@ ng_module( module_name = "example/secondary", deps = [ "//packages/core", - "@ngdeps//@types", + "@npm//@types", ], ) diff --git a/packages/bazel/test/ngc-wrapped/BUILD.bazel b/packages/bazel/test/ngc-wrapped/BUILD.bazel index 902a5a6fe8..f8f7907701 100644 --- a/packages/bazel/test/ngc-wrapped/BUILD.bazel +++ b/packages/bazel/test/ngc-wrapped/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( deps = [ "//packages/bazel/src/ngc-wrapped:ngc_lib", "//packages/compiler-cli", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/bazel/test/ngc-wrapped/empty/BUILD.bazel b/packages/bazel/test/ngc-wrapped/empty/BUILD.bazel index 68e33b75fa..f9809da07b 100644 --- a/packages/bazel/test/ngc-wrapped/empty/BUILD.bazel +++ b/packages/bazel/test/ngc-wrapped/empty/BUILD.bazel @@ -8,6 +8,6 @@ ng_module( tsconfig = ":tsconfig.json", deps = [ "//packages/core", - "@ngdeps//@types", + "@npm//@types", ], ) diff --git a/packages/bazel/test/ngc-wrapped/tsconfig_template.ts b/packages/bazel/test/ngc-wrapped/tsconfig_template.ts index 5459a6e62f..7f52d2b503 100644 --- a/packages/bazel/test/ngc-wrapped/tsconfig_template.ts +++ b/packages/bazel/test/ngc-wrapped/tsconfig_template.ts @@ -71,7 +71,7 @@ export function createTsConfig(options: TsConfigOptions) { 'tsickleExternsPath': '', // we don't copy the node_modules into our tmp dir, so we should look in // the original workspace directory for it - 'nodeModulesPrefix': '../ngdeps/node_modules', + 'nodeModulesPrefix': '../npm/node_modules', }, 'files': options.files, 'angularCompilerOptions': { diff --git a/packages/bazel/test/protractor-2/BUILD.bazel b/packages/bazel/test/protractor-2/BUILD.bazel index 2abc047509..bf3dae8778 100644 --- a/packages/bazel/test/protractor-2/BUILD.bazel +++ b/packages/bazel/test/protractor-2/BUILD.bazel @@ -1,5 +1,5 @@ load("//packages/bazel:index.bzl", "protractor_web_test_suite") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server", "rollup_bundle") load("//tools:defaults.bzl", "ts_library") @@ -36,8 +36,8 @@ ts_library( srcs = ["test.spec.ts"], tsconfig = ":tsconfig.test.json", deps = [ - "@ngdeps//@types/selenium-webdriver", - "@ngdeps//protractor", + "@npm//@types/selenium-webdriver", + "@npm//protractor", ], ) @@ -49,7 +49,7 @@ protractor_web_test_suite( server = ":prodserver", deps = [ ":ts_spec", - "@ngdeps//protractor", + "@npm//protractor", ], ) @@ -61,6 +61,6 @@ protractor_web_test_suite( server = ":devserver", deps = [ ":ts_spec", - "@ngdeps//protractor", + "@npm//protractor", ], ) diff --git a/packages/bazel/test/protractor-utils/BUILD.bazel b/packages/bazel/test/protractor-utils/BUILD.bazel index 33c2d77f4f..e2ddbf2008 100644 --- a/packages/bazel/test/protractor-utils/BUILD.bazel +++ b/packages/bazel/test/protractor-utils/BUILD.bazel @@ -14,7 +14,7 @@ nodejs_binary( testonly = True, data = [ "fake-devserver.js", - "@ngdeps//minimist", + "@npm//minimist", ], entry_point = "angular/packages/bazel/test/protractor-utils/fake-devserver.js", ) diff --git a/packages/bazel/test/protractor/BUILD.bazel b/packages/bazel/test/protractor/BUILD.bazel index 1f600e0d17..6301ba8b8f 100644 --- a/packages/bazel/test/protractor/BUILD.bazel +++ b/packages/bazel/test/protractor/BUILD.bazel @@ -7,8 +7,8 @@ ts_library( srcs = ["test.spec.ts"], tsconfig = ":tsconfig.json", deps = [ - "@ngdeps//@types/selenium-webdriver", - "@ngdeps//protractor", + "@npm//@types/selenium-webdriver", + "@npm//protractor", ], ) @@ -19,7 +19,7 @@ ts_library( tsconfig = ":tsconfig.json", deps = [ "//packages/bazel/src/protractor/utils", - "@ngdeps//protractor", + "@npm//protractor", ], ) @@ -29,6 +29,6 @@ protractor_web_test_suite( data = ["//packages/bazel/src/protractor/utils"], deps = [ ":ts_spec", - "@ngdeps//protractor", + "@npm//protractor", ], ) diff --git a/packages/benchpress/BUILD.bazel b/packages/benchpress/BUILD.bazel index b418569d6e..3cb0cf4dfb 100644 --- a/packages/benchpress/BUILD.bazel +++ b/packages/benchpress/BUILD.bazel @@ -13,8 +13,8 @@ ts_library( deps = [ "//packages:types", "//packages/core", - "@ngdeps//@types/node", - "@ngdeps//reflect-metadata", + "@npm//@types/node", + "@npm//reflect-metadata", ], ) diff --git a/packages/benchpress/test/BUILD.bazel b/packages/benchpress/test/BUILD.bazel index 9e6d8e46a1..ea75062fab 100644 --- a/packages/benchpress/test/BUILD.bazel +++ b/packages/benchpress/test/BUILD.bazel @@ -9,7 +9,7 @@ ts_library( "//packages/benchpress", "//packages/core", "//packages/core/testing", - "@ngdeps//protractor", + "@npm//protractor", ], ) @@ -21,6 +21,6 @@ jasmine_node_test( "//packages/benchpress", "//packages/core/testing", "//tools/testing:node", - "@ngdeps//protractor", + "@npm//protractor", ], ) diff --git a/packages/common/BUILD.bazel b/packages/common/BUILD.bazel index 7e429d92ec..f1c5a910ef 100644 --- a/packages/common/BUILD.bazel +++ b/packages/common/BUILD.bazel @@ -12,7 +12,7 @@ ng_module( ), deps = [ "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/common/http/BUILD.bazel b/packages/common/http/BUILD.bazel index 120fb214f5..575b51476b 100644 --- a/packages/common/http/BUILD.bazel +++ b/packages/common/http/BUILD.bazel @@ -15,6 +15,6 @@ ng_module( deps = [ "//packages/common", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/common/http/test/BUILD.bazel b/packages/common/http/test/BUILD.bazel index 122b3b78d5..507110a73f 100644 --- a/packages/common/http/test/BUILD.bazel +++ b/packages/common/http/test/BUILD.bazel @@ -13,7 +13,7 @@ ts_library( "//packages/common/http/testing", "//packages/core", "//packages/core/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/common/http/testing/BUILD.bazel b/packages/common/http/testing/BUILD.bazel index 74fab73105..2d69ff6a28 100644 --- a/packages/common/http/testing/BUILD.bazel +++ b/packages/common/http/testing/BUILD.bazel @@ -15,6 +15,6 @@ ng_module( deps = [ "//packages/common/http", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/common/http/testing/test/BUILD.bazel b/packages/common/http/testing/test/BUILD.bazel index c8c150c274..df1213806b 100644 --- a/packages/common/http/testing/test/BUILD.bazel +++ b/packages/common/http/testing/test/BUILD.bazel @@ -11,7 +11,7 @@ ts_library( deps = [ "//packages/common/http", "//packages/common/http/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/common/testing/BUILD.bazel b/packages/common/testing/BUILD.bazel index 9addcc00c3..0c9ead6e05 100644 --- a/packages/common/testing/BUILD.bazel +++ b/packages/common/testing/BUILD.bazel @@ -10,6 +10,6 @@ ng_module( deps = [ "//packages/common", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/compiler-cli/BUILD.bazel b/packages/compiler-cli/BUILD.bazel index 65550129bb..72dc853589 100644 --- a/packages/compiler-cli/BUILD.bazel +++ b/packages/compiler-cli/BUILD.bazel @@ -1,7 +1,7 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "npm_package", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_config") +load("@npm_bazel_typescript//:index.bzl", "ts_config") ts_config( name = "tsconfig", @@ -38,10 +38,10 @@ ts_library( "//packages/compiler-cli/src/ngtsc/transform", "//packages/compiler-cli/src/ngtsc/typecheck", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//@bazel/typescript", - "@ngdeps//@types", - "@ngdeps//tsickle", - "@ngdeps//typescript", + "@npm//@bazel/typescript", + "@npm//@types", + "@npm//tsickle", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/integrationtest/BUILD.bazel b/packages/compiler-cli/integrationtest/BUILD.bazel index 985fdbe756..be32c13964 100644 --- a/packages/compiler-cli/integrationtest/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/BUILD.bazel @@ -7,8 +7,8 @@ nodejs_binary( name = "ngc_bin", data = [ "//packages/compiler-cli", - "@ngdeps//chokidar", - "@ngdeps//reflect-metadata", + "@npm//chokidar", + "@npm//reflect-metadata", ], entry_point = "angular/packages/compiler-cli/src/main.js", ) @@ -17,8 +17,8 @@ nodejs_binary( name = "ng_xi18n", data = [ "//packages/compiler-cli", - "@ngdeps//chokidar", - "@ngdeps//reflect-metadata", + "@npm//chokidar", + "@npm//reflect-metadata", ], entry_point = "angular/packages/compiler-cli/src/extract_i18n.js", ) @@ -29,19 +29,19 @@ nodejs_test( ":ngc_bin", ":ng_xi18n", "@nodejs//:node", - "@ngdeps//domino", - "@ngdeps//chokidar", - "@ngdeps//source-map-support", - "@ngdeps//shelljs", - "@ngdeps//typescript", - "@ngdeps//reflect-metadata", - "@ngdeps//rxjs", - "@ngdeps//tslib", - "@ngdeps//jasmine/bin:jasmine", - "@ngdeps//zone.js", - "@ngdeps//xhr2", - "@ngdeps//@types/node", - "@ngdeps//@types/jasmine", + "@npm//domino", + "@npm//chokidar", + "@npm//source-map-support", + "@npm//shelljs", + "@npm//typescript", + "@npm//reflect-metadata", + "@npm//rxjs", + "@npm//tslib", + "@npm//jasmine/bin:jasmine", + "@npm//zone.js", + "@npm//xhr2", + "@npm//@types/node", + "@npm//@types/jasmine", "//packages/animations:npm_package", "//packages/common:npm_package", "//packages/compiler:npm_package", diff --git a/packages/compiler-cli/integrationtest/bazel/injectable_def/app/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injectable_def/app/BUILD.bazel index 524b44082a..a692dcbd9f 100644 --- a/packages/compiler-cli/integrationtest/bazel/injectable_def/app/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injectable_def/app/BUILD.bazel @@ -17,7 +17,7 @@ ng_module( "//packages/platform-browser", "//packages/platform-server", "//packages/router", - "@ngdeps//reflect-metadata", - "@ngdeps//rxjs", + "@npm//reflect-metadata", + "@npm//rxjs", ], ) diff --git a/packages/compiler-cli/integrationtest/bazel/injectable_def/lib1/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injectable_def/lib1/BUILD.bazel index efa1d38972..f0be898990 100644 --- a/packages/compiler-cli/integrationtest/bazel/injectable_def/lib1/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injectable_def/lib1/BUILD.bazel @@ -12,6 +12,6 @@ ng_module( module_name = "lib1_built", deps = [ "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/compiler-cli/integrationtest/bazel/injectable_def/lib2/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injectable_def/lib2/BUILD.bazel index e29a00e29c..9b7c1ebed0 100644 --- a/packages/compiler-cli/integrationtest/bazel/injectable_def/lib2/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injectable_def/lib2/BUILD.bazel @@ -13,6 +13,6 @@ ng_module( deps = [ "//packages/compiler-cli/integrationtest/bazel/injectable_def/lib1", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/BUILD.bazel index bd8a754c72..f138ec6090 100644 --- a/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/injector_def/ivy_build/app/BUILD.bazel @@ -13,6 +13,6 @@ ng_module( tags = ["ivy-only"], deps = [ "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel index e42d728325..f3db21e7c8 100644 --- a/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel @@ -11,7 +11,7 @@ ng_module( flat_module_out_file = "flat_module_filename", module_name = "some_npm_module", ng_xi18n = "//packages/bazel/src/ngc-wrapped:xi18n", - node_modules = "@ngdeps//typescript:typescript__typings", + node_modules = "@npm//typescript:typescript__typings", tags = [ # Disabled as this test is specific to the flat module indexing of metadata.json files that # the old ngc compiler does. Ivy has no metadata.json files so this test does not apply. @@ -19,7 +19,7 @@ ng_module( ], deps = [ "//packages/core", - "@ngdeps//@types", + "@npm//@types", ], ) diff --git a/packages/compiler-cli/integrationtest/test.js b/packages/compiler-cli/integrationtest/test.js index 2b62fd7f0c..67d93e3beb 100644 --- a/packages/compiler-cli/integrationtest/test.js +++ b/packages/compiler-cli/integrationtest/test.js @@ -14,7 +14,7 @@ const {runCommand, setupTestDirectory} = require('./test_helpers'); const ngcBin = require.resolve('./ngc_bin'); const xi18nBin = require.resolve('./ng_xi18n'); const nodeBin = require.resolve(`nodejs/bin/node${(os.platform() === 'win32' ? '.cmd' : '')}`); -const jasmineBin = require.resolve('ngdeps/node_modules/jasmine/bin/jasmine.js'); +const jasmineBin = require.resolve('npm/node_modules/jasmine/bin/jasmine.js'); // Prepare the test directory before building the integration test output. This ensures that // the test runs in an hermetic way and works on Windows. diff --git a/packages/compiler-cli/integrationtest/test_helpers.js b/packages/compiler-cli/integrationtest/test_helpers.js index c0c87fc3c2..3e8123211b 100644 --- a/packages/compiler-cli/integrationtest/test_helpers.js +++ b/packages/compiler-cli/integrationtest/test_helpers.js @@ -38,23 +38,23 @@ const requiredNodeModules = { '@angular/router': resolveNpmTreeArtifact('angular/packages/router/npm_package'), // Note, @bazel/typescript does not appear here because it's not listed as a dependency of // @angular/compiler-cli - '@types/jasmine': resolveNpmTreeArtifact('ngdeps/node_modules/@types/jasmine'), - '@types/node': resolveNpmTreeArtifact('ngdeps/node_modules/@types/node'), + '@types/jasmine': resolveNpmTreeArtifact('npm/node_modules/@types/jasmine'), + '@types/node': resolveNpmTreeArtifact('npm/node_modules/@types/node'), // Transitive dependencies which need to be specified because the Angular NPM packages // depend on these without the Angular NPM packages being part of the Bazel managed deps. // This means that transitive dependencies need to be manually declared as required. - 'tslib': resolveNpmTreeArtifact('ngdeps/node_modules/tslib'), - 'domino': resolveNpmTreeArtifact('ngdeps/node_modules/domino'), - 'xhr2': resolveNpmTreeArtifact('ngdeps/node_modules/xhr2'), + 'tslib': resolveNpmTreeArtifact('npm/node_modules/tslib'), + 'domino': resolveNpmTreeArtifact('npm/node_modules/domino'), + 'xhr2': resolveNpmTreeArtifact('npm/node_modules/xhr2'), // Fine grained dependencies which are used by the integration test Angular modules, and // need to be symlinked so that they can be resolved by NodeJS or NGC. - 'reflect-metadata': resolveNpmTreeArtifact('ngdeps/node_modules/reflect-metadata'), - 'rxjs': resolveNpmTreeArtifact('ngdeps/node_modules/rxjs'), - 'source-map-support': resolveNpmTreeArtifact('ngdeps/node_modules/source-map-support'), - 'typescript': resolveNpmTreeArtifact('ngdeps/node_modules/typescript'), - 'zone.js': resolveNpmTreeArtifact('ngdeps/node_modules/zone.js'), + 'reflect-metadata': resolveNpmTreeArtifact('npm/node_modules/reflect-metadata'), + 'rxjs': resolveNpmTreeArtifact('npm/node_modules/rxjs'), + 'source-map-support': resolveNpmTreeArtifact('npm/node_modules/source-map-support'), + 'typescript': resolveNpmTreeArtifact('npm/node_modules/typescript'), + 'zone.js': resolveNpmTreeArtifact('npm/node_modules/zone.js'), }; /** Sets up the temporary test directory and returns the path to the directory. */ diff --git a/packages/compiler-cli/src/ngcc/BUILD.bazel b/packages/compiler-cli/src/ngcc/BUILD.bazel index 271f47f2de..00658a5e0e 100644 --- a/packages/compiler-cli/src/ngcc/BUILD.bazel +++ b/packages/compiler-cli/src/ngcc/BUILD.bazel @@ -20,15 +20,15 @@ ts_library( "//packages/compiler-cli/src/ngtsc/scope", "//packages/compiler-cli/src/ngtsc/transform", "//packages/compiler-cli/src/ngtsc/translator", - "@ngdeps//@types/convert-source-map", - "@ngdeps//@types/node", - "@ngdeps//@types/shelljs", - "@ngdeps//@types/source-map", - "@ngdeps//@types/yargs", - "@ngdeps//canonical-path", - "@ngdeps//dependency-graph", - "@ngdeps//magic-string", - "@ngdeps//source-map", - "@ngdeps//typescript", + "@npm//@types/convert-source-map", + "@npm//@types/node", + "@npm//@types/shelljs", + "@npm//@types/source-map", + "@npm//@types/yargs", + "@npm//canonical-path", + "@npm//dependency-graph", + "@npm//magic-string", + "@npm//source-map", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngcc/test/BUILD.bazel b/packages/compiler-cli/src/ngcc/test/BUILD.bazel index f2e51149d1..3f19cbe32f 100644 --- a/packages/compiler-cli/src/ngcc/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngcc/test/BUILD.bazel @@ -16,11 +16,11 @@ ts_library( "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/testing", "//packages/compiler-cli/src/ngtsc/transform", - "@ngdeps//@types/convert-source-map", - "@ngdeps//@types/mock-fs", - "@ngdeps//canonical-path", - "@ngdeps//magic-string", - "@ngdeps//typescript", + "@npm//@types/convert-source-map", + "@npm//@types/mock-fs", + "@npm//canonical-path", + "@npm//magic-string", + "@npm//typescript", ], ) @@ -30,7 +30,7 @@ jasmine_node_test( deps = [ ":test_lib", "//tools/testing:node_no_angular", - "@ngdeps//canonical-path", - "@ngdeps//convert-source-map", + "@npm//canonical-path", + "@npm//convert-source-map", ], ) diff --git a/packages/compiler-cli/src/ngtsc/annotations/BUILD.bazel b/packages/compiler-cli/src/ngtsc/annotations/BUILD.bazel index ea3eb2f159..139a1db6a3 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/annotations/BUILD.bazel @@ -19,7 +19,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/transform", "//packages/compiler-cli/src/ngtsc/typecheck", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//@types/node", - "@ngdeps//typescript", + "@npm//@types/node", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/annotations/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/annotations/test/BUILD.bazel index e6da783313..74960efdfe 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/annotations/test/BUILD.bazel @@ -22,7 +22,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/testing", "//packages/compiler-cli/src/ngtsc/translator", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/cycles/BUILD.bazel b/packages/compiler-cli/src/ngtsc/cycles/BUILD.bazel index f54673ed0f..ef45798579 100644 --- a/packages/compiler-cli/src/ngtsc/cycles/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/cycles/BUILD.bazel @@ -10,6 +10,6 @@ ts_library( module_name = "@angular/compiler-cli/src/ngtsc/cycles", deps = [ "//packages/compiler-cli/src/ngtsc/imports", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/cycles/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/cycles/test/BUILD.bazel index 0ed3c04e0d..37728045e2 100644 --- a/packages/compiler-cli/src/ngtsc/cycles/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/cycles/test/BUILD.bazel @@ -13,7 +13,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/cycles", "//packages/compiler-cli/src/ngtsc/imports", "//packages/compiler-cli/src/ngtsc/testing", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/diagnostics/BUILD.bazel b/packages/compiler-cli/src/ngtsc/diagnostics/BUILD.bazel index 965c7ae178..d7ccf63c58 100644 --- a/packages/compiler-cli/src/ngtsc/diagnostics/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/diagnostics/BUILD.bazel @@ -9,6 +9,6 @@ ts_library( ]), deps = [ "//packages/compiler", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/entry_point/BUILD.bazel b/packages/compiler-cli/src/ngtsc/entry_point/BUILD.bazel index 77c0d8fc55..afbf98fc6b 100644 --- a/packages/compiler-cli/src/ngtsc/entry_point/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/entry_point/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/diagnostics", "//packages/compiler-cli/src/ngtsc/shims", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//@types/node", - "@ngdeps//typescript", + "@npm//@types/node", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/entry_point/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/entry_point/test/BUILD.bazel index cb761a55da..31b933d9a3 100644 --- a/packages/compiler-cli/src/ngtsc/entry_point/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/entry_point/test/BUILD.bazel @@ -11,7 +11,7 @@ ts_library( deps = [ "//packages:types", "//packages/compiler-cli/src/ngtsc/entry_point", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/imports/BUILD.bazel b/packages/compiler-cli/src/ngtsc/imports/BUILD.bazel index 07db415e02..48952cb198 100644 --- a/packages/compiler-cli/src/ngtsc/imports/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/imports/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( "//packages/compiler", "//packages/compiler-cli/src/ngtsc/path", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//@types/node", - "@ngdeps//typescript", + "@npm//@types/node", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/BUILD.bazel b/packages/compiler-cli/src/ngtsc/partial_evaluator/BUILD.bazel index 02979fd2da..fd71126460 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/BUILD.bazel @@ -14,7 +14,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/imports", "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//@types/node", - "@ngdeps//typescript", + "@npm//@types/node", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/BUILD.bazel index d4caa3a9ed..78d7ce4ef3 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/BUILD.bazel @@ -15,7 +15,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/partial_evaluator", "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/testing", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/path/BUILD.bazel b/packages/compiler-cli/src/ngtsc/path/BUILD.bazel index 2435fdc0e9..ebdbdfe262 100644 --- a/packages/compiler-cli/src/ngtsc/path/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/path/BUILD.bazel @@ -9,7 +9,7 @@ ts_library( ]), deps = [ "//packages:types", - "@ngdeps//@types/node", - "@ngdeps//typescript", + "@npm//@types/node", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/reflection/BUILD.bazel b/packages/compiler-cli/src/ngtsc/reflection/BUILD.bazel index 591bba9075..0e90eea893 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/reflection/BUILD.bazel @@ -7,5 +7,5 @@ ts_library( srcs = ["index.ts"] + glob([ "src/**/*.ts", ]), - deps = ["@ngdeps//typescript"], + deps = ["@npm//typescript"], ) diff --git a/packages/compiler-cli/src/ngtsc/reflection/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/reflection/test/BUILD.bazel index 55e21e18e8..605b9dd910 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/reflection/test/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( "//packages:types", "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/testing", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/routing/BUILD.bazel b/packages/compiler-cli/src/ngtsc/routing/BUILD.bazel index 9670f24f81..84d14c119b 100644 --- a/packages/compiler-cli/src/ngtsc/routing/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/routing/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( "//packages/compiler", "//packages/compiler-cli/src/ngtsc/imports", "//packages/compiler-cli/src/ngtsc/partial_evaluator", - "@ngdeps//@types/node", - "@ngdeps//typescript", + "@npm//@types/node", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/scope/BUILD.bazel b/packages/compiler-cli/src/ngtsc/scope/BUILD.bazel index 655f6d8929..0fed081640 100644 --- a/packages/compiler-cli/src/ngtsc/scope/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/scope/BUILD.bazel @@ -13,6 +13,6 @@ ts_library( "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/typecheck", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/scope/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/scope/test/BUILD.bazel index ed9c2b3e6e..307b55610c 100644 --- a/packages/compiler-cli/src/ngtsc/scope/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/scope/test/BUILD.bazel @@ -15,7 +15,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/scope", "//packages/compiler-cli/src/ngtsc/testing", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/shims/BUILD.bazel b/packages/compiler-cli/src/ngtsc/shims/BUILD.bazel index f25ef3e838..8a3b57f06c 100644 --- a/packages/compiler-cli/src/ngtsc/shims/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/shims/BUILD.bazel @@ -11,7 +11,7 @@ ts_library( "//packages/compiler", "//packages/compiler-cli/src/ngtsc/imports", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//@types/node", - "@ngdeps//typescript", + "@npm//@types/node", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/switch/BUILD.bazel b/packages/compiler-cli/src/ngtsc/switch/BUILD.bazel index cb758ef2bb..7ceb4ad96e 100644 --- a/packages/compiler-cli/src/ngtsc/switch/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/switch/BUILD.bazel @@ -9,6 +9,6 @@ ts_library( ]), deps = [ "//packages/compiler", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/testing/BUILD.bazel b/packages/compiler-cli/src/ngtsc/testing/BUILD.bazel index 7509f42d95..028ee75e41 100644 --- a/packages/compiler-cli/src/ngtsc/testing/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/testing/BUILD.bazel @@ -10,6 +10,6 @@ ts_library( ]), deps = [ "//packages:types", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/transform/BUILD.bazel b/packages/compiler-cli/src/ngtsc/transform/BUILD.bazel index d3a6fe38da..8ea057933a 100644 --- a/packages/compiler-cli/src/ngtsc/transform/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/transform/BUILD.bazel @@ -15,6 +15,6 @@ ts_library( "//packages/compiler-cli/src/ngtsc/translator", "//packages/compiler-cli/src/ngtsc/typecheck", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel b/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel index 5da5a9dcac..351b1a7513 100644 --- a/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel @@ -10,6 +10,6 @@ ts_library( "//packages/compiler", "//packages/compiler-cli/src/ngtsc/imports", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/BUILD.bazel index 12725051a4..ded2c9dded 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/typecheck/BUILD.bazel @@ -11,6 +11,6 @@ ts_library( "//packages/compiler-cli/src/ngtsc/imports", "//packages/compiler-cli/src/ngtsc/translator", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/typecheck/test/BUILD.bazel index cc73dee179..0a693ec11e 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/typecheck/test/BUILD.bazel @@ -15,7 +15,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/testing", "//packages/compiler-cli/src/ngtsc/typecheck", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/util/BUILD.bazel b/packages/compiler-cli/src/ngtsc/util/BUILD.bazel index 2ae5def318..ecf6afaafb 100644 --- a/packages/compiler-cli/src/ngtsc/util/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/util/BUILD.bazel @@ -10,7 +10,7 @@ ts_library( deps = [ "//packages:types", "//packages/compiler-cli/src/ngtsc/path", - "@ngdeps//@types/node", - "@ngdeps//typescript", + "@npm//@types/node", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/src/ngtsc/util/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/util/test/BUILD.bazel index 0aaa4f777c..dde23724a8 100644 --- a/packages/compiler-cli/src/ngtsc/util/test/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/util/test/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( "//packages:types", "//packages/compiler-cli/src/ngtsc/testing", "//packages/compiler-cli/src/ngtsc/util", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/test/BUILD.bazel b/packages/compiler-cli/test/BUILD.bazel index ede4cd1c4c..9f8a8cee66 100644 --- a/packages/compiler-cli/test/BUILD.bazel +++ b/packages/compiler-cli/test/BUILD.bazel @@ -18,7 +18,7 @@ ts_library( "//packages:types", "//packages/compiler", "//packages/compiler-cli", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -33,7 +33,7 @@ ts_library( ":test_utils", "//packages/compiler", "//packages/compiler-cli", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -53,7 +53,7 @@ jasmine_node_test( "//packages/common:npm_package", "//packages/core", "//tools/testing:node", - "@ngdeps//minimist", + "@npm//minimist", ], ) @@ -68,7 +68,7 @@ ts_library( ":test_utils", "//packages/compiler", "//packages/compiler-cli", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -91,9 +91,9 @@ jasmine_node_test( ":ngc_lib", "//packages/core", "//tools/testing:node", - "@ngdeps//minimist", - "@ngdeps//rxjs", - "@ngdeps//tsickle", + "@npm//minimist", + "@npm//rxjs", + "@npm//tsickle", ], ) @@ -109,7 +109,7 @@ ts_library( "//packages/compiler", "//packages/compiler-cli", "//packages/private/testing", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -138,7 +138,7 @@ ts_library( ":test_utils", "//packages/compiler", "//packages/compiler-cli", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/test/compliance/BUILD.bazel b/packages/compiler-cli/test/compliance/BUILD.bazel index 66ec58e13c..56cc452d63 100644 --- a/packages/compiler-cli/test/compliance/BUILD.bazel +++ b/packages/compiler-cli/test/compliance/BUILD.bazel @@ -11,7 +11,7 @@ ts_library( "//packages/compiler", "//packages/compiler-cli", "//packages/compiler/test:test_utils", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/test/diagnostics/BUILD.bazel b/packages/compiler-cli/test/diagnostics/BUILD.bazel index 19eb83b305..65fab5a496 100644 --- a/packages/compiler-cli/test/diagnostics/BUILD.bazel +++ b/packages/compiler-cli/test/diagnostics/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( "//packages/compiler-cli", "//packages/compiler-cli/test:test_utils", "//packages/core", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -25,7 +25,7 @@ ts_library( ":mocks", "//packages/compiler-cli", "//packages/compiler-cli/test:test_utils", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -60,7 +60,7 @@ ts_library( "//packages/compiler-cli", "//packages/compiler-cli/test:test_utils", "//packages/language-service", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -96,7 +96,7 @@ ts_library( "//packages/compiler-cli/test:test_utils", "//packages/compiler/test:test_utils", "//packages/language-service", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/test/metadata/BUILD.bazel b/packages/compiler-cli/test/metadata/BUILD.bazel index ea274a7571..8fe58d3d1e 100644 --- a/packages/compiler-cli/test/metadata/BUILD.bazel +++ b/packages/compiler-cli/test/metadata/BUILD.bazel @@ -10,7 +10,7 @@ ts_library( "//packages/compiler-cli", "//packages/compiler-cli/test:test_utils", "//packages/core", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/compiler-cli/test/ngcc/BUILD.bazel b/packages/compiler-cli/test/ngcc/BUILD.bazel index c18e086dae..6409276bc9 100644 --- a/packages/compiler-cli/test/ngcc/BUILD.bazel +++ b/packages/compiler-cli/test/ngcc/BUILD.bazel @@ -10,7 +10,7 @@ ts_library( deps = [ "//packages/compiler-cli/src/ngcc", "//packages/compiler-cli/test:test_utils", - "@ngdeps//@types/mock-fs", + "@npm//@types/mock-fs", ], ) @@ -24,10 +24,10 @@ jasmine_node_test( deps = [ ":ngcc_lib", "//tools/testing:node_no_angular", - "@ngdeps//@types/mock-fs", - "@ngdeps//canonical-path", - "@ngdeps//convert-source-map", - "@ngdeps//shelljs", - "@ngdeps//yargs", + "@npm//@types/mock-fs", + "@npm//canonical-path", + "@npm//convert-source-map", + "@npm//shelljs", + "@npm//yargs", ], ) diff --git a/packages/compiler-cli/test/ngtsc/BUILD.bazel b/packages/compiler-cli/test/ngtsc/BUILD.bazel index 23900a055c..880234345e 100644 --- a/packages/compiler-cli/test/ngtsc/BUILD.bazel +++ b/packages/compiler-cli/test/ngtsc/BUILD.bazel @@ -10,9 +10,9 @@ ts_library( "//packages/compiler-cli/src/ngtsc/routing", "//packages/compiler-cli/src/ngtsc/util", "//packages/compiler-cli/test:test_utils", - "@ngdeps//@types/source-map", - "@ngdeps//source-map", - "@ngdeps//typescript", + "@npm//@types/source-map", + "@npm//source-map", + "@npm//typescript", ], ) @@ -25,6 +25,6 @@ jasmine_node_test( deps = [ ":ngtsc_lib", "//tools/testing:node_no_angular", - "@ngdeps//minimist", + "@npm//minimist", ], ) diff --git a/packages/compiler-cli/test/test_support.ts b/packages/compiler-cli/test/test_support.ts index 8322b8b1d3..b033097299 100644 --- a/packages/compiler-cli/test/test_support.ts +++ b/packages/compiler-cli/test/test_support.ts @@ -126,7 +126,7 @@ export function setupBazelTo(tmpDirPath: string) { ({pkgPath, name}) => { fs.symlinkSync(pkgPath, path.join(angularDirectory, name), 'dir'); }); // Link typescript - const typeScriptSource = resolveNpmTreeArtifact('ngdeps/node_modules/typescript'); + const typeScriptSource = resolveNpmTreeArtifact('npm/node_modules/typescript'); const typescriptDest = path.join(nodeModulesPath, 'typescript'); fs.symlinkSync(typeScriptSource, typescriptDest, 'dir'); diff --git a/packages/compiler-cli/test/transformers/BUILD.bazel b/packages/compiler-cli/test/transformers/BUILD.bazel index b4435f7c59..8c9b603f4f 100644 --- a/packages/compiler-cli/test/transformers/BUILD.bazel +++ b/packages/compiler-cli/test/transformers/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( "//packages/compiler/test:test_utils", "//packages/core", "//packages/platform-browser", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -34,6 +34,6 @@ jasmine_node_test( ":test_lib", "//packages/core", "//tools/testing:node", - "@ngdeps//source-map", + "@npm//source-map", ], ) diff --git a/packages/compiler/test/BUILD.bazel b/packages/compiler/test/BUILD.bazel index 75c16aac68..005800ee6e 100644 --- a/packages/compiler/test/BUILD.bazel +++ b/packages/compiler/test/BUILD.bazel @@ -22,7 +22,7 @@ ts_library( "//packages:types", "//packages/compiler", "//packages/compiler-cli", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -64,7 +64,7 @@ ts_library( "//packages/compiler/test/expression_parser/utils", "//packages/compiler/testing", "//packages/core", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -85,8 +85,8 @@ jasmine_node_test( ":test_node_only_lib", "//packages/core", "//tools/testing:node", - "@ngdeps//base64-js", - "@ngdeps//source-map", + "@npm//base64-js", + "@npm//source-map", ], ) diff --git a/packages/compiler/testing/BUILD.bazel b/packages/compiler/testing/BUILD.bazel index 188ec1260c..e0fe802fde 100644 --- a/packages/compiler/testing/BUILD.bazel +++ b/packages/compiler/testing/BUILD.bazel @@ -14,6 +14,6 @@ ng_module( "//packages:types", "//packages/compiler", "//packages/core", - "@ngdeps//@types/node", + "@npm//@types/node", ], ) diff --git a/packages/core/BUILD.bazel b/packages/core/BUILD.bazel index 193bdf0cf5..1fcc01021e 100644 --- a/packages/core/BUILD.bazel +++ b/packages/core/BUILD.bazel @@ -17,8 +17,8 @@ ng_module( "//packages/core/src/interface", "//packages/core/src/reflection", "//packages/core/src/util", - "@ngdeps//rxjs", - "@ngdeps//zone.js", + "@npm//rxjs", + "@npm//zone.js", ], ) diff --git a/packages/core/src/di/interface/BUILD.bazel b/packages/core/src/di/interface/BUILD.bazel index c27b5da5f0..787db340e9 100644 --- a/packages/core/src/di/interface/BUILD.bazel +++ b/packages/core/src/di/interface/BUILD.bazel @@ -15,6 +15,6 @@ ts_library( deps = [ "//packages/core/src/interface", "//packages/core/src/util", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/core/src/util/BUILD.bazel b/packages/core/src/util/BUILD.bazel index f1752340de..982244b765 100644 --- a/packages/core/src/util/BUILD.bazel +++ b/packages/core/src/util/BUILD.bazel @@ -14,6 +14,6 @@ ts_library( ), deps = [ "//packages/core/src/interface", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/core/test/BUILD.bazel b/packages/core/test/BUILD.bazel index c14aad99c1..99fa8a82cc 100644 --- a/packages/core/test/BUILD.bazel +++ b/packages/core/test/BUILD.bazel @@ -33,8 +33,8 @@ ts_library( "//packages/private/testing", "//packages/router", "//packages/router/testing", - "@ngdeps//rxjs", - "@ngdeps//zone.js", + "@npm//rxjs", + "@npm//zone.js", ], ) @@ -64,9 +64,9 @@ jasmine_node_test( "//packages/platform-server", "//packages/platform-server/testing", "//tools/testing:node", - "@ngdeps//base64-js", - "@ngdeps//source-map", - "@ngdeps//zone.js", + "@npm//base64-js", + "@npm//source-map", + "@npm//zone.js", ], ) diff --git a/packages/core/test/acceptance/BUILD.bazel b/packages/core/test/acceptance/BUILD.bazel index 6ef8cb8dd6..997be2d82b 100644 --- a/packages/core/test/acceptance/BUILD.bazel +++ b/packages/core/test/acceptance/BUILD.bazel @@ -18,7 +18,7 @@ ts_library( "//packages/platform-browser-dynamic", "//packages/platform-browser/testing", "//packages/private/testing", - "@ngdeps//zone.js", + "@npm//zone.js", ], ) @@ -28,8 +28,8 @@ jasmine_node_test( deps = [ ":acceptance_lib", "//tools/testing:node", - "@ngdeps//base64-js", - "@ngdeps//source-map", - "@ngdeps//zone.js", + "@npm//base64-js", + "@npm//source-map", + "@npm//zone.js", ], ) diff --git a/packages/core/test/bundling/animation_world/BUILD.bazel b/packages/core/test/bundling/animation_world/BUILD.bazel index f895027191..cb29e0f7a9 100644 --- a/packages/core/test/bundling/animation_world/BUILD.bazel +++ b/packages/core/test/bundling/animation_world/BUILD.bazel @@ -32,7 +32,7 @@ ng_rollup_bundle( deps = [ ":animation_world", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/core/test/bundling/cyclic_import/BUILD.bazel b/packages/core/test/bundling/cyclic_import/BUILD.bazel index b489b4e32c..792c16e7a8 100644 --- a/packages/core/test/bundling/cyclic_import/BUILD.bazel +++ b/packages/core/test/bundling/cyclic_import/BUILD.bazel @@ -33,7 +33,7 @@ ng_rollup_bundle( deps = [ ":cyclic_import", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/core/test/bundling/hello_world/BUILD.bazel b/packages/core/test/bundling/hello_world/BUILD.bazel index 4a48c199b4..7e103895a0 100644 --- a/packages/core/test/bundling/hello_world/BUILD.bazel +++ b/packages/core/test/bundling/hello_world/BUILD.bazel @@ -30,7 +30,7 @@ ng_rollup_bundle( deps = [ ":hello_world", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/core/test/bundling/hello_world_i18n/BUILD.bazel b/packages/core/test/bundling/hello_world_i18n/BUILD.bazel index f0b7d00712..0624700f3e 100644 --- a/packages/core/test/bundling/hello_world_i18n/BUILD.bazel +++ b/packages/core/test/bundling/hello_world_i18n/BUILD.bazel @@ -24,7 +24,7 @@ ng_rollup_bundle( deps = [ ":hello_world_i18n", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/core/test/bundling/hello_world_r2/BUILD.bazel b/packages/core/test/bundling/hello_world_r2/BUILD.bazel index 1601c9b57b..d539b93269 100644 --- a/packages/core/test/bundling/hello_world_r2/BUILD.bazel +++ b/packages/core/test/bundling/hello_world_r2/BUILD.bazel @@ -31,7 +31,7 @@ ng_rollup_bundle( ":hello_world", "//packages/core", "//packages/platform-browser", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/core/test/bundling/injection/BUILD.bazel b/packages/core/test/bundling/injection/BUILD.bazel index 8caa0a1f01..1b0453819c 100644 --- a/packages/core/test/bundling/injection/BUILD.bazel +++ b/packages/core/test/bundling/injection/BUILD.bazel @@ -32,7 +32,7 @@ ng_rollup_bundle( deps = [ ":injection", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/core/test/bundling/todo/BUILD.bazel b/packages/core/test/bundling/todo/BUILD.bazel index eb60ff4618..b4450dfdc9 100644 --- a/packages/core/test/bundling/todo/BUILD.bazel +++ b/packages/core/test/bundling/todo/BUILD.bazel @@ -3,7 +3,7 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle", "ts_library") load("//tools/symbol-extractor:index.bzl", "js_expected_symbol_test") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( name = "todo", @@ -35,7 +35,7 @@ ng_rollup_bundle( "//packages/common", "//packages/core", "//packages/core/test/bundling/util:reflect_metadata", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -82,7 +82,7 @@ js_expected_symbol_test( genrule( name = "tslib", srcs = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", ], outs = [ "tslib.js", diff --git a/packages/core/test/bundling/todo_i18n/BUILD.bazel b/packages/core/test/bundling/todo_i18n/BUILD.bazel index 94da2d7409..0d04699423 100644 --- a/packages/core/test/bundling/todo_i18n/BUILD.bazel +++ b/packages/core/test/bundling/todo_i18n/BUILD.bazel @@ -2,7 +2,7 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle", "ts_library") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( name = "todo_i18n", @@ -37,7 +37,7 @@ ng_rollup_bundle( "//packages/common", "//packages/core", "//packages/core/test/bundling/util:reflect_metadata", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -74,7 +74,7 @@ jasmine_node_test( genrule( name = "tslib", srcs = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", ], outs = [ "tslib.js", diff --git a/packages/core/test/bundling/todo_r2/BUILD.bazel b/packages/core/test/bundling/todo_r2/BUILD.bazel index 3eeed75691..cecb46625f 100644 --- a/packages/core/test/bundling/todo_r2/BUILD.bazel +++ b/packages/core/test/bundling/todo_r2/BUILD.bazel @@ -2,7 +2,7 @@ package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ng_rollup_bundle", "ts_library") load("@build_bazel_rules_nodejs//:defs.bzl", "http_server") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( name = "todo", @@ -38,7 +38,7 @@ ng_rollup_bundle( "//packages/core/test/bundling/util:reflect_metadata", "//packages/platform-browser", "//packages/platform-browser-dynamic", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -77,7 +77,7 @@ jasmine_node_test( genrule( name = "tslib", srcs = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", ], outs = [ "tslib.js", diff --git a/packages/core/test/bundling/util/BUILD.bazel b/packages/core/test/bundling/util/BUILD.bazel index c596830d96..33e77aff59 100644 --- a/packages/core/test/bundling/util/BUILD.bazel +++ b/packages/core/test/bundling/util/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( ":metadata_switch", ], module_name = "@angular/core/test/bundling/util/src/reflect_metadata", - deps = ["@ngdeps//reflect-metadata"], + deps = ["@npm//reflect-metadata"], ) # See packages/core/BUILD.bazel. diff --git a/packages/core/test/render3/BUILD.bazel b/packages/core/test/render3/BUILD.bazel index 0cd5a39ce6..2d769b430e 100644 --- a/packages/core/test/render3/BUILD.bazel +++ b/packages/core/test/render3/BUILD.bazel @@ -30,7 +30,7 @@ ts_library( "//packages/platform-browser/animations", "//packages/platform-browser/testing", "//packages/private/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -45,7 +45,7 @@ ts_library( "//packages/compiler", "//packages/platform-browser", "//packages/platform-server", - "@ngdeps//zone.js", + "@npm//zone.js", ], ) @@ -66,7 +66,7 @@ jasmine_node_test( ], deps = [ ":render3_node_lib", - "@ngdeps//zone.js", + "@npm//zone.js", ], ) diff --git a/packages/core/testing/BUILD.bazel b/packages/core/testing/BUILD.bazel index 774fd2ad42..8009d9f276 100644 --- a/packages/core/testing/BUILD.bazel +++ b/packages/core/testing/BUILD.bazel @@ -13,7 +13,7 @@ ng_module( "//packages:types", "//packages/compiler", "//packages/core", - "@ngdeps//@types/jasmine", - "@ngdeps//zone.js", + "@npm//@types/jasmine", + "@npm//zone.js", ], ) diff --git a/packages/elements/BUILD.bazel b/packages/elements/BUILD.bazel index 30ab2b5ab3..63385d8636 100644 --- a/packages/elements/BUILD.bazel +++ b/packages/elements/BUILD.bazel @@ -14,7 +14,7 @@ ng_module( deps = [ "//packages/core", "//packages/platform-browser", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/elements/schematics/ng-add/BUILD.bazel b/packages/elements/schematics/ng-add/BUILD.bazel index c7825948bd..bc961159c8 100644 --- a/packages/elements/schematics/ng-add/BUILD.bazel +++ b/packages/elements/schematics/ng-add/BUILD.bazel @@ -12,8 +12,8 @@ ts_library( deps = [ "//packages/common", "//packages/core", - "@ngdeps//@angular-devkit/schematics", - "@ngdeps//rxjs", + "@npm//@angular-devkit/schematics", + "@npm//rxjs", ], ) @@ -27,8 +27,8 @@ ts_library( ":ng-add", "//packages/common", "//packages/core", - "@ngdeps//@angular-devkit/schematics", - "@ngdeps//rxjs", + "@npm//@angular-devkit/schematics", + "@npm//rxjs", ], ) @@ -37,6 +37,6 @@ jasmine_node_test( deps = [ ":test_lib", "//packages/elements/schematics:collection", - "@ngdeps//@schematics/angular", + "@npm//@schematics/angular", ], ) diff --git a/packages/elements/test/BUILD.bazel b/packages/elements/test/BUILD.bazel index 71bea73873..0749710747 100644 --- a/packages/elements/test/BUILD.bazel +++ b/packages/elements/test/BUILD.bazel @@ -14,7 +14,7 @@ ts_library( "//packages/platform-browser-dynamic", "//packages/platform-browser-dynamic/testing", "//packages/platform-browser/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -23,10 +23,10 @@ filegroup( testonly = True, # do not sort srcs = [ - "@ngdeps//node_modules/@webcomponents/custom-elements:src/native-shim.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/zone.js:dist/zone-testing.js", + "@npm//node_modules/@webcomponents/custom-elements:src/native-shim.js", + "@npm//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/zone-testing.js", ], ) diff --git a/packages/examples/common/BUILD.bazel b/packages/examples/common/BUILD.bazel index ce56d77001..ac61a89f2e 100644 --- a/packages/examples/common/BUILD.bazel +++ b/packages/examples/common/BUILD.bazel @@ -2,7 +2,7 @@ package(default_visibility = ["//visibility:public"]) load("//packages/bazel:index.bzl", "protractor_web_test_suite") load("//tools:defaults.bzl", "ng_module", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( name = "common_examples", @@ -18,7 +18,7 @@ ng_module( "//packages/platform-browser", "//packages/platform-browser-dynamic", "//packages/router", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -30,8 +30,8 @@ ts_library( deps = [ "//packages/examples/test-utils", "//packages/private/testing", - "@ngdeps//@types/jasminewd2", - "@ngdeps//protractor", + "@npm//@types/jasminewd2", + "@npm//protractor", ], ) @@ -41,14 +41,14 @@ ts_devserver( index_html = "//packages/examples:index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/zone.js", # This is needed because the "ngComponentOutlet" test uses the JIT compiler # and needs to be able to read metadata at runtime. - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], deps = [":common_examples"], ) @@ -60,7 +60,7 @@ protractor_web_test_suite( server = ":devserver", deps = [ ":common_tests_lib", - "@ngdeps//protractor", - "@ngdeps//selenium-webdriver", + "@npm//protractor", + "@npm//selenium-webdriver", ], ) diff --git a/packages/examples/core/BUILD.bazel b/packages/examples/core/BUILD.bazel index 99db5fcec3..81507b154c 100644 --- a/packages/examples/core/BUILD.bazel +++ b/packages/examples/core/BUILD.bazel @@ -2,7 +2,7 @@ package(default_visibility = ["//visibility:public"]) load("//packages/bazel:index.bzl", "protractor_web_test_suite") load("//tools:defaults.bzl", "jasmine_node_test", "ng_module", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( name = "core_examples", @@ -22,7 +22,7 @@ ng_module( "//packages/platform-browser-dynamic", "//packages/platform-browser/animations", "//packages/router", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -46,8 +46,8 @@ ts_library( tsconfig = "//packages/examples:tsconfig-e2e.json", deps = [ "//packages/examples/test-utils", - "@ngdeps//@types/jasminewd2", - "@ngdeps//protractor", + "@npm//@types/jasminewd2", + "@npm//protractor", ], ) @@ -57,12 +57,12 @@ ts_devserver( index_html = "//packages/examples:index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/zone.js:dist/task-tracking.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/task-tracking.js", ], deps = [":core_examples"], ) @@ -74,8 +74,8 @@ protractor_web_test_suite( server = ":devserver", deps = [ ":core_e2e_tests_lib", - "@ngdeps//protractor", - "@ngdeps//selenium-webdriver", + "@npm//protractor", + "@npm//selenium-webdriver", ], ) diff --git a/packages/examples/core/testing/ts/BUILD.bazel b/packages/examples/core/testing/ts/BUILD.bazel index 2fe7a63b68..cbfb89fcca 100644 --- a/packages/examples/core/testing/ts/BUILD.bazel +++ b/packages/examples/core/testing/ts/BUILD.bazel @@ -8,8 +8,8 @@ ts_library( ], deps = [ "//packages/core/testing", - "@ngdeps//@types/jasmine", - "@ngdeps//@types/node", + "@npm//@types/jasmine", + "@npm//@types/node", ], ) diff --git a/packages/examples/forms/BUILD.bazel b/packages/examples/forms/BUILD.bazel index ca51c39d24..7d602a4b1b 100644 --- a/packages/examples/forms/BUILD.bazel +++ b/packages/examples/forms/BUILD.bazel @@ -2,7 +2,7 @@ package(default_visibility = ["//visibility:public"]) load("//packages/bazel:index.bzl", "protractor_web_test_suite") load("//tools:defaults.bzl", "ng_module", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") ng_module( name = "forms_examples", @@ -18,7 +18,7 @@ ng_module( "//packages/platform-browser", "//packages/platform-browser-dynamic", "//packages/router", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) @@ -30,8 +30,8 @@ ts_library( deps = [ "//packages/examples/test-utils", "//packages/private/testing", - "@ngdeps//@types/jasminewd2", - "@ngdeps//protractor", + "@npm//@types/jasminewd2", + "@npm//protractor", ], ) @@ -41,11 +41,11 @@ ts_devserver( index_html = "//packages/examples:index.html", port = 4200, scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/zone.js", ], deps = [":forms_examples"], ) @@ -57,7 +57,7 @@ protractor_web_test_suite( server = ":devserver", deps = [ ":forms_e2e_tests_lib", - "@ngdeps//protractor", - "@ngdeps//selenium-webdriver", + "@npm//protractor", + "@npm//selenium-webdriver", ], ) diff --git a/packages/examples/test-utils/BUILD.bazel b/packages/examples/test-utils/BUILD.bazel index be2496ecae..87dae5608e 100644 --- a/packages/examples/test-utils/BUILD.bazel +++ b/packages/examples/test-utils/BUILD.bazel @@ -6,6 +6,6 @@ ts_library( name = "test-utils", srcs = ["index.ts"], deps = [ - "@ngdeps//@types/selenium-webdriver", + "@npm//@types/selenium-webdriver", ], ) diff --git a/packages/examples/testing/BUILD.bazel b/packages/examples/testing/BUILD.bazel index 00d2cae68d..887da4b1bb 100644 --- a/packages/examples/testing/BUILD.bazel +++ b/packages/examples/testing/BUILD.bazel @@ -7,7 +7,7 @@ ts_library( srcs = glob(["**/*.ts"]), tsconfig = "//packages:tsconfig-test", deps = [ - "@ngdeps//@types/jasmine", - "@ngdeps//@types/node", + "@npm//@types/jasmine", + "@npm//@types/node", ], ) diff --git a/packages/examples/upgrade/upgrade_example.bzl b/packages/examples/upgrade/upgrade_example.bzl index 471ef32bdd..ad1b2c2151 100644 --- a/packages/examples/upgrade/upgrade_example.bzl +++ b/packages/examples/upgrade/upgrade_example.bzl @@ -1,6 +1,6 @@ load("//packages/bazel:index.bzl", "protractor_web_test_suite") load("//tools:defaults.bzl", "ng_module", "ts_library") -load("@npm_bazel_typescript//:defs.bzl", "ts_devserver") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver") """ Macro that can be used to create the Bazel targets for an "upgrade" example. Since the @@ -16,7 +16,7 @@ def create_upgrade_example_targets(name, srcs, e2e_srcs, entry_module, assets = # TODO: FW-1004 Type checking is currently not complete. type_check = False, deps = [ - "@ngdeps//@types/angular", + "@npm//@types/angular", "//packages/core", "//packages/platform-browser", "//packages/platform-browser-dynamic", @@ -30,8 +30,8 @@ def create_upgrade_example_targets(name, srcs, e2e_srcs, entry_module, assets = srcs = e2e_srcs, testonly = True, deps = [ - "@ngdeps//@types/jasminewd2", - "@ngdeps//protractor", + "@npm//@types/jasminewd2", + "@npm//protractor", "//packages/examples/test-utils", "//packages/private/testing", ], @@ -43,13 +43,13 @@ def create_upgrade_example_targets(name, srcs, e2e_srcs, entry_module, assets = port = 4200, entry_module = entry_module, static_files = [ - "@ngdeps//node_modules/zone.js:dist/zone.js", - "@ngdeps//node_modules/angular:angular.js", - "@ngdeps//node_modules/reflect-metadata:Reflect.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/angular:angular.js", + "@npm//node_modules/reflect-metadata:Reflect.js", ], index_html = "//packages/examples:index.html", scripts = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], deps = [":%s_sources" % name], @@ -63,7 +63,7 @@ def create_upgrade_example_targets(name, srcs, e2e_srcs, entry_module, assets = server = ":devserver", deps = [ ":%s_e2e_lib" % name, - "@ngdeps//protractor", - "@ngdeps//selenium-webdriver", + "@npm//protractor", + "@npm//selenium-webdriver", ], ) diff --git a/packages/forms/BUILD.bazel b/packages/forms/BUILD.bazel index ec38d66fd6..0991d31aff 100644 --- a/packages/forms/BUILD.bazel +++ b/packages/forms/BUILD.bazel @@ -13,7 +13,7 @@ ng_module( deps = [ "//packages/core", "//packages/platform-browser", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/forms/test/BUILD.bazel b/packages/forms/test/BUILD.bazel index 3a5d16fdba..4f7e0b9109 100644 --- a/packages/forms/test/BUILD.bazel +++ b/packages/forms/test/BUILD.bazel @@ -13,7 +13,7 @@ ts_library( "//packages/platform-browser", "//packages/platform-browser/testing", "//packages/private/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/http/BUILD.bazel b/packages/http/BUILD.bazel index b43f975831..07a2745f80 100644 --- a/packages/http/BUILD.bazel +++ b/packages/http/BUILD.bazel @@ -14,7 +14,7 @@ ng_module( deps = [ "//packages/core", "//packages/platform-browser", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/http/test/BUILD.bazel b/packages/http/test/BUILD.bazel index df2af84980..3b398d41c6 100644 --- a/packages/http/test/BUILD.bazel +++ b/packages/http/test/BUILD.bazel @@ -13,7 +13,7 @@ ts_library( "//packages/http/testing", "//packages/platform-browser", "//packages/platform-browser/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/http/testing/BUILD.bazel b/packages/http/testing/BUILD.bazel index b2cfc00ea5..8c157f123c 100644 --- a/packages/http/testing/BUILD.bazel +++ b/packages/http/testing/BUILD.bazel @@ -11,6 +11,6 @@ ng_module( deps = [ "//packages/core", "//packages/http", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/language-service/BUILD.bazel b/packages/language-service/BUILD.bazel index e1c9a382c9..eba37455db 100644 --- a/packages/language-service/BUILD.bazel +++ b/packages/language-service/BUILD.bazel @@ -15,8 +15,8 @@ ts_library( "//packages/compiler", "//packages/compiler-cli", "//packages/core", - "@ngdeps//@types/node", - "@ngdeps//typescript", + "@npm//@types/node", + "@npm//typescript", ], ) diff --git a/packages/language-service/bundles/BUILD.bazel b/packages/language-service/bundles/BUILD.bazel index 951be9ef5e..7206dcc92b 100644 --- a/packages/language-service/bundles/BUILD.bazel +++ b/packages/language-service/bundles/BUILD.bazel @@ -12,7 +12,7 @@ ls_rollup_bundle( visibility = ["//packages/language-service:__pkg__"], deps = [ "//packages/language-service", - "@ngdeps//rxjs", - "@ngdeps//tslib", + "@npm//rxjs", + "@npm//tslib", ], ) diff --git a/packages/language-service/test/BUILD.bazel b/packages/language-service/test/BUILD.bazel index 7fbf945576..52501d9b0d 100644 --- a/packages/language-service/test/BUILD.bazel +++ b/packages/language-service/test/BUILD.bazel @@ -9,7 +9,7 @@ ts_library( "//packages/compiler", "//packages/compiler-cli/test:test_utils", "//packages/language-service", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/packages/platform-browser/BUILD.bazel b/packages/platform-browser/BUILD.bazel index 35ceb82f5f..ee29582837 100644 --- a/packages/platform-browser/BUILD.bazel +++ b/packages/platform-browser/BUILD.bazel @@ -15,8 +15,8 @@ ng_module( "//packages:types", "//packages/common", "//packages/core", - "@ngdeps//@types/hammerjs", - "@ngdeps//zone.js", + "@npm//@types/hammerjs", + "@npm//zone.js", ], ) diff --git a/packages/platform-browser/animations/test/BUILD.bazel b/packages/platform-browser/animations/test/BUILD.bazel index 16f6b1ce91..384641faf2 100644 --- a/packages/platform-browser/animations/test/BUILD.bazel +++ b/packages/platform-browser/animations/test/BUILD.bazel @@ -18,7 +18,7 @@ ts_library( "//packages/platform-browser/animations", "//packages/platform-browser/testing", "//packages/private/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/platform-browser/test/BUILD.bazel b/packages/platform-browser/test/BUILD.bazel index ea5827ec4a..8d4a83d79a 100644 --- a/packages/platform-browser/test/BUILD.bazel +++ b/packages/platform-browser/test/BUILD.bazel @@ -23,7 +23,7 @@ ts_library( "//packages/platform-browser/animations", "//packages/platform-browser/testing", "//packages/private/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/platform-browser/testing/BUILD.bazel b/packages/platform-browser/testing/BUILD.bazel index 85ebed9b67..89367aafe0 100644 --- a/packages/platform-browser/testing/BUILD.bazel +++ b/packages/platform-browser/testing/BUILD.bazel @@ -12,7 +12,7 @@ ng_module( "//packages/core", "//packages/core/testing", "//packages/platform-browser", - "@ngdeps//@types/jasmine", - "@ngdeps//rxjs", + "@npm//@types/jasmine", + "@npm//rxjs", ], ) diff --git a/packages/platform-server/BUILD.bazel b/packages/platform-server/BUILD.bazel index b94304cc54..d3a9194f42 100644 --- a/packages/platform-server/BUILD.bazel +++ b/packages/platform-server/BUILD.bazel @@ -21,9 +21,9 @@ ng_module( "//packages/platform-browser", "//packages/platform-browser-dynamic", "//packages/platform-browser/animations", - "@ngdeps//@types/node", - "@ngdeps//rxjs", - "@ngdeps//zone.js", + "@npm//@types/node", + "@npm//rxjs", + "@npm//zone.js", ], ) diff --git a/packages/platform-server/test/BUILD.bazel b/packages/platform-server/test/BUILD.bazel index 263a5d47ee..c71f1377cd 100644 --- a/packages/platform-server/test/BUILD.bazel +++ b/packages/platform-server/test/BUILD.bazel @@ -18,7 +18,7 @@ ts_library( "//packages/platform-browser", "//packages/platform-server", "//packages/private/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/platform-webworker/BUILD.bazel b/packages/platform-webworker/BUILD.bazel index d3a1057105..c98457f8f0 100644 --- a/packages/platform-webworker/BUILD.bazel +++ b/packages/platform-webworker/BUILD.bazel @@ -17,7 +17,7 @@ ng_module( "//packages/compiler", "//packages/core", "//packages/platform-browser", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/router/BUILD.bazel b/packages/router/BUILD.bazel index 97e0c52a3c..59ee3d3920 100644 --- a/packages/router/BUILD.bazel +++ b/packages/router/BUILD.bazel @@ -14,7 +14,7 @@ ng_module( "//packages/common", "//packages/core", "//packages/platform-browser", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/router/test/BUILD.bazel b/packages/router/test/BUILD.bazel index 49fcf3253d..b19f104576 100644 --- a/packages/router/test/BUILD.bazel +++ b/packages/router/test/BUILD.bazel @@ -17,7 +17,7 @@ ts_library( "//packages/private/testing", "//packages/router", "//packages/router/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/router/test/aot_ngsummary_test/BUILD.bazel b/packages/router/test/aot_ngsummary_test/BUILD.bazel index 5a4b60bf49..7f8646ada7 100644 --- a/packages/router/test/aot_ngsummary_test/BUILD.bazel +++ b/packages/router/test/aot_ngsummary_test/BUILD.bazel @@ -7,7 +7,7 @@ ng_module( deps = [ "//packages/core", "//packages/router", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/router/testing/BUILD.bazel b/packages/router/testing/BUILD.bazel index 5061eeeec6..9e0b86acda 100644 --- a/packages/router/testing/BUILD.bazel +++ b/packages/router/testing/BUILD.bazel @@ -12,6 +12,6 @@ ng_module( "//packages/common/testing", "//packages/core", "//packages/router", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/service-worker/BUILD.bazel b/packages/service-worker/BUILD.bazel index 7eb0955228..3d5a85bdfe 100644 --- a/packages/service-worker/BUILD.bazel +++ b/packages/service-worker/BUILD.bazel @@ -14,7 +14,7 @@ ng_module( deps = [ "//packages/common", "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/service-worker/cli/BUILD.bazel b/packages/service-worker/cli/BUILD.bazel index ce2c48bee4..54b5e85e5e 100644 --- a/packages/service-worker/cli/BUILD.bazel +++ b/packages/service-worker/cli/BUILD.bazel @@ -10,7 +10,7 @@ ts_library( tsconfig = ":tsconfig.json", deps = [ "//packages/service-worker/config", - "@ngdeps//@types/node", + "@npm//@types/node", ], ) diff --git a/packages/service-worker/test/BUILD.bazel b/packages/service-worker/test/BUILD.bazel index 42831ca6be..05ee1eb951 100644 --- a/packages/service-worker/test/BUILD.bazel +++ b/packages/service-worker/test/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( "//packages/service-worker/testing", "//packages/service-worker/worker", "//packages/service-worker/worker/testing", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/service-worker/testing/BUILD.bazel b/packages/service-worker/testing/BUILD.bazel index 25b06c37e3..629685fc32 100644 --- a/packages/service-worker/testing/BUILD.bazel +++ b/packages/service-worker/testing/BUILD.bazel @@ -8,6 +8,6 @@ ng_module( srcs = glob(["**/*.ts"]), deps = [ "//packages/core", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/service-worker/worker/BUILD.bazel b/packages/service-worker/worker/BUILD.bazel index c4ec4e90c6..136ffb2fad 100644 --- a/packages/service-worker/worker/BUILD.bazel +++ b/packages/service-worker/worker/BUILD.bazel @@ -12,7 +12,7 @@ ts_library( exclude = ["main.ts"], ), tsconfig = ":tsconfig.json", - deps = ["@ngdeps//@types/node"], + deps = ["@npm//@types/node"], ) ts_library( diff --git a/packages/service-worker/worker/testing/BUILD.bazel b/packages/service-worker/worker/testing/BUILD.bazel index 1c98b537da..47ceea0d7a 100644 --- a/packages/service-worker/worker/testing/BUILD.bazel +++ b/packages/service-worker/worker/testing/BUILD.bazel @@ -10,6 +10,6 @@ ts_library( "//packages:types", "//packages/core", "//packages/service-worker/worker", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/upgrade/BUILD.bazel b/packages/upgrade/BUILD.bazel index af9f35723a..5b15383918 100644 --- a/packages/upgrade/BUILD.bazel +++ b/packages/upgrade/BUILD.bazel @@ -16,7 +16,7 @@ ng_module( "//packages/core", "//packages/platform-browser", "//packages/platform-browser-dynamic", - "@ngdeps//zone.js", + "@npm//zone.js", ], ) diff --git a/packages/upgrade/test/BUILD.bazel b/packages/upgrade/test/BUILD.bazel index d36a265c91..48cc479d08 100644 --- a/packages/upgrade/test/BUILD.bazel +++ b/packages/upgrade/test/BUILD.bazel @@ -13,7 +13,7 @@ ts_library( "//packages/platform-browser/testing", "//packages/upgrade", "//packages/upgrade/static", - "@ngdeps//rxjs", + "@npm//rxjs", ], ) diff --git a/packages/upgrade/test/common/test_helpers.ts b/packages/upgrade/test/common/test_helpers.ts index 8ee147d91d..2880e6f9b6 100644 --- a/packages/upgrade/test/common/test_helpers.ts +++ b/packages/upgrade/test/common/test_helpers.ts @@ -89,7 +89,7 @@ export function createWithEachNg1VersionFn(setNg1: typeof setAngularJSGlobal) { document.body.removeChild(script); resolve(); }; - script.src = `base/ngdeps/node_modules/${file}`; + script.src = `base/npm/node_modules/${file}`; document.body.appendChild(script); })), Promise.resolve()) diff --git a/tools/BUILD.bazel b/tools/BUILD.bazel index 83e4953fa9..85fb872a35 100644 --- a/tools/BUILD.bazel +++ b/tools/BUILD.bazel @@ -1,6 +1,6 @@ package(default_visibility = ["//visibility:public"]) -load("@npm_bazel_typescript//:defs.bzl", "ts_config") +load("@npm_bazel_typescript//:index.bzl", "ts_config") exports_files([ "tsconfig.json", diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 776cd8c555..846dcd4c86 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -2,15 +2,13 @@ load("@build_bazel_rules_nodejs//:defs.bzl", _nodejs_binary = "nodejs_binary", _npm_package = "npm_package") load("@npm_bazel_jasmine//:index.bzl", _jasmine_node_test = "jasmine_node_test") -load("@npm_bazel_karma//:defs.bzl", _karma_web_test = "karma_web_test", _karma_web_test_suite = "karma_web_test_suite", _ts_web_test = "ts_web_test", _ts_web_test_suite = "ts_web_test_suite") -load("@npm_bazel_typescript//:defs.bzl", _ts_library = "ts_library") +load("@npm_bazel_karma//:index.bzl", _karma_web_test = "karma_web_test", _karma_web_test_suite = "karma_web_test_suite", _ts_web_test = "ts_web_test", _ts_web_test_suite = "ts_web_test_suite") +load("@npm_bazel_typescript//:index.bzl", _ts_library = "ts_library") load("//packages/bazel:index.bzl", _ng_module = "ng_module", _ng_package = "ng_package") load("//packages/bazel/src:ng_rollup_bundle.bzl", _ng_rollup_bundle = "ng_rollup_bundle") _DEFAULT_TSCONFIG_BUILD = "//packages:tsconfig-build.json" _DEFAULT_TSCONFIG_TEST = "//packages:tsconfig-test" -_DEFAULT_TS_TYPINGS = "@ngdeps//typescript:typescript__typings" -_DEFAULT_KARMA_BIN = "@ngdeps//@bazel/karma/bin:karma" _INTERNAL_NG_MODULE_COMPILER = "//packages/bazel/src/ngc-wrapped" _INTERNAL_NG_MODULE_XI18N = "//packages/bazel/src/ngc-wrapped:xi18n" _INTERNAL_NG_PACKAGER_PACKAGER = "//packages/bazel/src/ng_package:packager" @@ -79,11 +77,11 @@ def _default_module_name(testonly): def ts_library(tsconfig = None, testonly = False, deps = [], module_name = None, **kwargs): """Default values for ts_library""" - deps = deps + ["@ngdeps//tslib"] + deps = deps + ["@npm//tslib"] if testonly: # Match the types[] in //packages:tsconfig-test.json - deps.append("@ngdeps//@types/jasmine") - deps.append("@ngdeps//@types/node") + deps.append("@npm//@types/jasmine") + deps.append("@npm//@types/node") if not tsconfig: if testonly: tsconfig = _DEFAULT_TSCONFIG_TEST @@ -97,18 +95,17 @@ def ts_library(tsconfig = None, testonly = False, deps = [], module_name = None, tsconfig = tsconfig, testonly = testonly, deps = deps, - node_modules = _DEFAULT_TS_TYPINGS, module_name = module_name, **kwargs ) def ng_module(name, tsconfig = None, entry_point = None, testonly = False, deps = [], module_name = None, **kwargs): """Default values for ng_module""" - deps = deps + ["@ngdeps//tslib"] + deps = deps + ["@npm//tslib"] if testonly: # Match the types[] in //packages:tsconfig-test.json - deps.append("@ngdeps//@types/jasmine") - deps.append("@ngdeps//@types/node") + deps.append("@npm//@types/jasmine") + deps.append("@npm//@types/node") if not tsconfig: if testonly: tsconfig = _DEFAULT_TSCONFIG_TEST @@ -127,7 +124,6 @@ def ng_module(name, tsconfig = None, entry_point = None, testonly = False, deps deps = deps, compiler = _INTERNAL_NG_MODULE_COMPILER, ng_xi18n = _INTERNAL_NG_MODULE_XI18N, - node_modules = _DEFAULT_TS_TYPINGS, module_name = module_name, **kwargs ) @@ -139,7 +135,7 @@ def ng_package(name, readme_md = None, license_banner = None, deps = [], **kwarg if not license_banner: license_banner = "//packages:license-banner.txt" deps = deps + [ - "@ngdeps//tslib", + "@npm//tslib", ] _ng_package( @@ -165,7 +161,7 @@ def ts_web_test(bootstrap = [], deps = [], runtime_deps = [], **kwargs): if not bootstrap: bootstrap = ["//:web_test_bootstrap_scripts"] local_deps = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ] + deps local_runtime_deps = [ @@ -176,7 +172,6 @@ def ts_web_test(bootstrap = [], deps = [], runtime_deps = [], **kwargs): runtime_deps = local_runtime_deps, bootstrap = bootstrap, deps = local_deps, - karma = _DEFAULT_KARMA_BIN, **kwargs ) @@ -185,7 +180,7 @@ def ts_web_test_suite(bootstrap = [], deps = [], runtime_deps = [], **kwargs): if not bootstrap: bootstrap = ["//:web_test_bootstrap_scripts"] local_deps = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ] + deps local_runtime_deps = [ @@ -196,7 +191,6 @@ def ts_web_test_suite(bootstrap = [], deps = [], runtime_deps = [], **kwargs): runtime_deps = local_runtime_deps, bootstrap = bootstrap, deps = local_deps, - karma = _DEFAULT_KARMA_BIN, # Run unit tests on local Chromium by default. # You can exclude tests based on tags, e.g. to skip Firefox testing, # `yarn bazel test --test_tag_filters=-browser:firefox-local [targets]` @@ -216,8 +210,8 @@ def karma_web_test(bootstrap = [], deps = [], data = [], runtime_deps = [], **kw if not bootstrap: bootstrap = ["//:web_test_bootstrap_scripts"] local_deps = [ - "@ngdeps//karma-browserstack-launcher", - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//karma-browserstack-launcher", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ] + deps local_runtime_deps = [ @@ -229,7 +223,6 @@ def karma_web_test(bootstrap = [], deps = [], data = [], runtime_deps = [], **kw bootstrap = bootstrap, config_file = "//:karma-js.conf.js", deps = local_deps, - karma = _DEFAULT_KARMA_BIN, data = data + [ "//:browser-providers.conf.js", "//tools:jasmine-seed-generator.js", @@ -243,14 +236,13 @@ def karma_web_test_suite(bootstrap = [], deps = [], **kwargs): if not bootstrap: bootstrap = ["//:web_test_bootstrap_scripts"] local_deps = [ - "@ngdeps//node_modules/tslib:tslib.js", + "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ] + deps _karma_web_test_suite( bootstrap = bootstrap, deps = local_deps, - karma = _DEFAULT_KARMA_BIN, # Run unit tests on local Chromium by default. # You can exclude tests based on tags, e.g. to skip Firefox testing, # `yarn bazel test --test_tag_filters=-browser:firefox-local [targets]` @@ -270,7 +262,7 @@ def nodejs_binary(data = [], **kwargs): _nodejs_binary( # Pass-thru --define=compile=foo as an environment variable configuration_env_vars = ["compile"], - data = data + ["@ngdeps//source-map-support"], + data = data + ["@npm//source-map-support"], **kwargs ) @@ -278,28 +270,28 @@ def jasmine_node_test(deps = [], **kwargs): """Default values for jasmine_node_test""" deps = deps + [ # Very common dependencies for tests - "@ngdeps//chokidar", - "@ngdeps//domino", - "@ngdeps//jasmine-core", - "@ngdeps//mock-fs", - "@ngdeps//reflect-metadata", - "@ngdeps//source-map-support", - "@ngdeps//tslib", - "@ngdeps//xhr2", + "@npm//chokidar", + "@npm//domino", + "@npm//jasmine-core", + "@npm//mock-fs", + "@npm//reflect-metadata", + "@npm//source-map-support", + "@npm//tslib", + "@npm//xhr2", ] _jasmine_node_test( deps = deps, # Pass-thru --define=compile=foo as an environment variable configuration_env_vars = ["compile"], - jasmine = "@ngdeps//jasmine", + jasmine = "@npm//jasmine", **kwargs ) def ng_rollup_bundle(deps = [], **kwargs): """Default values for ng_rollup_bundle""" deps = deps + [ - "@ngdeps//tslib", - "@ngdeps//reflect-metadata", + "@npm//tslib", + "@npm//reflect-metadata", ] _ng_rollup_bundle( deps = deps, diff --git a/tools/ng_setup_workspace.bzl b/tools/ng_setup_workspace.bzl deleted file mode 100644 index 259c96af1a..0000000000 --- a/tools/ng_setup_workspace.bzl +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright Google Inc. All Rights Reserved. -# -# Use of this source code is governed by an MIT-style license that can be -# found in the LICENSE file at https://angular.io/license - -"Install angular source dependencies" - -load("@angular//packages/bazel/src:ng_setup_workspace.bzl", _ng_setup_workspace = "ng_setup_workspace") -load("@build_bazel_rules_nodejs//:defs.bzl", "yarn_install") -load("@build_bazel_rules_nodejs//:package.bzl", "check_rules_nodejs_version") - -def ng_setup_workspace(): - """This repository rule should be called from your WORKSPACE file. - - It creates some additional Bazel external repositories that are used internally - to build angular - """ - - # The NodeJS rules version must be at least v0.15.3 because: - # - 0.15.2 Re-introduced the prod_only attribute on yarn_install - # - 0.15.3 Includes a fix for the `jasmine_node_test` rule ignoring target tags - # - 0.16.8 Supports npm installed bazel workspaces - check_rules_nodejs_version("0.16.8") - - yarn_install( - name = "ngdeps", - package_json = "@angular//:package.json", - yarn_lock = "@angular//:yarn.lock", - data = ["@angular//:tools/yarn/check-yarn.js", "@angular//:tools/postinstall-patches.js"], - # Don't install devDependencies, they are large and not used under Bazel - prod_only = True, - ) - - yarn_install( - name = "ts-api-guardian_deps", - package_json = "@angular//tools/ts-api-guardian:package.json", - yarn_lock = "@angular//tools/ts-api-guardian:yarn.lock", - ) - - yarn_install( - name = "http-server_runtime_deps", - package_json = "@angular//tools/http-server:package.json", - yarn_lock = "@angular//tools/http-server:yarn.lock", - ) - - _ng_setup_workspace() diff --git a/tools/npm/@angular_bazel/index.js b/tools/npm/@angular_bazel/index.js new file mode 100755 index 0000000000..f587267587 --- /dev/null +++ b/tools/npm/@angular_bazel/index.js @@ -0,0 +1 @@ +throw new Error('should never be run'); \ No newline at end of file diff --git a/tools/npm/@angular_bazel/package.json b/tools/npm/@angular_bazel/package.json new file mode 100644 index 0000000000..99c97e797b --- /dev/null +++ b/tools/npm/@angular_bazel/package.json @@ -0,0 +1,6 @@ +{ + "version": "0.0.0", + "bin": { + "ngc-wrapped": "./index.js" + } +} diff --git a/tools/npm_workspace/@angular/bazel/BUILD.bazel b/tools/npm_workspace/@angular/bazel/BUILD.bazel deleted file mode 100644 index c7f3bdf55b..0000000000 --- a/tools/npm_workspace/@angular/bazel/BUILD.bazel +++ /dev/null @@ -1,8 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -# Empty filegroup here so that @npm//@angular/bazel is a valid Bazel target -# for the @angular//:@angular/bazel/ngc-wrapped target -filegroup( - name = "bazel", - srcs = [], -) diff --git a/tools/npm_workspace/@bazel/typescript/BUILD.bazel b/tools/npm_workspace/@bazel/typescript/BUILD.bazel deleted file mode 100644 index 0f51acdf28..0000000000 --- a/tools/npm_workspace/@bazel/typescript/BUILD.bazel +++ /dev/null @@ -1,8 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -# Alias here so that @npm//@bazel/typescript is a valid Bazel target -# which is reference in npm_bazel_typescript/BUILD.bazel -alias( - name = "typescript", - actual = "@ngdeps//@bazel/typescript", -) diff --git a/tools/npm_workspace/@bazel/typescript/bin/BUILD.bazel b/tools/npm_workspace/@bazel/typescript/bin/BUILD.bazel deleted file mode 100644 index a37485571a..0000000000 --- a/tools/npm_workspace/@bazel/typescript/bin/BUILD.bazel +++ /dev/null @@ -1,7 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -# Alias here so that references actual in @ngdeps -alias( - name = "tsc_wrapped", - actual = "@ngdeps//@bazel/typescript/bin:tsc_wrapped", -) diff --git a/tools/npm_workspace/BUILD.bazel b/tools/npm_workspace/BUILD.bazel deleted file mode 100644 index f8b3c38bd8..0000000000 --- a/tools/npm_workspace/BUILD.bazel +++ /dev/null @@ -1 +0,0 @@ -# Marker file that this directory is a bazel package diff --git a/tools/npm_workspace/WORKSPACE b/tools/npm_workspace/WORKSPACE deleted file mode 100644 index d1060be5c5..0000000000 --- a/tools/npm_workspace/WORKSPACE +++ /dev/null @@ -1 +0,0 @@ -workspace(name = "npm") diff --git a/tools/rxjs/BUILD.bazel b/tools/rxjs/BUILD.bazel index 4e99bafd17..ea1510c40e 100644 --- a/tools/rxjs/BUILD.bazel +++ b/tools/rxjs/BUILD.bazel @@ -4,6 +4,6 @@ filegroup( name = "rxjs_umd_modules", srcs = [ ":rxjs_shims.js", - "@ngdeps//node_modules/rxjs:bundles/rxjs.umd.js", + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", ], ) diff --git a/tools/symbol-extractor/BUILD.bazel b/tools/symbol-extractor/BUILD.bazel index 68945a07dd..8cd5f39c3e 100644 --- a/tools/symbol-extractor/BUILD.bazel +++ b/tools/symbol-extractor/BUILD.bazel @@ -14,7 +14,7 @@ ts_library( ), deps = [ "//packages:types", - "@ngdeps//typescript", + "@npm//typescript", ], ) @@ -28,7 +28,7 @@ ts_library( deps = [ ":lib", "//packages:types", - "@ngdeps//typescript", + "@npm//typescript", ], ) diff --git a/tools/symbol-extractor/index.bzl b/tools/symbol-extractor/index.bzl index 07e6247d96..3a59ce2a21 100644 --- a/tools/symbol-extractor/index.bzl +++ b/tools/symbol-extractor/index.bzl @@ -18,7 +18,7 @@ def js_expected_symbol_test(name, src, golden, data = [], **kwargs): golden, Label("//tools/symbol-extractor:lib"), Label("@bazel_tools//tools/bash/runfiles"), - Label("@ngdeps//typescript"), + Label("@npm//typescript"), ] entry_point = "angular/tools/symbol-extractor/cli.js" diff --git a/tools/testing/BUILD.bazel b/tools/testing/BUILD.bazel index 2f0d7bf928..0df9a118a1 100644 --- a/tools/testing/BUILD.bazel +++ b/tools/testing/BUILD.bazel @@ -23,7 +23,7 @@ ts_library( "//packages/core/testing", "//packages/platform-server", "//packages/platform-server/testing", - "@ngdeps//domino", + "@npm//domino", ], ) diff --git a/tools/ts-api-guardian/BUILD.bazel b/tools/ts-api-guardian/BUILD.bazel index eb6c2f2f07..80e976a93e 100644 --- a/tools/ts-api-guardian/BUILD.bazel +++ b/tools/ts-api-guardian/BUILD.bazel @@ -3,7 +3,7 @@ load( "jasmine_node_test", "npm_package", ) -load("@npm_bazel_typescript//:defs.bzl", "ts_library") +load("@npm_bazel_typescript//:index.bzl", "ts_library") exports_files(["bin/ts-api-guardian"]) diff --git a/yarn.lock b/yarn.lock index 2f4acfb2ed..b39656d38e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -39,6 +39,9 @@ "@angular-devkit/core" "7.3.2" rxjs "6.3.3" +"@angular/bazel@file:./tools/npm/@angular_bazel": + version "0.0.0" + "@angular/cli@^7.3.2": version "7.3.2" resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.3.2.tgz#2664bfa5b00259440066a5cf851c74f6099dd4f9" @@ -105,17 +108,17 @@ resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.9.0.tgz#fd60023acd36313d304cc2f8c2e181b88b5445cd" integrity sha512-E31cefDcdJsx/oii6p/gqKZXSVw0kEg1O73DD2McFcSvnf/p1GYWcQtVgdRQmlviBEytJkJgdX8rtThitRvcow== -"@bazel/jasmine@0.26.0-beta.0": - version "0.26.0-beta.0" - resolved "https://registry.yarnpkg.com/@bazel/jasmine/-/jasmine-0.26.0-beta.0.tgz#77243fea16dd7b31c60e0aa78bb89b7dcf0a9443" - integrity sha512-6dTuxGitXP6VcmgNwB9D9KqatDGX+Xw9GXDTJNnAT7wNDaakggiRg1ocLe8/xDMB+EXVg1qKOKS5NhZYHq3jVQ== +"@bazel/jasmine@0.26.0": + version "0.26.0" + resolved "https://registry.yarnpkg.com/@bazel/jasmine/-/jasmine-0.26.0.tgz#f7aed169b057b5af547d2573657b394ecbda0b5d" + integrity sha512-lkvzPHdbSEe1zitnV1hIBwodriXqp/ClHSZQJ5Y486UaLQ6Sm7k7gV2phOwtg7LqLVZnElZDmFLSI0/O1UYYyQ== dependencies: jasmine "~3.3.1" -"@bazel/karma@0.26.0-beta.0": - version "0.26.0-beta.0" - resolved "https://registry.yarnpkg.com/@bazel/karma/-/karma-0.26.0-beta.0.tgz#0a83bac1adaa0cfec8e3fb4acb49d02e05b141ed" - integrity sha512-N2doztMGN6TMT3Gi4R4dfB7ypZI4tF3U1HG09lP7MVmr46czVNp/lwTnjyfJgbababYBfhiGgrXD9VOC9QqKnA== +"@bazel/karma@0.26.0": + version "0.26.0" + resolved "https://registry.yarnpkg.com/@bazel/karma/-/karma-0.26.0.tgz#6ad796686f5775df33a96fa5ef3df76a66aed3b2" + integrity sha512-yZv0fgAjVrfrM0ld8e+wNaPIpYCpwBzVQi2GUErsKStUZXPUUofpBwBjlYsdY1Osn5/FmAF9e6xDkk1JWn/wSg== dependencies: jasmine-core "2.8.0" karma "^4.0.0" @@ -129,10 +132,10 @@ semver "5.6.0" tmp "0.0.33" -"@bazel/typescript@0.26.0-beta.0": - version "0.26.0-beta.0" - resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.26.0-beta.0.tgz#aa025951563f47baca302c8ebcf24eb596724426" - integrity sha512-Ot7k3sfLQAdf14IDmsc6wSgfySctJdW6Uwg7YmD4Zv1sGWkjKaWEtQDFgjtf5kEgFpC0aeM5uK+heqz1CC+VcQ== +"@bazel/typescript@0.26.0": + version "0.26.0" + resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.26.0.tgz#c06139d76c8b9d3a3ed98a721b776fedb4b11c82" + integrity sha512-dh/Y/SZzmeChsLap8FVHYl0FuaeLh/6t9WBVhm5nOgyVrqfEyVpNzy4W20E4NqnmJY2/PqmD5qncf+Oo1q9h1A== dependencies: jasmine-core "2.8.0" protobufjs "5.0.3" From 8cd72441f105f8e67b9d150bd49583f7fb9c775c Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Wed, 27 Feb 2019 14:32:43 -0800 Subject: [PATCH 0176/1073] style: add file header (#28871) PR Close #28871 --- tools/npm/@angular_bazel/index.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/tools/npm/@angular_bazel/index.js b/tools/npm/@angular_bazel/index.js index f587267587..f06914f2b7 100755 --- a/tools/npm/@angular_bazel/index.js +++ b/tools/npm/@angular_bazel/index.js @@ -1 +1,14 @@ -throw new Error('should never be run'); \ No newline at end of file +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +/** + * @fileoverview This files is only here so that @npm//@angular/bazel/bin:ngc-wrapped + * is a valid target as it is part of `esm5_outputs_aspect` in /packages/bazel/src/esm5.bzl + * TODO(gregmagolan): fix esm5_outputs_aspect so that this is not required + */ + +throw new Error('should never be run'); From 4a1640bdd538c482f08eb283b76922724e86ce18 Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Wed, 27 Feb 2019 14:38:45 -0800 Subject: [PATCH 0177/1073] build: minimum version of rules_nodejs is now 0.26.0 (#28871) PR Close #28871 --- WORKSPACE | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/WORKSPACE b/WORKSPACE index 2743d71434..22f3ee5d41 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -41,7 +41,8 @@ Try running `yarn bazel` instead. # - 0.15.2 Re-introduced the prod_only attribute on yarn_install # - 0.15.3 Includes a fix for the `jasmine_node_test` rule ignoring target tags # - 0.16.8 Supports npm installed bazel workspaces -check_rules_nodejs_version("0.16.8") +# - 0.26.0 Fix for data files in yarn_install and npm_install +check_rules_nodejs_version("0.26.0") # Setup the Node.js toolchain node_repositories( From 9fe522f3e2787a7cfcf24f94b5f0243e8ea6b591 Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Wed, 27 Feb 2019 14:58:18 -0800 Subject: [PATCH 0178/1073] build: yarn.lock updates (#28871) PR Close #28871 --- integration/bazel-schematics/yarn.lock | 12 +++---- integration/bazel/src/yarn.lock | 50 +++++++++++++------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/integration/bazel-schematics/yarn.lock b/integration/bazel-schematics/yarn.lock index 98cf4a6441..7166969da7 100644 --- a/integration/bazel-schematics/yarn.lock +++ b/integration/bazel-schematics/yarn.lock @@ -49,12 +49,12 @@ rxjs "6.3.3" "@angular/bazel@file:../../dist/packages-dist/bazel": - version "8.0.0-beta.5" + version "8.0.0-beta.6" dependencies: "@angular-devkit/architect" "^0.10.6" "@angular-devkit/core" "^7.0.4" "@angular-devkit/schematics" "^7.3.0-rc.0" - "@bazel/typescript" "^0.25.1" + "@bazel/typescript" "^0.26.0" "@microsoft/api-extractor" "^7.0.17" "@schematics/angular" "^7.0.4" "@types/node" "6.0.84" @@ -101,10 +101,10 @@ "@bazel/bazel-linux_x64" "0.22.0" "@bazel/bazel-win32_x64" "0.22.0" -"@bazel/typescript@^0.25.1": - version "0.25.1" - resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.25.1.tgz#71564de50ff6976fb37d90f2f7a479e87b158943" - integrity sha512-QFitUUXIWQMfVk5EwI9J9d5iNPfT+kUjPbahiJbJVZz1Fz9zNZ8+CR6FESfnxuUKlZK3Oy0VWFcz7mlHaceL/Q== +"@bazel/typescript@^0.26.0": + version "0.26.0" + resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.26.0.tgz#c06139d76c8b9d3a3ed98a721b776fedb4b11c82" + integrity sha512-dh/Y/SZzmeChsLap8FVHYl0FuaeLh/6t9WBVhm5nOgyVrqfEyVpNzy4W20E4NqnmJY2/PqmD5qncf+Oo1q9h1A== dependencies: jasmine-core "2.8.0" protobufjs "5.0.3" diff --git a/integration/bazel/src/yarn.lock b/integration/bazel/src/yarn.lock index f534008750..a2772b63de 100644 --- a/integration/bazel/src/yarn.lock +++ b/integration/bazel/src/yarn.lock @@ -59,18 +59,18 @@ "@angular-devkit/core" "7.3.3" rxjs "6.3.3" -"@angular/animations@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/animations": - version "8.0.0-beta.5" +"@angular/animations@file:../../../../../../../Users/greg/google/gregmagolan/angular-2/dist/packages-dist/animations": + version "8.0.0-beta.6" dependencies: tslib "^1.9.0" -"@angular/bazel@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/bazel": - version "8.0.0-beta.5" +"@angular/bazel@file:../../../../../../../Users/greg/google/gregmagolan/angular-2/dist/packages-dist/bazel": + version "8.0.0-beta.6" dependencies: "@angular-devkit/architect" "^0.10.6" "@angular-devkit/core" "^7.0.4" "@angular-devkit/schematics" "^7.3.0-rc.0" - "@bazel/typescript" "^0.25.1" + "@bazel/typescript" "^0.26.0" "@microsoft/api-extractor" "^7.0.17" "@schematics/angular" "^7.0.4" "@types/node" "6.0.84" @@ -78,13 +78,13 @@ shelljs "0.8.2" tsickle "0.34.0" -"@angular/common@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/common": - version "8.0.0-beta.5" +"@angular/common@file:../../../../../../../Users/greg/google/gregmagolan/angular-2/dist/packages-dist/common": + version "8.0.0-beta.6" dependencies: tslib "^1.9.0" -"@angular/compiler-cli@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/compiler-cli": - version "8.0.0-beta.5" +"@angular/compiler-cli@file:../../../../../../../Users/greg/google/gregmagolan/angular-2/dist/packages-dist/compiler-cli": + version "8.0.0-beta.6" dependencies: canonical-path "1.0.0" chokidar "^2.1.1" @@ -98,30 +98,30 @@ tslib "^1.9.0" yargs "9.0.1" -"@angular/compiler@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/compiler": - version "8.0.0-beta.5" +"@angular/compiler@file:../../../../../../../Users/greg/google/gregmagolan/angular-2/dist/packages-dist/compiler": + version "8.0.0-beta.6" dependencies: tslib "^1.9.0" -"@angular/core@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/core": - version "8.0.0-beta.5" +"@angular/core@file:../../../../../../../Users/greg/google/gregmagolan/angular-2/dist/packages-dist/core": + version "8.0.0-beta.6" dependencies: tslib "^1.9.0" -"@angular/platform-browser-dynamic@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/platform-browser-dynamic": - version "8.0.0-beta.5" +"@angular/platform-browser-dynamic@file:../../../../../../../Users/greg/google/gregmagolan/angular-2/dist/packages-dist/platform-browser-dynamic": + version "8.0.0-beta.6" dependencies: tslib "^1.9.0" -"@angular/platform-browser@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/platform-browser": - version "8.0.0-beta.5" +"@angular/platform-browser@file:../../../../../../../Users/greg/google/gregmagolan/angular-2/dist/packages-dist/platform-browser": + version "8.0.0-beta.6" dependencies: tslib "^1.9.0" -"@bazel/karma@0.25.1": - version "0.25.1" - resolved "https://registry.yarnpkg.com/@bazel/karma/-/karma-0.25.1.tgz#246286299b6e96fa4a91d240d3c3d7386164adaf" - integrity sha512-e5qyZkeHdxEYTIcHg04pmPF1SR8jy8I1mQLgDxX6NJDVx3JT7iIFeISqlS8hjBiykyX/XZ0CsVzkKYU/sG3ilg== +"@bazel/karma@0.26.0": + version "0.26.0" + resolved "https://registry.yarnpkg.com/@bazel/karma/-/karma-0.26.0.tgz#6ad796686f5775df33a96fa5ef3df76a66aed3b2" + integrity sha512-yZv0fgAjVrfrM0ld8e+wNaPIpYCpwBzVQi2GUErsKStUZXPUUofpBwBjlYsdY1Osn5/FmAF9e6xDkk1JWn/wSg== dependencies: jasmine-core "2.8.0" karma "^4.0.0" @@ -135,10 +135,10 @@ semver "5.6.0" tmp "0.0.33" -"@bazel/typescript@0.25.1", "@bazel/typescript@^0.25.1": - version "0.25.1" - resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.25.1.tgz#71564de50ff6976fb37d90f2f7a479e87b158943" - integrity sha512-QFitUUXIWQMfVk5EwI9J9d5iNPfT+kUjPbahiJbJVZz1Fz9zNZ8+CR6FESfnxuUKlZK3Oy0VWFcz7mlHaceL/Q== +"@bazel/typescript@^0.26.0": + version "0.26.0" + resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.26.0.tgz#c06139d76c8b9d3a3ed98a721b776fedb4b11c82" + integrity sha512-dh/Y/SZzmeChsLap8FVHYl0FuaeLh/6t9WBVhm5nOgyVrqfEyVpNzy4W20E4NqnmJY2/PqmD5qncf+Oo1q9h1A== dependencies: jasmine-core "2.8.0" protobufjs "5.0.3" From c532646f5b3cf35260708013a20881495d665e03 Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Thu, 28 Feb 2019 09:47:39 -0800 Subject: [PATCH 0179/1073] fix(bazel): ng serve should always watch (#29032) PR Close #29032 --- packages/bazel/src/schematics/ng-add/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/bazel/src/schematics/ng-add/index.ts b/packages/bazel/src/schematics/ng-add/index.ts index 32730aaedb..235faffde6 100755 --- a/packages/bazel/src/schematics/ng-add/index.ts +++ b/packages/bazel/src/schematics/ng-add/index.ts @@ -143,6 +143,7 @@ function updateAngularJsonToUseBazelBuilder(options: Schema): Rule { options: { targetLabel: '//src:devserver', bazelCommand: 'run', + watch: true, }, configurations: { production: { From 0bc26fc4e8768acd6c19366d928e061c06195620 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Tue, 26 Feb 2019 13:50:52 -0800 Subject: [PATCH 0180/1073] ci: remove dev-infra as owner on material-ci folder (#28990) Currently, whenever someone on fw-core approvals list approves a change to the angular_material_blocklist.js file, it is not sufficient because dev-infra is also requested as a mandatory reviewer. This does not make sense because this folder only contains the list of ignored tests and not anything dev-infra related. Previously, we tried to fix this by creating a "Material CI" section underneath the existing "Build & CI" section, so that the "Material CI" rule would override the rule matching the entire "tools" folder. Unfortunately, this did not work. This commit attempts to resolve the problem by explicitly marking all sub-folders in the "tools" folder as owned by dev-infra (leaving out "material-ci"), so "material-ci" is only referenced by the rule assigning fw-core as code owners. PR Close #28990 --- .github/CODEOWNERS | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 1ebe36be54..e2984c874b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -750,14 +750,29 @@ testing/** @angular/fw-test /packages/* @angular/fw-dev-infra /scripts/** @angular/fw-dev-infra /third_party/** @angular/fw-dev-infra -/tools/** @angular/fw-dev-infra +/tools/build/** @angular/fw-dev-infra +/tools/cjs-jasmine/** @angular/fw-dev-infra +/tools/gulp-tasks/** @angular/fw-dev-infra +/tools/ngcontainer/** @angular/fw-dev-infra +/tools/npm/** @angular/fw-dev-infra +/tools/npm_workspace/** @angular/fw-dev-infra +/tools/public_api_guard/** @angular/fw-dev-infra +/tools/rxjs/** @angular/fw-dev-infra +/tools/source-map-test/** @angular/fw-dev-infra +/tools/symbol-extractor/** @angular/fw-dev-infra +/tools/testing/** @angular/fw-dev-infra +/tools/ts-api-guardian/** @angular/fw-dev-infra +/tools/tslint/** @angular/fw-dev-infra +/tools/validate-commit-message/** @angular/fw-dev-infra +/tools/yarn/** @angular/fw-dev-infra +/tools/* *.bzl @angular/fw-dev-infra # ================================================ # Material CI # ================================================ -/tools/material-ci/** @angular/fw-core @angular/fw-dev-infra +/tools/material-ci/** @angular/fw-core @angular/framework-global-approvers # ================================================ From ac76e5d8dd279d983b1fe7f7ed9b0025f8f3d981 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Thu, 28 Feb 2019 14:41:36 +0100 Subject: [PATCH 0181/1073] docs: add how to create a minimal repo in bug report template (#29022) PR Close #29022 --- .github/ISSUE_TEMPLATE/1-bug-report.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/1-bug-report.md b/.github/ISSUE_TEMPLATE/1-bug-report.md index 14f87d1298..1424df5367 100644 --- a/.github/ISSUE_TEMPLATE/1-bug-report.md +++ b/.github/ISSUE_TEMPLATE/1-bug-report.md @@ -37,7 +37,9 @@ Please create and share minimal reproduction of the issue starting with this tem https://stackblitz.com/... + - ngAtlanta - Atlanta, Georgia - January 9 - 12, 2019 - - - - ng-India - Gurgaon, India - February 23, 2019 + AngularConnect + London, UK + September 19-20, 2019 ngVikings Copenhagen, Denmark - May 26th Workshops, 27-28 conference, 2019 + May 26 (workshops), 27-28 (conference), 2019 + + + + ng-conf + Salt Lake City, Utah + May 1-3, 2019 @@ -44,18 +44,30 @@ + + + ng-India + Gurgaon, India + February 23, 2019 + + + + ngAtlanta + Atlanta, Georgia + January 9-12, 2019 + + + + AngularConnect + London, United Kingdom + November 5-7, 2018 + ReactiveConf Prague, Czech Republic October 29-31, 2018 - - - AngularConnect - London, United Kingdom - November 5-7, 2018 - AngularMix From 05a9090ded11a7cff5e6145b5b6e7e145b7264d2 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Mon, 4 Mar 2019 14:07:00 +0000 Subject: [PATCH 0200/1073] docs: add AngularConnect announcement for after ng-conf (#29096) PR Close #29096 --- aio/content/marketing/announcements.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/aio/content/marketing/announcements.json b/aio/content/marketing/announcements.json index 879e0b4740..fc79b48416 100644 --- a/aio/content/marketing/announcements.json +++ b/aio/content/marketing/announcements.json @@ -21,10 +21,10 @@ "linkUrl": "https://angularmix.com/" }, { - "startDate": "2018-08-15", - "endDate": "2018-11-06", - "message": "Join us for Angular Connect
November 6th-7th, 2018", + "startDate": "2019-05-03", + "endDate": "2019-09-18", + "message": "Join us for Angular Connect
September 19th-20th, 2019", "imageUrl": "generated/images/marketing/home/angular-connect.png", - "linkUrl": "https://angularconnect.com/" + "linkUrl": "https://www.angularconnect.com/?utm_source=angular.io&utm_medium=referral" } ] From d2f015f57e6aad09e9f6972defa576ee8400a82e Mon Sep 17 00:00:00 2001 From: Amadou Sall Date: Mon, 4 Mar 2019 17:34:35 +0100 Subject: [PATCH 0201/1073] docs: fix minor typo (#29100) tradition -> traditional PR Close #29100 --- aio/content/guide/testing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/content/guide/testing.md b/aio/content/guide/testing.md index 95cbc49ee9..a900bea96e 100644 --- a/aio/content/guide/testing.md +++ b/aio/content/guide/testing.md @@ -428,7 +428,7 @@ to extract the setup variables that it needs. Many developers feel this approach is cleaner and more explicit than the traditional `beforeEach()` style. -Although this testing guide follows the tradition style and +Although this testing guide follows the traditional style and the default [CLI schematics](https://github.com/angular/angular-cli) generate test files with `beforeEach()` and `TestBed`, feel free to adopt _this alternative approach_ in your own projects. From c875851bb4bc47aadab9cca3310c279d26399bc5 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 1 Mar 2019 14:45:04 +0100 Subject: [PATCH 0202/1073] fix(ivy): remove query results from embedded views on view destroy (#29056) PR Close #29056 --- .../core/src/render3/node_manipulation.ts | 17 +++++++------ .../test/linker/query_integration_spec.ts | 24 +++++++++---------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 9a73023438..59322330d5 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -17,11 +17,11 @@ import {NodeInjectorFactory} from './interfaces/injector'; import {TElementNode, TNode, TNodeFlags, TNodeType, TProjectionNode, TViewNode, unusedValueExportToPlacateAjd as unused2} from './interfaces/node'; import {unusedValueExportToPlacateAjd as unused3} from './interfaces/projection'; import {ProceduralRenderer3, RComment, RElement, RNode, RText, Renderer3, isProceduralRenderer, unusedValueExportToPlacateAjd as unused4} from './interfaces/renderer'; -import {CHILD_HEAD, CLEANUP, FLAGS, HEADER_OFFSET, HookData, LView, LViewFlags, NEXT, PARENT, QUERIES, RENDERER, TVIEW, T_HOST, unusedValueExportToPlacateAjd as unused5} from './interfaces/view'; +import {CHILD_HEAD, CLEANUP, FLAGS, HookData, LView, LViewFlags, NEXT, PARENT, QUERIES, RENDERER, TVIEW, T_HOST, unusedValueExportToPlacateAjd as unused5} from './interfaces/view'; import {assertNodeType} from './node_assert'; import {renderStringify} from './util/misc_utils'; import {findComponentView, getLViewParent} from './util/view_traversal_utils'; -import {getNativeByTNode, isComponent, isLContainer, isLView, isRootView, unwrapRNode} from './util/view_utils'; +import {getNativeByTNode, isComponent, isLContainer, isLView, isRootView, unwrapRNode, viewAttachedToContainer} from './util/view_utils'; const unusedValueToPlacateAjd = unused1 + unused2 + unused3 + unused4 + unused5; @@ -350,7 +350,8 @@ export function detachView(lContainer: LContainer, removeIndex: number): LView { views.splice(removeIndex, 1); addRemoveViewFromContainer(viewToDetach, false); - if (viewToDetach[QUERIES]) { + if ((viewToDetach[FLAGS] & LViewFlags.Attached) && + !(viewToDetach[FLAGS] & LViewFlags.Destroyed) && viewToDetach[QUERIES]) { viewToDetach[QUERIES] !.removeView(); } viewToDetach[PARENT] = null; @@ -422,10 +423,8 @@ export function getParentState(lViewOrLContainer: LView | LContainer, rootView: * * @param view The LView to clean up */ -function cleanUpView(viewOrContainer: LView | LContainer): void { - if ((viewOrContainer as LView).length >= HEADER_OFFSET) { - const view = viewOrContainer as LView; - +function cleanUpView(view: LView | LContainer): void { + if (isLView(view) && !(view[FLAGS] & LViewFlags.Destroyed)) { // Usually the Attached flag is removed when the view is detached from its parent, however // if it's a root view, the flag won't be unset hence why we're also removing on destroy. view[FLAGS] &= ~LViewFlags.Attached; @@ -445,6 +444,10 @@ function cleanUpView(viewOrContainer: LView | LContainer): void { ngDevMode && ngDevMode.rendererDestroy++; (view[RENDERER] as ProceduralRenderer3).destroy(); } + // For embedded views still attached to a container: remove query result from this view. + if (viewAttachedToContainer(view) && view[QUERIES]) { + view[QUERIES] !.removeView(); + } } } diff --git a/packages/core/test/linker/query_integration_spec.ts b/packages/core/test/linker/query_integration_spec.ts index 1fd7bbc11c..bd6bd37109 100644 --- a/packages/core/test/linker/query_integration_spec.ts +++ b/packages/core/test/linker/query_integration_spec.ts @@ -713,25 +713,25 @@ describe('Query API', () => { expect(q.query.map((d: TextDirective) => d.text)).toEqual(['2', '1']); }); - fixmeIvy('FW-920: Queries in nested views are not destroyed properly') - .it('should remove manually projected templates if their parent view is destroyed', () => { - const template = ` + it('should remove manually projected templates if their parent view is destroyed', () => { + const template = `
`; - const view = createTestCmp(MyComp0, template); - const q = view.debugElement.children[0].references !['q']; - view.componentInstance.shouldShow = true; - view.detectChanges(); + const view = createTestCmp(MyComp0, template); + const q = view.debugElement.children[0].references !['q']; + view.componentInstance.shouldShow = true; + view.detectChanges(); - expect(q.query.length).toBe(1); + expect(q.query.length).toBe(1); - view.componentInstance.shouldShow = false; - view.detectChanges(); - expect(q.query.length).toBe(0); - }); + view.componentInstance.shouldShow = false; + view.detectChanges(); + + expect(q.query.length).toBe(0); + }); modifiedInIvy('https://github.com/angular/angular/issues/15117 fixed in ivy') .it('should not throw if a content template is queried and created in the view during change detection', From 3403027698b35181f2a9b6d353dc49e567513697 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 2 Mar 2019 21:45:40 +0000 Subject: [PATCH 0203/1073] build: update @angular-devkit/build-angular to version 0.13.4 (#29069) PR Close #29069 --- integration/cli-hello-world/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration/cli-hello-world/package.json b/integration/cli-hello-world/package.json index d6e5035aa1..0ab505d717 100644 --- a/integration/cli-hello-world/package.json +++ b/integration/cli-hello-world/package.json @@ -29,7 +29,7 @@ "zone.js": "file:../../node_modules/zone.js" }, "devDependencies": { - "@angular-devkit/build-angular": "0.13.0-rc.0", + "@angular-devkit/build-angular": "0.13.4", "@angular/cli": "file:../../node_modules/@angular/cli", "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", "@angular/language-service": "file:../../dist/packages-dist/language-service", From c5f1d08a4339abc3f3317061410f65b4bdfdbd61 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sat, 2 Mar 2019 05:54:25 +0000 Subject: [PATCH 0204/1073] build: update tslint to version ~5.13.0 (#29070) PR Close #29070 --- integration/cli-hello-world/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration/cli-hello-world/package.json b/integration/cli-hello-world/package.json index 0ab505d717..4ceb79b344 100644 --- a/integration/cli-hello-world/package.json +++ b/integration/cli-hello-world/package.json @@ -46,7 +46,7 @@ "karma-jasmine-html-reporter": "^0.2.2", "protractor": "file:../../node_modules/protractor", "ts-node": "~4.1.0", - "tslint": "~5.9.1", + "tslint": "~5.13.0", "typescript": "file:../../node_modules/typescript" } } From 95989a12ddde4e008216b2d99d58c88649b0f50c Mon Sep 17 00:00:00 2001 From: Judy Bogart Date: Tue, 26 Feb 2019 08:25:01 -0800 Subject: [PATCH 0205/1073] docs: fix and add decorator api doc (#28986) PR Close #28986 --- packages/core/src/di/metadata.ts | 29 ++--- packages/core/src/metadata.ts | 2 +- packages/core/src/metadata/directives.ts | 149 ++++++++++++----------- packages/core/src/metadata/ng_module.ts | 4 +- tools/public_api_guard/core/core.d.ts | 5 + 5 files changed, 98 insertions(+), 91 deletions(-) diff --git a/packages/core/src/di/metadata.ts b/packages/core/src/di/metadata.ts index 95c090bda3..33a6c94204 100644 --- a/packages/core/src/di/metadata.ts +++ b/packages/core/src/di/metadata.ts @@ -237,12 +237,10 @@ export const Host: HostDecorator = makeParamDecorator('Host'); */ export interface AttributeDecorator { /** - * Specifies that a constant attribute value should be injected. - * - * The directive can inject constant string literals of host element attributes. + * A parameter decorator for a directive constructor that designates + * a host-element attribute whose value is injected as a constant string literal. * * @usageNotes - * ### Example * * Suppose we have an `` element and want to know its `type`. * @@ -250,7 +248,7 @@ export interface AttributeDecorator { * * ``` * - * A decorator can inject string literal `text` like so: + * The following example uses the decorator to inject the string literal `text`. * * {@example core/ts/metadata/metadata.ts region='attributeMetadata'} * @@ -258,20 +256,6 @@ export interface AttributeDecorator { * * {@example core/ts/metadata/metadata.ts region='attributeFactory'} * - * ### Example as ES5 annotation - * - * ``` - * var MyComponent = function(title) { - * ... - * }; - * - * MyComponent.annotations = [ - * new ng.Component({...}) - * ] - * MyComponent.parameters = [ - * [new ng.Attribute('title')] - * ] - * ``` */ (name: string): any; new (name: string): Attribute; @@ -282,7 +266,12 @@ export interface AttributeDecorator { * * @publicApi */ -export interface Attribute { attributeName?: string; } +export interface Attribute { + /** + * The name of the attribute whose value can be injected. + */ + attributeName?: string; +} /** * Attribute decorator and metadata. diff --git a/packages/core/src/metadata.ts b/packages/core/src/metadata.ts index 54caf289d5..75fa6c5191 100644 --- a/packages/core/src/metadata.ts +++ b/packages/core/src/metadata.ts @@ -22,6 +22,6 @@ export {Attribute} from './di'; export {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, DoCheck, OnChanges, OnDestroy, OnInit} from './interface/lifecycle_hooks'; export {ANALYZE_FOR_ENTRY_COMPONENTS, ContentChild, ContentChildDecorator, ContentChildren, ContentChildrenDecorator, Query, ViewChild, ViewChildDecorator, ViewChildren, ViewChildrenDecorator} from './metadata/di'; export {Component, ComponentDecorator, Directive, DirectiveDecorator, HostBinding, HostBindingDecorator, HostListener, HostListenerDecorator, Input, InputDecorator, Output, OutputDecorator, Pipe, PipeDecorator} from './metadata/directives'; -export {DoBootstrap, ModuleWithProviders, NgModule} from './metadata/ng_module'; +export {DoBootstrap, ModuleWithProviders, NgModule, NgModuleDecorator} from './metadata/ng_module'; export {CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, SchemaMetadata} from './metadata/schema'; export {ViewEncapsulation} from './metadata/view'; diff --git a/packages/core/src/metadata/directives.ts b/packages/core/src/metadata/directives.ts index e03c91ee46..f25f627622 100644 --- a/packages/core/src/metadata/directives.ts +++ b/packages/core/src/metadata/directives.ts @@ -317,7 +317,7 @@ export interface ComponentDecorator { * * A component must belong to an NgModule in order for it to be available * to another component or application. To make it a member of an NgModule, - * list it in the `declarations` field of the `@NgModule` metadata. + * list it in the `declarations` field of the `NgModule` metadata. * * Note that, in addition to these options for configuring a directive, * you can control a component's runtime behavior by implementing @@ -443,7 +443,7 @@ export interface ComponentDecorator { */ (obj: Component): TypeDecorator; /** - * See the `@Component` decorator. + * See the `Component` decorator. */ new (obj: Component): Component; } @@ -572,7 +572,22 @@ export const Component: ComponentDecorator = makeDecorator( */ export interface PipeDecorator { /** - * Declares a reusable pipe function, and supplies configuration metadata. + * + * Decorator that marks a class as pipe and supplies configuration metadata. + * + * A pipe class must implement the `PipeTransform` interface. + * For example, if the name is "myPipe", use a template binding expression + * such as the following: + * + * ``` + * {{ exp | myPipe }} + * ``` + * + * The result of the expression is passed to the pipe's `transform()` method. + * + * A pipe must belong to an NgModule in order for it to be available + * to a template. To make it a member of an NgModule, + * list it in the `declarations` field of the `NgModule` metadata. * */ (obj: Pipe): TypeDecorator; @@ -622,23 +637,48 @@ export const Pipe: PipeDecorator = makeDecorator( */ export interface InputDecorator { /** - * Decorator that marks a class as pipe and supplies configuration metadata. - * - * A pipe class must implement the `PipeTransform` interface. - * For example, if the name is "myPipe", use a template binding expression - * such as the following: - * - * ``` - * {{ exp | myPipe }} - * ``` - * - * The result of the expression is passed to the pipe's `transform()` method. - * - * A pipe must belong to an NgModule in order for it to be available - * to a template. To make it a member of an NgModule, - * list it in the `declarations` field of the `@NgModule` metadata. - * - */ + * Decorator that marks a class field as an input property and supplies configuration metadata. + * The input property is bound to a DOM property in the template. During change detection, + * Angular automatically updates the data property with the DOM property's value. + * + * @usageNotes + * + * You can supply an optional name to use in templates when the + * component is instantiated, that maps to the + * name of the bound property. By default, the original + * name of the bound property is used for input binding. + * + * The following example creates a component with two input properties, + * one of which is given a special binding name. + * + * ```typescript + * @Component({ + * selector: 'bank-account', + * template: ` + * Bank Name: {{bankName}} + * Account Id: {{id}} + * ` + * }) + * class BankAccount { + * // This property is bound using its original name. + * @Input() bankName: string; + * // this property value is bound to a different property name + * // when this component is instantiated in a template. + * @Input('account-id') id: string; + * + * // this property is not bound, and is not automatically updated by Angular + * normalizedBankName: string; + * } + * + * @Component({ + * selector: 'app', + * template: ` + * + * ` + * }) + * class App {} + * ``` + */ (bindingPropertyName?: string): any; new (bindingPropertyName?: string): any; } @@ -650,49 +690,7 @@ export interface InputDecorator { */ export interface Input { /** - * Decorator that marks a class field as an input property and supplies configuration metadata. - * Declares a data-bound input property, which Angular automatically updates - * during change detection. - * - * @usageNotes - * - * You can supply an optional name to use in templates when the - * component is instantiated, that maps to the - * name of the bound property. By default, the original - * name of the bound property is used for input binding. - * - * The following example creates a component with two input properties, - * one of which is given a special binding name. - * - * ```typescript - * @Component({ - * selector: 'bank-account', - * template: ` - * Bank Name: {{bankName}} - * Account Id: {{id}} - * ` - * }) - * class BankAccount { - * // This property is bound using its original name. - * @Input() bankName: string; - * // this property value is bound to a different property name - * // when this component is instantiated in a template. - * @Input('account-id') id: string; - * - * // this property is not bound, and is not automatically updated by Angular - * normalizedBankName: string; - * } - * - * @Component({ - * selector: 'app', - * template: ` - * - * ` - * }) - * - * class App {} - * ``` - * + * The name of the DOM property to which the input property is bound. */ bindingPropertyName?: string; } @@ -715,7 +713,7 @@ const initializeBaseDef = (target: any): void => { }; /** - * Does the work of creating the `ngBaseDef` property for the @Input and @Output decorators. + * Does the work of creating the `ngBaseDef` property for the `Input` and `Output` decorators. * @param key "inputs" or "outputs" */ const updateBaseDefFromIOProp = (getProp: (baseDef: {inputs?: any, outputs?: any}) => any) => @@ -747,8 +745,7 @@ export const Input: InputDecorator = makePropDecorator( export interface OutputDecorator { /** * Decorator that marks a class field as an output property and supplies configuration metadata. - * Declares a data-bound output property, which Angular automatically updates - * during change detection. + * The DOM property bound to the output property is automatically updated during change detection. * * @usageNotes * @@ -757,7 +754,7 @@ export interface OutputDecorator { * name of the bound property. By default, the original * name of the bound property is used for output binding. * - * See `@Input` decorator for an example of providing a binding name. + * See `Input` decorator for an example of providing a binding name. * */ (bindingPropertyName?: string): any; @@ -769,7 +766,12 @@ export interface OutputDecorator { * * @publicApi */ -export interface Output { bindingPropertyName?: string; } +export interface Output { + /** + * The name of the DOM property to which the output property is bound. + */ + bindingPropertyName?: string; +} /** * @Annotation @@ -825,7 +827,12 @@ export interface HostBindingDecorator { * * @publicApi */ -export interface HostBinding { hostPropertyName?: string; } +export interface HostBinding { + /** + * The DOM property that is bound to a data property. + */ + hostPropertyName?: string; +} /** * @Annotation @@ -841,6 +848,10 @@ export const HostBinding: HostBindingDecorator = * @publicApi */ export interface HostListenerDecorator { + /** + * Decorator that declares a DOM event to listen for, + * and provides a handler method to run when that event occurs. + */ (eventName: string, args?: string[]): any; new (eventName: string, args?: string[]): any; } diff --git a/packages/core/src/metadata/ng_module.ts b/packages/core/src/metadata/ng_module.ts index b2c3a3ee82..c1b9312389 100644 --- a/packages/core/src/metadata/ng_module.ts +++ b/packages/core/src/metadata/ng_module.ts @@ -91,10 +91,12 @@ export interface ModuleWithProviders< /** * Type of the NgModule decorator / constructor function. + * + * @publicApi */ export interface NgModuleDecorator { /** - * Marks a class as an NgModule and supplies configuration metadata. + * Decorator that marks a class as an NgModule and supplies configuration metadata. */ (obj?: NgModule): TypeDecorator; new (obj?: NgModule): NgModule; diff --git a/tools/public_api_guard/core/core.d.ts b/tools/public_api_guard/core/core.d.ts index 55d373fd8f..329a3a23e5 100644 --- a/tools/public_api_guard/core/core.d.ts +++ b/tools/public_api_guard/core/core.d.ts @@ -574,6 +574,11 @@ export interface NgModule { export declare const NgModule: NgModuleDecorator; +export interface NgModuleDecorator { + (obj?: NgModule): TypeDecorator; + new (obj?: NgModule): NgModule; +} + export declare abstract class NgModuleFactory { abstract readonly moduleType: Type; abstract create(parentInjector: Injector | null): NgModuleRef; From 48214e2a0589f59da993c1e0a2e6ce9a736fcad6 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Tue, 18 Sep 2018 10:52:02 +0300 Subject: [PATCH 0206/1073] fix(service-worker): ignore passive mixed content requests (#25994) Although [passive mixed content][1] requests (like images) only produce a warning without a ServiceWorker, fetching it via a ServiceWorker results in an error. See https://github.com/angular/angular/issues/23012#issuecomment-376430187 for more details. This commit makes the ServiceWorker ignore such requests and let them be handled by the browser directly to avoid breaking apps that would work without the ServiceWorker. [1]: https://developers.google.com/web/fundamentals/security/prevent-mixed-content/what-is-mixed-content#passive_mixed_content Fixes #23012 PR Close #25994 --- packages/service-worker/worker/src/driver.ts | 19 ++++++++--- .../service-worker/worker/test/happy_spec.ts | 34 +++++++++++++++++-- .../service-worker/worker/testing/scope.ts | 2 +- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/packages/service-worker/worker/src/driver.ts b/packages/service-worker/worker/src/driver.ts index 9ff50cfc75..186f21ed80 100644 --- a/packages/service-worker/worker/src/driver.ts +++ b/packages/service-worker/worker/src/driver.ts @@ -176,11 +176,12 @@ export class Driver implements Debuggable, UpdateSource { */ private onFetch(event: FetchEvent): void { const req = event.request; + const scopeUrl = this.scope.registration.scope; + const requestUrlObj = this.adapter.parseUrl(req.url, scopeUrl); // The only thing that is served unconditionally is the debug page. - if (this.adapter.parseUrl(req.url, this.scope.registration.scope).path === '/ngsw/state') { - // Allow the debugger to handle the request, but don't affect SW state in any - // other way. + if (requestUrlObj.path === '/ngsw/state') { + // Allow the debugger to handle the request, but don't affect SW state in any other way. event.respondWith(this.debugger.handleFetch(req)); return; } @@ -197,6 +198,16 @@ export class Driver implements Debuggable, UpdateSource { return; } + // Although "passive mixed content" (like images) only produces a warning without a + // ServiceWorker, fetching it via a ServiceWorker results in an error. Let such requests be + // handled by the browser, since handling with the ServiceWorker would fail anyway. + // See https://github.com/angular/angular/issues/23012#issuecomment-376430187 for more details. + if (requestUrlObj.origin.startsWith('http:') && scopeUrl.startsWith('https:')) { + // Still, log the incident for debugging purposes. + this.debugger.log(`Ignoring passive mixed content request: Driver.fetch(${req.url})`); + return; + } + // When opening DevTools in Chrome, a request is made for the current URL (and possibly related // resources, e.g. scripts) with `cache: 'only-if-cached'` and `mode: 'no-cors'`. These request // will eventually fail, because `only-if-cached` is only allowed to be used with @@ -204,7 +215,7 @@ export class Driver implements Debuggable, UpdateSource { // This is likely a bug in Chrome DevTools. Avoid handling such requests. // (See also https://github.com/angular/angular/issues/22362.) // TODO(gkalpak): Remove once no longer necessary (i.e. fixed in Chrome DevTools). - if ((req.cache as string) === 'only-if-cached' && req.mode !== 'same-origin') { + if (req.cache === 'only-if-cached' && req.mode !== 'same-origin') { // Log the incident only the first time it happens, to avoid spamming the logs. if (!this.loggedInvalidOnlyIfCachedRequest) { this.loggedInvalidOnlyIfCachedRequest = true; diff --git a/packages/service-worker/worker/test/happy_spec.ts b/packages/service-worker/worker/test/happy_spec.ts index a4fba8680a..783b3a8cfe 100644 --- a/packages/service-worker/worker/test/happy_spec.ts +++ b/packages/service-worker/worker/test/happy_spec.ts @@ -204,8 +204,6 @@ const brokenServer = const server404 = new MockServerStateBuilder().withStaticFiles(dist).build(); -const scope = new SwTestHarnessBuilder().withServerState(server).build(); - const manifestHash = sha1(JSON.stringify(manifest)); const manifestUpdateHash = sha1(JSON.stringify(manifestUpdate)); @@ -1008,6 +1006,38 @@ const manifestUpdateHash = sha1(JSON.stringify(manifestUpdate)); expect(await requestFoo('only-if-cached', 'no-cors')).toBeNull(); }); + async_it('ignores passive mixed content requests ', async() => { + const scopeFetchSpy = spyOn(scope, 'fetch').and.callThrough(); + const getRequestUrls = () => scopeFetchSpy.calls.allArgs().map(args => args[0].url); + + const httpScopeUrl = 'http://mock.origin.dev'; + const httpsScopeUrl = 'https://mock.origin.dev'; + const httpRequestUrl = 'http://other.origin.sh/unknown.png'; + const httpsRequestUrl = 'https://other.origin.sh/unknown.pnp'; + + // Registration scope: `http:` + (scope.registration.scope as string) = httpScopeUrl; + + await makeRequest(scope, httpRequestUrl); + await makeRequest(scope, httpsRequestUrl); + const requestUrls1 = getRequestUrls(); + + expect(requestUrls1).toContain(httpRequestUrl); + expect(requestUrls1).toContain(httpsRequestUrl); + + scopeFetchSpy.calls.reset(); + + // Registration scope: `https:` + (scope.registration.scope as string) = httpsScopeUrl; + + await makeRequest(scope, httpRequestUrl); + await makeRequest(scope, httpsRequestUrl); + const requestUrls2 = getRequestUrls(); + + expect(requestUrls2).not.toContain(httpRequestUrl); + expect(requestUrls2).toContain(httpsRequestUrl); + }); + describe('Backwards compatibility with v5', () => { beforeEach(() => { const serverV5 = new MockServerStateBuilder() diff --git a/packages/service-worker/worker/testing/scope.ts b/packages/service-worker/worker/testing/scope.ts index 5262257800..6b5127d947 100644 --- a/packages/service-worker/worker/testing/scope.ts +++ b/packages/service-worker/worker/testing/scope.ts @@ -181,7 +181,7 @@ export class SwTestHarness implements ServiceWorkerGlobalScope, Adapter, Context return {origin: obj.origin, path: obj.pathname}; } else { const obj = require('url').parse(url); - return {origin: obj.origin, path: obj.pathname}; + return {origin: `${obj.protocol}//${obj.host}`, path: obj.pathname}; } } From 78adcfe0ee07b161d1708fe20f5076bb953fdb25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Fri, 1 Mar 2019 14:15:11 -0800 Subject: [PATCH 0207/1073] fix(ivy): ensure static styling is properly inherited into child components (#29015) Angular supports having a component extend off of a parent component. When this happens, all annotation-level data is inherited including styles and classes. Up until now, Ivy only paid attention to static styling values on the parent component and not the child component. This patch ensures that both the parent's component and child component's styling data is merged and rendered accordingly. Jira Issue: FW-1081 PR Close #29015 --- packages/core/src/render3/instructions.ts | 121 ++--- .../core/src/render3/interfaces/styling.ts | 44 +- .../styling/class_and_style_bindings.ts | 156 ++++--- packages/core/src/render3/styling/util.ts | 49 +- packages/core/src/render3/util/attrs_utils.ts | 107 +++++ .../core/test/acceptance/integration_spec.ts | 47 +- packages/core/test/acceptance/styling_spec.ts | 99 ++++ .../cyclic_import/bundle.golden_symbols.json | 21 +- .../bundling/todo/bundle.golden_symbols.json | 15 +- .../core/test/render3/integration_spec.ts | 8 +- .../render3/node_selector_matcher_spec.ts | 2 +- .../styling/class_and_style_bindings_spec.ts | 429 ++++++++++-------- .../angular_material_test_blocklist.js | 152 ++----- 13 files changed, 721 insertions(+), 529 deletions(-) create mode 100644 packages/core/src/render3/util/attrs_utils.ts create mode 100644 packages/core/test/acceptance/styling_spec.ts diff --git a/packages/core/src/render3/instructions.ts b/packages/core/src/render3/instructions.ts index 5e34be0df7..a09a3d4d58 100644 --- a/packages/core/src/render3/instructions.ts +++ b/packages/core/src/render3/instructions.ts @@ -30,9 +30,9 @@ import {ComponentDef, ComponentTemplate, DirectiveDef, DirectiveDefListOrFactory import {INJECTOR_BLOOM_PARENT_SIZE, NodeInjectorFactory} from './interfaces/injector'; import {AttributeMarker, InitialInputData, InitialInputs, LocalRefExtractor, PropertyAliasValue, PropertyAliases, TAttributes, TContainerNode, TElementContainerNode, TElementNode, TIcuContainerNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType, TProjectionNode, TViewNode} from './interfaces/node'; import {PlayerFactory} from './interfaces/player'; -import {CssSelectorList, NG_PROJECT_AS_ATTR_NAME} from './interfaces/projection'; +import {CssSelectorList} from './interfaces/projection'; import {LQueries} from './interfaces/query'; -import {GlobalTargetResolver, ProceduralRenderer3, RComment, RElement, RText, Renderer3, RendererFactory3, isProceduralRenderer} from './interfaces/renderer'; +import {GlobalTargetResolver, RComment, RElement, RText, Renderer3, RendererFactory3, isProceduralRenderer} from './interfaces/renderer'; import {SanitizerFn} from './interfaces/sanitization'; import {StylingContext} from './interfaces/styling'; import {BINDING_INDEX, CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_VIEW, ExpandoInstructions, FLAGS, HEADER_OFFSET, HOST, INJECTOR, InitPhaseState, LView, LViewFlags, NEXT, OpaqueViewState, PARENT, QUERIES, RENDERER, RENDERER_FACTORY, RootContext, RootContextFlags, SANITIZER, TData, TVIEW, TView, T_HOST} from './interfaces/view'; @@ -43,8 +43,9 @@ import {applyOnCreateInstructions} from './node_util'; import {decreaseElementDepthCount, enterView, getBindingsEnabled, getCheckNoChangesMode, getContextLView, getCurrentDirectiveDef, getElementDepthCount, getIsParent, getLView, getPreviousOrParentTNode, increaseElementDepthCount, isCreationMode, leaveView, nextContextImpl, resetComponentState, setBindingRoot, setCheckNoChangesMode, setCurrentDirectiveDef, setCurrentQueryIndex, setIsParent, setPreviousOrParentTNode} from './state'; import {getInitialClassNameValue, getInitialStyleStringValue, initializeStaticContext as initializeStaticStylingContext, patchContextWithStaticAttrs, renderInitialClasses, renderInitialStyles, renderStyling, updateClassProp as updateElementClassProp, updateContextWithBindings, updateStyleProp as updateElementStyleProp, updateStylingMap} from './styling/class_and_style_bindings'; import {BoundPlayerFactory} from './styling/player_factory'; -import {ANIMATION_PROP_PREFIX, allocateDirectiveIntoContext, createEmptyStylingContext, forceClassesAsString, forceStylesAsString, getStylingContext, hasClassInput, hasStyleInput, hasStyling, isAnimationProp} from './styling/util'; +import {ANIMATION_PROP_PREFIX, allocateDirectiveIntoContext, createEmptyStylingContext, forceClassesAsString, forceStylesAsString, getStylingContext, hasClassInput, hasStyleInput, isAnimationProp} from './styling/util'; import {NO_CHANGE} from './tokens'; +import {attrsStylingIndexOf, setUpAttributes} from './util/attrs_utils'; import {INTERPOLATION_DELIMITER, renderStringify} from './util/misc_utils'; import {findComponentView, getLViewParent, getRootContext, getRootView} from './util/view_traversal_utils'; import {getComponentViewByIndex, getNativeByIndex, getNativeByTNode, getTNode, isComponent, isComponentDef, isContentQueryHost, isRootView, loadInternal, readPatchedLView, unwrapRNode, viewAttachedToChangeDetector} from './util/view_utils'; @@ -620,15 +621,21 @@ export function elementStart( const tNode = createNodeAtIndex(index, TNodeType.Element, native !, name, attrs || null); if (attrs) { + const lastAttrIndex = setUpAttributes(native, attrs); + // it's important to only prepare styling-related datastructures once for a given // tNode and not each time an element is created. Also, the styling code is designed - // to be patched and constructed at various points, but only up until the first element - // is created. Then the styling context is locked and can only be instantiated for each - // successive element that is created. - if (tView.firstTemplatePass && !tNode.stylingTemplate && hasStyling(attrs)) { - tNode.stylingTemplate = initializeStaticStylingContext(attrs); + // to be patched and constructed at various points, but only up until the styling + // template is first allocated (which happens when the very first style/class binding + // value is evaluated). When the template is allocated (when it turns into a context) + // then the styling template is locked and cannot be further extended (it can only be + // instantiated into a context per element) + if (tView.firstTemplatePass && !tNode.stylingTemplate) { + const stylingAttrsStartIndex = attrsStylingIndexOf(attrs, lastAttrIndex); + if (stylingAttrsStartIndex >= 0) { + tNode.stylingTemplate = initializeStaticStylingContext(attrs, stylingAttrsStartIndex); + } } - setUpAttributes(native, attrs); } appendChild(native, tNode, lView); @@ -825,87 +832,6 @@ function createViewBlueprint(bindingStartIndex: number, initialViewLength: numbe return blueprint; } -/** - * Assigns all attribute values to the provided element via the inferred renderer. - * - * This function accepts two forms of attribute entries: - * - * default: (key, value): - * attrs = [key1, value1, key2, value2] - * - * namespaced: (NAMESPACE_MARKER, uri, name, value) - * attrs = [NAMESPACE_MARKER, uri, name, value, NAMESPACE_MARKER, uri, name, value] - * - * The `attrs` array can contain a mix of both the default and namespaced entries. - * The "default" values are set without a marker, but if the function comes across - * a marker value then it will attempt to set a namespaced value. If the marker is - * not of a namespaced value then the function will quit and return the index value - * where it stopped during the iteration of the attrs array. - * - * See [AttributeMarker] to understand what the namespace marker value is. - * - * Note that this instruction does not support assigning style and class values to - * an element. See `elementStart` and `elementHostAttrs` to learn how styling values - * are applied to an element. - * - * @param native The element that the attributes will be assigned to - * @param attrs The attribute array of values that will be assigned to the element - * @returns the index value that was last accessed in the attributes array - */ -function setUpAttributes(native: RElement, attrs: TAttributes): number { - const renderer = getLView()[RENDERER]; - const isProc = isProceduralRenderer(renderer); - - let i = 0; - while (i < attrs.length) { - const value = attrs[i]; - if (typeof value === 'number') { - // only namespaces are supported. Other value types (such as style/class - // entries) are not supported in this function. - if (value !== AttributeMarker.NamespaceURI) { - break; - } - - // we just landed on the marker value ... therefore - // we should skip to the next entry - i++; - - const namespaceURI = attrs[i++] as string; - const attrName = attrs[i++] as string; - const attrVal = attrs[i++] as string; - ngDevMode && ngDevMode.rendererSetAttribute++; - isProc ? - (renderer as ProceduralRenderer3).setAttribute(native, attrName, attrVal, namespaceURI) : - native.setAttributeNS(namespaceURI, attrName, attrVal); - } else { - /// attrName is string; - const attrName = value as string; - const attrVal = attrs[++i]; - if (attrName !== NG_PROJECT_AS_ATTR_NAME) { - // Standard attributes - ngDevMode && ngDevMode.rendererSetAttribute++; - if (isAnimationProp(attrName)) { - if (isProc) { - (renderer as ProceduralRenderer3).setProperty(native, attrName, attrVal); - } - } else { - isProc ? - (renderer as ProceduralRenderer3) - .setAttribute(native, attrName as string, attrVal as string) : - native.setAttribute(attrName as string, attrVal as string); - } - } - i++; - } - } - - // another piece of code may iterate over the same attributes array. Therefore - // it may be helpful to return the exact spot where the attributes array exited - // whether by running into an unsupported marker or if all the static values were - // iterated over. - return i; -} - export function createError(text: string, token: any) { return new Error(`Renderer: ${text} [${renderStringify(token)}]`); } @@ -1556,13 +1482,18 @@ function initElementStyling( */ export function elementHostAttrs(directive: any, attrs: TAttributes) { const tNode = getPreviousOrParentTNode(); - if (!tNode.stylingTemplate) { - tNode.stylingTemplate = initializeStaticStylingContext(attrs); - } const lView = getLView(); const native = getNativeByTNode(tNode, lView) as RElement; - const i = setUpAttributes(native, attrs); - patchContextWithStaticAttrs(tNode.stylingTemplate, attrs, i, directive); + const lastAttrIndex = setUpAttributes(native, attrs); + const stylingAttrsStartIndex = attrsStylingIndexOf(attrs, lastAttrIndex); + if (stylingAttrsStartIndex >= 0) { + if (tNode.stylingTemplate) { + patchContextWithStaticAttrs(tNode.stylingTemplate, attrs, stylingAttrsStartIndex, directive); + } else { + tNode.stylingTemplate = + initializeStaticStylingContext(attrs, stylingAttrsStartIndex, directive); + } + } } /** diff --git a/packages/core/src/render3/interfaces/styling.ts b/packages/core/src/render3/interfaces/styling.ts index 1ac69ee063..90ca68100f 100644 --- a/packages/core/src/render3/interfaces/styling.ts +++ b/packages/core/src/render3/interfaces/styling.ts @@ -323,9 +323,9 @@ export interface StylingContext extends * * See [InitialStylingValuesIndex] for a breakdown of how all this works. */ -export interface InitialStylingValues extends Array { +export interface InitialStylingValues extends Array { [InitialStylingValuesIndex.DefaultNullValuePosition]: null; - [InitialStylingValuesIndex.InitialClassesStringPosition]: string|null; + [InitialStylingValuesIndex.CachedStringValuePosition]: string|null; } /** @@ -432,12 +432,48 @@ export interface InitialStylingValues extends Array { * ``` */ export const enum InitialStylingValuesIndex { + /** + * The first value is always `null` so that `styles[0] == null` for unassigned values + */ DefaultNullValuePosition = 0, - InitialClassesStringPosition = 1, + + /** + * Used for non-styling code to examine what the style or className string is: + * styles: ['width', '100px', 0, 'opacity', null, 0, 'height', '200px', 0] + * => initialStyles[CachedStringValuePosition] = 'width:100px;height:200px'; + * classes: ['foo', true, 0, 'bar', false, 0, 'baz', true, 0] + * => initialClasses[CachedStringValuePosition] = 'foo bar'; + * + * Note that this value is `null` by default and it will only be populated + * once `getInitialStyleStringValue` or `getInitialClassNameValue` is executed. + */ + CachedStringValuePosition = 1, + + /** + * Where the style or class values start in the tuple + */ KeyValueStartPosition = 2, + + /** + * The offset value (index + offset) for the property value for each style/class entry + */ PropOffset = 0, + + /** + * The offset value (index + offset) for the style/class value for each style/class entry + */ ValueOffset = 1, - Size = 2 + + /** + * The offset value (index + offset) for the style/class directive owner for each style/class + entry + */ + DirectiveOwnerOffset = 2, + + /** + * The total size for each style/class entry (prop + value + directiveOwner) + */ + Size = 3 } /** diff --git a/packages/core/src/render3/styling/class_and_style_bindings.ts b/packages/core/src/render3/styling/class_and_style_bindings.ts index d8f43405d0..1fec18b5d5 100644 --- a/packages/core/src/render3/styling/class_and_style_bindings.ts +++ b/packages/core/src/render3/styling/class_and_style_bindings.ts @@ -41,29 +41,10 @@ import {addPlayerInternal, allocPlayerContext, allocateDirectiveIntoContext, cre /** * Creates a new StylingContext an fills it with the provided static styling attribute values. */ -export function initializeStaticContext(attrs: TAttributes): StylingContext { +export function initializeStaticContext( + attrs: TAttributes, stylingStartIndex: number, directiveRef?: any | null): StylingContext { const context = createEmptyStylingContext(); - const initialClasses: InitialStylingValues = context[StylingIndex.InitialClassValuesPosition] = - [null, null]; - const initialStyles: InitialStylingValues = context[StylingIndex.InitialStyleValuesPosition] = - [null, null]; - - // The attributes array has marker values (numbers) indicating what the subsequent - // values represent. When we encounter a number, we set the mode to that type of attribute. - let mode = -1; - for (let i = 0; i < attrs.length; i++) { - const attr = attrs[i]; - if (typeof attr == 'number') { - mode = attr; - } else if (mode === AttributeMarker.Styles) { - initialStyles.push(attr as string, attrs[++i] as string); - } else if (mode === AttributeMarker.Classes) { - initialClasses.push(attr as string, true); - } else if (mode === AttributeMarker.SelectOnly) { - break; - } - } - + patchContextWithStaticAttrs(context, attrs, stylingStartIndex, directiveRef); return context; } @@ -74,34 +55,41 @@ export function initializeStaticContext(attrs: TAttributes): StylingContext { * @param context the existing styling context * @param attrs an array of new static styling attributes that will be * assigned to the context + * @param attrsStylingStartIndex what index to start iterating within the + * provided `attrs` array to start reading style and class values * @param directiveRef the directive instance with which static data is associated with. */ export function patchContextWithStaticAttrs( - context: StylingContext, attrs: TAttributes, startingIndex: number, directiveRef: any): void { + context: StylingContext, attrs: TAttributes, attrsStylingStartIndex: number, + directiveRef?: any | null): void { + // this means the context has already been set and instantiated + if (context[StylingIndex.MasterFlagPosition] & StylingFlags.BindingAllocationLocked) return; + // If the styling context has already been patched with the given directive's bindings, // then there is no point in doing it again. The reason why this may happen (the directive // styling being patched twice) is because the `stylingBinding` function is called each time // an element is created (both within a template function and within directive host bindings). const directives = context[StylingIndex.DirectiveRegistryPosition]; - if (getDirectiveRegistryValuesIndexOf(directives, directiveRef) == -1) { + let detectedIndex = getDirectiveRegistryValuesIndexOf(directives, directiveRef || null); + if (detectedIndex === -1) { // this is a new directive which we have not seen yet. - allocateDirectiveIntoContext(context, directiveRef); + detectedIndex = allocateDirectiveIntoContext(context, directiveRef); + } + const directiveIndex = detectedIndex / DirectiveRegistryValuesIndex.Size; - let initialClasses: InitialStylingValues|null = null; - let initialStyles: InitialStylingValues|null = null; - - let mode = -1; - for (let i = startingIndex; i < attrs.length; i++) { - const attr = attrs[i]; - if (typeof attr == 'number') { - mode = attr; - } else if (mode == AttributeMarker.Classes) { - initialClasses = initialClasses || context[StylingIndex.InitialClassValuesPosition]; - patchInitialStylingValue(initialClasses, attr, true); - } else if (mode == AttributeMarker.Styles) { - initialStyles = initialStyles || context[StylingIndex.InitialStyleValuesPosition]; - patchInitialStylingValue(initialStyles, attr, attrs[++i]); - } + let initialClasses: InitialStylingValues|null = null; + let initialStyles: InitialStylingValues|null = null; + let mode = -1; + for (let i = attrsStylingStartIndex; i < attrs.length; i++) { + const attr = attrs[i]; + if (typeof attr == 'number') { + mode = attr; + } else if (mode == AttributeMarker.Classes) { + initialClasses = initialClasses || context[StylingIndex.InitialClassValuesPosition]; + patchInitialStylingValue(initialClasses, attr, true, directiveIndex); + } else if (mode == AttributeMarker.Styles) { + initialStyles = initialStyles || context[StylingIndex.InitialStyleValuesPosition]; + patchInitialStylingValue(initialStyles, attr, attrs[++i], directiveIndex); } } } @@ -110,29 +98,44 @@ export function patchContextWithStaticAttrs( * Designed to add a style or class value into the existing set of initial styles. * * The function will search and figure out if a style/class value is already present - * within the provided initial styling array. If and when a style/class value is not - * present (or if it's value is falsy) then it will be inserted/updated in the list - * of initial styling values. + * within the provided initial styling array. If and when a style/class value is + * present (allocated) then the code below will set the new value depending on the + * following cases: + * + * 1) if the existing value is falsy (this happens because a `[class.prop]` or + * `[style.prop]` binding was set, but there wasn't a matching static style + * or class present on the context) + * 2) if the value was set already by the template, component or directive, but the + * new value is set on a higher level (i.e. a sub component which extends a parent + * component sets its value after the parent has already set the same one) + * 3) if the same directive provides a new set of styling values to set + * + * @param initialStyling the initial styling array where the new styling entry will be added to + * @param prop the property value of the new entry (e.g. `width` (styles) or `foo` (classes)) + * @param value the styling value of the new entry (e.g. `absolute` (styles) or `true` (classes)) + * @param directiveOwnerIndex the directive owner index value of the styling source responsible + * for these styles (see `interfaces/styling.ts#directives` for more info) */ function patchInitialStylingValue( - initialStyling: InitialStylingValues, prop: string, value: any): void { - // Even values are keys; Odd numbers are values; Search keys only - for (let i = InitialStylingValuesIndex.KeyValueStartPosition; i < initialStyling.length;) { - const key = initialStyling[i]; + initialStyling: InitialStylingValues, prop: string, value: any, + directiveOwnerIndex: number): void { + for (let i = InitialStylingValuesIndex.KeyValueStartPosition; i < initialStyling.length; + i += InitialStylingValuesIndex.Size) { + const key = initialStyling[i + InitialStylingValuesIndex.PropOffset]; if (key === prop) { - const existingValue = initialStyling[i + InitialStylingValuesIndex.ValueOffset]; - - // If there is no previous style value (when `null`) or no previous class - // applied (when `false`) then we update the the newly given value. - if (existingValue == null || existingValue == false) { - initialStyling[i + InitialStylingValuesIndex.ValueOffset] = value; + const existingValue = + initialStyling[i + InitialStylingValuesIndex.ValueOffset] as string | null | boolean; + const existingOwner = + initialStyling[i + InitialStylingValuesIndex.DirectiveOwnerOffset] as number; + if (allowValueChange(existingValue, value, existingOwner, directiveOwnerIndex)) { + addOrUpdateStaticStyle(i, initialStyling, prop, value, directiveOwnerIndex); } return; } - i = i + InitialStylingValuesIndex.Size; } + // We did not find existing key, add a new one. - initialStyling.push(prop, value); + addOrUpdateStaticStyle(null, initialStyling, prop, value, directiveOwnerIndex); } /** @@ -377,8 +380,10 @@ export function updateContextWithBindings( let initialValuesToLookup = entryIsClassBased ? initialClasses : initialStyles; let indexForInitial = getInitialStylingValuesIndexOf(initialValuesToLookup, propName); if (indexForInitial === -1) { - indexForInitial = initialValuesToLookup.length + InitialStylingValuesIndex.ValueOffset; - initialValuesToLookup.push(propName, entryIsClassBased ? false : null); + indexForInitial = addOrUpdateStaticStyle( + null, initialValuesToLookup, propName, entryIsClassBased ? false : null, + directiveIndex) + + InitialStylingValuesIndex.ValueOffset; } else { indexForInitial += InitialStylingValuesIndex.ValueOffset; } @@ -1262,7 +1267,7 @@ function getInitialValue(context: StylingContext, flag: number): string|boolean| const entryIsClassBased = flag & StylingFlags.Class; const initialValues = entryIsClassBased ? context[StylingIndex.InitialClassValuesPosition] : context[StylingIndex.InitialStyleValuesPosition]; - return initialValues[index]; + return initialValues[index] as string | boolean | null; } function getInitialIndex(flag: number): number { @@ -1769,7 +1774,7 @@ function allowValueChange( */ export function getInitialClassNameValue(context: StylingContext): string { const initialClassValues = context[StylingIndex.InitialClassValuesPosition]; - let className = initialClassValues[InitialStylingValuesIndex.InitialClassesStringPosition]; + let className = initialClassValues[InitialStylingValuesIndex.CachedStringValuePosition]; if (className === null) { className = ''; for (let i = InitialStylingValuesIndex.KeyValueStartPosition; i < initialClassValues.length; @@ -1779,7 +1784,7 @@ export function getInitialClassNameValue(context: StylingContext): string { className += (className.length ? ' ' : '') + initialClassValues[i]; } } - initialClassValues[InitialStylingValuesIndex.InitialClassesStringPosition] = className; + initialClassValues[InitialStylingValuesIndex.CachedStringValuePosition] = className; } return className; } @@ -1797,7 +1802,7 @@ export function getInitialClassNameValue(context: StylingContext): string { */ export function getInitialStyleStringValue(context: StylingContext): string { const initialStyleValues = context[StylingIndex.InitialStyleValuesPosition]; - let styleString = initialStyleValues[InitialStylingValuesIndex.InitialClassesStringPosition]; + let styleString = initialStyleValues[InitialStylingValuesIndex.CachedStringValuePosition]; if (styleString === null) { styleString = ''; for (let i = InitialStylingValuesIndex.KeyValueStartPosition; i < initialStyleValues.length; @@ -1807,7 +1812,7 @@ export function getInitialStyleStringValue(context: StylingContext): string { styleString += (styleString.length ? ';' : '') + `${initialStyleValues[i]}:${value}`; } } - initialStyleValues[InitialStylingValuesIndex.InitialClassesStringPosition] = styleString; + initialStyleValues[InitialStylingValuesIndex.CachedStringValuePosition] = styleString; } return styleString; } @@ -1956,3 +1961,30 @@ function registerMultiMapEntry( } cachedValues.push(0, startPosition, null, count); } + +/** + * Inserts or updates an existing entry in the provided `staticStyles` collection. + * + * @param index the index representing an existing styling entry in the collection: + * if provided (numeric): then it will update the existing entry at the given position + * if null: then it will insert a new entry within the collection + * @param staticStyles a collection of style or class entries where the value will + * be inserted or patched + * @param prop the property value of the entry (e.g. `width` (styles) or `foo` (classes)) + * @param value the styling value of the entry (e.g. `absolute` (styles) or `true` (classes)) + * @param directiveOwnerIndex the directive owner index value of the styling source responsible + * for these styles (see `interfaces/styling.ts#directives` for more info) + * @returns the index of the updated or new entry within the collection + */ +function addOrUpdateStaticStyle( + index: number | null, staticStyles: InitialStylingValues, prop: string, + value: string | boolean | null, directiveOwnerIndex: number) { + if (index === null) { + index = staticStyles.length; + staticStyles.push(null, null, null); + staticStyles[index + InitialStylingValuesIndex.PropOffset] = prop; + } + staticStyles[index + InitialStylingValuesIndex.ValueOffset] = value; + staticStyles[index + InitialStylingValuesIndex.DirectiveOwnerOffset] = directiveOwnerIndex; + return index; +} diff --git a/packages/core/src/render3/styling/util.ts b/packages/core/src/render3/styling/util.ts index 2984841b72..0331d39397 100644 --- a/packages/core/src/render3/styling/util.ts +++ b/packages/core/src/render3/styling/util.ts @@ -14,7 +14,7 @@ import {LContext} from '../interfaces/context'; import {AttributeMarker, TAttributes, TNode, TNodeFlags} from '../interfaces/node'; import {PlayState, Player, PlayerContext, PlayerIndex} from '../interfaces/player'; import {RElement} from '../interfaces/renderer'; -import {InitialStylingValues, StylingContext, StylingFlags, StylingIndex} from '../interfaces/styling'; +import {DirectiveRegistryValuesIndex, InitialStylingValues, StylingContext, StylingFlags, StylingIndex} from '../interfaces/styling'; import {HEADER_OFFSET, HOST, LView, RootContext} from '../interfaces/view'; import {getTNode, isStylingContext} from '../util/view_utils'; @@ -37,13 +37,48 @@ export function createEmptyStylingContext( [0], // CachedMultiStyleValue null, // PlayerContext ]; + + // whenever a context is created there is always a `null` directive + // that is registered (which is a placeholder for the "template"). allocateDirectiveIntoContext(context, null); return context; } -export function allocateDirectiveIntoContext(context: StylingContext, directiveRef: any | null) { +/** + * Allocates (registers) a directive into the directive registry within the provided styling + * context. + * + * For each and every `[style]`, `[style.prop]`, `[class]`, `[class.name]` binding + * (as well as static style and class attributes) a directive, component or template + * is marked as the owner. When an owner is determined (this happens when the template + * is first passed over) the directive owner is allocated into the styling context. When + * this happens, each owner gets its own index value. This then ensures that once any + * style and/or class binding are assigned into the context then they are marked to + * that directive's index value. + * + * @param context the target StylingContext + * @param directiveRef the directive that will be allocated into the context + * @returns the index where the directive was inserted into + */ +export function allocateDirectiveIntoContext( + context: StylingContext, directiveRef: any | null): number { // this is a new directive which we have not seen yet. - context[StylingIndex.DirectiveRegistryPosition].push(directiveRef, -1, false, null); + const dirs = context[StylingIndex.DirectiveRegistryPosition]; + const i = dirs.length; + + // we preemptively make space into the directives array and then + // assign values slot-by-slot to ensure that if the directive ordering + // changes then it will still function + dirs.push(null, null, null, null); + dirs[i + DirectiveRegistryValuesIndex.DirectiveValueOffset] = directiveRef; + dirs[i + DirectiveRegistryValuesIndex.DirtyFlagOffset] = false; + dirs[i + DirectiveRegistryValuesIndex.StyleSanitizerOffset] = null; + + // -1 is used to signal that the directive has been allocated, but + // no actual style or class bindings have been registered yet... + dirs[i + DirectiveRegistryValuesIndex.SinglePropValuesIndexOffset] = -1; + + return i; } /** @@ -228,11 +263,3 @@ export function allocPlayerContext(data: StylingContext): PlayerContext { export function throwInvalidRefError() { throw new Error('Only elements that exist in an Angular application can be used for animations'); } - -export function hasStyling(attrs: TAttributes): boolean { - for (let i = 0; i < attrs.length; i++) { - const attr = attrs[i]; - if (attr == AttributeMarker.Classes || attr == AttributeMarker.Styles) return true; - } - return false; -} diff --git a/packages/core/src/render3/util/attrs_utils.ts b/packages/core/src/render3/util/attrs_utils.ts new file mode 100644 index 0000000000..f810cd6b0d --- /dev/null +++ b/packages/core/src/render3/util/attrs_utils.ts @@ -0,0 +1,107 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +import {AttributeMarker, TAttributes} from '../interfaces/node'; +import {NG_PROJECT_AS_ATTR_NAME} from '../interfaces/projection'; +import {ProceduralRenderer3, RElement, isProceduralRenderer} from '../interfaces/renderer'; +import {RENDERER} from '../interfaces/view'; +import {getLView} from '../state'; +import {isAnimationProp} from '../styling/util'; + + + +/** + * Assigns all attribute values to the provided element via the inferred renderer. + * + * This function accepts two forms of attribute entries: + * + * default: (key, value): + * attrs = [key1, value1, key2, value2] + * + * namespaced: (NAMESPACE_MARKER, uri, name, value) + * attrs = [NAMESPACE_MARKER, uri, name, value, NAMESPACE_MARKER, uri, name, value] + * + * The `attrs` array can contain a mix of both the default and namespaced entries. + * The "default" values are set without a marker, but if the function comes across + * a marker value then it will attempt to set a namespaced value. If the marker is + * not of a namespaced value then the function will quit and return the index value + * where it stopped during the iteration of the attrs array. + * + * See [AttributeMarker] to understand what the namespace marker value is. + * + * Note that this instruction does not support assigning style and class values to + * an element. See `elementStart` and `elementHostAttrs` to learn how styling values + * are applied to an element. + * + * @param native The element that the attributes will be assigned to + * @param attrs The attribute array of values that will be assigned to the element + * @returns the index value that was last accessed in the attributes array + */ +export function setUpAttributes(native: RElement, attrs: TAttributes): number { + const renderer = getLView()[RENDERER]; + const isProc = isProceduralRenderer(renderer); + + let i = 0; + while (i < attrs.length) { + const value = attrs[i]; + if (typeof value === 'number') { + // only namespaces are supported. Other value types (such as style/class + // entries) are not supported in this function. + if (value !== AttributeMarker.NamespaceURI) { + break; + } + + // we just landed on the marker value ... therefore + // we should skip to the next entry + i++; + + const namespaceURI = attrs[i++] as string; + const attrName = attrs[i++] as string; + const attrVal = attrs[i++] as string; + ngDevMode && ngDevMode.rendererSetAttribute++; + isProc ? + (renderer as ProceduralRenderer3).setAttribute(native, attrName, attrVal, namespaceURI) : + native.setAttributeNS(namespaceURI, attrName, attrVal); + } else { + /// attrName is string; + const attrName = value as string; + const attrVal = attrs[++i]; + if (attrName !== NG_PROJECT_AS_ATTR_NAME) { + // Standard attributes + ngDevMode && ngDevMode.rendererSetAttribute++; + if (isAnimationProp(attrName)) { + if (isProc) { + (renderer as ProceduralRenderer3).setProperty(native, attrName, attrVal); + } + } else { + isProc ? + (renderer as ProceduralRenderer3) + .setAttribute(native, attrName as string, attrVal as string) : + native.setAttribute(attrName as string, attrVal as string); + } + } + i++; + } + } + + // another piece of code may iterate over the same attributes array. Therefore + // it may be helpful to return the exact spot where the attributes array exited + // whether by running into an unsupported marker or if all the static values were + // iterated over. + return i; +} + + +export function attrsStylingIndexOf(attrs: TAttributes, startIndex: number): number { + for (let i = startIndex; i < attrs.length; i++) { + const val = attrs[i]; + if (val === AttributeMarker.Classes || val === AttributeMarker.Styles) { + return i; + } + } + return -1; +} diff --git a/packages/core/test/acceptance/integration_spec.ts b/packages/core/test/acceptance/integration_spec.ts index 0360ecb21d..7612e8b22e 100644 --- a/packages/core/test/acceptance/integration_spec.ts +++ b/packages/core/test/acceptance/integration_spec.ts @@ -9,39 +9,9 @@ import {Component, Directive, HostBinding, HostListener, Input, QueryList, ViewC import {TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; import {expect} from '@angular/platform-browser/testing/src/matchers'; -import {onlyInIvy} from '@angular/private/testing'; +import {ivyEnabled, onlyInIvy} from '@angular/private/testing'; describe('acceptance integration tests', () => { - onlyInIvy('[style] and [class] bindings are a new feature') - .it('should render host bindings on the root component', () => { - @Component({template: '...'}) - class MyApp { - @HostBinding('style') public myStylesExp = {}; - @HostBinding('class') public myClassesExp = {}; - } - - TestBed.configureTestingModule({declarations: [MyApp]}); - const fixture = TestBed.createComponent(MyApp); - const element = fixture.nativeElement; - fixture.detectChanges(); - - const component = fixture.componentInstance; - component.myStylesExp = {width: '100px'}; - component.myClassesExp = 'foo'; - fixture.detectChanges(); - - expect(element.style['width']).toEqual('100px'); - expect(element.classList.contains('foo')).toBeTruthy(); - - component.myStylesExp = {width: '200px'}; - component.myClassesExp = 'bar'; - fixture.detectChanges(); - - expect(element.style['width']).toEqual('200px'); - expect(element.classList.contains('foo')).toBeFalsy(); - expect(element.classList.contains('bar')).toBeTruthy(); - }); - it('should only call inherited host listeners once', () => { let clicks = 0; @@ -97,20 +67,6 @@ describe('acceptance integration tests', () => { expect(subInstance.dirs.first).toBeAnInstanceOf(SomeDir); }); - it('should render host class and style on the root component', () => { - @Component({template: '...', host: {class: 'foo', style: 'color: red'}}) - class MyApp { - } - - TestBed.configureTestingModule({declarations: [MyApp]}); - const fixture = TestBed.createComponent(MyApp); - const element = fixture.nativeElement; - fixture.detectChanges(); - - expect(element.style['color']).toEqual('red'); - expect(element.classList.contains('foo')).toBeTruthy(); - }); - it('should not set inputs after destroy', () => { @Directive({ selector: '[no-assign-after-destroy]', @@ -146,5 +102,4 @@ describe('acceptance integration tests', () => { fixture.detectChanges(); }).not.toThrow(); }); - }); diff --git a/packages/core/test/acceptance/styling_spec.ts b/packages/core/test/acceptance/styling_spec.ts new file mode 100644 index 0000000000..4eb477fef4 --- /dev/null +++ b/packages/core/test/acceptance/styling_spec.ts @@ -0,0 +1,99 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +import {Component, HostBinding} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; +import {expect} from '@angular/platform-browser/testing/src/matchers'; +import {ivyEnabled, onlyInIvy} from '@angular/private/testing'; + +describe('acceptance integration tests', () => { + onlyInIvy('[style] and [class] bindings are a new feature') + .it('should render host bindings on the root component', () => { + @Component({template: '...'}) + class MyApp { + @HostBinding('style') public myStylesExp = {}; + @HostBinding('class') public myClassesExp = {}; + } + + TestBed.configureTestingModule({declarations: [MyApp]}); + const fixture = TestBed.createComponent(MyApp); + const element = fixture.nativeElement; + fixture.detectChanges(); + + const component = fixture.componentInstance; + component.myStylesExp = {width: '100px'}; + component.myClassesExp = 'foo'; + fixture.detectChanges(); + + expect(element.style['width']).toEqual('100px'); + expect(element.classList.contains('foo')).toBeTruthy(); + + component.myStylesExp = {width: '200px'}; + component.myClassesExp = 'bar'; + fixture.detectChanges(); + + expect(element.style['width']).toEqual('200px'); + expect(element.classList.contains('foo')).toBeFalsy(); + expect(element.classList.contains('bar')).toBeTruthy(); + }); + + it('should render host class and style on the root component', () => { + @Component({template: '...', host: {class: 'foo', style: 'color: red'}}) + class MyApp { + } + + TestBed.configureTestingModule({declarations: [MyApp]}); + const fixture = TestBed.createComponent(MyApp); + const element = fixture.nativeElement; + fixture.detectChanges(); + + expect(element.style['color']).toEqual('red'); + expect(element.classList.contains('foo')).toBeTruthy(); + }); + + it('should combine the inherited static styles of a parent and child component', () => { + @Component({template: '...', host: {'style': 'width:100px; height:100px;'}}) + class ParentCmp { + } + + @Component({template: '...', host: {'style': 'width:200px; color:red'}}) + class ChildCmp extends ParentCmp { + } + + TestBed.configureTestingModule({declarations: [ChildCmp]}); + const fixture = TestBed.createComponent(ChildCmp); + fixture.detectChanges(); + + const element = fixture.nativeElement; + if (ivyEnabled) { + expect(element.style['height']).toEqual('100px'); + } + expect(element.style['width']).toEqual('200px'); + expect(element.style['color']).toEqual('red'); + }); + + it('should combine the inherited static classes of a parent and child component', () => { + @Component({template: '...', host: {'class': 'foo bar'}}) + class ParentCmp { + } + + @Component({template: '...', host: {'class': 'foo baz'}}) + class ChildCmp extends ParentCmp { + } + + TestBed.configureTestingModule({declarations: [ChildCmp]}); + const fixture = TestBed.createComponent(ChildCmp); + fixture.detectChanges(); + + const element = fixture.nativeElement; + if (ivyEnabled) { + expect(element.classList.contains('bar')).toBeTruthy(); + } + expect(element.classList.contains('foo')).toBeTruthy(); + expect(element.classList.contains('baz')).toBeTruthy(); + }); +}); diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 10ee5080db..d0d82ba7e6 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -158,6 +158,9 @@ { "name": "addComponentLogic" }, + { + "name": "addOrUpdateStaticStyle" + }, { "name": "addToViewTree" }, @@ -167,6 +170,9 @@ { "name": "allocateDirectiveIntoContext" }, + { + "name": "allowValueChange" + }, { "name": "appendChild" }, @@ -176,6 +182,9 @@ { "name": "attachPatchData" }, + { + "name": "attrsStylingIndexOf" + }, { "name": "baseResolveDirective" }, @@ -323,6 +332,9 @@ { "name": "getDirectiveDef" }, + { + "name": "getDirectiveRegistryValuesIndexOf" + }, { "name": "getElementDepthCount" }, @@ -416,9 +428,6 @@ { "name": "hasStyleInput" }, - { - "name": "hasStyling" - }, { "name": "hasTagAndTypeMatch" }, @@ -524,6 +533,12 @@ { "name": "noSideEffects" }, + { + "name": "patchContextWithStaticAttrs" + }, + { + "name": "patchInitialStylingValue" + }, { "name": "postProcessBaseDirective" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index c8b4beddd7..a279b0e311 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -362,6 +362,9 @@ { "name": "addComponentLogic" }, + { + "name": "addOrUpdateStaticStyle" + }, { "name": "addPlayerInternal" }, @@ -401,6 +404,9 @@ { "name": "attachPatchData" }, + { + "name": "attrsStylingIndexOf" + }, { "name": "baseResolveDirective" }, @@ -854,9 +860,6 @@ { "name": "hasStyleInput" }, - { - "name": "hasStyling" - }, { "name": "hasTagAndTypeMatch" }, @@ -1064,6 +1067,12 @@ { "name": "noSideEffects" }, + { + "name": "patchContextWithStaticAttrs" + }, + { + "name": "patchInitialStylingValue" + }, { "name": "pointers" }, diff --git a/packages/core/test/render3/integration_spec.ts b/packages/core/test/render3/integration_spec.ts index 21371db81e..5e396bee48 100644 --- a/packages/core/test/render3/integration_spec.ts +++ b/packages/core/test/render3/integration_spec.ts @@ -1678,7 +1678,7 @@ describe('render3 integration test', () => { if (rf & RenderFlags.Create) { elementStart( 0, 'div', - ['DirWithClass', AttributeMarker.Classes, 'apple', 'orange', 'banana']); + ['DirWithClass', '', AttributeMarker.Classes, 'apple', 'orange', 'banana']); elementStyling(); elementEnd(); } @@ -1698,9 +1698,9 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart( - 0, 'div', - ['DirWithStyle', AttributeMarker.Styles, 'width', '100px', 'height', '200px']); + elementStart(0, 'div', [ + 'DirWithStyle', '', AttributeMarker.Styles, 'width', '100px', 'height', '200px' + ]); elementStyling(); elementEnd(); } diff --git a/packages/core/test/render3/node_selector_matcher_spec.ts b/packages/core/test/render3/node_selector_matcher_spec.ts index 9a62268fd1..0b55dd306d 100644 --- a/packages/core/test/render3/node_selector_matcher_spec.ts +++ b/packages/core/test/render3/node_selector_matcher_spec.ts @@ -317,7 +317,7 @@ describe('css selector matching', () => { expect(isMatching('div', tNode, selector)).toBeTruthy(); //
(with styling context but without attrs) - tNode.stylingTemplate = initializeStaticContext([AttributeMarker.Classes, 'abc']); + tNode.stylingTemplate = initializeStaticContext([AttributeMarker.Classes, 'abc'], 0); tNode.attrs = null; expect(isMatching('div', tNode, selector)).toBeTruthy(); }); diff --git a/packages/core/test/render3/styling/class_and_style_bindings_spec.ts b/packages/core/test/render3/styling/class_and_style_bindings_spec.ts index 2ea84900b3..7eda24e508 100644 --- a/packages/core/test/render3/styling/class_and_style_bindings_spec.ts +++ b/packages/core/test/render3/styling/class_and_style_bindings_spec.ts @@ -39,7 +39,7 @@ describe('style and class based bindings', () => { return lView; } - function initContext( + function createStylingTemplate( initialStyles?: (number | string)[] | null, styleBindings?: string[] | null, initialClasses?: (string | number | boolean)[] | null, classBindings?: string[] | null, sanitizer?: StyleSanitizeFn | null): StylingContext { @@ -53,8 +53,17 @@ describe('style and class based bindings', () => { attrsWithStyling.push(...initialStyles as any); } - const tpl = initializeStaticContext(attrsWithStyling) !; + const tpl = initializeStaticContext(attrsWithStyling, 0) !; updateContextWithBindings(tpl, null, classBindings || null, styleBindings || null, sanitizer); + return tpl; + } + + function createStylingContext( + initialStyles?: (number | string)[] | null, styleBindings?: string[] | null, + initialClasses?: (string | number | boolean)[] | null, classBindings?: string[] | null, + sanitizer?: StyleSanitizeFn | null): StylingContext { + const tpl = createStylingTemplate( + initialStyles, styleBindings, initialClasses, classBindings, sanitizer); return allocStylingContext(element, tpl); } @@ -198,7 +207,7 @@ describe('style and class based bindings', () => { describe('styles', () => { describe('static styling properties within a context', () => { it('should initialize empty template', () => { - const template = initContext(); + const template = createStylingContext(); assertContext(template, [ element, masterConfig(9), @@ -213,13 +222,14 @@ describe('style and class based bindings', () => { }); it('should initialize static styles and classes', () => { - const template = initContext(['color', 'red', 'width', '10px'], null, ['foo', 'bar']); + const template = + createStylingContext(['color', 'red', 'width', '10px'], null, ['foo', 'bar']); assertContext(template, [ element, masterConfig(9), [null, 2, false, null], - [null, null, 'color', 'red', 'width', '10px'], - [null, null, 'foo', true, 'bar', true], + [null, null, 'color', 'red', 0, 'width', '10px', 0], + [null, null, 'foo', true, 0, 'bar', true, 0], [0, 0, 0, 0], [0, 0, 9, null, 0], [0, 0, 9, null, 0], @@ -227,91 +237,133 @@ describe('style and class based bindings', () => { ]); }); - it('should initialize and then patch static styling inline with existing static styling', + it('should initialize and then patch static styling inline with existing static styling and also replace values if the same directive runs twice', () => { - const template = initContext(['color', 'red'], null, ['foo']); + const template = createStylingTemplate(['color', 'red'], null, ['foo']); expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ null, null, 'color', 'red', + 0, ]); expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ null, null, 'foo', true, + 0, ]); patchContext(template, ['color', 'black', 'height', '200px'], ['bar', 'foo'], '1'); expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ - null, null, 'color', 'red', 'height', '200px' + null, + null, + 'color', + 'red', + 0, + 'height', + '200px', + 1, ]); expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ - null, null, 'foo', true, 'bar', true + null, + null, + 'foo', + true, + 0, + 'bar', + true, + 1, + ]); + + patchContext(template, ['color', 'orange'], []); + expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ + null, + null, + 'color', + 'orange', + 0, + 'height', + '200px', + 1, + ]); + expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ + null, + null, + 'foo', + true, + 0, + 'bar', + true, + 1, ]); }); - it('should only populate static styles for a given directive once', () => { - const template = initContext(['color', 'red'], null, ['foo']); - expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ - null, - null, - 'color', - 'red', - ]); - expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ - null, - null, - 'foo', - true, - ]); + it('should only populate static styles for a given directive once only when the context is allocated', + () => { + const template = createStylingTemplate(['color', 'red'], null, ['foo']); + expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ + null, + null, + 'color', + 'red', + 0, + ]); + expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ + null, + null, + 'foo', + true, + 0, + ]); - patchContext(template, ['color', 'black', 'height', '200px'], ['bar', 'foo']); - expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ - null, - null, - 'color', - 'red', - ]); - expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ - null, - null, - 'foo', - true, - ]); + patchContext(template, ['color', 'black', 'height', '200px'], ['bar', 'foo']); + expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ + null, + null, + 'color', + 'black', + 0, + 'height', + '200px', + 0, + ]); + expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ + null, + null, + 'foo', + true, + 0, + 'bar', + true, + 0, + ]); - patchContext(template, ['color', 'black', 'height', '200px'], ['bar', 'foo'], '1'); - expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ - null, - null, - 'color', - 'red', - 'height', - '200px', - ]); - expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ - null, null, 'foo', true, 'bar', true - ]); + allocStylingContext(element, template); - patchContext(template, ['color', 'black', 'height', '200px'], ['bar', 'foo'], '1'); - expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ - null, - null, - 'color', - 'red', - 'height', - '200px', - ]); - expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ - null, - null, - 'foo', - true, - 'bar', - true, - ]); - }); + patchContext(template, ['color', 'black', 'height', '200px'], ['bar', 'foo'], '1'); + expect(template[StylingIndex.InitialStyleValuesPosition]).toEqual([ + null, + null, + 'color', + 'black', + 0, + 'height', + '200px', + 0, + ]); + expect(template[StylingIndex.InitialClassValuesPosition]).toEqual([ + null, + null, + 'foo', + true, + 0, + 'bar', + true, + 0, + ]); + }); }); describe('instructions', () => { @@ -440,8 +492,8 @@ describe('style and class based bindings', () => { null, masterConfig(17, false, false), // [null, 2, false, null], - [null, null, 'width', null], - [null, null, 'foo', false], + [null, null, 'width', null, 0], + [null, null, 'foo', false, 0], [1, 1, 1, 1, 9, 13], [1, 0, 21, null, 1], [1, 0, 17, null, 1], @@ -478,8 +530,8 @@ describe('style and class based bindings', () => { null, masterConfig(25, false, false), // [null, 2, false, null, 'SOME DIRECTIVE', 6, false, null], - [null, null, 'width', null, 'height', null], - [null, null, 'foo', false, 'bar', false], + [null, null, 'width', null, 0, 'height', null, 1], + [null, null, 'foo', false, 0, 'bar', false, 1], [2, 2, 1, 1, 9, 17, 2, 1, 9, 13, 21], [2, 0, 33, null, 1, 0, 37, null, 1], [2, 0, 25, null, 1, 0, 29, null, 1], @@ -492,7 +544,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 29), + cleanStyle(6, 29), 'height', null, 1, @@ -504,7 +556,7 @@ describe('style and class based bindings', () => { 0, // #21 - cleanClass(5, 37), + cleanClass(6, 37), 'bar', null, 1, @@ -516,7 +568,7 @@ describe('style and class based bindings', () => { 0, // #29 - cleanStyle(5, 13), + cleanStyle(6, 13), 'height', null, 1, @@ -528,7 +580,7 @@ describe('style and class based bindings', () => { 0, // #37 - cleanClass(5, 21), + cleanClass(6, 21), 'bar', null, 1, @@ -544,8 +596,8 @@ describe('style and class based bindings', () => { null, 2, false, null, 'SOME DIRECTIVE', 6, false, null, 'SOME DIRECTIVE 2', 11, false, null ], - [null, null, 'width', null, 'height', null, 'opacity', null], - [null, null, 'foo', false, 'bar', false, 'baz', false], + [null, null, 'width', null, 0, 'height', null, 1, 'opacity', null, 2], + [null, null, 'foo', false, 0, 'bar', false, 1, 'baz', false, 2], [3, 3, 1, 1, 9, 21, 2, 1, 9, 13, 25, 3, 3, 17, 9, 13, 29, 25, 21], [3, 0, 45, null, 1, 0, 49, null, 1, 0, 53, null, 1], [3, 0, 33, null, 1, 0, 37, null, 1, 0, 41, null, 1], @@ -558,13 +610,13 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 37), + cleanStyle(6, 37), 'height', null, 1, // #17 - cleanStyle(7, 41), + cleanStyle(9, 41), 'opacity', null, 2, @@ -576,13 +628,13 @@ describe('style and class based bindings', () => { 0, // #25 - cleanClass(5, 49), + cleanClass(6, 49), 'bar', null, 1, // #29 - cleanClass(7, 53), + cleanClass(9, 53), 'baz', null, 2, @@ -594,13 +646,13 @@ describe('style and class based bindings', () => { 0, // #37 - cleanStyle(5, 13), + cleanStyle(6, 13), 'height', null, 1, // #41 - cleanStyle(7, 17), + cleanStyle(9, 17), 'opacity', null, 2, @@ -612,13 +664,13 @@ describe('style and class based bindings', () => { 0, // #49 - cleanClass(5, 25), + cleanClass(6, 25), 'bar', null, 1, // #53 - cleanClass(7, 29), + cleanClass(9, 29), 'baz', null, 2, @@ -642,7 +694,7 @@ describe('style and class based bindings', () => { it('should build a list of multiple styling values', () => { const getStyles = trackStylesFactory(); - const stylingContext = initContext(); + const stylingContext = createStylingContext(); updateStyles(stylingContext, { width: '100px', height: '100px', @@ -652,7 +704,7 @@ describe('style and class based bindings', () => { }); it('should evaluate the delta between style changes when rendering occurs', () => { - const stylingContext = initContext(['width', '100px'], ['width', 'height']); + const stylingContext = createStylingContext(['width', '100px'], ['width', 'height']); updateStyles(stylingContext, { height: '200px', }); @@ -674,7 +726,7 @@ describe('style and class based bindings', () => { it('should update individual values on a set of styles', () => { const getStyles = trackStylesFactory(); - const stylingContext = initContext(null, ['width', 'height']); + const stylingContext = createStylingContext(null, ['width', 'height']); updateStyles(stylingContext, { width: '100px', height: '100px', @@ -684,7 +736,7 @@ describe('style and class based bindings', () => { }); it('should only mark itself as updated when one or more properties have been applied', () => { - const stylingContext = initContext(); + const stylingContext = createStylingContext(); expect(isContextDirty(stylingContext)).toBeFalsy(); updateStyles(stylingContext, { @@ -709,7 +761,7 @@ describe('style and class based bindings', () => { }); it('should only mark itself as updated when any single properties have been applied', () => { - const stylingContext = initContext(null, ['height']); + const stylingContext = createStylingContext(null, ['height']); updateStyles(stylingContext, { width: '100px', height: '100px', @@ -729,7 +781,7 @@ describe('style and class based bindings', () => { it('should prioritize multi and single styles over initial styles', () => { const getStyles = trackStylesFactory(); - const stylingContext = initContext( + const stylingContext = createStylingContext( ['width', '100px', 'height', '100px', 'opacity', '0'], ['width', 'height', 'opacity']); expect(getStyles(stylingContext)).toEqual({}); @@ -764,7 +816,7 @@ describe('style and class based bindings', () => { }); it('should cleanup removed styles from the context once the styles are built', () => { - const stylingContext = initContext(null, ['width', 'height']); + const stylingContext = createStylingContext(null, ['width', 'height']); const getStyles = trackStylesFactory(); updateStyles(stylingContext, {width: '100px', height: '100px'}); @@ -776,7 +828,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 21), + cleanStyle(6, 21), 'height', null, 0, @@ -788,7 +840,7 @@ describe('style and class based bindings', () => { 0, // #21 - dirtyStyle(5, 13), + dirtyStyle(6, 13), 'height', '100px', 0, @@ -805,7 +857,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 25), + cleanStyle(6, 25), 'height', null, 0, @@ -823,7 +875,7 @@ describe('style and class based bindings', () => { 0, // #25 - dirtyStyle(5, 13), + dirtyStyle(6, 13), 'height', null, 0, @@ -838,7 +890,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 25), + cleanStyle(6, 25), 'height', null, 0, @@ -856,7 +908,7 @@ describe('style and class based bindings', () => { 0, // #23 - cleanStyle(5, 13), + cleanStyle(6, 13), 'height', null, 0, @@ -873,7 +925,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 25), + cleanStyle(6, 25), 'height', null, 0, @@ -891,7 +943,7 @@ describe('style and class based bindings', () => { 0, // #23 - cleanStyle(5, 13), + cleanStyle(6, 13), 'height', null, 0, @@ -908,7 +960,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 25), + cleanStyle(6, 25), 'height', null, 0, @@ -926,7 +978,7 @@ describe('style and class based bindings', () => { 0, // #23 - cleanStyle(5, 13), + cleanStyle(6, 13), 'height', null, 0, @@ -935,7 +987,7 @@ describe('style and class based bindings', () => { it('should find the next available space in the context when data is added after being removed before', () => { - const stylingContext = initContext(null, ['line-height']); + const stylingContext = createStylingContext(null, ['line-height']); const getStyles = trackStylesFactory(); updateStyles(stylingContext, {width: '100px', height: '100px', opacity: '0.5'}); @@ -1137,7 +1189,7 @@ describe('style and class based bindings', () => { it('should render all data as not being dirty after the styles are built', () => { const getStyles = trackStylesFactory(); - const stylingContext = initContext(null, ['height']); + const stylingContext = createStylingContext(null, ['height']); const cachedStyleValue = {width: '100px'}; @@ -1148,7 +1200,7 @@ describe('style and class based bindings', () => { element, masterConfig(13, true), // [null, 2, true, null], - [null, null, 'height', null], + [null, null, 'height', null, 0], [null, null], [1, 0, 1, 0, 9], [0, 0, 21, null, 0], @@ -1180,7 +1232,7 @@ describe('style and class based bindings', () => { element, masterConfig(13, false), // [null, 2, false, null], - [null, null, 'height', null], + [null, null, 'height', null, 0], [null, null], [1, 0, 1, 0, 9], [0, 0, 21, null, 0], @@ -1212,7 +1264,8 @@ describe('style and class based bindings', () => { const getStyles = trackStylesFactory(); const styleBindings = ['border-image', 'border-width']; const styleSanitizer = defaultStyleSanitizer; - const stylingContext = initContext(null, styleBindings, null, null, styleSanitizer); + const stylingContext = + createStylingContext(null, styleBindings, null, null, styleSanitizer); updateStyleProp(stylingContext, 0, 'url(foo.jpg)'); updateStyleProp(stylingContext, 1, '100px'); @@ -1225,7 +1278,7 @@ describe('style and class based bindings', () => { 0, // #13 - dirtyStyle(5, 21), + dirtyStyle(6, 21), 'border-width', '100px', 0, @@ -1237,7 +1290,7 @@ describe('style and class based bindings', () => { 0, // #21 - cleanStyle(5, 13), + cleanStyle(6, 13), 'border-width', null, 0, @@ -1253,7 +1306,7 @@ describe('style and class based bindings', () => { 0, // #13 - dirtyStyle(5, 25), + dirtyStyle(6, 25), 'border-width', '100px', 0, @@ -1271,7 +1324,7 @@ describe('style and class based bindings', () => { 0, // #23 - cleanStyle(5, 13), + cleanStyle(6, 13), 'border-width', null, 0, @@ -1287,7 +1340,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 25), + cleanStyle(6, 25), 'border-width', '100px', 0, @@ -1305,7 +1358,7 @@ describe('style and class based bindings', () => { 0, // #23 - cleanStyle(5, 13), + cleanStyle(6, 13), 'border-width', null, 0, @@ -1427,7 +1480,7 @@ describe('style and class based bindings', () => { 1, // #13 - cleanStyle(5, 21), + cleanStyle(6, 21), 'height', null, 1, @@ -1439,7 +1492,7 @@ describe('style and class based bindings', () => { 1, // #21 - dirtyStyle(5, 13), + dirtyStyle(6, 13), 'height', '99px', 1, @@ -1463,7 +1516,7 @@ describe('style and class based bindings', () => { 1, // #13 - cleanStyle(5, 25), + cleanStyle(6, 25), 'height', null, 1, @@ -1481,7 +1534,7 @@ describe('style and class based bindings', () => { 2, // #25 - dirtyStyle(5, 13), + dirtyStyle(6, 13), 'height', '999px', 3, @@ -1499,7 +1552,7 @@ describe('style and class based bindings', () => { 1, // #13 - cleanStyle(5, 25), + cleanStyle(6, 25), 'height', null, 1, @@ -1517,7 +1570,7 @@ describe('style and class based bindings', () => { 2, // #25 - dirtyStyle(5, 13), + dirtyStyle(6, 13), 'height', '999px', 3, @@ -1560,7 +1613,7 @@ describe('style and class based bindings', () => { 1, // #13 - cleanClass(5, 33), + cleanClass(6, 33), 'green', null, 1, @@ -1590,7 +1643,7 @@ describe('style and class based bindings', () => { 3, // #33 - dirtyClass(5, 13), + dirtyClass(6, 13), 'green', true, 3, @@ -1608,7 +1661,7 @@ describe('style and class based bindings', () => { 1, // #13 - cleanClass(5, 29), + cleanClass(6, 29), 'green', null, 1, @@ -1632,7 +1685,7 @@ describe('style and class based bindings', () => { 2, // #29 - dirtyClass(5, 13), + dirtyClass(6, 13), 'green', true, 3, @@ -1656,13 +1709,13 @@ describe('style and class based bindings', () => { 1, // #13 - cleanClass(5, 17), + cleanClass(6, 17), 'green', null, 1, // #17 - dirtyClass(5, 13), + dirtyClass(6, 13), 'green', true, 1, @@ -1813,7 +1866,7 @@ describe('style and class based bindings', () => { }); it('should skip issuing style updates if there is nothing to update upon first render', () => { - const stylingContext = initContext(null, ['color']); + const stylingContext = createStylingContext(null, ['color']); const store = new MockStylingStore(element as HTMLElement, BindingType.Class); const getStyles = trackStylesFactory(store); const otherDirective = {}; @@ -1844,13 +1897,13 @@ describe('style and class based bindings', () => { describe('classes', () => { it('should initialize with the provided class bindings', () => { - const template = initContext(null, null, null, ['one', 'two']); + const template = createStylingContext(null, null, null, ['one', 'two']); assertContext(template, [ element, masterConfig(17, false), // [null, 2, false, null], [null, null], - [null, null, 'one', false, 'two', false], + [null, null, 'one', false, 0, 'two', false, 0], [0, 2, 0, 2, 9, 13], [2, 0, 17, null, 2], [0, 0, 17, null, 0], @@ -1863,7 +1916,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanClass(5, 21), + cleanClass(6, 21), 'two', null, 0, @@ -1875,7 +1928,7 @@ describe('style and class based bindings', () => { 0, // #21 - cleanClass(5, 13), + cleanClass(6, 13), 'two', null, 0, @@ -1884,7 +1937,7 @@ describe('style and class based bindings', () => { it('should update multi class properties against the static classes', () => { const getClasses = trackClassesFactory(); - const stylingContext = initContext(null, null, ['bar'], ['bar', 'foo']); + const stylingContext = createStylingContext(null, null, ['bar'], ['bar', 'foo']); expect(getClasses(stylingContext)).toEqual({}); updateClasses(stylingContext, {foo: true, bar: false}); expect(getClasses(stylingContext)).toEqual({'foo': true, 'bar': false}); @@ -1894,7 +1947,7 @@ describe('style and class based bindings', () => { it('should update single class properties despite static classes being present', () => { const getClasses = trackClassesFactory(); - const stylingContext = initContext(null, null, ['bar'], ['bar', 'foo']); + const stylingContext = createStylingContext(null, null, ['bar'], ['bar', 'foo']); expect(getClasses(stylingContext)).toEqual({}); updateClassProp(stylingContext, 0, true); @@ -1909,7 +1962,7 @@ describe('style and class based bindings', () => { it('should understand updating multi-classes using a string-based value while respecting single class-based props', () => { const getClasses = trackClassesFactory(); - const stylingContext = initContext(null, null, null, ['baz']); + const stylingContext = createStylingContext(null, null, null, ['baz']); expect(getClasses(stylingContext)).toEqual({}); updateStylingMap(stylingContext, 'foo bar baz'); @@ -1924,14 +1977,14 @@ describe('style and class based bindings', () => { it('should place styles within the context and work alongside style-based values in harmony', () => { const getStylesAndClasses = trackStylesAndClasses(); - const stylingContext = - initContext(['width', '100px'], ['width', 'height'], ['wide'], ['wide', 'tall']); + const stylingContext = createStylingContext( + ['width', '100px'], ['width', 'height'], ['wide'], ['wide', 'tall']); assertContext(stylingContext, [ element, masterConfig(25, false), // [null, 2, false, null], - [null, null, 'width', '100px', 'height', null], - [null, null, 'wide', true, 'tall', false], + [null, null, 'width', '100px', 0, 'height', null, 0], + [null, null, 'wide', true, 0, 'tall', false, 0], [2, 2, 2, 2, 9, 13, 17, 21], [2, 0, 33, null, 2], [2, 0, 25, null, 2], @@ -1944,7 +1997,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 29), + cleanStyle(6, 29), 'height', null, 0, @@ -1956,7 +2009,7 @@ describe('style and class based bindings', () => { 0, // #21 - cleanClass(5, 37), + cleanClass(6, 37), 'tall', null, 0, @@ -1968,7 +2021,7 @@ describe('style and class based bindings', () => { 0, // #29 - cleanStyle(5, 13), + cleanStyle(6, 13), 'height', null, 0, @@ -1980,7 +2033,7 @@ describe('style and class based bindings', () => { 0, // #37 - cleanClass(5, 21), + cleanClass(6, 21), 'tall', null, 0, @@ -1994,8 +2047,8 @@ describe('style and class based bindings', () => { element, masterConfig(25, true), // [null, 2, true, null], - [null, null, 'width', '100px', 'height', null], - [null, null, 'wide', true, 'tall', false], + [null, null, 'width', '100px', 0, 'height', null, 0], + [null, null, 'wide', true, 0, 'tall', false, 0], [2, 2, 2, 2, 9, 13, 17, 21], [2, 0, 37, 'tall round', 2], [2, 0, 25, cachedStyleMap, 2], @@ -2008,7 +2061,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 33), + cleanStyle(6, 33), 'height', null, 0, @@ -2020,7 +2073,7 @@ describe('style and class based bindings', () => { 0, // #21 - cleanClass(5, 37), + cleanClass(6, 37), 'tall', null, 0, @@ -2038,13 +2091,13 @@ describe('style and class based bindings', () => { 0, // #33 - cleanStyle(5, 13), + cleanStyle(6, 13), 'height', null, 0, // #37 - dirtyClass(5, 21), + dirtyClass(6, 21), 'tall', true, 0, @@ -2076,8 +2129,8 @@ describe('style and class based bindings', () => { element, masterConfig(25, true), // [null, 2, true, null], - [null, null, 'width', '100px', 'height', null], - [null, null, 'wide', true, 'tall', false], + [null, null, 'width', '100px', 0, 'height', null, 0], + [null, null, 'wide', true, 0, 'tall', false, 0], [2, 2, 2, 2, 9, 13, 17, 21], [2, 0, 37, cachedClassMap, 2], [1, 0, 25, cachedStyleMap, 1], @@ -2090,7 +2143,7 @@ describe('style and class based bindings', () => { 0, // #13 - cleanStyle(5, 33), + cleanStyle(6, 33), 'height', null, 0, @@ -2102,7 +2155,7 @@ describe('style and class based bindings', () => { 0, // #21 - cleanClass(5, 37), + cleanClass(6, 37), 'tall', null, 0, @@ -2120,13 +2173,13 @@ describe('style and class based bindings', () => { 0, // #33 - cleanStyle(5, 13), + cleanStyle(6, 13), 'height', null, 0, // #37 - cleanClass(5, 21), + cleanClass(6, 21), 'tall', true, 0, @@ -2158,7 +2211,7 @@ describe('style and class based bindings', () => { it('should skip updating multi classes and styles if the input identity has not changed', () => { - const stylingContext = initContext(); + const stylingContext = createStylingContext(); const getStylesAndClasses = trackStylesAndClasses(); const stylesMap = {width: '200px'}; @@ -2214,7 +2267,7 @@ describe('style and class based bindings', () => { }); it('should skip updating multi classes if the string-based identity has not changed', () => { - const stylingContext = initContext(); + const stylingContext = createStylingContext(); const getClasses = trackClassesFactory(); const classes = 'apple orange banana'; @@ -2262,7 +2315,7 @@ describe('style and class based bindings', () => { }); it('should skip issuing class updates if there is nothing to update upon first render', () => { - const stylingContext = initContext(null, null, ['blue'], ['blue']); + const stylingContext = createStylingContext(null, null, ['blue'], ['blue']); const store = new MockStylingStore(element as HTMLElement, BindingType.Class); const getClasses = trackClassesFactory(store); @@ -2292,7 +2345,7 @@ describe('style and class based bindings', () => { describe('players', () => { it('should build a player with the computed styles and classes', () => { - const context = initContext(); + const context = createStylingContext(); const styles = {width: '100px', height: '200px'}; const classes = 'foo bar'; @@ -2332,7 +2385,7 @@ describe('style and class based bindings', () => { }); it('should only build one player for a given style map', () => { - const context = initContext(null, []); + const context = createStylingContext(null, []); let count = 0; const buildFn = (element: HTMLElement, type: BindingType, value: any) => { @@ -2355,7 +2408,7 @@ describe('style and class based bindings', () => { }); it('should only build one player for a given class map', () => { - const context = initContext(null, []); + const context = createStylingContext(null, []); let count = 0; const buildFn = (element: HTMLElement, type: BindingType, value: any) => { @@ -2377,7 +2430,7 @@ describe('style and class based bindings', () => { }); it('should store active players in the player context and remove them once destroyed', () => { - const context = initContext(null, []); + const context = createStylingContext(null, []); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); @@ -2439,7 +2492,7 @@ describe('style and class based bindings', () => { it('should kick off single property change players alongside map-based ones and remove the players', () => { - const context = initContext(null, ['width', 'height'], null, ['foo', 'bar']); + const context = createStylingContext(null, ['width', 'height'], null, ['foo', 'bar']); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); @@ -2536,7 +2589,7 @@ describe('style and class based bindings', () => { it('should destroy an existing player that was queued before it is flushed once the binding updates', () => { - const context = initContext(null, ['width']); + const context = createStylingContext(null, ['width']); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); @@ -2571,7 +2624,7 @@ describe('style and class based bindings', () => { it('should nullify style map and style property factories if any follow up expressions not use them', () => { - const context = initContext(null, ['color'], null, ['foo']); + const context = createStylingContext(null, ['color'], null, ['foo']); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); @@ -2590,15 +2643,15 @@ describe('style and class based bindings', () => { }; assertContext(context, [ - element, // - masterConfig(17, false), // - [null, 2, false, null], // - [null, null, 'color', null], // - [null, null, 'foo', false], // - [1, 1, 1, 1, 9, 13], // - [1, 0, 21, null, 1], // - [1, 0, 17, null, 1], // - null, // + element, // + masterConfig(17, false), // + [null, 2, false, null], // + [null, null, 'color', null, 0], // + [null, null, 'foo', false, 0], // + [1, 1, 1, 1, 9, 13], // + [1, 0, 21, null, 1], // + [1, 0, 17, null, 1], // + null, // // #9 cleanStyle(3, 17), @@ -2656,8 +2709,8 @@ describe('style and class based bindings', () => { element, // masterConfig(17, false), // [null, 2, false, null], // - [null, null, 'color', null], // - [null, null, 'foo', false], // + [null, null, 'color', null, 0], // + [null, null, 'foo', false, 0], // [1, 1, 1, 1, 9, 13], // [1, 0, 25, classMapWithPlayerFactory, 1], // [1, 0, 17, styleMapWithPlayerFactory, 1], // @@ -2714,14 +2767,14 @@ describe('style and class based bindings', () => { ] as PlayerContext); assertContext(context, [ - element, // - masterConfig(17, false), // - [null, 2, false, null], // - [null, null, 'color', null], // - [null, null, 'foo', false], // - [1, 1, 1, 1, 9, 13], // - [1, 0, 25, cachedClassMap, 1], // - [1, 0, 17, cachedStyleMap, 1], // + element, // + masterConfig(17, false), // + [null, 2, false, null], // + [null, null, 'color', null, 0], // + [null, null, 'foo', false, 0], // + [1, 1, 1, 1, 9, 13], // + [1, 0, 25, cachedClassMap, 1], // + [1, 0, 17, cachedStyleMap, 1], // playerContext, // #9 @@ -2763,7 +2816,7 @@ describe('style and class based bindings', () => { }); it('should not call a factory if no style and/or class values have been updated', () => { - const context = initContext([]); + const context = createStylingContext([]); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); @@ -2813,7 +2866,7 @@ describe('style and class based bindings', () => { it('should invoke a single prop player over a multi style player when present and delegate back if not', () => { - const context = initContext(null, ['color']); + const context = createStylingContext(null, ['color']); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); @@ -2860,7 +2913,7 @@ describe('style and class based bindings', () => { }); it('should return the old player for styles when a follow-up player is instantiated', () => { - const context = initContext([]); + const context = createStylingContext([]); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); @@ -2890,7 +2943,7 @@ describe('style and class based bindings', () => { }); it('should return the old player for classes when a follow-up player is instantiated', () => { - const context = initContext(); + const context = createStylingContext(); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); @@ -2932,7 +2985,7 @@ describe('style and class based bindings', () => { } }) as StyleSanitizeFn; - const context = initContext(null, null, null, null, sanitizer); + const context = createStylingContext(null, null, null, null, sanitizer); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); @@ -2959,7 +3012,7 @@ describe('style and class based bindings', () => { it('should automatically destroy existing players when the follow-up binding is not apart of a factory', () => { - const context = initContext(null, ['width'], null, ['foo', 'bar']); + const context = createStylingContext(null, ['width'], null, ['foo', 'bar']); const handler = new CorePlayerHandler(); const lView = createMockViewData(handler, context); diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index d2fda4e4b3..5f1ce83d21 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -17,37 +17,33 @@ // tslint:disable window.testBlocklist = { - "Portals CdkPortalOutlet should not clear programmatically-attached portals on init": { - "error": "ObjectUnsubscribedError: object unsubscribed", - "notes": "Unknown" - }, "Portals DomPortalOutlet should attach and detach a component portal without a ViewContainerRef": { "error": "Error: Expected '

Pizza

Chocolate

' to be '', 'Expected the DomPortalOutlet to be empty after detach'.", "notes": "Unknown" }, "CdkDrag in a drop container should be able to customize the preview element": { "error": "Error: Expected cdk-drag cdk-drag-preview to contain 'custom-preview'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + "notes": "Unknown" }, "CdkDrag in a drop container should position custom previews next to the pointer": { "error": "Error: Expected 'translate3d(8px, 33px, 0px)' to be 'translate3d(50px, 50px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + "notes": "Unknown" }, "CdkDrag in a drop container should lock position inside a drop container along the x axis": { "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + "notes": "Unknown" }, "CdkDrag in a drop container should lock position inside a drop container along the y axis": { "error": "Error: Expected 'translate3d(8px, 83px, 0px)' to be 'translate3d(50px, 100px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + "notes": "Unknown" }, "CdkDrag in a drop container should inherit the position locking from the drop container": { "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + "notes": "Unknown" }, "CdkDrag in a drop container should be able to customize the placeholder": { "error": "Error: Expected cdk-drag cdk-drag-placeholder to contain 'custom-placeholder'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + "notes": "Unknown" }, "CdkTable should be able to render multiple header and footer rows": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", @@ -129,21 +125,13 @@ window.testBlocklist = { "error": "Error: Failed: Expected node descendant num to be 2 but was 0", "notes": "Unknown" }, - "MatInput without forms validates the type": { - "error": "Error: Input type \"file\" isn't supported by matInput.", - "notes": "Unknown" - }, - "MatInput with textarea autosize should work in a step": { - "error": "TypeError: Cannot read property 'getBoundingClientRect' of null", - "notes": "Unknown" - }, "MatChipList StandardChipList basic behaviors should toggle the chips disabled state based on whether it is disabled": { "error": "Error: Expected true to be false.", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" + "notes": "Unknown" }, "MatChipList StandardChipList focus behaviors should focus the first chip on focus": { "error": "Error: Expected -1 to be 0.", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" + "notes": "Unknown" }, "MatChipList StandardChipList focus behaviors should watch for chip focus": { "error": "TypeError: Cannot read property 'focus' of undefined", @@ -187,23 +175,23 @@ window.testBlocklist = { }, "MatChipList FormFieldChipList keyboard behavior should maintain focus if the active chip is deleted": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" + "notes": "Unknown" }, "MatChipList FormFieldChipList keyboard behavior when the input has focus should not focus the last chip when press DELETE": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" + "notes": "Unknown" }, "MatChipList FormFieldChipList keyboard behavior when the input has focus should focus the last chip when press BACKSPACE": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" + "notes": "Unknown" }, "MatChipList FormFieldChipList should complete the stateChanges stream on destroy": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" + "notes": "Unknown" }, "MatChipList FormFieldChipList should point the label id to the chip input": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" + "notes": "Unknown" }, "MatChipList with chip remove should properly focus next item if chip is removed through click": { "error": "TypeError: Cannot read property 'focus' of undefined", @@ -229,30 +217,10 @@ window.testBlocklist = { "error": "TypeError: Cannot read property 'nativeElement' of undefined", "notes": "Unknown" }, - "MatStepper basic stepper should set the correct aria-posinset and aria-setsize": { - "error": "Error: Expected $.length = 0 to equal 3.", - "notes": "Unknown" - }, "MatStepper linear stepper should not move to next step if current step is pending": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", "notes": "Unknown" }, - "MatStepper aria labelling should not set aria-label or aria-labelledby attributes if they are not passed in": { - "error": "TypeError: Cannot read property 'hasAttribute' of null", - "notes": "Unknown" - }, - "MatStepper aria labelling should set the aria-label attribute": { - "error": "TypeError: Cannot read property 'getAttribute' of null", - "notes": "Unknown" - }, - "MatStepper aria labelling should set the aria-labelledby attribute": { - "error": "TypeError: Cannot read property 'getAttribute' of null", - "notes": "Unknown" - }, - "MatStepper aria labelling should not be able to set both an aria-label and aria-labelledby": { - "error": "TypeError: Cannot read property 'getAttribute' of null", - "notes": "Unknown" - }, "MatStepper stepper with error state should show error state": { "error": "TypeError: Cannot read property 'nativeElement' of undefined", "notes": "Unknown" @@ -266,44 +234,36 @@ window.testBlocklist = { "notes": "Unknown" }, "MatSidenav should be fixed position when in fixed mode": { - "error": "Error: Expected ng-tns-c28435-0 ng-trigger ng-trigger-transform mat-drawer mat-drawer-over ng-star-inserted to contain 'mat-sidenav-fixed'.", - "notes": "FW-1132: Host class bindings don't work if super class has host class bindings" + "error": "Error: Expected ng-tns-c21962-0 ng-trigger ng-trigger-transform mat-drawer mat-sidenav mat-drawer-over ng-star-inserted to contain 'mat-sidenav-fixed'.", + "notes": "Unknown" }, "MatSidenav should set fixed bottom and top when in fixed mode": { "error": "Error: Expected '' to be '20px'.", - "notes": "FW-1132: Host class bindings don't work if super class has host class bindings" - }, - "MatTree flat tree should initialize with rendered dataNodes": { - "error": "TypeError: Cannot read property 'classList' of undefined", "notes": "FW-1081: Static host classes don't work if component has superclass with host classes" }, "MatTree flat tree with toggle should expand/collapse the node": { - "error": "TypeError: Cannot read property 'click' of undefined", - "notes": "FW-1081: Static host classes don't work if component has superclass with host classes" + "error": "Error: Expected 0 to be 1, 'Expect node expanded one level'.", + "notes": "Unknown" }, "MatTree flat tree with toggle should expand/collapse the node recursively": { - "error": "TypeError: Cannot read property 'click' of undefined", - "notes": "FW-1081: Static host classes don't work if component has superclass with host classes" - }, - "MatTree flat tree with undefined or null children should initialize with rendered dataNodes": { - "error": "TypeError: Cannot read property 'classList' of undefined", - "notes": "FW-1081: Static host classes don't work if component has superclass with host classes" - }, - "MatTree nested tree with undefined or null children should initialize with rendered dataNodes": { - "error": "TypeError: Cannot read property 'classList' of undefined", - "notes": "FW-1081: Static host classes don't work if component has superclass with host classes" - }, - "MatTree nested tree should initialize with rendered dataNodes": { - "error": "TypeError: Cannot read property 'classList' of undefined", - "notes": "FW-1081: Static host classes don't work if component has superclass with host classes" + "error": "Error: Expected 0 to be 3, 'Expect nodes expanded'.", + "notes": "Unknown" }, "MatTree nested tree with toggle should expand/collapse the node": { - "error": "TypeError: Cannot read property 'click' of undefined", - "notes": "FW-1081: Static host classes don't work if component has superclass with host classes" + "error": "Error: Expected 0 to be 1, 'Expect node expanded'.", + "notes": "Unknown" }, "MatTree nested tree with toggle should expand/collapse the node recursively": { - "error": "TypeError: Cannot read property 'click' of undefined", - "notes": "FW-1081: Static host classes don't work if component has superclass with host classes" + "error": "Error: Expected 0 to be 3, 'Expect node expanded'.", + "notes": "Unknown" + }, + "MatInput without forms validates the type": { + "error": "Error: Input type \"file\" isn't supported by matInput.", + "notes": "Unknown" + }, + "MatInput with textarea autosize should work in a step": { + "error": "TypeError: Cannot read property 'getBoundingClientRect' of null", + "notes": "Unknown" }, "Dialog should set the proper animation states": { "error": "TypeError: Cannot read property 'componentInstance' of null", @@ -355,79 +315,47 @@ window.testBlocklist = { }, "MatTooltip special cases should clear the `user-select` when a tooltip is set on a text field": { "error": "Error: Expected 'none' to be falsy.", - "notes": "FW-1133: Inline styles are not applied before constructor is run" + "notes": "Unknown" }, "MatTooltip special cases should clear the `-webkit-user-drag` on draggable elements": { "error": "Error: Expected 'none' to be falsy.", - "notes": "FW-1133: Inline styles are not applied before constructor is run" - }, - "MatTable with basic data source should be able to create a table with the right content and without when row": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", - "notes": "Unknown" - }, - "MatTable with basic data source should create a table with special when row": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", - "notes": "Unknown" - }, - "MatTable with basic data source should create a table with multiTemplateDataRows true": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", "notes": "Unknown" }, "MatTable should be able to render a table correctly with native elements": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", "notes": "Unknown" }, - "MatTable should render with MatTableDataSource and sort": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", - "notes": "Unknown" - }, - "MatTable should render with MatTableDataSource and pagination": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", - "notes": "Unknown" - }, "MatTable should apply custom sticky CSS class to sticky cells": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", "notes": "Unknown" }, - "MatTable with MatTableDataSource and sort/pagination/filter should create table and display data source contents": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", - "notes": "Unknown" - }, - "MatTable with MatTableDataSource and sort/pagination/filter changing data should update the table contents": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", - "notes": "Unknown" - }, "MatTable with MatTableDataSource and sort/pagination/filter should be able to filter the table contents": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", - "notes": "Unknown" - }, - "MatTable with MatTableDataSource and sort/pagination/filter should not match concatenated words": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", + "error": "TypeError: Cannot read property 'length' of undefined", "notes": "Unknown" }, "MatTable with MatTableDataSource and sort/pagination/filter should be able to sort the table contents": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", + "error": "Error: Failed: Expected cell contents to be a_3 but was a_1", "notes": "Unknown" }, "MatTable with MatTableDataSource and sort/pagination/filter should by default correctly sort an empty string": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", + "error": "Error: Failed: Expected cell contents to be but was a_1", "notes": "Unknown" }, "MatTable with MatTableDataSource and sort/pagination/filter should by default correctly sort undefined values": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", + "error": "Error: Failed: Expected cell contents to be but was a_1", "notes": "Unknown" }, "MatTable with MatTableDataSource and sort/pagination/filter should sort zero correctly": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", + "error": "Error: Failed: Expected cell contents to be -1 but was a_1", "notes": "Unknown" }, "MatTable with MatTableDataSource and sort/pagination/filter should be able to page the table contents": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", + "error": "Error: Failed: Expected 7 total rows but got 105", "notes": "Unknown" }, "MatTable with MatTableDataSource and sort/pagination/filter should sort strings with numbers larger than MAX_SAFE_INTEGER correctly": { - "error": "TypeError: Cannot read property 'querySelectorAll' of null", + "error": "Error: Failed: Expected cell contents to be 9563256840123535 but was a_1", "notes": "Unknown" } }; -// clang-format on +// clang-format on \ No newline at end of file From aa57bdbf90f2ceae4e0acf842611e2a0873cb9d2 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Thu, 21 Feb 2019 21:33:05 -0800 Subject: [PATCH 0208/1073] fix(ivy): wrap "inputs" and "outputs" keys if they contain unsafe characters (#28919) Prior to this change, keys in "inputs" and "outputs" objects generated by compiler were not checked against unsafe characters. As a result, in some cases the generated code was throwing JS error. Now we check whether a given key contains any unsafe chars and wrap it in quotes if needed. PR Close #28919 --- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 22 +++++++++++++++++++ packages/compiler/src/render3/view/util.ts | 13 ++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 1e50aab87d..a54f684084 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -2148,6 +2148,28 @@ describe('ngtsc behavioral tests', () => { }); }); + it('should wrap "inputs" and "outputs" keys if they contain unsafe characters', () => { + env.tsconfig({}); + env.write(`test.ts`, ` + import {Directive} from '@angular/core'; + + @Directive({ + selector: '[somedir]', + inputs: ['input-track-type', 'inputTrackName'], + outputs: ['output-track-type', 'outputTrackName'] + }) + export class SomeDir {} + `); + + env.driveMain(); + const jsContents = env.getContents('test.js'); + const inputsAndOutputs = ` + inputs: { "input-track-type": "input-track-type", inputTrackName: "inputTrackName" }, + outputs: { "output-track-type": "output-track-type", outputTrackName: "outputTrackName" } + `; + expect(trim(jsContents)).toContain(trim(inputsAndOutputs)); + }); + it('should compile programs with typeRoots', () => { // Write out a custom tsconfig.json that includes 'typeRoots' and 'files'. 'files' is necessary // because otherwise TS picks up the testTypeRoot/test/index.d.ts file into the program diff --git a/packages/compiler/src/render3/view/util.ts b/packages/compiler/src/render3/view/util.ts index 8b3f375d16..1e533b204e 100644 --- a/packages/compiler/src/render3/view/util.ts +++ b/packages/compiler/src/render3/view/util.ts @@ -13,6 +13,16 @@ import * as t from '../r3_ast'; import {R3QueryMetadata} from './api'; import {isI18nAttribute} from './i18n/util'; +/** + * Checks whether an object key contains potentially unsafe chars, thus the key should be wrapped in + * quotes. Note: we do not wrap all keys into quotes, as it may have impact on minification and may + * bot work in some cases when object keys are mangled by minifier. + * + * TODO(FW-1136): this is a temporary solution, we need to come up with a better way of working with + * inputs that contain potentially unsafe chars. + */ +const UNSAFE_OBJECT_KEY_NAME_REGEXP = /-/g; + /** Name of the temporary to use during data binding */ export const TEMPORARY_NAME = '_t'; @@ -92,7 +102,8 @@ function mapToExpression( minifiedName = declaredName; return { key: minifiedName, - quoted: false, + // put quotes around keys that contain potentially unsafe characters + quoted: UNSAFE_OBJECT_KEY_NAME_REGEXP.test(minifiedName), value: (keepDeclared && publicName !== declaredName) ? o.literalArr([asLiteral(publicName), asLiteral(declaredName)]) : asLiteral(publicName) From 04cf4ef0c7985c6d1df7e203cfbef34d52402e3d Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Mon, 4 Mar 2019 14:59:52 +0100 Subject: [PATCH 0209/1073] test(ivy): remove ngComponentOutlet example with a lazy-loaded NgModule (#29094) PR Close #29094 --- .../src/directives/ng_component_outlet.ts | 4 -- .../ts/e2e_test/ngComponentOutlet_spec.ts | 45 ++++++--------- .../common/ngComponentOutlet/ts/module.ts | 55 ++----------------- 3 files changed, 23 insertions(+), 81 deletions(-) diff --git a/packages/common/src/directives/ng_component_outlet.ts b/packages/common/src/directives/ng_component_outlet.ts index 5a7141b70f..23f2b856a4 100644 --- a/packages/common/src/directives/ng_component_outlet.ts +++ b/packages/common/src/directives/ng_component_outlet.ts @@ -60,10 +60,6 @@ import {ComponentFactoryResolver, ComponentRef, Directive, Injector, Input, NgMo * A more complete example with additional options: * * {@example common/ngComponentOutlet/ts/module.ts region='CompleteExample'} - - * A more complete example with ngModuleFactory: - * - * {@example common/ngComponentOutlet/ts/module.ts region='NgModuleFactoryExample'} * * @publicApi * @ngModule CommonModule diff --git a/packages/examples/common/ngComponentOutlet/ts/e2e_test/ngComponentOutlet_spec.ts b/packages/examples/common/ngComponentOutlet/ts/e2e_test/ngComponentOutlet_spec.ts index f04cd582b2..6dd03cfed8 100644 --- a/packages/examples/common/ngComponentOutlet/ts/e2e_test/ngComponentOutlet_spec.ts +++ b/packages/examples/common/ngComponentOutlet/ts/e2e_test/ngComponentOutlet_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {fixmeIvy, modifiedInIvy} from '@angular/private/testing'; +import {modifiedInIvy} from '@angular/private/testing'; import {$, ExpectedConditions, browser, by, element} from 'protractor'; import {verifyNoBrowserErrors} from '../../../../test-utils'; @@ -17,33 +17,24 @@ function waitForElement(selector: string) { browser.wait(EC.presenceOf($(selector)), 20000); } -fixmeIvy('FW-1022: JitCompilerFactory creates incorrect compiler instance') - .describe('ngComponentOutlet', () => { - const URL = '/ngComponentOutlet'; - afterEach(verifyNoBrowserErrors); +describe('ngComponentOutlet', () => { + const URL = '/ngComponentOutlet'; + afterEach(verifyNoBrowserErrors); - describe('ng-component-outlet-example', () => { - it('should render simple', () => { + describe('ng-component-outlet-example', () => { + it('should render simple', () => { + browser.get(URL); + waitForElement('ng-component-outlet-simple-example'); + expect(element.all(by.css('hello-world')).getText()).toEqual(['Hello World!']); + }); + + modifiedInIvy('Different behavior for projectableNodes in ViewContainerRef.createComponent') + .it('should render complete', () => { browser.get(URL); - waitForElement('ng-component-outlet-simple-example'); - expect(element.all(by.css('hello-world')).getText()).toEqual(['Hello World!']); - }); - - modifiedInIvy('Different behavior for projectableNodes in ViewContainerRef.createComponent') - .it('should render complete', () => { - browser.get(URL); - waitForElement('ng-component-outlet-complete-example'); - expect(element.all(by.css('complete-component')).getText()).toEqual([ - 'Complete: AhojSvet!' - ]); - }); - - it('should render other module', () => { - browser.get(URL); - waitForElement('ng-component-outlet-other-module-example'); - expect(element.all(by.css('other-module-component')).getText()).toEqual([ - 'Other Module Component!' + waitForElement('ng-component-outlet-complete-example'); + expect(element.all(by.css('complete-component')).getText()).toEqual([ + 'Complete: AhojSvet!' ]); }); - }); - }); + }); +}); diff --git a/packages/examples/common/ngComponentOutlet/ts/module.ts b/packages/examples/common/ngComponentOutlet/ts/module.ts index a351268186..e395805cfa 100644 --- a/packages/examples/common/ngComponentOutlet/ts/module.ts +++ b/packages/examples/common/ngComponentOutlet/ts/module.ts @@ -6,11 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ -import {CommonModule} from '@angular/common'; -import {COMPILER_OPTIONS, Compiler, CompilerFactory, Component, Injectable, Injector, NgModule, NgModuleFactory} from '@angular/core'; +import {Component, Injectable, Injector, NgModule} from '@angular/core'; import {BrowserModule} from '@angular/platform-browser'; -import {JitCompilerFactory} from '@angular/platform-browser-dynamic'; - // #docregion SimpleExample @@ -63,65 +60,23 @@ export class NgTemplateOutletCompleteExample { } // #enddocregion -// #docregion NgModuleFactoryExample -@Component({selector: 'other-module-component', template: `Other Module Component!`}) -export class OtherModuleComponent { -} - -@Component({ - selector: 'ng-component-outlet-other-module-example', - template: ` - ` -}) -export class NgTemplateOutletOtherModuleExample { - // This field is necessary to expose OtherModuleComponent to the template. - OtherModuleComponent = OtherModuleComponent; - myModule: NgModuleFactory; - - constructor(compiler: Compiler) { this.myModule = compiler.compileModuleSync(OtherModule); } -} -// #enddocregion - @Component({ selector: 'example-app', template: `
- -
- ` + ` }) export class AppComponent { } -@NgModule({ - imports: [CommonModule], - declarations: [OtherModuleComponent], - entryComponents: [OtherModuleComponent] -}) -export class OtherModule { -} - -export function createCompiler(compilerFactory: CompilerFactory) { - return compilerFactory.createCompiler(); -} - @NgModule({ imports: [BrowserModule], declarations: [ - AppComponent, NgTemplateOutletSimpleExample, NgTemplateOutletCompleteExample, - NgTemplateOutletOtherModuleExample, HelloWorld, CompleteComponent + AppComponent, NgTemplateOutletSimpleExample, NgTemplateOutletCompleteExample, HelloWorld, + CompleteComponent ], - entryComponents: [HelloWorld, CompleteComponent], - providers: [ - // Setup the JIT compiler that is not set up by default because the examples - // are bootstrapped using their NgModule factory. Since this example uses the - // JIT compiler, we manually set it up for this module. - {provide: COMPILER_OPTIONS, useValue: {}, multi: true}, - {provide: CompilerFactory, useClass: JitCompilerFactory, deps: [COMPILER_OPTIONS]}, - {provide: Compiler, useFactory: createCompiler, deps: [CompilerFactory]} - ] + entryComponents: [HelloWorld, CompleteComponent] }) export class AppModule { } From 866d500324e20682c30aa90eeb4fef52bdb81e71 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 1 Mar 2019 15:17:26 -0800 Subject: [PATCH 0210/1073] fix(ivy): copy top-level comments into generated factory shims (#29065) When ngtsc generates a .ngfactory shim, it does so based on the contents of an original file in the program. Occasionally these original files have comments at the top which are load-bearing (e.g. they contain jsdoc annotations which are significant to downstream bundling tools). The generated factory shims should preserve this comment. This commit adds a step to the ngfactory generator to preserve the top-level comment from the original source file. FW-1006 #resolve FW-1095 #resolve PR Close #29065 --- .../src/ngtsc/shims/src/factory_generator.ts | 15 +++++++++++++-- packages/compiler-cli/test/ngtsc/ngtsc_spec.ts | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/shims/src/factory_generator.ts b/packages/compiler-cli/src/ngtsc/shims/src/factory_generator.ts index c32a288ca3..a9487be803 100644 --- a/packages/compiler-cli/src/ngtsc/shims/src/factory_generator.ts +++ b/packages/compiler-cli/src/ngtsc/shims/src/factory_generator.ts @@ -56,14 +56,25 @@ export class FactoryGenerator implements ShimGenerator { // Grab the symbol name. .map(decl => decl.name !.text); - let sourceText = ''; + + // If there is a top-level comment in the original file, copy it over at the top of the + // generated factory file. This is important for preserving any load-bearing jsdoc comments. + let comment: string = ''; + if (original.statements.length > 0) { + const firstStatement = original.statements[0]; + if (firstStatement.getLeadingTriviaWidth() > 0) { + comment = firstStatement.getFullText().substr(0, firstStatement.getLeadingTriviaWidth()); + } + } + + let sourceText = comment; if (symbolNames.length > 0) { // For each symbol name, generate a constant export of the corresponding NgFactory. // This will encompass a lot of symbols which don't need factories, but that's okay // because it won't miss any that do. const varLines = symbolNames.map( name => `export const ${name}NgFactory = new i0.ɵNgModuleFactory(${name});`); - sourceText = [ + sourceText += [ // This might be incorrect if the current package being compiled is Angular core, but it's // okay to leave in at type checking time. TypeScript can handle this reference via its path // mapping, but downstream bundlers can't. If the current package is core itself, this will diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index a54f684084..a19e1c6a3e 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -1694,6 +1694,22 @@ describe('ngtsc behavioral tests', () => { expect(emptyFactory).toContain(`export var ɵNonEmptyModule = true;`); }); + it('should copy a top-level comment into a factory stub', () => { + env.tsconfig({'allowEmptyCodegenFiles': true}); + + env.write('test.ts', `/** I am a top-level comment. */ + import {NgModule} from '@angular/core'; + + @NgModule({}) + export class TestModule {} + `); + + env.driveMain(); + + const factoryContents = env.getContents('test.ngfactory.js'); + expect(factoryContents).toMatch(/^\/\*\* I am a top-level comment\. \*\//); + }); + it('should be able to compile an app using the factory shim', () => { env.tsconfig({'allowEmptyCodegenFiles': true}); From 5fded9fcc827d29f7071f123f026cea311dc1a60 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Mon, 4 Mar 2019 16:35:42 -0800 Subject: [PATCH 0211/1073] test(ivy): restore root causes that were accidentally deleted (#29109) PR Close #29109 --- .../angular_material_test_blocklist.js | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 5f1ce83d21..9e14aa13a7 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -23,27 +23,27 @@ window.testBlocklist = { }, "CdkDrag in a drop container should be able to customize the preview element": { "error": "Error: Expected cdk-drag cdk-drag-preview to contain 'custom-preview'.", - "notes": "Unknown" + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" }, "CdkDrag in a drop container should position custom previews next to the pointer": { "error": "Error: Expected 'translate3d(8px, 33px, 0px)' to be 'translate3d(50px, 50px, 0px)'.", - "notes": "Unknown" + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" }, "CdkDrag in a drop container should lock position inside a drop container along the x axis": { "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", - "notes": "Unknown" + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" }, "CdkDrag in a drop container should lock position inside a drop container along the y axis": { "error": "Error: Expected 'translate3d(8px, 83px, 0px)' to be 'translate3d(50px, 100px, 0px)'.", - "notes": "Unknown" + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" }, "CdkDrag in a drop container should inherit the position locking from the drop container": { "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", - "notes": "Unknown" + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" }, "CdkDrag in a drop container should be able to customize the placeholder": { "error": "Error: Expected cdk-drag cdk-drag-placeholder to contain 'custom-placeholder'.", - "notes": "Unknown" + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" }, "CdkTable should be able to render multiple header and footer rows": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", @@ -127,11 +127,11 @@ window.testBlocklist = { }, "MatChipList StandardChipList basic behaviors should toggle the chips disabled state based on whether it is disabled": { "error": "Error: Expected true to be false.", - "notes": "Unknown" + "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" }, "MatChipList StandardChipList focus behaviors should focus the first chip on focus": { "error": "Error: Expected -1 to be 0.", - "notes": "Unknown" + "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" }, "MatChipList StandardChipList focus behaviors should watch for chip focus": { "error": "TypeError: Cannot read property 'focus' of undefined", @@ -175,23 +175,23 @@ window.testBlocklist = { }, "MatChipList FormFieldChipList keyboard behavior should maintain focus if the active chip is deleted": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "Unknown" + "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" }, "MatChipList FormFieldChipList keyboard behavior when the input has focus should not focus the last chip when press DELETE": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "Unknown" + "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" }, "MatChipList FormFieldChipList keyboard behavior when the input has focus should focus the last chip when press BACKSPACE": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "Unknown" + "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" }, "MatChipList FormFieldChipList should complete the stateChanges stream on destroy": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "Unknown" + "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" }, "MatChipList FormFieldChipList should point the label id to the chip input": { "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "Unknown" + "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" }, "MatChipList with chip remove should properly focus next item if chip is removed through click": { "error": "TypeError: Cannot read property 'focus' of undefined", @@ -235,11 +235,11 @@ window.testBlocklist = { }, "MatSidenav should be fixed position when in fixed mode": { "error": "Error: Expected ng-tns-c21962-0 ng-trigger ng-trigger-transform mat-drawer mat-sidenav mat-drawer-over ng-star-inserted to contain 'mat-sidenav-fixed'.", - "notes": "Unknown" + "notes": "FW-1132: Host class bindings don't work if super class has host class bindings" }, "MatSidenav should set fixed bottom and top when in fixed mode": { "error": "Error: Expected '' to be '20px'.", - "notes": "FW-1081: Static host classes don't work if component has superclass with host classes" + "notes": "FW-1132: Host class bindings don't work if super class has host class bindings" }, "MatTree flat tree with toggle should expand/collapse the node": { "error": "Error: Expected 0 to be 1, 'Expect node expanded one level'.", @@ -315,11 +315,11 @@ window.testBlocklist = { }, "MatTooltip special cases should clear the `user-select` when a tooltip is set on a text field": { "error": "Error: Expected 'none' to be falsy.", - "notes": "Unknown" + "notes": "FW-1133: Inline styles are not applied before constructor is run" }, "MatTooltip special cases should clear the `-webkit-user-drag` on draggable elements": { "error": "Error: Expected 'none' to be falsy.", - "notes": "Unknown" + "notes": "FW-1133: Inline styles are not applied before constructor is run" }, "MatTable should be able to render a table correctly with native elements": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", @@ -358,4 +358,4 @@ window.testBlocklist = { "notes": "Unknown" } }; -// clang-format on \ No newline at end of file +// clang-format on From 586234bb0197ad21b2a6efe8612ad1cfdecaba39 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Tue, 5 Mar 2019 15:24:07 +0200 Subject: [PATCH 0212/1073] fix(service-worker): detect new version even if files are identical to an old one (#26006) Previously, if an app version contained the same files as an older version (e.g. making a change, then rolling it back), the SW would not detect it as the latest version (and update clients). This commit fixes it by adding a `timestamp` field in `ngsw.json`, which makes each build unique (with sufficiently high probability). Fixes #24338 PR Close #26006 --- .../service-worker/config/src/generator.ts | 1 + .../config/test/generator_spec.ts | 4 +++ .../service-worker/test/integration_spec.ts | 2 ++ .../service-worker/worker/src/manifest.ts | 1 + .../service-worker/worker/test/data_spec.ts | 1 + .../service-worker/worker/test/happy_spec.ts | 32 +++++++++++++++---- .../service-worker/worker/testing/mock.ts | 9 +++++- .../service-worker/worker/testing/scope.ts | 1 + 8 files changed, 44 insertions(+), 7 deletions(-) diff --git a/packages/service-worker/config/src/generator.ts b/packages/service-worker/config/src/generator.ts index fd6bf09c74..0de825a65f 100644 --- a/packages/service-worker/config/src/generator.ts +++ b/packages/service-worker/config/src/generator.ts @@ -32,6 +32,7 @@ export class Generator { return { configVersion: 1, + timestamp: Date.now(), appData: config.appData, index: joinUrls(this.baseHref, config.index), assetGroups, dataGroups: this.processDataGroups(config), diff --git a/packages/service-worker/config/test/generator_spec.ts b/packages/service-worker/config/test/generator_spec.ts index 1f3ebad858..f0a6117fad 100644 --- a/packages/service-worker/config/test/generator_spec.ts +++ b/packages/service-worker/config/test/generator_spec.ts @@ -10,6 +10,8 @@ import {Generator} from '../src/generator'; import {MockFilesystem} from '../testing/mock'; describe('Generator', () => { + beforeEach(() => spyOn(Date, 'now').and.returnValue(1234567890123)); + it('generates a correct config', done => { const fs = new MockFilesystem({ '/index.html': 'This is a test', @@ -70,6 +72,7 @@ describe('Generator', () => { res.then(config => { expect(config).toEqual({ configVersion: 1, + timestamp: 1234567890123, appData: { test: true, }, @@ -137,6 +140,7 @@ describe('Generator', () => { res.then(config => { expect(config).toEqual({ configVersion: 1, + timestamp: 1234567890123, appData: undefined, index: '/test/index.html', assetGroups: [], diff --git a/packages/service-worker/test/integration_spec.ts b/packages/service-worker/test/integration_spec.ts index d56a791c52..44d70265f8 100644 --- a/packages/service-worker/test/integration_spec.ts +++ b/packages/service-worker/test/integration_spec.ts @@ -31,6 +31,7 @@ function obsToSinglePromise(obs: Observable): Promise { const manifest: Manifest = { configVersion: 1, + timestamp: 1234567890123, appData: {version: '1'}, index: '/only.txt', assetGroups: [{ @@ -46,6 +47,7 @@ const manifest: Manifest = { const manifestUpdate: Manifest = { configVersion: 1, + timestamp: 1234567890123, appData: {version: '2'}, index: '/only.txt', assetGroups: [{ diff --git a/packages/service-worker/worker/src/manifest.ts b/packages/service-worker/worker/src/manifest.ts index 7800afa488..ba028d6c21 100644 --- a/packages/service-worker/worker/src/manifest.ts +++ b/packages/service-worker/worker/src/manifest.ts @@ -12,6 +12,7 @@ export type ManifestHash = string; export interface Manifest { configVersion: number; + timestamp: number; appData?: {[key: string]: string}; index: string; assetGroups?: AssetGroupConfig[]; diff --git a/packages/service-worker/worker/test/data_spec.ts b/packages/service-worker/worker/test/data_spec.ts index cdfe16b7e2..1474dd12c5 100644 --- a/packages/service-worker/worker/test/data_spec.ts +++ b/packages/service-worker/worker/test/data_spec.ts @@ -39,6 +39,7 @@ const distUpdate = new MockFileSystemBuilder() const manifest: Manifest = { configVersion: 1, + timestamp: 1234567890123, index: '/index.html', assetGroups: [ { diff --git a/packages/service-worker/worker/test/happy_spec.ts b/packages/service-worker/worker/test/happy_spec.ts index 783b3a8cfe..a4c744b109 100644 --- a/packages/service-worker/worker/test/happy_spec.ts +++ b/packages/service-worker/worker/test/happy_spec.ts @@ -51,6 +51,7 @@ const brokenFs = new MockFileSystemBuilder().addFile('/foo.txt', 'this is foo'). const brokenManifest: Manifest = { configVersion: 1, + timestamp: 1234567890123, index: '/foo.txt', assetGroups: [{ name: 'assets', @@ -86,6 +87,7 @@ const manifestOld: ManifestV5 = { const manifest: Manifest = { configVersion: 1, + timestamp: 1234567890123, appData: { version: 'original', }, @@ -133,6 +135,7 @@ const manifest: Manifest = { const manifestUpdate: Manifest = { configVersion: 1, + timestamp: 1234567890123, appData: { version: 'update', }, @@ -185,12 +188,16 @@ const manifestUpdate: Manifest = { hashTable: tmpHashTableForFs(distUpdate), }; -const server = new MockServerStateBuilder() - .withStaticFiles(dist) - .withManifest(manifest) - .withRedirect('/redirected.txt', '/redirect-target.txt', 'this was a redirect') - .withError('/error.txt') - .build(); +const serverBuilderBase = + new MockServerStateBuilder() + .withStaticFiles(dist) + .withRedirect('/redirected.txt', '/redirect-target.txt', 'this was a redirect') + .withError('/error.txt'); + +const server = serverBuilderBase.withManifest(manifest).build(); + +const serverRollback = + serverBuilderBase.withManifest({...manifest, timestamp: manifest.timestamp + 1}).build(); const serverUpdate = new MockServerStateBuilder() @@ -372,6 +379,19 @@ const manifestUpdateHash = sha1(JSON.stringify(manifestUpdate)); serverUpdate.assertNoOtherRequests(); }); + async_it('detects new version even if only `manifest.timestamp` is different', async() => { + expect(await makeRequest(scope, '/foo.txt', 'newClient')).toEqual('this is foo'); + await driver.initialized; + + scope.updateServerState(serverUpdate); + expect(await driver.checkForUpdate()).toEqual(true); + expect(await makeRequest(scope, '/foo.txt', 'newerClient')).toEqual('this is foo v2'); + + scope.updateServerState(serverRollback); + expect(await driver.checkForUpdate()).toEqual(true); + expect(await makeRequest(scope, '/foo.txt', 'newestClient')).toEqual('this is foo'); + }); + async_it('updates a specific client to new content on request', async() => { expect(await makeRequest(scope, '/foo.txt')).toEqual('this is foo'); await driver.initialized; diff --git a/packages/service-worker/worker/testing/mock.ts b/packages/service-worker/worker/testing/mock.ts index 00f5b6d053..907e375614 100644 --- a/packages/service-worker/worker/testing/mock.ts +++ b/packages/service-worker/worker/testing/mock.ts @@ -88,7 +88,13 @@ export class MockServerStateBuilder { return this; } - build(): MockServerState { return new MockServerState(this.resources, this.errors); } + build(): MockServerState { + // Take a "snapshot" of the current `resources` and `errors`. + const resources = new Map(this.resources.entries()); + const errors = new Set(this.errors.values()); + + return new MockServerState(resources, errors); + } } export class MockServerState { @@ -187,6 +193,7 @@ export function tmpManifestSingleAssetGroup(fs: MockFileSystem): Manifest { files.forEach(path => { hashTable[path] = fs.lookup(path) !.hash; }); return { configVersion: 1, + timestamp: 1234567890123, index: '/index.html', assetGroups: [ { diff --git a/packages/service-worker/worker/testing/scope.ts b/packages/service-worker/worker/testing/scope.ts index 6b5127d947..f357f4da41 100644 --- a/packages/service-worker/worker/testing/scope.ts +++ b/packages/service-worker/worker/testing/scope.ts @@ -306,6 +306,7 @@ export class ConfigBuilder { const hashTable = {}; return { configVersion: 1, + timestamp: 1234567890123, index: '/index.html', assetGroups, navigationUrls: [], hashTable, }; From 79e2ca0c0e6a89c3295a5d2bcf45c8886e8d9173 Mon Sep 17 00:00:00 2001 From: Charles Lyding <19598772+clydin@users.noreply.github.com> Date: Thu, 21 Feb 2019 12:07:39 -0500 Subject: [PATCH 0213/1073] fix(platform-server): update minimum domino version to latest released (#28893) The version used to test and build from the root package.json is pinned to 2.1.2. This change ensures that users will at a minimum be using the same version. PR Close #28893 --- packages/platform-server/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/platform-server/package.json b/packages/platform-server/package.json index 23b24b064e..ef121fadab 100644 --- a/packages/platform-server/package.json +++ b/packages/platform-server/package.json @@ -22,7 +22,7 @@ "@angular/platform-browser-dynamic": "0.0.0-PLACEHOLDER" }, "dependencies": { - "domino": "^2.1.0", + "domino": "^2.1.2", "tslib": "^1.9.0", "xhr2": "^0.1.4" }, @@ -34,7 +34,7 @@ "packageGroup": "NG_UPDATE_PACKAGE_GROUP" }, "sideEffects": false, - "engines" : { - "node" : ">=8.0" + "engines": { + "node": ">=8.0" } } From 7d174969c2a0bdd62ba49fa051f8c38eeb95910d Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Sat, 2 Mar 2019 08:57:11 +0100 Subject: [PATCH 0214/1073] ci: update packageFiles to be renovated (#29071) Change `cli-hello-world-ivy` to `cli-hello-world-compat` as this was renamed and add `cli-hello-world-ivy-minimal`. PR Close #29071 --- renovate.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 14c03af799..aa9aeb7cd1 100644 --- a/renovate.json +++ b/renovate.json @@ -16,7 +16,8 @@ "@types/node" ], "packageFiles": [ - "integration/cli-hello-world-ivy/package.json", + "integration/cli-hello-world-ivy-compat/package.json", + "integration/cli-hello-world-ivy-minimal/package.json", "integration/cli-hello-world/package.json" ], "major": { From 72ecc453639eae017f75653c9004adc406ed2ee6 Mon Sep 17 00:00:00 2001 From: Maxim Mazurok Date: Sun, 3 Mar 2019 20:46:26 +0200 Subject: [PATCH 0215/1073] fix(router): removed obsolete TODO comment (#29085) PR Close #29085 --- packages/router/src/router_config_loader.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/router/src/router_config_loader.ts b/packages/router/src/router_config_loader.ts index 641ecd856a..6f5d981cf7 100644 --- a/packages/router/src/router_config_loader.ts +++ b/packages/router/src/router_config_loader.ts @@ -7,7 +7,6 @@ */ import {Compiler, InjectionToken, Injector, NgModuleFactory, NgModuleFactoryLoader} from '@angular/core'; -// TODO(i): switch to fromPromise once it's expored in rxjs import {Observable, from, of } from 'rxjs'; import {map, mergeMap} from 'rxjs/operators'; import {LoadChildren, LoadedRouterConfig, Route, standardizeConfig} from './config'; From 306354797581113d46ae7a9c121a3ab7205afef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Toledo=20Navarro?= Date: Mon, 4 Mar 2019 14:57:31 +0100 Subject: [PATCH 0216/1073] docs(router): align examples in interfaces docs (#29093) * Use exclusively `TeamComponent` class for examples, as currently there are at least 3 different component classes being used, one of which is actually as a type argument for a `Resolve` implementation. PR Close #29093 --- packages/router/src/interfaces.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/router/src/interfaces.ts b/packages/router/src/interfaces.ts index 1044bdbdc1..03b70b5b3c 100644 --- a/packages/router/src/interfaces.ts +++ b/packages/router/src/interfaces.ts @@ -47,7 +47,7 @@ import {UrlSegment, UrlTree} from './url_tree'; * RouterModule.forRoot([ * { * path: 'team/:id', - * component: TeamCmp, + * component: TeamComponent, * canActivate: [CanActivateTeam] * } * ]) @@ -65,7 +65,7 @@ import {UrlSegment, UrlTree} from './url_tree'; * RouterModule.forRoot([ * { * path: 'team/:id', - * component: TeamCmp, + * component: TeamComponent, * canActivate: ['canActivateTeam'] * } * ]) @@ -128,7 +128,7 @@ export type CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSn * children: [ * { * path: 'team/:id', - * component: Team + * component: TeamComponent * } * ] * } @@ -151,7 +151,7 @@ export type CanActivateFn = (route: ActivatedRouteSnapshot, state: RouterStateSn * children: [ * { * path: 'team/:id', - * component: Team + * component: TeamComponent * } * ] * } @@ -213,7 +213,7 @@ export type CanActivateChildFn = (childRoute: ActivatedRouteSnapshot, state: Rou * RouterModule.forRoot([ * { * path: 'team/:id', - * component: TeamCmp, + * component: TeamComponent, * canDeactivate: [CanDeactivateTeam] * } * ]) @@ -231,7 +231,7 @@ export type CanActivateChildFn = (childRoute: ActivatedRouteSnapshot, state: Rou * RouterModule.forRoot([ * { * path: 'team/:id', - * component: TeamCmp, + * component: TeamComponent, * canDeactivate: ['canDeactivateTeam'] * } * ]) @@ -290,7 +290,7 @@ export type CanDeactivateFn = * RouterModule.forRoot([ * { * path: 'team/:id', - * component: TeamCmp, + * component: TeamComponent, * resolve: { * team: TeamResolver * } @@ -310,7 +310,7 @@ export type CanDeactivateFn = * RouterModule.forRoot([ * { * path: 'team/:id', - * component: TeamCmp, + * component: TeamComponent, * resolve: { * team: 'teamResolver' * } @@ -361,7 +361,7 @@ export interface Resolve { * RouterModule.forRoot([ * { * path: 'team/:id', - * component: TeamCmp, + * component: TeamComponent, * loadChildren: 'team.js', * canLoad: [CanLoadTeamSection] * } @@ -380,7 +380,7 @@ export interface Resolve { * RouterModule.forRoot([ * { * path: 'team/:id', - * component: TeamCmp, + * component: TeamComponent, * loadChildren: 'team.js', * canLoad: ['canLoadTeamSection'] * } From 7c57293bee14d5a248094a3fbde1aed35a43fd70 Mon Sep 17 00:00:00 2001 From: WilliamKoza Date: Mon, 4 Mar 2019 15:46:18 +0100 Subject: [PATCH 0217/1073] refactor(language-service): clean up imports language-service and misspellings in public API (#29097) PR Close #29097 --- packages/language-service/src/completions.ts | 8 ++++---- .../language-service/src/locate_symbol.ts | 4 ++-- .../language-service/src/reflector_host.ts | 2 +- packages/language-service/src/types.ts | 20 +++++++++---------- .../language-service/src/typescript_host.ts | 6 ++---- packages/language-service/src/utils.ts | 2 +- 6 files changed, 19 insertions(+), 23 deletions(-) diff --git a/packages/language-service/src/completions.ts b/packages/language-service/src/completions.ts index 22941debd2..5a663bd045 100644 --- a/packages/language-service/src/completions.ts +++ b/packages/language-service/src/completions.ts @@ -6,13 +6,13 @@ * found in the LICENSE file at https://angular.io/license */ -import {AST, AstPath, AttrAst, Attribute, BoundDirectivePropertyAst, BoundElementPropertyAst, BoundEventAst, BoundTextAst, CssSelector, DirectiveAst, Element, ElementAst, EmbeddedTemplateAst, ImplicitReceiver, NAMED_ENTITIES, NgContentAst, Node as HtmlAst, NullTemplateVisitor, ParseSpan, PropertyRead, ReferenceAst, SelectorMatcher, TagContentType, TemplateAst, TemplateAstVisitor, Text, TextAst, VariableAst, findNode, getHtmlTagDefinition, splitNsName, templateVisitAll} from '@angular/compiler'; -import {DiagnosticTemplateInfo, getExpressionScope} from '@angular/compiler-cli/src/language_services'; +import {AST, AstPath, Attribute, BoundDirectivePropertyAst, BoundElementPropertyAst, BoundEventAst, BoundTextAst, CssSelector, Element, ElementAst, ImplicitReceiver, NAMED_ENTITIES, Node as HtmlAst, NullTemplateVisitor, ParseSpan, PropertyRead, SelectorMatcher, TagContentType, Text, findNode, getHtmlTagDefinition, splitNsName} from '@angular/compiler'; +import {getExpressionScope} from '@angular/compiler-cli/src/language_services'; -import {AstResult, AttrInfo, SelectorInfo, TemplateInfo} from './common'; +import {AttrInfo, TemplateInfo} from './common'; import {getExpressionCompletions} from './expressions'; import {attributeNames, elementNames, eventNames, propertyNames} from './html_info'; -import {BuiltinType, Completion, Completions, Span, Symbol, SymbolDeclaration, SymbolTable, TemplateSource} from './types'; +import {Completion, Completions, Span, Symbol, SymbolTable, TemplateSource} from './types'; import {diagnosticInfoFromTemplateInfo, findTemplateAstAt, flatten, getSelectors, hasTemplateReference, inSpan, removeSuffix, spanOf, uniqueByName} from './utils'; const TEMPLATE_ATTR_PREFIX = '*'; diff --git a/packages/language-service/src/locate_symbol.ts b/packages/language-service/src/locate_symbol.ts index a87750716d..fd07d095d2 100644 --- a/packages/language-service/src/locate_symbol.ts +++ b/packages/language-service/src/locate_symbol.ts @@ -6,12 +6,12 @@ * found in the LICENSE file at https://angular.io/license */ -import {AST, Attribute, BoundDirectivePropertyAst, BoundEventAst, ElementAst, TemplateAst, TemplateAstPath, findNode, tokenReference} from '@angular/compiler'; +import {AST, Attribute, BoundDirectivePropertyAst, BoundEventAst, ElementAst, TemplateAstPath, findNode, tokenReference} from '@angular/compiler'; import {getExpressionScope} from '@angular/compiler-cli/src/language_services'; import {TemplateInfo} from './common'; import {getExpressionSymbol} from './expressions'; -import {Definition, Location, Span, Symbol, SymbolTable} from './types'; +import {Definition, Span, Symbol} from './types'; import {diagnosticInfoFromTemplateInfo, findTemplateAstAt, inSpan, offsetSpan, spanOf} from './utils'; export interface SymbolInfo { diff --git a/packages/language-service/src/reflector_host.ts b/packages/language-service/src/reflector_host.ts index 42df27c8cc..dcf66f2fae 100644 --- a/packages/language-service/src/reflector_host.ts +++ b/packages/language-service/src/reflector_host.ts @@ -7,7 +7,7 @@ */ import {StaticSymbolResolverHost} from '@angular/compiler'; -import {CompilerOptions, MetadataCollector, MetadataReaderCache, MetadataReaderHost, createMetadataReaderCache, readMetadata} from '@angular/compiler-cli/src/language_services'; +import {CompilerOptions, MetadataCollector, MetadataReaderHost, createMetadataReaderCache, readMetadata} from '@angular/compiler-cli/src/language_services'; import * as path from 'path'; import * as ts from 'typescript'; diff --git a/packages/language-service/src/types.ts b/packages/language-service/src/types.ts index a3ab763725..d12d836903 100644 --- a/packages/language-service/src/types.ts +++ b/packages/language-service/src/types.ts @@ -27,7 +27,7 @@ export { * The information `LanguageService` needs from the `LanguageServiceHost` to describe the content of * a template and the language context the template is in. * - * A host interface; see `LanguageSeriviceHost`. + * A host interface; see `LanguageServiceHost`. * * @publicApi */ @@ -71,7 +71,7 @@ export interface TemplateSource { /** * A sequence of template sources. * - * A host type; see `LanguageSeriviceHost`. + * A host type; see `LanguageServiceHost`. * * @publicApi */ @@ -102,12 +102,12 @@ export interface DeclarationError { * Information about the component declarations. * * A file might contain a declaration without a template because the file contains only - * templateUrl references. However, the compoennt declaration might contain errors that + * templateUrl references. However, the component declaration might contain errors that * need to be reported such as the template string is missing or the component is not * declared in a module. These error should be reported on the declaration, not the * template. * - * A host type; see `LanguageSeriviceHost`. + * A host type; see `LanguageServiceHost`. * * @publicApi */ @@ -137,7 +137,7 @@ export interface Declaration { /** * A sequence of declarations. * - * A host type; see `LanguageSeriviceHost`. + * A host type; see `LanguageServiceHost`. * * @publicApi */ @@ -145,8 +145,7 @@ export type Declarations = Declaration[]; /** * The host for a `LanguageService`. This provides all the `LanguageService` requires to respond - * to - * the `LanguageService` requests. + * to the `LanguageService` requests. * * This interface describes the requirements of the `LanguageService` on its host. * @@ -186,8 +185,7 @@ export interface LanguageServiceHost { /** * Return the template source information for all templates in `fileName` or for `fileName` if - * it - * is a template file. + * it is a template file. */ getTemplates(fileName: string): TemplateSources; @@ -216,7 +214,7 @@ export interface LanguageServiceHost { */ export interface Completion { /** - * The kind of comletion. + * The kind of completion. */ kind: DeclarationKind; @@ -353,7 +351,7 @@ export interface Hover { * beginning of the file reference by `fileName`. * * This interface and all interfaces and types marked as `LanguageService` types, describe a - * particlar implementation of the Angular language service and is not intented to be + * particular implementation of the Angular language service and is not intended to be * implemented. Adding members to the interface will not be considered a breaking change as * defined by SemVer. * diff --git a/packages/language-service/src/typescript_host.ts b/packages/language-service/src/typescript_host.ts index ec1d3c7f87..b5a26f7fcc 100644 --- a/packages/language-service/src/typescript_host.ts +++ b/packages/language-service/src/typescript_host.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {AotSummaryResolver, CompileMetadataResolver, CompilerConfig, DEFAULT_INTERPOLATION_CONFIG, DirectiveNormalizer, DirectiveResolver, DomElementSchemaRegistry, FormattedError, FormattedMessageChain, HtmlParser, InterpolationConfig, JitSummaryResolver, NgAnalyzedModules, NgModuleResolver, ParseTreeResult, PipeResolver, ResourceLoader, StaticReflector, StaticSymbol, StaticSymbolCache, StaticSymbolResolver, SummaryResolver, analyzeNgModules, createOfflineCompileUrlResolver, isFormattedError} from '@angular/compiler'; +import {AotSummaryResolver, CompileMetadataResolver, CompilerConfig, DEFAULT_INTERPOLATION_CONFIG, DirectiveNormalizer, DirectiveResolver, DomElementSchemaRegistry, FormattedError, FormattedMessageChain, HtmlParser, InterpolationConfig, JitSummaryResolver, NgAnalyzedModules, NgModuleResolver, ParseTreeResult, PipeResolver, ResourceLoader, StaticReflector, StaticSymbol, StaticSymbolCache, StaticSymbolResolver, analyzeNgModules, createOfflineCompileUrlResolver, isFormattedError} from '@angular/compiler'; import {CompilerOptions, getClassMembersFromDeclaration, getPipesTable, getSymbolQuery} from '@angular/compiler-cli/src/language_services'; import {ViewEncapsulation, ɵConsole as Console} from '@angular/core'; import * as fs from 'fs'; @@ -15,9 +15,7 @@ import * as ts from 'typescript'; import {createLanguageService} from './language_service'; import {ReflectorHost} from './reflector_host'; -import {BuiltinType, Declaration, DeclarationError, DeclarationKind, Declarations, Definition, DiagnosticMessageChain, LanguageService, LanguageServiceHost, PipeInfo, Pipes, Signature, Span, Symbol, SymbolDeclaration, SymbolQuery, SymbolTable, TemplateSource, TemplateSources} from './types'; -import {isTypescriptVersion} from './utils'; - +import {Declaration, DeclarationError, Declarations, DiagnosticMessageChain, LanguageService, LanguageServiceHost, Span, Symbol, SymbolQuery, TemplateSource, TemplateSources} from './types'; /** diff --git a/packages/language-service/src/utils.ts b/packages/language-service/src/utils.ts index d9914d8c7d..839e437f13 100644 --- a/packages/language-service/src/utils.ts +++ b/packages/language-service/src/utils.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {AstPath, CompileDirectiveSummary, CompileTypeMetadata, CssSelector, DirectiveAst, ElementAst, EmbeddedTemplateAst, HtmlAstPath, Node as HtmlNode, ParseSourceSpan, RecursiveTemplateAstVisitor, RecursiveVisitor, TemplateAst, TemplateAstPath, identifierName, templateVisitAll, visitAll} from '@angular/compiler'; +import {AstPath, CompileDirectiveSummary, CompileTypeMetadata, CssSelector, DirectiveAst, ElementAst, EmbeddedTemplateAst, ParseSourceSpan, RecursiveTemplateAstVisitor, TemplateAst, TemplateAstPath, identifierName, templateVisitAll} from '@angular/compiler'; import {DiagnosticTemplateInfo} from '@angular/compiler-cli/src/language_services'; import * as ts from 'typescript'; From 01577b0bede560c6c217997f0f33e874715f672f Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 4 Mar 2019 21:40:50 +0100 Subject: [PATCH 0218/1073] ci: bazel saucelabs test job does not setup circleci bazelrc (#29106) Currently the `test_saucelabs` job does not use our general CircleCI bazel configuration. We should set this configuration up, as it enables better logging, better use of the `xlarge` resource class, and also sets up Bazel's integrated flakiness retry functionality. PR Close #29106 --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index df4f727eda..9bee425bab 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -225,6 +225,7 @@ jobs: steps: - *attach_workspace - *init_environment + - *setup_circleci_bazel_config - run: name: Preparing environment for running tests on Saucelabs. command: setSecretVar SAUCE_ACCESS_KEY $(echo $SAUCE_ACCESS_KEY | rev) From 4486dabf01afd297d5540ba14ac2435668c854cd Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Tue, 5 Mar 2019 18:04:51 +0200 Subject: [PATCH 0219/1073] docs: order upcoming events in chronological order (#29115) Related to https://github.com/angular/angular/pull/29095#issuecomment-469386472. PR Close #29115 --- aio/content/marketing/events.html | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/aio/content/marketing/events.html b/aio/content/marketing/events.html index 9212639631..e084225548 100755 --- a/aio/content/marketing/events.html +++ b/aio/content/marketing/events.html @@ -13,11 +13,11 @@ - + - AngularConnect - London, UK - September 19-20, 2019 + ng-conf + Salt Lake City, Utah + May 1-3, 2019 @@ -25,11 +25,11 @@ Copenhagen, Denmark May 26 (workshops), 27-28 (conference), 2019 - + - ng-conf - Salt Lake City, Utah - May 1-3, 2019 + AngularConnect + London, UK + September 19-20, 2019 From e8bb8f4912b13a8f0abfb57a16a45239744117f1 Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 20 Feb 2019 08:10:25 +0100 Subject: [PATCH 0220/1073] build: enable bundle_dts for forms package (#28854) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR also changes the name of NgNoValidate` to `ɵNgNoValidate`. This is because `ngcc` requires the node to retain the original name while dts bundler will rename the node is it's only exported using the aliases. Example typings files: ```ts declare class NgNoValidate{ } export {NgNoValidateas ɵNgNoValidate} ``` will be emitted as ```ts export declare class ɵNgNoValidate { } ``` PR Close #28854 --- packages/forms/BUILD.bazel | 1 + packages/forms/src/directives.ts | 4 +++- .../forms/src/directives/ng_no_validate_directive.ts | 4 +++- .../select_multiple_control_value_accessor.ts | 10 ++++++---- packages/forms/src/forms.ts | 6 +++--- 5 files changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/forms/BUILD.bazel b/packages/forms/BUILD.bazel index 0991d31aff..8bd4e980f3 100644 --- a/packages/forms/BUILD.bazel +++ b/packages/forms/BUILD.bazel @@ -10,6 +10,7 @@ ng_module( "src/**/*.ts", ], ), + bundle_dts = True, deps = [ "//packages/core", "//packages/platform-browser", diff --git a/packages/forms/src/directives.ts b/packages/forms/src/directives.ts index 02e455a4ce..d2e812f1b2 100644 --- a/packages/forms/src/directives.ts +++ b/packages/forms/src/directives.ts @@ -80,5 +80,7 @@ export const REACTIVE_DRIVEN_DIRECTIVES: Type[] = declarations: SHARED_FORM_DIRECTIVES, exports: SHARED_FORM_DIRECTIVES, }) -export class InternalFormsSharedModule { +export class ɵInternalFormsSharedModule { } + +export {ɵInternalFormsSharedModule as InternalFormsSharedModule}; diff --git a/packages/forms/src/directives/ng_no_validate_directive.ts b/packages/forms/src/directives/ng_no_validate_directive.ts index c34277a84f..448339f3dd 100644 --- a/packages/forms/src/directives/ng_no_validate_directive.ts +++ b/packages/forms/src/directives/ng_no_validate_directive.ts @@ -29,5 +29,7 @@ import {Directive} from '@angular/core'; selector: 'form:not([ngNoForm]):not([ngNativeValidate])', host: {'novalidate': ''}, }) -export class NgNoValidate { +export class ɵNgNoValidate { } + +export {ɵNgNoValidate as NgNoValidate}; diff --git a/packages/forms/src/directives/select_multiple_control_value_accessor.ts b/packages/forms/src/directives/select_multiple_control_value_accessor.ts index d182bc9d2a..5e0800947b 100644 --- a/packages/forms/src/directives/select_multiple_control_value_accessor.ts +++ b/packages/forms/src/directives/select_multiple_control_value_accessor.ts @@ -89,7 +89,7 @@ export class SelectMultipleControlValueAccessor implements ControlValueAccessor value: any; /** @internal */ - _optionMap: Map = new Map(); + _optionMap: Map = new Map(); /** @internal */ _idCounter: number = 0; @@ -131,7 +131,7 @@ export class SelectMultipleControlValueAccessor implements ControlValueAccessor */ writeValue(value: any): void { this.value = value; - let optionSelectedStateSetter: (opt: NgSelectMultipleOption, o: any) => void; + let optionSelectedStateSetter: (opt: ɵNgSelectMultipleOption, o: any) => void; if (Array.isArray(value)) { // convert values to ids const ids = value.map((v) => this._getOptionId(v)); @@ -194,7 +194,7 @@ export class SelectMultipleControlValueAccessor implements ControlValueAccessor } /** @internal */ - _registerOption(value: NgSelectMultipleOption): string { + _registerOption(value: ɵNgSelectMultipleOption): string { const id: string = (this._idCounter++).toString(); this._optionMap.set(id, value); return id; @@ -226,7 +226,7 @@ export class SelectMultipleControlValueAccessor implements ControlValueAccessor * @publicApi */ @Directive({selector: 'option'}) -export class NgSelectMultipleOption implements OnDestroy { +export class ɵNgSelectMultipleOption implements OnDestroy { // TODO(issue/24571): remove '!'. id !: string; /** @internal */ @@ -290,3 +290,5 @@ export class NgSelectMultipleOption implements OnDestroy { } } } + +export {ɵNgSelectMultipleOption as NgSelectMultipleOption}; diff --git a/packages/forms/src/forms.ts b/packages/forms/src/forms.ts index 235fdf8a03..4c1683628e 100644 --- a/packages/forms/src/forms.ts +++ b/packages/forms/src/forms.ts @@ -18,7 +18,7 @@ */ -export {InternalFormsSharedModule as ɵInternalFormsSharedModule} from './directives'; +export {ɵInternalFormsSharedModule} from './directives'; export {AbstractControlDirective} from './directives/abstract_control_directive'; export {AbstractFormGroupDirective} from './directives/abstract_form_group_directive'; export {CheckboxControlValueAccessor} from './directives/checkbox_value_accessor'; @@ -32,7 +32,7 @@ export {NgForm} from './directives/ng_form'; export {NgFormSelectorWarning} from './directives/ng_form_selector_warning'; export {NgModel} from './directives/ng_model'; export {NgModelGroup} from './directives/ng_model_group'; -export {NgNoValidate as ɵNgNoValidate} from './directives/ng_no_validate_directive'; +export {ɵNgNoValidate} from './directives/ng_no_validate_directive'; export {NumberValueAccessor} from './directives/number_value_accessor'; export {RadioControlValueAccessor} from './directives/radio_control_value_accessor'; export {RangeValueAccessor} from './directives/range_value_accessor'; @@ -43,7 +43,7 @@ export {FormArrayName} from './directives/reactive_directives/form_group_name'; export {FormGroupName} from './directives/reactive_directives/form_group_name'; export {NgSelectOption, SelectControlValueAccessor} from './directives/select_control_value_accessor'; export {SelectMultipleControlValueAccessor} from './directives/select_multiple_control_value_accessor'; -export {NgSelectMultipleOption as ɵNgSelectMultipleOption} from './directives/select_multiple_control_value_accessor'; +export {ɵNgSelectMultipleOption} from './directives/select_multiple_control_value_accessor'; export {AsyncValidator, AsyncValidatorFn, CheckboxRequiredValidator, EmailValidator, MaxLengthValidator, MinLengthValidator, PatternValidator, RequiredValidator, ValidationErrors, Validator, ValidatorFn} from './directives/validators'; export {FormBuilder} from './form_builder'; export {AbstractControl, AbstractControlOptions, FormArray, FormControl, FormGroup} from './model'; From 1efad3772ebb7bf74b40ab0b128621c7c05b917b Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Mon, 25 Feb 2019 12:58:13 +0100 Subject: [PATCH 0221/1073] test: fix resolution to not depend on index.d.ts (#28854) Implement `readFile` in `MockTypescriptHost` so TypeScript can resolve module based on it's resolution, since certain files are not on disk but in memory PR Close #28854 --- packages/language-service/test/test_utils.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/language-service/test/test_utils.ts b/packages/language-service/test/test_utils.ts index e3bb4871e9..17ff5acbbf 100644 --- a/packages/language-service/test/test_utils.ts +++ b/packages/language-service/test/test_utils.ts @@ -152,6 +152,8 @@ export class MockTypescriptHost implements ts.LanguageServiceHost { fileExists(fileName: string): boolean { return this.getRawFileContent(fileName) != null; } + readFile(path: string): string|undefined { return this.getRawFileContent(path); } + getMarkerLocations(fileName: string): {[name: string]: number}|undefined { let content = this.getRawFileContent(fileName); if (content) { From b446095c4dee992bbce3a82c12ed8560530ba81a Mon Sep 17 00:00:00 2001 From: Alan Date: Fri, 22 Feb 2019 11:55:10 +0100 Subject: [PATCH 0222/1073] refactor: remove unused functions and classes in diagnostics (#28923) PR Close #28923 --- .../src/diagnostics/typescript_symbols.ts | 60 +------------------ 1 file changed, 2 insertions(+), 58 deletions(-) diff --git a/packages/compiler-cli/src/diagnostics/typescript_symbols.ts b/packages/compiler-cli/src/diagnostics/typescript_symbols.ts index 30fa65cb52..ccd3897661 100644 --- a/packages/compiler-cli/src/diagnostics/typescript_symbols.ts +++ b/packages/compiler-cli/src/diagnostics/typescript_symbols.ts @@ -6,12 +6,11 @@ * found in the LICENSE file at https://angular.io/license */ -import {AotSummaryResolver, CompileMetadataResolver, CompilePipeSummary, CompilerConfig, DEFAULT_INTERPOLATION_CONFIG, DirectiveNormalizer, DirectiveResolver, DomElementSchemaRegistry, HtmlParser, InterpolationConfig, NgAnalyzedModules, NgModuleResolver, ParseTreeResult, PipeResolver, ResourceLoader, StaticReflector, StaticSymbol, StaticSymbolCache, StaticSymbolResolver, SummaryResolver} from '@angular/compiler'; -import * as fs from 'fs'; +import {CompilePipeSummary, StaticSymbol} from '@angular/compiler'; import * as path from 'path'; import * as ts from 'typescript'; -import {BuiltinType, DeclarationKind, Definition, PipeInfo, Pipes, Signature, Span, Symbol, SymbolDeclaration, SymbolQuery, SymbolTable} from './symbols'; +import {BuiltinType, DeclarationKind, Definition, Signature, Span, Symbol, SymbolDeclaration, SymbolQuery, SymbolTable} from './symbols'; import {isVersionBetween} from './typescript_version'; // In TypeScript 2.1 these flags moved @@ -647,50 +646,6 @@ class EmptyTable implements SymbolTable { static instance = new EmptyTable(); } -function findTsConfig(fileName: string): string|undefined { - let dir = path.dirname(fileName); - while (fs.existsSync(dir)) { - const candidate = path.join(dir, 'tsconfig.json'); - if (fs.existsSync(candidate)) return candidate; - const parentDir = path.dirname(dir); - if (parentDir === dir) break; - dir = parentDir; - } -} - -function isBindingPattern(node: ts.Node): node is ts.BindingPattern { - return !!node && (node.kind === ts.SyntaxKind.ArrayBindingPattern || - node.kind === ts.SyntaxKind.ObjectBindingPattern); -} - -function walkUpBindingElementsAndPatterns(node: ts.Node): ts.Node { - while (node && (node.kind === ts.SyntaxKind.BindingElement || isBindingPattern(node))) { - node = node.parent !; - } - - return node; -} - -function getCombinedNodeFlags(node: ts.Node): ts.NodeFlags { - node = walkUpBindingElementsAndPatterns(node); - - let flags = node.flags; - if (node.kind === ts.SyntaxKind.VariableDeclaration) { - node = node.parent !; - } - - if (node && node.kind === ts.SyntaxKind.VariableDeclarationList) { - flags |= node.flags; - node = node.parent !; - } - - if (node && node.kind === ts.SyntaxKind.VariableStatement) { - flags |= node.flags; - } - - return flags; -} - function isSymbolPrivate(s: ts.Symbol): boolean { return !!s.valueDeclaration && isPrivate(s.valueDeclaration); } @@ -753,15 +708,6 @@ function setParents(node: T, parent: ts.Node): T { return node; } -function spanOf(node: ts.Node): Span { - return {start: node.getStart(), end: node.getEnd()}; -} - -function shrink(span: Span, offset?: number) { - if (offset == null) offset = 1; - return {start: span.start + offset, end: span.end - offset}; -} - function spanAt(sourceFile: ts.SourceFile, line: number, column: number): Span|undefined { if (line != null && column != null) { const position = ts.getPositionOfLineAndCharacter(sourceFile, line, column); @@ -863,8 +809,6 @@ function typeKindOf(type: ts.Type | undefined): BuiltinType { return BuiltinType.Other; } - - function getFromSymbolTable(symbolTable: ts.SymbolTable, key: string): ts.Symbol|undefined { const table = symbolTable as any; let symbol: ts.Symbol|undefined; From 69265b7b5d5089c14e6566089f3192c2b797fd17 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 5 Mar 2019 19:12:31 +0100 Subject: [PATCH 0223/1073] ci(docs-infra): "test_aio_local_ivy" job should attach ivy package output (#29117) Currently the "test_docs_examples_ivy" job attaches the legacy package output, while we can also attach the Ivy NPM package output. We don't need Ngcc to downlevel the Angular packages in order to build AIO with Ivy. PR Close #29117 --- .circleci/config.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9bee425bab..f1c36b43d2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -305,6 +305,12 @@ jobs: steps: - *attach_workspace - *init_environment + # Rename the Ivy packages dist folder to "dist/packages-dist" as the AIO + # package installer picks up the locally built packages from that location. + # *Note*: We could also adjust the packages installer, but given we won't have + # two different folders of Angular distributions in the future, it's likely not + # worth the efforts to change the AIO packages installer. + - run: mv dist/packages-dist-ivy-aot dist/packages-dist # Build aio with Ivy (using local Angular packages) - run: yarn --cwd aio build-with-ivy --progress=false @@ -597,7 +603,7 @@ workflows: - build-npm-packages - test_aio_local_ivy: requires: - - build-npm-packages + - build-ivy-npm-packages - test_aio_tools: requires: - build-npm-packages From ff9550542ca6741c78f395758a94b4096cdaca9a Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 5 Mar 2019 19:18:50 +0100 Subject: [PATCH 0224/1073] build(docs-infra): ivy prebuild script should not run ngcc for all formats (#29117) Currently when building AIO with Ivy, we run Ngcc and transform all found formats. This potentially slows down the build (and therefore the "test_aio_local_ivy" job). Since it's not necessary to build all formats, and we only need "fesm5" and "fesm2015", we can explicitly specify the required formats. **Note**: Currently this does not have any big effect, because Angular Material does not ship ES2015/ES5 files. The change primarily just suppresses the Ngcc messages for Material not providing ES2015/ES5 entry-points. Technically if new non-Ivy packages are added to AIO, this speeds up the build as we don't build the unused formats. PR Close #29117 --- aio/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/package.json b/aio/package.json index 997d0605a4..17f21f148e 100644 --- a/aio/package.json +++ b/aio/package.json @@ -17,7 +17,7 @@ "build": "yarn ~~build", "prebuild-local": "yarn setup-local", "build-local": "yarn ~~build", - "prebuild-with-ivy": "yarn setup-local && yarn ivy-ngcc", + "prebuild-with-ivy": "yarn setup-local && yarn ivy-ngcc --formats fesm2015 fesm5", "build-with-ivy": "node scripts/build-with-ivy", "extract-cli-command-docs": "node tools/transforms/cli-docs-package/extract-cli-commands.js 3b1fe6437", "lint": "yarn check-env && yarn docs-lint && ng lint && yarn example-lint && yarn tools-lint", From 62157990554306fb76e1e254b31855f966ff65f2 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Wed, 27 Feb 2019 20:30:38 +0100 Subject: [PATCH 0225/1073] feat(core): update schematic to migrate to explicit query timing (#28983) Introduces an update schematic for the "@angular/core" package that automatically migrates pre-V8 "ViewChild" and "ContentChild" queries to the new explicit timing syntax. This is not required yet, but with Ivy, queries will be "dynamic" by default. Therefore specifying an explicit query timing ensures that developers can smoothly migrate to Ivy (once it's the default). Read more about the explicit timing API here: https://github.com/angular/angular/pull/28810 PR Close #28983 --- packages/core/BUILD.bazel | 3 + packages/core/package.json | 1 + packages/core/schematics/BUILD.bazel | 13 + packages/core/schematics/migrations.json | 9 + .../migrations/static-queries/BUILD.bazel | 20 + .../angular/analyze_query_usage.ts | 84 +++ .../angular/declaration_usage_visitor.ts | 88 +++ .../static-queries/angular/decorators.ts | 26 + .../angular/directive_inputs.ts | 88 +++ .../angular/ng_query_visitor.ts | 131 +++++ .../angular/query-definition.ts | 37 ++ .../migrations/static-queries/index.ts | 29 + .../migrations/static-queries/migration.ts | 97 ++++ .../typescript/class_declaration.ts | 32 ++ .../static-queries/typescript/decorators.ts | 24 + .../static-queries/typescript/imports.ts | 42 ++ .../typescript/property_name.ts | 28 + .../static-queries/typescript/tsconfig.ts | 21 + packages/core/schematics/test/BUILD.bazel | 22 + .../test/project_tsconfig_paths_spec.ts | 47 ++ .../test/static_queries_migration_spec.ts | 524 ++++++++++++++++++ packages/core/schematics/tsconfig.json | 8 + packages/core/schematics/utils/BUILD.bazel | 12 + .../utils/project_tsconfig_paths.ts | 70 +++ 24 files changed, 1456 insertions(+) create mode 100644 packages/core/schematics/BUILD.bazel create mode 100644 packages/core/schematics/migrations.json create mode 100644 packages/core/schematics/migrations/static-queries/BUILD.bazel create mode 100644 packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts create mode 100644 packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts create mode 100644 packages/core/schematics/migrations/static-queries/angular/decorators.ts create mode 100644 packages/core/schematics/migrations/static-queries/angular/directive_inputs.ts create mode 100644 packages/core/schematics/migrations/static-queries/angular/ng_query_visitor.ts create mode 100644 packages/core/schematics/migrations/static-queries/angular/query-definition.ts create mode 100644 packages/core/schematics/migrations/static-queries/index.ts create mode 100644 packages/core/schematics/migrations/static-queries/migration.ts create mode 100644 packages/core/schematics/migrations/static-queries/typescript/class_declaration.ts create mode 100644 packages/core/schematics/migrations/static-queries/typescript/decorators.ts create mode 100644 packages/core/schematics/migrations/static-queries/typescript/imports.ts create mode 100644 packages/core/schematics/migrations/static-queries/typescript/property_name.ts create mode 100644 packages/core/schematics/migrations/static-queries/typescript/tsconfig.ts create mode 100644 packages/core/schematics/test/BUILD.bazel create mode 100644 packages/core/schematics/test/project_tsconfig_paths_spec.ts create mode 100644 packages/core/schematics/test/static_queries_migration_spec.ts create mode 100644 packages/core/schematics/tsconfig.json create mode 100644 packages/core/schematics/utils/BUILD.bazel create mode 100644 packages/core/schematics/utils/project_tsconfig_paths.ts diff --git a/packages/core/BUILD.bazel b/packages/core/BUILD.bazel index 1fcc01021e..a722331a72 100644 --- a/packages/core/BUILD.bazel +++ b/packages/core/BUILD.bazel @@ -29,6 +29,9 @@ ng_package( "//packages/core/testing:package.json", ], entry_point = "packages/core/index.js", + packages = [ + "//packages/core/schematics:npm_package", + ], tags = [ "release-with-framework", ], diff --git a/packages/core/package.json b/packages/core/package.json index cf624f468d..fea6ca27ae 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -24,6 +24,7 @@ "url": "https://github.com/angular/angular.git" }, "ng-update": { + "migrations":"./schematics/migrations.json", "packageGroup": "NG_UPDATE_PACKAGE_GROUP" }, "sideEffects": false diff --git a/packages/core/schematics/BUILD.bazel b/packages/core/schematics/BUILD.bazel new file mode 100644 index 0000000000..9bb25621fa --- /dev/null +++ b/packages/core/schematics/BUILD.bazel @@ -0,0 +1,13 @@ +load("//tools:defaults.bzl", "npm_package") + +exports_files([ + "tsconfig.json", + "migrations.json", +]) + +npm_package( + name = "npm_package", + srcs = ["migrations.json"], + visibility = ["//packages/core:__pkg__"], + deps = ["//packages/core/schematics/migrations/static-queries"], +) diff --git a/packages/core/schematics/migrations.json b/packages/core/schematics/migrations.json new file mode 100644 index 0000000000..8293d9f2e8 --- /dev/null +++ b/packages/core/schematics/migrations.json @@ -0,0 +1,9 @@ +{ + "schematics": { + "migration-v8-static-queries": { + "version": "8", + "description": "Migrates ViewChild and ContentChild to explicit query timing", + "factory": "./migrations/static-queries/index" + } + } +} diff --git a/packages/core/schematics/migrations/static-queries/BUILD.bazel b/packages/core/schematics/migrations/static-queries/BUILD.bazel new file mode 100644 index 0000000000..7c2f0e9c63 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/BUILD.bazel @@ -0,0 +1,20 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "static-queries", + srcs = glob( + ["**/*.ts"], + exclude = ["index_spec.ts"], + ), + tsconfig = "//packages/core/schematics:tsconfig.json", + visibility = [ + "//packages/core/schematics:__pkg__", + "//packages/core/schematics/test:__pkg__", + ], + deps = [ + "//packages/core/schematics/utils", + "@npm//@angular-devkit/schematics", + "@npm//@types/node", + "@npm//typescript", + ], +) diff --git a/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts b/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts new file mode 100644 index 0000000000..a6debd1c53 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts @@ -0,0 +1,84 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {hasPropertyNameText} from '../typescript/property_name'; +import {DeclarationUsageVisitor} from './declaration_usage_visitor'; +import {ClassMetadataMap} from './ng_query_visitor'; +import {NgQueryDefinition, QueryTiming, QueryType} from './query-definition'; + + +/** + * Object that maps a given type of query to a list of lifecycle hooks that + * could be used to access such a query statically. + */ +const STATIC_QUERY_LIFECYCLE_HOOKS = { + [QueryType.ViewChild]: ['ngOnInit', 'ngAfterContentInit', 'ngAfterContentChecked'], + [QueryType.ContentChild]: ['ngOnInit'], +}; + +/** + * Analyzes the usage of the given query and determines the query timing based + * on the current usage of the query. + */ +export function analyzeNgQueryUsage( + query: NgQueryDefinition, classMetadata: ClassMetadataMap, + typeChecker: ts.TypeChecker): QueryTiming { + return isQueryUsedStatically(query.container, query, classMetadata, typeChecker, []) ? + QueryTiming.STATIC : + QueryTiming.DYNAMIC; +} + +/** Checks whether a given class or it's derived classes use the specified query statically. */ +function isQueryUsedStatically( + classDecl: ts.ClassDeclaration, query: NgQueryDefinition, classMetadataMap: ClassMetadataMap, + typeChecker: ts.TypeChecker, knownInputNames: string[]): boolean { + const usageVisitor = new DeclarationUsageVisitor(query.property, typeChecker); + const classMetadata = classMetadataMap.get(classDecl); + + // In case there is metadata for the current class, we collect all resolved Angular input + // names and add them to the list of known inputs that need to be checked for usages of + // the current query. e.g. queries used in an @Input() *setter* are always static. + if (classMetadata) { + knownInputNames.push(...classMetadata.ngInputNames); + } + + // List of TypeScript nodes which can contain usages of the given query in order to + // access it statically. e.g. + // (1) queries used in the "ngOnInit" lifecycle hook are static. + // (2) inputs with setters can access queries statically. + const possibleStaticQueryNodes: ts.Node[] = classDecl.members.filter(m => { + if (ts.isMethodDeclaration(m) && hasPropertyNameText(m.name) && + STATIC_QUERY_LIFECYCLE_HOOKS[query.type].indexOf(m.name.text) !== -1) { + return true; + } else if ( + knownInputNames && ts.isSetAccessor(m) && hasPropertyNameText(m.name) && + knownInputNames.indexOf(m.name.text) !== -1) { + return true; + } + return false; + }); + + // In case nodes that can possibly access a query statically have been found, check + // if the query declaration is used within any of these nodes. + if (possibleStaticQueryNodes.length && + possibleStaticQueryNodes.some(hookNode => usageVisitor.isUsedInNode(hookNode))) { + return true; + } + + // In case there are classes that derive from the current class, visit each + // derived class as inherited queries could be used statically. + if (classMetadata) { + return classMetadata.derivedClasses.some( + derivedClass => isQueryUsedStatically( + derivedClass, query, classMetadataMap, typeChecker, knownInputNames)); + } + + return false; +} diff --git a/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts b/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts new file mode 100644 index 0000000000..db6a7c7ac5 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts @@ -0,0 +1,88 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +/** + * Class that can be used to determine if a given TypeScript node is used within + * other given TypeScript nodes. This is achieved by walking through all children + * of the given node and checking for usages of the given declaration. The visitor + * also handles potential control flow changes caused by call/new expressions. + */ +export class DeclarationUsageVisitor { + /** Set of visited symbols that caused a jump in control flow. */ + private visitedJumpExprSymbols = new Set(); + + constructor(private declaration: ts.Node, private typeChecker: ts.TypeChecker) {} + + private isReferringToSymbol(node: ts.Node): boolean { + const symbol = this.typeChecker.getSymbolAtLocation(node); + return !!symbol && symbol.valueDeclaration === this.declaration; + } + + private addJumpExpressionToQueue(node: ts.Expression, nodeQueue: ts.Node[]) { + const callExprSymbol = this.typeChecker.getSymbolAtLocation(node); + + // Note that we should not add previously visited symbols to the queue as this + // could cause cycles. + if (callExprSymbol && callExprSymbol.valueDeclaration && + !this.visitedJumpExprSymbols.has(callExprSymbol)) { + this.visitedJumpExprSymbols.add(callExprSymbol); + nodeQueue.push(callExprSymbol.valueDeclaration); + } + } + + private addNewExpressionToQueue(node: ts.NewExpression, nodeQueue: ts.Node[]) { + const newExprSymbol = this.typeChecker.getSymbolAtLocation(node.expression); + + // Only handle new expressions which resolve to classes. Technically "new" could + // also call void functions or objects with a constructor signature. Also note that + // we should not visit already visited symbols as this could cause cycles. + if (!newExprSymbol || !newExprSymbol.valueDeclaration || + !ts.isClassDeclaration(newExprSymbol.valueDeclaration) || + this.visitedJumpExprSymbols.has(newExprSymbol)) { + return; + } + + const targetConstructor = + newExprSymbol.valueDeclaration.members.find(d => ts.isConstructorDeclaration(d)); + + if (targetConstructor) { + this.visitedJumpExprSymbols.add(newExprSymbol); + nodeQueue.push(targetConstructor); + } + } + + isUsedInNode(searchNode: ts.Node): boolean { + const nodeQueue: ts.Node[] = [searchNode]; + this.visitedJumpExprSymbols.clear(); + + while (nodeQueue.length) { + const node = nodeQueue.shift() !; + + if (ts.isIdentifier(node) && this.isReferringToSymbol(node)) { + return true; + } + + // Handle call expressions within TypeScript nodes that cause a jump in control + // flow. We resolve the call expression value declaration and add it to the node queue. + if (ts.isCallExpression(node)) { + this.addJumpExpressionToQueue(node.expression, nodeQueue); + } + + // Handle new expressions that cause a jump in control flow. We resolve the + // constructor declaration of the target class and add it to the node queue. + if (ts.isNewExpression(node)) { + this.addNewExpressionToQueue(node, nodeQueue); + } + + nodeQueue.push(...node.getChildren()); + } + return false; + } +} diff --git a/packages/core/schematics/migrations/static-queries/angular/decorators.ts b/packages/core/schematics/migrations/static-queries/angular/decorators.ts new file mode 100644 index 0000000000..2e11f6966d --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/angular/decorators.ts @@ -0,0 +1,26 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; +import {getCallDecoratorImport} from '../typescript/decorators'; + +export interface NgDecorator { + name: string; + node: ts.Decorator; +} + +/** + * Gets all decorators which are imported from an Angular package (e.g. "@angular/core") + * from a list of decorators. + */ +export function getAngularDecorators( + typeChecker: ts.TypeChecker, decorators: ReadonlyArray): NgDecorator[] { + return decorators.map(node => ({node, importData: getCallDecoratorImport(typeChecker, node)})) + .filter(({importData}) => importData && importData.importModule.startsWith('@angular/')) + .map(({node, importData}) => ({node, name: importData !.name})); +} diff --git a/packages/core/schematics/migrations/static-queries/angular/directive_inputs.ts b/packages/core/schematics/migrations/static-queries/angular/directive_inputs.ts new file mode 100644 index 0000000000..b9c0b661e5 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/angular/directive_inputs.ts @@ -0,0 +1,88 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {getPropertyNameText, hasPropertyNameText} from '../typescript/property_name'; +import {getAngularDecorators} from './decorators'; + +/** Analyzes the given class and resolves the name of all inputs which are declared. */ +export function getInputNamesOfClass( + node: ts.ClassDeclaration, typeChecker: ts.TypeChecker): string[] { + const resolvedInputSetters: string[] = []; + + // Determines the names of all inputs defined in the current class declaration by + // checking whether a given property/getter/setter has the "@Input" decorator applied. + node.members.forEach(m => { + if (!m.decorators || !m.decorators.length || + !ts.isPropertyDeclaration(m) && !ts.isSetAccessor(m) && !ts.isGetAccessor(m)) { + return; + } + + const inputDecorator = + getAngularDecorators(typeChecker, m.decorators !).find(d => d.name === 'Input'); + + if (inputDecorator && hasPropertyNameText(m.name)) { + resolvedInputSetters.push(m.name.text); + } + }); + + // Besides looking for immediate setters in the current class declaration, developers + // can also define inputs in the directive metadata using the "inputs" property. We + // also need to determine these inputs which are declared in the directive metadata. + const metadataInputs = getInputNamesFromMetadata(node, typeChecker); + + if (metadataInputs) { + resolvedInputSetters.push(...metadataInputs); + } + + return resolvedInputSetters; +} + +/** + * Determines the names of all inputs declared in the directive/component metadata + * of the given class. + */ +function getInputNamesFromMetadata( + node: ts.ClassDeclaration, typeChecker: ts.TypeChecker): string[]|null { + if (!node.decorators || !node.decorators.length) { + return null; + } + + const decorator = getAngularDecorators(typeChecker, node.decorators) + .find(d => d.name === 'Directive' || d.name === 'Component'); + + // In case no directive/component decorator could be found for this class, just + // return null as there is no metadata where an input could be declared. + if (!decorator) { + return null; + } + + const decoratorCall = decorator.node.expression as ts.CallExpression; + + // In case the decorator does define any metadata, there is no metadata + // where inputs could be declared. This is an edge case because there + // always needs to be an object literal, but in case there isn't we just + // want to skip the invalid decorator and return null. + if (!ts.isObjectLiteralExpression(decoratorCall.arguments[0])) { + return null; + } + + const metadata = decoratorCall.arguments[0] as ts.ObjectLiteralExpression; + const inputs = metadata.properties.filter(ts.isPropertyAssignment) + .find(p => getPropertyNameText(p.name) === 'inputs'); + + // In case there is no "inputs" property in the directive metadata, + // just return "null" as no inputs can be declared for this class. + if (!inputs || !ts.isArrayLiteralExpression(inputs.initializer)) { + return null; + } + + return inputs.initializer.elements.filter(ts.isStringLiteralLike) + .map(element => element.text.split(':')[0].trim()); +} diff --git a/packages/core/schematics/migrations/static-queries/angular/ng_query_visitor.ts b/packages/core/schematics/migrations/static-queries/angular/ng_query_visitor.ts new file mode 100644 index 0000000000..777ee8bbf7 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/angular/ng_query_visitor.ts @@ -0,0 +1,131 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {findParentClassDeclaration, getBaseTypeIdentifiers} from '../typescript/class_declaration'; + +import {getAngularDecorators} from './decorators'; +import {getInputNamesOfClass} from './directive_inputs'; +import {NgQueryDefinition, QueryType} from './query-definition'; + +/** Resolved metadata of a given class. */ +export interface ClassMetadata { + /** List of class declarations that derive from the given class. */ + derivedClasses: ts.ClassDeclaration[]; + /** List of property names that declare an Angular input within the given class. */ + ngInputNames: string[]; +} + +/** Type that describes a map which can be used to get a class declaration's metadata. */ +export type ClassMetadataMap = Map; + +/** + * Visitor that can be used to determine Angular queries within given TypeScript nodes. + * Besides resolving queries, the visitor also records class relations and searches for + * Angular input setters which can be used to analyze the timing usage of a given query. + */ +export class NgQueryResolveVisitor { + /** Resolved Angular query definitions. */ + resolvedQueries = new Map(); + + /** Maps a class declaration to its class metadata. */ + classMetadata: ClassMetadataMap = new Map(); + + constructor(public typeChecker: ts.TypeChecker) {} + + visitNode(node: ts.Node) { + switch (node.kind) { + case ts.SyntaxKind.PropertyDeclaration: + this.visitPropertyDeclaration(node as ts.PropertyDeclaration); + break; + case ts.SyntaxKind.ClassDeclaration: + this.visitClassDeclaration(node as ts.ClassDeclaration); + break; + } + + ts.forEachChild(node, node => this.visitNode(node)); + } + + private visitPropertyDeclaration(node: ts.PropertyDeclaration) { + if (!node.decorators || !node.decorators.length) { + return; + } + + const ngDecorators = getAngularDecorators(this.typeChecker, node.decorators); + const queryDecorator = + ngDecorators.find(({name}) => name === 'ViewChild' || name === 'ContentChild'); + + // Ensure that the current property declaration is defining a query. + if (!queryDecorator) { + return; + } + + const queryContainer = findParentClassDeclaration(node); + + // If the query is not located within a class declaration, skip this node. + if (!queryContainer) { + return; + } + + const sourceFile = node.getSourceFile(); + const newQueries = this.resolvedQueries.get(sourceFile) || []; + + this.resolvedQueries.set(sourceFile, newQueries.concat({ + type: queryDecorator.name === 'ViewChild' ? QueryType.ViewChild : QueryType.ContentChild, + property: node, + decorator: queryDecorator, + container: queryContainer, + })); + } + + private visitClassDeclaration(node: ts.ClassDeclaration) { + this._recordClassInputSetters(node); + this._recordClassInheritances(node); + } + + private _recordClassInputSetters(node: ts.ClassDeclaration) { + const resolvedInputNames = getInputNamesOfClass(node, this.typeChecker); + + if (resolvedInputNames) { + const classMetadata = this._getClassMetadata(node); + + classMetadata.ngInputNames = resolvedInputNames; + this.classMetadata.set(node, classMetadata); + } + } + + private _recordClassInheritances(node: ts.ClassDeclaration) { + const baseTypes = getBaseTypeIdentifiers(node); + + if (!baseTypes || !baseTypes.length) { + return; + } + + baseTypes.forEach(baseTypeIdentifier => { + // We need to resolve the value declaration through the resolved type as the base + // class could be declared in different source files and the local symbol won't + // contain a value declaration as the value is not declared locally. + const symbol = this.typeChecker.getTypeAtLocation(baseTypeIdentifier).getSymbol(); + + if (symbol && symbol.valueDeclaration && ts.isClassDeclaration(symbol.valueDeclaration)) { + const extendedClass = symbol.valueDeclaration; + const classMetadata = this._getClassMetadata(extendedClass); + + // Record all classes that derive from the given class. This makes it easy to + // determine all classes that could potentially use inherited queries statically. + classMetadata.derivedClasses.push(node); + this.classMetadata.set(extendedClass, classMetadata); + } + }); + } + + private _getClassMetadata(node: ts.ClassDeclaration): ClassMetadata { + return this.classMetadata.get(node) || {derivedClasses: [], ngInputNames: []}; + } +} diff --git a/packages/core/schematics/migrations/static-queries/angular/query-definition.ts b/packages/core/schematics/migrations/static-queries/angular/query-definition.ts new file mode 100644 index 0000000000..1a9fbb00c0 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/angular/query-definition.ts @@ -0,0 +1,37 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; +import {NgDecorator} from './decorators'; + + +/** Timing of a given query. Either static or dynamic. */ +export enum QueryTiming { + STATIC, + DYNAMIC +} + +/** Type of a given query. */ +export enum QueryType { + ViewChild, + ContentChild +} + +export interface NgQueryDefinition { + /** Type of the query definition. */ + type: QueryType; + + /** Property that declares the query. */ + property: ts.PropertyDeclaration; + + /** Decorator that declares this as a query. */ + decorator: NgDecorator; + + /** Class declaration that holds this query. */ + container: ts.ClassDeclaration; +} diff --git a/packages/core/schematics/migrations/static-queries/index.ts b/packages/core/schematics/migrations/static-queries/index.ts new file mode 100644 index 0000000000..e0149a4fb2 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/index.ts @@ -0,0 +1,29 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Rule, SchematicsException, Tree} from '@angular-devkit/schematics'; +import {getProjectTsConfigPaths} from '../../utils/project_tsconfig_paths'; +import {runStaticQueryMigration} from './migration'; + +/** Entry point for the V8 static-query migration. */ +export default function(): Rule { + return (tree: Tree) => { + const projectTsConfigPaths = getProjectTsConfigPaths(tree); + const basePath = process.cwd(); + + if (!projectTsConfigPaths.length) { + throw new SchematicsException( + 'Could not find any tsconfig file. Cannot migrate queries ' + + 'to explicit timing.'); + } + + for (const tsconfigPath of projectTsConfigPaths) { + runStaticQueryMigration(tree, tsconfigPath, basePath); + } + }; +} diff --git a/packages/core/schematics/migrations/static-queries/migration.ts b/packages/core/schematics/migrations/static-queries/migration.ts new file mode 100644 index 0000000000..d54a08b784 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/migration.ts @@ -0,0 +1,97 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Tree, UpdateRecorder} from '@angular-devkit/schematics'; +import {dirname, relative, resolve} from 'path'; +import * as ts from 'typescript'; + +import {analyzeNgQueryUsage} from './angular/analyze_query_usage'; +import {NgQueryResolveVisitor} from './angular/ng_query_visitor'; +import {NgQueryDefinition, QueryTiming} from './angular/query-definition'; +import {getPropertyNameText} from './typescript/property_name'; +import {parseTsconfigFile} from './typescript/tsconfig'; + +/** + * Runs the static query migration for the given TypeScript project. The schematic + * analyzes all queries within the project and sets up the query timing based on + * the current usage of the query property. e.g. a view query that is not used in any + * lifecycle hook does not need to be static and can be set up with "static: false". + */ +export function runStaticQueryMigration(tree: Tree, tsconfigPath: string, basePath: string) { + const parsed = parseTsconfigFile(tsconfigPath, dirname(tsconfigPath)); + const host = ts.createCompilerHost(parsed.options, true); + const program = ts.createProgram(parsed.fileNames, parsed.options, host); + const typeChecker = program.getTypeChecker(); + const queryVisitor = new NgQueryResolveVisitor(typeChecker); + const rootSourceFiles = program.getRootFileNames().map(f => program.getSourceFile(f) !); + const printer = ts.createPrinter(); + + // Analyze source files by detecting queries and class relations. + rootSourceFiles.forEach(sourceFile => queryVisitor.visitNode(sourceFile)); + + const {resolvedQueries, classMetadata} = queryVisitor; + + // Walk through all source files that contain resolved queries and update + // the source files if needed. Note that we need to update multiple queries + // within a source file within the same recorder in order to not throw off + // the TypeScript node offsets. + resolvedQueries.forEach((queries, sourceFile) => { + const update = tree.beginUpdate(relative(basePath, sourceFile.fileName)); + + // Compute the query usage for all resolved queries and update the + // query definitions to explicitly declare the query timing (static or dynamic) + queries.forEach(q => { + const timing = analyzeNgQueryUsage(q, classMetadata, typeChecker); + recordQueryUsageTransformation(q, update, timing, printer, sourceFile); + }); + + tree.commitUpdate(update); + }); +} + +/** + * Transforms the query decorator by explicitly specifying the timing based on the + * determined timing. The changes will be added to the specified update recorder. + */ +function recordQueryUsageTransformation( + query: NgQueryDefinition, recorder: UpdateRecorder, timing: QueryTiming, printer: ts.Printer, + sourceFile: ts.SourceFile) { + const queryExpr = query.decorator.node.expression as ts.CallExpression; + const queryArguments = queryExpr.arguments; + const timingPropertyAssignment = ts.createPropertyAssignment( + 'static', timing === QueryTiming.STATIC ? ts.createTrue() : ts.createFalse()); + let newCallText = ''; + + // If the query decorator is already called with two arguments, we need to + // keep the existing options untouched and just add the new property if needed. + if (queryArguments.length === 2) { + const existingOptions = queryArguments[1] as ts.ObjectLiteralExpression; + + // In case the options already contains a property for the "static" flag, we just + // skip this query and leave it untouched. + if (existingOptions.properties.some( + p => !!p.name && getPropertyNameText(p.name) === 'static')) { + return; + } + + const updatedOptions = ts.updateObjectLiteral( + existingOptions, existingOptions.properties.concat(timingPropertyAssignment)); + const updatedCall = ts.updateCall( + queryExpr, queryExpr.expression, queryExpr.typeArguments, + [queryArguments[0], updatedOptions]); + newCallText = printer.printNode(ts.EmitHint.Unspecified, updatedCall, sourceFile); + } else { + const newCall = ts.updateCall( + queryExpr, queryExpr.expression, queryExpr.typeArguments, + [queryArguments[0], ts.createObjectLiteral([timingPropertyAssignment])]); + newCallText = printer.printNode(ts.EmitHint.Unspecified, newCall, sourceFile); + } + + recorder.remove(queryExpr.getStart(), queryExpr.getWidth()); + recorder.insertRight(queryExpr.getStart(), newCallText); +} diff --git a/packages/core/schematics/migrations/static-queries/typescript/class_declaration.ts b/packages/core/schematics/migrations/static-queries/typescript/class_declaration.ts new file mode 100644 index 0000000000..3a835539b6 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/typescript/class_declaration.ts @@ -0,0 +1,32 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +/** Determines the base type identifiers of a specified class declaration. */ +export function getBaseTypeIdentifiers(node: ts.ClassDeclaration): ts.Identifier[]|null { + if (!node.heritageClauses) { + return null; + } + + return node.heritageClauses.filter(clause => clause.token === ts.SyntaxKind.ExtendsKeyword) + .reduce((types, clause) => types.concat(clause.types), [] as ts.ExpressionWithTypeArguments[]) + .map(typeExpression => typeExpression.expression) + .filter(ts.isIdentifier); +} + +/** Gets the first found parent class declaration of a given node. */ +export function findParentClassDeclaration(node: ts.Node): ts.ClassDeclaration|null { + while (!ts.isClassDeclaration(node)) { + if (ts.isSourceFile(node)) { + return null; + } + node = node.parent; + } + return node; +} diff --git a/packages/core/schematics/migrations/static-queries/typescript/decorators.ts b/packages/core/schematics/migrations/static-queries/typescript/decorators.ts new file mode 100644 index 0000000000..75a900c2b4 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/typescript/decorators.ts @@ -0,0 +1,24 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {Import, getImportOfIdentifier} from './imports'; + +export function getCallDecoratorImport( + typeChecker: ts.TypeChecker, decorator: ts.Decorator): Import|null { + // Note that this does not cover the edge case where decorators are called from + // a namespace import: e.g. "@core.Component()". This is not handled by Ngtsc either. + if (!ts.isCallExpression(decorator.expression) || + !ts.isIdentifier(decorator.expression.expression)) { + return null; + } + + const identifier = decorator.expression.expression; + return getImportOfIdentifier(typeChecker, identifier); +} diff --git a/packages/core/schematics/migrations/static-queries/typescript/imports.ts b/packages/core/schematics/migrations/static-queries/typescript/imports.ts new file mode 100644 index 0000000000..65142eaefa --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/typescript/imports.ts @@ -0,0 +1,42 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +export type Import = { + name: string, + importModule: string +}; + +/** Gets import information about the specified identifier by using the Type checker. */ +export function getImportOfIdentifier(typeChecker: ts.TypeChecker, node: ts.Identifier): Import| + null { + const symbol = typeChecker.getSymbolAtLocation(node); + + if (!symbol || !symbol.declarations.length) { + return null; + } + + const decl = symbol.declarations[0]; + + if (!ts.isImportSpecifier(decl)) { + return null; + } + + const importDecl = decl.parent.parent.parent; + + if (!ts.isStringLiteral(importDecl.moduleSpecifier)) { + return null; + } + + return { + // Handles aliased imports: e.g. "import {Component as myComp} from ..."; + name: decl.propertyName ? decl.propertyName.text : decl.name.text, + importModule: importDecl.moduleSpecifier.text + }; +} diff --git a/packages/core/schematics/migrations/static-queries/typescript/property_name.ts b/packages/core/schematics/migrations/static-queries/typescript/property_name.ts new file mode 100644 index 0000000000..79b4cc56f9 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/typescript/property_name.ts @@ -0,0 +1,28 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +/** Type that describes a property name with an obtainable text. */ +type PropertyNameWithText = Exclude; + +/** + * Gets the text of the given property name. Returns null if the property + * name couldn't be determined statically. + */ +export function getPropertyNameText(node: ts.PropertyName): string|null { + if (ts.isIdentifier(node) || ts.isStringLiteralLike(node)) { + return node.text; + } + return null; +} + +/** Checks whether the given property name has a text. */ +export function hasPropertyNameText(node: ts.PropertyName): node is PropertyNameWithText { + return ts.isStringLiteral(node) || ts.isNumericLiteral(node) || ts.isIdentifier(node); +} diff --git a/packages/core/schematics/migrations/static-queries/typescript/tsconfig.ts b/packages/core/schematics/migrations/static-queries/typescript/tsconfig.ts new file mode 100644 index 0000000000..220448a0ef --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/typescript/tsconfig.ts @@ -0,0 +1,21 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +export function parseTsconfigFile(tsconfigPath: string, basePath: string): ts.ParsedCommandLine { + const {config} = ts.readConfigFile(tsconfigPath, ts.sys.readFile); + const parseConfigHost = { + useCaseSensitiveFileNames: ts.sys.useCaseSensitiveFileNames, + fileExists: ts.sys.fileExists, + readDirectory: ts.sys.readDirectory, + readFile: ts.sys.readFile, + }; + + return ts.parseJsonConfigFileContent(config, parseConfigHost, basePath, {}); +} diff --git a/packages/core/schematics/test/BUILD.bazel b/packages/core/schematics/test/BUILD.bazel new file mode 100644 index 0000000000..fd1877312e --- /dev/null +++ b/packages/core/schematics/test/BUILD.bazel @@ -0,0 +1,22 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +ts_library( + name = "test_lib", + testonly = True, + srcs = glob(["**/*.ts"]), + data = [ + "//packages/core/schematics:migrations.json", + "@npm//shelljs", + ], + deps = [ + "//packages/core/schematics/migrations/static-queries", + "//packages/core/schematics/utils", + "@npm//@angular-devkit/schematics", + "@npm//@types/shelljs", + ], +) + +jasmine_node_test( + name = "test", + deps = [":test_lib"], +) diff --git a/packages/core/schematics/test/project_tsconfig_paths_spec.ts b/packages/core/schematics/test/project_tsconfig_paths_spec.ts new file mode 100644 index 0000000000..b26137eb37 --- /dev/null +++ b/packages/core/schematics/test/project_tsconfig_paths_spec.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {HostTree} from '@angular-devkit/schematics'; +import {UnitTestTree} from '@angular-devkit/schematics/testing'; +import {getProjectTsConfigPaths} from '../utils/project_tsconfig_paths'; + +describe('project tsconfig paths', () => { + let testTree: UnitTestTree; + + beforeEach(() => { testTree = new UnitTestTree(new HostTree()); }); + + it('should detect build tsconfig path inside of angular.json file', () => { + testTree.create('/my-custom-config.json', ''); + testTree.create('/angular.json', JSON.stringify({ + projects: + {my_name: {architect: {build: {options: {tsConfig: './my-custom-config.json'}}}}} + })); + + expect(getProjectTsConfigPaths(testTree)).toEqual(['./my-custom-config.json']); + }); + + it('should detect test tsconfig path inside of .angular.json file', () => { + testTree.create('/my-test-config.json', ''); + testTree.create('/.angular.json', JSON.stringify({ + projects: + {with_tests: {architect: {test: {options: {tsConfig: './my-test-config.json'}}}}} + })); + + expect(getProjectTsConfigPaths(testTree)).toEqual(['./my-test-config.json']); + }); + + it('should detect common tsconfigs if no workspace config could be found', () => { + testTree.create('/tsconfig.json', ''); + testTree.create('/src/tsconfig.json', ''); + testTree.create('/src/tsconfig.app.json', ''); + + expect(getProjectTsConfigPaths(testTree)).toEqual([ + './tsconfig.json', './src/tsconfig.json', './src/tsconfig.app.json' + ]); + }); +}); diff --git a/packages/core/schematics/test/static_queries_migration_spec.ts b/packages/core/schematics/test/static_queries_migration_spec.ts new file mode 100644 index 0000000000..6ed28cbf39 --- /dev/null +++ b/packages/core/schematics/test/static_queries_migration_spec.ts @@ -0,0 +1,524 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; +import {TempScopedNodeJsSyncHost} from '@angular-devkit/core/node/testing'; +import {HostTree} from '@angular-devkit/schematics'; +import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; +import * as shx from 'shelljs'; + +describe('static-queries migration', () => { + let runner: SchematicTestRunner; + let host: TempScopedNodeJsSyncHost; + let tree: UnitTestTree; + let tmpDirPath: string; + let previousWorkingDir: string; + + beforeEach(() => { + runner = new SchematicTestRunner('test', require.resolve('../migrations.json')); + host = new TempScopedNodeJsSyncHost(); + tree = new UnitTestTree(new HostTree(host)); + + writeFile('/tsconfig.json', JSON.stringify({ + compilerOptions: { + lib: ['es2015'], + } + })); + + previousWorkingDir = shx.pwd(); + tmpDirPath = getSystemPath(host.root); + + // Switch into the temporary directory path. This allows us to run + // the schematic against our custom unit test tree. + shx.cd(tmpDirPath); + }); + + afterEach(() => { + shx.cd(previousWorkingDir); + shx.rm('-r', tmpDirPath); + }); + + describe('ViewChild', () => { + createQueryTests('ViewChild'); + + it('should mark view queries used in "ngAfterContentInit" as static', () => { + writeFile('/index.ts', ` + import {Component, ViewChild} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @ViewChild('test') query: any; + + ngAfterContentInit() { + this.query.classList.add('test'); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('test', { static: true }) query: any;`); + }); + + it('should mark view queries used in "ngAfterContentChecked" as static', () => { + writeFile('/index.ts', ` + import {Component, ViewChild} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @ViewChild('test') query: any; + + ngAfterContentChecked() { + this.query.classList.add('test'); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('test', { static: true }) query: any;`); + }); + }); + + describe('ContentChild', () => { + createQueryTests('ContentChild'); + + it('should not mark content queries used in "ngAfterContentInit" as static', () => { + writeFile('/index.ts', ` + import {Component, ContentChild} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @ContentChild('test') query: any; + + ngAfterContentInit() { + this.query.classList.add('test'); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ContentChild('test', { static: false }) query: any;`); + }); + + it('should not mark content queries used in "ngAfterContentChecked" as static', () => { + writeFile('/index.ts', ` + import {Component, ContentChild} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @ContentChild('test') query: any; + + ngAfterContentChecked() { + this.query.classList.add('test'); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ContentChild('test', { static: false }) query: any;`); + }); + }); + + function writeFile(filePath: string, contents: string) { + host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); + } + + function runMigration() { runner.runSchematic('migration-v8-static-queries', {}, tree); } + + function createQueryTests(queryType: 'ViewChild' | 'ContentChild') { + it('should mark queries as dynamic', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') unused: any; + @${queryType}('dynamic') dynamic: any; + + onClick() { + this.dynamicQuery.classList.add('test'); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: false }) unused: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('dynamic', { static: false }) dynamic: any`); + }); + + it('should mark queries used in "ngOnInit" as static', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + + ngOnInit() { + this.query.classList.add('test'); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should keep existing query options when updating timing', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test', { /* test */ read: null }) query: any; + + ngOnInit() { + this.query.classList.add('test'); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { /* test */ read: null, static: true }) query: any;`); + }); + + it('should not overwrite existing explicit query timing', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test', {static: /* untouched */ someVal}) query: any; + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', {static: /* untouched */ someVal}) query: any;`); + }); + + it('should detect queries used in deep method chain', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + // We intentionally add this comma for the second parameter in order + // to ensure that the migration does not incorrectly create an invalid + // decorator call with three parameters. e.g. "ViewQuery('test', {...}, )" + @${queryType}('test', ) query: any; + + ngOnInit() { + this.a(); + } + + a() { + this.b(); + } + + b() { + this.c(); + } + + c() { + console.log(this.query); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should properly exit if recursive function is analyzed', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + + ngOnInit() { + this.recursive(); + } + + recursive() { + this.recursive(); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: false }) query: any;`); + }); + + it('should detect queries used in newly instantiated classes', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + @${queryType}('test') query2: any; + + ngOnInit() { + new A(this); + } + } + + export class A { + constructor(ctx: MyComp) { + ctx.query.test(); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: false }) query2: any;`); + }); + + it('should detect queries in lifecycle hook with string literal name', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + + 'ngOnInit'() { + this.query.test(); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should detect static queries within nested inheritance', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + } + + export class A extends MyComp {} + export class B extends A { + + ngOnInit() { + this.query.testFn(); + } + + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should detect static queries used within input setters', () => { + writeFile('/index.ts', ` + import {Component, Input, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + + @Input() + get myVal() { return null; } + set myVal(newVal: any) { + this.query.classList.add('setter'); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should detect inputs defined in metadata', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({ + template: '', + inputs: ["myVal"], + }) + export class MyComp { + @${queryType}('test') query: any; + + // We don't use the input decorator here as we want to verify + // that it properly detects the input through the component metadata. + get myVal() { return null; } + set myVal(newVal: any) { + this.query.classList.add('setter'); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should detect aliased inputs declared in metadata', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({ + template: '', + inputs: ['prop: publicName'], + }) + export class MyComp { + @${queryType}('test') query: any; + + set prop(val: any) { + this.query.test(); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should not mark query as static if query is used in non-input setter', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + + set myProperty(val: any) { + this.query.test(); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: false }) query: any;`); + }); + + it('should detect input decorator on setter', () => { + writeFile('/index.ts', ` + import {Input, Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + + get myProperty() { return null; } + + // Usually the decorator is set on the get accessor, but it's also possible + // to declare the input on the setter. This ensures that it is handled properly. + @Input() + set myProperty(val: any) { + this.query.test(); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should detect setter inputs in derived classes', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({ + template: '', + inputs: ['childSetter'], + }) + export class MyComp { + protected @${queryType}('test') query: any; + } + + export class B extends MyComp { + set childSetter(newVal: any) { + this.query.test(); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should properly detect static query in external derived class', () => { + writeFile('/src/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + } + `); + + writeFile('/src/external.ts', ` + import {MyComp} from './index'; + + export class ExternalComp extends MyComp { + ngOnInit() { + this.query.test(); + } + } + `); + + // Move the tsconfig into a subdirectory. This ensures that the update is properly + // recorded for TypeScript projects not at the schematic tree root. + host.sync.rename(normalize('/tsconfig.json'), normalize('/src/tsconfig.json')); + + runMigration(); + + expect(tree.readContent('/src/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + } +}); diff --git a/packages/core/schematics/tsconfig.json b/packages/core/schematics/tsconfig.json new file mode 100644 index 0000000000..6e6c7ac264 --- /dev/null +++ b/packages/core/schematics/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "strictNullChecks": true, + "noImplicitReturns": true, + "lib": ["es2015"], + "types": [] + } +} diff --git a/packages/core/schematics/utils/BUILD.bazel b/packages/core/schematics/utils/BUILD.bazel new file mode 100644 index 0000000000..cffc353f4d --- /dev/null +++ b/packages/core/schematics/utils/BUILD.bazel @@ -0,0 +1,12 @@ +load("//tools:defaults.bzl", "ts_library") + +ts_library( + name = "utils", + srcs = glob( + ["**/*.ts"], + exclude = ["**/*_spec.ts"], + ), + tsconfig = "//packages/core/schematics:tsconfig.json", + visibility = ["//packages/core/schematics:__subpackages__"], + deps = ["@npm//@angular-devkit/schematics"], +) diff --git a/packages/core/schematics/utils/project_tsconfig_paths.ts b/packages/core/schematics/utils/project_tsconfig_paths.ts new file mode 100644 index 0000000000..4623f012af --- /dev/null +++ b/packages/core/schematics/utils/project_tsconfig_paths.ts @@ -0,0 +1,70 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Tree} from '@angular-devkit/schematics'; + +/** Name of the default Angular CLI workspace configuration files. */ +const defaultWorkspaceConfigPaths = ['/angular.json', '/.angular.json']; + +/** + * Gets all tsconfig paths from a CLI project by reading the workspace configuration + * and looking for common tsconfig locations. + */ +export function getProjectTsConfigPaths(tree: Tree): string[] { + // Start with some tsconfig paths that are generally used within CLI projects. + const tsconfigPaths = new Set([ + './tsconfig.json', + './src/tsconfig.json', + './src/tsconfig.app.json', + ]); + + // Add any tsconfig directly referenced in a build or test task of the angular.json workspace. + const workspace = getWorkspaceConfigGracefully(tree); + + if (workspace) { + const projects = Object.keys(workspace.projects).map(name => workspace.projects[name]); + for (const project of projects) { + ['build', 'test'].forEach(targetName => { + if (project.targets && project.targets[targetName] && project.targets[targetName].options && + project.targets[targetName].options.tsConfig) { + tsconfigPaths.add(project.targets[targetName].options.tsConfig); + } + + if (project.architect && project.architect[targetName] && + project.architect[targetName].options && + project.architect[targetName].options.tsConfig) { + tsconfigPaths.add(project.architect[targetName].options.tsConfig); + } + }); + } + } + + // Filter out tsconfig files that don't exist in the CLI project. + return Array.from(tsconfigPaths).filter(p => tree.exists(p)); +} + +/** + * Resolve the workspace configuration of the specified tree gracefully. We cannot use the utility + * functions from the default Angular schematics because those might not be present in older + * versions of the CLI. Also it's important to resolve the workspace gracefully because + * the CLI project could be still using `.angular-cli.json` instead of thew new config. + */ +function getWorkspaceConfigGracefully(tree: Tree): any { + const path = defaultWorkspaceConfigPaths.find(filePath => tree.exists(filePath)); + const configBuffer = tree.read(path !); + + if (!path || !configBuffer) { + return null; + } + + try { + return JSON.parse(configBuffer.toString()); + } catch { + return null; + } +} From 25166d4f41b0bb6eb66f598a71c6eba4807acf91 Mon Sep 17 00:00:00 2001 From: Marc Laval Date: Fri, 1 Mar 2019 14:39:28 +0100 Subject: [PATCH 0226/1073] fix(ivy): support property values changed in ngOnChanges (forward rref case) (#29054) PR Close #29054 --- integration/_payload-limits.json | 2 +- .../compliance/r3_compiler_compliance_spec.ts | 21 ++- .../r3_view_compiler_binding_spec.ts | 2 + .../compliance/r3_view_compiler_i18n_spec.ts | 41 ++++ .../r3_view_compiler_styling_spec.ts | 3 + .../r3_view_compiler_template_spec.ts | 9 + .../compiler/src/render3/r3_identifiers.ts | 2 + .../compiler/src/render3/view/template.ts | 29 ++- .../core/src/core_render3_private_export.ts | 1 + packages/core/src/render3/component.ts | 5 +- packages/core/src/render3/hooks.ts | 175 +++++++++++++----- packages/core/src/render3/index.ts | 2 + packages/core/src/render3/instructions.ts | 39 +++- packages/core/src/render3/interfaces/view.ts | 40 +++- packages/core/src/render3/jit/environment.ts | 1 + packages/core/src/render3/state.ts | 4 +- packages/core/src/render3/util/view_utils.ts | 10 +- packages/core/test/acceptance/exports_spec.ts | 83 ++++++++- .../core/test/acceptance/lifecycle_spec.ts | 116 +++++++++++- .../cyclic_import/bundle.golden_symbols.json | 11 +- .../hello_world/bundle.golden_symbols.json | 11 +- .../bundling/todo/bundle.golden_symbols.json | 18 +- packages/core/test/render3/lifecycle_spec.ts | 42 ++++- .../e2e_test/simple_ng_model_spec.ts | 56 +++--- 24 files changed, 609 insertions(+), 114 deletions(-) diff --git a/integration/_payload-limits.json b/integration/_payload-limits.json index be104d8e49..61f989f000 100644 --- a/integration/_payload-limits.json +++ b/integration/_payload-limits.json @@ -12,7 +12,7 @@ "master": { "uncompressed": { "runtime": 1440, - "main": 13659, + "main": 13921, "polyfills": 38390 } } diff --git a/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts b/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts index 757b034542..d256953c43 100644 --- a/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts @@ -798,6 +798,7 @@ describe('compiler compliance', () => { if (rf & 2) { const $myComp$ = $r3$.ɵnextContext(); const $foo$ = $r3$.ɵreference(1); + $r3$.ɵflushHooksUpTo(1); $r3$.ɵtextBinding(1, $r3$.ɵinterpolation2("", $myComp$.salutation, " ", $foo$, "")); } } @@ -1255,6 +1256,7 @@ describe('compiler compliance', () => { } if (rf & 2) { $r3$.ɵelementProperty(0, "ngIf", $r3$.ɵbind(ctx.visible)); + $r3$.ɵflushHooksUpTo(1); $r3$.ɵelementProperty(1, "ngIf", $r3$.ɵbind(ctx.visible)); } } @@ -1947,6 +1949,7 @@ describe('compiler compliance', () => { } if (rf & 2) { $r3$.ɵtextBinding(0, $r3$.ɵinterpolation1("", $r3$.ɵpipeBind2(1, 3, $r3$.ɵpipeBind2(2, 6, ctx.name, ctx.size), ctx.size), "")); + $r3$.ɵflushHooksUpTo(4); $r3$.ɵtextBinding(4, $r3$.ɵinterpolation2("", $r3$.ɵpipeBindV(5, 9, $r3$.ɵpureFunction1(18, $c0$, ctx.name)), " ", (ctx.name ? 1 : $r3$.ɵpipeBind1(6, 16, 2)), "")); } }, @@ -2061,6 +2064,7 @@ describe('compiler compliance', () => { } if (rf & 2) { const $user$ = $r3$.ɵreference(1); + $r3$.ɵflushHooksUpTo(2); $r3$.ɵtextBinding(2, $r3$.ɵinterpolation1("Hello ", $user$.value, "!")); } }, @@ -2123,6 +2127,7 @@ describe('compiler compliance', () => { $r3$.ɵnextContext(); const $foo$ = $r3$.ɵreference(1); const $baz$ = $r3$.ɵreference(5); + $r3$.ɵflushHooksUpTo(1); $r3$.ɵtextBinding(1, $r3$.ɵinterpolation3("", $foo$, "-", $bar$, "-", $baz$, "")); } } @@ -2138,6 +2143,7 @@ describe('compiler compliance', () => { const $bar$ = $r3$.ɵreference(4); $r3$.ɵnextContext(); const $foo$ = $r3$.ɵreference(1); + $r3$.ɵflushHooksUpTo(1); $r3$.ɵtextBinding(1, $r3$.ɵinterpolation2(" ", $foo$, "-", $bar$, " ")); } } @@ -2157,6 +2163,7 @@ describe('compiler compliance', () => { } if (rf & 2) { const $foo$ = $r3$.ɵreference(1); + $r3$.ɵflushHooksUpTo(2); $r3$.ɵtextBinding(2, $r3$.ɵinterpolation1(" ", $foo$, " ")); } }, @@ -2209,6 +2216,7 @@ describe('compiler compliance', () => { if (rf & 2) { const $item$ = $i0$.ɵnextContext().$implicit; const $foo$ = $i0$.ɵreference(2); + $r3$.ɵflushHooksUpTo(1); $i0$.ɵtextBinding(1, $i0$.ɵinterpolation2(" ", $foo$, " - ", $item$, " ")); } } @@ -2222,6 +2230,7 @@ describe('compiler compliance', () => { } if (rf & 2) { const $app$ = $i0$.ɵnextContext(); + $r3$.ɵflushHooksUpTo(3); $i0$.ɵelementProperty(3, "ngIf", $i0$.ɵbind($app$.showing)); } } @@ -2313,6 +2322,7 @@ describe('compiler compliance', () => { } if (rf & 2) { $r3$.ɵelementProperty(0, "name", $r3$.ɵbind(ctx.name1)); + $r3$.ɵflushHooksUpTo(1); $r3$.ɵelementProperty(1, "name", $r3$.ɵbind(ctx.name2)); } }, @@ -2443,7 +2453,10 @@ describe('compiler compliance', () => { $r3$.ɵtemplate(1, MyComponent__svg_g_1_Template, 2, 0, "g", $t1_attrs$); $r3$.ɵelementEnd(); } - if (rf & 2) { $r3$.ɵelementProperty(1,"forOf",$r3$.ɵbind(ctx.items)); } + if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); + $r3$.ɵelementProperty(1,"forOf",$r3$.ɵbind(ctx.items)); + } }, directives: function() { return [ForOfDirective]; }, encapsulation: 2 @@ -2505,6 +2518,7 @@ describe('compiler compliance', () => { } if (rf & 2) { const $item$ = ctx.$implicit; + $r3$.ɵflushHooksUpTo(1); $r3$.ɵtextBinding(1, $r3$.ɵinterpolation1("", $item$.name, "")); } } @@ -2522,6 +2536,7 @@ describe('compiler compliance', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵelementProperty(1, "forOf", $r3$.ɵbind(ctx.items)); } }, @@ -2586,6 +2601,7 @@ describe('compiler compliance', () => { if (rf & 2) { const $info$ = ctx.$implicit; const $item$ = $r3$.ɵnextContext().$implicit; + $r3$.ɵflushHooksUpTo(1); $r3$.ɵtextBinding(1, $r3$.ɵinterpolation2(" ", $item$.name, ": ", $info$.description, " ")); } } @@ -2603,7 +2619,9 @@ describe('compiler compliance', () => { } if (rf & 2) { const $item$ = ctx.$implicit; + $r3$.ɵflushHooksUpTo(2); $r3$.ɵtextBinding(2, $r3$.ɵinterpolation1("", IDENT.name, "")); + $r3$.ɵflushHooksUpTo(4); $r3$.ɵelementProperty(4, "forOf", $r3$.ɵbind(IDENT.infos)); } } @@ -2622,6 +2640,7 @@ describe('compiler compliance', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵelementProperty(1, "forOf", $r3$.ɵbind(ctx.items)); } }, diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts index bc4c880ec8..7b922505cb 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts @@ -44,6 +44,7 @@ describe('compiler compliance: bindings', () => { $i0$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $i0$.ɵtextBinding(1, $i0$.ɵinterpolation1("Hello ", $ctx$.name, "")); } }`; @@ -473,6 +474,7 @@ describe('compiler compliance: bindings', () => { } if (rf & 2) { const $_r0$ = $i0$.ɵreference(1); + $r3$.ɵflushHooksUpTo(4); $i0$.ɵtextBinding(4, $i0$.ɵinterpolation1(" ", $_r0$.id, " ")); } } diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts index 1186e84357..6216bcc15b 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts @@ -369,6 +369,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(1, 0, ctx.valueA))); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueB)); $r3$.ɵi18nApply(2); + $r3$.ɵflushHooksUpTo(3); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueA)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueB)); $r3$.ɵi18nExp($r3$.ɵbind((ctx.valueA + ctx.valueB))); @@ -436,6 +437,7 @@ describe('i18n support in the view compiler', () => { } if (rf & 2) { const $outer_r1$ = ctx.$implicit; + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(2, 0, $outer_r1$))); $r3$.ɵi18nApply(3); } @@ -525,6 +527,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(1, 0, ctx.valueA))); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueB)); $r3$.ɵi18nApply(2); + $r3$.ɵflushHooksUpTo(3); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueA)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueB)); $r3$.ɵi18nExp($r3$.ɵbind((ctx.valueA + ctx.valueB))); @@ -565,6 +568,7 @@ describe('i18n support in the view compiler', () => { } if (rf & 2) { const $outer_r1$ = ctx.$implicit; + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(2, 0, $outer_r1$))); $r3$.ɵi18nApply(3); } @@ -730,6 +734,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueA)); $r3$.ɵi18nApply(1); } @@ -756,6 +761,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueA)); $r3$.ɵi18nApply(1); } @@ -786,6 +792,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(2, 2, ctx.valueA))); $r3$.ɵi18nExp($r3$.ɵbind(((ctx.valueA == null) ? null : ((ctx.valueA.a == null) ? null : ctx.valueA.a.b)))); $r3$.ɵi18nApply(1); @@ -829,10 +836,13 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.one)); $r3$.ɵi18nApply(1); + $r3$.ɵflushHooksUpTo(3); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(4, 3, ctx.two))); $r3$.ɵi18nApply(3); + $r3$.ɵflushHooksUpTo(6); $r3$.ɵi18nExp($r3$.ɵbind(((ctx.three + ctx.four) + ctx.five))); $r3$.ɵi18nApply(6); } @@ -897,8 +907,10 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.one)); $r3$.ɵi18nApply(1); + $r3$.ɵflushHooksUpTo(4); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(5, 3, ctx.two))); $r3$.ɵi18nExp($r3$.ɵbind(ctx.nestedInBlockTwo)); $r3$.ɵi18nApply(4); @@ -965,11 +977,13 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(2); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueB)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueC)); $r3$.ɵi18nApply(3); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueA)); $r3$.ɵi18nApply(1); + $r3$.ɵflushHooksUpTo(7); $r3$.ɵi18nExp($r3$.ɵbind(ctx.valueE)); $r3$.ɵi18nApply(8); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(6, 5, ctx.valueD))); @@ -1018,6 +1032,7 @@ describe('i18n support in the view compiler', () => { } if (rf & 2) { const $ctx_r0$ = $r3$.ɵnextContext(); + $r3$.ɵflushHooksUpTo(2); $r3$.ɵi18nExp($r3$.ɵbind($ctx_r0$.valueA)); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(4, 2, $ctx_r0$.valueB))); $r3$.ɵi18nApply(2); @@ -1034,6 +1049,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(2); $r3$.ɵelementProperty(2, "ngIf", $r3$.ɵbind(ctx.visible)); } } @@ -1083,7 +1099,9 @@ describe('i18n support in the view compiler', () => { $r3$.ɵtemplate(2, MyComponent_img_2_Template, 2, 1, "img", $_c1$); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵelementProperty(1, "ngIf", $r3$.ɵbind(ctx.visible)); + $r3$.ɵflushHooksUpTo(2); $r3$.ɵelementProperty(2, "ngIf", $r3$.ɵbind(ctx.visible)); } } @@ -1147,6 +1165,7 @@ describe('i18n support in the view compiler', () => { } if (rf & 2) { const $ctx_r0$ = $r3$.ɵnextContext(); + $r3$.ɵflushHooksUpTo(4); $r3$.ɵelementProperty(4, "ngIf", $r3$.ɵbind($ctx_r0$.exists)); $r3$.ɵi18nExp($r3$.ɵbind($ctx_r0$.valueA)); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(3, 3, $ctx_r0$.valueB))); @@ -1196,7 +1215,9 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(2); $r3$.ɵelementProperty(2, "ngIf", $r3$.ɵbind(ctx.visible)); + $r3$.ɵflushHooksUpTo(3); $r3$.ɵelementProperty(3, "ngIf", $r3$.ɵbind(!ctx.visible)); } } @@ -1228,6 +1249,7 @@ describe('i18n support in the view compiler', () => { } if (rf & 2) { const $ctx_r0$ = $r3$.ɵnextContext(); + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind($ctx_r0$.valueA)); $r3$.ɵi18nApply(1); } @@ -1290,6 +1312,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.age)); $r3$.ɵi18nApply(1); } @@ -1378,6 +1401,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementContainerEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(2, 1, ctx.valueA))); $r3$.ɵi18nApply(1); } @@ -1462,6 +1486,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind($r3$.ɵpipeBind1(4, 1, ctx.valueB))); $r3$.ɵi18nApply(1); } @@ -1507,6 +1532,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementContainerEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(2); $r3$.ɵi18nExp($r3$.ɵbind(ctx.age)); $r3$.ɵi18nApply(2); } @@ -1628,6 +1654,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵtemplate(2, MyComponent_ng_template_2_Template, 1, 1, "ng-template"); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nApply(1); } @@ -1771,6 +1798,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nApply(1); } @@ -1850,6 +1878,7 @@ describe('i18n support in the view compiler', () => { } if (rf & 2) { const $ctx_r0$ = $r3$.ɵnextContext(); + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind($ctx_r0$.age)); $r3$.ɵi18nApply(1); } @@ -1871,6 +1900,7 @@ describe('i18n support in the view compiler', () => { } if (rf & 2) { const $ctx_r1$ = $r3$.ɵnextContext(); + $r3$.ɵflushHooksUpTo(2); $r3$.ɵi18nExp($r3$.ɵbind($ctx_r1$.count)); $r3$.ɵi18nExp($r3$.ɵbind($ctx_r1$.count)); $r3$.ɵi18nApply(2); @@ -1888,9 +1918,12 @@ describe('i18n support in the view compiler', () => { $r3$.ɵtemplate(3, MyComponent_div_3_Template, 4, 2, "div", $_c0$); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nApply(1); + $r3$.ɵflushHooksUpTo(2); $r3$.ɵelementProperty(2, "ngIf", $r3$.ɵbind(ctx.visible)); + $r3$.ɵflushHooksUpTo(3); $r3$.ɵelementProperty(3, "ngIf", $r3$.ɵbind(ctx.available)); } } @@ -1917,6 +1950,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.age)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.other)); $r3$.ɵi18nApply(1); @@ -2004,6 +2038,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nExp($r3$.ɵbind(((ctx.ageA + ctx.ageB) + ctx.ageC))); $r3$.ɵi18nApply(1); @@ -2045,6 +2080,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.age)); $r3$.ɵi18nApply(1); @@ -2116,6 +2152,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(3); $r3$.ɵelementProperty(3, "ngIf", $r3$.ɵbind(ctx.visible)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); @@ -2157,6 +2194,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.age)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nApply(1); @@ -2220,6 +2258,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(2); $r3$.ɵelementProperty(2, "ngIf", $r3$.ɵbind(ctx.ageVisible)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nApply(1); @@ -2286,6 +2325,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(2); $r3$.ɵelementProperty(2, "ngIf", $r3$.ɵbind(ctx.ageVisible)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.weight)); @@ -2328,6 +2368,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵelementEnd(); } if (rf & 2) { + $r3$.ɵflushHooksUpTo(1); $r3$.ɵi18nExp($r3$.ɵbind(ctx.gender)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.weight)); $r3$.ɵi18nExp($r3$.ɵbind(ctx.height)); diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_styling_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_styling_spec.ts index 007bd762a8..a98686358f 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_styling_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_styling_spec.ts @@ -227,7 +227,9 @@ describe('compiler compliance: styling', () => { } if (rf & 2) { $r3$.ɵelementProperty(0, "@foo", $r3$.ɵbind(ctx.exp)); + $r3$.ɵflushHooksUpTo(1); $r3$.ɵelementProperty(1, "@bar", $r3$.ɵbind(undefined)); + $r3$.ɵflushHooksUpTo(2); $r3$.ɵelementProperty(2, "@baz", $r3$.ɵbind(undefined)); } }, @@ -930,6 +932,7 @@ describe('compiler compliance: styling', () => { $r3$.ɵelementStyleProp(0, 1, $r3$.ɵpipeBind2(3, 7, $ctx$.bazExp, 4000)); $r3$.ɵelementClassProp(0, 0, $r3$.ɵpipeBind2(4, 10, $ctx$.fooExp, 2000)); $r3$.ɵelementStylingApply(0); + $r3$.ɵflushHooksUpTo(5); $r3$.ɵtextBinding(5, $r3$.ɵinterpolation1(" ", $ctx$.item, "")); } } diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts index b0ed81d0c7..8f56fbe23a 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts @@ -75,6 +75,7 @@ describe('compiler compliance: template', () => { const $outer1$ = $i0$.ɵnextContext().$implicit; const $myComp1$ = $i0$.ɵnextContext(); $i0$.ɵelementProperty(0, "title", $i0$.ɵbind($myComp1$.format($outer1$, $middle1$, $inner1$, $myComp1$.component))); + $r3$.ɵflushHooksUpTo(1); $i0$.ɵtextBinding(1, $i0$.ɵinterpolation1(" ", $myComp1$.format($outer1$, $middle1$, $inner1$, $myComp1$.component), " ")); } } @@ -87,6 +88,7 @@ describe('compiler compliance: template', () => { } if (rf & 2) { const $myComp2$ = $i0$.ɵnextContext(2); + $r3$.ɵflushHooksUpTo(1); $i0$.ɵelementProperty(1, "ngForOf", $i0$.ɵbind($myComp2$.items)); } } @@ -99,6 +101,7 @@ describe('compiler compliance: template', () => { } if (rf & 2) { const $outer2$ = ctx.$implicit; + $r3$.ɵflushHooksUpTo(1); $i0$.ɵelementProperty(1, "ngForOf", $i0$.ɵbind($outer2$.items)); } } @@ -207,6 +210,7 @@ describe('compiler compliance: template', () => { if (rf & 2) { const $item$ = ctx.$implicit; const $i$ = ctx.index; + $r3$.ɵflushHooksUpTo(1); $i0$.ɵtextBinding(1, $i0$.ɵinterpolation2(" ", $i$, " - ", $item$, " ")); } } @@ -262,6 +266,7 @@ describe('compiler compliance: template', () => { const $div$ = $i0$.ɵnextContext(); const $i$ = $div$.index; const $item$ = $div$.$implicit; + $r3$.ɵflushHooksUpTo(1); $i0$.ɵtextBinding(1, $i0$.ɵinterpolation2(" ", $i$, " - ", $item$, " ")); } } @@ -274,6 +279,7 @@ describe('compiler compliance: template', () => { } if (rf & 2) { const $app$ = $i0$.ɵnextContext(); + $r3$.ɵflushHooksUpTo(1); $i0$.ɵelementProperty(1, "ngIf", $i0$.ɵbind($app$.showing)); } } @@ -330,6 +336,7 @@ describe('compiler compliance: template', () => { if (rf & 2) { const $middle$ = $i0$.ɵnextContext().$implicit; const $myComp$ = $i0$.ɵnextContext(2); + $r3$.ɵflushHooksUpTo(1); $i0$.ɵtextBinding(1, $i0$.ɵinterpolation2(" ", $middle$.value, " - ", $myComp$.name, " ")); } } @@ -342,6 +349,7 @@ describe('compiler compliance: template', () => { } if (rf & 2) { const $middle$ = ctx.$implicit; + $r3$.ɵflushHooksUpTo(1); $i0$.ɵelementProperty(1, "ngForOf", $i0$.ɵbind($middle$.items)); } } @@ -354,6 +362,7 @@ describe('compiler compliance: template', () => { } if (rf & 2) { const $outer$ = ctx.$implicit; + $r3$.ɵflushHooksUpTo(1); $i0$.ɵelementProperty(1, "ngForOf", $i0$.ɵbind($outer$.items)); } } diff --git a/packages/compiler/src/render3/r3_identifiers.ts b/packages/compiler/src/render3/r3_identifiers.ts index 4ffac6f60c..29c13c0d67 100644 --- a/packages/compiler/src/render3/r3_identifiers.ts +++ b/packages/compiler/src/render3/r3_identifiers.ts @@ -31,6 +31,8 @@ export class Identifiers { static elementProperty: o.ExternalReference = {name: 'ɵelementProperty', moduleName: CORE}; + static flushHooksUpTo: o.ExternalReference = {name: 'ɵflushHooksUpTo', moduleName: CORE}; + static componentHostSyntheticProperty: o.ExternalReference = {name: 'ɵcomponentHostSyntheticProperty', moduleName: CORE}; diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index 836484a384..751d89eda4 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -120,6 +120,11 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver * all local refs and context variables are available for matching. */ private _updateCodeFns: (() => o.Statement)[] = []; + /** + * Memorizes the last node index for which a flushHooksUpTo instruction has been generated. + * Initialized to 0 to avoid generating a useless flushHooksUpTo(0). + */ + private _lastNodeIndexWithFlush: number = 0; /** Temporary variable declarations generated from visiting pipes, literals, etc. */ private _tempVariables: o.Statement[] = []; /** @@ -451,10 +456,10 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver if (bindings.size) { bindings.forEach(binding => { this.updateInstruction( - span, R3.i18nExp, + index, span, R3.i18nExp, () => [this.convertPropertyBinding(o.variable(CONTEXT_NAME), binding)]); }); - this.updateInstruction(span, R3.i18nApply, [o.literal(index)]); + this.updateInstruction(index, span, R3.i18nApply, [o.literal(index)]); } if (!selfClosing) { this.creationInstruction(span, R3.i18nEnd); @@ -639,7 +644,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver converted.expressions.forEach(expression => { hasBindings = true; const binding = this.convertExpressionBinding(implicit, expression); - this.updateInstruction(element.sourceSpan, R3.i18nExp, [binding]); + this.updateInstruction(elementIndex, element.sourceSpan, R3.i18nExp, [binding]); }); } } @@ -649,7 +654,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver const args = this.constantPool.getConstLiteral(o.literalArr(i18nAttrArgs), true); this.creationInstruction(element.sourceSpan, R3.i18nAttributes, [index, args]); if (hasBindings) { - this.updateInstruction(element.sourceSpan, R3.i18nApply, [index]); + this.updateInstruction(elementIndex, element.sourceSpan, R3.i18nApply, [index]); } } } @@ -711,7 +716,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver const hasValue = value instanceof LiteralPrimitive ? !!value.value : true; this.allocateBindingSlots(value); const bindingName = prepareSyntheticPropertyName(input.name); - this.updateInstruction(input.sourceSpan, R3.elementProperty, () => { + this.updateInstruction(elementIndex, input.sourceSpan, R3.elementProperty, () => { return [ o.literal(elementIndex), o.literal(bindingName), (hasValue ? this.convertPropertyBinding(implicit, value) : emptyValueBindInstruction) @@ -737,7 +742,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } } this.allocateBindingSlots(value); - this.updateInstruction(input.sourceSpan, instruction, () => { + this.updateInstruction(elementIndex, input.sourceSpan, instruction, () => { return [ o.literal(elementIndex), o.literal(attrName), this.convertPropertyBinding(implicit, value), ...params @@ -839,7 +844,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver template.inputs.forEach(input => { const value = input.value.visit(this._valueConverter); this.allocateBindingSlots(value); - this.updateInstruction(template.sourceSpan, R3.elementProperty, () => { + this.updateInstruction(templateIndex, template.sourceSpan, R3.elementProperty, () => { return [ o.literal(templateIndex), o.literal(input.name), this.convertPropertyBinding(context, value) @@ -880,7 +885,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver const value = text.value.visit(this._valueConverter); this.allocateBindingSlots(value); this.updateInstruction( - text.sourceSpan, R3.textBinding, + nodeIndex, text.sourceSpan, R3.textBinding, () => [o.literal(nodeIndex), this.convertPropertyBinding(o.variable(CONTEXT_NAME), value)]); } @@ -966,7 +971,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver if (createMode) { this.creationInstruction(instruction.sourceSpan, instruction.reference, paramsFn); } else { - this.updateInstruction(instruction.sourceSpan, instruction.reference, paramsFn); + this.updateInstruction(-1, instruction.sourceSpan, instruction.reference, paramsFn); } } } @@ -978,8 +983,12 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } private updateInstruction( - span: ParseSourceSpan|null, reference: o.ExternalReference, + nodeIndex: number, span: ParseSourceSpan|null, reference: o.ExternalReference, paramsOrFn?: o.Expression[]|(() => o.Expression[])) { + if (this._lastNodeIndexWithFlush < nodeIndex) { + this.instructionFn(this._updateCodeFns, span, R3.flushHooksUpTo, [o.literal(nodeIndex)]); + this._lastNodeIndexWithFlush = nodeIndex; + } this.instructionFn(this._updateCodeFns, span, reference, paramsOrFn || []); } diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts index 70c1696bc4..2c69fe477a 100644 --- a/packages/core/src/core_render3_private_export.ts +++ b/packages/core/src/core_render3_private_export.ts @@ -104,6 +104,7 @@ export { elementStyleProp as ɵelementStyleProp, elementStylingApply as ɵelementStylingApply, elementClassProp as ɵelementClassProp, + flushHooksUpTo as ɵflushHooksUpTo, textBinding as ɵtextBinding, template as ɵtemplate, embeddedViewEnd as ɵembeddedViewEnd, diff --git a/packages/core/src/render3/component.ts b/packages/core/src/render3/component.ts index 566b57d76e..77c33778d5 100644 --- a/packages/core/src/render3/component.ts +++ b/packages/core/src/render3/component.ts @@ -29,7 +29,7 @@ import {renderInitialClasses, renderInitialStyles} from './styling/class_and_sty import {publishDefaultGlobalUtils} from './util/global_utils'; import {defaultScheduler, renderStringify} from './util/misc_utils'; import {getRootContext, getRootView} from './util/view_traversal_utils'; -import {readPatchedLView} from './util/view_utils'; +import {readPatchedLView, resetPreOrderHookFlags} from './util/view_utils'; @@ -142,6 +142,7 @@ export function renderComponent( refreshDescendantViews(rootView); // creation mode pass rootView[FLAGS] &= ~LViewFlags.CreationMode; + resetPreOrderHookFlags(rootView); refreshDescendantViews(rootView); // update mode pass } finally { leaveView(oldView); @@ -248,7 +249,7 @@ export function LifecycleHooksFeature(component: any, def: ComponentDef): v const rootTView = readPatchedLView(component) ![TVIEW]; const dirIndex = rootTView.data.length - 1; - registerPreOrderHooks(dirIndex, def, rootTView); + registerPreOrderHooks(dirIndex, def, rootTView, -1, -1, -1); // TODO(misko): replace `as TNode` with createTNode call. (needs refactoring to lose dep on // LNode). registerPostOrderHooks( diff --git a/packages/core/src/render3/hooks.ts b/packages/core/src/render3/hooks.ts index f901adf7de..af60ffeb9e 100644 --- a/packages/core/src/render3/hooks.ts +++ b/packages/core/src/render3/hooks.ts @@ -10,7 +10,7 @@ import {assertEqual} from '../util/assert'; import {DirectiveDef} from './interfaces/definition'; import {TNode} from './interfaces/node'; -import {FLAGS, HookData, InitPhaseState, LView, LViewFlags, TView} from './interfaces/view'; +import {FLAGS, HookData, InitPhaseState, LView, LViewFlags, PREORDER_HOOK_FLAGS, PreOrderHookFlags, TView} from './interfaces/view'; @@ -19,34 +19,50 @@ import {FLAGS, HookData, InitPhaseState, LView, LViewFlags, TView} from './inter * * Must be run *only* on the first template pass. * - * The TView's hooks arrays are arranged in alternating pairs of directiveIndex and hookFunction, - * i.e.: `[directiveIndexA, hookFunctionA, directiveIndexB, hookFunctionB, ...]`. For `OnChanges` - * hooks, the `directiveIndex` will be *negative*, signaling {@link callHooks} that the - * `hookFunction` must be passed the the appropriate {@link SimpleChanges} object. + * Sets up the pre-order hooks on the provided `tView`, + * see {@link HookData} for details about the data structure. * * @param directiveIndex The index of the directive in LView * @param directiveDef The definition containing the hooks to setup in tView * @param tView The current TView + * @param nodeIndex The index of the node to which the directive is attached + * @param initialPreOrderHooksLength the number of pre-order hooks already registered before the + * current process, used to know if the node index has to be added to the array. If it is -1, + * the node index is never added. + * @param initialPreOrderCheckHooksLength same as previous for pre-order check hooks */ export function registerPreOrderHooks( - directiveIndex: number, directiveDef: DirectiveDef, tView: TView): void { + directiveIndex: number, directiveDef: DirectiveDef, tView: TView, nodeIndex: number, + initialPreOrderHooksLength: number, initialPreOrderCheckHooksLength: number): void { ngDevMode && assertEqual(tView.firstTemplatePass, true, 'Should only be called on first template pass'); const {onChanges, onInit, doCheck} = directiveDef; + if (initialPreOrderHooksLength >= 0 && + (!tView.preOrderHooks || initialPreOrderHooksLength === tView.preOrderHooks.length) && + (onChanges || onInit || doCheck)) { + (tView.preOrderHooks || (tView.preOrderHooks = [])).push(nodeIndex); + } + + if (initialPreOrderCheckHooksLength >= 0 && + (!tView.preOrderCheckHooks || + initialPreOrderCheckHooksLength === tView.preOrderCheckHooks.length) && + (onChanges || doCheck)) { + (tView.preOrderCheckHooks || (tView.preOrderCheckHooks = [])).push(nodeIndex); + } if (onChanges) { - (tView.initHooks || (tView.initHooks = [])).push(directiveIndex, onChanges); - (tView.checkHooks || (tView.checkHooks = [])).push(directiveIndex, onChanges); + (tView.preOrderHooks || (tView.preOrderHooks = [])).push(directiveIndex, onChanges); + (tView.preOrderCheckHooks || (tView.preOrderCheckHooks = [])).push(directiveIndex, onChanges); } if (onInit) { - (tView.initHooks || (tView.initHooks = [])).push(-directiveIndex, onInit); + (tView.preOrderHooks || (tView.preOrderHooks = [])).push(-directiveIndex, onInit); } if (doCheck) { - (tView.initHooks || (tView.initHooks = [])).push(directiveIndex, doCheck); - (tView.checkHooks || (tView.checkHooks = [])).push(directiveIndex, doCheck); + (tView.preOrderHooks || (tView.preOrderHooks = [])).push(directiveIndex, doCheck); + (tView.preOrderCheckHooks || (tView.preOrderCheckHooks = [])).push(directiveIndex, doCheck); } } @@ -59,9 +75,8 @@ export function registerPreOrderHooks( * preserve hook execution order. Content, view, and destroy hooks for projected * components and directives must be called *before* their hosts. * - * Sets up the content, view, and destroy hooks on the provided `tView` such that - * they're added in alternating pairs of directiveIndex and hookFunction, - * i.e.: `[directiveIndexA, hookFunctionA, directiveIndexB, hookFunctionB, ...]` + * Sets up the content, view, and destroy hooks on the provided `tView`, + * see {@link HookData} for details about the data structure. * * NOTE: This does not set up `onChanges`, `onInit` or `doCheck`, those are set up * separately at `elementStart`. @@ -103,25 +118,49 @@ export function registerPostOrderHooks(tView: TView, tNode: TNode): void { } } +/** + * Executing hooks requires complex logic as we need to deal with 2 constraints. + * + * 1. Init hooks (ngOnInit, ngAfterContentInit, ngAfterViewInit) must all be executed once and only + * once, across many change detection cycles. This must be true even if some hooks throw, or if + * some recursively trigger a change detection cycle. + * To solve that, it is required to track the state of the execution of these init hooks. + * This is done by storing and maintaining flags in the view: the {@link InitPhaseState}, + * and the index within that phase. They can be seen as a cursor in the following structure: + * [[onInit1, onInit2], [afterContentInit1], [afterViewInit1, afterViewInit2, afterViewInit3]] + * They are are stored as flags in LView[FLAGS]. + * + * 2. Pre-order hooks can be executed in batches, because of the flushHooksUpTo instruction. + * To be able to pause and resume their execution, we also need some state about the hook's array + * that is being processed: + * - the index of the next hook to be executed + * - the number of init hooks already found in the processed part of the array + * They are are stored as flags in LView[PREORDER_HOOK_FLAGS]. + */ + /** * Executes necessary hooks at the start of executing a template. * * Executes hooks that are to be run during the initialization of a directive such * as `onChanges`, `onInit`, and `doCheck`. * - * Has the side effect of updating the RunInit flag in `lView` to be `0`, so that - * this isn't run a second time. - * * @param lView The current view * @param tView Static data for the view containing the hooks to be executed * @param checkNoChangesMode Whether or not we're in checkNoChanges mode. + * @param @param currentNodeIndex 2 cases depending the the value: + * - undefined: execute hooks only from the saved index until the end of the array (pre-order case, + * when flushing the remaining hooks) + * - number: execute hooks only from the saved index until that node index exclusive (pre-order + * case, when executing flushHooksUpTo(number)) */ -export function executeInitHooks( - currentView: LView, tView: TView, checkNoChangesMode: boolean): void { +export function executePreOrderHooks( + currentView: LView, tView: TView, checkNoChangesMode: boolean, + currentNodeIndex: number | undefined): void { if (!checkNoChangesMode) { executeHooks( - currentView, tView.initHooks, tView.checkHooks, checkNoChangesMode, - InitPhaseState.OnInitHooksToBeRun); + currentView, tView.preOrderHooks, tView.preOrderCheckHooks, checkNoChangesMode, + InitPhaseState.OnInitHooksToBeRun, + currentNodeIndex !== undefined ? currentNodeIndex : null); } } @@ -129,24 +168,33 @@ export function executeInitHooks( * Executes hooks against the given `LView` based off of whether or not * This is the first pass. * - * @param lView The view instance data to run the hooks against + * @param currentView The view instance data to run the hooks against * @param firstPassHooks An array of hooks to run if we're in the first view pass * @param checkHooks An Array of hooks to run if we're not in the first view pass. * @param checkNoChangesMode Whether or not we're in no changes mode. + * @param initPhaseState the current state of the init phase + * @param currentNodeIndex 3 cases depending the the value: + * - undefined: all hooks from the array should be executed (post-order case) + * - null: execute hooks only from the saved index until the end of the array (pre-order case, when + * flushing the remaining hooks) + * - number: execute hooks only from the saved index until that node index exclusive (pre-order + * case, when executing flushHooksUpTo(number)) */ export function executeHooks( currentView: LView, firstPassHooks: HookData | null, checkHooks: HookData | null, - checkNoChangesMode: boolean, initPhase: number): void { + checkNoChangesMode: boolean, initPhaseState: InitPhaseState, + currentNodeIndex: number | null | undefined): void { if (checkNoChangesMode) return; - const hooksToCall = (currentView[FLAGS] & LViewFlags.InitPhaseStateMask) === initPhase ? + const hooksToCall = (currentView[FLAGS] & LViewFlags.InitPhaseStateMask) === initPhaseState ? firstPassHooks : checkHooks; if (hooksToCall) { - callHooks(currentView, hooksToCall, initPhase); + callHooks(currentView, hooksToCall, initPhaseState, currentNodeIndex); } // The init phase state must be always checked here as it may have been recursively updated - if ((currentView[FLAGS] & LViewFlags.InitPhaseStateMask) === initPhase && - initPhase !== InitPhaseState.InitPhaseCompleted) { + if (currentNodeIndex == null && + (currentView[FLAGS] & LViewFlags.InitPhaseStateMask) === initPhaseState && + initPhaseState !== InitPhaseState.InitPhaseCompleted) { currentView[FLAGS] &= LViewFlags.IndexWithinInitPhaseReset; currentView[FLAGS] += LViewFlags.InitPhaseStateIncrementer; } @@ -158,25 +206,68 @@ export function executeHooks( * * @param currentView The current view * @param arr The array in which the hooks are found + * @param initPhaseState the current state of the init phase + * @param currentNodeIndex 3 cases depending the the value: + * - undefined: all hooks from the array should be executed (post-order case) + * - null: execute hooks only from the saved index until the end of the array (pre-order case, when + * flushing the remaining hooks) + * - number: execute hooks only from the saved index until that node index exclusive (pre-order + * case, when executing flushHooksUpTo(number)) */ -export function callHooks(currentView: LView, arr: HookData, initPhase?: number): void { - let initHooksCount = 0; - for (let i = 0; i < arr.length; i += 2) { - const isInitHook = arr[i] < 0; - const directiveIndex = isInitHook ? -arr[i] : arr[i] as number; - const directive = currentView[directiveIndex]; +function callHooks( + currentView: LView, arr: HookData, initPhase: InitPhaseState, + currentNodeIndex: number | null | undefined): void { + const startIndex = currentNodeIndex !== undefined ? + (currentView[PREORDER_HOOK_FLAGS] & PreOrderHookFlags.IndexOfTheNextPreOrderHookMaskMask) : + 0; + const nodeIndexLimit = currentNodeIndex != null ? currentNodeIndex : -1; + let lastNodeIndexFound = 0; + for (let i = startIndex; i < arr.length; i++) { const hook = arr[i + 1] as() => void; - if (isInitHook) { - initHooksCount++; - const indexWithintInitPhase = currentView[FLAGS] >> LViewFlags.IndexWithinInitPhaseShift; - // The init phase state must be always checked here as it may have been recursively updated - if (indexWithintInitPhase < initHooksCount && - (currentView[FLAGS] & LViewFlags.InitPhaseStateMask) === initPhase) { - currentView[FLAGS] += LViewFlags.IndexWithinInitPhaseIncrementer; - hook.call(directive); + if (typeof hook === 'number') { + lastNodeIndexFound = arr[i] as number; + if (currentNodeIndex != null && lastNodeIndexFound >= currentNodeIndex) { + break; } } else { - hook.call(directive); + const isInitHook = arr[i] < 0; + if (isInitHook) + currentView[PREORDER_HOOK_FLAGS] += PreOrderHookFlags.NumberOfInitHooksCalledIncrementer; + if (lastNodeIndexFound < nodeIndexLimit || nodeIndexLimit == -1) { + callHook(currentView, initPhase, arr, i); + currentView[PREORDER_HOOK_FLAGS] = + (currentView[PREORDER_HOOK_FLAGS] & PreOrderHookFlags.NumberOfInitHooksCalledMask) + i + + 2; + } + i++; } } } + +/** + * Execute one hook against the current `LView`. + * + * @param currentView The current view + * @param initPhaseState the current state of the init phase + * @param arr The array in which the hooks are found + * @param i The current index within the hook data array + */ +function callHook(currentView: LView, initPhase: InitPhaseState, arr: HookData, i: number) { + const isInitHook = arr[i] < 0; + const hook = arr[i + 1] as() => void; + const directiveIndex = isInitHook ? -arr[i] : arr[i] as number; + const directive = currentView[directiveIndex]; + if (isInitHook) { + const indexWithintInitPhase = currentView[FLAGS] >> LViewFlags.IndexWithinInitPhaseShift; + // The init phase state must be always checked here as it may have been recursively + // updated + if (indexWithintInitPhase < + (currentView[PREORDER_HOOK_FLAGS] >> PreOrderHookFlags.NumberOfInitHooksCalledShift) && + (currentView[FLAGS] & LViewFlags.InitPhaseStateMask) === initPhase) { + currentView[FLAGS] += LViewFlags.IndexWithinInitPhaseIncrementer; + hook.call(directive); + } + } else { + hook.call(directive); + } +} diff --git a/packages/core/src/render3/index.ts b/packages/core/src/render3/index.ts index d6a2faa716..1e7c4966c9 100644 --- a/packages/core/src/render3/index.ts +++ b/packages/core/src/render3/index.ts @@ -57,6 +57,8 @@ export { elementStyleProp, elementStylingApply, + flushHooksUpTo, + listener, store, load, diff --git a/packages/core/src/render3/instructions.ts b/packages/core/src/render3/instructions.ts index a09a3d4d58..d40746a4e4 100644 --- a/packages/core/src/render3/instructions.ts +++ b/packages/core/src/render3/instructions.ts @@ -24,7 +24,7 @@ import {attachPatchData, getComponentViewByInstance} from './context_discovery'; import {attachLContainerDebug, attachLViewDebug} from './debug'; import {diPublicInInjector, getNodeInjectable, getOrCreateInjectable, getOrCreateNodeInjectorForNode, injectAttributeImpl} from './di'; import {throwMultipleComponentError} from './errors'; -import {executeHooks, executeInitHooks, registerPostOrderHooks, registerPreOrderHooks} from './hooks'; +import {executeHooks, executePreOrderHooks, registerPostOrderHooks, registerPreOrderHooks} from './hooks'; import {ACTIVE_INDEX, LContainer, VIEWS} from './interfaces/container'; import {ComponentDef, ComponentTemplate, DirectiveDef, DirectiveDefListOrFactory, PipeDefListOrFactory, RenderFlags, ViewQueriesFunction} from './interfaces/definition'; import {INJECTOR_BLOOM_PARENT_SIZE, NodeInjectorFactory} from './interfaces/injector'; @@ -48,7 +48,7 @@ import {NO_CHANGE} from './tokens'; import {attrsStylingIndexOf, setUpAttributes} from './util/attrs_utils'; import {INTERPOLATION_DELIMITER, renderStringify} from './util/misc_utils'; import {findComponentView, getLViewParent, getRootContext, getRootView} from './util/view_traversal_utils'; -import {getComponentViewByIndex, getNativeByIndex, getNativeByTNode, getTNode, isComponent, isComponentDef, isContentQueryHost, isRootView, loadInternal, readPatchedLView, unwrapRNode, viewAttachedToChangeDetector} from './util/view_utils'; +import {getComponentViewByIndex, getNativeByIndex, getNativeByTNode, getTNode, isComponent, isComponentDef, isContentQueryHost, isRootView, loadInternal, readPatchedLView, resetPreOrderHookFlags, unwrapRNode, viewAttachedToChangeDetector} from './util/view_utils'; @@ -84,16 +84,17 @@ export function refreshDescendantViews(lView: LView) { if (!creationMode) { const checkNoChangesMode = getCheckNoChangesMode(); - executeInitHooks(lView, tView, checkNoChangesMode); + executePreOrderHooks(lView, tView, checkNoChangesMode, undefined); refreshDynamicEmbeddedViews(lView); // Content query results must be refreshed before content hooks are called. refreshContentQueries(tView, lView); + resetPreOrderHookFlags(lView); executeHooks( lView, tView.contentHooks, tView.contentCheckHooks, checkNoChangesMode, - InitPhaseState.AfterContentInitHooksToBeRun); + InitPhaseState.AfterContentInitHooksToBeRun, undefined); setHostBindings(tView, lView); } @@ -180,6 +181,7 @@ export function createLView( const lView = tView.blueprint.slice() as LView; lView[HOST] = host; lView[FLAGS] = flags | LViewFlags.CreationMode | LViewFlags.Attached | LViewFlags.FirstLViewPass; + resetPreOrderHookFlags(lView); lView[PARENT] = lView[DECLARATION_VIEW] = parentLView; lView[CONTEXT] = context; lView[RENDERER_FACTORY] = (rendererFactory || parentLView && parentLView[RENDERER_FACTORY]) !; @@ -405,6 +407,7 @@ export function renderEmbeddedTemplate(viewToRender: LView, tView: TView, con setPreviousOrParentTNode(null !); oldView = enterView(viewToRender, viewToRender[T_HOST]); + resetPreOrderHookFlags(viewToRender); namespaceHTML(); tView.template !(getRenderFlags(viewToRender), context); // This must be set to false immediately after the first creation run because in an @@ -459,6 +462,7 @@ function renderComponentOrTemplate( } // update mode pass + resetPreOrderHookFlags(hostView); templateFn && templateFn(RenderFlags.Update, context); refreshDescendantViews(hostView); } finally { @@ -807,8 +811,8 @@ export function createTView( firstTemplatePass: true, staticViewQueries: false, staticContentQueries: false, - initHooks: null, - checkHooks: null, + preOrderHooks: null, + preOrderCheckHooks: null, contentHooks: null, contentCheckHooks: null, viewHooks: null, @@ -1056,6 +1060,17 @@ export function elementEnd(): void { } } + +/** + * Flushes all the lifecycle hooks for directives up until (and excluding) that node index + * + * @param index The index of the element in the `LView` + */ +export function flushHooksUpTo(index: number): void { + const lView = getLView(); + executePreOrderHooks(lView, lView[TVIEW], getCheckNoChangesMode(), index); +} + /** * Updates the value of removes an attribute on an Element. * @@ -1748,6 +1763,10 @@ function resolveDirectives( if (def.providersResolver) def.providersResolver(def); } generateExpandoInstructionBlock(tView, tNode, directives.length); + const initialPreOrderHooksLength = (tView.preOrderHooks && tView.preOrderHooks.length) || 0; + const initialPreOrderCheckHooksLength = + (tView.preOrderCheckHooks && tView.preOrderCheckHooks.length) || 0; + const nodeIndex = tNode.index - HEADER_OFFSET; for (let i = 0; i < directives.length; i++) { const def = directives[i] as DirectiveDef; @@ -1758,7 +1777,9 @@ function resolveDirectives( // Init hooks are queued now so ngOnInit is called in host components before // any projected components. - registerPreOrderHooks(directiveDefIdx, def, tView); + registerPreOrderHooks( + directiveDefIdx, def, tView, nodeIndex, initialPreOrderHooksLength, + initialPreOrderCheckHooksLength); } } if (exportsMap) cacheMatchingLocalNames(tNode, localRefs, exportsMap); @@ -2276,7 +2297,7 @@ export function containerRefreshStart(index: number): void { // We need to execute init hooks here so ngOnInit hooks are called in top level views // before they are called in embedded views (for backwards compatibility). - executeInitHooks(lView, tView, getCheckNoChangesMode()); + executePreOrderHooks(lView, tView, getCheckNoChangesMode(), undefined); } /** @@ -2440,6 +2461,7 @@ export function embeddedViewEnd(): void { refreshDescendantViews(lView); // creation mode pass lView[FLAGS] &= ~LViewFlags.CreationMode; } + resetPreOrderHookFlags(lView); refreshDescendantViews(lView); // update mode pass const lContainer = lView[PARENT] as LContainer; ngDevMode && assertLContainerOrUndefined(lContainer); @@ -2834,6 +2856,7 @@ export function checkView(hostView: LView, component: T) { const creationMode = isCreationMode(hostView); try { + resetPreOrderHookFlags(hostView); namespaceHTML(); creationMode && executeViewQueryFn(RenderFlags.Create, hostTView, component); templateFn(getRenderFlags(hostView), component); diff --git a/packages/core/src/render3/interfaces/view.ts b/packages/core/src/render3/interfaces/view.ts index c60313b735..1ca2b06b35 100644 --- a/packages/core/src/render3/interfaces/view.ts +++ b/packages/core/src/render3/interfaces/view.ts @@ -45,8 +45,9 @@ export const CHILD_HEAD = 14; export const CHILD_TAIL = 15; export const CONTENT_QUERIES = 16; export const DECLARATION_VIEW = 17; +export const PREORDER_HOOK_FLAGS = 18; /** Size of LView's header. Necessary to adjust for it when setting slots. */ -export const HEADER_OFFSET = 19; +export const HEADER_OFFSET = 20; // This interface replaces the real LView interface if it is an arg or a @@ -215,6 +216,11 @@ export interface LView extends Array { * context. */ [DECLARATION_VIEW]: LView|null; + + /** + * More flags for this view. See PreOrderHookFlags for more info. + */ + [PREORDER_HOOK_FLAGS]: PreOrderHookFlags; } /** Flags associated with an LView (saved in LView[FLAGS]) */ @@ -296,6 +302,20 @@ export const enum InitPhaseState { InitPhaseCompleted = 0b11, } +/** More flags associated with an LView (saved in LView[FLAGS_MORE]) */ +export const enum PreOrderHookFlags { + /** The index of the next pre-order hook to be called in the hooks array, on the first 16 + bits */ + IndexOfTheNextPreOrderHookMaskMask = 0b01111111111111111, + + /** + * The number of init hooks that have already been called, on the last 16 bits + */ + NumberOfInitHooksCalledIncrementer = 0b010000000000000000, + NumberOfInitHooksCalledShift = 16, + NumberOfInitHooksCalledMask = 0b11111111111111110000000000000000, +} + /** * Set of instructions used to process host bindings efficiently. * @@ -438,21 +458,21 @@ export interface TView { pipeRegistry: PipeDefList|null; /** - * Array of ngOnInit and ngDoCheck hooks that should be executed for this view in + * Array of ngOnInit, ngOnChanges and ngDoCheck hooks that should be executed for this view in * creation mode. * * Even indices: Directive index * Odd indices: Hook function */ - initHooks: HookData|null; + preOrderHooks: HookData|null; /** - * Array of ngDoCheck hooks that should be executed for this view in update mode. + * Array of ngOnChanges and ngDoCheck hooks that should be executed for this view in update mode. * * Even indices: Directive index * Odd indices: Hook function */ - checkHooks: HookData|null; + preOrderCheckHooks: HookData|null; /** * Array of ngAfterContentInit and ngAfterContentChecked hooks that should be executed @@ -591,8 +611,14 @@ export interface RootContext { /** * Array of hooks that should be executed for a view and their directive indices. * - * Even indices: Directive index - * Odd indices: Hook function + * For each node of the view, the following data is stored: + * 1) Node index (optional) + * 2) A series of number/function pairs where: + * - even indices are directive indices + * - odd indices are hook functions + * + * Special cases: + * - a negative directive index flags an init hook (ngOnInit, ngAfterContentInit, ngAfterViewInit) */ export type HookData = (number | (() => void))[]; diff --git a/packages/core/src/render3/jit/environment.ts b/packages/core/src/render3/jit/environment.ts index b99c4a112d..780a45c1a6 100644 --- a/packages/core/src/render3/jit/environment.ts +++ b/packages/core/src/render3/jit/environment.ts @@ -99,6 +99,7 @@ export const angularCoreEnv: {[name: string]: Function} = { 'ɵelementStylingMap': r3.elementStylingMap, 'ɵelementStyleProp': r3.elementStyleProp, 'ɵelementStylingApply': r3.elementStylingApply, + 'ɵflushHooksUpTo': r3.flushHooksUpTo, 'ɵtemplate': r3.template, 'ɵtext': r3.text, 'ɵtextBinding': r3.textBinding, diff --git a/packages/core/src/render3/state.ts b/packages/core/src/render3/state.ts index 19764f20ce..54021c6b36 100644 --- a/packages/core/src/render3/state.ts +++ b/packages/core/src/render3/state.ts @@ -13,6 +13,7 @@ import {executeHooks} from './hooks'; import {ComponentDef, DirectiveDef} from './interfaces/definition'; import {TElementNode, TNode, TViewNode} from './interfaces/node'; import {BINDING_INDEX, CONTEXT, DECLARATION_VIEW, FLAGS, InitPhaseState, LView, LViewFlags, OpaqueViewState, TVIEW} from './interfaces/view'; +import {resetPreOrderHookFlags} from './util/view_utils'; @@ -304,9 +305,10 @@ export function leaveView(newView: LView): void { lView[FLAGS] &= ~LViewFlags.CreationMode; } else { try { + resetPreOrderHookFlags(lView); executeHooks( lView, tView.viewHooks, tView.viewCheckHooks, checkNoChangesMode, - InitPhaseState.AfterViewInitHooksToBeRun); + InitPhaseState.AfterViewInitHooksToBeRun, undefined); } finally { // Views are clean and in update mode after being checked, so these bits are cleared lView[FLAGS] &= ~(LViewFlags.Dirty | LViewFlags.FirstLViewPass); diff --git a/packages/core/src/render3/util/view_utils.ts b/packages/core/src/render3/util/view_utils.ts index 36ecc7f11e..b79a179187 100644 --- a/packages/core/src/render3/util/view_utils.ts +++ b/packages/core/src/render3/util/view_utils.ts @@ -13,7 +13,7 @@ import {ComponentDef, DirectiveDef} from '../interfaces/definition'; import {TNode, TNodeFlags} from '../interfaces/node'; import {RNode} from '../interfaces/renderer'; import {StylingContext} from '../interfaces/styling'; -import {FLAGS, HEADER_OFFSET, HOST, LView, LViewFlags, PARENT, TData, TVIEW} from '../interfaces/view'; +import {FLAGS, HEADER_OFFSET, HOST, LView, LViewFlags, PARENT, PREORDER_HOOK_FLAGS, TData, TVIEW} from '../interfaces/view'; @@ -197,3 +197,11 @@ export function viewAttachedToChangeDetector(view: LView): boolean { export function viewAttachedToContainer(view: LView): boolean { return isLContainer(view[PARENT]); } + +/** + * Resets the pre-order hook flags of the view. + * @param lView the LView on which the flags are reset + */ +export function resetPreOrderHookFlags(lView: LView) { + lView[PREORDER_HOOK_FLAGS] = 0; +} diff --git a/packages/core/test/acceptance/exports_spec.ts b/packages/core/test/acceptance/exports_spec.ts index 42bc020b58..63d3a0a485 100644 --- a/packages/core/test/acceptance/exports_spec.ts +++ b/packages/core/test/acceptance/exports_spec.ts @@ -6,14 +6,18 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, Directive, Input, Type} from '@angular/core'; +import {Component, Directive, DoCheck, Input, OnChanges, OnInit, SimpleChanges, Type} from '@angular/core'; import {TestBed} from '@angular/core/testing'; -import {onlyInIvy} from '@angular/private/testing'; +import {modifiedInIvy, onlyInIvy} from '@angular/private/testing'; describe('exports', () => { beforeEach(() => { - TestBed.configureTestingModule( - {declarations: [AppComp, ComponentToReference, DirToReference, DirWithCompInput]}); + TestBed.configureTestingModule({ + declarations: [ + AppComp, ComponentToReference, DirToReference, DirToReferenceWithPreOrderHooks, + DirWithCompInput + ] + }); }); it('should support export of DOM element', () => { @@ -36,6 +40,68 @@ describe('exports', () => { expect(fixture.nativeElement.innerHTML).toEqual('
Drew'); }); + describe('input changes in hooks', () => { + it('should support forward reference', () => { + const fixture = initWithTemplate( + AppComp, '
{{ myDir.name }}'); + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML) + .toEqual('
Drew!?@'); + }); + + modifiedInIvy('Supporting input changes in hooks is limited in Ivy') + .it('should support backward reference', () => { + const fixture = initWithTemplate( + AppComp, '{{ myDir.name }}
'); + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML) + .toEqual('Drew!?@
'); + }); + + onlyInIvy('Supporting input changes in hooks is limited in Ivy') + .it('should not support backward reference', () => { + expect(() => { + const fixture = initWithTemplate( + AppComp, + '{{ myDir.name }}
'); + fixture.detectChanges(); + }) + .toThrowError( + /ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked/); + }); + + modifiedInIvy('Supporting input changes in hooks is limited in Ivy') + .it('should support reference on the same node', () => { + const fixture = initWithTemplate( + AppComp, + '
'); + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML) + .toEqual( + '
'); + }); + + onlyInIvy('Supporting input changes in hooks is limited in Ivy') + .it('should not support reference on the same node', () => { + expect(() => { + const fixture = initWithTemplate( + AppComp, + '
'); + fixture.detectChanges(); + }) + .toThrowError( + /ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked/); + }); + + it('should support input referenced by host binding on that directive', () => { + const fixture = + initWithTemplate(AppComp, '
'); + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML) + .toEqual('
'); + }); + }); + onlyInIvy('Different error message is thrown in View Engine') .it('should throw if export name is not found', () => { expect(() => { @@ -95,3 +161,12 @@ class DirToReference { class DirWithCompInput { @Input('dirWithInput') comp: ComponentToReference|null = null; } + +@Directive({selector: '[dirOnChange]', exportAs: 'dirOnChange', host: {'[title]': 'name'}}) +class DirToReferenceWithPreOrderHooks implements OnInit, OnChanges, DoCheck { + @Input() in : any = null; + name = 'Drew'; + ngOnChanges(changes: SimpleChanges) { this.name += '!'; } + ngOnInit() { this.name += '?'; } + ngDoCheck() { this.name += '@'; } +} diff --git a/packages/core/test/acceptance/lifecycle_spec.ts b/packages/core/test/acceptance/lifecycle_spec.ts index 3e32089dce..f5ce6fd7d8 100644 --- a/packages/core/test/acceptance/lifecycle_spec.ts +++ b/packages/core/test/acceptance/lifecycle_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, Input, OnChanges, SimpleChanges} from '@angular/core'; +import {Component, Directive, Input, OnChanges, SimpleChanges} from '@angular/core'; import {TestBed} from '@angular/core/testing'; describe('ngOnChanges', () => { @@ -56,4 +56,116 @@ describe('ngOnChanges', () => { fixture.detectChanges(); expect(log).toEqual(['c: 0 -> 3']); }); -}); \ No newline at end of file +}); + +it('should call all hooks in correct order when several directives on same node', () => { + let log: string[] = []; + + class AllHooks { + id: number = -1; + + /** @internal */ + private _log(hook: string, id: number) { log.push(hook + id); } + + ngOnChanges() { this._log('onChanges', this.id); } + ngOnInit() { this._log('onInit', this.id); } + ngDoCheck() { this._log('doCheck', this.id); } + ngAfterContentInit() { this._log('afterContentInit', this.id); } + ngAfterContentChecked() { this._log('afterContentChecked', this.id); } + ngAfterViewInit() { this._log('afterViewInit', this.id); } + ngAfterViewChecked() { this._log('afterViewChecked', this.id); } + } + + @Directive({selector: 'div'}) + class DirA extends AllHooks { + @Input('a') id: number = 0; + } + + @Directive({selector: 'div'}) + class DirB extends AllHooks { + @Input('b') id: number = 0; + } + + @Directive({selector: 'div'}) + class DirC extends AllHooks { + @Input('c') id: number = 0; + } + + @Component({selector: 'app-comp', template: '
'}) + class AppComp { + } + + TestBed.configureTestingModule({declarations: [AppComp, DirA, DirB, DirC]}); + const fixture = TestBed.createComponent(AppComp); + fixture.detectChanges(); + + expect(log).toEqual([ + 'onChanges1', + 'onInit1', + 'doCheck1', + 'onChanges2', + 'onInit2', + 'doCheck2', + 'onChanges3', + 'onInit3', + 'doCheck3', + 'afterContentInit1', + 'afterContentChecked1', + 'afterContentInit2', + 'afterContentChecked2', + 'afterContentInit3', + 'afterContentChecked3', + 'afterViewInit1', + 'afterViewChecked1', + 'afterViewInit2', + 'afterViewChecked2', + 'afterViewInit3', + 'afterViewChecked3' + ]); +}); + +it('should call hooks after setting directives inputs', () => { + let log: string[] = []; + + @Directive({selector: 'div'}) + class DirA { + @Input() a: number = 0; + ngOnInit() { log.push('onInitA' + this.a); } + } + + @Directive({selector: 'div'}) + class DirB { + @Input() b: number = 0; + ngOnInit() { log.push('onInitB' + this.b); } + ngDoCheck() { log.push('doCheckB' + this.b); } + } + + @Directive({selector: 'div'}) + class DirC { + @Input() c: number = 0; + ngOnInit() { log.push('onInitC' + this.c); } + ngDoCheck() { log.push('doCheckC' + this.c); } + } + + @Component({ + selector: 'app-comp', + template: '
' + }) + class AppComp { + id = 0; + } + + TestBed.configureTestingModule({declarations: [AppComp, DirA, DirB, DirC]}); + const fixture = TestBed.createComponent(AppComp); + fixture.detectChanges(); + + expect(log).toEqual([ + 'onInitA0', 'onInitB0', 'doCheckB0', 'onInitC0', 'doCheckC0', 'onInitA0', 'onInitB0', + 'doCheckB0', 'onInitC0', 'doCheckC0' + ]); + + log = []; + fixture.componentInstance.id = 1; + fixture.detectChanges(); + expect(log).toEqual(['doCheckB1', 'doCheckC1', 'doCheckB1', 'doCheckC1']); +}); diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index d0d82ba7e6..4da4db673a 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -107,6 +107,9 @@ { "name": "PARENT_INJECTOR" }, + { + "name": "PREORDER_HOOK_FLAGS" + }, { "name": "QUERIES" }, @@ -194,6 +197,9 @@ { "name": "cacheMatchingLocalNames" }, + { + "name": "callHook" + }, { "name": "callHooks" }, @@ -282,7 +288,7 @@ "name": "executeHooks" }, { - "name": "executeInitHooks" + "name": "executePreOrderHooks" }, { "name": "executeViewQueryFn" @@ -599,6 +605,9 @@ { "name": "resetComponentState" }, + { + "name": "resetPreOrderHookFlags" + }, { "name": "resolveDirectives" }, diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 353e2ea179..3a8ba6079a 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -92,6 +92,9 @@ { "name": "PARENT_INJECTOR" }, + { + "name": "PREORDER_HOOK_FLAGS" + }, { "name": "RENDERER" }, @@ -149,6 +152,9 @@ { "name": "bloomAdd" }, + { + "name": "callHook" + }, { "name": "callHooks" }, @@ -207,7 +213,7 @@ "name": "executeHooks" }, { - "name": "executeInitHooks" + "name": "executePreOrderHooks" }, { "name": "executeViewQueryFn" @@ -428,6 +434,9 @@ { "name": "resetComponentState" }, + { + "name": "resetPreOrderHookFlags" + }, { "name": "setBindingRoot" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index a279b0e311..03caa09233 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -179,6 +179,9 @@ { "name": "PARENT_INJECTOR" }, + { + "name": "PREORDER_HOOK_FLAGS" + }, { "name": "QUERIES" }, @@ -431,6 +434,9 @@ { "name": "cacheMatchingLocalNames" }, + { + "name": "callHook" + }, { "name": "callHooks" }, @@ -584,15 +590,15 @@ { "name": "executeHooks" }, - { - "name": "executeInitHooks" - }, { "name": "executeNodeAction" }, { "name": "executeOnDestroys" }, + { + "name": "executePreOrderHooks" + }, { "name": "executeViewQueryFn" }, @@ -620,6 +626,9 @@ { "name": "findViaComponent" }, + { + "name": "flushHooksUpTo" + }, { "name": "forwardRef" }, @@ -1157,6 +1166,9 @@ { "name": "resetComponentState" }, + { + "name": "resetPreOrderHookFlags" + }, { "name": "resolveDirectives" }, diff --git a/packages/core/test/render3/lifecycle_spec.ts b/packages/core/test/render3/lifecycle_spec.ts index c721ff6613..72ebed8263 100644 --- a/packages/core/test/render3/lifecycle_spec.ts +++ b/packages/core/test/render3/lifecycle_spec.ts @@ -9,7 +9,7 @@ import {ComponentFactoryResolver, OnDestroy, SimpleChange, SimpleChanges, ViewContainerRef} from '../../src/core'; import {AttributeMarker, ComponentTemplate, LifecycleHooksFeature, NO_CHANGE, NgOnChangesFeature, defineComponent, defineDirective, injectComponentFactoryResolver} from '../../src/render3/index'; -import {bind, container, containerRefreshEnd, containerRefreshStart, directiveInject, element, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, listener, markDirty, projection, projectionDef, store, template, text} from '../../src/render3/instructions'; +import {bind, container, containerRefreshEnd, containerRefreshStart, directiveInject, element, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, flushHooksUpTo, listener, markDirty, projection, projectionDef, store, template, text} from '../../src/render3/instructions'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {NgIf} from './common_with_def'; @@ -139,6 +139,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(1); elementProperty(1, 'val', 2); } }, 2, 0, directives); @@ -289,8 +290,11 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(1); elementProperty(1, 'val', 1); + flushHooksUpTo(2); elementProperty(2, 'val', 2); + flushHooksUpTo(3); elementProperty(3, 'val', 2); } }, 4, 0, directives); @@ -345,6 +349,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(2); elementProperty(2, 'val', 5); containerRefreshStart(1); { @@ -385,6 +390,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(2); elementProperty(2, 'val', 5); containerRefreshStart(1); { @@ -623,6 +629,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(3); elementProperty(3, 'val', 4); containerRefreshStart(2); { @@ -746,6 +753,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(2); elementProperty(2, 'val', 2); } }, 4, 0, directives); @@ -814,8 +822,11 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(1); elementProperty(1, 'val', 1); + flushHooksUpTo(3); elementProperty(3, 'val', 2); + flushHooksUpTo(4); elementProperty(4, 'val', 2); } }, 6, 0, directives); @@ -844,6 +855,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(3); elementProperty(3, 'val', 4); containerRefreshStart(2); { @@ -1091,6 +1103,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(1); elementProperty(1, 'val', 2); } }, 2, 0, defs); @@ -1138,8 +1151,11 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(1); elementProperty(1, 'val', 1); + flushHooksUpTo(2); elementProperty(2, 'val', 2); + flushHooksUpTo(3); elementProperty(3, 'val', 2); } }, 4, 0, defs); @@ -1162,6 +1178,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', bind(ctx.val)); + flushHooksUpTo(1); elementProperty(1, 'val', bind(ctx.val)); } }, 2, 2, [Comp, ProjectedComp]); @@ -1177,6 +1194,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(1); elementProperty(1, 'val', 2); } }, 2, 0, [ParentComp]); @@ -1201,6 +1219,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(2); elementProperty(2, 'val', 4); containerRefreshStart(1); { @@ -1240,6 +1259,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(2); elementProperty(2, 'val', 4); containerRefreshStart(1); { @@ -1325,6 +1345,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(2); elementProperty(2, 'val', 4); containerRefreshStart(1); { @@ -1486,6 +1507,7 @@ describe('lifecycles', () => { } if (rf1 & RenderFlags.Update) { elementProperty(0, 'val', bind('1')); + flushHooksUpTo(1); elementProperty(1, 'val', bind('2')); } embeddedViewEnd(); @@ -1602,8 +1624,11 @@ describe('lifecycles', () => { } if (rf1 & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(1); elementProperty(1, 'val', 1); + flushHooksUpTo(2); elementProperty(2, 'val', 2); + flushHooksUpTo(3); elementProperty(3, 'val', 2); } embeddedViewEnd(); @@ -1648,6 +1673,7 @@ describe('lifecycles', () => { } if (rf1 & RenderFlags.Update) { elementProperty(0, 'val', bind('1')); + flushHooksUpTo(2); elementProperty(2, 'val', bind('3')); containerRefreshStart(1); { @@ -1741,6 +1767,7 @@ describe('lifecycles', () => { } if (rf1 & RenderFlags.Update) { elementProperty(0, 'val', bind('1')); + flushHooksUpTo(2); elementProperty(2, 'val', bind('5')); containerRefreshStart(1); { @@ -2134,6 +2161,7 @@ describe('lifecycles', () => { if (rf & RenderFlags.Update) { elementProperty(0, 'val1', bind(1)); elementProperty(0, 'publicVal2', bind(1)); + flushHooksUpTo(1); elementProperty(1, 'val1', bind(2)); elementProperty(1, 'publicVal2', bind(2)); } @@ -2271,6 +2299,7 @@ describe('lifecycles', () => { if (rf & RenderFlags.Update) { elementProperty(0, 'val1', bind(1)); elementProperty(0, 'publicVal2', bind(1)); + flushHooksUpTo(1); elementProperty(1, 'val1', bind(2)); elementProperty(1, 'publicVal2', bind(2)); } @@ -2318,10 +2347,13 @@ describe('lifecycles', () => { if (rf & RenderFlags.Update) { elementProperty(0, 'val1', bind(1)); elementProperty(0, 'publicVal2', bind(1)); + flushHooksUpTo(1); elementProperty(1, 'val1', bind(2)); elementProperty(1, 'publicVal2', bind(2)); + flushHooksUpTo(2); elementProperty(2, 'val1', bind(3)); elementProperty(2, 'publicVal2', bind(3)); + flushHooksUpTo(3); elementProperty(3, 'val1', bind(4)); elementProperty(3, 'publicVal2', bind(4)); } @@ -2452,6 +2484,7 @@ describe('lifecycles', () => { if (rf & RenderFlags.Update) { elementProperty(0, 'val1', bind(1)); elementProperty(0, 'publicVal2', bind(1)); + flushHooksUpTo(2); elementProperty(2, 'val1', bind(5)); elementProperty(2, 'publicVal2', bind(5)); containerRefreshStart(1); @@ -2538,6 +2571,7 @@ describe('lifecycles', () => { if (rf & RenderFlags.Update) { elementProperty(0, 'val1', bind(1)); elementProperty(0, 'publicVal2', bind(1)); + flushHooksUpTo(2); elementProperty(2, 'val1', bind(5)); elementProperty(2, 'publicVal2', bind(5)); containerRefreshStart(1); @@ -2757,6 +2791,7 @@ describe('lifecycles', () => { // even though the *value* itself never changed. if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(1); elementProperty(1, 'val', 2); } }, 2, 0, [Comp]); @@ -2800,6 +2835,7 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', 1); + flushHooksUpTo(1); elementProperty(1, 'val', 2); } }, 2, 0, [Parent]); @@ -2843,6 +2879,7 @@ describe('lifecycles', () => { element(1, 'view'); } if (rf & RenderFlags.Update) { + flushHooksUpTo(1); elementProperty(1, 'val', bind(ctx.val)); } }, 2, 1, [View]); @@ -2866,8 +2903,11 @@ describe('lifecycles', () => { } if (rf & RenderFlags.Update) { elementProperty(0, 'val', bind(1)); + flushHooksUpTo(1); elementProperty(1, 'val', bind(1)); + flushHooksUpTo(2); elementProperty(2, 'val', bind(2)); + flushHooksUpTo(3); elementProperty(3, 'val', bind(2)); } }, 4, 4, [Parent, Content]); diff --git a/packages/examples/forms/ts/simpleNgModel/e2e_test/simple_ng_model_spec.ts b/packages/examples/forms/ts/simpleNgModel/e2e_test/simple_ng_model_spec.ts index 1036b9161a..6241b2e2b9 100644 --- a/packages/examples/forms/ts/simpleNgModel/e2e_test/simple_ng_model_spec.ts +++ b/packages/examples/forms/ts/simpleNgModel/e2e_test/simple_ng_model_spec.ts @@ -6,43 +6,41 @@ * found in the LICENSE file at https://angular.io/license */ -import {fixmeIvy} from '@angular/private/testing'; import {ElementArrayFinder, ElementFinder, browser, by, element} from 'protractor'; import {verifyNoBrowserErrors} from '../../../../test-utils'; -fixmeIvy('FW-1051: Directives are updated after the execution of the template function') - .describe('simpleNgModel example', () => { - afterEach(verifyNoBrowserErrors); - let input: ElementFinder; - let paragraphs: ElementArrayFinder; - let button: ElementFinder; +describe('simpleNgModel example', () => { + afterEach(verifyNoBrowserErrors); + let input: ElementFinder; + let paragraphs: ElementArrayFinder; + let button: ElementFinder; - beforeEach(() => { - browser.get('/simpleNgModel'); - input = element(by.css('input')); - paragraphs = element.all(by.css('p')); - button = element(by.css('button')); - }); + beforeEach(() => { + browser.get('/simpleNgModel'); + input = element(by.css('input')); + paragraphs = element.all(by.css('p')); + button = element(by.css('button')); + }); - it('should update the domain model as you type', () => { - input.click(); - input.sendKeys('Carson'); + it('should update the domain model as you type', () => { + input.click(); + input.sendKeys('Carson'); - expect(paragraphs.get(0).getText()).toEqual('Value: Carson'); - }); + expect(paragraphs.get(0).getText()).toEqual('Value: Carson'); + }); - it('should report the validity correctly', () => { - expect(paragraphs.get(1).getText()).toEqual('Valid: false'); - input.click(); - input.sendKeys('a'); + it('should report the validity correctly', () => { + expect(paragraphs.get(1).getText()).toEqual('Valid: false'); + input.click(); + input.sendKeys('a'); - expect(paragraphs.get(1).getText()).toEqual('Valid: true'); - }); + expect(paragraphs.get(1).getText()).toEqual('Valid: true'); + }); - it('should set the value by changing the domain model', () => { - button.click(); - expect(input.getAttribute('value')).toEqual('Nancy'); - }); + it('should set the value by changing the domain model', () => { + button.click(); + expect(input.getAttribute('value')).toEqual('Nancy'); + }); - }); +}); From 20a9dbef8e75b5248a9d295ba469db1f40f302a3 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Wed, 6 Mar 2019 00:15:59 +0100 Subject: [PATCH 0227/1073] ci: saucelabs-legacy job should not run schematic core tests (#29124) With 62157990554306fb76e1e254b31855f966ff65f2 we introduced schematics for `core`, but due to the fact the Saucelabs legacy job does not run for PRs, we didn't realize that the legacy Saucelabs job ends up running the schematic specs. We don't want to run these schematic tests in the legacy-saucelabs job, as these are node-only specs and the non-Bazel Karma setup is not set up to provide the devkit schematic node modules. We exclude the schematics folder in the `core` package in the legacy-build tsconfig file (similar to how it is done for elements) PR Close #29124 --- packages/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/tsconfig.json b/packages/tsconfig.json index 720c55d6c9..8a3c22122f 100644 --- a/packages/tsconfig.json +++ b/packages/tsconfig.json @@ -32,6 +32,7 @@ "bazel", "common/locales", "compiler-cli/integrationtest", + "core/schematics", "elements/schematics", // Do not build the example e2e spec files since those require custom typings and // aren't required to build all packages. From 881807dc3624739f1ac4f51f9d7c1fb467ea0a98 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Mon, 4 Mar 2019 11:43:55 -0800 Subject: [PATCH 0228/1073] fix(ivy): never use imported type references as values (#29111) ngtsc occasionally converts a type reference (such as the type of a parameter in a constructor) to a value reference (argument to a directiveInject call). TypeScript has a bad habit of sometimes removing the import statement associated with this type reference, because it's a type only import when it initially looks at the file. A solution to this is to always add an import to refer to a type position value that's imported, and not rely on the existing import. PR Close #29111 --- .../src/ngcc/src/host/esm2015_host.ts | 8 +- .../host/esm2015_host_import_helper_spec.ts | 13 +- .../src/ngcc/test/host/esm2015_host_spec.ts | 11 +- .../test/host/esm5_host_import_helper_spec.ts | 13 +- .../src/ngcc/test/host/esm5_host_spec.ts | 13 +- .../compiler-cli/src/ngcc/test/host/util.ts | 31 +++++ .../src/ngtsc/annotations/src/metadata.ts | 38 +++--- .../src/ngtsc/annotations/src/util.ts | 34 ++++-- .../ngtsc/annotations/test/metadata_spec.ts | 2 +- .../src/ngtsc/reflection/src/host.ts | 41 ++++++- .../src/ngtsc/reflection/src/typescript.ts | 115 +++++++++++++++--- .../src/ngtsc/reflection/test/ts_host_spec.ts | 54 ++++++-- .../compliance/r3_compiler_compliance_spec.ts | 6 +- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 14 +-- packages/compiler/src/compiler.ts | 2 +- 15 files changed, 308 insertions(+), 87 deletions(-) create mode 100644 packages/compiler-cli/src/ngcc/test/host/util.ts diff --git a/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts b/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts index c0dfa93d1b..b99eff1bb8 100644 --- a/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts +++ b/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts @@ -895,7 +895,13 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N paramInfo[index] : {decorators: null, typeExpression: null}; const nameNode = node.name; - return {name: getNameText(nameNode), nameNode, typeExpression, typeNode: null, decorators}; + return { + name: getNameText(nameNode), + nameNode, + typeValueReference: + typeExpression !== null ? {local: true as true, expression: typeExpression} : null, + typeNode: null, decorators + }; }); } diff --git a/packages/compiler-cli/src/ngcc/test/host/esm2015_host_import_helper_spec.ts b/packages/compiler-cli/src/ngcc/test/host/esm2015_host_import_helper_spec.ts index c3d09c225c..ee1bcba5ea 100644 --- a/packages/compiler-cli/src/ngcc/test/host/esm2015_host_import_helper_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/host/esm2015_host_import_helper_spec.ts @@ -12,6 +12,8 @@ import {ClassMemberKind, Import} from '../../../ngtsc/reflection'; import {Esm2015ReflectionHost} from '../../src/host/esm2015_host'; import {convertToDirectTsLibImport, getDeclaration, makeTestProgram} from '../helpers/utils'; +import {expectTypeValueReferencesForParameters} from './util'; + const FILES = [ { name: '/some_directive.js', @@ -262,8 +264,10 @@ describe('Fesm2015ReflectionHost [import helper style]', () => { expect(parameters !.map(parameter => parameter.name)).toEqual([ '_viewContainer', '_template', 'injected' ]); - expect(parameters !.map(parameter => parameter.typeExpression !.getText())).toEqual([ - 'ViewContainerRef', 'TemplateRef', 'String' + expectTypeValueReferencesForParameters(parameters !, [ + 'ViewContainerRef', + 'TemplateRef', + 'String', ]); }); @@ -296,7 +300,10 @@ describe('Fesm2015ReflectionHost [import helper style]', () => { const classNode = getDeclaration( program, '/some_directive.js', 'SomeDirective', ts.isVariableDeclaration); const ctrDecorators = host.getConstructorParameters(classNode) !; - const identifierOfViewContainerRef = ctrDecorators[0].typeExpression !as ts.Identifier; + const identifierOfViewContainerRef = (ctrDecorators[0].typeValueReference !as{ + local: true, + expression: ts.Identifier + }).expression; const expectedDeclarationNode = getDeclaration( program, '/some_directive.js', 'ViewContainerRef', ts.isClassDeclaration); diff --git a/packages/compiler-cli/src/ngcc/test/host/esm2015_host_spec.ts b/packages/compiler-cli/src/ngcc/test/host/esm2015_host_spec.ts index e46f184450..e595ec0582 100644 --- a/packages/compiler-cli/src/ngcc/test/host/esm2015_host_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/host/esm2015_host_spec.ts @@ -12,6 +12,8 @@ import {ClassMemberKind, Import} from '../../../ngtsc/reflection'; import {Esm2015ReflectionHost} from '../../src/host/esm2015_host'; import {getDeclaration, makeTestBundleProgram, makeTestProgram} from '../helpers/utils'; +import {expectTypeValueReferencesForParameters} from './util'; + const SOME_DIRECTIVE_FILE = { name: '/some_directive.js', contents: ` @@ -930,9 +932,7 @@ describe('Fesm2015ReflectionHost', () => { expect(parameters.map(parameter => parameter.name)).toEqual([ '_viewContainer', '_template', 'injected' ]); - expect(parameters.map(parameter => parameter.typeExpression !.getText())).toEqual([ - 'ViewContainerRef', 'TemplateRef', 'undefined' - ]); + expectTypeValueReferencesForParameters(parameters, ['ViewContainerRef', 'TemplateRef', null]); }); it('should throw if the symbol is not a class', () => { @@ -1293,7 +1293,10 @@ describe('Fesm2015ReflectionHost', () => { const classNode = getDeclaration(program, SOME_DIRECTIVE_FILE.name, 'SomeDirective', ts.isClassDeclaration); const ctrDecorators = host.getConstructorParameters(classNode) !; - const identifierOfViewContainerRef = ctrDecorators[0].typeExpression !as ts.Identifier; + const identifierOfViewContainerRef = (ctrDecorators[0].typeValueReference !as{ + local: true, + expression: ts.Identifier + }).expression; const expectedDeclarationNode = getDeclaration( program, SOME_DIRECTIVE_FILE.name, 'ViewContainerRef', ts.isVariableDeclaration); diff --git a/packages/compiler-cli/src/ngcc/test/host/esm5_host_import_helper_spec.ts b/packages/compiler-cli/src/ngcc/test/host/esm5_host_import_helper_spec.ts index 55647fbb4f..6c558b1e48 100644 --- a/packages/compiler-cli/src/ngcc/test/host/esm5_host_import_helper_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/host/esm5_host_import_helper_spec.ts @@ -12,6 +12,8 @@ import {ClassMemberKind, Import} from '../../../ngtsc/reflection'; import {Esm5ReflectionHost} from '../../src/host/esm5_host'; import {convertToDirectTsLibImport, getDeclaration, makeTestProgram} from '../helpers/utils'; +import {expectTypeValueReferencesForParameters} from './util'; + const FILES = [ { name: '/some_directive.js', @@ -277,8 +279,10 @@ describe('Esm5ReflectionHost [import helper style]', () => { expect(parameters !.map(parameter => parameter.name)).toEqual([ '_viewContainer', '_template', 'injected' ]); - expect(parameters !.map(parameter => parameter.typeExpression !.getText())).toEqual([ - 'ViewContainerRef', 'TemplateRef', 'String' + expectTypeValueReferencesForParameters(parameters !, [ + 'ViewContainerRef', + 'TemplateRef', + 'String', ]); }); @@ -332,7 +336,10 @@ describe('Esm5ReflectionHost [import helper style]', () => { const classNode = getDeclaration( program, '/some_directive.js', 'SomeDirective', ts.isVariableDeclaration); const ctrDecorators = host.getConstructorParameters(classNode) !; - const identifierOfViewContainerRef = ctrDecorators[0].typeExpression !as ts.Identifier; + const identifierOfViewContainerRef = (ctrDecorators[0].typeValueReference !as{ + local: true, + expression: ts.Identifier + }).expression; const expectedDeclarationNode = getDeclaration( program, '/some_directive.js', 'ViewContainerRef', ts.isVariableDeclaration); diff --git a/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts b/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts index 8efc087d2a..b83110b36a 100644 --- a/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts @@ -13,6 +13,8 @@ import {Esm2015ReflectionHost} from '../../src/host/esm2015_host'; import {Esm5ReflectionHost} from '../../src/host/esm5_host'; import {getDeclaration, makeTestProgram} from '../helpers/utils'; +import {expectTypeValueReferencesForParameters} from './util'; + const SOME_DIRECTIVE_FILE = { name: '/some_directive.js', contents: ` @@ -918,8 +920,10 @@ describe('Esm5ReflectionHost', () => { expect(parameters !.map(parameter => parameter.name)).toEqual([ '_viewContainer', '_template', 'injected' ]); - expect(parameters !.map(parameter => parameter.typeExpression !.getText())).toEqual([ - 'ViewContainerRef', 'TemplateRef', 'undefined' + expectTypeValueReferencesForParameters(parameters !, [ + 'ViewContainerRef', + 'TemplateRef', + null, ]); }); @@ -1251,7 +1255,10 @@ describe('Esm5ReflectionHost', () => { const classNode = getDeclaration( program, SOME_DIRECTIVE_FILE.name, 'SomeDirective', ts.isVariableDeclaration); const ctrDecorators = host.getConstructorParameters(classNode) !; - const identifierOfViewContainerRef = ctrDecorators[0].typeExpression !as ts.Identifier; + const identifierOfViewContainerRef = (ctrDecorators[0].typeValueReference !as{ + local: true, + expression: ts.Identifier + }).expression; const expectedDeclarationNode = getDeclaration( program, SOME_DIRECTIVE_FILE.name, 'ViewContainerRef', ts.isVariableDeclaration); diff --git a/packages/compiler-cli/src/ngcc/test/host/util.ts b/packages/compiler-cli/src/ngcc/test/host/util.ts new file mode 100644 index 0000000000..008eef7b45 --- /dev/null +++ b/packages/compiler-cli/src/ngcc/test/host/util.ts @@ -0,0 +1,31 @@ + +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {CtorParameter} from '../../../ngtsc/reflection'; + +/** + * Check that a given list of `CtorParameter`s has `typeValueReference`s of specific `ts.Identifier` + * names. + */ +export function expectTypeValueReferencesForParameters( + parameters: CtorParameter[], expectedParams: (string | null)[]) { + parameters !.forEach((param, idx) => { + const expected = expectedParams[idx]; + if (expected !== null) { + if (param.typeValueReference === null || !param.typeValueReference.local || + !ts.isIdentifier(param.typeValueReference.expression)) { + fail(`Incorrect typeValueReference generated, expected ${expected}`); + } else { + expect(param.typeValueReference.expression.text).toEqual(expected); + } + } + }); +} diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/metadata.ts b/packages/compiler-cli/src/ngtsc/annotations/src/metadata.ts index dc8faa1673..c807e9a14d 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/metadata.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/metadata.ts @@ -6,11 +6,13 @@ * found in the LICENSE file at https://angular.io/license */ -import {ExternalExpr, Identifiers, InvokeFunctionExpr, Statement, WrappedNodeExpr} from '@angular/compiler'; +import {Expression, ExternalExpr, FunctionExpr, Identifiers, InvokeFunctionExpr, LiteralArrayExpr, LiteralExpr, ReturnStatement, Statement, WrappedNodeExpr, literalMap} from '@angular/compiler'; import * as ts from 'typescript'; import {CtorParameter, Decorator, ReflectionHost} from '../../reflection'; +import {valueReferenceToExpression} from './util'; + /** * Given a class declaration, generate a call to `setClassMetadata` with the Angular metadata * present on the class or its member fields. @@ -39,18 +41,13 @@ export function generateSetClassMetadataCall( const metaDecorators = ts.createArrayLiteral(ngClassDecorators); // Convert the constructor parameters to metadata, passing null if none are present. - let metaCtorParameters: ts.Expression = ts.createNull(); + let metaCtorParameters: Expression = new LiteralExpr(null); const classCtorParameters = reflection.getConstructorParameters(clazz); if (classCtorParameters !== null) { - const ctorParameters = ts.createArrayLiteral( - classCtorParameters.map(param => ctorParameterToMetadata(param, isCore))); - metaCtorParameters = ts.createFunctionExpression( - /* modifiers */ undefined, - /* asteriskToken */ undefined, - /* name */ undefined, - /* typeParameters */ undefined, - /* parameters */ undefined, - /* type */ undefined, ts.createBlock([ts.createReturn(ctorParameters)])); + const ctorParameters = classCtorParameters.map(param => ctorParameterToMetadata(param, isCore)); + metaCtorParameters = new FunctionExpr([], [ + new ReturnStatement(new LiteralArrayExpr(ctorParameters)), + ]); } // Do the same for property decorators. @@ -71,7 +68,7 @@ export function generateSetClassMetadataCall( [ new WrappedNodeExpr(id), new WrappedNodeExpr(metaDecorators), - new WrappedNodeExpr(metaCtorParameters), + metaCtorParameters, new WrappedNodeExpr(metaPropDecorators), ], /* type */ undefined, @@ -83,22 +80,25 @@ export function generateSetClassMetadataCall( /** * Convert a reflected constructor parameter to metadata. */ -function ctorParameterToMetadata(param: CtorParameter, isCore: boolean): ts.Expression { +function ctorParameterToMetadata(param: CtorParameter, isCore: boolean): Expression { // Parameters sometimes have a type that can be referenced. If so, then use it, otherwise // its type is undefined. - const type = - param.typeExpression !== null ? param.typeExpression : ts.createIdentifier('undefined'); - const properties: ts.ObjectLiteralElementLike[] = [ - ts.createPropertyAssignment('type', type), + const type = param.typeValueReference !== null ? + valueReferenceToExpression(param.typeValueReference) : + new LiteralExpr(undefined); + + const mapEntries: {key: string, value: Expression, quoted: false}[] = [ + {key: 'type', value: type, quoted: false}, ]; // If the parameter has decorators, include the ones from Angular. if (param.decorators !== null) { const ngDecorators = param.decorators.filter(dec => isAngularDecorator(dec, isCore)).map(decoratorToMetadata); - properties.push(ts.createPropertyAssignment('decorators', ts.createArrayLiteral(ngDecorators))); + const value = new WrappedNodeExpr(ts.createArrayLiteral(ngDecorators)); + mapEntries.push({key: 'decorators', value, quoted: false}); } - return ts.createObjectLiteral(properties, true); + return literalMap(mapEntries); } /** diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/util.ts b/packages/compiler-cli/src/ngtsc/annotations/src/util.ts index a10ff41b54..65feb61606 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/util.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/util.ts @@ -6,13 +6,13 @@ * found in the LICENSE file at https://angular.io/license */ -import {R3DependencyMetadata, R3Reference, R3ResolvedDependencyType, WrappedNodeExpr} from '@angular/compiler'; +import {Expression, ExternalExpr, R3DependencyMetadata, R3Reference, R3ResolvedDependencyType, WrappedNodeExpr} from '@angular/compiler'; import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; import {ImportMode, Reference, ReferenceEmitter} from '../../imports'; import {ForeignFunctionResolver} from '../../partial_evaluator'; -import {ClassMemberKind, CtorParameter, Decorator, ReflectionHost} from '../../reflection'; +import {ClassMemberKind, CtorParameter, Decorator, ReflectionHost, TypeValueReference} from '../../reflection'; export enum ConstructorDepErrorKind { NO_SUITABLE_TOKEN, @@ -45,7 +45,7 @@ export function getConstructorDependencies( } } ctorParams.forEach((param, idx) => { - let tokenExpr = param.typeExpression; + let token = valueReferenceToExpression(param.typeValueReference); let optional = false, self = false, skipSelf = false, host = false; let resolved = R3ResolvedDependencyType.Token; (param.decorators || []).filter(dec => isCore || isAngularCore(dec)).forEach(dec => { @@ -56,7 +56,7 @@ export function getConstructorDependencies( ErrorCode.DECORATOR_ARITY_WRONG, dec.node, `Unexpected number of arguments to @Inject().`); } - tokenExpr = dec.args[0]; + token = new WrappedNodeExpr(dec.args[0]); } else if (name === 'Optional') { optional = true; } else if (name === 'SkipSelf') { @@ -71,20 +71,19 @@ export function getConstructorDependencies( ErrorCode.DECORATOR_ARITY_WRONG, dec.node, `Unexpected number of arguments to @Attribute().`); } - tokenExpr = dec.args[0]; + token = new WrappedNodeExpr(dec.args[0]); resolved = R3ResolvedDependencyType.Attribute; } else { throw new FatalDiagnosticError( ErrorCode.DECORATOR_UNEXPECTED, dec.node, `Unexpected decorator ${name} on parameter.`); } }); - if (tokenExpr === null) { + if (token === null) { errors.push({ index: idx, kind: ConstructorDepErrorKind.NO_SUITABLE_TOKEN, param, }); } else { - const token = new WrappedNodeExpr(tokenExpr); deps.push({token, optional, self, skipSelf, host, resolved}); } }); @@ -95,6 +94,27 @@ export function getConstructorDependencies( } } +/** + * Convert a `TypeValueReference` to an `Expression` which refers to the type as a value. + * + * Local references are converted to a `WrappedNodeExpr` of the TypeScript expression, and non-local + * references are converted to an `ExternalExpr`. Note that this is only valid in the context of the + * file in which the `TypeValueReference` originated. + */ +export function valueReferenceToExpression(valueRef: TypeValueReference): Expression; +export function valueReferenceToExpression(valueRef: null): null; +export function valueReferenceToExpression(valueRef: TypeValueReference | null): Expression|null; +export function valueReferenceToExpression(valueRef: TypeValueReference | null): Expression|null { + if (valueRef === null) { + return null; + } else if (valueRef.local) { + return new WrappedNodeExpr(valueRef.expression); + } else { + // TODO(alxhub): this cast is necessary because the g3 typescript version doesn't narrow here. + return new ExternalExpr(valueRef as{moduleName: string, name: string}); + } +} + export function getValidConstructorDependencies( clazz: ts.ClassDeclaration, reflector: ReflectionHost, isCore: boolean): R3DependencyMetadata[]| null { diff --git a/packages/compiler-cli/src/ngtsc/annotations/test/metadata_spec.ts b/packages/compiler-cli/src/ngtsc/annotations/test/metadata_spec.ts index adbbed46e5..837c685fcb 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/test/metadata_spec.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/test/metadata_spec.ts @@ -46,7 +46,7 @@ describe('ngtsc setClassMetadata converter', () => { } `); expect(res).toContain( - `function () { return [{ type: undefined, decorators: [{ type: Inject, args: [FOO] }] }, { type: Injector }]; }, null);`); + `function () { return [{ type: undefined, decorators: [{ type: Inject, args: [FOO] }] }, { type: i0.Injector }]; }, null);`); }); it('should convert decorated field metadata', () => { diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts index c8b5512694..ef46b8fd0d 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts @@ -151,6 +151,31 @@ export interface ClassMember { decorators: Decorator[]|null; } +/** + * A reference to a value that originated from a type position. + * + * For example, a constructor parameter could be declared as `foo: Foo`. A `TypeValueReference` + * extracted from this would refer to the value of the class `Foo` (assuming it was actually a + * type). + * + * There are two kinds of such references. A reference with `local: false` refers to a type that was + * imported, and gives the symbol `name` and the `moduleName` of the import. Note that this + * `moduleName` may be a relative path, and thus is likely only valid within the context of the file + * which contained the original type reference. + * + * A reference with `local: true` refers to any other kind of type via a `ts.Expression` that's + * valid within the local file where the type was referenced. + */ +export type TypeValueReference = { + local: true; expression: ts.Expression; +} | +{ + local: false; + name: string; + moduleName: string; + valueDeclaration: ts.Declaration; +}; + /** * A parameter to a constructor. */ @@ -172,18 +197,22 @@ export interface CtorParameter { nameNode: ts.BindingName; /** - * TypeScript `ts.Expression` representing the type value of the parameter, if the type is a - * simple - * expression type that can be converted to a value. + * Reference to the value of the parameter's type annotation, if it's possible to refer to the + * parameter's type as a value. * - * If the type is not present or cannot be represented as an expression, `type` is `null`. + * This can either be a reference to a local value, in which case it has `local` set to `true` and + * contains a `ts.Expression`, or it's a reference to an imported value, in which case `local` is + * set to `false` and the symbol and module name of the imported value are provided instead. + * + * If the type is not present or cannot be represented as an expression, `typeValueReference` is + * `null`. */ - typeExpression: ts.Expression|null; + typeValueReference: TypeValueReference|null; /** * TypeScript `ts.TypeNode` representing the type node found in the type position. * - * This field can be used for diagnostics reporting if `typeExpression` is `null`. + * This field can be used for diagnostics reporting if `typeValueReference` is `null`. * * Can be null, if the param has no type declared. */ diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts index 708b953965..04aa900f06 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts @@ -8,7 +8,7 @@ import * as ts from 'typescript'; -import {ClassMember, ClassMemberKind, CtorParameter, Declaration, Decorator, FunctionDefinition, Import, ReflectionHost} from './host'; +import {ClassMember, ClassMemberKind, CtorParameter, Declaration, Decorator, FunctionDefinition, Import, ReflectionHost, TypeValueReference} from './host'; /** * reflector.ts implements static reflection of declarations using the TypeScript `ts.TypeChecker`. @@ -48,7 +48,7 @@ export class TypeScriptReflectionHost implements ReflectionHost { // It may or may not be possible to write an expression that refers to the value side of the // type named for the parameter. - let typeValueExpr: ts.Expression|null = null; + let typeValueExpr: TypeValueReference|null = null; let originalTypeNode = node.type || null; let typeNode = originalTypeNode; @@ -69,27 +69,57 @@ export class TypeScriptReflectionHost implements ReflectionHost { // It's not possible to get a value expression if the parameter doesn't even have a type. if (typeNode && ts.isTypeReferenceNode(typeNode)) { - // It's only valid to convert a type reference to a value reference if the type actually has - // a value declaration associated with it. - let symbol: ts.Symbol|undefined = this.checker.getSymbolAtLocation(typeNode.typeName); - - if (symbol !== undefined) { - let resolvedSymbol = symbol; - if (symbol.flags & ts.SymbolFlags.Alias) { - resolvedSymbol = this.checker.getAliasedSymbol(symbol); - } - if (resolvedSymbol.valueDeclaration !== undefined) { + const symbols = resolveTypeSymbols(typeNode, this.checker); + if (symbols !== null) { + const {local, decl} = symbols; + // It's only valid to convert a type reference to a value reference if the type actually + // has a value declaration associated with it. + if (decl.valueDeclaration !== undefined) { // The type points to a valid value declaration. Rewrite the TypeReference into an // Expression which references the value pointed to by the TypeReference, if possible. - const firstDecl = symbol.declarations && symbol.declarations[0]; + + // Look at the local `ts.Symbol`'s declarations and see if it comes from an import + // statement. If so, extract the module specifier and the name of the imported type. + const firstDecl = local.declarations && local.declarations[0]; + if (firstDecl && ts.isImportSpecifier(firstDecl)) { - // Making sure TS produces the necessary imports in case a symbol was declared in a - // different script and imported. To do that we check symbol's first declaration and - // if it's an import - use its identifier. The `Identifier` from the `ImportSpecifier` - // knows it could be a value reference, and will emit as one if needed. - typeValueExpr = ts.updateIdentifier(firstDecl.name); + // The symbol was imported by name, in a ts.ImportSpecifier. + const name = (firstDecl.propertyName || firstDecl.name).text; + const moduleSpecifier = firstDecl.parent.parent.parent.moduleSpecifier; + if (!ts.isStringLiteral(moduleSpecifier)) { + throw new Error('not a module specifier'); + } + const moduleName = moduleSpecifier.text; + typeValueExpr = { + local: false, + name, + moduleName, + valueDeclaration: decl.valueDeclaration, + }; + } else if ( + firstDecl && ts.isNamespaceImport(firstDecl) && symbols.importName !== null) { + // The symbol was imported via a namespace import. In this case, the name to use when + // importing it was extracted by resolveTypeSymbols. + const name = symbols.importName; + const moduleSpecifier = firstDecl.parent.parent.moduleSpecifier; + if (!ts.isStringLiteral(moduleSpecifier)) { + throw new Error('not a module specifier'); + } + const moduleName = moduleSpecifier.text; + typeValueExpr = { + local: false, + name, + moduleName, + valueDeclaration: decl.valueDeclaration, + }; } else { - typeValueExpr = typeNodeToValueExpr(typeNode); + const expression = typeNodeToValueExpr(typeNode); + if (expression !== null) { + typeValueExpr = { + local: true, + expression, + }; + } } } } @@ -98,7 +128,7 @@ export class TypeScriptReflectionHost implements ReflectionHost { return { name, nameNode: node.name, - typeExpression: typeValueExpr, + typeValueReference: typeValueExpr, typeNode: originalTypeNode, decorators, }; }); @@ -486,3 +516,48 @@ function propertyNameToString(node: ts.PropertyName): string|null { return null; } } + +/** + * Resolve a `TypeReference` node to the `ts.Symbol`s for both its declaration and its local source. + * + * In the event that the `TypeReference` refers to a locally declared symbol, these will be the + * same. If the `TypeReference` refers to an imported symbol, then `decl` will be the fully resolved + * `ts.Symbol` of the referenced symbol. `local` will be the `ts.Symbol` of the `ts.Identifer` which + * points to the import statement by which the symbol was imported. + */ +function resolveTypeSymbols(typeRef: ts.TypeReferenceNode, checker: ts.TypeChecker): + {local: ts.Symbol, decl: ts.Symbol, importName: string | null}|null { + const typeName = typeRef.typeName; + // typeRefSymbol is the ts.Symbol of the entire type reference. + const typeRefSymbol: ts.Symbol|undefined = checker.getSymbolAtLocation(typeName); + if (typeRefSymbol === undefined) { + return null; + } + + // local is the ts.Symbol for the local ts.Identifier for the type. + // If the type is actually locally declared or is imported by name, for example: + // import {Foo} from './foo'; + // then it'll be the same as top. If the type is imported via a namespace import, for example: + // import * as foo from './foo'; + // and then referenced as: + // constructor(f: foo.Foo) + // then local will be the ts.Symbol of `foo`, whereas top will be the ts.Symbol of `foo.Foo`. + // This allows tracking of the import behind whatever type reference exists. + let local = typeRefSymbol; + let importName: string|null = null; + if (ts.isQualifiedName(typeName) && ts.isIdentifier(typeName.left) && + ts.isIdentifier(typeName.right)) { + const localTmp = checker.getSymbolAtLocation(typeName.left); + if (localTmp !== undefined) { + local = localTmp; + importName = typeName.right.text; + } + } + + // De-alias the top-level type reference symbol to get the symbol of the actual declaration. + let decl = typeRefSymbol; + if (typeRefSymbol.flags & ts.SymbolFlags.Alias) { + decl = checker.getAliasedSymbol(typeRefSymbol); + } + return {local, decl, importName}; +} diff --git a/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts b/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts index e9e596b434..2425512d61 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts @@ -116,12 +116,38 @@ describe('reflector', () => { const host = new TypeScriptReflectionHost(checker); const args = host.getConstructorParameters(clazz) !; expect(args.length).toBe(2); - expectParameter(args[0], 'bar', 'Bar'); - expectParameter(args[1], 'otherBar', 'star.Bar'); + expectParameter(args[0], 'bar', {moduleName: './bar', name: 'Bar'}); + expectParameter(args[1], 'otherBar', {moduleName: './bar', name: 'Bar'}); }); + it('should reflect an argument from an aliased import', () => { + const {program} = makeProgram([ + { + name: 'bar.ts', + contents: ` + export class Bar {} + ` + }, + { + name: 'entry.ts', + contents: ` + import {Bar as LocalBar} from './bar'; - it('should reflect an nullable argument', () => { + class Foo { + constructor(bar: LocalBar) {} + } + ` + } + ]); + const clazz = getDeclaration(program, 'entry.ts', 'Foo', ts.isClassDeclaration); + const checker = program.getTypeChecker(); + const host = new TypeScriptReflectionHost(checker); + const args = host.getConstructorParameters(clazz) !; + expect(args.length).toBe(1); + expectParameter(args[0], 'bar', {moduleName: './bar', name: 'Bar'}); + }); + + it('should reflect a nullable argument', () => { const {program} = makeProgram([ { name: 'bar.ts', @@ -145,7 +171,7 @@ describe('reflector', () => { const host = new TypeScriptReflectionHost(checker); const args = host.getConstructorParameters(clazz) !; expect(args.length).toBe(1); - expectParameter(args[0], 'bar', 'Bar'); + expectParameter(args[0], 'bar', {moduleName: './bar', name: 'Bar'}); }); }); @@ -193,14 +219,24 @@ describe('reflector', () => { }); function expectParameter( - param: CtorParameter, name: string, type?: string, decorator?: string, - decoratorFrom?: string): void { + param: CtorParameter, name: string, type?: string | {name: string, moduleName: string}, + decorator?: string, decoratorFrom?: string): void { expect(param.name !).toEqual(name); if (type === undefined) { - expect(param.typeExpression).toBeNull(); + expect(param.typeValueReference).toBeNull(); } else { - expect(param.typeExpression).not.toBeNull(); - expect(argExpressionToString(param.typeExpression !)).toEqual(type); + if (param.typeValueReference === null) { + return fail(`Expected parameter ${name} to have a typeValueReference`); + } + if (param.typeValueReference.local && typeof type === 'string') { + expect(argExpressionToString(param.typeValueReference.expression)).toEqual(type); + } else if (!param.typeValueReference.local && typeof type !== 'string') { + expect(param.typeValueReference.moduleName).toEqual(type.moduleName); + expect(param.typeValueReference.name).toEqual(type.name); + } else { + return fail( + `Mismatch between typeValueReference and expected type: ${param.name} / ${param.typeValueReference.local}`); + } } if (decorator !== undefined) { expect(param.decorators).not.toBeNull(); diff --git a/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts b/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts index d256953c43..681a7ac6c7 100644 --- a/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts @@ -740,8 +740,8 @@ describe('compiler compliance', () => { selectors: [["my-component"]], factory: function MyComponent_Factory(t) { return new (t || MyComponent)( - $r3$.ɵdirectiveInject(ElementRef), $r3$.ɵdirectiveInject(ViewContainerRef), - $r3$.ɵdirectiveInject(ChangeDetectorRef)); + $r3$.ɵdirectiveInject($i$.ElementRef), $r3$.ɵdirectiveInject($i$.ViewContainerRef), + $r3$.ɵdirectiveInject($i$.ChangeDetectorRef)); }, consts: 0, vars: 0, @@ -784,7 +784,7 @@ describe('compiler compliance', () => { IfDirective.ngDirectiveDef = $r3$.ɵdefineDirective({ type: IfDirective, selectors: [["", "if", ""]], - factory: function IfDirective_Factory(t) { return new (t || IfDirective)($r3$.ɵdirectiveInject(TemplateRef)); } + factory: function IfDirective_Factory(t) { return new (t || IfDirective)($r3$.ɵdirectiveInject($i$.TemplateRef)); } });`; const MyComponentDefinition = ` const $c1$ = ["foo", ""]; diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index a19e1c6a3e..3caa96181e 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -1104,7 +1104,7 @@ describe('ngtsc behavioral tests', () => { const jsContents = env.getContents('test.js'); expect(jsContents) .toContain( - `factory: function FooCmp_Factory(t) { return new (t || FooCmp)(i0.ɵinjectAttribute("test"), i0.ɵdirectiveInject(ChangeDetectorRef), i0.ɵdirectiveInject(ElementRef), i0.ɵdirectiveInject(Injector), i0.ɵdirectiveInject(Renderer2), i0.ɵdirectiveInject(TemplateRef), i0.ɵdirectiveInject(ViewContainerRef)); }`); + `factory: function FooCmp_Factory(t) { return new (t || FooCmp)(i0.ɵinjectAttribute("test"), i0.ɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵdirectiveInject(i0.ElementRef), i0.ɵdirectiveInject(i0.Injector), i0.ɵdirectiveInject(i0.Renderer2), i0.ɵdirectiveInject(i0.TemplateRef), i0.ɵdirectiveInject(i0.ViewContainerRef)); }`); }); it('should generate queries for components', () => { @@ -1932,9 +1932,9 @@ describe('ngtsc behavioral tests', () => { env.driveMain(); const jsContents = trim(env.getContents('test.js')); - expect(jsContents).toContain(`import { MyTypeA, MyTypeB } from './types';`); - expect(jsContents).toMatch(setClassMetadataRegExp('type: MyTypeA')); - expect(jsContents).toMatch(setClassMetadataRegExp('type: MyTypeB')); + expect(jsContents).toContain(`import * as i1 from "./types";`); + expect(jsContents).toMatch(setClassMetadataRegExp('type: i1\\.MyTypeA')); + expect(jsContents).toMatch(setClassMetadataRegExp('type: i1\\.MyTypeB')); }); it('should use imported types in setClassMetadata if they can be represented as values and imported as `* as foo`', @@ -1961,13 +1961,13 @@ describe('ngtsc behavioral tests', () => { export class SomeComp { constructor(@Inject('arg-token') arg: types.MyTypeB) {} } - `); + `); env.driveMain(); const jsContents = trim(env.getContents('test.js')); expect(jsContents).toContain(`import * as types from './types';`); - expect(jsContents).toMatch(setClassMetadataRegExp('type: types.MyTypeA')); - expect(jsContents).toMatch(setClassMetadataRegExp('type: types.MyTypeB')); + expect(jsContents).toMatch(setClassMetadataRegExp('type: i\\d\\.MyTypeA')); + expect(jsContents).toMatch(setClassMetadataRegExp('type: i\\d\\.MyTypeB')); }); it('should use `undefined` in setClassMetadata if types can\'t be represented as values', () => { diff --git a/packages/compiler/src/compiler.ts b/packages/compiler/src/compiler.ts index 6e2c7d555c..c400260081 100644 --- a/packages/compiler/src/compiler.ts +++ b/packages/compiler/src/compiler.ts @@ -76,7 +76,7 @@ export * from './ml_parser/interpolation_config'; export * from './ml_parser/tags'; export {LexerRange} from './ml_parser/lexer'; export {NgModuleCompiler} from './ng_module_compiler'; -export {ArrayType, AssertNotNull, BinaryOperator, BinaryOperatorExpr, BuiltinMethod, BuiltinType, BuiltinTypeName, BuiltinVar, CastExpr, ClassField, ClassMethod, ClassStmt, CommaExpr, CommentStmt, ConditionalExpr, DeclareFunctionStmt, DeclareVarStmt, Expression, ExpressionStatement, ExpressionType, ExpressionVisitor, ExternalExpr, ExternalReference, FunctionExpr, IfStmt, InstantiateExpr, InvokeFunctionExpr, InvokeMethodExpr, JSDocCommentStmt, LiteralArrayExpr, LiteralExpr, LiteralMapExpr, MapType, NotExpr, ReadKeyExpr, ReadPropExpr, ReadVarExpr, ReturnStatement, StatementVisitor, ThrowStmt, TryCatchStmt, Type, TypeVisitor, WrappedNodeExpr, WriteKeyExpr, WritePropExpr, WriteVarExpr, StmtModifier, Statement, TypeofExpr, collectExternalReferences} from './output/output_ast'; +export {ArrayType, AssertNotNull, BinaryOperator, BinaryOperatorExpr, BuiltinMethod, BuiltinType, BuiltinTypeName, BuiltinVar, CastExpr, ClassField, ClassMethod, ClassStmt, CommaExpr, CommentStmt, ConditionalExpr, DeclareFunctionStmt, DeclareVarStmt, Expression, ExpressionStatement, ExpressionType, ExpressionVisitor, ExternalExpr, ExternalReference, literalMap, FunctionExpr, IfStmt, InstantiateExpr, InvokeFunctionExpr, InvokeMethodExpr, JSDocCommentStmt, LiteralArrayExpr, LiteralExpr, LiteralMapExpr, MapType, NotExpr, ReadKeyExpr, ReadPropExpr, ReadVarExpr, ReturnStatement, StatementVisitor, ThrowStmt, TryCatchStmt, Type, TypeVisitor, WrappedNodeExpr, WriteKeyExpr, WritePropExpr, WriteVarExpr, StmtModifier, Statement, TypeofExpr, collectExternalReferences} from './output/output_ast'; export {EmitterVisitorContext} from './output/abstract_emitter'; export {JitEvaluator} from './output/output_jit'; export * from './output/ts_emitter'; From 3bee0f684d8ef659a83e98a2a69862185bd5d3c2 Mon Sep 17 00:00:00 2001 From: Cyrille Tuzi Date: Fri, 28 Dec 2018 18:03:09 +0100 Subject: [PATCH 0229/1073] feat(service-worker): add JSON schema for service worker config (#27859) Fixes #19847 PR Close #27859 --- packages/service-worker/BUILD.bazel | 3 +- packages/service-worker/config/BUILD.bazel | 5 +- packages/service-worker/config/schema.json | 148 +++++++++++++++++++++ 3 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 packages/service-worker/config/schema.json diff --git a/packages/service-worker/BUILD.bazel b/packages/service-worker/BUILD.bazel index 3d5a85bdfe..cef936e5e2 100644 --- a/packages/service-worker/BUILD.bazel +++ b/packages/service-worker/BUILD.bazel @@ -38,13 +38,14 @@ ng_package( name = "npm_package", srcs = [ "package.json", - "safety-worker.js", "//packages/service-worker/config:package.json", ], data = [ + "safety-worker.js", ":ngsw_config_binary", ":ngsw_worker_renamed", "//packages/service-worker/config", + "//packages/service-worker/config:schema.json", ], entry_point = "packages/service-worker/index.js", tags = [ diff --git a/packages/service-worker/config/BUILD.bazel b/packages/service-worker/config/BUILD.bazel index 638a39301a..59843001e9 100644 --- a/packages/service-worker/config/BUILD.bazel +++ b/packages/service-worker/config/BUILD.bazel @@ -2,7 +2,10 @@ load("//tools:defaults.bzl", "ng_module") package(default_visibility = ["//visibility:public"]) -exports_files(["package.json"]) +exports_files([ + "package.json", + "schema.json", +]) ng_module( name = "config", diff --git a/packages/service-worker/config/schema.json b/packages/service-worker/config/schema.json new file mode 100644 index 0000000000..2ec9bbd442 --- /dev/null +++ b/packages/service-worker/config/schema.json @@ -0,0 +1,148 @@ +{ + "$schema": "https://json-schema.org/draft-07/schema", + "type": "object", + "properties": { + "$schema": { + "type": "string" + }, + "appData": { + "type": "object", + "description": "This section enables you to pass any data you want that describes this particular version of the app. The SwUpdate service includes that data in the update notifications. Many apps use this section to provide additional information for the display of UI popups, notifying users of the available update." + }, + "index": { + "type": "string", + "description": "Specifies the file that serves as the index page to satisfy navigation requests. Usually this is '/index.html'." + }, + "assetGroups": { + "type": "array", + "description": "Assets are resources that are part of the app version that update along with the app. They can include resources loaded from the page's origin as well as third-party resources loaded from CDNs and other external URLs. As not all such external URLs may be known at build time, URL patterns can be matched.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "It identifies this particular group of assets between versions of the configuration." + }, + "installMode": { + "enum": [ + "prefetch", + "lazy" + ], + "default": "prefetch", + "description": "Determines how the resources are initially cached. 'prefetch' tells the Angular service worker to fetch every single listed resource while it's caching the current version of the app. This is bandwidth-intensive but ensures resources are available whenever they're requested, even if the browser is currently offline. 'lazy' does not cache any of the resources up front. Instead, the Angular service worker only caches resources for which it receives requests. This is an on-demand caching mode. Resources that are never requested will not be cached. This is useful for things like images at different resolutions, so the service worker only caches the correct assets for the particular screen and orientation." + }, + "updateMode": { + "enum": [ + "prefetch", + "lazy" + ], + "description": "For resources already in the cache, determines the caching behavior when a new version of the app is discovered. Any resources in the group that have changed since the previous version are updated in accordance with 'updateMode'. 'prefetch' tells the service worker to download and cache the changed resources immediately. 'lazy' tells the service worker to not cache those resources. Instead, it treats them as unrequested and waits until they're requested again before updating them. An 'updateMode' of lazy is only valid if the 'installMode' is also lazy. Defaults to the value `installMode` is set to." + }, + "resources": { + "type": "object", + "description": "This section describes the resources to cache.", + "properties": { + "files": { + "type": "array", + "description": "Lists patterns that match files in the distribution directory. These can be single files or glob-like patterns that match a number of files.", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "urls": { + "type": "array", + "description": "Includes both URLs and URL patterns that will be matched at runtime. These resources are not fetched directly and do not have content hashes, but they will be cached according to their HTTP headers. This is most useful for CDNs such as the Google Fonts service. (Negative glob patterns are not supported and '?' will be matched literally; i.e. it will not match any character other than '?'.)", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "additionalProperties": false + } + }, + "required": [ + "name", + "resources" + ], + "additionalProperties": false + } + }, + "dataGroups": { + "type": "array", + "description": "Policies for caching data requests, such as API requests and other data dependencies. Unlike asset resources, data requests are not versioned along with the app.", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "It identifies this particular group of data between versions of the configuration." + }, + "urls": { + "type": "array", + "description": "A list of URL patterns. URLs that match these patterns will be cached according to this data group's policy. (Negative glob patterns are not supported and '?' will be matched literally; i.e. it will not match any character other than '?'.)", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "version": { + "type": "integer", + "default": 1, + "description": "Occasionally APIs change formats in a way that is not backward-compatible. A new version of the app may not be compatible with the old API format and thus may not be compatible with existing cached resources from that API. 'version' provides a mechanism to indicate that the resources being cached have been updated in a backwards-incompatible way, and that the old cache entries—those from previous versions—should be discarded." + }, + "cacheConfig": { + "type": "object", + "description": "This section defines the policy by which matching requests will be cached.", + "properties": { + "maxSize": { + "type": "integer", + "description": "The maximum number of entries, or responses, in the cache. Open-ended caches can grow in unbounded ways and eventually exceed storage quotas, calling for eviction." + }, + "maxAge": { + "type": "string", + "description": "Indicates how long responses are allowed to remain in the cache before being considered invalid and evicted. 'maxAge' is a duration string, using the following unit suffixes: d= days, h= hours, m= minutes, s= seconds, u= milliseconds. For example, the string '3d12h' will cache content for up to three and a half days." + }, + "timeout": { + "type": "string", + "description": "This duration string specifies the network timeout. The network timeout is how long the Angular service worker will wait for the network to respond before using a cached response, if configured to do so. 'timeout' is a duration string, using the following unit suffixes: d= days, h= hours, m= minutes, s= seconds, u= milliseconds. For example, the string '5s30u' will translate to five seconds and 30 milliseconds of network timeout." + }, + "strategy": { + "enum": [ + "freshness", + "performance" + ], + "default": "performance", + "description": "The Angular service worker can use either of two caching strategies for data resources. 'performance', the default, optimizes for responses that are as fast as possible. If a resource exists in the cache, the cached version is used. This allows for some staleness, depending on the 'maxAge', in exchange for better performance. This is suitable for resources that don't change often; for example, user avatar images. 'freshness' optimizes for currency of data, preferentially fetching requested data from the network. Only if the network times out, according to 'timeout', does the request fall back to the cache. This is useful for resources that change frequently; for example, account balances." + } + }, + "required": [ + "maxSize", + "maxAge" + ], + "additionalProperties": false + } + }, + "required": [ + "name", + "urls", + "cacheConfig" + ], + "additionalProperties": false + } + }, + "navigationUrls": { + "type": "array", + "description": "This optional section enables you to specify a custom list of URLs or URL patterns that will be redirected to the 'index' file.", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "required": [ + "index" + ], + "additionalProperties": false +} From 84f3dfbca4d4d42eae58b0c86807d7bfdc77ab7d Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Thu, 3 Jan 2019 21:53:39 +0200 Subject: [PATCH 0230/1073] test(service-worker): verify that `config/schema.json` is published to npm (#27859) PR Close #27859 --- integration/service-worker-schema/package.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 integration/service-worker-schema/package.json diff --git a/integration/service-worker-schema/package.json b/integration/service-worker-schema/package.json new file mode 100644 index 0000000000..4534c98d5c --- /dev/null +++ b/integration/service-worker-schema/package.json @@ -0,0 +1,16 @@ +{ + "name": "service-worker-schema", + "version": "0.0.0", + "scripts": { + "//test": "Ensure that `config/schema.json` is published to npm.", + "test": "node --eval \"require('@angular/service-worker/config/schema.json')\"" + }, + "private": true, + "dependencies": { + "@angular/common": "file:../../dist/packages-dist/common", + "@angular/core": "file:../../dist/packages-dist/core", + "@angular/service-worker": "file:../../dist/packages-dist/service-worker", + "rxjs": "file:../../node_modules/rxjs", + "zone.js": "file:../../node_modules/zone.js" + } +} From c29d2a4f1624627e28ffde71d29ab3bb70cee639 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Tue, 5 Mar 2019 17:37:16 -0800 Subject: [PATCH 0231/1073] test(ivy): fix export tests to work in IE (#29125) Some of the export tests had assertions that relied on capitalization of attributes in the DOM. IE treats capitalization somewhat differently, so our SauceLabs tests were failing. This commit tweaks the tests so that the assertions do not rely on attributes to be capitalized or not. PR Close #29125 --- packages/core/test/acceptance/exports_spec.ts | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/core/test/acceptance/exports_spec.ts b/packages/core/test/acceptance/exports_spec.ts index 63d3a0a485..4d6feb609c 100644 --- a/packages/core/test/acceptance/exports_spec.ts +++ b/packages/core/test/acceptance/exports_spec.ts @@ -43,19 +43,20 @@ describe('exports', () => { describe('input changes in hooks', () => { it('should support forward reference', () => { const fixture = initWithTemplate( - AppComp, '
{{ myDir.name }}'); + AppComp, '
{{ myDir.name }}'); fixture.detectChanges(); expect(fixture.nativeElement.innerHTML) - .toEqual('
Drew!?@'); + .toEqual('
Drew!?@'); }); modifiedInIvy('Supporting input changes in hooks is limited in Ivy') .it('should support backward reference', () => { const fixture = initWithTemplate( - AppComp, '{{ myDir.name }}
'); + AppComp, + '{{ myDir.name }}
'); fixture.detectChanges(); expect(fixture.nativeElement.innerHTML) - .toEqual('Drew!?@
'); + .toEqual('Drew!?@
'); }); onlyInIvy('Supporting input changes in hooks is limited in Ivy') @@ -63,7 +64,7 @@ describe('exports', () => { expect(() => { const fixture = initWithTemplate( AppComp, - '{{ myDir.name }}
'); + '{{ myDir.name }}
'); fixture.detectChanges(); }) .toThrowError( @@ -74,11 +75,11 @@ describe('exports', () => { .it('should support reference on the same node', () => { const fixture = initWithTemplate( AppComp, - '
'); + '
'); fixture.detectChanges(); expect(fixture.nativeElement.innerHTML) .toEqual( - '
'); + '
'); }); onlyInIvy('Supporting input changes in hooks is limited in Ivy') @@ -86,7 +87,7 @@ describe('exports', () => { expect(() => { const fixture = initWithTemplate( AppComp, - '
'); + '
'); fixture.detectChanges(); }) .toThrowError( @@ -95,10 +96,10 @@ describe('exports', () => { it('should support input referenced by host binding on that directive', () => { const fixture = - initWithTemplate(AppComp, '
'); + initWithTemplate(AppComp, '
'); fixture.detectChanges(); expect(fixture.nativeElement.innerHTML) - .toEqual('
'); + .toEqual('
'); }); }); @@ -162,7 +163,7 @@ class DirWithCompInput { @Input('dirWithInput') comp: ComponentToReference|null = null; } -@Directive({selector: '[dirOnChange]', exportAs: 'dirOnChange', host: {'[title]': 'name'}}) +@Directive({selector: '[dir-on-change]', exportAs: 'dirOnChange', host: {'[title]': 'name'}}) class DirToReferenceWithPreOrderHooks implements OnInit, OnChanges, DoCheck { @Input() in : any = null; name = 'Drew'; From 84406e4d6d93b28b23efbb1701bc5ae1084da67b Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Tue, 5 Mar 2019 20:30:29 -0800 Subject: [PATCH 0232/1073] fix(ivy): avoid innerHTML usage in exports test (to make it work in IE11) (#29127) Some tests in exports spec rely on the exact output of innerHTML. In IE11 the order of attributes might change, thus causing tests to fail (in case an element contains more than one attribute). This commit avoids innerHTML usage and performs the necessary checks via element properties. PR Close #29127 --- packages/core/test/acceptance/exports_spec.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/core/test/acceptance/exports_spec.ts b/packages/core/test/acceptance/exports_spec.ts index 4d6feb609c..690f47194b 100644 --- a/packages/core/test/acceptance/exports_spec.ts +++ b/packages/core/test/acceptance/exports_spec.ts @@ -45,8 +45,8 @@ describe('exports', () => { const fixture = initWithTemplate( AppComp, '
{{ myDir.name }}'); fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML) - .toEqual('
Drew!?@'); + expect(fixture.nativeElement.firstChild.title).toBe('Drew!?@'); // div element + expect(fixture.nativeElement.lastChild.textContent).toContain('Drew!?@'); // text node }); modifiedInIvy('Supporting input changes in hooks is limited in Ivy') @@ -55,8 +55,8 @@ describe('exports', () => { AppComp, '{{ myDir.name }}
'); fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML) - .toEqual('Drew!?@
'); + expect(fixture.nativeElement.firstChild.textContent).toContain('Drew!?@'); // text node + expect(fixture.nativeElement.lastChild.title).toBe('Drew!?@'); // div element }); onlyInIvy('Supporting input changes in hooks is limited in Ivy') @@ -77,9 +77,8 @@ describe('exports', () => { AppComp, '
'); fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML) - .toEqual( - '
'); + expect(fixture.nativeElement.firstChild.id).toBe('Drew!?@'); + expect(fixture.nativeElement.firstChild.title).toBe('Drew!?@'); }); onlyInIvy('Supporting input changes in hooks is limited in Ivy') @@ -98,8 +97,7 @@ describe('exports', () => { const fixture = initWithTemplate(AppComp, '
'); fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML) - .toEqual('
'); + expect(fixture.nativeElement.firstChild.title).toBe('Drew!?@'); }); }); From 54286b8c27ea5cb1cce063272a0ab99af4f81238 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Wed, 6 Mar 2019 10:24:10 -0800 Subject: [PATCH 0233/1073] docs: release notes for the v7.2.8 release --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ca67a7c80..6ec5cc380d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ + +## [7.2.8](https://github.com/angular/angular/compare/7.2.7...7.2.8) (2019-03-06) + + +### Bug Fixes + +* **animations:** ensure `position` and `display` styles are handled outside of keyframes/web-animations ([#28911](https://github.com/angular/angular/issues/28911)) ([86981b3](https://github.com/angular/angular/commit/86981b3)), closes [#24923](https://github.com/angular/angular/issues/24923) [#25635](https://github.com/angular/angular/issues/25635) +* **router:** removed obsolete TODO comment ([#29085](https://github.com/angular/angular/issues/29085)) ([2a25ac2](https://github.com/angular/angular/commit/2a25ac2)) +* **service-worker:** detect new version even if files are identical to an old one ([#26006](https://github.com/angular/angular/issues/26006)) ([5669333](https://github.com/angular/angular/commit/5669333)), closes [#24338](https://github.com/angular/angular/issues/24338) +* **service-worker:** ignore passive mixed content requests ([#25994](https://github.com/angular/angular/issues/25994)) ([b598e88](https://github.com/angular/angular/commit/b598e88)), closes [/github.com/angular/angular/issues/23012#issuecomment-376430187](https://github.com//github.com/angular/angular/issues/23012/issues/issuecomment-376430187) [#23012](https://github.com/angular/angular/issues/23012) + + + # [8.0.0-beta.6](https://github.com/angular/angular/compare/8.0.0-beta.5...8.0.0-beta.6) (2019-02-27) From 9c1ced102e38a759df1a8bc5da88d828353e9da2 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Wed, 6 Mar 2019 10:32:52 -0800 Subject: [PATCH 0234/1073] release: cut the v8.0.0-beta.7 release --- CHANGELOG.md | 24 ++++++++++++++++++++++++ package.json | 4 ++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ec5cc380d..a390d5860f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,27 @@ + +# [8.0.0-beta.7](https://github.com/angular/angular/compare/8.0.0-beta.6...8.0.0-beta.7) (2019-03-06) + + +### Bug Fixes + +* **animations:** ensure `position` and `display` styles are handled outside of keyframes/web-animations ([#28911](https://github.com/angular/angular/issues/28911)) ([a6ae759](https://github.com/angular/angular/commit/a6ae759)), closes [#24923](https://github.com/angular/angular/issues/24923) [#25635](https://github.com/angular/angular/issues/25635) +* **bazel:** add favicon to web package ([#29017](https://github.com/angular/angular/issues/29017)) ([5fdf24e](https://github.com/angular/angular/commit/5fdf24e)) +* **bazel:** Add SHA256 for rules_sass ([#28994](https://github.com/angular/angular/issues/28994)) ([dc33519](https://github.com/angular/angular/commit/dc33519)) +* **bazel:** api extractor don't generate tsdoc metadata ([#29023](https://github.com/angular/angular/issues/29023)) ([b5629d9](https://github.com/angular/angular/commit/b5629d9)) +* **bazel:** ng serve should always watch ([#29032](https://github.com/angular/angular/issues/29032)) ([c532646](https://github.com/angular/angular/commit/c532646)) +* **platform-server:** update minimum domino version to latest released ([#28893](https://github.com/angular/angular/issues/28893)) ([79e2ca0](https://github.com/angular/angular/commit/79e2ca0)) +* **router:** removed obsolete TODO comment ([#29085](https://github.com/angular/angular/issues/29085)) ([72ecc45](https://github.com/angular/angular/commit/72ecc45)) +* **service-worker:** detect new version even if files are identical to an old one ([#26006](https://github.com/angular/angular/issues/26006)) ([586234b](https://github.com/angular/angular/commit/586234b)), closes [#24338](https://github.com/angular/angular/issues/24338) +* **service-worker:** ignore passive mixed content requests ([#25994](https://github.com/angular/angular/issues/25994)) ([48214e2](https://github.com/angular/angular/commit/48214e2)), closes [/github.com/angular/angular/issues/23012#issuecomment-376430187](https://github.com//github.com/angular/angular/issues/23012/issues/issuecomment-376430187) [#23012](https://github.com/angular/angular/issues/23012) + + +### Features + +* **core:** update schematic to migrate to explicit query timing ([#28983](https://github.com/angular/angular/issues/28983)) ([6215799](https://github.com/angular/angular/commit/6215799)) +* **service-worker:** add JSON schema for service worker config ([#27859](https://github.com/angular/angular/issues/27859)) ([3bee0f6](https://github.com/angular/angular/commit/3bee0f6)), closes [#19847](https://github.com/angular/angular/issues/19847) + + + ## [7.2.8](https://github.com/angular/angular/compare/7.2.7...7.2.8) (2019-03-06) diff --git a/package.json b/package.json index 98e5eab9eb..3053a1c2bb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "8.0.0-beta.6", + "version": "8.0.0-beta.7", "private": true, "branchPattern": "2.0.*", "description": "Angular - a web framework for modern web apps", @@ -157,4 +157,4 @@ "resolutions": { "natives": "1.1.6" } -} +} \ No newline at end of file From d5a8be76f22334494dd4816d6110364337c20899 Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 20 Feb 2019 07:35:19 +0100 Subject: [PATCH 0235/1073] build: enable bundle_dts for common package (#28834) PR Close #28834 --- packages/common/BUILD.bazel | 1 + packages/common/http/BUILD.bazel | 1 + packages/common/http/testing/BUILD.bazel | 1 + packages/common/testing/BUILD.bazel | 1 + 4 files changed, 4 insertions(+) diff --git a/packages/common/BUILD.bazel b/packages/common/BUILD.bazel index f1c5a910ef..adcbe28a9e 100644 --- a/packages/common/BUILD.bazel +++ b/packages/common/BUILD.bazel @@ -10,6 +10,7 @@ ng_module( "src/**/*.ts", ], ), + bundle_dts = True, deps = [ "//packages/core", "@npm//rxjs", diff --git a/packages/common/http/BUILD.bazel b/packages/common/http/BUILD.bazel index 575b51476b..14fa7f5810 100644 --- a/packages/common/http/BUILD.bazel +++ b/packages/common/http/BUILD.bazel @@ -12,6 +12,7 @@ ng_module( "src/**/*.ts", ], ), + bundle_dts = True, deps = [ "//packages/common", "//packages/core", diff --git a/packages/common/http/testing/BUILD.bazel b/packages/common/http/testing/BUILD.bazel index 2d69ff6a28..54deee8c82 100644 --- a/packages/common/http/testing/BUILD.bazel +++ b/packages/common/http/testing/BUILD.bazel @@ -12,6 +12,7 @@ ng_module( "src/**/*.ts", ], ), + bundle_dts = True, deps = [ "//packages/common/http", "//packages/core", diff --git a/packages/common/testing/BUILD.bazel b/packages/common/testing/BUILD.bazel index 0c9ead6e05..bf4cfc6bb4 100644 --- a/packages/common/testing/BUILD.bazel +++ b/packages/common/testing/BUILD.bazel @@ -7,6 +7,7 @@ exports_files(["package.json"]) ng_module( name = "testing", srcs = glob(["**/*.ts"]), + bundle_dts = True, deps = [ "//packages/common", "//packages/core", From c5d9035bab9bd75747603fa0d5f5a7f71453bcf1 Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 6 Mar 2019 07:25:16 +0100 Subject: [PATCH 0236/1073] test: fix dts path to the flattened file (#28834) PR Close #28834 --- packages/language-service/test/definitions_spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/language-service/test/definitions_spec.ts b/packages/language-service/test/definitions_spec.ts index 8c0aced320..0d027618c6 100644 --- a/packages/language-service/test/definitions_spec.ts +++ b/packages/language-service/test/definitions_spec.ts @@ -64,7 +64,7 @@ describe('definitions', () => { it('should be able to find a pipe', () => { reference( - 'async_pipe.d.ts', + 'common.d.ts', ` @Component({template: '
'}) export class MyComponent { input: EventEmitter; }`); }); From 6b98b534c86fbd34c60a303def3d2ff9615e1e92 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 27 Feb 2019 17:26:10 +0000 Subject: [PATCH 0237/1073] docs: update ivy opt-in flag (#29010) Followup to https://github.com/angular/angular/pull/28569#issuecomment-467380883 and https://github.com/angular/angular-cli/pull/13773. Note: this flag will only work on `@angular/cli@8.0.0-beta.3` (currently unreleased) and above. PR Close #29010 --- aio/content/guide/ivy.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aio/content/guide/ivy.md b/aio/content/guide/ivy.md index f2e8982e0f..d409966791 100644 --- a/aio/content/guide/ivy.md +++ b/aio/content/guide/ivy.md @@ -5,10 +5,10 @@ ## Starting a new project using Ivy -To start a new project with Ivy enabled, use the `--experimental-ivy` flag with the [`ng new`](cli/new) command: +To start a new project with Ivy enabled, use the `--enable-ivy` flag with the [`ng new`](cli/new) command: ```sh -ng new shiny-ivy-app --experimental-ivy +ng new shiny-ivy-app --enable-ivy ``` Everything will be configured for you: From 7102ea80a91edeecc1645ebe108033c8cb63e4d3 Mon Sep 17 00:00:00 2001 From: Adam Bradley Date: Tue, 5 Mar 2019 16:30:45 -0600 Subject: [PATCH 0238/1073] feat(platform-server): wait on returned BEFORE_APP_SERIALIZED promises (#29120) This update gives external tooling the ability for async providers to finish resolving before the document is serialized. This is not a breaking change since render already returns a promise. All returned promises from `BEFORE_APP_SERIALIZED` providers will wait to be resolved or rejected. Any rejected promises will only console.warn(). PR Close #29120 --- packages/platform-server/src/utils.ts | 29 ++++++-- .../platform-server/test/integration_spec.ts | 73 +++++++++++++++++++ 2 files changed, 97 insertions(+), 5 deletions(-) diff --git a/packages/platform-server/src/utils.ts b/packages/platform-server/src/utils.ts index a4272e9f44..dc43b7c201 100644 --- a/packages/platform-server/src/utils.ts +++ b/packages/platform-server/src/utils.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ApplicationRef, NgModuleFactory, NgModuleRef, PlatformRef, StaticProvider, Type} from '@angular/core'; +import {ApplicationRef, NgModuleFactory, NgModuleRef, PlatformRef, StaticProvider, Type, ɵisPromise} from '@angular/core'; import {ɵTRANSITION_ID} from '@angular/platform-browser'; import {first} from 'rxjs/operators'; @@ -45,12 +45,18 @@ the server-rendered app can be properly bootstrapped into a client app.`); .then(() => { const platformState = platform.injector.get(PlatformState); + const asyncPromises: Promise[] = []; + // Run any BEFORE_APP_SERIALIZED callbacks just before rendering to string. const callbacks = moduleRef.injector.get(BEFORE_APP_SERIALIZED, null); if (callbacks) { for (const callback of callbacks) { try { - callback(); + const callbackResult = callback(); + if (ɵisPromise(callbackResult)) { + asyncPromises.push(callbackResult); + } + } catch (e) { // Ignore exceptions. console.warn('Ignoring BEFORE_APP_SERIALIZED Exception: ', e); @@ -58,9 +64,22 @@ the server-rendered app can be properly bootstrapped into a client app.`); } } - const output = platformState.renderToString(); - platform.destroy(); - return output; + const complete = () => { + const output = platformState.renderToString(); + platform.destroy(); + return output; + }; + + if (asyncPromises.length === 0) { + return complete(); + } + + return Promise + .all(asyncPromises.map(asyncPromise => { + return asyncPromise.catch( + e => { console.warn('Ignoring BEFORE_APP_SERIALIZED Exception: ', e); }); + })) + .then(complete); }); }); } diff --git a/packages/platform-server/test/integration_spec.ts b/packages/platform-server/test/integration_spec.ts index 3bac6084ad..5c364efd85 100644 --- a/packages/platform-server/test/integration_spec.ts +++ b/packages/platform-server/test/integration_spec.ts @@ -57,6 +57,24 @@ function getMetaRenderHook(doc: any) { }; } +function getAsyncTitleRenderHook(doc: any) { + return () => { + // Async set the title as part of the render hook. + return new Promise(resolve => { + setTimeout(() => { + doc.title = 'AsyncRenderHook'; + resolve(); + }); + }); + }; +} + +function asyncRejectRenderHook() { + return () => { + return new Promise((_resolve, reject) => { setTimeout(() => { reject('reject'); }); }); + }; +} + @NgModule({ bootstrap: [MyServerApp], declarations: [MyServerApp], @@ -81,6 +99,39 @@ class RenderHookModule { class MultiRenderHookModule { } +@NgModule({ + bootstrap: [MyServerApp], + declarations: [MyServerApp], + imports: [BrowserModule.withServerTransition({appId: 'render-hook'}), ServerModule], + providers: [ + { + provide: BEFORE_APP_SERIALIZED, + useFactory: getAsyncTitleRenderHook, + multi: true, + deps: [DOCUMENT] + }, + ] +}) +class AsyncRenderHookModule { +} +@NgModule({ + bootstrap: [MyServerApp], + declarations: [MyServerApp], + imports: [BrowserModule.withServerTransition({appId: 'render-hook'}), ServerModule], + providers: [ + {provide: BEFORE_APP_SERIALIZED, useFactory: getMetaRenderHook, multi: true, deps: [DOCUMENT]}, + { + provide: BEFORE_APP_SERIALIZED, + useFactory: getAsyncTitleRenderHook, + multi: true, + deps: [DOCUMENT] + }, + {provide: BEFORE_APP_SERIALIZED, useFactory: asyncRejectRenderHook, multi: true}, + ] +}) +class AsyncMultiRenderHookModule { +} + @Component({selector: 'app', template: `Works too!`}) class MyServerApp2 { } @@ -699,6 +750,28 @@ class HiddenModule { called = true; }); })); + + it('should call async render hooks', async(() => { + renderModule(AsyncRenderHookModule, {document: doc}).then(output => { + // title should be added by the render hook. + expect(output).toBe( + 'AsyncRenderHook' + + 'Works!'); + called = true; + }); + })); + + it('should call multiple async and sync render hooks', async(() => { + const consoleSpy = spyOn(console, 'warn'); + renderModule(AsyncMultiRenderHookModule, {document: doc}).then(output => { + // title should be added by the render hook. + expect(output).toBe( + 'AsyncRenderHook' + + 'Works!'); + expect(consoleSpy).toHaveBeenCalled(); + called = true; + }); + })); }); describe('http', () => { From dc6192c8e55edd8c59a66c3eadcf71ced5b0a809 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Tue, 5 Mar 2019 17:55:11 -0800 Subject: [PATCH 0239/1073] fix(ivy): properly detect "inputs" and "outputs" field names that should be wrapped in quotes (#29126) Prior to this change, the RegExp that was used to check for dashes in field names used "g" (global) flag that retains lastIndex, which might result in skipping some fields that should be wrapped in quotes (since lastIndex advanced beyond the next "-" location). This commit removes this flag and updates the test to make sure there are no regressions. PR Close #29126 --- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 25 ++++++++++++++----- packages/compiler/src/render3/view/util.ts | 2 +- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 3caa96181e..6aaf47e99e 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -2167,21 +2167,34 @@ describe('ngtsc behavioral tests', () => { it('should wrap "inputs" and "outputs" keys if they contain unsafe characters', () => { env.tsconfig({}); env.write(`test.ts`, ` - import {Directive} from '@angular/core'; + import {Directive, Input} from '@angular/core'; @Directive({ selector: '[somedir]', - inputs: ['input-track-type', 'inputTrackName'], - outputs: ['output-track-type', 'outputTrackName'] + inputs: ['track-type', 'track-name', 'inputTrackName'], + outputs: ['output-track-type', 'output-track-name', 'outputTrackName'] }) - export class SomeDir {} + export class SomeDir { + @Input('track-type') trackType: string; + @Input('track-name') trackName: string; + } `); env.driveMain(); const jsContents = env.getContents('test.js'); const inputsAndOutputs = ` - inputs: { "input-track-type": "input-track-type", inputTrackName: "inputTrackName" }, - outputs: { "output-track-type": "output-track-type", outputTrackName: "outputTrackName" } + inputs: { + "track-type": "track-type", + "track-name": "track-name", + inputTrackName: "inputTrackName", + trackType: ["track-type", "trackType"], + trackName: ["track-name", "trackName"] + }, + outputs: { + "output-track-type": "output-track-type", + "output-track-name": "output-track-name", + outputTrackName: "outputTrackName" + } `; expect(trim(jsContents)).toContain(trim(inputsAndOutputs)); }); diff --git a/packages/compiler/src/render3/view/util.ts b/packages/compiler/src/render3/view/util.ts index 1e533b204e..3e51ebc1bc 100644 --- a/packages/compiler/src/render3/view/util.ts +++ b/packages/compiler/src/render3/view/util.ts @@ -21,7 +21,7 @@ import {isI18nAttribute} from './i18n/util'; * TODO(FW-1136): this is a temporary solution, we need to come up with a better way of working with * inputs that contain potentially unsafe chars. */ -const UNSAFE_OBJECT_KEY_NAME_REGEXP = /-/g; +const UNSAFE_OBJECT_KEY_NAME_REGEXP = /-/; /** Name of the temporary to use during data binding */ export const TEMPORARY_NAME = '_t'; From 268c3fe81646575bf7dc8a7fd8d6ff230852e0ee Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Fri, 15 Feb 2019 15:13:56 +0100 Subject: [PATCH 0240/1073] test(ivy): failing test for FW-1064 (#29130) PR Close #29130 --- packages/core/test/debug/debug_node_spec.ts | 33 +++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/packages/core/test/debug/debug_node_spec.ts b/packages/core/test/debug/debug_node_spec.ts index 5519e18e07..24c31459af 100644 --- a/packages/core/test/debug/debug_node_spec.ts +++ b/packages/core/test/debug/debug_node_spec.ts @@ -329,6 +329,39 @@ class TestCmpt { expect(getDOM().hasClass(childTestEls[3].nativeElement, 'childnested')).toBe(true); }); + it('should query projected child elements by directive', () => { + @Directive({selector: 'example-directive-a'}) + class ExampleDirectiveA { + } + + @Component({ + selector: 'wrapper-component', + template: ` + + ` + }) + class WrapperComponent { + } + + TestBed.configureTestingModule({ + declarations: [ + WrapperComponent, + ExampleDirectiveA, + ] + }); + + TestBed.overrideTemplate(TestApp, ` +
+ +
`); + + const fixture = TestBed.createComponent(TestApp); + fixture.detectChanges(); + + const debugElement = fixture.debugElement.query(By.directive(ExampleDirectiveA)); + expect(debugElement).toBeTruthy(); + }); + it('should list providerTokens', () => { fixture = TestBed.createComponent(ParentComp); fixture.detectChanges(); From 22ddbf4b0281095a5b459568e671f9e37139336b Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 6 Mar 2019 14:01:02 +0100 Subject: [PATCH 0241/1073] fix(ivy): content projection should not corrupt TNode data structures (#29130) PR Close #29130 --- packages/core/src/render3/instructions.ts | 13 +++--- packages/core/src/render3/interfaces/node.ts | 8 ++++ .../core/src/render3/node_manipulation.ts | 12 +++--- .../linker/projection_integration_spec.ts | 40 ++++++++++++++++++- 4 files changed, 59 insertions(+), 14 deletions(-) diff --git a/packages/core/src/render3/instructions.ts b/packages/core/src/render3/instructions.ts index d40746a4e4..495c26b244 100644 --- a/packages/core/src/render3/instructions.ts +++ b/packages/core/src/render3/instructions.ts @@ -1308,6 +1308,7 @@ export function createTNode( outputs: undefined, tViews: null, next: null, + projectionNext: null, child: null, parent: tParent, stylingTemplate: null, @@ -2550,26 +2551,24 @@ export function projectionDef(selectors?: CssSelectorList[], textSelectors?: str if (!componentNode.projection) { const noOfNodeBuckets = selectors ? selectors.length + 1 : 1; - const pData: (TNode | null)[] = componentNode.projection = + const projectionHeads: (TNode | null)[] = componentNode.projection = new Array(noOfNodeBuckets).fill(null); - const tails: (TNode | null)[] = pData.slice(); + const tails: (TNode | null)[] = projectionHeads.slice(); let componentChild: TNode|null = componentNode.child; while (componentChild !== null) { const bucketIndex = selectors ? matchingSelectorIndex(componentChild, selectors, textSelectors !) : 0; - const nextNode = componentChild.next; if (tails[bucketIndex]) { - tails[bucketIndex] !.next = componentChild; + tails[bucketIndex] !.projectionNext = componentChild; } else { - pData[bucketIndex] = componentChild; + projectionHeads[bucketIndex] = componentChild; } - componentChild.next = null; tails[bucketIndex] = componentChild; - componentChild = nextNode; + componentChild = componentChild.next; } } } diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index 4f8ac12766..7e4af970fc 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -283,6 +283,14 @@ export interface TNode { */ next: TNode|null; + /** + * The next projected sibling. Since in Angular content projection works on the node-by-node basis + * the act of projecting nodes might change nodes relationship at the insertion point (target + * view). At the same time we need to keep initial relationship between nodes as expressed in + * content view. + */ + projectionNext: TNode|null; + /** * First child of the current node. * diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 59322330d5..2fb868b5e0 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -84,7 +84,7 @@ const projectionNodeStack: (LView | TNode)[] = []; */ function walkTNodeTree( viewToWalk: LView, action: WalkTNodeTreeAction, renderer: Renderer3, - renderParent: RElement | null, beforeNode?: RNode | null) { + renderParent: RElement | null, beforeNode?: RNode | null): void { const rootTNode = viewToWalk[TVIEW].node as TViewNode; let projectionNodeIndex = -1; let currentView = viewToWalk; @@ -141,11 +141,11 @@ function walkTNodeTree( if (nextTNode === null) { // this last node was projected, we need to get back down to its projection node - if (tNode.next === null && (tNode.flags & TNodeFlags.isProjected)) { + if (tNode.projectionNext === null && (tNode.flags & TNodeFlags.isProjected)) { currentView = projectionNodeStack[projectionNodeIndex--] as LView; tNode = projectionNodeStack[projectionNodeIndex--] as TNode; } - nextTNode = tNode.next; + nextTNode = (tNode.flags & TNodeFlags.isProjected) ? tNode.projectionNext : tNode.next; /** * Find the next node in the TNode tree, taking into account the place where a node is @@ -158,7 +158,7 @@ function walkTNodeTree( // If parent is null, we're crossing the view boundary, so we should get the host TNode. tNode = tNode.parent || currentView[T_HOST]; - if (tNode === null || tNode === rootTNode) return null; + if (tNode === null || tNode === rootTNode) return; // When exiting a container, the beforeNode must be restored to the previous value if (tNode.type === TNodeType.Container) { @@ -176,7 +176,7 @@ function walkTNodeTree( */ while (!currentView[NEXT] && currentView[PARENT] && !(tNode.parent && tNode.parent.next)) { - if (tNode === rootTNode) return null; + if (tNode === rootTNode) return; currentView = currentView[PARENT] as LView; tNode = currentView[T_HOST] !; } @@ -755,7 +755,7 @@ export function appendProjectedNodes( nodeToProject.flags |= TNodeFlags.isProjected; appendProjectedNode(nodeToProject, tProjectionNode, lView, projectedView); } - nodeToProject = nodeToProject.next; + nodeToProject = nodeToProject.projectionNext; } } } diff --git a/packages/core/test/linker/projection_integration_spec.ts b/packages/core/test/linker/projection_integration_spec.ts index 65a2233fdc..9ef90d3195 100644 --- a/packages/core/test/linker/projection_integration_spec.ts +++ b/packages/core/test/linker/projection_integration_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, ComponentFactoryResolver, ComponentRef, Directive, ElementRef, Injector, NgModule, OnInit, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation} from '@angular/core'; +import {Component, ComponentFactoryResolver, ComponentRef, Directive, ElementRef, Injector, Input, NgModule, OnInit, TemplateRef, ViewChild, ViewContainerRef, ViewEncapsulation} from '@angular/core'; import {ComponentFixture, TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser/src/dom/debug/by'; import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; @@ -224,6 +224,44 @@ describe('projection', () => { expect(main.nativeElement).toHaveText('(, BC)'); }); + it('should redistribute non-continuous blocks of nodes when the shadow dom changes', () => { + @Component({ + selector: 'child', + template: + `()` + }) + class Child { + @Input() showing !: boolean; + } + + @Component({ + selector: 'app', + template: ` +
A
+ B +
A
+ B +
` + }) + class App { + showing = false; + } + + TestBed.configureTestingModule({declarations: [App, Child]}); + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + + expect(fixture.nativeElement).toHaveText('BB()'); + + fixture.componentInstance.showing = true; + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('BB(AA)'); + + fixture.componentInstance.showing = false; + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('BB()'); + }); + // GH-2095 - https://github.com/angular/angular/issues/2095 // important as we are removing the ng-content element during compilation, // which could skrew up text node indices. From f96efd1c98e8dc5258948a887b42e7f1df92629f Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 6 Mar 2019 14:23:46 +0100 Subject: [PATCH 0242/1073] test(ivy): enable passing MatChipList tests (#29130) PR Close #29130 --- .../angular_material_test_blocklist.js | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 9e14aa13a7..62b5e714e0 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -173,26 +173,6 @@ window.testBlocklist = { "error": "TypeError: Cannot read property 'focus' of undefined", "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" }, - "MatChipList FormFieldChipList keyboard behavior should maintain focus if the active chip is deleted": { - "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" - }, - "MatChipList FormFieldChipList keyboard behavior when the input has focus should not focus the last chip when press DELETE": { - "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" - }, - "MatChipList FormFieldChipList keyboard behavior when the input has focus should focus the last chip when press BACKSPACE": { - "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" - }, - "MatChipList FormFieldChipList should complete the stateChanges stream on destroy": { - "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" - }, - "MatChipList FormFieldChipList should point the label id to the chip input": { - "error": "TypeError: Cannot read property 'nativeElement' of null", - "notes": "FW-1064: debugElement.query does not find directive when that directive precedes another" - }, "MatChipList with chip remove should properly focus next item if chip is removed through click": { "error": "TypeError: Cannot read property 'focus' of undefined", "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" From 0bd4261f232c10221790626ae085e84403c40c82 Mon Sep 17 00:00:00 2001 From: Marc Laval Date: Wed, 6 Mar 2019 15:57:20 +0100 Subject: [PATCH 0243/1073] test(ivy): diagnose root causes of failures in MatSnackBar (#29134) PR Close #29134 --- tools/material-ci/angular_material_test_blocklist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 62b5e714e0..311ee77723 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -291,7 +291,7 @@ window.testBlocklist = { }, "MatSnackBar with TemplateRef should be able to open a snack bar using a TemplateRef": { "error": "Error: Expected ' Fries Pizza ' to contain 'Pasta'.", - "notes": "Unknown" + "notes": "FW-842: View engine dirty-checks projected views when the declaration place is checked" }, "MatTooltip special cases should clear the `user-select` when a tooltip is set on a text field": { "error": "Error: Expected 'none' to be falsy.", From 887faffa256dd6bdc708fb853db4a7a47a5e4af1 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Fri, 22 Feb 2019 11:16:21 -0800 Subject: [PATCH 0244/1073] docs: cleanup contributors (#28930) - remove individuals from @angular/* package.json, we don't keep them up-to-date - switch keys in contributors.json to GitHub handles, seems like a better identifier and lets us grab avatar images from GitHub account - move emeritus ppl to a new Alumni group (won't yet appear on the site) - add "lead/mentor" keys so we know who is coordinating work - add a script that generates an "org chart" graphic PR Close #28930 --- aio/content/images/bios/alan-agius4.jpg | Bin 0 -> 31990 bytes aio/content/images/bios/clydin.jpg | Bin 0 -> 14956 bytes aio/content/images/bios/gregmagolan.jpg | Bin 0 -> 14825 bytes aio/content/images/bios/kyliau.jpg | Bin 0 -> 36247 bytes aio/content/marketing/README.md | 34 +++ aio/content/marketing/about.html | 4 +- aio/content/marketing/contributors.json | 228 ++++++++---------- .../contributors/generate_org_chart.sh | 7 + aio/scripts/contributors/org_chart.jq | 11 + .../populate_missing_contributor_fields.sh | 32 +++ packages/benchpress/package.json | 5 +- packages/compiler-cli/package.json | 6 +- 12 files changed, 194 insertions(+), 133 deletions(-) create mode 100644 aio/content/images/bios/alan-agius4.jpg create mode 100644 aio/content/images/bios/clydin.jpg create mode 100644 aio/content/images/bios/gregmagolan.jpg create mode 100644 aio/content/images/bios/kyliau.jpg create mode 100644 aio/content/marketing/README.md create mode 100755 aio/scripts/contributors/generate_org_chart.sh create mode 100644 aio/scripts/contributors/org_chart.jq create mode 100755 aio/scripts/contributors/populate_missing_contributor_fields.sh diff --git a/aio/content/images/bios/alan-agius4.jpg b/aio/content/images/bios/alan-agius4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..da3c78b6e021c624dad26c146fe04c8cfb46fc62 GIT binary patch literal 31990 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 literal 0 HcmV?d00001 diff --git a/aio/content/images/bios/clydin.jpg b/aio/content/images/bios/clydin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c38da1e884381448296becd439a4151438e4b964 GIT binary patch literal 14956 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 literal 0 HcmV?d00001 diff --git a/aio/content/images/bios/gregmagolan.jpg b/aio/content/images/bios/gregmagolan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e39f55259dfd56287a9498da7b4040d7291868f4 GIT binary patch literal 14825 zcmbW8WmFsCx9$T00+d3r0>ul(-I`E>RIuV+ph$5oAvndMLPKzE2(-8acZwBAa41@& z6i;z44wwHqcb#=V-h202Ghb#t%x~>?=6&|F_uTxtnFT}wNJ&UQB*dg35QvP7l$?U@ zF2$WY6ihUk>9xoAS3_+35kHj#6(25cLv>F0}xRY({PF_k;@bOc0LSj;KN@`kq#2$mDM%;-}R0CgTtfaeh00L@%%}CpId72(f)ss{)_1U z4k-Npi|BuV{)gvg20#HMxJ?+48lV7JmxI>z^>Tq}+J-sV3hEa}n*sx)T;V86!9L+j zeH$`DvxbQPbbgad$bFO9b^Q%(F&9TJ5mk^dG88tqZ^GBhN~s%2wLfsMd7huVc!x># zLjNlNZ0hul<)Zuzpi3oKu&M4n-$Nv$4!2nLa~(0lux|h1&Oo)b_ZQs{qGPv(EnfG9 z;87fVpvCroge^4ubo|i9X^7l2j@4XQ~B!*$4c6vU+yUyY|Iy052>tUhL$cUFneG8vvJy1-JQ( zXa%M`s;U%ACDEz0&k(+p8RiJo6DlQMk>| zwpPhVNe!;iPKT-BGn{~#nCcBZ9 zzf(9<(E+g-SLLtaRbm1jO043#186Lz1aj5w1?=m5mik}Y8$hhfv+MTKC&xpdL$-2n z0J8H~SJ$4+)$)VlK!%r|zh3v<6+=8o3mTHuC+k_p*t++m*;-9JZMJNM3d~FRLD-V- z5KOT|I}!o8*}z|iPxS=vPVcHyfd>J~l3@*={0ZL6<#`&@+mkugVTqHWGE%Fed0&Z^ z<72VkQs(Z8ED*DjT?t_09y|A?S=!-NM34A0~T`aGEx*ibMn zfP190OZpVd_Eeh;Y>q5k*T!&wXqX?pIdk?<={gF+FDASeJ4q1foY74$c0Eg?fN7 zXWqv3_30@*{%x<#odMH$CveN>#jt}n`h&oCk!t=l56$SJ7D8|L7N!l??s?QFg3 zXlBlAP?XI&ya7z^>iw=45ZHaD&}Ak+P&fpn9zjn;xGa72YQC#H#F$~+$ma_T6~6&& z7B^wPB@P+%S?K+;%4K0!ga%z0NkzCm(Nzp?@v|&1Dif$J|Mq14XWd1zsJjSnqeF_{ z31qHE<=NSoO-*LINl$$6-Y+GE)Q~*hUq-&|-jJ1Q2Of-)&E4-g3{*_4&vnHWhALbq zxWqAQNIe5F{38#g;X`)ydW!cNDq^odIpu?=52oUNtABOdp|RU46Z;dte)<6U#7)`I zbp{J6da5ZBWn$(?BggFj3Uqn+2DWSVkD=Q1Y5CpZ6p$V>UvTn=mEX$QYK*`Fn9%}= zvy3HK`yc%BeDsA`<8%ims9L=td`T7+%M+!@LA3WRbw42 zzIAbeSY;lQPERp-2Yye^_-*#a{_Az!&bC!W85(V-?cuZSnX+>etijeUZLx*oQkpT7 zw7}ILJdPb7?L-&(+!!f4E|TURa6Z1>UYN^0LgY-M#Sa^N44^n4MW$~#60rIe_H?VN zb>K|Hs#Meg^FQBvbsS5}#lNlhy54)3{WH}a1-ei!bDw6eKk+YFFDx%wlg&?mREnYh z!EQ72weCgqsI5hqQu&M4s+!3yMt36WPRi^l5Kkg3H>jBZz@WVEy3KTWx}mus8^X_3 zTG410cp-LK@)Ue2P--h*R2biWsH`B62UnObuW^Yu(W3vjK8nej+c;SS*a?-Ap3n(| zd|x||XpQkt+dU*0XZwIL3iPERdw6C`K|+ROJBDZTIuRjk(E>T`?gzuWnCFCrnR?MFV*GS}PeL2yJljfqm=RwV zk_Yb74Io#Ow)bFYx}Q@JGdi348BC+n1HMwxdS7Ux@S!ZYc70U5_l>+&Lx)Wq%wX4R zmi2jg7GPesFH6w--{x!Tt|v1pauu6?)x+&Y$pJ?B)!$+`7iLAj&^6A+hc`f&imCHG zLZ}YUrqmM>njotT4E9hG`PPZf)3#UekVnbi8|*k=cPy&ZpHBI59xTR(F^7vYLHB|- zdqlQ#iCS?!KD}VZ<1PQq$wruDRprm9sNY@ThVSK+72iO7n3gZEy}haPVr&c^%IAGr zjeWb>?ZEwrt|sCRI(h6g_=nm0@(jY5OGt&W3?#_9Z|uXbvUqXv@nu)+uywbAEOd(| zDT)3D;1qWKdUJYvi-s|oUKz0PCij8i_pY6fGRkD#cH45uS|wjOqt!B@@JA@K-c5cj z=swc<>WlMRQuLwD{eOS`?abM&pdsfI8;O2eql#^f!yLdG79+Omg)lkTReW0@vjc@k zOAwzSwMc~76O>TBy^ zSX|H7=GLi6g*Y(h7`e(Q&dECPo*M=}g(fwn$Is2rlBBcob)2av1ftP50QE}RC+zjg z-*^zgXEsclxd-Yetdi?-&cezwoBB;=ZZe`GqYA%2z{qXhD+1`9# zx9T3K1>p8Krm3SPZDNf{4_YGHxusd!IjRwyTZGKX#^soT}lkdSeDka1m}6oGb0 z4PE&lLz+@$W*4p4D89yCpnUoumtLUNpV|BI;e=wr5vXnHpZnh{xhpr+)*4^S_06C> z_qYgBQ6A#2wE=rtRBRKfDe5`ggak*7yV@Gz&CQgma(HN)=||rm_*o>eW-o^z1qF2i z)RFNQ;w_Mo?Qy4=+>v#h(n%40g7PDPko>-Ws6XxoV3F8k_~s{T*owqGKquP`pdX`^ zWs%kVtz)j^>6^y@zwUsI@@HpLiJQH=m)ySl z6%e(LKskab1&rNiQ|3jpHOC08iXg26aJ#@`>rY4JrlVe`LT+6!4o24IDXzsQVqAd; zex`Qt=AiFAb;1=-HLPHN(XZn|jI@+N@k;#QOS+8~lK{#9L&r)UQqB)rl+G(g*{Ji3 zh_5E70rF*Du2!e7{dgD$TX?>iPHqS_v}n*RL2|a%uuRQBG^6{K(so9mlhI+Bh4eg$ zWTG(*eGidg7)`l;d%@NYzh+KG+ui_tR`ugRRBB@4AWY>MdQ6v^j_N&uGI1b_cy1by z$QEX<@OgXYk3oIrGos-Ey5-ejh2@vi4e|U%I~pmzV(TNe#nRt@Xoek_dvzRbq5_S^ zBPfDflhXk*Q@ZQ>GKb7SF17{^`YS5SfN}SN2prr@KZsI2H^^^S7lkLu?G`&;H?oz+ zQnftqR4@%>o6eUMfh*qSijJC+%j(Nj@I@Yt9a7d1;0Es6JC;|Y3hF)_oiYrMC+k9N<8nVT#s+^k zNRjP*?)TQlv5X6BCCeU=@#Av6E~TFNap9v^LB(YS9;v1g1M$QZC6fhZD~D2j^XBQ? zWdKHw^9utJvK3$hKNIeq;hFpQ{-+3E&1NPJ&nIg|6_g(U9^x5yBgYJL&^$EvN}19@ zoS)3$N1LxTY^(TqBLT(J02{UfD1RrHoUPCDtkJ22`$916mcl)tab==U=ssw_Caj ziFLC31<)b|qne+vjxYMJL?24n=BwuE zFM_`rY5h74{Oe5q!mDDJI1Y{6jxA{y?Y_L=B)f>30-yVodH6XPO^DE_d4I}HHm^Gv zC|M7cL{J#*#4ZNCRYS-HTxOSrc>VdV^6zX&W&9213AYVjbB*r<&5@Qm;T1U=(fLp3 z(e3*^)HAahxx25F$2JtM41b!ulxlw97p{qrnNR^_$)Lyo?**)X1Z`+KGgSC z%Nr%0e1$W%zA_mwP(7|#i91w8J$^$%Y-v3_R#=SFRFh_^1;tfFVL7369)Rlx4FCSa zt{-A~%M|SaH-PvoZ1NLVfeI&hQnWiy&Or}^-l}L*Hy$l%%CbUC#oO|{M{?IleR*A1 z464jWc)y2LK*$CnXEl)^(RzG`l9G>b=l$GVxpnj??;5Vf-U(->bp7Eez! z&>CgU#&_!{D~qHx;bM_2tNqj_5eTniCah!X%BPP*V?E5ua5X`KAK|iD<#fGlDxV3) z-P?y@qlHzP4CD*ns>PXvvzq^8mBC(1w-Oc+Ig|lz017L{!f&c(EoXCeNy6&M@`gxR zOA6~;AMSbj6+abH>Emn%LC?qMKM*Z=Ef}bcAF~FaZU9-=wHhT2)g(}5kaf2>ttdBa z#KBi;|6m)25C;U{FQcu9mEqyAVYx#+#zPs|vd%bF94|^Ik~*tNJPNqNl{hAKv;jYe z*a%!oDpFK&CxQLaD+d9;64|1kOpxN`%nPQ<_V^I;!gvnfN(~ zL&1QeGEecN&CSOsdC62@f^KQeh(%|E`es zdnn4>wY-dtk2QVkbL#lH({kP@GGyj1x2adNgJ=8-BNKh> z`eer2>~lQ0;c|Eml z`z61$s>WR7t(5~iDxHQr6;#K6(Sf4{rLWh|4a+4gwyz18&!KBiIhVVaiYX<5^(Wh zScO|3vO(I}m-9}AaE&M7fwE+`Ve+jkUO+65fuSX%;5(DzRY`nb6N_dPLuPxja5{mkkhh#@ag){i>jy<$d!mZoJ0Z$>VU<8!Ddc(~6w=*u!z)yUn9m+LY( zS&!G+!&kJ=XNwCB8wydc%YxtO<-oJXh;bY6sQ&&H9$C===|B%733`<2EQC`%BYMF=8uoVwxSQ`$=j%E=GJ znGq!s$nOu<9x}3D1#IN)vD5}jjCvKN$^``&sEy|9j+`6T7iCD66I_^ZP=saS%>w*L zL?w9vgdqamEpDlW;Ft1o@D3ujZ&gx7HlshxobRc5Mz@!4c&ZbO zAP#3ozfm`ipEc#X{Izr%OYQTa=_2ETsuW@-n^OFrf8`-3p?kZiGQuV(GPL>9@nOc3 z<}}~R0r=Cdu|d0W-%dBeF;K91lWksPL7L&hg@zpAoi?(5T9g~M-MipiX@ zG8Xfe66yx(h>g4Y^{;~uPUq(4G5ILeGZ#9=noN&Zv0PL1U-Qi(;IM$-B;vywu=C@h zBsXEu!07n8n<~Dj<7n4#$NNz|+Mb%h?_c4Qh9SwT0D~0B!5sw>BM2L|LViRgeJp<{G=#4hq`rNR1qGHyCi_~)EpO1*%VU+HFVmk|yn z=~3%W+e8t&b6ooJ)8%G(*Y&m^+i}Xn;ylgX)DL;vc6~~G)H8M311fBd#WFsXGlDBA z4z3A7&JJm6{EsS1X5PcF=4BzK2R7b08v&zJPbWt^<<3{o$EMzYsJR$HkjB+ZHCegXw&T{+iM&&J{9;s_Waywa~BdWs#p`XpzHI;89} zicIWysV+0VKDr2`|5_f`ZJ@>1bykzmGN=U>#8Dn22N8FLyYgc1QY4QilVuIquEPqz zjrYKv(Tj3>%_7BTXTD-zsjUUy8`$^O|y z2~tmJm^Z^DnQ4fDRbU)O6fNjMssofZtVHxD^e16er1Rqsx+~OrhqJp)qmIQgHC^Qc zli!O?D(k}&*enQ4X!?@#pdDM1?O`C%}4_(6VD>Q{BDZvSRc9HXFH)byB@rNNf9nJ%PmSAoK&?Y*4sLL!RBw`=ycp#p326BBzv|pH5^Ro#KgV~ z*T%or9iIJmK9yN}1Ni4QUvPy*MVw7^VtP~K*J&+DYeqhX1oHj35)?2e)o_L#ENbdk zC#Yr93QcxSnw3o6qZ*(<)8`pu;%(;h+@BcN4)`Ul_WU{}HKGUJ_-thy3>|=iKL8%m%bWV_ApMnYQfB zPlN5vleyu@HjA1rZC9+{$IPelF9j0+`ay%=mvVT_RwjN=kQ`x?Jl%6{$h09xbOS49 z7T8*%Ug22JIWoBeD&Wkwczcf@{9Ve7-CDa)dS34RHl-1I4;wrTd*n#y6bJhqp<(TwUy)u zr{%wlxs`F|p;UR^dKQ}ymv^cSp~zyDMI)Vy=Yd1YCc@o`~t>73Zxp^}G)C;>Q<${k#;@Zd-#FBM~J2Tcm=f3AGc3`2!O zamOVyZkH9RzNL}0Smgx;YNNH!fO|Qh)39A#B_?C;GO~pjT*jiFL-v9*tKLJOIyka@ z;=)ad$M8Alha%pG+4ZrW+h=A7>R4QhQ>SxL3Mr6MJWMBdmL<_F4{oqC(*Tc3YVdkVh0YqZS2}ZS-^b*h-Zc@mYUWmLilsRbvm-qA9aAM>jXP*IMwj#CU0n?d9;ZO$Y!%U?^@w4@|c#K%< zJU=^Qx7f-9fXZ8~TDE0$z{nX?cHA5f%+9v`u&L8OhJhR+L$16no}m!?>x%c(y1P`a ziVsWjl=tb!B>+0V2}5L$ULt8E(Y};|1GVXsqBOso?G#b8=lW(ZNAAZcNMafr&mMr& z1g)a}L5o{HC3D=7L)(UCVk>PYxcqYuR&k2tur*J*%Fh607z&y9KjV1v@RT*(w$A8gI61c{Y5Dr5kAMBP5lR{WY1*9Kw z1nB^?1_=t7J^6BW8Hb!4%El`Q#Gm7%>)kKx`+Ct`=u6-HNLTCy1Mm)3l{ZukNACn{ zi1YB@&MH4B{c9s%k-a0PiJ3@ke60}Df#gF2eV$OibB`4K+gW4lgL(N*;b6E;T(ehfZR760J^_Vv%yQm1m9zO=G5Ylf2>PLq-X9t*4ryA+IXUeD;*L)JQ!z1pb1A2?of zfsojLh(sYhLLPiw9=HLB9HPH!LC6KPXU z*y$;J3i*5lb*WCoq3MjHNXpsHDl6X=^zc^04z9f=B2$+18f%4z2CO`_B-d4|!?g&& zC8D(aodnx|Ra^u0Wwy5jgd|A5u>S~7CQD2FfildQJ1IN`t>e&v zY)QxSD}Oz0+D+9Lsv2>Y8Ku18M^*~UzuRbE(^8J3_|BRqcrKz+ZG@K<_=o0iyYFq} zm^j9FpHU~*qFS|2RKG^@6~LIIkJ*l2f7q2o;X$mL01IT`N8#ZlGq}~x>+cj-e{gwv zpZ>kP#*C-F0e9RP56N;)er=enN^~nIt&=&}{4d)cIKMj~ji&1J?5x<0hRrFLzO9Lm z?>kT%k{r~q^ytGf;vGSU!|Mj`+Oui=w{dhu@@u;B9m861Q|_1cU7m}5iIKld4*!(X z!?a!`uecy-O?(VyUOT>OM*zH+vbVRx9 zQYHJc=2BO5#-ki_inCF<;mY>`QCO8FO~WXg@#AcgPrl6`b$umeJWvtn)>`~|LG%%Z zd`2ck*B8bypkpTXX6~3bGY8}UzJ6)Yri*q^CMQU;>yOVgOR3rxT`iEU@k-Qcj=m5H~bG1hBWSTxOVWw>Vvmk zf|C3frZ3&lc)a;F%T!>#U&+f>?+fVhcU)6xghKpEuwlQf{^#+nD3gABZ&+eA5qw?s z7jNRJp?wQNrGd4RiE-0>sAyS}S2I3kS1*i*{a}#tkDc2d7OX0ZI-4#8PivbHo&QDNR`qV@Kj#9W78ero4tH&nug(4HC-OC8K< z9Q1RkNme?A-L`pDZ zxV+0jx4_if1Xiw==bLt#Sjx6HxXVm~y6_oDf5yf)5-O~)D@VId;Pr&~Fx9cN@W*xQ zeRP|Zf$1hge0K%CF3$pZixOrES`v-syuWi^8p~lG={H`)zD;=p&^Lcprzg3Q9Zdh` z)ng6qY(Nm7rhI4sad~&99qGmEyqG>bit}UE1-@YQwNK(c?Thg~oNt>JYWWK8erw>g zf6(qS{;)ID1s#?ak4yJx>-=#Z3|;qp5xvc>7S?j#z}xRnvbRuP90&9xG2h6*Z9zE74aMDb(Xh!9xhw^cNC7X? z(Gun!$vk*iV}DcUUD>J8Sx?6@AOxMBO~~xHGo!lm&HFut>KB&FL2QW7*jG+>J75x) z1mZT`QTSpkZ@;d7AvBl7!XA5v=$x|Pm;Q3P#X^n$uRhQKsm&04_^|ksaEe1v;WHUZ z|80{K)8F}twB{BNGY{ASB1Jybo2OtLf3Tzgew|Z730Og0ghcu6G#1yD6iPM9KYbTh z1O=6kA77R{Kf1rRR==F7d|?!g*G_Ta`}*l?4Df0X-k9dK!eY#aSxuTnIH1L|4zKvr zd6`?^qXO9Rr(*<$Lkl41J2a#xz2^oFyRpGe?e3n?vvWNFJc`}?nvUS0@ZS)hyB*+Y zm|Z>4N`@E!@w)+#8~0Pnj#8q>7l+xC#U3!)II&#UY~3S)^z*$zAfj+XI{+49r0*6?|PEOAeCJ?amT=m3(=nohG zJ_C@e(@Pft79e0`9G07qp8bcw1EGQVjGBa~c~)(X1>fUhgoI(;3Pm_P5fzd(^o4M+ zEmgSx#di>5$8I4WtHN4sX#HiN+1|>a5C{T6Sc_G;6seLF-subNBH};--eY|6Ae*f~3cxvcc|^D8R9Q}R!h-@q zA^C*$^K^@d!_hdele~ORQl_4DRTU;yCm0Uuq(yk~)9L{!?%;fEJOUSd12B!v9542` zp09BwYN5JqVAx0%6il^9UCrMBM!yhbTfrtH#-v(4V5H9Vp0UUV1&*>M*&u7ihMfUg z%>xn2Zpe3T%aeWWlC`zp2wx2OpiI~0R@`kfoZ7pCZ$ zU75nSbx|qHR}%$&SnzXa|LYoW5=eU4jzsXr$+nT+(_%wyP*L%E|k?JHiF`11qY1^FR*;wXv)uV!jhsBwXi>E|Jq!*A-*Y_m&o>rsTjG^b12GS zewEWD(%2J4udRBQe_@M?D4Hm;^@qvgY` z6vHzJ1gCrLSN6?`*XWPi1F2}r4$c`6Yfm}PzD4m{X(qRau0LW^U01}Ju+S)TFCG;s zl1af|2LigMw-3IKl=vDYAmjfxaBKtE$g)ReqXj~OZvYQ;z&#M&=(ig2CjrzNPajh; zQ1qOESk!G7D9zvcR_LdSXZ2-F*k%+Gdc=WUTO=00A^t&fG1SVys3Ime|}7A(y? za^M=U#s(UeK;Hc}f=0Oq>|e{DuB@y$tee-;=MGx! zluAW(469qa<)XaT&?+om`Eg|H8DC7ky}twOfi~Nx;W^`Dtvi^&m;CB=EH-FWqCf+o z4Z0LY@Z~4QZ1M;FeO{l4^AF`^I_e=#lA+KKAwRwwE%9T@*qE@>bcF#F*IP#B8bwma5oYb6+f4lxyu5aiN4Q724Xpf@?^#9(2i!jH*Oz0!lur!Avl62d zd0Cy~?u;gROa1QpiFUk49j^&3I>Tc~J`-?2loUC*3L47iUEg8EC%XxVVimm z834kch(zsSI{q_NU;-ZjYI|LEnq?_7TpWFuqSLoLfJEgFcvm&xXjdCNtQ9b(75H=f zSzt7#p-A9%4pLeYwVV-|zaBe?FlfO-xaQ`weT!aIkjLgp*)W=Fgw#F-7!o1IFFM+X z>B-|D-Eu5(;_bz+yLt`I%IMfrV3goC&(xGkyNv*@;2e zsnn!FLCCY{_x7&E_zgfZ5sN*mfSz5~F3ObBtVm`y-p++6+}0jjO?PMK|H|kMUN`Wj zoUS+CN-W^%q<5;`*T%2yI!{K$UH2OEQ)ZNvwF33_a<_-HP1{GlUUJ{(y3?%}&%~Iy zjHnzQL?NgOOshuE0^@QP3b+xJt!?FthWLlih6iy3emJT2(5BqLXZHv=88TSu*i2g9EDmGwBG8dO{@c7Y+a7Hxpr+rfL%G(*rbh#tUM}sD- zLP4YwAmWsLuXNUSh(yqWm{>W`ShyBSyk@o03j8Vk!U4%s)$sPr$z9(3qG;hd8GrsK z+&hL&u2rY0*7EGFD_Q%A#kZC`W5M=8<5&MQ6nQ<4woS1m%CujZT;J{U^8J?e$%FS? z3jTU$xG*Sb7_(y)<0h&)$NkX*f0cJ#yIhs?94iBm5Pu5NKnmv5>O*+7bmkHyFDlog z6XgPLSJChCQFMWvVZJ>s+9I>4^=QKt!0v2u6uOj(A*AyyoNZO1+aDiyJE?re_|apz zMf3DxB4nA}6h$ek_msicGC<>8M`cm*Xi$e7j;xs%@4o%ciHy(P0L}{;$zAlTHF@Hw zD>u&!gu8OqqvMVXzdU&_i?27;2uuX3p-{eC#NMX75vDs*Uv$zsnXOZ#uuIV1b&Ie( z$0qxXh^-V|u8^QqIPI}Cq9ku*lJ1ePk6eC#=S=shzFUF01RBv}7$Rw=^GK6?SC!MdaE1!bfHNCdsB) z&OE7c%NCi`YqgmDFqGH2F?ltQpC20mG-iO7Iq;(feEUyDoR;9I99bcA4A0VFql+h# zmY5G(P;!|vcD1u$V=ufkK}w`gOvM9!cI`d*PJRk+Nj+<-)$#qKtmC{{mWp4#Cl2etv76S*zUN*@ zpwt4n8bVeK=1hQL@l#w#KA_CC(My-q->XF|sBn{Wn1R>o4}LDDl`?JpLG7YsGh;jb z#`fOdC%)yILku@q=+7 zQuSelij7c5kOW7gqgov=d7q~$-t=a zTVdJY_^$XX)~!(9_Xp?iAww#slSuKWPAS2osYb}sJUi|0kzVwRrYja&wLwhVlCUkU z5KJJ;!AsBicZ|^okFHiULHg{4R2@}|R9*0{x`s{LgQpYJ!ZR5! zL%~H2I2r%KsVh&LvPGq&atg2%;RC<@t3|b~_Tz0ZYYs1O1EvQ_XA^N*!mh>M3>DOs zL`trk)6N|gZG9$agkYhXsw`;d3b`wAk-_a7P{gITCEU}oRJ-jzdt3@u-r-aI&*ee50}UXs2wGq#wfyymr@YXVjvxfaEW=29Y0IuO zJKus`;!b?gNJ#+Tzw{JL697L+}Z3^d8jcya>aEnz30aX%OvX42f@U!M1wNQfqNy$hHlavpstUjGE<{<^I=}~qA^tA ze1bB&D~SsT!_y1LgW2Ycr0Zop)_ymaFUF33u3%9Sh^zY1F%tXsaIy$AyHWNF?@ zM^$sIch@#~s3g-6iE$~xaZ7BA6wo}^@;~Nkk@$&>_s|~rCj$E;eg%y!a5Yj4qy6#k zM2CuJ4Sczp9FRB!-w@3GxpM=kk@Cw+c*N#vmCOoaS)RcZSU>(1Ty9N&`4Z-8=uY=8 zfr3(Dm_5dy0qGT`@&Li7dsww7K7s^NjT?XK_UB0~mC0nYm|i}lR=YrV&J?@o;5;LS z6#M3=H!$Od9nG*Vi1q0tD4Q=0zGoFRsP&{Eqn88;Y(48~Fx|s)IkO z{I^a3<#G3;qIIReF_GMHApEA0O)q0Rpdj7SIDpbfDlO?9 z{J!;Dcdh%+z4xp&hdpQS{l3rhyzf4oz0aP%3x5{@?*MqXxIkPSJRlH=kB>({ME-z? zkdO#W_K1X>_Axyj?PD4m1{Pj61}1K18X9&{4sJevAt51pHi(p%fF!S=kN^fgK0Xm4 z5$M4KkN_hMqrm_3@wW>=iia_ZF^Yx31i&Q4z#_%?+l!G80AS!?{5t^uJuon_uyJsK zc=!Z_4*{4MSXh|YSU5P?*yxsl=sEy4DGnJUzZ~u(Z7U#?JGnqeLLMITv$}2yoyp%U zg4Q0P_ym+xAn@ZStZeKYoI=7PqGAy7=kf}QO3F|bT|IpRLnC7o8(Ta3mky3jp0B;U zeSH1=!`_8QL`Fr&Bqn`GPDxEmN9Gq478RG2mX+5xG&VK2w6=Zx($m}5KQK5nJT*Nt zJ2$`Z4Yj(qzOlKr{c~sc==kLH?EK=-pyhR=l>A;-}sQC`CwvWV_^gD`CwrB zpg&lo*f@;*xMXtLKr8o0OadWzbmin1$BN?SbIzoP_hWEJ~_Il^pDa19iha_c%o}03-i(Wi zs0)}Bzk9u=#BTiKFWOEU^A>chZtgLymB?j;w zM$Kv7nCF1W&c0+;ixbF(TP{!K1%NBNW`I4 zxvxUQhn0!kYeDzJ$-Ifd#2hVr^JIO|qMQjYwyDE6B)S!QD=9_cqRzoT?e4WWQbh4e zJcRY(I0d#9*ijJ@|HqM|Sw3wePMP<;IZ_k#d*D;8q_9G??1hUOXpH{>X7=B(4f8T_ zYd05tll|xEf9$tAsehV*<*z8ADWN5sbOXnTOrKA!C3nS<-(!v8WkT~V!~3rQTj(6Q zhkq}%qxYm6^P=K+PW47~N}+i)7jhk-v0{l#HtL@LV~NsgyhR6VMGyu;D+kM81K+!0 zUsUKMS{HD@eewJ=27QUurhu{4l@HZGE^%0J8ic*Iu3Mri~7)+*x2q{#t)6* zrThnjUlA?!+J9*?1GHn3$p1k_$BH~He~q~hgtmm@6_C`v$AWIVq8;-Vg$`MwRHOC3 zEBi_@{P(G6#{Ew|4tJF`raoSd>wn7hv7!gvy+Ly8oaR(=GjyKzL1XyQ)SKaYY5&pl z-V7vv)mjqm9L;0ZS}Ok@55K~IRffAF$F*+(xfwUwKw%#!f4z>59c@5l(w%hezXtA+ zVZycD7vf;l3d%Utj-G(l!af;tn;2g62y3|R(Y+Ah7=F!uhdwHdw5?E%dy%mC(J@og z{uf3xe7Lq7xH$=(#OT6*T<|OOSxf4y<)FcS>Geh5ApTnb|I>r=UYPsDxG!v>8;x_A zaf^~$XS(llxGQ|=L07$sda%Jz60Ocot`GTPc zDG5QMrCPYZbU!GK9LPyE7FE&d6Jec7e$bfVXvWQou0w}>)#_ffd-<(e3(!^V=+^e^ z=qs!!!+%ikhayH=0r|dxK~0U3!(@_VUhy4BYja|CApprsDHN;UIm6?^{IWG!_m#_u zMNql#_}%qp^Iw2sVn zFy-mIQ78IZ7@aAg+y?wD+~@Qc@F2x`LPGT;DTJQ$TtZ?;2xz!xq-U1rXmvx!&WMzeaxXzX0#D zw^pLlH4B|n`{)edWnX(A^TisjGpW#}rX8cJKt=nmkGw7aefYaRP=OG7Y=a8OwUNA- z=(Iuqp(N6d5!JCrSS^@oLy>~2Y2HLSYe`<xUgl^B6hz(t|)n$7WG?5U+w z(XSw4=vqAS7_Vda%&8DAu!@0RLDc`e@W&WqT!Byz!?>Wz zi|_CGXpve@QcGtAzO+9vH5&Ea+LPd>j;#gLB1QES+A3c>+FO4MxxhH*nW* zCsHMh`)$-6LT`3Mp*(ws?(g>7u0Nek;uY0S3BSoC$;81bSBwoj0?T z`mV-{HBqm&-S1}J{RIdbe@2OlZTb8Ke5$Ahy;av`MqcM={|W1BHi6|iutu!eTxi=8 z0o%HZeV^;!P1Pa;+8!W~W$C2=_jzKY?o;&= z>_9F89*Zyge)d{$B`EN$Fp({)vd%+%Q$r!ZP;J}cyoSg(TgsjpdsF9tN^J0UT9~o!9fj{KauV8ywG(2L&t^x+?)ti zSC*jYTR9}`{8~)s#Vv|?wra`4_-%ekqWtn>KXP0DIS(g;17;Fo*{*)47tM?7(jIrO zJ@`+UzV8ZfCd@DlTy;6I&N5kq#7aZ)8y#H>9~c+tNBsp5YTuTDWxPr^tX?~Y?Wrap zX0vXKh{bb;)2{M4F7Q|r4 zONK4QVuvx?EDxfDrcaHN)e4y|ug2qE@^+8LhB^uwB|68#l^)V<%o@zPW)!BKW0q+r zQHhJ2O?LRlY|wPF?e7e zv(Do6i%y1{2hZjwLyjZZj*EsKwu^lF!I(69LhV!SWK(JO5SadF#Zbfx>vm!;U;JI$ z3X%43=>E>7Iv_)!s ze;hBwvkfC(*WpB+c984KZwk>ew~H12VVsL$GZB02p*y zwQAS~Uws{r=Hi|Exyte<9ZS=E)yboGt=cDD16y?KGXZyA)%(i;NOdyHxDvIi1`GDa z<9JHxGi9Wd$#yA1^THLJfP8tF9#meaRg_uY+RIZthcrDZ-D(ao~QAIQ9ZE9Dse9`~gbF-Lkr98TO+ zMQD$hOMuShs9?evhV}Dy$*J%OiSnnA3_wWIj#buD)^#xYLDb{>R+7(W3M^<+;XP78$1}J>Dgrak%A%_+cB7$Q#AXK zBt4R|r*|{cRF`u8Dw+IEA^QKySeymIJ-udXIdzkOx`rm{&&FGdK2uVb1FYgKP?H}e z@|INNEA&7s$PxNoSSHqxj023{$Cg3$-BwJht9qJ{3b$DB!t}JbIe#OQePFJFS@BnR zc$?U`xPBa?VJT7Dz7n~a0aj^?Z@-e8U!n8RkHgZ7u0mW;=H0d%tsDe+T$H?)5Tfe& z7$cM-P9}>B(TnQ{g?OHpj%07#dD-ckn2$JrxZAUh3Fx27tdzj`2|&vfZ|&QCg$(+z zuq`>8MqVN)@45eZt_t@(#0V5|vS;-cdgW(ZH&JcDnJAw5{dG#2%`p=S8D5 zg^J5F#De<|LL-rjc`%@3<<1gCfO2w&V z0Lf;`dg)MqkjhH*O+|L)6|=wlSNuLkp?A~xEGveB_B|~+!M#T+(R*_x^0;|}t^FI$ z^ku@F`G{F7hB39~Z>63>TAXiwd=YTmY5x-f{5spz$P|V#p_0mUsnX|LI_w|Qwvi}S zFev?j1HX67x8Gln8?VZ~sg!OJw@fWsHkZ0dM(C2MyHuGoutI)xUq)!fiDBlqQ*@p6 z+^(}k+9A(|!xsF|Pq?~qh zvw^1^^r+1V?Mt2XZSB@ptSYenn*+ArB~fan-lc>;`w^CPk1d9FLAuDTmu4)dviXsacc z6E|nN-REWGYuxSB?^pK7^#0>RrU& z)Lz24Ti(i%=EJ@AG!g}lsl|%?K?+?fCAvV&UbYC8lV;dZf_F`GZz@bM zD052Gy;mNV8>jh`sPtD^7$K)iM#o?DBSWJSzW^_FF+#J`wvihUmZVT9%U0#GiYpz| z^p|qqXF+X@xRr@ck3OT>hVqjq1H62`H10YzD3%vzRUrc!T&e)p*%f~qrljGgY!F%{ zl~Y%bh1?1^?b#(JFE+?Tk?8h!N-+Mf?usoUVlxV6?8mYBW{KsWW2xvl%(3glh=vQj zmOO{9bQ49}lH7U8Uml+R1?=e!mXCVE1Nn7WXRuuiz~lI0GTPtYhsQ+VM-F4hkhryn zn;LE7fnKe{6TS!I3gkW9&c)2xasmGs@HfPKDt#zK|4|9N>E3!LEa|4sgirkNitb0a z;k61C#PUa$vTMGqR?5%-MAAOVhAjmc*a_9|?%LC$uxb?W+S7fXHd;ZAXAS&Q$U;!# z`Fe;czw%X6T^ki+1fG~sH71A}JRm)TSH$(@E%_f?-g?QfL}@Kt0%Wu;awXaL2>~9~ z7`5`mTM6AQLQ3f|CWZD*>>v{VuyL+d&;q?z1((z0sI4eNvQ=VawnV7YO@u_cZCdk= z&znAtw^hH4+Zu)9h>ij$KOQ~V%Uq@D&pjs`I2E3#>+_wa*gKK{6&{2fW?} z5qZcEZ0h^8f!ErWK4$a*M(CZqF{jU0EC~|13{tn4F&jLD>d45{ji0yFP;eU4oDrUh zmE4BJ-89A>S!to{3co<+I~|@giEj(*3tbTKJr5*y`eKZ>5^dDlY!UmM7*dkqrm2FU za2P(^FbFNRtE7wA(+O?{7m54AoVe8%oGo|!}LD&|H?@f zu5__sy&`8xfR1yvAB!90O>Mqf>AEPU6;K$L6+0EKPvm#ESA-0fU>QECx1-?zHW@e| z1eXk=mm-37XOQ8h!uIS)MLjL!v|zxt^sI7<&kvIMv8K;a2#U$bnNX6uP_BA}909gN zw~NjiCtz+06{xU(mTjL92BHkXsu@#RUTZ~>+=>F|b20`!cE{Y5(? z7FU?o7}q7ktC5#d{sghSECegRu;Fxm7w&5h`~ z43!5;U<`?M)94+WepLF%AyT^;u_9OI;)utnulQ17=%?pkaSjjF#z2}saVN(Q`$VmB zuo_%Sj6Rm3#d`OXC4f#^_m)G{x)N&jXu=H&lHVMf*x-<~@oq-x87RN?8&^Kn{tK92 zYdZaDun4PgwRt+x?ux6VeFZn9UAs z!kWuuAi&?wG5Do5Ks&>tbZ&1IiscFdU*sLQ{)u~S1>Kw2Q~CL(@=dLJB6DlBAs9R9 zjyzEwtep6KCh&WIW}P~1>4V3O;r+neL&v1T-=!(a@ugkE^cGw1a~o*vmFFQV-lcS} z8Xtib6@l$yuzrq<*p}wGtkS*cR&GetK#%E)p(%Z(SD^7TQ$^Rjq=IThH%Me35 zC+qtx_{3NaE;h8MTR-4Hl&TpuvvRP}(qz(fr0|Y~?Hjq$&p~1ZkGZ~Q8JhuF3vX~t zzHY~SJqn_g2>PNVZo4L=0G8PgyLBeiXb~Kh1A``ncY+?~PURm-XH_kJv2RKjRmY@z z&MV7&gmOPHQm-7U9K}=+S(u?TrmtZ`hU*9#$`5}iYZnB+p5c9NyDp~Xo}G0Iq40ko z{4ByZ$y=NzXB(NS(UQpOF%ln~H(;&dG-;0oS*y#ab2DV3bPwhyx48qze2HiVtv*JaV^3 zdh49bs=UPKy`<=gTnN2kS07-wIv3V>Kp?1wB86DmeBe8*C)t(hnhDNHgK-YK^+4{- z6$~QWAizES8X_M<0z5V+8^}fF{;#s4eG7Y*7%0m^8)t7KKzjx`93TmY)6PZ;Nn`aPirS^oII=$>8ZRnWY(o)A!=Bpto zpp^!{OR7-puZBgw{=p3C&!Q(~(%l&JM+YRg*Azoc9Xb{4u%1OomELD0e)0-Q%b$cc z`rr~ym`fkH&fL; zh%DAh9?NFJ?Z(|0vjcijn(Q92B7C9!KC$9zgx+F@sI9C-n?baFB`7~F;g9UM8;ikTJWnvj{qMwTG-tfV1h}8$Afb%_ zl?$oMJyS_F##WuKx#|OQC6D)>G)~6PpQ?A*NAZm6VEgGSL%^rydp@?kW_gyx8YDJ5 z>KS@U_$^N&OLrya^*A}W3PP(OI!W-0=fyGFTqM%0U`aY+sUXg{eMiZ+FOURWFC{~A zR3gV)PG}R-{nlx6`m4L8>IcI3UuE7DVk~}dY)c-_?T@KlIgE>3?}W@kK?(jrkG#r? zjf#J4zM`EWow@$XBgcLi?hX$N#Srp*;3RAfZ@vAt%`CPqV?u-pebWrj_8a&!Gu^jY zrraj+>9=bn1;8-%VYHU0j#=i*PMU5jyGD<7OVs;?b>`p2qhsLXC)_l2V)W~}6GbmL z)79elEd_cH4ie^a9kXn;nF{LRM3(TNSeoyaqJs__Kf*0#brbFa%bp1Ojck^Zu5S@Z zOuy?+H}2B$FeMyV-GQE`8OSp8mdlRcL1kiTdcJBuBGxNi2!L^iw#2aFQ7c5v7C1JSq+fD6Ma)I3J5;y7{-fQ;pg%`BBhbrWH@J+iJ~$=+ z7@01_4}Iyknen=ZA=L&l!3%t|y%*D+a-!1`ADQj>d0VG9GwcTv#c%Jbd|K$h!?F;C z=UQ^9mv3jk{18Xn9%!p~se^~4=Y(b_wAq>AUZ?ts)v$MzocZji$NHa(1fE_`J% z)1UpI5O)K?uN9cG_B@W`eOL>Bt<`+Bf?9aye=A#5@9Ueg zBs1(-r0{jCn5*xY9@zw#UzvHYJz`wJu)RH~Ati#($4+_g&R?HJ)xN-tOQ8|7v)fF2 zo7-hrPHGQx>Np@#eu&$FDk55dI@|y3hD#A@vt&#=#7jlg+SM=McV6!FMQ!qO^c_=d znuXETObf0sYBTtI2c}YOx%b+kd!zgk#+Rc^;+w~>=Mq)wBGMEPc<%AiY2Z>&9H^)8 zC1a}ODNv}P)+pcdt+jji0Wwi6Ka?@uhaV)SB{Nul+&Y}gBHB96PRiIy?42U93o&s> zvUZgKJq&C=Im@T8lO69~%H#*;-g3&<8?%WL7b=!7Y*#%9Nv=_^XaBt!Vs9-&YRvjm z(9$3-I_5Tosa#H{>+E!J@3fLoa=33op@!`d4rf&kG}XYZ$0Pg{bJMRsK<}|#YJ$6j z4Mwu;t*4>AdX#y{dN!vsPd&4;Ow^s;&ZkHbPSKf4Mm$#iiE$tLYCz?;gZH0D7wBdi z#It(C!jP52Ko+7|K_vS`X#WohxRVr#e=Y1F4x41S(0=iTDPO=Q)4+8L$<)+W^hsJR zkYDf95NMC?ZBxD(U9QeMW9bW(!Ub@B@xq@$;O1cQlZHi&$!3po@yzS98)yABqE@bi z9i?v?bJiZC9?;@+9%oMhsD!>D-RruDAzBi#wVDZBk|M)n0sb)o6Ed;TGUE0qF<~pF z=i^@;C;tLk=G)4iVGIh3+L#c$cLI*#O-yBeMb&m`apYq1IX=stsnj2ibxLSkAh>LJnhnc}PQhF_~ zO+6uL$)K^*INTQa^*XKm@pig0HmNNo3rWssnW z&TTce^$HWl{ATt0Y-`Ag^PAwODeIDOOy54tso!}&XevtptHe0YpYp#57!R@_zR!}* zd{-v)JBV1~^M&+FOxp-78_|d{OQq?0<1kp#z>oT*ccHfNA~)e6EScfFMUkLjlJnLw zmIPZ)kFgxNDdeIigPN4G*%VW9JQWxGq>(I0JW;?3cF7E6sLNjm!v+jN>Zo6^k-s#aQ?v2G}Fjn&s>6ON^ z0UW{4?mkp`(_uZ9i@L5+X`(Dlby+i79JLl9Sq1HL`ffEL6<@|Cg{AD}^iY^}TNl;g zGSzX1bfd6_I%O|#n-7|P)h%A?d_&dAuU}Xu25P$KQ?pwVRXkQy&D!`3!a{UPi4}jZ zq$K@-WW?kjhj!hFRh9^~@bbU1o{@OEW|?HFLcXPFh^O9lfzWe@E{BhhsCkY4rEghN2?CjG`B;OR~LQi(Gs+`#`9`&h0@1M`X z^zYa`_{5Vg@AM@NQ?-7y!?d)LS$fT0mT2x7vJv){DoYGr`s6Y1LfCft2ewkArX)HX`Lh3UZJ-PyQoaV54}Q-e94Y+$b|EkAl?fwd$-J-MH! zSEc^J7X^DAy|V$=0r+%Pqi^4__)`BS{vHFp1yI=9lU#L!{5@!Vl2w-O=I(x|9(tU5 zshJ6(k2@_I#mb$@B62a1dmNWpvpg>0e}b49d0!`#DFhd#X?T6Mmd8cWK#FY`YBw=j zku2#SrqkhRR>(u{-q};FGQ6F)bMoly6#ZgSSVaR4u9d~MsbU_+qL=`$=(n?^Q>vfG z2j^1CaEMJWT+ih;QY=#8eh-5cYQK1spp+=29Ewj~l3Z$%cFiKd0dz zFNwHML+Iz)GDN<)P$Qb=oxBB zqo29IDC4oXahgj>wm!SsSgWhrSjx=KQgAgD|H#EL$Yu0J@?(}SvfPnHT7DT>dPFyy zkE_7{)dp12HV8K+J?Yc8bJH|gOyNf)n{_8m6*W5KkJi`xbdn>_;*#y9s?u&vR9`fV z$#(u3v1)0+9}kMDFNAH?7l$g^zND`8A?8v9Ovwwh2^%m}y~co0Xa?isHrcjF^=Tn- zbrdoB5ceK^Lzoc1E&ZymcwZ z{vVF#m6ww(4feKfGX72E@}vetHgW!mcqj1bEqM>@v3k(Sp1y6ys1kUB{8oR|tv~1c zt4;K(R^^~^#~e==g=DIa1jk&H^z*#m?P-Usmhg>IEeemoprY4RPe!L;F<|CXZ|a~N zm95u=HFeP}Y}A7Tt2swikec39CaDt|kD_SY_A-&&gf*KdWBT>>pW5hbAy|&x%ZMOG zZTpw@qvhm8Wdo4njxusz_XGs~#*9iGea>eK=#IW8+>wg9H9`5%$HQs3mr6#kIS@xk zygh`-MNy_zc1)^cBN(DMB!(&wBNve%anB}rOa3mt@>y_CvA>>5Vm;>Mr!@}=%YZ4+ zVKg?Qt0o`>l@en8N)S(UT{>9jFt#3J=v1m4H#$+|<=(_F32S%|hd>t-0s<*=U-%%% zSst77RM!7QV@VUla7|D-@1B(TTd9~s$Ie)CtUdVf0Sk763Ijo(YS>ToV^y5I~a2(TUK?OQfKH*;`h06 zuAAbquK!Jh*w-$JQrTA`pgN43KC6DR&sJvA2uNy9!=8Kj~tHAo_8PB6xFO5B^lzleoC1!2%O$js0WxnK1$8Tk<68gK3h7V_aMU$;QJ?cK8ev(FG zS$gNi&=iG*L8mtU&5i%-YtY1>8G}JKoAWY500vn3?u4!|zB6(+uzVM#1nULG;x9@5 z$N(bz4pdg`8~OUY$qQ1i?{r3vx8Yg2r#D=h7Z%#dlp^qIx4!@mz$tbndXAV*z-+4n~cvTrGzke3`jSPuux6$e?Kbr|G+Z6)}ZXU zrOHeR8TUj+x^A>J_%#hl{zNiHtzUXa3wFGeT)Cc^@{NI3Yc9jZHXokE^eTi3kSNmp z_A68Rfaj&}@*8@fDrb(AK~X*8Dr?T z4a9z=SAA}wh~?2!K(eX(BrvvAeHnpI7o)!R5RZXTOr zh(8R>-AZAJn;2OK7CW&okQtp7IZ{nG38jg|f|;9Rm5`IAyMzxp7>wwozJ3&cNgW?% z%*xjl?<*BOCcbQdFFAM|H_hCs+nN+zeV&WptZc^l3y3Iu9QxsM#Fh4gKJ}P^l46Wx ze$Lw6)4L`mp=yx=YlYe-<7UZHmb+DEp^3kiaD<@dec z8{(f1`|D4|^z50P8fI~6Or463wC8A=3_}a#r+K1+L0BO=in+ueVpaz_MP44SPjqtC zi6z&pN26r;ePBcM7Mzv8{f-NsJ_B@BDK?8zYdY1vDt^cKgXO6V2auuz{H_GV)hs^s z-BcegPcF8dyg`4=X>8Zp7N5Rh@4oa|_m^&dMKM;2l;B)061dU3Al1e&FK;_Rr?cf_ z8}#`Zi0##zyASBswU}lUG#lIG11W!0NS{@k#&_im7nXkjwl=$HO#~_upmxP6% zY|9?#w$xYaG=N;h{q|dqx?Z`fj40dklG)7WIt{&YAX#V$CEx?5u**EA36B3r`Ji*6 zSs63+00L{>SkL)V5j{CS_70OoZV*&>t*88^#IhzN^kG7bEQwHb!Ucwmpa1lOUJu%g z0S&wzUB9P-4;dAKnPmefrBlOCh5GYm!m=vG>79IJ6=7L1?H=x-1)zZ{raA*Lg8|Ee zP7THs?Dz;c?|SGGiPeFL2vTaiaCkJP79%CYoq$hJGYeBa`E^xc!g1o1 zF^5ZwX0Xd=p;*M@GHDIXSS*wSAB!S6uF0Ci!ks-xH|$2;oA zskJ2TRq~K=%$20ekjr@-?!)L~qHx;1@{W^^=Y{Ir&qUi|j4q-=7-vq7w~I-fHd&Hw z67u6=Zxu;eOkV5M?n<;Lz)t@BKnOUCEL|GvC~gqZU^=P3pJHW?WFUH6u~nN~sD;lA zWEO647^7bENNJZHUk%Z>O&W2r%;t1>SSXhRUJRLV+HL$nLVX}km{*J%ujkd@@KM|i zaHTz&DCUC9XoHtb&D3Fx4TORfycc|mcmu8LblHDObzh+-ZDQn~b-g1*xG#|fWxbRu zGfPhzO@RAu@ojnp5jWO5!A%qyp=^M`_VYNo?AbTnubqFW($ML(7=&QOTlBG_wHL{adLDSmfepnzl5e}#Yhx6q;7^pM}V z!!Y-%E=KC8dbeiYfUpLS=}-uRU5qTX=hF{)L6WWqW~gPUIk24=t;z<;;B;Kt(Scc+ zOkY1IHSKt&`Oeg6eXWB&NaWFBg@4GOi^1|1@qG*DMq2zQ>2aP*81T1E;f?vfJdR6g z;2xUI95(g|p-rs>{;n%WSCj6d9!pn6%ZrL8K3{le0NI&G2q}lq^IK+L9UsmWR~@l| zywU|0HEHW!;t#6g@f7`oT@Sh$vYq5L&-)jfics#sZeqf^6RoW-3=Hf&wP3cL1I<_U zoLQy#K!|&$F4Cs4HJU%^~YiltZBN@gM?#Coa9{@`Pq8q%?_#Z7kUTX*DOqC=``j@*7cH-7CVn^N1&> zgQ~?zmJpaWDj-Vytd(@R znTEQ``iWEPcst5HA)0n5W#$AqFvS4#Y}nV3NbEVijlqreVBf05HXR9M;rSmmn*D$d~1ZSliIs**)m+~x!zqExWF-{%=r;@)efmMgC#dUEiGTodt zz*U6|Tv$1BNW+=NG_%5aC^a#k9L@Ch&x8+ouISwn%CSkA`lSU9U9OQ3++yeVj^vU8 zkp@2v6ExV|2soc`z0;4y8@e>Tp5^`v5a3au|4kyN8@{B}WbOJryi~g*c!7hlRCqOsvLO=??)m4HNmtq-`V~;l#YgPSKtx@GYfQjh*)&?DB8s zbCOTc3fG}kzV0bI?_)GSI3CueZPzON8Y8XR$C>N`->3zimLv;c+Iszn%jA_Udvao( zRsgVJ#`tg?MBvCbyg(g#y3IAQYB-9e!#=6qlKCjOl{xO1U9iixN1m^QkPS;%!<=1s zG%%Ogbma+W;A!T)gM-&06_OQYO*%=k;4>4vVd?C4qym zHxOqc9@e~(zktqoDKT=V_#nrfqvy^6n0Og!X=!unpE_)7N`D!DXE9ka5sF*nQbZ`+P}Qfnj$bhuA0n~6fBWRcPqvD!S+n#!X_W`7w{0Zw6JIB zec@S{m?9w2>%--`&2T3??>JWMm?fGvGgw{Jl?Uw8}A`mX11u`n?}=SlNd#{CXR!gch=6 z;jl;JF_;EXV&3j{C58y2hSp6hCZxaPi1{vB+O(!(Nl6j&n|=NI^i_39`!a#wu}}yo zUXM(9unz{@|IxwGI2p$2cflD$<@r!RnZB%w{CDR~4DmvQqFyuxwhgMOvV((LxA7_j z-bHLU@+Re0+^b?sx$);sTJ;mW;QD3^loYOXr)H75$}NMv&U@LJ)s!D&^2*2f2^uT8 zUi*G~Au&@QkC=oOQuVSYXJCA$eaUK%exTRqnuWFkX2zO^leLI7u}`;uAe=L1B*j{& z;@n?VEJoQsnIFd%W!aV_I>~l7J1oe!2>$$}`@3WtO(^6$2IMN{{p*Ho!a6n#^C%E7 zX)h+dl9v)wCD%hvOGE6JuJRZ;H2gW^rCP9CV5hr9L~k;Z(AJG+5Kq$5It~JV--L^Q zDTm%m#iu^3G2_#vBRE%}%8c*Hh!kNXNT3Op2tfZ5fsv?KEJY;#p?5+&WLvDPAbLH+ zC1R;PEX6F7c;@E#QLV#O03d^B?_aOEEH)MJk%$!jxMlQ%wA=Sc)jEjfdq% znJ<6uDO+r5*P2ER-7)#$rW4I=rtA1TA?AnsTpXx!A0_UmKiyrRi2=NEJU3o{3OezA zGfDzJlqFv|uCE_7AB3$W|CEx>Q7O-HHe9A{{;h#a?H~+$mxem%UPqKWV5Xy3ExT2* zGV5eGq$5Ek*aBV>`u?Gppo0X1m`9uW@p_p=BG9X8a@ALEqv-Wz8krZlw3jwmrEtL=Xhf4Y*^el&1Wp+vjq|<22WjHOxv}DIs`RHqkFu8k~KunKF z>3iUhVgi&i%#)2))*Z!4Et@fo$y7r`R*xBIYSwlA`1<)7Mlde)JmWl}AvC)9zaPnYpNk&!eG#PTz@pCP=LO^?;wVPo_t$oTJ30igeF#;imcj{5?8~(g(utw zQ~;CN|E~5NM;QnL3KfV|o5YNsIcOr;-@!e#HF6l4icxhzNgw>UrH5SGMO;UQromEDYCi)zvR*2=)VOs0A%JhH10ShG&Woh z_YxbllyYKik4|F__XbMHZpWlELWlW03gePJ>hQfC#` zNx4xM86i2o3ZzkV@0!w&bZUK^o`WXj*~cgVJsv7sAw;gP^(*)(KL=1Bg1n^sk2JC@ zTh+*2wtwY8=))}+$NckVQl)!XNpG#Ecy%W*_#Iobl6LXnKh&<~K@5IQi zobkow)CbduKUFX;xm2y3H-nR19qlbOEoB!aJdNH4iB6(^%1r9Rm2Tq!SbtUm=E0@D zVOq08Wa9=TtD%BTI*iJv#_4@;F$2{rSJ8C25__^b# z1>eMxf-S`3UgWJGReL|MP?~0)ZXzt9?DnKSa~M3Gcv0kO=mQh)XGzG6u$SEMy!E%Q z7OFfG+BW!FQ2JtNm$<@HV)!SYD9t|YE;WyebD#=!hHlHC<>ZE~tq)WAax|09q6UlW z3;H4@S8s&xMHPzSfLjvEZ)|a4lmb=@pJT?=Q9B!X%3N|>VN#s=v2%E5xS3LdY65fF zxT8x6y&rn9?BZ%`u@dRkh*8-$Jd(sYL?xGv$IRmO%Y^C|wzp2RQX0m4$2V!S-Wzn8 zH=oOJ+ob2hJ{8+1&iUInp7$ASvFaq!{OfvBJJk2MF=JqGzH^6f5Czbk z_3osM`FOGpAOt8fw#9%)6&^b$&k{z2>Izy{317OMO=!$ca=Fk9Ky7RsS!7_-y02fw zUcyt~B@B*>2gKw@dpi5D94|>Ga*=7d6}sVS`e&%Nzt@-yi{b@Eyb}IOTY&xBv-@DG zLinIRk7mNgW$J_HmMf?C$u|yP2bN!?yJ;FhMRwUCiKH#E= z*I1$tKL5Hk{X)5wI<)MJ_GCwg!rsm<$zgyRgCVZxhVxkQ%~m$EKS}IEKjjFB)Mm0X%cKhoH9Q4Nx7$Ydf#|Z zT7>1b*hDsx*FmvVn6-A%3tTXJ;485%sXja`+;?VB?vgFMrBEsN@0A+yWD_hF0XPH0 z>0Q#d=%3qUi=9J)6-|qevOW!T@{t!bsyvDO6OA$0O~0!9Bsp{L&ROodOD1^xw3IoZ zA`*67_>O*cRnK2b-k`pG^;sPjqV4peuuC6tX#GbY!NNue$CMi579sV!Ogyqsf}kLa zyMj}dPs*$xLt_$>HW5K`>LMV4T>j5O;?FNs{KZvNIOUok zB%EgxGy&6jO$dx8>r_uSP|GrX3TIHmq8Q3bqCI$tzM9ii)&QZHwoMB}Kk@YErgs7O zf3zN;c5W)#gXme1v`}y~X9YW~ z_-ed8jid>bDSDx0$lq9>wLA!-Pi9=E>rz$0>*9veBiOgV#+Hc?awrF6I~>GzIlTb^ zMMo3(;fd#{)NMdnhQ~|GbCYo(HxDEnIOUQgvqe_O0^R3I(zs=tk11a9MfDIH{sq+N z_hT^dxzH8lm8~pGcGD8~S%7E|5`j+CnMxjy7|0~_)XjE!RHka@XtvT6R5VA_gvb3w zxoUgt(|KCc`KLQo)~mz?`yV)hjnvJ)v`%Xyz;54L%QXu^rnlCG=Q`Ne6ZBENbg?Ga zdcs(7FmC!wTO6jHm$BuPALpho+5GRA@&X~ztMkVNi;UNTIqFhOY{8~8v)86-Z#FCm zrr)c0`ydxPUXeDIWUq8*34k#Bi$7VBp(a}?3k8pVq!Oq?fI&Y zM|#-B23l#+>lbY9589*z`~6`T#k@N`=3Gi&2a>J5*J-f+0(L8kh)d`=OBUo)rsSv7 z-Z?UpGeJVF3f=~1`drPX8KYS30kHdPHQfHiR^mecIFp&sA47!X z2)j2M8}7)qg|#}`w&+VeoQBMhxULx;zl?8^L!@=bnZLXK0wir_^yfoC86Kw05=0NF zL04ERcP2Hd#JZoSk4m>#%3yEgof^R4N1FoD0t27db5vReS8$dvgJ*mCd}VCz0uU9Ro!Z8uh2EwZ*MS*wAM-tS?*oZ|RR ze@fxS$H8_vy0o>L0RSmDUGZYWCjXisciT3SIR@45P*I`E{G>xRKC{l^+X~jrZc~Sa z54ejyOF}E_WvfmBhSt+H&Oiu;BDZH!i~@7Z^eem6o<7&7CLBx#2!R}4J$A0?8k4Q; zD`>8>+xQpB+uyhX9{%o&GSMYq6rp{v=&%uKPLa`9I4j}uN_nVST&rcZI7~{@WT;O` z%a+pVm#eiwG(Lnn75kRD>9w~9w-zV0GSbrf<3r;6Z9u7B1--=wkM{dinE{b-Iu8=e zYE;iF_u34HgUSA$$F?GxK_C3-&L(tf{uco3Koh?< z9)r~Nu2WanVTR&ccC{A`6DZ8s$2{;cz`-5;E27h9o(l-1NTpbcf2-@auPfbo@A`4h z6`^?E#F`I%cd0=<@B!w+fxgbG&UW=6o-jspp7mBeCH0$VFGD13@qp?fX+B}cC3wlk ze;UqfrnI|R{LvIMr!p5HGjotY?aoIXjdVI>x8lqOM8IRT^#pqm21mVeO7JIR4Xp9I zb;3#loBE%Sbo-jwQUR=u@E1>7n3Jx}$jmsj?dVMK;PSo60XPfEm!%-+goOKF?t+Cg#(upLO_ z6>1n~i&9Z61>nIhSQCSeKBAqH>LUCTK|E_Dpu__ZBhSo#l`6$$9JnGP?07;lPv%W$ zJ;{P(i0q8WFrhF&$8$_u*`$;rTeOHlIqCT3ivhIo*+cV*0$_c?$ovH(T*b2s$m0y) zW9wO7Y_j}`h@1P_2Y0aNtt^(zcD&MJ5C~|ubcol$WU|XNM^Khf5s7me40 zgPO{Y`PEs(Qpicb*f=BBkU;EYU!E<#DitSp*cBrUzmf}KZYvKwWwM6O2uTiwTZ7KI{|(P z<2m{cIIUwv$P6t?=6g$MeD%@k zRtq?1C+?n}`2PStltwOcvLbWkk25HJfhM>|k(BKFxF?TqN}4+xJALRQ$}?^%SP)OH zJ5}r3NunWfh?rnVia`h8uj^G}bct9y41t2oyqdP99U0|LPEPEs)7%LhLjdxQc~Ulm z?gc>~+GH|Ig2+H%Qcu719lBMz@)B0 zJ-m`S?qu@RpPS5cyFZ3_spENNW(M8kC_o2xRfn&?*0a}DwnYyb?vES3MFgDo>s9Zy zM3Qu~OGc5xhEU2u86KGc{&bpSvC#Q)obDr@IrOL{fesk#BoI}B3wZSPS=|yf3+6XG@H6zRoUH6pMqTE&7l$8W*_)g9K*i>h zh_ldR9eeh!H(A%UT}yLbUCQyEL`ATG`vF&VJGRs{39h6V^BXwy9f##vSJD3DeQVRF zNks+T#su;f&$Vmm5dc-$hs-jfvhE`ODzl~CDmhm;#xQF^nzscZa=*es)8cYrg;6?)S`)a;-~yVK;3BI+6BLR4h;$7;>gj?ICkY_@l?s!4SNt2lP^6B{wk zI)ZXYADwS$kxf0EZ5_~xCT5HPgPa}!>&FM44>g|JGs`!fscJUCV^JE%6d_eq;NzZz z;-I;^j%`xX!YLtmcc?78$z|`1b@awNR|Ng-g2zZFhTd4>MoWu;83V~K26~Wv58+(? zrE)Jm(zdN8=jYT9Y$ z%ID2nwqnDT^2h}C@7j{i&+HcsHN?hQWG876@CUc0Yp@q2JTtCv2~m!IrlV;jiCn41 zMsbpBvCWc0_NJ9sNBccyTPI<+ za|nl6!90&lQ`y-gSmA&VW*EgMIRT9NG>deSM{&1d$yWg6{uLr<^GTBPE(>nmAw7ME z{{UXJrP$!cL_`c_rECFJt{)AyTZ>U_akWqR=8kp)7e$N9Ww@L^=G=Uuyaa?#_VZa<|f$$<&~07i4IK-6v>SdNLeJ%cuQ?a%YBl%lpBjrni%>o`*4X_6IY!WM2=`T^_h zUT5(KTwDEeDA67<3Uqa4CpbL_&u`YQ=_#qdiW^YXA#XA~nAEq)0QT+E&{r+vTg1EZ zZRD|#P?Z3VnF=%d=AFi7iAhpA@J)7!D3FKFbIov(KO}nBQ>IP6(mbD-F4OfKRv4{f znZ6%JYkeuv%42NQ2*)QUKHik_d)J#Ixf(FstDIGi39Nrogt5_fm>r|kvGQ}S`mJt8c6RiPFKT+xu7IW-Pf zW91}3Awla$hqZQt#5dM+{(xZr06)^2PH~=l*Ewl>yTxrHo&gY&53&CM8tcKY ze&;47`?ft{qy_i{DLDKqBT~@~;SXw*5KKPfeEF%sNB+<%dBXTqGw>)Dc^Zx+Xrj@ofg{DLeA`eo2`9?T$_6+)nig~mLn{Fy(+NuoTqkH$jm504!?~-bPtf(;~drb*;2`Oe1!DR zsjQ33=)TRl*kt^yzV+%5W8O)$0g;k2YOHz22Ue!fa%5#84%HaXb4vuO&K-{cezXkT zyP6?k5lI*2#(ysLfp;rh$>tpJG4-NbhLL==KQ4WEtvIwxnJk2+DGa5?0Awmq_xsrg z>MA8A9l*@D({FE;&84LG0dcs+8Ev`s#coM|tle3GCBDmOR47=X*cStWao>_^ejKu_v+h`u3KpGK|MJb$N-=5uHGGOXS9uP?jRtzP_p$b4-7v-IP|Vr*6e`F@cLgz z0n}%X-fcz5k27#%93DrnL+k6-uj-QP*9IvqF48#zDs2R@!RpxPNEyiXsV=0CRqY6;DRirMt9-YnzRZqi2=nhHb#| z`P+|A5nzD8a(Eyd zcI{A&4%*V??_iX!{l08_hzv$Xaz3>r7@Z|)gqx57u~<4kf0XwipK8a{wKcYmJ7q~& zrzEoAjseay{cAO=upuV0Fx@rax@nE@bA6gX1HZ`t8t z9y)PdUX`c_noqQ%l$C*rnb#${5<3Ihx2?6ECJ46uhf+r*mk}UkC)5yo^{eNU23DHx z-p$#gM0r8Z)WV*6^O{7}Wj5kakav9UOM(7uxLXyRX$5M=Tce>$eE z454L;>0Jr=Kz+YXc?PBPW>O=Zmc5&}Pwp@KWPU@M z^XJxepAX#_OtV2E92Agt{Hs+wS!J$Se`o5-(W8<~usKHDdy$Mc<4L=Pjvngs$kgR) zBJjqKgaMBNuK0Uin?=+X;x{HX!pwvC*Eu4k*L)=|n`STU?xVi6C+B2R9wFO$_Wf&| zSuw$^)3H`e_HAELwx2?qQL~*)CNj~>_epNU9=Yw-yo%!_WaOOE3D`xoWpJeAu6WPV zmnHH@W z1M5n&5s$?G0ETOnmjMU!+ z4TcQ!0sex7|GA209l3pe5qE* z&t8;V+1lPN$zWM92+19fTvSlD81e_WJ*wKi7zR7D+zN?BJ;20+!j|?1`fD7dlf|$r z^Rwyg(!8@(j_*m-%Unk3IKwb*`LA=`{IGrNKUUE!HTxEV_CK9L^4(9&ryak-v-W9h zRnH34^|^0T$%;QM0nSe(`&62BtK4aY?prbM#9)tOo_p1=5O_yX(Jr5QZnyJ9X)yjQ z^y8?lxO6+Y7T(GPO@T5Sc-p?X^!$A*Hz>z(Gl#uTCT5Hdhpj;bdzHp<-nINkVA^)0 zT2yvwE`zSb}aVbK(xpku9bSJZ8t0^i4C1+J-drI9zIGHl*Y7+mBN@5f$y z*9olIY8q~`OtUP{_tBT;`A<#{PB^ZoMX|Bf?9BR%>nlSk+lDGooG~Z#9Xa)_xvlh@ zbThEElpI7}Krr1%8315#fBN;!8S*h)!ME`&38uBu1<+%XsxywiTzXcOwac~A zY%gwFO_HOwr(lH(U2^4cU zCuC(n?xd0QIp_LPy|qKKISbopppG#Z#q$<2s*+D^bC37BeQB0DKC1eZZ1!y!KR@pR zs9-waw;cYtuH?0u-Ez}GGb5Mtp#uXQRF9!P{M6R^v~obmk{N>n3aABu_xjUy-c7>>heW<3}C@F zU>|5-E-|?Z@&PB*4_`{;^xOF*)Lz={l_HItyr`r*<2WBvjyevtFpn}BuXTBHw-Z{b z#;X&q=@sy*xdQ+mTRe0f{i|*$ucwSKxsD*eC|@gf2X1reip8_g9_vzj>E~OBbCoE5 zW<7zx;D8tO#dWd5OiTWVBw#SxRB(Mc=cXyovL%?QZuc$`Nnj75+(vlEsQ&;st@}L| z;g0!=MY!{U^AY$~q%hiP{{SjNLpKGLI{yHkDoJi`5l@qAyyGM@V!fzgQuv8-B7;b@ zg|~>yIUKP#&(^K&NXAky20IGRI*sB2Cex*CbChi4eJZrRD1jIEkxdxSAgBhqqZJ*A zz0IBPjDk)%=8rYbbCBJbRU2FTOQlziX!idAw7?&xD$DRe^D~}uI#mcIwzRv9t;}&s zta3z=g1@a|%i&E1<8k{6ASaiJihm=D*4)E_P6@#SkZK7P*K@!@1pUU~W{}Qyly@4Z zhpc=@VdUN)G1UmSm>-%y%dgVBXI;^6d_Af?t;pbVk}utL^%d)ScBkcB3u54=03P{2 zf7{%DI-6Y5thL)=1^heNG7-lHJojJIgIUTh`VBiCb>U597kdln#P-sz#!bKy47B7k$}`6q;f}@_gb8{5;o_T3{ElF zR&9+H5!aP!u&PxzWO8}~RR|q;`qHbg1CvhUv0#AePI(@+8s&}-cTxr@bDB~z*-~;S zxLC6ctqX=$D#M`_(COO3Tr$Nl2`{f>T)31GgOF+C827BIQ&UEesNl~)Q<``+$XRQ5 zHmn51%N{y0nOk>(Zf&bFm_#CY;{&ovG?6V{FZkWIQ5{r2hbgX-ziljOQek%q@2GTBS;nT=y?9M>WEivbGU*z z0~{LN8I$i+ayjFWItslUhFEjd^~vc}rvZ^kVhHGe3N2;dDI2m+Q=ZhsXhh1bkTTfp zD$3441mtI@tx?GU{Mh!#6(;q@;&$M21}Z?%NrA}(@z$F6J69``$_Y8F^KhlV*vM{p z=A`qLq|OTuUO1w_GhVQZR?;Mi)k~%%h>_8ULtIvuaVWKW8?Z#EcC>{72M6x`N4WH^ z!j;G;pg!5gE1MBZnm0gjekC(p_<~r3o^i^g zdwAm<3~)2+?@{Si=(5JwGRYhQP-P%D$_K7G9@*_(kg?NsM26@4KXs1ja%1+=9MhAhxBk(oJ?HY}TaqHpD6KS}MP-~dvL*!eAR%On5 z`+i+L>RbIKZuHb^`Q_Nm6dZ+N=*+z{j@jp$tnG29>q6Sn$^mW^%r%Y9Z?gxq7Z$N@H&WoSRUdG1j)&@b=DACS zo6IsRO6m_1?Z)oe_N}81ZN!ni4y6{82{x+c;a>&Wj@DD2fN(mFN2#vYOw_IQ8yF_;J#GtIs3npT(aP9vNsu0J00)kHb4YwAe6qLO z^%xR2Oo(;lg1X``M?#4*NyMdez!vT01&nA=?E8GXztd_R0+qKm8?6Ipu@&cqcTs)0QqPZiQJDZED@>Wtle$F*{LP5Hl#wCm6#zPBY& zxZH8n5`RjzxA9&dvdsHu&+gxzNbml8)3};6HA@C~8fXS2UU0pA@l4URg}sgAX#+|+ zl{w&g{{W3tw%3ezpJllV8!k|d-h-&=S(@sbOZc@bCRoD^NKoS^*XVOf;E~q(+YaoE zliYN!H^!P!nlq}|sY|JwXT8r|VrVopx>YExR)uykQ9-@t^VQ`Os0bt!cKNA+UQ%vF54FPRE#^93P?Y z?OrXa*w16BO=&!3C55&!n)bl*LpJzbb~oM)-@i4_c;`Z0Q%@Sa5rK08{`3#yPh9mR ze=5pIq|YqaNdA=2y?CjJ!QlRM)6EtOk$QEfWDcB)2<%7cP5^phlS8;|4m~IiSLI>H zsH9%JAHt+3b_cCU#UwHSI{Q!w9k!9_Q5ed%1k#xudB<8!Txpt6YPYcAMB9{hahleH z#9>A!hw+WS#<{OK2szxR>5S5e5Q0?xb&ROR?u{c>QR;S3_?J##cQlB9+Der8pH2(% zyp8_sWY-o7?Kva!rQV~Gzz?lq^+;URVq|o;z9*7J*=Y$ve~wS^tXXDhoXsw(@Kq#ayE5?3OdGxCA9q<(=jk#3^)7F~=xeW#vBaNysI(77*2dw)XE`CsY z`cRuXK zYm611HdZ<5p8o)W!K!-4@9b^{36IMsp~&cdpO>vzGPS0U0>jbT<~d zliIxT$1r0a&PyvPIKVweUO^wqwsb8YQMY@IM&Jk%bG%4mEW~9002X-lUxdJPXoss45ugyg0p%R@9FE-yj((*TT5cBNpo_s z>EW)e$q~plM3`(6KnI_$e+uXI%gbruiDQxmxlPQ{5+dEVjE`So?b5F5_A}mFw9-od z0A@1ATt^^Ks6fvL8;?)Kny3E&2&SKLEYoByys`e_i*SS=m|*&TpUWs)b_XV_Hlc9M zZEq#SoRj5)oOI9gsdVXMiaAM*Sy6WrApovU(bt|c*mTWx_upgCw6mva(3tL?Fw;yA z?+Ss*1Ft`oaJreE=21C-2=?s^nD*~V}!bWaZ2>8$?%X+ynJYlav`9Bs(tFgfD64-Q>QHAr9=GZ0XZDP-Fl91?eBfXBCd zW4&nWI{ox|n@9GkVcfxF@`+!&{6L<$=CPC|&1;NyxQ5>BtPw+KW+F3?s<9jl{N0Bq zraRWXj2bS1Y}W`9OSsgdOvmSPagvMEAI`b8M$|QnSdd)H4)y)aZM!6OZ%@bHHDcxN z=hqkQHnLjVAREoZY*lgUNIiRY??t*cCaiQ;(O*xf+s}6!eVi#R44Xg)>CbVV)w2sM zmn6(cMI@ZI199KD{{Z#Yd^(BBiD4@m#uyOWz~ehlrBb@SvW8hj>&mR^s(gkAD06^G z=zqqb5qnZd@8w9PggT^oO~jx)j)WgxoK`E_>M<)?{{Uv(PXjB&6d#!s{oIk%4o?-j zw(zVk9kg;{KsQM)KI!Za1xM2ra8Kj_6K>U9ee8jZjwyRWta;7Woi3Sa3_P<)b0Z=# z+%enRfm=4ZbXuO9WjylDBdj7ZOw}!5vhu~#0v-1-xmDgv6T1f=5eX4{-V7L zOz{HhwkB4__}dc1Il%t%j^or*x?*Xfzlb6UaJqy9B+-yrmw?#!{$tv(_1mY4XfI+c z49mTnKXtksdJ5gvVG`-?>Q&U?m63Daxoe3Q<3y4MU?hpMGINzb$z(0EMPs>7T#mKnHj@;% zZKSULyK7oo$t^WwAYwe_S5l`1eSc7Dl*w^DBKFocw~pX24IkY(;j>syR@QZ8AZ(Np zFfiCXbB{y%RqY#Eg67%nnm}9t2w{<*>-DUyTI3{>h@~p5LnvOk#tw1U+xqcV2;zzjBl=>bM;YSX80h-Uf;ic2W*%fG9gk3b!N~lppI%AipTfPb#5ywT zIy{zS11kRV2J~<}eGV~-@mWK}N%bDMq+ElBKaWarR^6U4j@;4!+JyAo z>MAn=vEzY?li`A0a^NPe_-XjQ$le72D9$vI}H>v;c`22ON4-j&`W^ z6q(07R8suo2Q&z3V*Hs&G zMw?fXInD_K&}OA!g#a9oIl<@aRdEC}5scx9=imPT*TqEgh;M_b2XXv={an!CEyms9af>^lp7?Kx93gO2#-u~A0H{kSMcjpZ>C5haL7Xj zTyu|1eMd^0#82hg+#5j_+Dj#k**2<-sZ8YK1pV(`=M_Gc zeQj}WZ(~jECk?ScInLbR6Wn#{#ak0;^WH2sMI>aC_gQQl;PoAGkI#zYl$y|MeM*q% zmXb#yRgUA38KrICIPdl8oMS!fp1AOp;ngoKOx>n8m`j(;BcWdIQk=igB#gz}h)22g7GTxSIO%XqH4w z#-aA`KJmfp$NBGE2BO%#eq-C5{DU9l*Q5A`Xm7NmI~5Y;Frc%SQY5E!Y)P=4{xd}rFQ z6HnHo)nr{l)n!?n7m{8hInFTLU~|wB>0X4lihRQ&k>yBG6dQ=?kVoU!r{ha5lMTf2 zs=ShUgL113V~)i1{QDYeyNcLXGvU#qo;aH5sEBU}a;m0^U6Zr9**Da{{e(L7_X>2yNv0_jFq_1+P zan3={;e+125$vFyo?yXBmM+=oPs(z8b)pRl^6oD;?XfE4g%29;!1ed~*3hojyL}I}ZyIA9R&?shl&=%nloZvO#>X4bU^{eP`_=Q?G zN0VBMrz1DTejSTgvob3G0Hq?ICC3}Rjd|9Gc=~pzzGRX{p|;8t;O+1Diu4#fN+V`B zXhLHW4hPWtS25!qJ{Nd3nhO4X}7nWJY+*5j7?Z8~rxxG%L?cu7b1 zi0s(zI@dd?S-rleJSXnXt+4b`2tViAs$8i1HI4jlwbcYqgU(l{>05Kn9p#)-oG$hO z+@JMwV}>8>o`;`$8@d&a5!lBr4tTB0i{W>m#}kj=K)XX@?bc)L6gmM1>tW#PVgL#&glW~fqN=IGd{JRD$W^Q#^xyG=t^dxgd%jWS2~fW;>630asR{VDx;%|>`Ub)j>U#Ytqx zs5l^+2moMyw1AK?&M8I*Q9y+t4y67RdRH4&pz?q?DXs zQ&Z_o2aX3B2iFwFZrSTn7S8|!pK6V`!98iAF=AE?$*unY4NHweX!j4DbJHh-SP+#i zGDT_VbBMK=OB^e<#y;QVRS55y)GT36c<;ss8SPi2VtVb`cq6ChSw+iARY7IOLuVQH zs}Zrd=h~{XtHYTaws_=v8kXW^OLmYJ=lF;R^sMM+ zEewH%TR9m|%jwdXhgwOx8;Ex0SxYN12RP=E+23lgZOTstPI>yCwOZ0bw@iNNZNZ08 zgU8SgYCAcdKXzX#N!mw1bI(07O5!bRE&hv{7a`e3N$02^olUK}v3oS&#(N&bIT*d%a1pVN1fs@*y@omwH(V`hvlZNLX%7LS))1o%ER=F}Ua0Yi^bSF5f zHxucXVVY--Ij#?r@-cE)@_5b$a0Y$q_Nj5?Y1T{|s7CA0BZ}hg<7?j&Gzbc)xCq!% zcI_C+?~VsQjc{V&bfi)}3L7Zkg;v(tBZ4Ia9ltjmjFZXkIr`OhvALDZ)5RRJ099Dv zU}STgb>N(5@~G}7ofSaye4!wevhsGeL;LW5n5r{hdAgU`?2(#gOeW~q4CD;wBoWUi z918O6$75GdYlV|!%6M(Sum@`ckCz1X9nLUMy*}pKPb(~&6@n<*eCAVMD;rAopY);Bjy%l4TPS!7eVN5Ux`GtWHo4_qH=f(bmPjXe07Rs6S)knB`o5L?)1 zr*2JNmcl?LFi9k=NqmL}cd!KKHJho~$Sj4W%px_D9#CH|cHnYy+?u4+fVFF=Lhn4S zo$&-*k(}g#!Sv5wnBuG5YB0x*maNh`?@yHOJn}*H9cqr2mzJ^ILFJ{RWfm~6xyT@7 z;fEuk$oCayCX&*0yq-}lv+~=?ET1pSx8DP%JN+s9G&>fewRx-~m+a27?cW;t_}!C? zFaQzMoF27(5+b9_Nn~Ncc!pGw*BD<~$JB3T)1iXtOf#*(E#*6}-RM2Z!Rim^S{h!X zX)d1=q}NNhWQB`*^Unu&raKOE#U}>CRk7JLf}v?W>M13`sz+0+92(WuFJQjX!>-?%L$3oX>NENN zRmO+dTN%!HuW_@~r-3tb)3o zgUr}6!4XFQ^688N_#6+!S379!8)GDFITV{6jV)1y?wFFidv2{0BrHBw$T;Lm*AX0tj`a^lQrL4Y z263NiU?cwktyZzRGuo>Va%dRkIqW|gco_qpJ*k5RloEOapK5jx?xXmPCf`~d<(w+eTXCA=Q5RJ&rMk$S*pyHf)>q*byOa+Miz>og`T}uO)ZXM2V5`&jB|{P{yjSOt8vO*cE$z<2>u`Q{{YvlYe~aL6C7u1 z4320VVCB>JwL*uoA+-e%9R^j-yX<@i4#n<0r%#tW$w>>_eLNWSQloAQza3hX4--$6EFvq7~QC>@^G|B94 zE`(-Vq)7L2IOn$=IPce*ZQHoFljV%DI3OutLH__~bmFKU7J(NY@opeWMiDl)DBlU=C66l72?L?1j7-DhDlHfEr5NEW!~Ffe`&(E zR*5C6A1C*6Z7yE`91>1Pp~p_OLsLoYzSA383FCJRR#)1fhRMks43c^uTD2R9+ql)_ ziuPzFNS4Y0`^SKjlffS-qD?jN>qV@ zefB>&BRrmQ&uk8V3dFndCA_u*+UDYEBxTEtkfR&EP6#Kc!6&fIJ$el?=9i{e+{Qys zGf1*|O%aPCH|kiNkO=9Kfyl0&)!?>^%UOy5daPl$@CM>WGJg)$nQrpvI!gI|T!5g- z`HBpjlu|NI3FrCtt+?()u_F{lY+&t>;1R(en4_7M%sOkJ4_c!&;)N$XRz1$Hhj0&A z^Xe|kf%K;uZJy(iyK$?kk^>C;)*h*-3(Gm6Iol%bV8h zAggAnu6J`l2;X>--lbL|Jo{50^rdDSLX4kUU`RGPfuES3c&Px|N`upif*-w~z*P7- z&T~vd!(fhnQCgOB2HK=xbtHAHklj~r<5wUo6+j&J1ox^!XzR4OW0~3spZ79`jm~fa zw+H#x1*qA{rD}88%GohKH+qi8@fFi)(gl<=6S;XjimT&j5vR4kUK&L50?9P!f>qyP_G)e z?N`!f$jKilM z8K4cjbz^29SG*}I+iEjkHy%tcvn!mFfIpe6o5p5w$s~XVYUPOXt=T~zHZ$}b)Qq1{ znWSWLdF105@9AE#peOc*j0>Oz!)H8$o^j84OYN3WxF7 z5B08WTzRQz7P-3s25Bt_-y$h+?a2yHBaicnX$v&W&?%TMH|_aO+=JKDV~Uv>42D>I z=F1#lWQ>8q^c;?T{pv|)MUEA>8(7DbY~X+Z>(AG%c(%6XTE%O`yOgvkXB$9?x+{X) zKyIY%$vD93KmA$SZQQakw~h~xySlQl!P>x_XY0`8q59UTGr#W8ZSxd7WUg{Lu*cW7 zJL0Rs7;9NxL3d{1in_}mFVu{1I{yGJy?D5>GGTtUa=dI29m6|icNPR^34xus9QqvR zv8=PINoNzNgE7SzxR4W)7c58^Jm;o*4r#iL?fs;T?+6iGOe6&IQ2L+lj&gf*NqS~4 z=GqH%g|j!Bs;6>;^Ne+4>~r_Nl};&;()ABO=Y}}fF>Sb3Rb^7XpEgE$`V4ba zZSQUGZ*J@^oo(TjL@2h%!5y)d$vsbAGt!{d*uI_xlr3#+xr#KRJW?n)CvXQis^b|sAB{?-SMl_!LNzU$bE#d# zXFPSOHRWrYSYjlW8NkOwilr2pWmPAy12r}L#iEQb9ZAk}R8Gw15R_~lFlzjAvoGG` z)~enn+k)fnw<3ri4ee2}WyZl^Nyok^2<$VDdVWDbMKl#BJ?m6vN0K=GY2k8nk|-w~ zxHPp>t4jC#|E=mu&cTXEZhpwqYuG@Kwk z#Ui-v(0fo}4gq$5(v@w%;K;yzDv&bmoyx3E23*%Z>sG0#E_! zNIVMPi%3R?G1YsQ2Mr+^Ys1Xg#KG9 zNc24}CkEqOQU_=)U61D26vD$U=asC4QKCPXp;vDtvFCI!31~I_zT6PCzyRjHt_4TPh%JZGqug*X?$I`tAz%#SY zb!>USOabe+AJV+y9n#I7?A=efuJhsBr}pjM@-}VH>S}7M!Jtg^C}dbp5z1qL6qd;J z$MmXqqAPPDn6OyR<%vc{)0}WRjtyM5n%pyaw+2UrNpPg{4m)=3(~r)pGTU6>G?wPv zG2E&F!VKi?Bd>h)uMxzeF{u@U&RC_2Bw`h|?jWuPHi4f({cAH;w*Jd+J}ZfW1Y>6s z>{i@)A&LGGpUCmns%qDFIz8fup6yDre6qGmmN{n_;PK!2X0KW5Hr^sjn`eb2K^8^K zna=UhF#a9}(nqJ#nt>N9++Ph}O=#8-kj0NL6P(HjCj_3P5O_HKYSy0(xYHL)Yi4Pc zu(t9z&zg5PUf;yNoikjWlu_I2GQj25Xwkf+^70!Q&q4qoVCTOzuQs`M_c2~t*&i+t zS!HK3JeV1LkZ=Y8p9x_0GI$sS4wY5~eVDeAv?6QerOdwv33a-zNj_IOq@4{3!M>xYZ<&EYrLhu3N`pEC^;urY`X^gd?cI zBy*g%t~1`cc>FOkrtkEK8bV}s560q2JY)gs#~fExceV*6E4ystISsdKkMSSMxD8TU z=-!cp1nBho|UXt?K8K}QmvnI-R^SSwESMZ)r{zdQDoYkUvrsq6PbyDAKnsJOoecnFy&IcIHGm}s;RA^ zsu=d`Knt97Jo{5(URwi^ihJi69et^(z-*rM3|#cc&#gP2F`venj(9Yqugu5VfF%TQ za1XUOI|GHt9+eNx+XQ_n%H(IC(tsxp#c&7B>(Z10$CJmgr~@9k$Kg|;ByZoJZj`PB zg~I%xlgBld@)mbsN6c#UhYIDmz^u;nASCK=YhGYr(V$(!bLH?o`e*R0QS%&DuB9@` zDn@_>MF0WxszPLTiUWoq;YMqz@En32Ro&0Z!BG3=xmZ{T+~l4yT_=X|1)JOkJDTDo z1K1Ex^QP6+gnC!oWPMIsZy|TYfCt(^eca=5KHioUN@HWhsQ@Zdnc4uGSE7+0UsC&eOHY7j&YI2BzBT%T3bYf#Wb#AdxeODBxDj$IJFr#bT&kwQjNtK; zpRalrz>%LGg?W3a#Tj{JK%@7PF5|nfBdHv89X%_zgGr8S$Wki>O*K%5Dyy}@#s^&U zw0^m+e@oNZoZLw}Eyj3oHyrwUj!9qCwPBOA~9w)!`3q37#R8Jt}Zuo4syUA|RA`0{@N zS9Zow$2u!Scw}L?H?bY-W2m!iciZG)Sw2#|a7S9uib51*V~CJdO|?dr#= ztUodD{7#4){Tj&&w>@M$0r+OM+Hg1n>rIG~_Bd|sWVdz-9e7|q>FjGJ+Rn=IHgg`y zQM|cP2mx4i{5y|gD$CE$&GL+Q?^xQFm1%o+Wod3=d|`wQv=i!a)Z+u_1sv839$$iK zt;I=Ezuv`Wb(C-B@@?Jw+nVjiTipz3Vv82R-PnC@)TqaDzxORWP{E#TioX;%_o~N$K4zXp*aPDBuHZS38K8B> ze<4mhB?_S9Jmk|5U=9d0#?CSh2YPYu?M!lTX#mFPIvSQR0MA_1PmQGDWK^9Z1a&y3 z0u#>^n?}G$p^wZ3DBusEqyhj>Ky#l;co;nP_ofCpBRJ=^I2=;QZI2Apx)nmQBQ zRLTKBNXgIipkR?R^S6&`orb}TRJQAwo0G*bsM^ic;*bV_jn@(W6^kLl zAnoZ}8edy~`tHBdn2$$`O@ZeRGpokq%>Ckh#sFkwet(5MRaa1X?d3?Vhs@}~glyeE z0uFf}j%sUMHH=QfEs=wte19W~VvGr3UzJuy0FH5-dgOOC;MaDj(8g)nZKd7Wn$^IW zG8zZk9XoXyBz5F*^yyan(X^>YHJXGj#<$r`60af)0 zpZiZvx6kg}yo^0cu1D+5G$u)=TSa4NP-Ul?jFY+Q&U&AxrCyCP*kgg7+>=dEJf;5t zWwwu{PJ@q6dX@!UULd+1>nwh2h+7JK(phQ$0BN>ae#VHb0Z_~`Mh7&{6Uxx|H&>m1 m)+MZrhx?}-5$I{UCH2I*4xc2Cx!T$?N$z%vT)fKQ&;Qxpyu1eh literal 0 HcmV?d00001 diff --git a/aio/content/marketing/README.md b/aio/content/marketing/README.md new file mode 100644 index 0000000000..67b249e55c --- /dev/null +++ b/aio/content/marketing/README.md @@ -0,0 +1,34 @@ +# Contributors page + +We have an official accounting of who is on the Angular Team, who are "trusted collaborators" (see team.angular.io/collaborators), and so on. + +The contributors.json should be maintained to keep our "org chart" in a single consistent place. + +## GDE listings + +There are two pages: + +https://developers.google.com/experts/all/technology/angular +(Googlers: source at http://google3/googledata/devsite/content/en/experts/all/technology/angular.html) +which is maintained by Dawid Ostrowski based on a spreadsheet +https://docs.google.com/spreadsheets/d/1_Ls2Kle7NxPBIG8f3OEVZ4gJZ8OCTtBxGYwMPb1TUVE/edit#gid=0 + +and ours: https://angular.io/about?group=GDE which is derived from contributors.json. + +Alex Eagle is investigating how to reconcile these two lists. + +## Checking the keys + +Keys in contributors.json should be GitHub handles. (Most currently are, but not all) +This will allow us to use GitHub as the default source for things like Name, Avatar, etc. + +## Processing the data + +Install https://stedolan.github.io/jq/ which is amazing. + +```sh +for handle in $(jq keys[] --raw-output < aio/content/marketing/contributors.json) +do echo -e "\n$handle\n---------\n"; curl --silent -H "Authorization: token ${TOKEN}" https://api.github.com/users/$handle \ + | jq ".message,.name,.company,.blog,.bio" --raw-output +done +``` diff --git a/aio/content/marketing/about.html b/aio/content/marketing/about.html index 4039734d1a..4fec544822 100644 --- a/aio/content/marketing/about.html +++ b/aio/content/marketing/about.html @@ -1,8 +1,8 @@ -

Angular Contributors

+

Angular Collaborators

Building For the Future

Angular is built by a team of engineers who share a passion for making web development feel effortless. We believe that writing beautiful apps should be joyful and fun. We're building a platform for the future.

- + \ No newline at end of file diff --git a/aio/content/marketing/contributors.json b/aio/content/marketing/contributors.json index 63a15a10a8..589c36c7ac 100644 --- a/aio/content/marketing/contributors.json +++ b/aio/content/marketing/contributors.json @@ -1,29 +1,23 @@ { - "misko": { + "mhevery": { "name": "Miško Hevery", "picture": "misko.jpg", "twitter": "mhevery", "website": "http://misko.hevery.com", "bio": "Miško Hevery is the creator of AngularJS framework. He has passion for making complex things simple. He currently works at Google, but has previously worked at Adobe, Sun Microsystems, Intel, and Xerox, where he became an expert in building web applications in web related technologies such as Java, JavaScript, Flex and ActionScript.", - "group": "Angular" + "group": "Angular", + "lead": "kara" }, - "igor": { + "igorminar": { "name": "Igor Minar", "picture": "igor-minar.jpg", "twitter": "IgorMinar", "website": "https://google.com/+IgorMinar", "bio": "Igor is a software engineer at Google. He is a lead on the Angular project, practitioner of test driven development, open source enthusiast, hacker. In his free time, Igor enjoys spending time with his wife and two kids, doing outdoor activities (including but not limited to sports, gardening and building retaining walls).", - "group": "Angular" + "group": "Angular", + "lead": "bradlygreen" }, - "naomi": { - "name": "Naomi Black", - "picture": "naomi.jpg", - "twitter": "naomitraveller", - "website": "http://google.com/+NaomiBlack", - "bio": "Naomi is Angular's TPM generalist and jack-of-all-trades. She supports Angular's internal Google users and solves hard-to-define problems. She's been at Google since 2006, as a technical program manager on projects ranging from Accessibility to Google Transit. She fights daleks in her spare time.", - "group": "Angular" - }, - "brad": { + "bradlygreen": { "name": "Brad Green", "picture": "brad-green.jpg", "twitter": "bradlygreen", @@ -31,29 +25,23 @@ "bio": "Brad Green works at Google as an engineering director. Brad manages the Google Sales Platform suite of projects as well as the AngularJS framework. Prior to Google, Brad worked on the early mobile web at AvantGo, founded and sold startups, and spent a few hard years toiling as a caterer. Brad's first job out of school was as lackey to Steve Jobs at NeXT Computer writing demo software and designing his slide presentations. Brad enjoys throwing dinner parties with his wife Heather and putting on plays with his children.", "group": "Angular" }, - "juleskremer": { - "name": "Jules Kremer", - "picture": "juleskremer.jpg", - "twitter": "jules_kremer", - "website": "https://plus.google.com/+JulesKremer", - "bio": "Jules is Head of Angular Developer Relations at Google. When not working with developers, Jules is often bending into pretzel-like shapes, creating paths through thick jungle with a machete or drinking really awesome beer.", - "group": "Angular" - }, "jelbourn": { "name": "Jeremy Elbourn", "picture": "jelbourn.jpg", "twitter": "jelbourn", "website": "https://plus.google.com/+JeremyElbourn/", "bio": "Angular Material Team Lead. FE Engineer @ Google specializing in AngularJS, component design, and the cleanest of code.", - "group": "Angular" + "group": "Angular", + "lead": "igorminar" }, - "pete": { + "petebacondarwin": { "name": "Pete Bacon Darwin", "picture": "pete.jpg", "twitter": "petebd", "website": "http://www.bacondarwin.com", "bio": "AngularJS for JS Team Lead. Pete has been working on the core team since 2012 and became the team lead for the AngularJS for JS branch in November 2014. He has co-authored a book on AngularJS and regularly talks about and teaches Angular.", - "group": "Angular" + "group": "Angular", + "lead": "igorminar" }, "stephenfluin": { "name": "Stephen Fluin", @@ -61,7 +49,8 @@ "twitter": "stephenfluin", "website": "https://plus.google.com/+stephenfluin", "bio": "Stephen is a Developer Advocate working on the Angular team. Before joining Google, he was a Google Expert. Stephen loves to help enterprises use technology more effectively.", - "group": "Angular" + "group": "Angular", + "lead": "bradlygreen" }, "robwormald": { "name": "Rob Wormald", @@ -69,23 +58,17 @@ "twitter": "robwormald", "website": "http://github.com/robwormald", "bio": "Rob is a Developer Advocate on the Angular team at Google. He's the Angular team's resident reactive programming geek and founded the Reactive Extensions for Angular project, ngrx.", - "group": "Angular" + "group": "Angular", + "lead": "stephenfluin" }, - "tobias": { - "name": "Tobias Bosch", - "picture": "tobias.jpg", - "twitter": "tbosch1009", - "website": "https://plus.google.com/+TobiasBosch", - "bio": "Tobias Bosch is a software engineer at Google. He is part of the Angular core team and works on Angular.", - "group": "Angular" - }, - "rado": { + "rkirov": { "name": "Rado Kirov", "picture": "rado.jpg", "twitter": "radokirov", "website": "https://plus.sandbox.google.com/+RadoslavKirov", "bio": "Rado has been on the Angular Core team since Summer 2014. Before Angular, he worked on the Adsense serving stack, responsible for serving billions of ads daily. Being passionate about open source, he made contributions to Angular as a Google-20% project, before making the fulltime jump. He is a recovering academic; ask him about error-correcting codes from algebraic curves (or don't).", - "group": "Angular" + "group": "Angular", + "lead": "mprobst" }, "alexeagle": { "name": "Alex Eagle", @@ -93,39 +76,61 @@ "twitter": "jakeherringbone", "website": "http://google.com/+alexeagle", "bio": "Alex works on language tooling for JavaScript and TypeScript. Previously Alex spent five years in Google's developer testing tools. He has developed systems including Google's continuous integration service, capturing build&test failures, and explaining them to developers. Before Google, Alex worked at startups including Opower, and consulted for large government IT. In his 20% time, he created the Error-Prone static analysis tool, which detects common Java programming mistakes and reports them as compile errors.", - "group": "Angular" + "group": "Angular", + "lead": "igorminar" }, - "martinprobst": { + "kyliau": { + "name": "Keen Yee Liau", + "group": "Angular", + "lead": "alexeagle", + "picture": "kyliau.jpg" + }, + "clydin": { + "name": "Charles Lyding", + "group": "Angular", + "lead": "alexeagle", + "picture": "clydin.jpg" + }, + "alan-agius4": { + "name": "Alan Agius", + "group": "Angular", + "lead": "alexeagle", + "picture": "alan-agius4.jpg", + "bio": "Angular CLI Member, Loves TypeScript, Build Tools, Food, Beer & Coffee :)" + }, + "gregmagolan": { + "name": "Greg Magolan", + "group": "Angular", + "lead": "alexeagle", + "picture": "gregmagolan.jpg", + "bio": "Building great software with Angular and Node.js." + }, + "mprobst": { "name": "Martin Probst", "picture": "martin-probst.jpg", "twitter": "martin_probst", "website": "http://probst.io", "bio": "Martin is a software engineer at Google in the AngularJS team. He holds a MSc in Software Engineering from HPI in Potsdam, Germany. Before joining the AngularJS team at Google, he worked at a database startup in the Netherlands, at EMC, at SAP, and as a freelancer. In his free time, he likes to cook and sail, not necessarily at the same time.", - "group": "Angular" + "group": "Angular", + "lead": "bradlygreen" }, - "julieralph": { - "name": "Julie Ralph", - "picture": "julie-ralph.jpg", - "twitter": "SomeJulie", - "website": "https://plus.google.com/+JulieRalph", - "bio": "Julie Ralph works as a Software Engineer in Test at Google in Seattle and is the lead developer on the Angular end-to-end testing framework Protractor.", - "group": "Angular" - }, - "alexrickabaugh": { + "alxhub": { "name": "Alex Rickabaugh", "picture": "alex-rickabaugh.jpg", "twitter": "synalx", "website": "https://plus.google.com/+AlexRickabaugh/about", "bio": "Core team member working to optimize the Angular platform for the next generation of applications, including mobile. Before joining the Angular team, Alex worked in the Google sales organization where he helped build the first large Angular application within Google.", - "group": "Angular" + "group": "Angular", + "lead": "kara" }, - "matias": { + "matsko": { "name": "Matias Niemela", "picture": "matias.jpg", "twitter": "yearofmoo", "website": "http://yearofmoo.com", "bio": "Matias Niemela is a fullstack web developer who has been programming & building websites for over 10 years, and a core team member of AngularJS for two years. In the spring of 2015 Matias joined Angular full time at Google. In his free time Matias loves to build complex things and is always up for public speaking, travelling and tweaking his current Vim setup.", - "group": "Angular" + "group": "Angular", + "lead": "kara" }, "hansl": { "name": "Hans Larsen", @@ -133,7 +138,8 @@ "twitter": "hanslatwork", "website": "http://www.codingatwork.com/", "bio": "Hans is a software engineer at Google on the Angular team and was previously at Slack. He works everyday to help make it easier for everyone to create beautiful, consistent web applications using Angular, using Material Design components and the CLI tool.", - "group": "Angular" + "group": "Angular", + "lead": "alexeagle" }, "kara": { "name": "Kara Erickson", @@ -141,52 +147,40 @@ "twitter": "karaforthewin", "website": "https://github.com/kara", "bio": "Kara is a software engineer on the Angular team at Google and a co-organizer of the Angular-SF Meetup. Prior to Google, she helped build UI components in Angular for guest management systems at OpenTable. She enjoys snacking indiscriminately and probably other things too.", - "group": "Angular" + "group": "Angular", + "lead": "igorminar" }, - "chuckj": { - "name": "Chuck Jazdzewski", - "picture": "chuckj.jpg", - "twitter": "chuckjaz", - "website": "http://removingalldoubt.com", - "bio": "Chuck is a Software Engineer on the Angular team at Google. He is a programming language geek, UI framework and component library veteran, and has a passion for simplifying the task of programming. Before Google, he worked at Microsoft and Borland.", - "group": "Angular" - }, - "vikram": { + "vikerman": { "name": "Vikram Subramanian", "picture": "vikram.jpg", "twitter": "vikerman", "bio": "Vikram is a Software Engineer on the Angular team focused on Engineering Productivity. That means he makes sure people on the team can move fast and not break things. Vikram enjoys doing Yoga and going on walks with his daughter.", - "group": "Angular" + "group": "Angular", + "lead": "alexeagle" }, - "maxsills": { - "name": "Max Sills", - "picture": "max-sills.jpg", - "twitter": "angularjs", - "website": "http://google-opensource.blogspot.com/", - "bio": "Max Sills is Angular's Open Source lawyer.", - "group": "Angular" - }, - "pawel": { + "pkozlowski-opensource": { "name": "Pawel Kozlowski", "picture": "pawel.jpg", "twitter": "pkozlowski_os", "bio": "Open source hacker, AngularJS book author, AngularUI lead developer. Pawel is an software-development addict who believes in free, open source software. He is a core contributor to the AngularJS framework, AngularUI, Karma-runner and several other projects. He is the co-author of the \"Mastering Web Application Development with AngularJS\" book. When not coding, Pawel can be spotted speaking at various software development conferences.", - "group": "Angular" + "group": "Angular", + "lead": "kara" }, - "paulgschwendtner": { + "devversion": { "name": "Paul Gschwendtner", "picture": "devversion.jpg", "twitter": "DevVersion", "website": "https://github.com/DevVersion", "bio": "Paul is a 17-year-old developer living in Germany. While he attends school, Paul works as a core team member on Angular Material. Paul focuses on tooling and building components for Angular.", - "group": "Angular" + "group": "Angular", + "lead": "kara" }, - "elad": { + "EladBezalel": { "name": "Elad Bezalel", "picture": "eladbezalel.jpg", "website": "https://github.com/EladBezalel", "bio": "Elad is a fullstack developer with a very strong love for design. Since 8 years old, he's been designing in Photoshop and later on fell in love with programing. This strong bond between design and computer programming gave birth to a new kind of love. And he is currently doing the combination of both, as a core member of the ngMaterial project.", - "group": "Angular" + "group": "GDE" }, "marclaval": { "name": "Marc Laval", @@ -194,7 +188,8 @@ "twitter": "marclaval", "website": "https://github.com/mlaval", "bio": "Marc is a manager at Amadeus where he leads the team in charge of developing and recommending UI frameworks for the company. He is also an open source developer and a contributor to Angular.", - "group": "Angular" + "group": "Angular", + "lead": "kara" }, "wardbell": { "name": "Ward Bell", @@ -202,14 +197,15 @@ "website": "https://github.com/wardbell", "twitter": "wardbell", "bio": "Ward is an all-around developer with JavaScript, Node.js®, and .net chops. He's a frequent conference speaker and podcaster, trainer, Google Developer Expert for Angular, Microsoft MVP, and PluralSight author. He is also president of IdeaBlade, an enterprise software consulting firm and the makers of breeze.js. He would like to get more sleep and spend more time in the mountains.", - "group": "Angular" + "group": "GDE" }, - "martinstaffa": { + "Narretz": { "name": "Martin Staffa", "picture": "martinstaffa.jpg", "twitter": "Narretz", "bio": "Martin is an English major turned web developer who loves frontend stuff. He's been part of the AngularJS team since 2014. If you can't find him roaming the Github issue queues, he's probably out with his camera somewhere.", - "group": "Angular" + "group": "Angular", + "lead": "petebacondarwin" }, "filipesilva": { "name": "Filipe Silva", @@ -217,29 +213,24 @@ "twitter": "filipematossilv", "website": "http://github.com/filipesilva", "bio": "Filipe is a passion-driven developer that always strives for the most elegant solution for each problem. He is currently an author for Angular.io, a core contributor for Angular-CLI and senior front end engineer at KonnectAgain. When not busy going through PRs, you can find him scouring reddit for new dinner recipes to cook or enjoying a craft beer in Dublin.", - "group": "Angular" + "group": "Angular", + "lead": "alexeagle" }, "andrewseguin": { "name": "Andrew Seguin", "picture": "andrewseguin.jpg", "website": "http://github.com/andrewseguin", "bio": "Andrew is an engineer on the Angular Material team working on bringing material components to the world. When he’s not obsessing over pixels and design, he is probably off somewhere having adventures with his wife and daughters.", - "group": "Angular" - }, - "jesusrodriguez": { - "name": "Jesús Rodríguez", - "picture": "jesus-rodriguez.jpg", - "twitter": "foxandxss", - "website": "http://angular-tips.com", - "bio": "Jesus is an open source lover, a book author and editor, and AngularUI lead developer. He is currently a core contributor to the UI Bootstrap project.", - "group": "Angular" + "group": "Angular", + "lead": "jelbourn" }, "crisbeto": { "name": "Kristiyan Kostadinov", "picture": "crisbeto.jpg", "website": "http://crisbeto.com/", "bio": "Kristiyan is a front-end developer, passionate open-source contributor and a core team member on Angular Material.", - "group": "Angular" + "group": "Angular", + "lead": "jelbourn" }, "gkalpak": { "name": "Georgios Kalpakas", @@ -247,19 +238,22 @@ "twitter": "gkalpakas", "website": "https://github.com/gkalpak", "bio": "George is a Software Engineer with a passion for chess, robotics and automating stuff. He has a strong need to know how things work (so if you already know, he'd love to have a talk with you). He has been a member of the AngularJS team since 2014. When not doing geeky stuff, he is probably trying to convince his wife and kids to apply programming principles in real life. (Or is it the other way around?)", - "group": "Angular" + "group": "Angular", + "lead": "igorminar" }, "mmalerba": { "name": "Miles Malerba", "picture": "mmalerba.jpg", "bio": "Miles is a software engineer on the Angular Material team at Google. In addition to Javascripting he enjoys eating food and ogling cute puppies.", - "group": "Angular" + "group": "Angular", + "lead": "jelbourn" }, "jasonaden": { "name": "Jason Aden", "picture": "jasonaden.jpg", "bio": "Jason is a software engineer at Google on the Angular Core team. He is enthusiastic about Angular and application development in the modern age. In his free time Jason enjoys spending time with his wife and four children and doing outdoor activities (hiking, fishing, snowboarding, etc.).", - "group": "Angular" + "group": "Angular", + "lead": "igorminar" }, "jeffwhelpley": { "name": "Jeff Whelpley", @@ -299,13 +293,14 @@ "bio": "Ralph(Zhicheng Wang) is a senior consultant at ThoughtWorks and also a GDE. He is a technology enthusiast and he is a passionate advocate of 'Simplicity, Professionalism and Sharing'. In his eighteen years of R&D career, he worked as tester, R&D engineer, project manager, product manager and CTO. He is immersed in the excitement of the arrival of the baby.", "group": "GDE" }, - "wassim": { + "manekinekko": { "name": "Wassim Chegham", "picture": "wassim.jpg", "twitter": "manekinekko", "website": "https://medium.com/@wassimchegham", "bio": "Wassim (aka manekinekko on Twitter/Github) is a Developer Advocate at SFEIR, in Web technologies (Angular, Polymer, PWA, Web Components...). He is also a Developer Expert in Web technologies nominated by Google. He enjoys writing technical articles, meeting developers at events, speaking at conferences and contributing to open source projects. Wassim loves the Web Platform and works hard to move it forward.", - "group": "GDE" + "group": "Angular", + "mentor": "filipesilva" }, "chrisnoring": { "name": "Christoffer Noring", @@ -337,14 +332,8 @@ "twitter": "splaktar", "website": "https://www.DevIntent.com", "bio": "Lead for AngularJS Material. Owner and consultant at DevIntent. Ex-Angular GDE. Founder of the Google Developers Group (GDG) community on the Space Coast of Florida, USA.", - "group": "Angular" - }, - "mikebrocchi": { - "name": "Mike Brocchi", - "picture": "mike-brocchi.jpg", - "twitter": "brocco", - "bio": "Mike is a core team member of the Angular CLI team, a GDE and is also an instructor at egghead. Mike is passionate about helping others by writing code as well as teaching.", - "group": "Angular" + "group": "Angular", + "lead": "jelbourn" }, "manfredsteyer": { "name": "Manfred Steyer", @@ -370,15 +359,16 @@ "bio": "Based in Austin Texas, Jeremy is an application architect and homebrewer. He is a Google Developer Expert in Web Technologies and Angular, with a focus on speaking and training and author of Angular in Action and Ionic in Action.", "group": "GDE" }, - "minko": { + "mgechev": { "name": "Minko Gechev", "picture": "minko.jpg", "twitter": "mgechev", "website": "http://blog.mgechev.com", "bio": "Software engineer who enjoys theoretical computer science and its practical applications. Speaker, author of the book 'Switching to Angular', codelyzer, Guess.js, and the Go linter revive. Working for faster and more reliable software.", - "group": "Angular" + "group": "Angular", + "lead": "alexeagle" }, - "uri": { + "urish": { "name": "Uri Shaked", "picture": "urish.jpg", "twitter": "UriShaked", @@ -415,7 +405,8 @@ "picture": "ocombe.jpg", "twitter": "ocombe", "bio": "Olivier is a passionate front-end engineer who loves interacting with the community by doing open source projects (ocLazyLoad, ngx-translate…), being a panelist at Angular-Air, giving talks or just chatting on Twitter and Slack. He’s a member of the Angular Core team and works on i18n.", - "group": "Angular" + "group": "Angular", + "lead": "kara" }, "cironunes": { "name": "Ciro Nunes", @@ -446,7 +437,7 @@ "bio": "Co-founder and CTO of Thinktecture AG, as well as Google GDE and Microsoft MVP. Since two decades active as an engaged and passionate speaker on several software conferences and events all over the world. Some people call him 'Mr. Cross-Platform'.", "group": "GDE" }, - "shaireznik": { + "shairez": { "name": "Shai Reznik", "picture": "shaireznik.jpg", "twitter": "shai_reznik", @@ -486,7 +477,7 @@ "bio": "GDE (Google Developer Expert) Angular and Web Technologies, Women Who Code KL Director, Jecelyn specializes in professional application development with technologies, including Angular, HTML5, Typescript, JavaScript, CSS, C#, NodeJs, Cloud and ASP.NET.", "group": "GDE" }, - "vincirufus": { + "areai51": { "name": "Vinci Rufus", "picture": "vincirufus.jpg", "twitter": "areai51", @@ -494,7 +485,7 @@ "bio": "Director of Experience Technology at SapientRazorfish. Consults various brands on their frontend and mobile web architecture. A speaker at various forums and mentor at Launchpad Accelerator and ngGirls India. Spends free time playing with Angular, Preact, web-components ", "group": "GDE" }, - "thierrychatel": { + "tchatel": { "name": "Thierry Chatel", "picture": "thierrychatel.jpg", "twitter": "ThierryChatel", @@ -510,14 +501,6 @@ "bio": "Gerard is very excited about the future of the Web and JavaScript. Always happy Computer Science Engineer and humble Google Developer Expert. He loves to share his learnings by giving talks, trainings and writing about cool technologies. He loves running AngularZone and GraphQL London, mentoring students and giving back to the community.", "group": "GDE" }, - "amcdnl": { - "name": "Austin McDaniel", - "picture": "amcdnl.jpeg", - "twitter": "amcdnl", - "website": "https://amcdnl.com", - "bio": "Austin is an software architect with a passion for JavaScript and Angular. Austin loves to share his experiences with other like-minded developers by giving talks, blogging, podcasting and open-sourcing.", - "group": "Angular" - }, "nirkaufman": { "name": "Nir Kaufman", "picture": "nirkaufman.jpg", @@ -579,7 +562,8 @@ "picture": "elanaolson.jpg", "twitter": "elanathellama", "bio": "Elana is a Developer Relations intern on the Angular team at Google. She is working on migration paths from AngularJS to Angular and would love to chat about your experience with upgrading.", - "group": "Angular" + "group": "Angular", + "lead": "stephenfluin" }, "kevinyang": { "name": "Kevin Yang", @@ -660,4 +644,4 @@ "bio": "Leonardo is a Senior Software Engineer at Coinbase. He is deeply passionate about web performance and most recently developed Perfume.js to help companies prioritize roadmaps and business, through performance analytics. From 2018, co-organizer of the Angular San Francisco Meetup group and NGRome Conference.", "group": "GDE" } -} \ No newline at end of file +} diff --git a/aio/scripts/contributors/generate_org_chart.sh b/aio/scripts/contributors/generate_org_chart.sh new file mode 100755 index 0000000000..0299a9dbb9 --- /dev/null +++ b/aio/scripts/contributors/generate_org_chart.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +( + cd $(dirname $0) + echo "digraph {" + jq -f org_chart.jq --raw-output < ../../content/marketing/contributors.json + echo "}" +) | dot -Tpng > org.png \ No newline at end of file diff --git a/aio/scripts/contributors/org_chart.jq b/aio/scripts/contributors/org_chart.jq new file mode 100644 index 0000000000..fcd2668817 --- /dev/null +++ b/aio/scripts/contributors/org_chart.jq @@ -0,0 +1,11 @@ +# Produces a GraphViz Dot file from the data in the contributors.json file. +# Documentation for this syntax at https://stedolan.github.io/jq/manual +to_entries +| map(select(.value.group=="Angular" or .value.group=="Collaborator")) +| map(.value |= {name: .name, lead: (.lead // .mentor // "")}) +| map( + "\(.key|tojson) [ label = \(.value.name|tojson) ] ", + "\(.key|tojson) -> \(.value.lead|tojson)" + ) +[] + diff --git a/aio/scripts/contributors/populate_missing_contributor_fields.sh b/aio/scripts/contributors/populate_missing_contributor_fields.sh new file mode 100755 index 0000000000..3a3d0526a1 --- /dev/null +++ b/aio/scripts/contributors/populate_missing_contributor_fields.sh @@ -0,0 +1,32 @@ +#!/usr/bin/env bash +# +# Reads the contributors.json file and tries to fill in missing data from other sources. + +readonly MISSING_PICTURE_QUERY='with_entries(select(.value | has("picture") | not)) | keys[]' +readonly MISSING_BIO_QUERY='with_entries(select(.value | has("bio") | not)) | keys[]' + +( + cd $(dirname $0)/../../content/marketing + + for handle in $(jq "$MISSING_PICTURE_QUERY" --raw-output < contributors.json); do + avatar_url=$(curl --silent -H "Authorization: token ${TOKEN}" https://api.github.com/users/$handle \ + | jq ".avatar_url" --raw-output) + echo "Missing picture for $handle, downloading it from $avatar_url" + curl -o ../images/bios/$handle.jpg $avatar_url + newjson=$(mktemp) + jq ".\"$handle\".picture |= \"$handle.jpg\"" < contributors.json > $newjson + mv $newjson contributors.json + done + + for handle in $(jq "$MISSING_BIO_QUERY" --raw-output < contributors.json); do + bio=$(curl --silent -H "Authorization: token ${TOKEN}" https://api.github.com/users/$handle \ + | jq ".bio|tojson" --raw-output) + if [[ "$bio" != "null" ]]; then + echo "Missing bio for $handle, using \"$bio\"" + + newjson=$(mktemp) + jq ".\"$handle\".bio |= \"$bio\"" < contributors.json > $newjson + mv $newjson contributors.json + fi + done +) diff --git a/packages/benchpress/package.json b/packages/benchpress/package.json index 72cccaf76b..a7d77cd659 100644 --- a/packages/benchpress/package.json +++ b/packages/benchpress/package.json @@ -21,12 +21,9 @@ "angular", "benchmarks" ], - "contributors": [ - "Tobias Bosch (https://angular.io/)" - ], "license": "MIT", "bugs": { "url": "https://github.com/angular/angular/issues" }, "homepage": "https://github.com/angular/angular/tree/master/packages/compiler-cli" -} +} \ No newline at end of file diff --git a/packages/compiler-cli/package.json b/packages/compiler-cli/package.json index f2bb7c0262..a007ba85ca 100644 --- a/packages/compiler-cli/package.json +++ b/packages/compiler-cli/package.json @@ -37,10 +37,6 @@ "angular", "compiler" ], - "contributors": [ - "Tobias Bosch (https://angular.io/)", - "Alex Eagle (https://angular.io/)" - ], "license": "MIT", "bugs": { "url": "https://github.com/angular/angular/issues" @@ -49,4 +45,4 @@ "ng-update": { "packageGroup": "NG_UPDATE_PACKAGE_GROUP" } -} +} \ No newline at end of file From f856a6597b653454a515358bb372d2f4b686157b Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Wed, 6 Mar 2019 11:39:45 -0800 Subject: [PATCH 0245/1073] test(ivy): turn on passing Material tests for mat-select (#29144) PR Close #29144 --- .../angular_material_test_blocklist.js | 58 ++++++++----------- 1 file changed, 25 insertions(+), 33 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 311ee77723..ff51aec081 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -21,30 +21,6 @@ window.testBlocklist = { "error": "Error: Expected '

Pizza

Chocolate

' to be '', 'Expected the DomPortalOutlet to be empty after detach'.", "notes": "Unknown" }, - "CdkDrag in a drop container should be able to customize the preview element": { - "error": "Error: Expected cdk-drag cdk-drag-preview to contain 'custom-preview'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should position custom previews next to the pointer": { - "error": "Error: Expected 'translate3d(8px, 33px, 0px)' to be 'translate3d(50px, 50px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should lock position inside a drop container along the x axis": { - "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should lock position inside a drop container along the y axis": { - "error": "Error: Expected 'translate3d(8px, 83px, 0px)' to be 'translate3d(50px, 100px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should inherit the position locking from the drop container": { - "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should be able to customize the placeholder": { - "error": "Error: Expected cdk-drag cdk-drag-placeholder to contain 'custom-placeholder'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, "CdkTable should be able to render multiple header and footer rows": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", "notes": "Attempting to access content children before view is initialized" @@ -93,6 +69,30 @@ window.testBlocklist = { "error": "Error: Expected false to be true.", "notes": "Unknown" }, + "CdkDrag in a drop container should be able to customize the preview element": { + "error": "Error: Expected cdk-drag cdk-drag-preview to contain 'custom-preview'.", + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + }, + "CdkDrag in a drop container should position custom previews next to the pointer": { + "error": "Error: Expected 'translate3d(8px, 33px, 0px)' to be 'translate3d(50px, 50px, 0px)'.", + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + }, + "CdkDrag in a drop container should lock position inside a drop container along the x axis": { + "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + }, + "CdkDrag in a drop container should lock position inside a drop container along the y axis": { + "error": "Error: Expected 'translate3d(8px, 83px, 0px)' to be 'translate3d(50px, 100px, 0px)'.", + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + }, + "CdkDrag in a drop container should inherit the position locking from the drop container": { + "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + }, + "CdkDrag in a drop container should be able to customize the placeholder": { + "error": "Error: Expected cdk-drag cdk-drag-placeholder to contain 'custom-placeholder'.", + "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" + }, "CdkTree flat tree should initialize should be able to use units different from px for the indentation": { "error": "Error: Failed: Expected node level to be 15rem but was 28px", "notes": "Unknown" @@ -214,7 +214,7 @@ window.testBlocklist = { "notes": "Unknown" }, "MatSidenav should be fixed position when in fixed mode": { - "error": "Error: Expected ng-tns-c21962-0 ng-trigger ng-trigger-transform mat-drawer mat-sidenav mat-drawer-over ng-star-inserted to contain 'mat-sidenav-fixed'.", + "error": "Error: Expected ng-tns-c24896-0 ng-trigger ng-trigger-transform mat-drawer mat-sidenav mat-drawer-over ng-star-inserted to contain 'mat-sidenav-fixed'.", "notes": "FW-1132: Host class bindings don't work if super class has host class bindings" }, "MatSidenav should set fixed bottom and top when in fixed mode": { @@ -281,14 +281,6 @@ window.testBlocklist = { "error": "TypeError: Cannot read property 'componentInstance' of null", "notes": "FW-1059: DebugNode.query should query nodes in the logical tree" }, - "MatSelect when the select's value is accessed on initialization should not throw when trying to access the selected value on init": { - "error": "Error: Expected function not to throw, but it threw TypeError: Cannot read property 'selected' of undefined.", - "notes": "FW-1051: Property values changed in ngOnChanges throw ExpressionChanged errors" - }, - "MatSelect with custom trigger should allow the user to customize the label": { - "error": "TypeError: Cannot read property 'selected' of undefined", - "notes": "FW-1051: Property values changed in ngOnChanges throw ExpressionChanged errors" - }, "MatSnackBar with TemplateRef should be able to open a snack bar using a TemplateRef": { "error": "Error: Expected ' Fries Pizza ' to contain 'Pasta'.", "notes": "FW-842: View engine dirty-checks projected views when the declaration place is checked" From 14ce8a9c310c5b5cc91f1874b6339a9b6b5571b6 Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Wed, 6 Mar 2019 11:02:44 -0800 Subject: [PATCH 0246/1073] fix(bazel): ng build should produce prod bundle (#29136) `ng build` should produce a bundle that could be readily deployed to a web server, similar to the behavior of current `ng build` with webpack. Note that in Bazel, there is no `ng build` for dev bundles. Instead, users are expected to run `ts_devserver`. Closes https://github.com/angular/angular/issues/28877 PR Close #29136 --- packages/bazel/src/schematics/ng-add/index.ts | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/bazel/src/schematics/ng-add/index.ts b/packages/bazel/src/schematics/ng-add/index.ts index bb3234a1f0..9bb354900d 100755 --- a/packages/bazel/src/schematics/ng-add/index.ts +++ b/packages/bazel/src/schematics/ng-add/index.ts @@ -127,14 +127,9 @@ function updateAngularJsonToUseBazelBuilder(options: Schema): Rule { recorder, architect, 'build', { builder: '@angular/bazel:build', options: { - targetLabel: '//src:bundle.js', + targetLabel: '//src:prodapp', bazelCommand: 'build', - }, - configurations: { - production: { - targetLabel: '//src:bundle', - }, - }, + } }, indent); replacePropertyInAstObject( From 7060d9038b11a7c67cdce6b58464a935e9a340c5 Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Mon, 4 Mar 2019 16:18:15 -0800 Subject: [PATCH 0247/1073] feat(bazel): Hide Bazel files in Bazel builder (#29110) This commit modifies the Bazel builder to copy the Bazel WORKSPACE and BUILD.bazel files to the project root directory before invoking Bazel. This hides the Bazel files from users. PR Close #29110 --- integration/bazel-schematics/yarn.lock | 77 ++++----- packages/bazel/package.json | 4 +- packages/bazel/src/builders/BUILD.bazel | 25 ++- packages/bazel/src/builders/bazel.ts | 159 ++++++++++++++---- packages/bazel/src/builders/bazel_spec.ts | 42 +++++ .../src/builders/files/BUILD.bazel.template | 7 + .../src/builders/files/WORKSPACE.template | 60 +++++++ .../files/__dot__bazelignore.template | 2 + .../builders/files/__dot__bazelrc.template | 29 ++++ .../builders/files/e2e/BUILD.bazel.template | 50 ++++++ .../builders/files/src/BUILD.bazel.template | 153 +++++++++++++++++ packages/bazel/src/builders/index.ts | 45 ++--- 12 files changed, 555 insertions(+), 98 deletions(-) create mode 100644 packages/bazel/src/builders/bazel_spec.ts create mode 100644 packages/bazel/src/builders/files/BUILD.bazel.template create mode 100644 packages/bazel/src/builders/files/WORKSPACE.template create mode 100644 packages/bazel/src/builders/files/__dot__bazelignore.template create mode 100644 packages/bazel/src/builders/files/__dot__bazelrc.template create mode 100644 packages/bazel/src/builders/files/e2e/BUILD.bazel.template create mode 100644 packages/bazel/src/builders/files/src/BUILD.bazel.template diff --git a/integration/bazel-schematics/yarn.lock b/integration/bazel-schematics/yarn.lock index b2b87bca5c..b6b57e7865 100644 --- a/integration/bazel-schematics/yarn.lock +++ b/integration/bazel-schematics/yarn.lock @@ -10,25 +10,14 @@ "@angular-devkit/core" "7.3.2" rxjs "6.3.3" -"@angular-devkit/architect@^0.10.6": - version "0.10.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.10.7.tgz#c74b9f6b7f1b4261ada2d24c832328aa4c394464" - integrity sha512-S49LSslNRxIflHzrIrEgK7mGQ7HzETr/FU0fyTbB0vubcmfzMoYTsgYdK7SUz583lovc+UvASoUAhPJI3e35ng== +"@angular-devkit/architect@^0.13.4": + version "0.13.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.13.4.tgz#f5db62f028e3c0971db5719be9c17a78fd8a67a2" + integrity sha512-wJF8oz8MurtpFi0ik42bkI2F5gEnuOe79KHPO1i3SYfdhEp5NY8igVKZ6chB/eq4Ml50aHxas8Hh9ke12K+Pxw== dependencies: - "@angular-devkit/core" "7.0.7" + "@angular-devkit/core" "7.3.4" rxjs "6.3.3" -"@angular-devkit/core@7.0.7": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.0.7.tgz#665176ad8421adfd5f3ea0b2c4a9a432a158b1bb" - integrity sha512-M8tTT9r3nUtWI3YyiyynHIQn+lQQgeKkxVZ+rdxvyvgE3U9+wn0yep5HkFLQETTuJetu9ARRRD94sD2XL3F/3A== - dependencies: - ajv "6.5.3" - chokidar "2.0.4" - fast-json-stable-stringify "2.0.0" - rxjs "6.3.3" - source-map "0.7.3" - "@angular-devkit/core@7.3.2", "@angular-devkit/core@^7.0.4": version "7.3.2" resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.2.tgz#67ac2cfcbe47f1e457929c19ab1b04c9e061b2e2" @@ -40,6 +29,17 @@ rxjs "6.3.3" source-map "0.7.3" +"@angular-devkit/core@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.4.tgz#fae0521652c7430237025f117531ca3262ef8335" + integrity sha512-MBfen51iOBKfK4tlg5KwmPxePsF1QoFNUMGLuvUUwPkteonrGcupX1Q7NWTpf+HA+i08mOnZGuepeuQkD12IQw== + dependencies: + ajv "6.9.1" + chokidar "2.0.4" + fast-json-stable-stringify "2.0.0" + rxjs "6.3.3" + source-map "0.7.3" + "@angular-devkit/schematics@7.3.2", "@angular-devkit/schematics@^7.3.0-rc.0": version "7.3.2" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.2.tgz#e9d3c1f2128a56f66ea846ce3f80c69d4c3a9ae9" @@ -51,11 +51,11 @@ "@angular/bazel@file:../../dist/packages-dist/bazel": version "8.0.0-beta.6" dependencies: - "@angular-devkit/architect" "^0.10.6" + "@angular-devkit/architect" "^0.13.4" "@angular-devkit/core" "^7.0.4" "@angular-devkit/schematics" "^7.3.0-rc.0" "@bazel/typescript" "^0.26.0" - "@microsoft/api-extractor" "^7.0.17" + "@microsoft/api-extractor" "^7.0.21" "@schematics/angular" "^7.0.4" "@types/node" "6.0.84" semver "^5.6.0" @@ -112,26 +112,27 @@ source-map-support "0.5.9" tsutils "2.27.2" -"@microsoft/api-extractor@^7.0.17": - version "7.0.18" - resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.0.18.tgz#4eb931436495177dfcef8f2d8da3d084d10eebb6" - integrity sha512-puQisjyoYK1A0I8DqyBoLPV9noyFUlxTE3WsjhgJw//TrmegGHYmsRlD3rnHeXcKPM1F7sd/VKJXeXC3IPTf2Q== +"@microsoft/api-extractor@^7.0.21": + version "7.0.22" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.0.22.tgz#9c6eb0500168811ed14194de413ddd310622533a" + integrity sha512-1mNMbmUeqtjNmS9hgrONio2uRZL2eeZk39zCKq04ReImFXnMR+fnMTQG98B+SAkFFGJuOucwke5U0bgWnrG6kw== dependencies: - "@microsoft/node-core-library" "3.10.0" + "@microsoft/node-core-library" "3.12.0" "@microsoft/ts-command-line" "4.2.3" - "@microsoft/tsdoc" "0.12.5" + "@microsoft/tsdoc" "0.12.7" "@types/node" "8.5.8" "@types/z-schema" "3.16.31" colors "~1.2.1" lodash "~4.17.5" resolve "1.8.1" + source-map "~0.6.1" typescript "~3.1.6" z-schema "~3.18.3" -"@microsoft/node-core-library@3.10.0": - version "3.10.0" - resolved "https://registry.yarnpkg.com/@microsoft/node-core-library/-/node-core-library-3.10.0.tgz#70e089534d8e20f6a0f9c7a4a12a6aeafd6a1ddb" - integrity sha512-1SbU+XNYAabhV9noGXHtsUVPc5ELV+oEuJQtZQoCncbOd6WAMeTgB1xFwh96hmdEXyKQyML/pnByiKocmh/nbQ== +"@microsoft/node-core-library@3.12.0": + version "3.12.0" + resolved "https://registry.yarnpkg.com/@microsoft/node-core-library/-/node-core-library-3.12.0.tgz#f9c27b8bb6b55d60b91d4e1962f42b03b9f8f47f" + integrity sha512-9T2dEXmmxZqnqcpHuIB8mTAOM/DNSi/QcAwKYDjvZvkd+PGT5lCUXjM9GL7SaR2NPa3UrWDGgFhNoqLqLfEPbw== dependencies: "@types/fs-extra" "5.0.4" "@types/jju" "~1.4.0" @@ -152,10 +153,10 @@ argparse "~1.0.9" colors "~1.2.1" -"@microsoft/tsdoc@0.12.5": - version "0.12.5" - resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.5.tgz#c448a38902ccb5601c1b2ef3b1a105012ef7712c" - integrity sha512-xEAyvLXo4Cter/b0EMCWUZTgXOfLOPJ/Xr52WdjVclPx9eDmNTGFtZl8Pn/nqSnZsQBNcHL0eHk/YyRyyXXpiQ== +"@microsoft/tsdoc@0.12.7": + version "0.12.7" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.7.tgz#8fb4a9f4fdf01f1469c9fc54b0ad2d36ec57c25d" + integrity sha512-0bqNlQT8aR4Iq9xx/OsY579Zeqon9uTZDIuvl+XXu16TPPN2sASeKojwm366jA2MjgXd9iyTWpJM5/P1QJ4Dxg== "@schematics/angular@7.3.2", "@schematics/angular@^7.0.4": version "7.3.2" @@ -249,16 +250,6 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" -ajv@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" - integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@6.9.1: version "6.9.1" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" @@ -2154,7 +2145,7 @@ source-map@^0.5.6: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0: +source-map@^0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== diff --git a/packages/bazel/package.json b/packages/bazel/package.json index c5d758923c..67c794cb93 100644 --- a/packages/bazel/package.json +++ b/packages/bazel/package.json @@ -18,7 +18,7 @@ } }, "dependencies": { - "@angular-devkit/architect": "^0.10.6", + "@angular-devkit/architect": "^0.13.4", "@angular-devkit/core": "^7.0.4", "@angular-devkit/schematics": "^7.3.0-rc.0", "@bazel/typescript": "^0.26.0", @@ -42,4 +42,4 @@ "ng-update": { "packageGroup": "NG_UPDATE_PACKAGE_GROUP" } -} \ No newline at end of file +} diff --git a/packages/bazel/src/builders/BUILD.bazel b/packages/bazel/src/builders/BUILD.bazel index 23e4a0add8..142c80f60a 100644 --- a/packages/bazel/src/builders/BUILD.bazel +++ b/packages/bazel/src/builders/BUILD.bazel @@ -1,4 +1,4 @@ -load("//tools:defaults.bzl", "ts_library") +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") package(default_visibility = ["//visibility:public"]) @@ -19,7 +19,7 @@ ts_library( ], data = [ "schema.json", - ], + ] + glob(["files/**/*"]), module_name = "@angular/bazel/src/builders", deps = [ "@npm//@angular-devkit/architect", @@ -28,3 +28,24 @@ ts_library( "@npm//rxjs", ], ) + +ts_library( + name = "test_lib", + testonly = True, + srcs = [ + "bazel_spec.ts", + ], + deps = [ + "builders", + "@npm//@angular-devkit/core", + ], +) + +jasmine_node_test( + name = "test", + bootstrap = ["angular/tools/testing/init_node_spec.js"], + deps = [ + ":test_lib", + "//tools/testing:node", + ], +) diff --git a/packages/bazel/src/builders/bazel.ts b/packages/bazel/src/builders/bazel.ts index d1fe2cdbfb..90f07a586c 100644 --- a/packages/bazel/src/builders/bazel.ts +++ b/packages/bazel/src/builders/bazel.ts @@ -7,44 +7,145 @@ */ /// -import {spawn, spawnSync} from 'child_process'; -import {Observable, Subject} from 'rxjs'; + +import {Path, basename, dirname, getSystemPath, join} from '@angular-devkit/core'; +import {resolve} from '@angular-devkit/core/node'; +import {Host} from '@angular-devkit/core/src/virtual-fs/host'; +import {spawn} from 'child_process'; export type Executable = 'bazel' | 'ibazel'; export type Command = 'build' | 'test' | 'run' | 'coverage' | 'query'; +/** + * Spawn the Bazel process. Trap SINGINT to make sure Bazel process is killed. + */ export function runBazel( - projectDir: string, executable: Executable, command: Command, workspaceTarget: string, - flags: string[]): Observable { - const doneSubject = new Subject(); - const bin = require.resolve(`@bazel/${executable}`); - const buildProcess = spawn(bin, [command, workspaceTarget, ...flags], { - cwd: projectDir, - stdio: 'inherit', - shell: false, - }); + projectDir: Path, binary: Path, command: Command, workspaceTarget: string, flags: string[]) { + return new Promise((resolve, reject) => { + const buildProcess = spawn(getSystemPath(binary), [command, workspaceTarget, ...flags], { + cwd: getSystemPath(projectDir), + stdio: 'inherit', + shell: false, + }); - buildProcess.once('close', (code: number) => { - if (code === 0) { - doneSubject.next(); - } else { - doneSubject.error(`${executable} failed with code ${code}.`); - } - }); + process.on('SIGINT', (signal) => { + if (!buildProcess.killed) { + buildProcess.kill(); + reject(new Error(`Bazel process received ${signal}.`)); + } + }); - return doneSubject.asObservable(); + buildProcess.once('close', (code: number) => { + if (code === 0) { + resolve(); + } else { + reject(new Error(`${basename(binary)} failed with code ${code}.`)); + } + }); + }); } -export function checkInstallation(executable: Executable, projectDir: string) { - let bin: string; +/** + * Resolves the path to `@bazel/bazel` or `@bazel/ibazel`. + */ +export function checkInstallation(name: Executable, projectDir: Path): string { + const packageName = `@bazel/${name}`; try { - bin = require.resolve(`@bazel/${executable}`); - } catch { - return false; + return resolve(packageName, { + basedir: projectDir, + }); + } catch (error) { + if (error.code === 'MODULE_NOT_FOUND') { + throw new Error( + `Could not run ${name}. Please make sure that the ` + + `"${name}" command is installed by running ` + + `"npm install ${packageName}" or "yarn install ${packageName}".`); + } + throw error; } - const child = spawnSync(bin, ['version'], { - cwd: projectDir, - shell: false, - }); - return child.status === 0; +} + +/** + * Returns the absolute path to the template directory in `@angular/bazel`. + */ +export async function getTemplateDir(host: Host, root: Path): Promise { + const packageJson = resolve('@angular/bazel', { + basedir: root, + resolvePackageJson: true, + }); + const packageDir = dirname(packageJson as Path); + const templateDir = join(packageDir, 'src', 'builders', 'files'); + if (!await host.isDirectory(templateDir).toPromise()) { + throw new Error('Could not find Bazel template directory in "@angular/bazel".'); + } + return templateDir; +} + +/** + * Recursively list the specified 'dir' using depth-first approach. Paths + * returned are relative to 'dir'. + */ +function listR(host: Host, dir: Path): Promise { + async function list(dir: Path, root: Path, results: Path[]) { + const paths = await host.list(dir).toPromise(); + for (const path of paths) { + const absPath = join(dir, path); + const relPath = join(root, path); + if (await host.isFile(absPath).toPromise()) { + results.push(relPath); + } else { + await list(absPath, relPath, results); + } + } + return results; + } + + return list(dir, '' as Path, []); +} + +/** + * Copy the file from 'source' to 'dest'. + */ +async function copyFile(host: Host, source: Path, dest: Path) { + const buffer = await host.read(source).toPromise(); + await host.write(dest, buffer).toPromise(); +} + +/** + * Copy Bazel files (WORKSPACE, BUILD.bazel, etc) from the template directory to + * the project `root` directory, and return the absolute paths of the files + * copied, so that they can be deleted later. + * Existing files in `root` will not be replaced. + */ +export async function copyBazelFiles(host: Host, root: Path, templateDir: Path) { + const bazelFiles: Path[] = []; + const templates = await listR(host, templateDir); + + await Promise.all(templates.map(async(template) => { + const name = template.replace('__dot__', '.').replace('.template', ''); + const source = join(templateDir, template); + const dest = join(root, name); + try { + const exists = await host.exists(dest).toPromise(); + if (!exists) { + await copyFile(host, source, dest); + bazelFiles.push(dest); + } + } catch { + } + })); + + return bazelFiles; +} + +/** + * Delete the specified 'files' and return a promise that always resolves. + */ +export function deleteBazelFiles(host: Host, files: Path[]) { + return Promise.all(files.map(async(file) => { + try { + await host.delete(file).toPromise(); + } catch { + } + })); } diff --git a/packages/bazel/src/builders/bazel_spec.ts b/packages/bazel/src/builders/bazel_spec.ts new file mode 100644 index 0000000000..84bf86ddab --- /dev/null +++ b/packages/bazel/src/builders/bazel_spec.ts @@ -0,0 +1,42 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Path} from '@angular-devkit/core'; +import {test} from '@angular-devkit/core/src/virtual-fs/host/test'; + +import {copyBazelFiles, deleteBazelFiles} from './bazel'; + +describe('Bazel builder', () => { + it('should copy Bazel files', async() => { + const host = new test.TestHost({ + '/files/WORKSPACE.template': '', + '/files/BUILD.bazel.template': '', + '/files/__dot__bazelrc.template': '', + '/files/__dot__bazelignore.template': '', + '/files/e2e/BUILD.bazel.template': '', + '/files/src/BUILD.bazel.template': '', + }); + const root = '/' as Path; + const templateDir = '/files' as Path; + await copyBazelFiles(host, root, templateDir); + const {records} = host; + expect(records).toContain({kind: 'write', path: '/WORKSPACE' as Path}); + expect(records).toContain({kind: 'write', path: '/BUILD.bazel' as Path}); + }); + + it('should delete Bazel files', async() => { + const host = new test.TestHost({ + '/WORKSPACE': '', + '/BUILD.bazel': '', + }); + await deleteBazelFiles(host, ['/WORKSPACE', '/BUILD.bazel'] as Path[]); + const {records} = host; + expect(records).toContain({kind: 'delete', path: '/WORKSPACE' as Path}); + expect(records).toContain({kind: 'delete', path: '/BUILD.bazel' as Path}); + }); +}); diff --git a/packages/bazel/src/builders/files/BUILD.bazel.template b/packages/bazel/src/builders/files/BUILD.bazel.template new file mode 100644 index 0000000000..27b2fa1432 --- /dev/null +++ b/packages/bazel/src/builders/files/BUILD.bazel.template @@ -0,0 +1,7 @@ +package(default_visibility = ["//visibility:public"]) + +# This export allows targets in other packages to reference files that live +# in this package. +exports_files([ + "tsconfig.json", +]) diff --git a/packages/bazel/src/builders/files/WORKSPACE.template b/packages/bazel/src/builders/files/WORKSPACE.template new file mode 100644 index 0000000000..3d1fc71a93 --- /dev/null +++ b/packages/bazel/src/builders/files/WORKSPACE.template @@ -0,0 +1,60 @@ +# WARNING: This file is generated and it's not meant to be edited. +# Before making any changes, please read Bazel documentation. +# https://docs.bazel.build/versions/master/be/workspace.html +# The WORKSPACE file tells Bazel that this directory is a "workspace", which is like a project root. +# The content of this file specifies all the external dependencies Bazel needs to perform a build. + +#################################### +# ESModule imports (and TypeScript imports) can be absolute starting with the workspace name. +# The name of the workspace should match the npm package where we publish, so that these +# imports also make sense when referencing the published package. +workspace(name = "project") + +load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") + +RULES_NODEJS_VERSION = "0.26.0" +http_archive( + name = "build_bazel_rules_nodejs", + sha256 = "5c86b055c57e15bf32d9009a15bcd6d8e190c41b1ff2fb18037b75e0012e4e7c", + url = "https://github.com/bazelbuild/rules_nodejs/releases/download/%s/rules_nodejs-%s.tar.gz" % (RULES_NODEJS_VERSION, RULES_NODEJS_VERSION), +) + +# Rules for compiling sass +RULES_SASS_VERSION = "1.17.2" +http_archive( + name = "io_bazel_rules_sass", + sha256 = "e5316ee8a09d1cbb732d3938b400836bf94dba91a27476e9e27706c4c0edae1f", + url = "https://github.com/bazelbuild/rules_sass/archive/%s.zip" % RULES_SASS_VERSION, + strip_prefix = "rules_sass-%s" % RULES_SASS_VERSION, +) + +#################################### +# Load and install our dependencies downloaded above. + +load("@build_bazel_rules_nodejs//:defs.bzl", "check_bazel_version", "node_repositories", "yarn_install") +check_bazel_version("0.22.0") +node_repositories() +yarn_install( + name = "npm", + data = ["//:angular-metadata.tsconfig.json"], + package_json = "//:package.json", + yarn_lock = "//:yarn.lock", +) + +load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies") +install_bazel_dependencies() + +load("@npm_bazel_karma//:package.bzl", "rules_karma_dependencies") +rules_karma_dependencies() + +load("@io_bazel_rules_webtesting//web:repositories.bzl", "web_test_repositories") +web_test_repositories() + +load("@npm_bazel_karma//:browser_repositories.bzl", "browser_repositories") +browser_repositories() + +load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace") +ts_setup_workspace() + +load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories") +sass_repositories() diff --git a/packages/bazel/src/builders/files/__dot__bazelignore.template b/packages/bazel/src/builders/files/__dot__bazelignore.template new file mode 100644 index 0000000000..de4d1f007d --- /dev/null +++ b/packages/bazel/src/builders/files/__dot__bazelignore.template @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/packages/bazel/src/builders/files/__dot__bazelrc.template b/packages/bazel/src/builders/files/__dot__bazelrc.template new file mode 100644 index 0000000000..1b544399da --- /dev/null +++ b/packages/bazel/src/builders/files/__dot__bazelrc.template @@ -0,0 +1,29 @@ +# Make TypeScript and Angular compilation fast, by keeping a few copies of the +# compiler running as daemons, and cache SourceFile AST's to reduce parse time. +build --strategy=TypeScriptCompile=worker +build --strategy=AngularTemplateCompile=worker + +# Don't create bazel-* symlinks in the WORKSPACE directory, except `bazel-out`, +# which is mandatory. +# These require .gitignore and may scare users. +# Also, it's a workaround for https://github.com/bazelbuild/rules_typescript/issues/12 +# which affects the common case of having `tsconfig.json` in the WORKSPACE directory. +# +# Instead, the output will appear in `dist/bin`. You'll need to ignore the +# `bazel-out` directory that is created in the workspace root. +build --symlink_prefix=dist/ + +# Turn on --incompatible_strict_action_env which was on by default +# in Bazel 0.21.0 but turned off again in 0.22.0. Follow +# https://github.com/bazelbuild/bazel/issues/7026 for more details. +# This flag is needed to so that the bazel cache is not invalidated +# when running bazel via `yarn bazel`. +# See https://github.com/angular/angular/issues/27514. +build --incompatible_strict_action_env +run --incompatible_strict_action_env +test --incompatible_strict_action_env + +test --test_output=errors + +# Use the Angular 6 compiler +build --define=compile=legacy diff --git a/packages/bazel/src/builders/files/e2e/BUILD.bazel.template b/packages/bazel/src/builders/files/e2e/BUILD.bazel.template new file mode 100644 index 0000000000..b38c34575f --- /dev/null +++ b/packages/bazel/src/builders/files/e2e/BUILD.bazel.template @@ -0,0 +1,50 @@ +load("@npm_bazel_typescript//:index.bzl", "ts_library") +load("@npm_angular_bazel//:index.bzl", "protractor_web_test_suite") + +ts_library( + name = "e2e_lib", + testonly = 1, + srcs = glob(["src/**/*.ts"]), + tsconfig = ":tsconfig.e2e.json", + deps = [ + "@npm//@types/jasmine", + "@npm//@types/jasminewd2", + "@npm//@types/node", + "@npm//jasmine", + "@npm//protractor", + "@npm//tslib", + ], + data = [ + "//:tsconfig.json", + ], +) + +protractor_web_test_suite( + name = "prodserver_test", + data = [ + "@npm//@angular/bazel", + "@npm//protractor", + ], + on_prepare = ":protractor.on-prepare.js", + server = "//src:prodserver", + deps = [":e2e_lib"], +) + +protractor_web_test_suite( + name = "devserver_test", + data = [ + "@npm//@angular/bazel", + "@npm//protractor", + ], + on_prepare = ":protractor.on-prepare.js", + server = "//src:devserver", + deps = [":e2e_lib"], +) + +# Default target in this package is to run the e2e tests on the devserver. +# This is a faster round-trip but doesn't exercise production optimizations like +# code-splitting and lazy loading. +alias( + name = "e2e", + actual = "devserver_test", +) diff --git a/packages/bazel/src/builders/files/src/BUILD.bazel.template b/packages/bazel/src/builders/files/src/BUILD.bazel.template new file mode 100644 index 0000000000..ab60972ae4 --- /dev/null +++ b/packages/bazel/src/builders/files/src/BUILD.bazel.template @@ -0,0 +1,153 @@ +package(default_visibility = ["//visibility:public"]) + +load("@npm_angular_bazel//:index.bzl", "ng_module") +load("@npm_bazel_karma//:index.bzl", "ts_web_test_suite") +load("@build_bazel_rules_nodejs//:defs.bzl", "rollup_bundle", "history_server") +load("@build_bazel_rules_nodejs//internal/web_package:web_package.bzl", "web_package") +load("@npm_bazel_typescript//:index.bzl", "ts_devserver", "ts_library") +load("@io_bazel_rules_sass//:defs.bzl", "multi_sass_binary") + +multi_sass_binary( + name = "styles", + srcs = glob(["**/*.scss"]), +) + +ng_module( + name = "src", + srcs = glob( + include = ["**/*.ts"], + exclude = [ + "**/*.spec.ts", + "main.ts", + "test.ts", + "initialize_testbed.ts", + ], + ), + assets = glob([ + "**/*.css", + "**/*.html", + ]) + ([":styles"] if len(glob(["**/*.scss"])) else []), + deps = [ + "@npm//@angular/core", + "@npm//@angular/platform-browser", + "@npm//@angular/router", + "@npm//@types", + "@npm//rxjs", + ], +) + +rollup_bundle( + name = "bundle", + entry_point = "src/main.prod", + deps = [ + "//src", + "@npm//rxjs", + ], +) + +web_package( + name = "prodapp", + assets = [ + # do not sort + "@npm//node_modules/zone.js:dist/zone.min.js", + ":bundle.min.js", + ], + data = [ + "favicon.ico", + ], + index_html = "index.html", +) + +history_server( + name = "prodserver", + data = [":prodapp"], + templated_args = ["src/prodapp"], +) + +filegroup( + name = "rxjs_umd_modules", + srcs = [ + # do not sort + "@npm//node_modules/rxjs:bundles/rxjs.umd.js", + ":rxjs_shims.js", + ], +) + +ts_devserver( + name = "devserver", + port = 4200, + entry_module = "project/src/main.dev", + serving_path = "/bundle.min.js", + scripts = [ + "@npm//node_modules/@angular/common:bundles/common.umd.js", + "@npm//node_modules/@angular/common:bundles/common-http.umd.js", + "@npm//node_modules/@angular/core:bundles/core.umd.js", + "@npm//node_modules/@angular/platform-browser:bundles/platform-browser.umd.js", + "@npm//node_modules/tslib:tslib.js", + ":rxjs_umd_modules", + ], + static_files = [ + "@npm//node_modules/zone.js:dist/zone.min.js", + ], + data = [ + "favicon.ico", + ], + index_html = "index.html", + deps = [":src"], +) + +ts_library( + name = "test_lib", + testonly = 1, + srcs = glob(["**/*.spec.ts"]), + deps = [ + ":src", + "@npm//@angular/core", + "@npm//@types", + ], +) + +ts_library( + name = "initialize_testbed", + testonly = 1, + srcs = [ + "initialize_testbed.ts", + ], + deps = [ + "@npm//@angular/core", + "@npm//@angular/platform-browser-dynamic", + "@npm//@types", + ], +) + +ts_web_test_suite( + name = "test", + srcs = [ + "@npm//node_modules/@angular/common:bundles/common.umd.js", + "@npm//node_modules/@angular/compiler:bundles/compiler.umd.js", + "@npm//node_modules/@angular/compiler:bundles/compiler-testing.umd.js", + "@npm//node_modules/@angular/core:bundles/core.umd.js", + "@npm//node_modules/@angular/core:bundles/core-testing.umd.js", + "@npm//node_modules/@angular/platform-browser:bundles/platform-browser.umd.js", + "@npm//node_modules/@angular/platform-browser:bundles/platform-browser-testing.umd.js", + "@npm//node_modules/@angular/platform-browser-dynamic:bundles/platform-browser-dynamic.umd.js", + "@npm//node_modules/@angular/platform-browser-dynamic:bundles/platform-browser-dynamic-testing.umd.js", + "@npm//node_modules/tslib:tslib.js", + ], + runtime_deps = [ + ":initialize_testbed", + ], + # do not sort + bootstrap = [ + "@npm//node_modules/zone.js:dist/zone-testing-bundle.js", + "@npm//node_modules/reflect-metadata:Reflect.js", + ], + browsers = [ + "@io_bazel_rules_webtesting//browsers:chromium-local", + ], + deps = [ + ":rxjs_umd_modules", + ":test_lib", + "@npm//karma-jasmine", + ], +) diff --git a/packages/bazel/src/builders/index.ts b/packages/bazel/src/builders/index.ts index cf268067fc..6df7a4a4ca 100644 --- a/packages/bazel/src/builders/index.ts +++ b/packages/bazel/src/builders/index.ts @@ -9,34 +9,35 @@ */ import {BuildEvent, Builder, BuilderConfiguration, BuilderContext} from '@angular-devkit/architect'; -import {getSystemPath, resolve} from '@angular-devkit/core'; -import {Observable, of } from 'rxjs'; -import {catchError, map} from 'rxjs/operators'; - -import {checkInstallation, runBazel} from './bazel'; +import {Path} from '@angular-devkit/core'; +import {Observable, from} from 'rxjs'; +import {checkInstallation, copyBazelFiles, deleteBazelFiles, getTemplateDir, runBazel} from './bazel'; import {Schema} from './schema'; class BazelBuilder implements Builder { constructor(private context: BuilderContext) {} - run(builderConfig: BuilderConfiguration>): Observable { - const projectRoot = getSystemPath(resolve(this.context.workspace.root, builderConfig.root)); - const targetLabel = builderConfig.options.targetLabel; + run(config: BuilderConfiguration>): Observable { + const {host, logger, workspace} = this.context; + const root: Path = workspace.root; + const {bazelCommand, targetLabel, watch} = config.options as Schema; + const executable = watch ? 'ibazel' : 'bazel'; + const binary = checkInstallation(executable, root) as Path; - const executable = builderConfig.options.watch ? 'ibazel' : 'bazel'; - - if (!checkInstallation(executable, projectRoot)) { - throw new Error( - `Could not run ${executable}. Please make sure that the ` + - `"${executable}" command is installed by running ` + - `"npm install" or "yarn install".`); - } - - // TODO: Support passing flags. - return runBazel( - projectRoot, executable, builderConfig.options.bazelCommand !, targetLabel !, - [] /* flags */) - .pipe(map(() => ({success: true})), catchError(() => of ({success: false})), ); + return from(Promise.resolve().then(async() => { + const templateDir = await getTemplateDir(host, root); + const bazelFiles = await copyBazelFiles(host, root, templateDir); + try { + const flags: string[] = []; + await runBazel(root, binary, bazelCommand, targetLabel, flags); + return {success: true}; + } catch (err) { + logger.error(err.message); + return {success: false}; + } finally { + await deleteBazelFiles(host, bazelFiles); // this will never throw + } + })); } } From 15e84950ec972431c45fee74194bc5385f151ee7 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Thu, 7 Mar 2019 12:31:21 +0100 Subject: [PATCH 0248/1073] test(ivy): diagnose root causes for MatInput (#29153) PR Close #29153 --- tools/material-ci/angular_material_test_blocklist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index ff51aec081..5bd5cc72b2 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -239,7 +239,7 @@ window.testBlocklist = { }, "MatInput without forms validates the type": { "error": "Error: Input type \"file\" isn't supported by matInput.", - "notes": "Unknown" + "notes": "Breaking change: Static directive inputs evaluated in creation mode - material test to be updated" }, "MatInput with textarea autosize should work in a step": { "error": "TypeError: Cannot read property 'getBoundingClientRect' of null", From c866c11bf8b9f59147198eff890bd0c9f0c7d707 Mon Sep 17 00:00:00 2001 From: tomastrajan Date: Tue, 5 Mar 2019 18:57:30 +0100 Subject: [PATCH 0249/1073] docs: add tomas trajan to GDE resources (#29116) PR Close #29116 --- aio/content/images/bios/tomastrajan.jpg | Bin 0 -> 22283 bytes aio/content/marketing/contributors.json | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 aio/content/images/bios/tomastrajan.jpg diff --git a/aio/content/images/bios/tomastrajan.jpg b/aio/content/images/bios/tomastrajan.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b887431d4761101cf88761f4790e2847a573aea GIT binary patch literal 22283 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 il&JLR4A#DOk2yh Date: Tue, 19 Feb 2019 18:52:44 +0100 Subject: [PATCH 0250/1073] build: enable bundle_dts for router package (#28833) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR also changes the name of `EmptyOutletComponent` to `ɵEmptyOutletComponent`. This is because `ngcc` requires the node to retain the original name while dts bundler will rename the node is it's only exported using the aliases. Example typings files: ```ts declare class EmptyOutletComponent { } export {EmptyOutletComponent as ɵEmptyOutletComponent} ``` will be emitted as ```ts export declare class ɵEmptyOutletComponent { } ``` PR Close #28833 --- packages/router/BUILD.bazel | 1 + packages/router/src/components/empty_outlet.ts | 6 ++++-- packages/router/src/private_export.ts | 2 +- packages/router/testing/BUILD.bazel | 1 + packages/router/upgrade/BUILD.bazel | 1 + 5 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/router/BUILD.bazel b/packages/router/BUILD.bazel index 59ee3d3920..ee69969bbb 100644 --- a/packages/router/BUILD.bazel +++ b/packages/router/BUILD.bazel @@ -10,6 +10,7 @@ ng_module( "src/**/*.ts", ], ), + bundle_dts = True, deps = [ "//packages/common", "//packages/core", diff --git a/packages/router/src/components/empty_outlet.ts b/packages/router/src/components/empty_outlet.ts index d5e99f5e68..fcef102e46 100644 --- a/packages/router/src/components/empty_outlet.ts +++ b/packages/router/src/components/empty_outlet.ts @@ -18,5 +18,7 @@ import {Component} from '@angular/core'; * to this `EmptyOutletComponent`. */ @Component({template: ``}) -export class EmptyOutletComponent { -} \ No newline at end of file +export class ɵEmptyOutletComponent { +} + +export {ɵEmptyOutletComponent as EmptyOutletComponent}; diff --git a/packages/router/src/private_export.ts b/packages/router/src/private_export.ts index aca5be0260..27c8e2686e 100644 --- a/packages/router/src/private_export.ts +++ b/packages/router/src/private_export.ts @@ -7,6 +7,6 @@ */ -export {EmptyOutletComponent as ɵEmptyOutletComponent} from './components/empty_outlet'; +export {ɵEmptyOutletComponent} from './components/empty_outlet'; export {ROUTER_PROVIDERS as ɵROUTER_PROVIDERS} from './router_module'; export {flatten as ɵflatten} from './utils/collection'; diff --git a/packages/router/testing/BUILD.bazel b/packages/router/testing/BUILD.bazel index 9e0b86acda..828c714b10 100644 --- a/packages/router/testing/BUILD.bazel +++ b/packages/router/testing/BUILD.bazel @@ -7,6 +7,7 @@ exports_files(["package.json"]) ng_module( name = "testing", srcs = glob(["**/*.ts"]), + bundle_dts = True, deps = [ "//packages/common", "//packages/common/testing", diff --git a/packages/router/upgrade/BUILD.bazel b/packages/router/upgrade/BUILD.bazel index 9004665b68..a1a2961a20 100644 --- a/packages/router/upgrade/BUILD.bazel +++ b/packages/router/upgrade/BUILD.bazel @@ -12,6 +12,7 @@ ng_module( "src/**/*.ts", ], ), + bundle_dts = True, deps = [ "//packages/common", "//packages/core", From eccbc785b30b7cd7b8d22d96ee8389eca8254c69 Mon Sep 17 00:00:00 2001 From: Marc Laval Date: Thu, 7 Mar 2019 16:09:12 +0100 Subject: [PATCH 0251/1073] fix(ivy): ViewRef.detachFromAppRef should clean the DOM (#29159) PR Close #29159 --- .../core/src/render3/node_manipulation.ts | 9 +++ packages/core/src/render3/view_ref.ts | 7 ++- .../core/test/acceptance/view_ref_spec.ts | 56 +++++++++++++++++++ .../bundling/todo/bundle.golden_symbols.json | 3 + .../angular_material_test_blocklist.js | 8 --- 5 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 packages/core/test/acceptance/view_ref_spec.ts diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 2fb868b5e0..717fa06d73 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -243,6 +243,15 @@ export function addRemoveViewFromContainer( } } +/** + * Detach a `LView` from the DOM by detaching its nodes. + * + * @param lView the `LView` to be detached. + */ +export function renderDetachView(lView: LView) { + walkTNodeTree(lView, WalkTNodeTreeAction.Detach, lView[RENDERER], null); +} + /** * Traverses down and up the tree of views and containers to remove listeners and * call onDestroy callbacks. diff --git a/packages/core/src/render3/view_ref.ts b/packages/core/src/render3/view_ref.ts index 95539e1b5b..51bcc314d6 100644 --- a/packages/core/src/render3/view_ref.ts +++ b/packages/core/src/render3/view_ref.ts @@ -14,7 +14,7 @@ import {EmbeddedViewRef as viewEngine_EmbeddedViewRef, InternalViewRef as viewEn import {checkNoChangesInRootView, checkNoChangesInternal, detectChangesInRootView, detectChangesInternal, markViewDirty, storeCleanupFn} from './instructions'; import {TElementNode, TNode, TNodeType, TViewNode} from './interfaces/node'; import {FLAGS, HOST, LView, LViewFlags, T_HOST} from './interfaces/view'; -import {destroyLView} from './node_manipulation'; +import {destroyLView, renderDetachView} from './node_manipulation'; import {findComponentView, getLViewParent} from './util/view_traversal_utils'; import {getNativeByTNode} from './util/view_utils'; @@ -262,7 +262,10 @@ export class ViewRef implements viewEngine_EmbeddedViewRef, viewEngine_Int this._viewContainerRef = vcRef; } - detachFromAppRef() { this._appRef = null; } + detachFromAppRef() { + this._appRef = null; + renderDetachView(this._lView); + } attachToAppRef(appRef: ApplicationRef) { if (this._viewContainerRef) { diff --git a/packages/core/test/acceptance/view_ref_spec.ts b/packages/core/test/acceptance/view_ref_spec.ts new file mode 100644 index 0000000000..975d38e6a2 --- /dev/null +++ b/packages/core/test/acceptance/view_ref_spec.ts @@ -0,0 +1,56 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {ApplicationRef, Component, ComponentFactoryResolver, ComponentRef, ElementRef, Injector, NgModule} from '@angular/core'; +import {InternalViewRef} from '@angular/core/src/linker/view_ref'; +import {TestBed} from '@angular/core/testing'; + + +describe('ViewRef', () => { + it('should remove nodes from DOM when the view is detached from app ref', () => { + + @Component({selector: 'dynamic-cpt', template: '
'}) + class DynamicComponent { + constructor(public elRef: ElementRef) {} + } + + @Component({template: ``}) + class App { + componentRef !: ComponentRef; + constructor( + public appRef: ApplicationRef, private cfr: ComponentFactoryResolver, + private injector: Injector) {} + + create() { + const componentFactory = this.cfr.resolveComponentFactory(DynamicComponent); + this.componentRef = componentFactory.create(this.injector); + (this.componentRef.hostView as InternalViewRef).attachToAppRef(this.appRef); + document.body.appendChild(this.componentRef.instance.elRef.nativeElement); + } + + destroy() { (this.componentRef.hostView as InternalViewRef).detachFromAppRef(); } + } + + @NgModule({declarations: [App, DynamicComponent], entryComponents: [DynamicComponent]}) + class MyTestModule { + } + + TestBed.configureTestingModule({imports: [MyTestModule]}); + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + + const appComponent = fixture.componentInstance; + appComponent.create(); + fixture.detectChanges(); + expect(document.body.querySelector('dynamic-cpt')).not.toBeUndefined(); + + appComponent.destroy(); + fixture.detectChanges(); + expect(document.body.querySelector('dynamic-cpt')).toBeUndefined(); + }); +}); diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 03caa09233..87495a342b 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -1145,6 +1145,9 @@ { "name": "renderComponentOrTemplate" }, + { + "name": "renderDetachView" + }, { "name": "renderEmbeddedTemplate" }, diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 5bd5cc72b2..0e9ef7b185 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -17,18 +17,10 @@ // tslint:disable window.testBlocklist = { - "Portals DomPortalOutlet should attach and detach a component portal without a ViewContainerRef": { - "error": "Error: Expected '

Pizza

Chocolate

' to be '', 'Expected the DomPortalOutlet to be empty after detach'.", - "notes": "Unknown" - }, "CdkTable should be able to render multiple header and footer rows": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", "notes": "Attempting to access content children before view is initialized" }, - "CdkTable should be able to render and change multiple header and footer rows": { - "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Attempting to access content children before view is initialized" - }, "CdkTable should render correctly when using native HTML tags": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", "notes": "Unknown" From 479ae51d1fd984070aa4c65ad7c667e12657509e Mon Sep 17 00:00:00 2001 From: Andrew Seguin Date: Thu, 7 Mar 2019 09:36:19 -0800 Subject: [PATCH 0252/1073] test(ivy): update native table root causes (#29161) PR Close #29161 --- .../angular_material_test_blocklist.js | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 0e9ef7b185..a8e9a0f092 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -23,31 +23,31 @@ window.testBlocklist = { }, "CdkTable should render correctly when using native HTML tags": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Unknown" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "CdkTable with sticky positioning on native table layout should stick and unstick headers": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Unknown" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "CdkTable with sticky positioning on native table layout should stick and unstick footers": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Unknown" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "CdkTable with sticky positioning on native table layout should stick tfoot when all rows are stuck": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Unknown" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "CdkTable with sticky positioning on native table layout should stick and unstick left columns": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Unknown" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "CdkTable with sticky positioning on native table layout should stick and unstick right columns": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Unknown" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "CdkTable with sticky positioning on native table layout should stick and unstick combination of sticky header, footer, and columns": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Unknown" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "CdkTable with trackBy should change row implicit data even when trackBy finds no changes": { "error": "Error: Expected 'a_1 b_1' to be 'a_2 b_2'.", @@ -287,11 +287,11 @@ window.testBlocklist = { }, "MatTable should be able to render a table correctly with native elements": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Unknown" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "MatTable should apply custom sticky CSS class to sticky cells": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Unknown" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "MatTable with MatTableDataSource and sort/pagination/filter should be able to filter the table contents": { "error": "TypeError: Cannot read property 'length' of undefined", From 3ef2002bd8131b08492f27d73444cf36948ab291 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Thu, 7 Mar 2019 09:46:16 -0800 Subject: [PATCH 0253/1073] test(ivy): turn on passing Material tests for cdk-tree (#29162) PR Close #29162 --- tools/material-ci/angular_material_test_blocklist.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index a8e9a0f092..0ac38241a4 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -101,14 +101,6 @@ window.testBlocklist = { "error": "Error: Failed: Expected node level to be 40px but was ", "notes": "Unknown" }, - "CdkTree flat tree with trackBy should add/remove/move nodes with property-based trackBy": { - "error": "Error: Expected null to be '1'.", - "notes": "Unknown" - }, - "CdkTree flat tree with trackBy should add/remove/move nodes with index-based trackBy": { - "error": "Error: Expected null to be '0'.", - "notes": "Unknown" - }, "CdkTree nested tree with toggle should expand/collapse the node multiple times": { "error": "Error: Expected 3 to be 1, 'Expect node expanded'.", "notes": "Unknown" From 941c99ad7f2540f50c1c110d45182b5bff0a54cc Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 6 Mar 2019 09:28:41 +0100 Subject: [PATCH 0254/1073] build: turn off dts bundling for packages that still are not supported (#29128) PR Close #29128 --- packages/common/BUILD.bazel | 1 - packages/common/http/BUILD.bazel | 1 - packages/common/http/testing/BUILD.bazel | 1 - packages/common/testing/BUILD.bazel | 1 - packages/compiler/testing/BUILD.bazel | 2 ++ packages/core/BUILD.bazel | 2 ++ packages/core/testing/BUILD.bazel | 2 ++ packages/router/BUILD.bazel | 1 - packages/router/testing/BUILD.bazel | 1 - packages/router/upgrade/BUILD.bazel | 1 - 10 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/common/BUILD.bazel b/packages/common/BUILD.bazel index adcbe28a9e..f1c5a910ef 100644 --- a/packages/common/BUILD.bazel +++ b/packages/common/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/core", "@npm//rxjs", diff --git a/packages/common/http/BUILD.bazel b/packages/common/http/BUILD.bazel index 14fa7f5810..575b51476b 100644 --- a/packages/common/http/BUILD.bazel +++ b/packages/common/http/BUILD.bazel @@ -12,7 +12,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/common", "//packages/core", diff --git a/packages/common/http/testing/BUILD.bazel b/packages/common/http/testing/BUILD.bazel index 54deee8c82..2d69ff6a28 100644 --- a/packages/common/http/testing/BUILD.bazel +++ b/packages/common/http/testing/BUILD.bazel @@ -12,7 +12,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/common/http", "//packages/core", diff --git a/packages/common/testing/BUILD.bazel b/packages/common/testing/BUILD.bazel index bf4cfc6bb4..0c9ead6e05 100644 --- a/packages/common/testing/BUILD.bazel +++ b/packages/common/testing/BUILD.bazel @@ -7,7 +7,6 @@ exports_files(["package.json"]) ng_module( name = "testing", srcs = glob(["**/*.ts"]), - bundle_dts = True, deps = [ "//packages/common", "//packages/core", diff --git a/packages/compiler/testing/BUILD.bazel b/packages/compiler/testing/BUILD.bazel index e0fe802fde..52bc2664cd 100644 --- a/packages/compiler/testing/BUILD.bazel +++ b/packages/compiler/testing/BUILD.bazel @@ -10,6 +10,8 @@ ng_module( ["**/*.ts"], exclude = ["testing.ts"], ), + # compiler package is built using ts_library which doesn't support bundling yet. + bundle_dts = False, deps = [ "//packages:types", "//packages/compiler", diff --git a/packages/core/BUILD.bazel b/packages/core/BUILD.bazel index a722331a72..e67e93dc22 100644 --- a/packages/core/BUILD.bazel +++ b/packages/core/BUILD.bazel @@ -10,6 +10,8 @@ ng_module( "src/**/*.ts", ], ), + # PR to support this https://github.com/angular/angular/pull/28884 + bundle_dts = False, deps = [ "//packages:types", "//packages/core/src/compiler", diff --git a/packages/core/testing/BUILD.bazel b/packages/core/testing/BUILD.bazel index 8009d9f276..5095757d46 100644 --- a/packages/core/testing/BUILD.bazel +++ b/packages/core/testing/BUILD.bazel @@ -9,6 +9,8 @@ ng_module( srcs = glob( ["**/*.ts"], ), + # PR to support this https://github.com/angular/angular/pull/28884 + bundle_dts = False, deps = [ "//packages:types", "//packages/compiler", diff --git a/packages/router/BUILD.bazel b/packages/router/BUILD.bazel index ee69969bbb..59ee3d3920 100644 --- a/packages/router/BUILD.bazel +++ b/packages/router/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/common", "//packages/core", diff --git a/packages/router/testing/BUILD.bazel b/packages/router/testing/BUILD.bazel index 828c714b10..9e0b86acda 100644 --- a/packages/router/testing/BUILD.bazel +++ b/packages/router/testing/BUILD.bazel @@ -7,7 +7,6 @@ exports_files(["package.json"]) ng_module( name = "testing", srcs = glob(["**/*.ts"]), - bundle_dts = True, deps = [ "//packages/common", "//packages/common/testing", diff --git a/packages/router/upgrade/BUILD.bazel b/packages/router/upgrade/BUILD.bazel index a1a2961a20..9004665b68 100644 --- a/packages/router/upgrade/BUILD.bazel +++ b/packages/router/upgrade/BUILD.bazel @@ -12,7 +12,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/common", "//packages/core", From f71dae8f635a0b3030429ac246c1f292737bd2cd Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 6 Mar 2019 11:08:42 +0100 Subject: [PATCH 0255/1073] build: enable dts bundling by default for public facing packages (#29128) With this change dts bundling is turned on by default for public facing packages PR Close #29128 --- tools/defaults.bzl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 846dcd4c86..21e4d57cfa 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -99,7 +99,7 @@ def ts_library(tsconfig = None, testonly = False, deps = [], module_name = None, **kwargs ) -def ng_module(name, tsconfig = None, entry_point = None, testonly = False, deps = [], module_name = None, **kwargs): +def ng_module(name, tsconfig = None, entry_point = None, testonly = False, deps = [], module_name = None, bundle_dts = True, **kwargs): """Default values for ng_module""" deps = deps + ["@npm//tslib"] if testonly: @@ -121,6 +121,7 @@ def ng_module(name, tsconfig = None, entry_point = None, testonly = False, deps tsconfig = tsconfig, entry_point = entry_point, testonly = testonly, + bundle_dts = bundle_dts, deps = deps, compiler = _INTERNAL_NG_MODULE_COMPILER, ng_xi18n = _INTERNAL_NG_MODULE_XI18N, From 9a1959269f3384f6331e078ae025e55da23bd7e0 Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 6 Mar 2019 11:09:15 +0100 Subject: [PATCH 0256/1073] build: remove now redundant `bundle_dts = True` attribute (#29128) This is now turned on by default in the ng_module macro PR Close #29128 --- packages/animations/BUILD.bazel | 1 - packages/animations/browser/BUILD.bazel | 1 - packages/animations/browser/testing/BUILD.bazel | 1 - packages/bazel/test/ng_package/example/BUILD.bazel | 1 - packages/elements/BUILD.bazel | 1 - packages/http/BUILD.bazel | 1 - packages/http/testing/BUILD.bazel | 1 - packages/platform-browser-dynamic/BUILD.bazel | 1 - packages/platform-browser-dynamic/testing/BUILD.bazel | 1 - packages/platform-browser/BUILD.bazel | 1 - packages/platform-browser/animations/BUILD.bazel | 1 - packages/platform-browser/testing/BUILD.bazel | 1 - packages/platform-server/BUILD.bazel | 1 - packages/platform-server/testing/BUILD.bazel | 1 - packages/platform-webworker-dynamic/BUILD.bazel | 1 - packages/platform-webworker/BUILD.bazel | 1 - packages/service-worker/BUILD.bazel | 1 - packages/service-worker/config/BUILD.bazel | 1 - packages/upgrade/BUILD.bazel | 1 - packages/upgrade/static/BUILD.bazel | 1 - 20 files changed, 20 deletions(-) diff --git a/packages/animations/BUILD.bazel b/packages/animations/BUILD.bazel index f1738a206a..305e993179 100644 --- a/packages/animations/BUILD.bazel +++ b/packages/animations/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/core", ], diff --git a/packages/animations/browser/BUILD.bazel b/packages/animations/browser/BUILD.bazel index 8e87cf98a7..e5cd36b3a0 100644 --- a/packages/animations/browser/BUILD.bazel +++ b/packages/animations/browser/BUILD.bazel @@ -12,7 +12,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/animations", "//packages/core", diff --git a/packages/animations/browser/testing/BUILD.bazel b/packages/animations/browser/testing/BUILD.bazel index e1adf2cf6d..539709a4f6 100644 --- a/packages/animations/browser/testing/BUILD.bazel +++ b/packages/animations/browser/testing/BUILD.bazel @@ -7,7 +7,6 @@ exports_files(["package.json"]) ng_module( name = "testing", srcs = glob(["**/*.ts"]), - bundle_dts = True, deps = [ "//packages/animations", "//packages/animations/browser", diff --git a/packages/bazel/test/ng_package/example/BUILD.bazel b/packages/bazel/test/ng_package/example/BUILD.bazel index 948caaaa98..b5cc7ad76d 100644 --- a/packages/bazel/test/ng_package/example/BUILD.bazel +++ b/packages/bazel/test/ng_package/example/BUILD.bazel @@ -5,7 +5,6 @@ package(default_visibility = ["//packages/bazel/test:__subpackages__"]) ng_module( name = "example", srcs = glob(["*.ts"]), - bundle_dts = True, module_name = "example", deps = [ "//packages/bazel/test/ng_package/example/secondary", diff --git a/packages/elements/BUILD.bazel b/packages/elements/BUILD.bazel index 63385d8636..9130159675 100644 --- a/packages/elements/BUILD.bazel +++ b/packages/elements/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/core", "//packages/platform-browser", diff --git a/packages/http/BUILD.bazel b/packages/http/BUILD.bazel index 07a2745f80..22681cc5f0 100644 --- a/packages/http/BUILD.bazel +++ b/packages/http/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/core", "//packages/platform-browser", diff --git a/packages/http/testing/BUILD.bazel b/packages/http/testing/BUILD.bazel index 8c157f123c..bc01c89d52 100644 --- a/packages/http/testing/BUILD.bazel +++ b/packages/http/testing/BUILD.bazel @@ -7,7 +7,6 @@ exports_files(["package.json"]) ng_module( name = "testing", srcs = glob(["**/*.ts"]), - bundle_dts = True, deps = [ "//packages/core", "//packages/http", diff --git a/packages/platform-browser-dynamic/BUILD.bazel b/packages/platform-browser-dynamic/BUILD.bazel index 644680e019..14aed5d145 100644 --- a/packages/platform-browser-dynamic/BUILD.bazel +++ b/packages/platform-browser-dynamic/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages:types", "//packages/common", diff --git a/packages/platform-browser-dynamic/testing/BUILD.bazel b/packages/platform-browser-dynamic/testing/BUILD.bazel index b832166efa..d3afe37233 100644 --- a/packages/platform-browser-dynamic/testing/BUILD.bazel +++ b/packages/platform-browser-dynamic/testing/BUILD.bazel @@ -7,7 +7,6 @@ exports_files(["package.json"]) ng_module( name = "testing", srcs = glob(["**/*.ts"]), - bundle_dts = True, deps = [ "//packages/compiler", "//packages/compiler/testing", diff --git a/packages/platform-browser/BUILD.bazel b/packages/platform-browser/BUILD.bazel index ee29582837..320679bc1a 100644 --- a/packages/platform-browser/BUILD.bazel +++ b/packages/platform-browser/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages:types", "//packages/common", diff --git a/packages/platform-browser/animations/BUILD.bazel b/packages/platform-browser/animations/BUILD.bazel index f806e76519..e7c29ebdad 100644 --- a/packages/platform-browser/animations/BUILD.bazel +++ b/packages/platform-browser/animations/BUILD.bazel @@ -12,7 +12,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/animations", "//packages/animations/browser", diff --git a/packages/platform-browser/testing/BUILD.bazel b/packages/platform-browser/testing/BUILD.bazel index 89367aafe0..83eea742be 100644 --- a/packages/platform-browser/testing/BUILD.bazel +++ b/packages/platform-browser/testing/BUILD.bazel @@ -7,7 +7,6 @@ exports_files(["package.json"]) ng_module( name = "testing", srcs = glob(["**/*.ts"]), - bundle_dts = True, deps = [ "//packages/core", "//packages/core/testing", diff --git a/packages/platform-server/BUILD.bazel b/packages/platform-server/BUILD.bazel index d3a9194f42..a2b26739d6 100644 --- a/packages/platform-server/BUILD.bazel +++ b/packages/platform-server/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/animations/browser", "//packages/common", diff --git a/packages/platform-server/testing/BUILD.bazel b/packages/platform-server/testing/BUILD.bazel index 66ea22d96e..e0c6f66be1 100644 --- a/packages/platform-server/testing/BUILD.bazel +++ b/packages/platform-server/testing/BUILD.bazel @@ -7,7 +7,6 @@ exports_files(["package.json"]) ng_module( name = "testing", srcs = glob(["**/*.ts"]), - bundle_dts = True, deps = [ "//packages/core", "//packages/platform-browser-dynamic/testing", diff --git a/packages/platform-webworker-dynamic/BUILD.bazel b/packages/platform-webworker-dynamic/BUILD.bazel index fec50fa318..54988ddf4a 100644 --- a/packages/platform-webworker-dynamic/BUILD.bazel +++ b/packages/platform-webworker-dynamic/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages:types", "//packages/common", diff --git a/packages/platform-webworker/BUILD.bazel b/packages/platform-webworker/BUILD.bazel index c98457f8f0..1ed7da3c09 100644 --- a/packages/platform-webworker/BUILD.bazel +++ b/packages/platform-webworker/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages:types", "//packages/common", diff --git a/packages/service-worker/BUILD.bazel b/packages/service-worker/BUILD.bazel index cef936e5e2..7d7d095512 100644 --- a/packages/service-worker/BUILD.bazel +++ b/packages/service-worker/BUILD.bazel @@ -10,7 +10,6 @@ ng_module( "src/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/common", "//packages/core", diff --git a/packages/service-worker/config/BUILD.bazel b/packages/service-worker/config/BUILD.bazel index 59843001e9..6e5ff3f0c2 100644 --- a/packages/service-worker/config/BUILD.bazel +++ b/packages/service-worker/config/BUILD.bazel @@ -13,6 +13,5 @@ ng_module( "*.ts", "src/**/*.ts", ]), - bundle_dts = True, deps = ["//packages/core"], ) diff --git a/packages/upgrade/BUILD.bazel b/packages/upgrade/BUILD.bazel index 5b15383918..d1fa38ce0e 100644 --- a/packages/upgrade/BUILD.bazel +++ b/packages/upgrade/BUILD.bazel @@ -11,7 +11,6 @@ ng_module( "src/dynamic/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/core", "//packages/platform-browser", diff --git a/packages/upgrade/static/BUILD.bazel b/packages/upgrade/static/BUILD.bazel index 6f9bfc7b15..06499506d1 100644 --- a/packages/upgrade/static/BUILD.bazel +++ b/packages/upgrade/static/BUILD.bazel @@ -15,7 +15,6 @@ ng_module( "src/static/**/*.ts", ], ), - bundle_dts = True, deps = [ "//packages/core", "//packages/platform-browser", From b73e02005b1f4776064ca5988026a5e107dc93b3 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Thu, 7 Mar 2019 08:31:30 +0000 Subject: [PATCH 0257/1073] refactor: rename `matchingSelectorIndex` to `matchingProjectionSelectorIndex` (#29041) The previous name was ambiguous as there are different strategies for matching selectors depending upon the scenario. PR Close #29041 --- packages/core/src/render3/instructions.ts | 7 ++++--- packages/core/src/render3/node_selector_matcher.ts | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/core/src/render3/instructions.ts b/packages/core/src/render3/instructions.ts index 495c26b244..224b21e78c 100644 --- a/packages/core/src/render3/instructions.ts +++ b/packages/core/src/render3/instructions.ts @@ -38,7 +38,7 @@ import {StylingContext} from './interfaces/styling'; import {BINDING_INDEX, CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_VIEW, ExpandoInstructions, FLAGS, HEADER_OFFSET, HOST, INJECTOR, InitPhaseState, LView, LViewFlags, NEXT, OpaqueViewState, PARENT, QUERIES, RENDERER, RENDERER_FACTORY, RootContext, RootContextFlags, SANITIZER, TData, TVIEW, TView, T_HOST} from './interfaces/view'; import {assertNodeOfPossibleTypes, assertNodeType} from './node_assert'; import {appendChild, appendProjectedNodes, createTextNode, insertView, removeView} from './node_manipulation'; -import {isNodeMatchingSelectorList, matchingSelectorIndex} from './node_selector_matcher'; +import {isNodeMatchingSelectorList, matchingProjectionSelectorIndex} from './node_selector_matcher'; import {applyOnCreateInstructions} from './node_util'; import {decreaseElementDepthCount, enterView, getBindingsEnabled, getCheckNoChangesMode, getContextLView, getCurrentDirectiveDef, getElementDepthCount, getIsParent, getLView, getPreviousOrParentTNode, increaseElementDepthCount, isCreationMode, leaveView, nextContextImpl, resetComponentState, setBindingRoot, setCheckNoChangesMode, setCurrentDirectiveDef, setCurrentQueryIndex, setIsParent, setPreviousOrParentTNode} from './state'; import {getInitialClassNameValue, getInitialStyleStringValue, initializeStaticContext as initializeStaticStylingContext, patchContextWithStaticAttrs, renderInitialClasses, renderInitialStyles, renderStyling, updateClassProp as updateElementClassProp, updateContextWithBindings, updateStyleProp as updateElementStyleProp, updateStylingMap} from './styling/class_and_style_bindings'; @@ -2558,8 +2558,9 @@ export function projectionDef(selectors?: CssSelectorList[], textSelectors?: str let componentChild: TNode|null = componentNode.child; while (componentChild !== null) { - const bucketIndex = - selectors ? matchingSelectorIndex(componentChild, selectors, textSelectors !) : 0; + const bucketIndex = selectors ? + matchingProjectionSelectorIndex(componentChild, selectors, textSelectors !) : + 0; if (tails[bucketIndex]) { tails[bucketIndex] !.projectionNext = componentChild; diff --git a/packages/core/src/render3/node_selector_matcher.ts b/packages/core/src/render3/node_selector_matcher.ts index 9fcc32cfa7..aabd4d61e9 100644 --- a/packages/core/src/render3/node_selector_matcher.ts +++ b/packages/core/src/render3/node_selector_matcher.ts @@ -209,13 +209,13 @@ export function getProjectAsAttrValue(tNode: TNode): string|null { } /** - * Checks a given node against matching selectors and returns + * Checks a given node against matching projection selectors and returns * selector index (or 0 if none matched). * * This function takes into account the ngProjectAs attribute: if present its value will be compared * to the raw (un-parsed) CSS selector instead of using standard selector matching logic. */ -export function matchingSelectorIndex( +export function matchingProjectionSelectorIndex( tNode: TNode, selectors: CssSelectorList[], textSelectors: string[]): number { const ngProjectAsAttrVal = getProjectAsAttrValue(tNode); for (let i = 0; i < selectors.length; i++) { From c7e4931f324a68421942dfd0bb3f750ed66dd4f0 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Thu, 7 Mar 2019 08:31:30 +0000 Subject: [PATCH 0258/1073] fix(compiler): ensure template is updated if an output is transformed (#29041) No idea where the tests for this code are, but it looks like this was an oversight in the original commit 6a0f78. PR Close #29041 --- packages/compiler/src/render3/r3_ast.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/compiler/src/render3/r3_ast.ts b/packages/compiler/src/render3/r3_ast.ts index 7595fefc7f..79fd5e4477 100644 --- a/packages/compiler/src/render3/r3_ast.ts +++ b/packages/compiler/src/render3/r3_ast.ts @@ -193,8 +193,8 @@ export class TransformVisitor implements Visitor { const newReferences = transformAll(this, template.references); const newVariables = transformAll(this, template.variables); if (newAttributes != template.attributes || newInputs != template.inputs || - newChildren != template.children || newVariables != template.variables || - newReferences != template.references) { + newOutputs != template.outputs || newChildren != template.children || + newReferences != template.references || newVariables != template.variables) { return new Template( template.tagName, newAttributes, newInputs, newOutputs, newChildren, newReferences, newVariables, template.sourceSpan, template.startSourceSpan, template.endSourceSpan); From 423ac01dcf1887c65c783f1d8efbb08287e0f745 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Thu, 7 Mar 2019 08:31:31 +0000 Subject: [PATCH 0259/1073] refactor: rename `AttributeMarker.ProjectOnly` to `AttributeMarker.Bindings` (#29041) PR Close #29041 --- .../compliance/r3_compiler_compliance_spec.ts | 22 +++++++++---------- .../r3_view_compiler_binding_spec.ts | 6 ++--- .../r3_view_compiler_directives_spec.ts | 8 +++---- .../compliance/r3_view_compiler_i18n_spec.ts | 20 ++++++++--------- .../r3_view_compiler_listener_spec.ts | 10 ++++----- .../r3_view_compiler_styling_spec.ts | 6 ++--- .../r3_view_compiler_template_spec.ts | 22 +++++++++---------- packages/compiler/src/core.ts | 19 +++++++++++----- .../compiler/src/render3/view/template.ts | 15 ++++++------- packages/core/src/render3/di.ts | 4 +++- packages/core/src/render3/instructions.ts | 8 +++---- packages/core/src/render3/interfaces/node.ts | 19 +++++++++++----- .../core/src/render3/node_selector_matcher.ts | 16 +++++++------- .../test/render3/common_integration_spec.ts | 4 ++-- packages/core/test/render3/component_spec.ts | 6 ++--- packages/core/test/render3/content_spec.ts | 16 +++++++------- packages/core/test/render3/di_spec.ts | 6 ++--- packages/core/test/render3/directive_spec.ts | 12 +++++----- packages/core/test/render3/exports_spec.ts | 4 ++-- .../core/test/render3/host_binding_spec.ts | 2 +- packages/core/test/render3/i18n_spec.ts | 6 ++--- .../inherit_definition_feature_spec.ts | 2 +- .../core/test/render3/integration_spec.ts | 14 ++++++------ packages/core/test/render3/lifecycle_spec.ts | 4 ++-- .../render3/node_selector_matcher_spec.ts | 6 ++--- .../core/test/render3/pure_function_spec.ts | 2 +- packages/core/test/render3/query_spec.ts | 22 +++++++++---------- .../core/test/render3/template_ref_spec.ts | 2 +- .../test/render3/view_container_ref_spec.ts | 4 ++-- 29 files changed, 153 insertions(+), 134 deletions(-) diff --git a/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts b/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts index 681a7ac6c7..5044fa56b9 100644 --- a/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts @@ -309,7 +309,7 @@ describe('compiler compliance', () => { const factory = 'factory: function MyComponent_Factory(t) { return new (t || MyComponent)(); }'; const template = ` - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "id"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "id"]; … template: function MyComponent_Template(rf, ctx) { if (rf & 1) { @@ -863,7 +863,7 @@ describe('compiler compliance', () => { }; const MyAppDeclaration = ` - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "names"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "names"]; const $e0_ff$ = function ($v$) { return ["Nancy", $v$]; }; … MyApp.ngComponentDef = $r3$.ɵdefineComponent({ @@ -943,7 +943,7 @@ describe('compiler compliance', () => { }; const MyAppDefinition = ` - const $e0_attr$ = [${AttributeMarker.SelectOnly}, "names"]; + const $e0_attr$ = [${AttributeMarker.Bindings}, "names"]; const $e0_ff$ = function ($v0$, $v1$, $v2$, $v3$, $v4$, $v5$, $v6$, $v7$, $v8$) { return ["start-", $v0$, $v1$, $v2$, $v3$, $v4$, "-middle-", $v5$, $v6$, $v7$, $v8$, "-end"]; } @@ -1009,7 +1009,7 @@ describe('compiler compliance', () => { }; const MyAppDefinition = ` - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "config"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "config"]; const $e0_ff$ = function ($v$) { return {"duration": 500, animation: $v$}; }; … MyApp.ngComponentDef = $r3$.ɵdefineComponent({ @@ -1074,7 +1074,7 @@ describe('compiler compliance', () => { }; const MyAppDefinition = ` - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "config"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "config"]; const $c0$ = {opacity: 0, duration: 0}; const $e0_ff$ = function ($v$) { return {opacity: 1, duration: $v$}; }; const $e0_ff_1$ = function ($v$) { return [$c0$, $v$]; }; @@ -1223,7 +1223,7 @@ describe('compiler compliance', () => { } }; const output = ` - const $_c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; const $_c1$ = ["id", "second"]; function Cmp_div_0_Template(rf, ctx) { if (rf & 1) { $r3$.ɵelementStart(0, "div", $_c1$); @@ -2203,9 +2203,9 @@ describe('compiler compliance', () => { }; const template = ` - const $c0$ = ["ngFor", "" , ${AttributeMarker.SelectOnly}, "ngForOf"]; + const $c0$ = ["ngFor", "" , ${AttributeMarker.Bindings}, "ngForOf"]; const $c1$ = ["foo", ""]; - const $c2$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $c2$ = [${AttributeMarker.Bindings}, "ngIf"]; function MyComponent_div_0_span_3_Template(rf, ctx) { if (rf & 1) { @@ -2430,7 +2430,7 @@ describe('compiler compliance', () => { `; const MyComponentDefinition = ` - const $t1_attrs$ = ["for", "", ${AttributeMarker.SelectOnly}, "forOf"]; + const $t1_attrs$ = ["for", "", ${AttributeMarker.Bindings}, "forOf"]; function MyComponent__svg_g_1_Template(rf, ctx) { if (rf & 1) { $r3$.ɵnamespaceSVG(); @@ -2509,7 +2509,7 @@ describe('compiler compliance', () => { `; const MyComponentDefinition = ` - const $t1_attrs$ = ["for", "", ${AttributeMarker.SelectOnly}, "forOf"]; + const $t1_attrs$ = ["for", "", ${AttributeMarker.Bindings}, "forOf"]; function MyComponent_li_1_Template(rf, ctx) { if (rf & 1) { $r3$.ɵelementStart(0, "li"); @@ -2591,7 +2591,7 @@ describe('compiler compliance', () => { }; const MyComponentDefinition = ` - const $t4_attrs$ = ["for", "", ${AttributeMarker.SelectOnly}, "forOf"]; + const $t4_attrs$ = ["for", "", ${AttributeMarker.Bindings}, "forOf"]; function MyComponent_li_1_li_4_Template(rf, ctx) { if (rf & 1) { $r3$.ɵelementStart(0, "li"); diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts index 7b922505cb..1f53bce95f 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_binding_spec.ts @@ -74,7 +74,7 @@ describe('compiler compliance: bindings', () => { }; const template = ` - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "title"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "title"]; … template:function MyComponent_Template(rf, $ctx$){ if (rf & 1) { @@ -108,7 +108,7 @@ describe('compiler compliance: bindings', () => { }; const template = ` - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "title"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "title"]; … template:function MyComponent_Template(rf, $ctx$){ if (rf & 1) { @@ -162,7 +162,7 @@ describe('compiler compliance: bindings', () => { }; const template = ` - const $c0$ = [${AttributeMarker.SelectOnly}, "for"]; + const $c0$ = [${AttributeMarker.Bindings}, "for"]; // ... diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_directives_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_directives_spec.ts index 45bf4feaa0..567ea99b76 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_directives_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_directives_spec.ts @@ -130,7 +130,7 @@ describe('compiler compliance: directives', () => { // MyComponent definition should be: const MyComponentDefinition = ` … - const _c0 = [${AttributeMarker.SelectOnly}, "someDirective"]; + const _c0 = [${AttributeMarker.Bindings}, "someDirective"]; … MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ … @@ -236,7 +236,7 @@ describe('compiler compliance: directives', () => { const MyComponentDefinition = ` … - const $_c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; const $_c1$ = ["directiveA", ""]; function MyComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) { @@ -291,7 +291,7 @@ describe('compiler compliance: directives', () => { // MyComponent definition should be: const MyComponentDefinition = ` … - const $c0_a0$ = [${AttributeMarker.SelectOnly}, "someDirective"]; + const $c0_a0$ = [${AttributeMarker.Bindings}, "someDirective"]; … MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ … @@ -388,7 +388,7 @@ describe('compiler compliance: directives', () => { // MyComponent definition should be: const MyComponentDefinition = ` … - const $c0_a0$ = [${AttributeMarker.SelectOnly}, "someDirective"]; + const $c0_a0$ = [${AttributeMarker.Bindings}, "someDirective"]; … MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ … diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts index 6216bcc15b..461e6b8f3d 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts @@ -417,7 +417,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = ["ngFor", "", ${AttributeMarker.SelectOnly}, "ngForOf"]; + const $_c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; /** * @desc d * @meaning m @@ -548,7 +548,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = ["ngFor", "", ${AttributeMarker.SelectOnly}, "ngForOf"]; + const $_c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; /** * @desc d * @meaning m @@ -1011,7 +1011,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; const $MSG_EXTERNAL_7679414751795588050$$APP_SPEC_TS__1$ = goog.getMsg(" Some other content {$interpolation} {$startTagDiv} More nested levels with bindings {$interpolation_1} {$closeTagDiv}", { "interpolation": "\uFFFD0\uFFFD", "startTagDiv": "\uFFFD#3\uFFFD", @@ -1067,7 +1067,7 @@ describe('i18n support in the view compiler', () => { const output = String.raw ` const $_c0$ = ["src", "logo.png"]; - const $_c1$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c1$ = [${AttributeMarker.Bindings}, "ngIf"]; function MyComponent_img_1_Template(rf, ctx) { if (rf & 1) { $r3$.ɵelement(0, "img", $_c0$); @@ -1136,7 +1136,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; function MyComponent_div_2_div_4_Template(rf, ctx) { if (rf & 1) { $r3$.ɵi18nStart(0, $I18N_EXTERNAL_1221890473527419724$$APP_SPEC_TS_0$, 2); @@ -1232,7 +1232,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; const $MSG_EXTERNAL_119975189388320493$$APP_SPEC_TS__1$ = goog.getMsg("Some other content {$startTagSpan}{$interpolation}{$closeTagSpan}", { "startTagSpan": "\uFFFD#2\uFFFD", "interpolation": "\uFFFD0\uFFFD", @@ -1864,7 +1864,7 @@ describe('i18n support in the view compiler', () => { const $I18N_EXTERNAL_7842238767399919809$$APP_SPEC_TS_0$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_7842238767399919809$$APP_SPEC_TS_0$, { "VAR_SELECT": "\uFFFD0\uFFFD" }); - const $_c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; const $_c1$ = ["title", "icu only"]; const $MSG_EXTERNAL_8806993169187953163$$APP_SPEC_TS__3$ = goog.getMsg("{VAR_SELECT, select, 10 {ten} 20 {twenty} other {other}}"); const $I18N_EXTERNAL_8806993169187953163$$APP_SPEC_TS__3$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_8806993169187953163$$APP_SPEC_TS__3$, { @@ -2113,7 +2113,7 @@ describe('i18n support in the view compiler', () => { const $I18N_APP_SPEC_TS_2$ = $r3$.ɵi18nPostprocess($MSG_APP_SPEC_TS_2$, { "VAR_SELECT": "\uFFFD1\uFFFD" }); - const $_c3$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c3$ = [${AttributeMarker.Bindings}, "ngIf"]; const $MSG_APP_SPEC_TS__4$ = goog.getMsg("{VAR_SELECT, select, male {male} female {female} other {other}}"); const $I18N_APP_SPEC_TS__4$ = $r3$.ɵi18nPostprocess($MSG_APP_SPEC_TS__4$, { "VAR_SELECT": "\uFFFD0:1\uFFFD" @@ -2223,7 +2223,7 @@ describe('i18n support in the view compiler', () => { const $I18N_EXTERNAL_7842238767399919809$$APP_SPEC_TS_1$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_7842238767399919809$$APP_SPEC_TS_1$, { "VAR_SELECT": "\uFFFD0\uFFFD" }); - const $_c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; const $MSG_EXTERNAL_7068143081688428291$$APP_SPEC_TS__3$ = goog.getMsg("{VAR_SELECT, select, 10 {ten} 20 {twenty} 30 {thirty} other {other}}"); const $I18N_EXTERNAL_7068143081688428291$$APP_SPEC_TS__3$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_7068143081688428291$$APP_SPEC_TS__3$, { "VAR_SELECT": "\uFFFD0:1\uFFFD" @@ -2287,7 +2287,7 @@ describe('i18n support in the view compiler', () => { const $I18N_EXTERNAL_7825031864601787094$$APP_SPEC_TS_1$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_7825031864601787094$$APP_SPEC_TS_1$, { "VAR_SELECT": "\uFFFD0\uFFFD" }); - const $_c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; const $MSG_EXTERNAL_2310343208266678305$$APP_SPEC_TS__3$ = goog.getMsg("{VAR_SELECT, select, 10 {ten} 20 {twenty} 30 {thirty} other {other: {$interpolation}}}", { "interpolation": "\uFFFD1:1\uFFFD" }); diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_listener_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_listener_spec.ts index 207a0e2cb6..6fb133db67 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_listener_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_listener_spec.ts @@ -41,7 +41,7 @@ describe('compiler compliance: listen()', () => { // The template should look like this (where IDENT is a wild card for an identifier): const template = ` - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "click"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "click"]; … template: function MyComponent_Template(rf, ctx) { if (rf & 1) { @@ -87,7 +87,7 @@ describe('compiler compliance: listen()', () => { }; const template = ` - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "click"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "click"]; … template: function MyComponent_Template(rf, ctx) { if (rf & 1) { @@ -133,8 +133,8 @@ describe('compiler compliance: listen()', () => { }; const template = ` - const $t0_attrs$ = [${AttributeMarker.SelectOnly}, "ngIf"]; - const $e_attrs$ = [${AttributeMarker.SelectOnly}, "click"]; + const $t0_attrs$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $e_attrs$ = [${AttributeMarker.Bindings}, "click"]; function MyComponent_div_0_Template(rf, ctx) { if (rf & 1) { @@ -195,7 +195,7 @@ describe('compiler compliance: listen()', () => { }; const MyComponentDefinition = ` - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "click"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "click"]; const $e2_refs$ = ["user", ""]; … MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_styling_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_styling_spec.ts index a98686358f..e1eb6b02b5 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_styling_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_styling_spec.ts @@ -518,7 +518,7 @@ describe('compiler compliance: styling', () => { }; const template = ` - const $_c0$ = [${AttributeMarker.Styles}, "opacity", "1", ${AttributeMarker.SelectOnly}, "style"]; + const $_c0$ = [${AttributeMarker.Styles}, "opacity", "1", ${AttributeMarker.Bindings}, "style"]; const $_c1$ = ["width", "height"]; … MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ @@ -715,7 +715,7 @@ describe('compiler compliance: styling', () => { }; const template = ` - const $e0_attrs$ = [${AttributeMarker.Classes}, "grape", ${AttributeMarker.SelectOnly}, "class"]; + const $e0_attrs$ = [${AttributeMarker.Classes}, "grape", ${AttributeMarker.Bindings}, "class"]; const $e0_bindings$ = ["apple", "orange"]; … MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ @@ -771,7 +771,7 @@ describe('compiler compliance: styling', () => { }; const template = ` - const $e0_attrs$ = [${AttributeMarker.Classes}, "foo", ${AttributeMarker.Styles}, "width", "100px", ${AttributeMarker.SelectOnly}, "class", "style"]; + const $e0_attrs$ = [${AttributeMarker.Classes}, "foo", ${AttributeMarker.Styles}, "width", "100px", ${AttributeMarker.Bindings}, "class", "style"]; … MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ type: MyComponent, diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts index 8f56fbe23a..294b71f86b 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts @@ -50,8 +50,8 @@ describe('compiler compliance: template', () => { // The template should look like this (where IDENT is a wild card for an identifier): const template = ` - const $c0$ = ["ngFor", "", ${AttributeMarker.SelectOnly}, "ngForOf"]; - const $e0_attrs$ = [${AttributeMarker.SelectOnly}, "title", "click"]; + const $c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; + const $e0_attrs$ = [${AttributeMarker.Bindings}, "title", "click"]; function MyComponent_ul_0_li_1_div_1_Template(rf, ctx) { if (rf & 1) { @@ -144,8 +144,8 @@ describe('compiler compliance: template', () => { }; const template = ` - const $t0_attrs$ = ["ngFor", "", ${AttributeMarker.SelectOnly}, "ngForOf"]; - const $e_attrs$ = [${AttributeMarker.SelectOnly}, "click"]; + const $t0_attrs$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; + const $e_attrs$ = [${AttributeMarker.Bindings}, "click"]; function MyComponent_div_0_Template(rf, ctx) { if (rf & 1) { @@ -199,7 +199,7 @@ describe('compiler compliance: template', () => { }; const template = ` - const $c0$ = ["ngFor", "", ${AttributeMarker.SelectOnly}, "ngForOf"]; + const $c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; function MyComponent_span_0_Template(rf, ctx) { if (rf & 1) { @@ -253,8 +253,8 @@ describe('compiler compliance: template', () => { }; const template = ` - const $c0$ = ["ngFor", "", ${AttributeMarker.SelectOnly}, "ngForOf"]; - const $c1$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; + const $c1$ = [${AttributeMarker.Bindings}, "ngIf"]; function MyComponent_div_0_span_1_Template(rf, ctx) { if (rf & 1) { @@ -326,7 +326,7 @@ describe('compiler compliance: template', () => { // The template should look like this (where IDENT is a wild card for an identifier): const template = ` - const $c0$ = ["ngFor", "", ${AttributeMarker.SelectOnly}, "ngForOf"]; + const $c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; function MyComponent_div_0_div_1_div_1_Template(rf, ctx) { if (rf & 1) { $i0$.ɵelementStart(0, "div"); @@ -403,7 +403,7 @@ describe('compiler compliance: template', () => { }; const template = ` - const $c0$ = ["attr", "l", ${AttributeMarker.SelectOnly}, "boundAttr"]; + const $c0$ = ["attr", "l", ${AttributeMarker.Bindings}, "boundAttr"]; function MyComponent_ng_template_0_Template(rf, ctx) { if (rf & 1) { @@ -488,7 +488,7 @@ describe('compiler compliance: template', () => { }; const template = ` - const $t0_attrs$ = [${AttributeMarker.SelectOnly}, "outDirective"]; + const $t0_attrs$ = [${AttributeMarker.Bindings}, "outDirective"]; function MyComponent_ng_template_0_Template(rf, ctx) { } @@ -645,7 +645,7 @@ describe('compiler compliance: template', () => { }; const template = ` - const $c0$ = [${AttributeMarker.SelectOnly}, "ngIf"]; + const $c0$ = [${AttributeMarker.Bindings}, "ngIf"]; function MyComponent_div_0_Template(rf, ctx) { if (rf & 1) { diff --git a/packages/compiler/src/core.ts b/packages/compiler/src/core.ts index bb7de3cea7..8c3e9e4216 100644 --- a/packages/compiler/src/core.ts +++ b/packages/compiler/src/core.ts @@ -435,10 +435,19 @@ export const enum AttributeMarker { Styles = 2, /** - * This marker indicates that the following attribute names were extracted from bindings (ex.: - * [foo]="exp") and / or event handlers (ex. (bar)="doSth()"). - * Taking the above bindings and outputs as an example an attributes array could look as follows: - * ['class', 'fade in', AttributeMarker.SelectOnly, 'foo', 'bar'] + * Signals that the following attribute names were extracted from input or output bindings. + * + * For example, given the following HTML: + * + * ``` + *
+ * ``` + * + * the generated code is: + * + * ``` + * var _c1 = ['moo', 'car', AttributeMarker.Bindings, 'foo', 'bar']; + * ``` */ - SelectOnly = 3, + Bindings = 3, } diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index 751d89eda4..9ac5181ec7 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -578,8 +578,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver // this will build the instructions so that they fall into the following syntax // add attributes for directive matching purposes - attributes.push( - ...this.prepareSelectOnlyAttrs(allOtherInputs, element.outputs, stylingBuilder)); + attributes.push(...this.prepareBindingsAttrs(allOtherInputs, element.outputs, stylingBuilder)); parameters.push(this.toAttrsParam(attributes)); // local refs (ex.:
) @@ -801,7 +800,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver const attrsExprs: o.Expression[] = []; template.attributes.forEach( (a: t.TextAttribute) => { attrsExprs.push(asLiteral(a.name), asLiteral(a.value)); }); - attrsExprs.push(...this.prepareSelectOnlyAttrs(template.inputs, template.outputs)); + attrsExprs.push(...this.prepareBindingsAttrs(template.inputs, template.outputs)); parameters.push(this.toAttrsParam(attrsExprs)); // local refs (ex.: ) @@ -1045,13 +1044,13 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver * attrs = [prop, value, prop2, value2, * CLASSES, class1, class2, * STYLES, style1, value1, style2, value2, - * SELECT_ONLY, name1, name2, name2, ...] + * BINDINGS, name1, name2, name3, ...] * ``` * * Note that this function will fully ignore all synthetic (@foo) attribute values * because those values are intended to always be generated as property instructions. */ - private prepareSelectOnlyAttrs( + private prepareBindingsAttrs( inputs: t.BoundAttribute[], outputs: t.BoundEvent[], styles?: StylingBuilder): o.Expression[] { const alreadySeen = new Set(); @@ -1069,8 +1068,8 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } } - // it's important that this occurs before SelectOnly because once `elementStart` - // comes across the SelectOnly marker then it will continue reading each value as + // it's important that this occurs before BINDINGS because once `elementStart` + // comes across the BINDINGS marker then it will continue reading each value as // as single property value cell by cell. if (styles) { styles.populateInitialStylingAttrs(attrExprs); @@ -1098,7 +1097,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver // to the expressions. The marker is important because it tells the runtime // code that this is where attributes without values start... if (attrExprs.length) { - attrExprs.splice(attrsStartIndex, 0, o.literal(core.AttributeMarker.SelectOnly)); + attrExprs.splice(attrsStartIndex, 0, o.literal(core.AttributeMarker.Bindings)); } } diff --git a/packages/core/src/render3/di.ts b/packages/core/src/render3/di.ts index 6d94a78756..571733e2c4 100644 --- a/packages/core/src/render3/di.ts +++ b/packages/core/src/render3/di.ts @@ -272,7 +272,9 @@ export function injectAttributeImpl(tNode: TNode, attrNameToInject: string): str if (attrs) { for (let i = 0; i < attrs.length; i = i + 2) { const attrName = attrs[i]; - if (attrName === AttributeMarker.SelectOnly) break; + if (attrName === AttributeMarker.Bindings) break; + // TODO: What happens here if an attribute has a namespace? + // TODO: What happens here if the attribute name happens to match a CSS class or style? if (attrName == attrNameToInject) { return attrs[i + 1] as string; } diff --git a/packages/core/src/render3/instructions.ts b/packages/core/src/render3/instructions.ts index 224b21e78c..5516ab0b7b 100644 --- a/packages/core/src/render3/instructions.ts +++ b/packages/core/src/render3/instructions.ts @@ -2126,15 +2126,15 @@ function generateInitialInputs( let i = 0; while (i < attrs.length) { const attrName = attrs[i]; - // If we hit Select-Only, Classes or Styles, we're done anyway. None of those are valid inputs. - if (attrName === AttributeMarker.SelectOnly || attrName === AttributeMarker.Classes || - attrName === AttributeMarker.Styles) - break; if (attrName === AttributeMarker.NamespaceURI) { // We do not allow inputs on namespaced attributes. i += 4; continue; } + + // If we hit any other attribute markers, we're done anyway. None of those are valid inputs. + if (typeof attrName === 'number') break; + const minifiedInputName = inputs[attrName]; const attrValue = attrs[i + 1]; diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index 7e4af970fc..1350085948 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -107,12 +107,21 @@ export const enum AttributeMarker { Styles = 2, /** - * This marker indicates that the following attribute names were extracted from bindings (ex.: - * [foo]="exp") and / or event handlers (ex. (bar)="doSth()"). - * Taking the above bindings and outputs as an example an attributes array could look as follows: - * ['class', 'fade in', AttributeMarker.SelectOnly, 'foo', 'bar'] + * Signals that the following attribute names were extracted from input or output bindings. + * + * For example, given the following HTML: + * + * ``` + *
+ * ``` + * + * the generated code is: + * + * ``` + * var _c1 = ['moo', 'car', AttributeMarker.Bindings, 'foo', 'bar']; + * ``` */ - SelectOnly = 3, + Bindings = 3, } /** diff --git a/packages/core/src/render3/node_selector_matcher.ts b/packages/core/src/render3/node_selector_matcher.ts index aabd4d61e9..f85c15b28d 100644 --- a/packages/core/src/render3/node_selector_matcher.ts +++ b/packages/core/src/render3/node_selector_matcher.ts @@ -60,8 +60,8 @@ export function isNodeMatchingSelector( tNode: TNode, selector: CssSelector, isProjectionMode: boolean): boolean { ngDevMode && assertDefined(selector[0], 'Selector should have a tag name'); let mode: SelectorFlags = SelectorFlags.ELEMENT; - const nodeAttrs = tNode.attrs !; - const selectOnlyMarkerIdx = nodeAttrs ? nodeAttrs.indexOf(AttributeMarker.SelectOnly) : -1; + const nodeAttrs = tNode.attrs || []; + const nameOnlyMarkerIdx = nodeAttrs.indexOf(AttributeMarker.Bindings); // When processing ":not" selectors, we skip to the next ":not" if the // current one doesn't match @@ -116,7 +116,7 @@ export function isNodeMatchingSelector( if (selectorAttrValue !== '') { let nodeAttrValue: string; const maybeAttrName = nodeAttrs[attrIndexInNode]; - if (selectOnlyMarkerIdx > -1 && attrIndexInNode > selectOnlyMarkerIdx) { + if (attrIndexInNode > nameOnlyMarkerIdx) { nodeAttrValue = ''; } else { ngDevMode && assertNotEqual( @@ -154,7 +154,7 @@ function readClassValueFromTNode(tNode: TNode): string { } /** - * Examines an attributes definition array from a node to find the index of the + * Examines an attribute's definition array from a node to find the index of the * attribute with the specified name. * * NOTE: Will not find namespaced attributes. @@ -164,7 +164,7 @@ function readClassValueFromTNode(tNode: TNode): string { */ function findAttrIndexInNode(name: string, attrs: TAttributes | null): number { if (attrs === null) return -1; - let selectOnlyMode = false; + let nameOnlyMode = false; let i = 0; while (i < attrs.length) { const maybeAttrName = attrs[i]; @@ -174,10 +174,10 @@ function findAttrIndexInNode(name: string, attrs: TAttributes | null): number { // NOTE(benlesh): will not find namespaced attributes. This is by design. i += 4; } else { - if (maybeAttrName === AttributeMarker.SelectOnly) { - selectOnlyMode = true; + if (maybeAttrName === AttributeMarker.Bindings) { + nameOnlyMode = true; } - i += selectOnlyMode ? 1 : 2; + i += nameOnlyMode ? 1 : 2; } } diff --git a/packages/core/test/render3/common_integration_spec.ts b/packages/core/test/render3/common_integration_spec.ts index 9acd912e89..d50d4b8acd 100644 --- a/packages/core/test/render3/common_integration_spec.ts +++ b/packages/core/test/render3/common_integration_spec.ts @@ -973,7 +973,7 @@ describe('@angular/common integration', () => { } }, 1, 0, 'ng-template', undefined, ['tpl', ''], templateRefExtractor); template( - 2, null, 0, 0, 'ng-template', [AttributeMarker.SelectOnly, 'ngTemplateOutlet']); + 2, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'ngTemplateOutlet']); } if (rf & RenderFlags.Update) { const tplRef = load(1); @@ -1016,7 +1016,7 @@ describe('@angular/common integration', () => { text(0, 'from tpl'); } }, 1, 0, 'ng-template', undefined, ['tpl', ''], templateRefExtractor); - elementContainerStart(2, [AttributeMarker.SelectOnly, 'ngTemplateOutlet']); + elementContainerStart(2, [AttributeMarker.Bindings, 'ngTemplateOutlet']); elementContainerEnd(); } if (rf & RenderFlags.Update) { diff --git a/packages/core/test/render3/component_spec.ts b/packages/core/test/render3/component_spec.ts index 863754af0c..6a4064d6fc 100644 --- a/packages/core/test/render3/component_spec.ts +++ b/packages/core/test/render3/component_spec.ts @@ -186,7 +186,7 @@ it('should not invoke renderer destroy method for embedded views', () => { elementStart(0, 'div'); text(1, 'Root view'); elementEnd(); - template(2, MyComponent_div_Template_2, 2, 0, null, [AttributeMarker.SelectOnly, 'ngIf']); + template(2, MyComponent_div_Template_2, 2, 0, null, [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(2, 'ngIf', bind(ctx.visible)); @@ -514,8 +514,8 @@ describe('recursive components', () => { if (rf & RenderFlags.Create) { text(0); - template(1, IfTemplate, 1, 1, 'ng-if-tree', [AttributeMarker.SelectOnly, 'ngIf']); - template(2, IfTemplate2, 1, 1, 'ng-if-tree', [AttributeMarker.SelectOnly, 'ngIf']); + template(1, IfTemplate, 1, 1, 'ng-if-tree', [AttributeMarker.Bindings, 'ngIf']); + template(2, IfTemplate2, 1, 1, 'ng-if-tree', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { textBinding(0, bind(ctx.data.value)); diff --git a/packages/core/test/render3/content_spec.ts b/packages/core/test/render3/content_spec.ts index 235a932d0e..c2cfe38ae2 100644 --- a/packages/core/test/render3/content_spec.ts +++ b/packages/core/test/render3/content_spec.ts @@ -815,7 +815,7 @@ describe('content projection', () => { if (rf & RenderFlags.Create) { projectionDef(); text(0, 'Before-'); - template(1, IfTemplate, 1, 0, 'ng-template', [AttributeMarker.SelectOnly, 'ngIf']); + template(1, IfTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); text(2, '-After'); } if (rf & RenderFlags.Update) { @@ -879,7 +879,7 @@ describe('content projection', () => { if (rf & RenderFlags.Create) { projectionDef(); text(0, 'Before-'); - template(1, IfTemplate, 1, 0, 'ng-template', [AttributeMarker.SelectOnly, 'ngIf']); + template(1, IfTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); text(2, '-After'); } if (rf & RenderFlags.Update) { @@ -945,7 +945,7 @@ describe('content projection', () => { projectionDef([[['div']]], ['div']); projection(0); text(1, 'Before-'); - template(2, IfTemplate, 1, 0, '', [AttributeMarker.SelectOnly, 'ngIf']); + template(2, IfTemplate, 1, 0, '', [AttributeMarker.Bindings, 'ngIf']); text(3, '-After'); } if (rf & RenderFlags.Update) { @@ -1058,7 +1058,7 @@ describe('content projection', () => { */ const App = createComponent('app', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - element(0, 'button', [AttributeMarker.SelectOnly, 'trigger']); + element(0, 'button', [AttributeMarker.Bindings, 'trigger']); elementStart(1, 'comp', null, ['comp', '']); { text(3, 'Some content'); } elementEnd(); @@ -1370,7 +1370,7 @@ describe('content projection', () => { content - + `; const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { @@ -1419,7 +1419,7 @@ describe('content projection', () => { content - + `; const Parent = createComponent('parent', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { @@ -1590,7 +1590,7 @@ describe('content projection', () => { if (rf & RenderFlags.Create) { elementStart(0, 'child'); { - elementStart(1, 'span', [AttributeMarker.SelectOnly, 'title']); + elementStart(1, 'span', [AttributeMarker.Bindings, 'title']); { text(2, 'Has title'); } elementEnd(); } @@ -2089,7 +2089,7 @@ describe('content projection', () => { const Parent = createComponent('parent', function(rf: RenderFlags, ctx: {value: any}) { if (rf & RenderFlags.Create) { elementStart(0, 'child'); - { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.SelectOnly, 'ngIf']); } + { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Bindings, 'ngIf']); } elementEnd(); } if (rf & RenderFlags.Update) { diff --git a/packages/core/test/render3/di_spec.ts b/packages/core/test/render3/di_spec.ts index 2f2b514320..bbd6952bea 100644 --- a/packages/core/test/render3/di_spec.ts +++ b/packages/core/test/render3/di_spec.ts @@ -490,7 +490,7 @@ describe('di', () => { const App = createComponent('app', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { elementStart(0, 'div', ['dirB', '']); - { template(1, IfTemplate, 4, 1, 'div', [AttributeMarker.SelectOnly, 'ngIf', '']); } + { template(1, IfTemplate, 4, 1, 'div', [AttributeMarker.Bindings, 'ngIf', '']); } elementEnd(); } if (rf & RenderFlags.Update) { @@ -2135,7 +2135,7 @@ describe('di', () => { const MyApp = createComponent('my-app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['exist', 'existValue', AttributeMarker.SelectOnly, 'nonExist']); + elementStart(0, 'div', ['exist', 'existValue', AttributeMarker.Bindings, 'nonExist']); exist = injectAttribute('exist'); nonExist = injectAttribute('nonExist'); } @@ -2153,7 +2153,7 @@ describe('di', () => { const MyApp = createComponent('my-app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'div', [ - 'exist', 'existValue', AttributeMarker.SelectOnly, 'binding1', 'nonExist', 'binding2' + 'exist', 'existValue', AttributeMarker.Bindings, 'binding1', 'nonExist', 'binding2' ]); exist = injectAttribute('exist'); nonExist = injectAttribute('nonExist'); diff --git a/packages/core/test/render3/directive_spec.ts b/packages/core/test/render3/directive_spec.ts index 63bc33692c..045bbcf373 100644 --- a/packages/core/test/render3/directive_spec.ts +++ b/packages/core/test/render3/directive_spec.ts @@ -53,7 +53,7 @@ describe('directive', () => { */ function createTemplate() { // using 2 bindings to show example shape of attributes array - element(0, 'span', ['class', 'fade', AttributeMarker.SelectOnly, 'test', 'other']); + element(0, 'span', ['class', 'fade', AttributeMarker.Bindings, 'test', 'other']); } function updateTemplate() { elementProperty(0, 'test', bind(false)); } @@ -105,7 +105,7 @@ describe('directive', () => { function createTemplate() { // putting name (test) in the "usual" value position element( - 0, 'span', ['class', 'fade', AttributeMarker.SelectOnly, 'prop1', 'test', 'prop2']); + 0, 'span', ['class', 'fade', AttributeMarker.Bindings, 'prop1', 'test', 'prop2']); } function updateTemplate() { @@ -208,7 +208,7 @@ describe('directive', () => { if (rf & RenderFlags.Create) { template( 0, MyComponent_ng_container_Template_0, 2, 0, 'ng-container', - [AttributeMarker.SelectOnly, 'ngIf']); + [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.visible)); @@ -240,7 +240,7 @@ describe('directive', () => { * */ function createTemplate() { - elementStart(0, 'span', [AttributeMarker.SelectOnly, 'out']); + elementStart(0, 'span', [AttributeMarker.Bindings, 'out']); { listener('out', () => {}); } elementEnd(); } @@ -274,7 +274,7 @@ describe('directive', () => { */ const Cmpt = createComponent('Cmpt', function(rf: RenderFlags, ctx: {value: any}) { if (rf & RenderFlags.Create) { - template(0, null, 0, 0, 'ng-template', [AttributeMarker.SelectOnly, 'out']); + template(0, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'out']); listener('out', () => { ctx.value = true; }); } }, 1, 0, [Directive]); @@ -295,7 +295,7 @@ describe('directive', () => { */ const Cmpt = createComponent('Cmpt', function(rf: RenderFlags, ctx: {value: any}) { if (rf & RenderFlags.Create) { - elementContainerStart(0, [AttributeMarker.SelectOnly, 'out']); + elementContainerStart(0, [AttributeMarker.Bindings, 'out']); { listener('out', () => { ctx.value = true; }); } diff --git a/packages/core/test/render3/exports_spec.ts b/packages/core/test/render3/exports_spec.ts index c8cab82482..4e3b8d0ff9 100644 --- a/packages/core/test/render3/exports_spec.ts +++ b/packages/core/test/render3/exports_spec.ts @@ -232,7 +232,7 @@ describe('exports', () => { if (rf & RenderFlags.Create) { elementStart(0, 'input', ['value', 'one'], ['outerInput', '']); elementEnd(); - template(2, outerTemplate, 5, 2, 'div', [AttributeMarker.SelectOnly, 'ngIf']); + template(2, outerTemplate, 5, 2, 'div', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(2, 'ngIf', bind(app.outer)); @@ -246,7 +246,7 @@ describe('exports', () => { text(1); elementStart(2, 'input', ['value', 'two'], ['innerInput', '']); elementEnd(); - template(4, innerTemplate, 2, 2, 'div', [AttributeMarker.SelectOnly, 'ngIf']); + template(4, innerTemplate, 2, 2, 'div', [AttributeMarker.Bindings, 'ngIf']); } elementEnd(); } diff --git a/packages/core/test/render3/host_binding_spec.ts b/packages/core/test/render3/host_binding_spec.ts index a1af92fe26..9bb9813c05 100644 --- a/packages/core/test/render3/host_binding_spec.ts +++ b/packages/core/test/render3/host_binding_spec.ts @@ -107,7 +107,7 @@ describe('host bindings', () => { }); } - function Template() { element(0, 'span', [AttributeMarker.SelectOnly, 'dir']); } + function Template() { element(0, 'span', [AttributeMarker.Bindings, 'dir']); } const fixture = new TemplateFixture(Template, () => {}, 1, 0, [Directive]); expect(fixture.html).toEqual(''); diff --git a/packages/core/test/render3/i18n_spec.ts b/packages/core/test/render3/i18n_spec.ts index 89c6cadfe5..2a43416bbc 100644 --- a/packages/core/test/render3/i18n_spec.ts +++ b/packages/core/test/render3/i18n_spec.ts @@ -1392,19 +1392,19 @@ describe('Runtime i18n', () => { directives: [Directive], template: (rf: RenderFlags, ctx: MyApp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.SelectOnly, 'dir']); + elementStart(0, 'div', [AttributeMarker.Bindings, 'dir']); { i18nAttributes(1, MSG_DIV_1_ATTR_1); i18nStart(2, MSG_DIV_1); { - elementStart(3, 'b', [AttributeMarker.SelectOnly, 'dir']); // Will be removed + elementStart(3, 'b', [AttributeMarker.Bindings, 'dir']); // Will be removed { i18nAttributes(4, MSG_DIV_1_ATTR_1); } elementEnd(); } i18nEnd(); } elementEnd(); - element(5, 'div', [AttributeMarker.SelectOnly, 'dir']); + element(5, 'div', [AttributeMarker.Bindings, 'dir']); } if (rf & RenderFlags.Update) { i18nExp(bind(ctx.exp1)); diff --git a/packages/core/test/render3/inherit_definition_feature_spec.ts b/packages/core/test/render3/inherit_definition_feature_spec.ts index 1ec9214fbd..c2f7553814 100644 --- a/packages/core/test/render3/inherit_definition_feature_spec.ts +++ b/packages/core/test/render3/inherit_definition_feature_spec.ts @@ -600,7 +600,7 @@ describe('InheritDefinitionFeature', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.SelectOnly, 'sub-dir']); + elementStart(0, 'div', [AttributeMarker.Bindings, 'sub-dir']); { element(1, 'span', null, ['foo', '']); element(3, 'span', null, ['bar', '']); diff --git a/packages/core/test/render3/integration_spec.ts b/packages/core/test/render3/integration_spec.ts index 5e396bee48..6e825ebd0f 100644 --- a/packages/core/test/render3/integration_spec.ts +++ b/packages/core/test/render3/integration_spec.ts @@ -722,7 +722,7 @@ describe('render3 integration test', () => { createComponent('test-cmpt', function(rf: RenderFlags, ctx: {value: any}) { if (rf & RenderFlags.Create) { template( - 0, ngIfTemplate, 2, 0, 'ng-template', [AttributeMarker.SelectOnly, 'ngIf']); + 0, ngIfTemplate, 2, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.value)); @@ -782,7 +782,7 @@ describe('render3 integration test', () => { if (rf & RenderFlags.Create) { template( 0, embeddedTemplate, 2, 0, 'ng-template', - [AttributeMarker.SelectOnly, 'testDirective']); + [AttributeMarker.Bindings, 'testDirective']); } }, 1, 0, [TestDirective]); @@ -899,7 +899,7 @@ describe('render3 integration test', () => { if (rf & RenderFlags.Create) { template( 0, embeddedTemplate, 4, 0, 'ng-template', - [AttributeMarker.SelectOnly, 'testDirective']); + [AttributeMarker.Bindings, 'testDirective']); } }, 1, 0, [TestDirective]); @@ -941,7 +941,7 @@ describe('render3 integration test', () => { function Template() { elementStart(0, 'div'); { - elementContainerStart(1, [AttributeMarker.SelectOnly, 'dir']); + elementContainerStart(1, [AttributeMarker.Bindings, 'dir']); elementContainerEnd(); } elementEnd(); @@ -986,7 +986,7 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags) { if (rf & RenderFlags.Create) { - elementContainerStart(0, [AttributeMarker.SelectOnly, 'dir']); + elementContainerStart(0, [AttributeMarker.Bindings, 'dir']); template( 1, ContentTemplate, 1, 0, 'ng-template', null, ['content', ''], templateRefExtractor); elementContainerEnd(); @@ -1044,7 +1044,7 @@ describe('render3 integration test', () => { if (rf & RenderFlags.Create) { elementContainerStart(0); template( - 1, ContentTemplate, 1, 0, 'ng-template', [AttributeMarker.SelectOnly, 'dir'], [], + 1, ContentTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'dir'], [], templateRefExtractor); elementContainerEnd(); } @@ -2269,7 +2269,7 @@ describe('component animations', () => { factory: () => new AnimComp(), template: (rf: RenderFlags, ctx: AnimComp) => { if (rf & RenderFlags.Create) { - element(0, 'div', [AttributeMarker.SelectOnly, '@fooAnimation']); + element(0, 'div', [AttributeMarker.Bindings, '@fooAnimation']); } if (rf & RenderFlags.Update) { elementAttribute(0, '@fooAnimation', bind(ctx.animationValue)); diff --git a/packages/core/test/render3/lifecycle_spec.ts b/packages/core/test/render3/lifecycle_spec.ts index 72ebed8263..eb9c497948 100644 --- a/packages/core/test/render3/lifecycle_spec.ts +++ b/packages/core/test/render3/lifecycle_spec.ts @@ -2970,7 +2970,7 @@ describe('lifecycles', () => { function conditionTpl(rf: RenderFlags, ctx: Cmpt) { if (rf & RenderFlags.Create) { template( - 0, null, 0, 1, 'ng-template', [AttributeMarker.SelectOnly, 'onDestroyDirective']); + 0, null, 0, 1, 'ng-template', [AttributeMarker.Bindings, 'onDestroyDirective']); } } @@ -2981,7 +2981,7 @@ describe('lifecycles', () => { */ function cmptTpl(rf: RenderFlags, cmpt: Cmpt) { if (rf & RenderFlags.Create) { - template(0, conditionTpl, 1, 1, 'ng-template', [AttributeMarker.SelectOnly, 'ngIf']); + template(0, conditionTpl, 1, 1, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(cmpt.showing)); diff --git a/packages/core/test/render3/node_selector_matcher_spec.ts b/packages/core/test/render3/node_selector_matcher_spec.ts index 0b55dd306d..1af7bfeb80 100644 --- a/packages/core/test/render3/node_selector_matcher_spec.ts +++ b/packages/core/test/render3/node_selector_matcher_spec.ts @@ -181,14 +181,14 @@ describe('css selector matching', () => { }); it('should take optional binding attribute names into account', () => { - expect(isMatching('span', [AttributeMarker.SelectOnly, 'directive'], [ + expect(isMatching('span', [AttributeMarker.Bindings, 'directive'], [ '', 'directive', '' ])).toBeTruthy(`Selector '[directive]' should match `); }); it('should not match optional binding attribute names if attribute selector has value', () => { - expect(isMatching('span', [AttributeMarker.SelectOnly, 'directive'], [ + expect(isMatching('span', [AttributeMarker.Bindings, 'directive'], [ '', 'directive', 'value' ])).toBeFalsy(`Selector '[directive=value]' should not match `); }); @@ -196,7 +196,7 @@ describe('css selector matching', () => { it('should not match optional binding attribute names if attribute selector has value and next name equals to value', () => { expect(isMatching( - 'span', [AttributeMarker.SelectOnly, 'directive', 'value'], + 'span', [AttributeMarker.Bindings, 'directive', 'value'], ['', 'directive', 'value'])) .toBeFalsy( `Selector '[directive=value]' should not match `); diff --git a/packages/core/test/render3/pure_function_spec.ts b/packages/core/test/render3/pure_function_spec.ts index 81e4a3519e..73e3566d6b 100644 --- a/packages/core/test/render3/pure_function_spec.ts +++ b/packages/core/test/render3/pure_function_spec.ts @@ -87,7 +87,7 @@ describe('array literals', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, IfTemplate, 1, 3, 'my-comp', [AttributeMarker.SelectOnly, 'ngIf']); + template(0, IfTemplate, 1, 3, 'my-comp', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.showing)); diff --git a/packages/core/test/render3/query_spec.ts b/packages/core/test/render3/query_spec.ts index 5362544d1a..eccb58954e 100644 --- a/packages/core/test/render3/query_spec.ts +++ b/packages/core/test/render3/query_spec.ts @@ -1540,7 +1540,7 @@ describe('query', () => { template( 4, Cmpt_Template_5, 2, 1, 'ng-template', null, ['tpl2', ''], templateRefExtractor); - template(6, null, 0, 0, 'ng-template', [AttributeMarker.SelectOnly, 'vc']); + template(6, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); } if (rf & RenderFlags.Update) { @@ -1637,8 +1637,8 @@ describe('query', () => { template( 0, Cmpt_Template_1, 2, 1, 'ng-template', [], ['tpl', ''], templateRefExtractor); - template(2, null, 0, 0, 'ng-template', [AttributeMarker.SelectOnly, 'vc']); - template(3, null, 0, 0, 'ng-template', [AttributeMarker.SelectOnly, 'vc']); + template(2, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); + template(3, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); } if (rf & RenderFlags.Update) { @@ -1711,7 +1711,7 @@ describe('query', () => { 0, MyApp_Template_1, 2, 0, 'ng-template', undefined, ['tpl', ''], templateRefExtractor); template( - 2, null, 0, 0, 'ng-template', [AttributeMarker.SelectOnly, 'ngTemplateOutlet']); + 2, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'ngTemplateOutlet']); } if (rf & RenderFlags.Update) { const tplRef = reference(1); @@ -2207,7 +2207,7 @@ describe('query', () => { function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { template( - 0, AppComponent_Template_1, 1, 0, 'div', [AttributeMarker.SelectOnly, 'someDir']); + 0, AppComponent_Template_1, 1, 0, 'div', [AttributeMarker.Bindings, 'someDir']); element(1, 'div', null, ['foo', '']); } }, @@ -2295,7 +2295,7 @@ describe('query', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.SelectOnly, 'with-content']); + elementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); { element(1, 'span', null, ['foo', '']); } elementEnd(); } @@ -2334,7 +2334,7 @@ describe('query', () => { for (let i = 0; i < 3; i++) { let rf = embeddedViewStart(1, 3, 0); if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.SelectOnly, 'with-content']); + elementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); { element(1, 'span', null, ['foo', '']); } elementEnd(); } @@ -2392,7 +2392,7 @@ describe('query', () => { const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'shallow-comp'); - { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.SelectOnly, 'ngIf', '']); } + { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Bindings, 'ngIf', '']); } elementEnd(); } if (rf & RenderFlags.Update) { @@ -2531,10 +2531,10 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.SelectOnly, 'query'], ['out', 'query']); + elementStart(0, 'div', [AttributeMarker.Bindings, 'query'], ['out', 'query']); { element(2, 'span', ['id', 'foo'], ['foo', '']); - elementStart(4, 'div', [AttributeMarker.SelectOnly, 'query'], ['in', 'query']); + elementStart(4, 'div', [AttributeMarker.Bindings, 'query'], ['in', 'query']); { element(6, 'span', ['id', 'bar'], ['bar', '']); } elementEnd(); element(8, 'span', ['id', 'baz'], ['baz', '']); @@ -2732,7 +2732,7 @@ describe('query', () => { function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart( - 0, 'div', [AttributeMarker.SelectOnly, 'shallow-query', 'deep-query'], + 0, 'div', [AttributeMarker.Bindings, 'shallow-query', 'deep-query'], ['shallow', 'shallow-query', 'deep', 'deep-query']); { element(3, 'span', null, ['foo', '']); diff --git a/packages/core/test/render3/template_ref_spec.ts b/packages/core/test/render3/template_ref_spec.ts index 6abede7cef..8afc300055 100644 --- a/packages/core/test/render3/template_ref_spec.ts +++ b/packages/core/test/render3/template_ref_spec.ts @@ -108,7 +108,7 @@ describe('TemplateRef', () => { function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, ngIfTemplate, 1, 0, 'ng-template', [AttributeMarker.SelectOnly, 'ngIf']); + template(0, ngIfTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.showing)); diff --git a/packages/core/test/render3/view_container_ref_spec.ts b/packages/core/test/render3/view_container_ref_spec.ts index a3f6eb29dd..f2b1890da8 100644 --- a/packages/core/test/render3/view_container_ref_spec.ts +++ b/packages/core/test/render3/view_container_ref_spec.ts @@ -542,7 +542,7 @@ describe('ViewContainerRef', () => { vars: 2, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.SelectOnly, 'tplDir']); + elementStart(0, 'div', [AttributeMarker.Bindings, 'tplDir']); { text(1); } elementEnd(); } @@ -628,7 +628,7 @@ describe('ViewContainerRef', () => { vars: 2, template: function(rf: RenderFlags, loop: any) { if (rf & RenderFlags.Create) { - template(0, null, 0, 0, 'ng-template', [AttributeMarker.SelectOnly, 'ngForOf']); + template(0, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'ngForOf']); } if (rf & RenderFlags.Update) { From e3a401d20c440823f179be8737e50a13bce9df66 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Thu, 7 Mar 2019 08:31:31 +0000 Subject: [PATCH 0260/1073] refactor(ivy): define new `AttributeMarker.Template` marker (#29041) This commit adds a new `AttributeMarker` type that will be used, in a future commit, to mark attributes as coming from an inline-template expansion, rather than the element that is being contained in the template. PR Close #29041 --- packages/compiler/src/core.ts | 25 ++++++++++++++++ .../compiler/src/render3/view/template.ts | 7 +++-- packages/core/src/render3/di.ts | 9 +++--- packages/core/src/render3/interfaces/node.ts | 29 +++++++++++++++++++ .../core/src/render3/node_selector_matcher.ts | 16 ++++++++-- .../cyclic_import/bundle.golden_symbols.json | 9 ++++++ .../bundling/todo/bundle.golden_symbols.json | 21 ++++++++++++++ 7 files changed, 106 insertions(+), 10 deletions(-) diff --git a/packages/compiler/src/core.ts b/packages/compiler/src/core.ts index 8c3e9e4216..ae78dd3cf6 100644 --- a/packages/compiler/src/core.ts +++ b/packages/compiler/src/core.ts @@ -450,4 +450,29 @@ export const enum AttributeMarker { * ``` */ Bindings = 3, + + /** + * Signals that the following attribute names were hoisted from an inline-template declaration. + * + * For example, given the following HTML: + * + * ``` + *
+ * ``` + * + * the generated code for the `template()` instruction would include: + * + * ``` + * ['dirA', '', AttributeMarker.Bindings, 'dirB', AttributeMarker.Template, 'ngFor', 'ngForOf', + * 'ngForTrackBy', 'let-value'] + * ``` + * + * while the generated code for the `element()` instruction inside the template function would + * include: + * + * ``` + * ['dirA', '', AttributeMarker.Bindings, 'dirB'] + * ``` + */ + Template = 4, } diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index 9ac5181ec7..aa9dfbb989 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -1044,7 +1044,8 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver * attrs = [prop, value, prop2, value2, * CLASSES, class1, class2, * STYLES, style1, value1, style2, value2, - * BINDINGS, name1, name2, name3, ...] + * BINDINGS, name1, name2, name3, + * TEMPLATE, name4, name5, ...] * ``` * * Note that this function will fully ignore all synthetic (@foo) attribute values @@ -1068,8 +1069,8 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } } - // it's important that this occurs before BINDINGS because once `elementStart` - // comes across the BINDINGS marker then it will continue reading each value as + // it's important that this occurs before BINDINGS and TEMPLATE because once `elementStart` + // comes across the BINDINGS or TEMPLATE markers then it will continue reading each value as // as single property value cell by cell. if (styles) { styles.populateInitialStylingAttrs(attrExprs); diff --git a/packages/core/src/render3/di.ts b/packages/core/src/render3/di.ts index 571733e2c4..b75f578d9a 100644 --- a/packages/core/src/render3/di.ts +++ b/packages/core/src/render3/di.ts @@ -17,7 +17,7 @@ import {getComponentDef, getDirectiveDef, getPipeDef} from './definition'; import {NG_ELEMENT_ID} from './fields'; import {DirectiveDef} from './interfaces/definition'; import {NO_PARENT_INJECTOR, NodeInjectorFactory, PARENT_INJECTOR, RelativeInjectorLocation, RelativeInjectorLocationFlags, TNODE, isFactory} from './interfaces/injector'; -import {AttributeMarker, TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType} from './interfaces/node'; +import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType, isNameOnlyAttributeMarker} from './interfaces/node'; import {DECLARATION_VIEW, INJECTOR, LView, TData, TVIEW, TView, T_HOST} from './interfaces/view'; import {assertNodeOfPossibleTypes} from './node_assert'; import {getLView, getPreviousOrParentTNode, setTNodeAndViewData} from './state'; @@ -272,9 +272,10 @@ export function injectAttributeImpl(tNode: TNode, attrNameToInject: string): str if (attrs) { for (let i = 0; i < attrs.length; i = i + 2) { const attrName = attrs[i]; - if (attrName === AttributeMarker.Bindings) break; - // TODO: What happens here if an attribute has a namespace? - // TODO: What happens here if the attribute name happens to match a CSS class or style? + // If we hit a `Bindings` or `Template` marker then we are done. + if (isNameOnlyAttributeMarker(attrName)) break; + // TODO(FW-1137): Skip namespaced attributes + // TODO(FW-1139): supports classes/styles in @Attribute injection if (attrName == attrNameToInject) { return attrs[i + 1] as string; } diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index 1350085948..79bf033e9e 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -122,6 +122,35 @@ export const enum AttributeMarker { * ``` */ Bindings = 3, + + /** + * Signals that the following attribute names were hoisted from an inline-template declaration. + * + * For example, given the following HTML: + * + * ``` + *
+ * ``` + * + * the generated code for the `template()` instruction would include: + * + * ``` + * ['dirA', '', AttributeMarker.Bindings, 'dirB', AttributeMarker.Template, 'ngFor', 'ngForOf', + * 'ngForTrackBy', 'let-value'] + * ``` + * + * while the generated code for the `element()` instruction inside the template function would + * include: + * + * ``` + * ['dirA', '', AttributeMarker.Bindings, 'dirB'] + * ``` + */ + Template = 4, +} + +export function isNameOnlyAttributeMarker(marker: string | AttributeMarker) { + return marker === AttributeMarker.Bindings || marker === AttributeMarker.Template; } /** diff --git a/packages/core/src/render3/node_selector_matcher.ts b/packages/core/src/render3/node_selector_matcher.ts index f85c15b28d..b5c63a4980 100644 --- a/packages/core/src/render3/node_selector_matcher.ts +++ b/packages/core/src/render3/node_selector_matcher.ts @@ -9,7 +9,8 @@ import '../util/ng_dev_mode'; import {assertDefined, assertNotEqual} from '../util/assert'; -import {AttributeMarker, TAttributes, TNode, TNodeType, unusedValueExportToPlacateAjd as unused1} from './interfaces/node'; + +import {AttributeMarker, TAttributes, TNode, TNodeType, isNameOnlyAttributeMarker, unusedValueExportToPlacateAjd as unused1} from './interfaces/node'; import {CssSelector, CssSelectorList, NG_PROJECT_AS_ATTR_NAME, SelectorFlags, unusedValueExportToPlacateAjd as unused2} from './interfaces/projection'; import {getInitialClassNameValue} from './styling/class_and_style_bindings'; @@ -61,7 +62,16 @@ export function isNodeMatchingSelector( ngDevMode && assertDefined(selector[0], 'Selector should have a tag name'); let mode: SelectorFlags = SelectorFlags.ELEMENT; const nodeAttrs = tNode.attrs || []; - const nameOnlyMarkerIdx = nodeAttrs.indexOf(AttributeMarker.Bindings); + + // Find the index of first attribute that has no value, only a name. + let nameOnlyMarkerIdx = nodeAttrs && nodeAttrs.length; + for (let i = 0; i < nodeAttrs.length; i++) { + const nodeAttr = nodeAttrs[i]; + if (isNameOnlyAttributeMarker(nodeAttr)) { + nameOnlyMarkerIdx = i; + break; + } + } // When processing ":not" selectors, we skip to the next ":not" if the // current one doesn't match @@ -174,7 +184,7 @@ function findAttrIndexInNode(name: string, attrs: TAttributes | null): number { // NOTE(benlesh): will not find namespaced attributes. This is by design. i += 4; } else { - if (maybeAttrName === AttributeMarker.Bindings) { + if (isNameOnlyAttributeMarker(maybeAttrName)) { nameOnlyMode = true; } i += nameOnlyMode ? 1 : 2; diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 4da4db673a..40a176494e 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -374,6 +374,9 @@ { "name": "getLViewParent" }, + { + "name": "getNameOnlyMarkerIndex" + }, { "name": "getNativeAnchorNode" }, @@ -494,6 +497,9 @@ { "name": "isLView" }, + { + "name": "isNameOnlyAttributeMarker" + }, { "name": "isNodeMatchingSelector" }, @@ -518,6 +524,9 @@ { "name": "locateHostElement" }, + { + "name": "matchTemplateAttribute" + }, { "name": "namespaceHTML" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 87495a342b..53a801a8d9 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -323,9 +323,21 @@ { "name": "_c18" }, + { + "name": "_c19" + }, { "name": "_c2" }, + { + "name": "_c20" + }, + { + "name": "_c21" + }, + { + "name": "_c22" + }, { "name": "_c3" }, @@ -749,6 +761,9 @@ { "name": "getMultiStylesStartIndex" }, + { + "name": "getNameOnlyMarkerIndex" + }, { "name": "getNativeAnchorNode" }, @@ -983,6 +998,9 @@ { "name": "isListLikeIterable" }, + { + "name": "isNameOnlyAttributeMarker" + }, { "name": "isNodeMatchingSelector" }, @@ -1040,6 +1058,9 @@ { "name": "markViewDirty" }, + { + "name": "matchTemplateAttribute" + }, { "name": "namespaceHTML" }, From f535f31d78ec09d47c525edc56c7626c3c4daac0 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Thu, 7 Mar 2019 08:31:31 +0000 Subject: [PATCH 0261/1073] fix(ivy): match attribute selectors for content projection with inline-templates (#29041) The content projection mechanism is static, in that it only looks at the static template nodes before directives are matched and change detection is run. When you have a selector-based content projection the selection is based on nodes that are available in the template. For example: ``` ``` would match ```
``` If you have an inline-template in your projected nodes. For example: ```
``` This gets pre-parsed and converted to a canonical form. For example: ```
``` Note that only structural attributes (e.g. `*ngIf`) stay with the `` node. The other attributes move to the contained element inside the template. When this happens in ivy, the ng-template content is removed from the component template function and is compiled into its own template function. But this means that the information about the attributes that were on the content are lost and the projection selection mechanism is unable to match the original `
`. This commit adds support for this in ivy. Attributes are separated into three groups (Bindings, Templates and "other"). For inline-templates the Bindings and "other" types are hoisted back from the contained node to the `template()` instruction, so that they can be used in content projection matching. PR Close #29041 --- .../compliance/r3_compiler_compliance_spec.ts | 37 ++--- .../r3_view_compiler_directives_spec.ts | 4 +- .../compliance/r3_view_compiler_i18n_spec.ts | 38 +++--- .../r3_view_compiler_listener_spec.ts | 2 +- .../r3_view_compiler_template_spec.ts | 31 ++--- packages/compiler/src/render3/r3_ast.ts | 19 +-- .../src/render3/r3_template_transform.ts | 22 ++- .../compiler/src/render3/view/template.ts | 67 ++++++---- packages/compiler/src/render3/view/util.ts | 4 + .../render3/r3_template_transform_spec.ts | 2 + packages/core/src/render3/di.ts | 3 +- packages/core/src/render3/interfaces/node.ts | 4 - .../core/src/render3/node_selector_matcher.ts | 126 ++++++++++++------ packages/core/src/render3/util/attrs_utils.ts | 11 ++ .../test/render3/common_integration_spec.ts | 91 +++++++++---- packages/core/test/render3/component_spec.ts | 10 +- packages/core/test/render3/content_spec.ts | 14 +- packages/core/test/render3/di_spec.ts | 24 ++-- packages/core/test/render3/directive_spec.ts | 2 +- .../core/test/render3/discovery_utils_spec.ts | 4 +- packages/core/test/render3/exports_spec.ts | 4 +- .../core/test/render3/host_binding_spec.ts | 2 +- packages/core/test/render3/i18n_spec.ts | 6 +- .../core/test/render3/instructions_spec.ts | 5 +- .../core/test/render3/integration_spec.ts | 3 +- packages/core/test/render3/lifecycle_spec.ts | 5 +- .../core/test/render3/pure_function_spec.ts | 4 +- packages/core/test/render3/query_spec.ts | 7 +- 28 files changed, 357 insertions(+), 194 deletions(-) diff --git a/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts b/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts index 5044fa56b9..96bd5fe292 100644 --- a/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_compiler_compliance_spec.ts @@ -788,7 +788,7 @@ describe('compiler compliance', () => { });`; const MyComponentDefinition = ` const $c1$ = ["foo", ""]; - const $c2$ = ["if", ""]; + const $c2$ = [${AttributeMarker.Template}, "if"]; function MyComponent_li_2_Template(rf, ctx) { if (rf & 1) { $r3$.ɵelementStart(0, "li"); @@ -1223,17 +1223,18 @@ describe('compiler compliance', () => { } }; const output = ` - const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; - const $_c1$ = ["id", "second"]; + const $_c0$ = ["id", "second", ${AttributeMarker.Template}, "ngIf"]; + const $_c1$ = ["id", "third", ${AttributeMarker.Template}, "ngIf"]; + const $_c2$ = ["id", "second"]; function Cmp_div_0_Template(rf, ctx) { if (rf & 1) { - $r3$.ɵelementStart(0, "div", $_c1$); - $r3$.ɵprojection(1, 1); - $r3$.ɵelementEnd(); + $r3$.ɵelementStart(0, "div", $_c2$); + $r3$.ɵprojection(1, 1); + $r3$.ɵelementEnd(); } } - const $_c4$ = ["id", "third"]; + const $_c3$ = ["id", "third"]; function Cmp_div_1_Template(rf, ctx) { if (rf & 1) { - $r3$.ɵelementStart(0, "div", $_c4$); + $r3$.ɵelementStart(0, "div", $_c3$); $r3$.ɵtext(1, " No ng-content, no instructions generated. "); $r3$.ɵelementEnd(); } @@ -1244,14 +1245,14 @@ describe('compiler compliance', () => { $r3$.ɵprojection(1); } } - const $_c2$ = [[["span", "title", "tofirst"]]]; - const $_c3$ = ["span[title=toFirst]"]; + const $_c4$ = [[["span", "title", "tofirst"]]]; + const $_c5$ = ["span[title=toFirst]"]; … template: function Cmp_Template(rf, ctx) { if (rf & 1) { - $r3$.ɵprojectionDef($_c2$, $_c3$); + $r3$.ɵprojectionDef($_c4$, $_c5$); $r3$.ɵtemplate(0, Cmp_div_0_Template, 2, 0, "div", $_c0$); - $r3$.ɵtemplate(1, Cmp_div_1_Template, 2, 0, "div", $_c0$); + $r3$.ɵtemplate(1, Cmp_div_1_Template, 2, 0, "div", $_c1$); $r3$.ɵtemplate(2, Cmp_ng_template_2_Template, 2, 0, "ng-template"); } if (rf & 2) { @@ -2112,7 +2113,7 @@ describe('compiler compliance', () => { const MyComponentDefinition = ` const $c1$ = ["foo", ""]; - const $c2$ = ["if", ""]; + const $c2$ = [${AttributeMarker.Template}, "if"]; const $c3$ = ["baz", ""]; const $c4$ = ["bar", ""]; function MyComponent_div_3_span_2_Template(rf, ctx) { @@ -2203,9 +2204,9 @@ describe('compiler compliance', () => { }; const template = ` - const $c0$ = ["ngFor", "" , ${AttributeMarker.Bindings}, "ngForOf"]; + const $c0$ = [${AttributeMarker.Template}, "ngFor", "ngForOf"]; const $c1$ = ["foo", ""]; - const $c2$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $c2$ = [${AttributeMarker.Template}, "ngIf"]; function MyComponent_div_0_span_3_Template(rf, ctx) { if (rf & 1) { @@ -2430,7 +2431,7 @@ describe('compiler compliance', () => { `; const MyComponentDefinition = ` - const $t1_attrs$ = ["for", "", ${AttributeMarker.Bindings}, "forOf"]; + const $t1_attrs$ = [${AttributeMarker.Template}, "for", "forOf"]; function MyComponent__svg_g_1_Template(rf, ctx) { if (rf & 1) { $r3$.ɵnamespaceSVG(); @@ -2509,7 +2510,7 @@ describe('compiler compliance', () => { `; const MyComponentDefinition = ` - const $t1_attrs$ = ["for", "", ${AttributeMarker.Bindings}, "forOf"]; + const $t1_attrs$ = [${AttributeMarker.Template}, "for", "forOf"]; function MyComponent_li_1_Template(rf, ctx) { if (rf & 1) { $r3$.ɵelementStart(0, "li"); @@ -2591,7 +2592,7 @@ describe('compiler compliance', () => { }; const MyComponentDefinition = ` - const $t4_attrs$ = ["for", "", ${AttributeMarker.Bindings}, "forOf"]; + const $t4_attrs$ = [${AttributeMarker.Template}, "for", "forOf"]; function MyComponent_li_1_li_4_Template(rf, ctx) { if (rf & 1) { $r3$.ɵelementStart(0, "li"); diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_directives_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_directives_spec.ts index 567ea99b76..441b237027 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_directives_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_directives_spec.ts @@ -236,7 +236,7 @@ describe('compiler compliance: directives', () => { const MyComponentDefinition = ` … - const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $_c0$ = ["directiveA", "", ${AttributeMarker.Template}, "ngIf"]; const $_c1$ = ["directiveA", ""]; function MyComponent_ng_container_0_Template(rf, ctx) { if (rf & 1) { @@ -339,7 +339,7 @@ describe('compiler compliance: directives', () => { // MyComponent definition should be: const MyComponentDefinition = ` … - const $c0_a0$ = ["someDirective", ""]; + const $c0_a0$ = [${AttributeMarker.Template}, "someDirective"]; … MyComponent.ngComponentDef = $r3$.ɵdefineComponent({ … diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts index 461e6b8f3d..2a13f675b1 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts @@ -417,7 +417,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; + const $_c0$ = [${AttributeMarker.Template}, "ngFor", "ngForOf"]; /** * @desc d * @meaning m @@ -548,7 +548,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; + const $_c0$ = [${AttributeMarker.Template}, "ngFor", "ngForOf"]; /** * @desc d * @meaning m @@ -1011,7 +1011,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Template}, "ngIf"]; const $MSG_EXTERNAL_7679414751795588050$$APP_SPEC_TS__1$ = goog.getMsg(" Some other content {$interpolation} {$startTagDiv} More nested levels with bindings {$interpolation_1} {$closeTagDiv}", { "interpolation": "\uFFFD0\uFFFD", "startTagDiv": "\uFFFD#3\uFFFD", @@ -1067,7 +1067,8 @@ describe('i18n support in the view compiler', () => { const output = String.raw ` const $_c0$ = ["src", "logo.png"]; - const $_c1$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $_c1$ = ["src", "logo.png", ${AttributeMarker.Template}, "ngIf"]; + const $_c2$ = ["src", "logo.png", ${AttributeMarker.Bindings}, "title", ${AttributeMarker.Template}, "ngIf"]; function MyComponent_img_1_Template(rf, ctx) { if (rf & 1) { $r3$.ɵelement(0, "img", $_c0$); @@ -1076,11 +1077,11 @@ describe('i18n support in the view compiler', () => { const $MSG_EXTERNAL_2367729185105559721$ = goog.getMsg("App logo #{$interpolation}", { "interpolation": "\uFFFD0\uFFFD" }); - const $_c2$ = ["title", $MSG_EXTERNAL_2367729185105559721$]; + const $_c3$ = ["title", $MSG_EXTERNAL_2367729185105559721$]; function MyComponent_img_2_Template(rf, ctx) { if (rf & 1) { $r3$.ɵelementStart(0, "img", $_c0$); - $r3$.ɵi18nAttributes(1, $_c2$); + $r3$.ɵi18nAttributes(1, $_c3$); $r3$.ɵelementEnd(); } if (rf & 2) { @@ -1096,7 +1097,7 @@ describe('i18n support in the view compiler', () => { if (rf & 1) { $r3$.ɵelement(0, "img", $_c0$); $r3$.ɵtemplate(1, MyComponent_img_1_Template, 1, 0, "img", $_c1$); - $r3$.ɵtemplate(2, MyComponent_img_2_Template, 2, 1, "img", $_c1$); + $r3$.ɵtemplate(2, MyComponent_img_2_Template, 2, 1, "img", $_c2$); } if (rf & 2) { $r3$.ɵflushHooksUpTo(1); @@ -1136,7 +1137,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Template}, "ngIf"]; function MyComponent_div_2_div_4_Template(rf, ctx) { if (rf & 1) { $r3$.ɵi18nStart(0, $I18N_EXTERNAL_1221890473527419724$$APP_SPEC_TS_0$, 2); @@ -1232,7 +1233,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Template}, "ngIf"]; const $MSG_EXTERNAL_119975189388320493$$APP_SPEC_TS__1$ = goog.getMsg("Some other content {$startTagSpan}{$interpolation}{$closeTagSpan}", { "startTagSpan": "\uFFFD#2\uFFFD", "interpolation": "\uFFFD0\uFFFD", @@ -1864,15 +1865,16 @@ describe('i18n support in the view compiler', () => { const $I18N_EXTERNAL_7842238767399919809$$APP_SPEC_TS_0$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_7842238767399919809$$APP_SPEC_TS_0$, { "VAR_SELECT": "\uFFFD0\uFFFD" }); - const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; - const $_c1$ = ["title", "icu only"]; + const $_c0$ = ["title", "icu only", ${AttributeMarker.Template}, "ngIf"]; + const $_c1$ = ["title", "icu and text", ${AttributeMarker.Template}, "ngIf"]; + const $_c2$ = ["title", "icu only"]; const $MSG_EXTERNAL_8806993169187953163$$APP_SPEC_TS__3$ = goog.getMsg("{VAR_SELECT, select, 10 {ten} 20 {twenty} other {other}}"); const $I18N_EXTERNAL_8806993169187953163$$APP_SPEC_TS__3$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_8806993169187953163$$APP_SPEC_TS__3$, { "VAR_SELECT": "\uFFFD0\uFFFD" }); function MyComponent_div_2_Template(rf, ctx) { if (rf & 1) { - $r3$.ɵelementStart(0, "div", $_c1$); + $r3$.ɵelementStart(0, "div", $_c2$); $r3$.ɵi18n(1, $I18N_EXTERNAL_8806993169187953163$$APP_SPEC_TS__3$); $r3$.ɵelementEnd(); } @@ -1883,7 +1885,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵi18nApply(1); } } - const $_c2$ = ["title", "icu and text"]; + const $_c3$ = ["title", "icu and text"]; const $MSG_EXTERNAL_1922743304863699161$$APP_SPEC_TS__5$ = goog.getMsg("{VAR_SELECT, select, 0 {no emails} 1 {one email} other {{$interpolation} emails}}", { "interpolation": "\uFFFD1\uFFFD" }); @@ -1892,7 +1894,7 @@ describe('i18n support in the view compiler', () => { }); function MyComponent_div_3_Template(rf, ctx) { if (rf & 1) { - $r3$.ɵelementStart(0, "div", $_c2$); + $r3$.ɵelementStart(0, "div", $_c3$); $r3$.ɵtext(1, " You have "); $r3$.ɵi18n(2, $I18N_EXTERNAL_1922743304863699161$$APP_SPEC_TS__5$); $r3$.ɵtext(3, ". "); @@ -1915,7 +1917,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵi18n(1, $I18N_EXTERNAL_7842238767399919809$$APP_SPEC_TS_0$); $r3$.ɵelementEnd(); $r3$.ɵtemplate(2, MyComponent_div_2_Template, 2, 1, "div", $_c0$); - $r3$.ɵtemplate(3, MyComponent_div_3_Template, 4, 2, "div", $_c0$); + $r3$.ɵtemplate(3, MyComponent_div_3_Template, 4, 2, "div", $_c1$); } if (rf & 2) { $r3$.ɵflushHooksUpTo(1); @@ -2113,7 +2115,7 @@ describe('i18n support in the view compiler', () => { const $I18N_APP_SPEC_TS_2$ = $r3$.ɵi18nPostprocess($MSG_APP_SPEC_TS_2$, { "VAR_SELECT": "\uFFFD1\uFFFD" }); - const $_c3$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $_c3$ = [${AttributeMarker.Template}, "ngIf"]; const $MSG_APP_SPEC_TS__4$ = goog.getMsg("{VAR_SELECT, select, male {male} female {female} other {other}}"); const $I18N_APP_SPEC_TS__4$ = $r3$.ɵi18nPostprocess($MSG_APP_SPEC_TS__4$, { "VAR_SELECT": "\uFFFD0:1\uFFFD" @@ -2223,7 +2225,7 @@ describe('i18n support in the view compiler', () => { const $I18N_EXTERNAL_7842238767399919809$$APP_SPEC_TS_1$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_7842238767399919809$$APP_SPEC_TS_1$, { "VAR_SELECT": "\uFFFD0\uFFFD" }); - const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Template}, "ngIf"]; const $MSG_EXTERNAL_7068143081688428291$$APP_SPEC_TS__3$ = goog.getMsg("{VAR_SELECT, select, 10 {ten} 20 {twenty} 30 {thirty} other {other}}"); const $I18N_EXTERNAL_7068143081688428291$$APP_SPEC_TS__3$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_7068143081688428291$$APP_SPEC_TS__3$, { "VAR_SELECT": "\uFFFD0:1\uFFFD" @@ -2287,7 +2289,7 @@ describe('i18n support in the view compiler', () => { const $I18N_EXTERNAL_7825031864601787094$$APP_SPEC_TS_1$ = $r3$.ɵi18nPostprocess($MSG_EXTERNAL_7825031864601787094$$APP_SPEC_TS_1$, { "VAR_SELECT": "\uFFFD0\uFFFD" }); - const $_c0$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $_c0$ = [${AttributeMarker.Template}, "ngIf"]; const $MSG_EXTERNAL_2310343208266678305$$APP_SPEC_TS__3$ = goog.getMsg("{VAR_SELECT, select, 10 {ten} 20 {twenty} 30 {thirty} other {other: {$interpolation}}}", { "interpolation": "\uFFFD1:1\uFFFD" }); diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_listener_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_listener_spec.ts index 6fb133db67..041339cb91 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_listener_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_listener_spec.ts @@ -133,7 +133,7 @@ describe('compiler compliance: listen()', () => { }; const template = ` - const $t0_attrs$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $t0_attrs$ = [${AttributeMarker.Template}, "ngIf"]; const $e_attrs$ = [${AttributeMarker.Bindings}, "click"]; function MyComponent_div_0_Template(rf, ctx) { diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts index 294b71f86b..33ca856a7b 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_template_spec.ts @@ -50,13 +50,14 @@ describe('compiler compliance: template', () => { // The template should look like this (where IDENT is a wild card for an identifier): const template = ` - const $c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; - const $e0_attrs$ = [${AttributeMarker.Bindings}, "title", "click"]; + const $c0$ = [${AttributeMarker.Template}, "ngFor", "ngForOf"]; + const $c1$ = [${AttributeMarker.Bindings}, "title", "click", ${AttributeMarker.Template}, "ngFor", "ngForOf"]; + const $c2$ = [${AttributeMarker.Bindings}, "title", "click"]; function MyComponent_ul_0_li_1_div_1_Template(rf, ctx) { if (rf & 1) { const $s$ = $i0$.ɵgetCurrentView(); - $i0$.ɵelementStart(0, "div", $e0_attrs$); + $i0$.ɵelementStart(0, "div", $c2$); $i0$.ɵlistener("click", function MyComponent_ul_0_li_1_div_1_Template_div_click_0_listener($event){ $i0$.ɵrestoreView($s$); const $inner$ = ctx.$implicit; @@ -83,7 +84,7 @@ describe('compiler compliance: template', () => { function MyComponent_ul_0_li_1_Template(rf, ctx) { if (rf & 1) { $i0$.ɵelementStart(0, "li"); - $i0$.ɵtemplate(1, MyComponent_ul_0_li_1_div_1_Template, 2, 2, "div", _c0); + $i0$.ɵtemplate(1, MyComponent_ul_0_li_1_div_1_Template, 2, 2, "div", $c1$); $i0$.ɵelementEnd(); } if (rf & 2) { @@ -96,7 +97,7 @@ describe('compiler compliance: template', () => { function MyComponent_ul_0_Template(rf, ctx) { if (rf & 1) { $i0$.ɵelementStart(0, "ul"); - $i0$.ɵtemplate(1, MyComponent_ul_0_li_1_Template, 2, 1, "li", _c0); + $i0$.ɵtemplate(1, MyComponent_ul_0_li_1_Template, 2, 1, "li", $c0$); $i0$.ɵelementEnd(); } if (rf & 2) { @@ -108,7 +109,7 @@ describe('compiler compliance: template', () => { // ... template:function MyComponent_Template(rf, ctx){ if (rf & 1) { - $i0$.ɵtemplate(0, MyComponent_ul_0_Template, 2, 1, "ul", _c0); + $i0$.ɵtemplate(0, MyComponent_ul_0_Template, 2, 1, "ul", $c0$); } if (rf & 2) { $i0$.ɵelementProperty(0, "ngForOf", $i0$.ɵbind(ctx.items)); @@ -144,7 +145,7 @@ describe('compiler compliance: template', () => { }; const template = ` - const $t0_attrs$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; + const $t0_attrs$ = [${AttributeMarker.Bindings}, "click", ${AttributeMarker.Template}, "ngFor", "ngForOf"]; const $e_attrs$ = [${AttributeMarker.Bindings}, "click"]; function MyComponent_div_0_Template(rf, ctx) { @@ -199,7 +200,7 @@ describe('compiler compliance: template', () => { }; const template = ` - const $c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; + const $c0$ = [${AttributeMarker.Template}, "ngFor", "ngForOf"]; function MyComponent_span_0_Template(rf, ctx) { if (rf & 1) { @@ -253,8 +254,8 @@ describe('compiler compliance: template', () => { }; const template = ` - const $c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; - const $c1$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $c0$ = [${AttributeMarker.Template}, "ngFor", "ngForOf"]; + const $c1$ = [${AttributeMarker.Template}, "ngIf"]; function MyComponent_div_0_span_1_Template(rf, ctx) { if (rf & 1) { @@ -326,7 +327,7 @@ describe('compiler compliance: template', () => { // The template should look like this (where IDENT is a wild card for an identifier): const template = ` - const $c0$ = ["ngFor", "", ${AttributeMarker.Bindings}, "ngForOf"]; + const $c0$ = [${AttributeMarker.Template}, "ngFor", "ngForOf"]; function MyComponent_div_0_div_1_div_1_Template(rf, ctx) { if (rf & 1) { $i0$.ɵelementStart(0, "div"); @@ -344,7 +345,7 @@ describe('compiler compliance: template', () => { function MyComponent_div_0_div_1_Template(rf, ctx) { if (rf & 1) { $i0$.ɵelementStart(0, "div"); - $i0$.ɵtemplate(1, MyComponent_div_0_div_1_div_1_Template, 2, 2, "div", _c0); + $i0$.ɵtemplate(1, MyComponent_div_0_div_1_div_1_Template, 2, 2, "div", $c0$); $i0$.ɵelementEnd(); } if (rf & 2) { @@ -357,7 +358,7 @@ describe('compiler compliance: template', () => { function MyComponent_div_0_Template(rf, ctx) { if (rf & 1) { $i0$.ɵelementStart(0, "div"); - $i0$.ɵtemplate(1, MyComponent_div_0_div_1_Template, 2, 1, "div", _c0); + $i0$.ɵtemplate(1, MyComponent_div_0_div_1_Template, 2, 1, "div", $c0$); $i0$.ɵelementEnd(); } if (rf & 2) { @@ -369,7 +370,7 @@ describe('compiler compliance: template', () => { // ... template:function MyComponent_Template(rf, ctx){ if (rf & 1) { - $i0$.ɵtemplate(0, MyComponent_div_0_Template, 2, 1, "div", _c0); + $i0$.ɵtemplate(0, MyComponent_div_0_Template, 2, 1, "div", $c0$); } if (rf & 2) { $i0$.ɵelementProperty(0, "ngForOf", $i0$.ɵbind(ctx.items)); @@ -645,7 +646,7 @@ describe('compiler compliance: template', () => { }; const template = ` - const $c0$ = [${AttributeMarker.Bindings}, "ngIf"]; + const $c0$ = [${AttributeMarker.Template}, "ngIf"]; function MyComponent_div_0_Template(rf, ctx) { if (rf & 1) { diff --git a/packages/compiler/src/render3/r3_ast.ts b/packages/compiler/src/render3/r3_ast.ts index 79fd5e4477..e51bd6ff89 100644 --- a/packages/compiler/src/render3/r3_ast.ts +++ b/packages/compiler/src/render3/r3_ast.ts @@ -81,10 +81,10 @@ export class Element implements Node { export class Template implements Node { constructor( public tagName: string, public attributes: TextAttribute[], public inputs: BoundAttribute[], - public outputs: BoundEvent[], public children: Node[], public references: Reference[], - public variables: Variable[], public sourceSpan: ParseSourceSpan, - public startSourceSpan: ParseSourceSpan|null, public endSourceSpan: ParseSourceSpan|null, - public i18n?: I18nAST) {} + public outputs: BoundEvent[], public templateAttrs: (BoundAttribute|TextAttribute)[], + public children: Node[], public references: Reference[], public variables: Variable[], + public sourceSpan: ParseSourceSpan, public startSourceSpan: ParseSourceSpan|null, + public endSourceSpan: ParseSourceSpan|null, public i18n?: I18nAST) {} visit(visitor: Visitor): Result { return visitor.visitTemplate(this); } } @@ -189,15 +189,18 @@ export class TransformVisitor implements Visitor { const newAttributes = transformAll(this, template.attributes); const newInputs = transformAll(this, template.inputs); const newOutputs = transformAll(this, template.outputs); + const newTemplateAttrs = transformAll(this, template.templateAttrs); const newChildren = transformAll(this, template.children); const newReferences = transformAll(this, template.references); const newVariables = transformAll(this, template.variables); if (newAttributes != template.attributes || newInputs != template.inputs || - newOutputs != template.outputs || newChildren != template.children || - newReferences != template.references || newVariables != template.variables) { + newOutputs != template.outputs || newTemplateAttrs != template.templateAttrs || + newChildren != template.children || newReferences != template.references || + newVariables != template.variables) { return new Template( - template.tagName, newAttributes, newInputs, newOutputs, newChildren, newReferences, - newVariables, template.sourceSpan, template.startSourceSpan, template.endSourceSpan); + template.tagName, newAttributes, newInputs, newOutputs, newTemplateAttrs, newChildren, + newReferences, newVariables, template.sourceSpan, template.startSourceSpan, + template.endSourceSpan); } return template; } diff --git a/packages/compiler/src/render3/r3_template_transform.ts b/packages/compiler/src/render3/r3_template_transform.ts index 371dda13b4..83521634e5 100644 --- a/packages/compiler/src/render3/r3_template_transform.ts +++ b/packages/compiler/src/render3/r3_template_transform.ts @@ -177,8 +177,9 @@ class HtmlAstToIvyAst implements html.Visitor { const attrs = this.extractAttributes(element.name, parsedProperties, i18nAttrsMeta); parsedElement = new t.Template( - element.name, attributes, attrs.bound, boundEvents, children, references, variables, - element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n); + element.name, attributes, attrs.bound, boundEvents, [/* no template attributes */], + children, references, variables, element.sourceSpan, element.startSourceSpan, + element.endSourceSpan, element.i18n); } else { const attrs = this.extractAttributes(element.name, parsedProperties, i18nAttrsMeta); parsedElement = new t.Element( @@ -187,10 +188,25 @@ class HtmlAstToIvyAst implements html.Visitor { } if (elementHasInlineTemplate) { + // If this node is an inline-template (e.g. has *ngFor) then we need to create a template + // node that contains this node. + // Moreover, if the node is an element, then we need to hoist its attributes to the template + // node for matching against content projection selectors. const attrs = this.extractAttributes('ng-template', templateParsedProperties, i18nAttrsMeta); + const templateAttrs: (t.TextAttribute | t.BoundAttribute)[] = []; + attrs.literal.forEach(attr => templateAttrs.push(attr)); + attrs.bound.forEach(attr => templateAttrs.push(attr)); + const hoistedAttrs = parsedElement instanceof t.Element ? + { + attributes: parsedElement.attributes, + inputs: parsedElement.inputs, + outputs: parsedElement.outputs, + } : + {attributes: [], inputs: [], outputs: []}; // TODO(pk): test for this case parsedElement = new t.Template( - (parsedElement as t.Element).name, attrs.literal, attrs.bound, [], [parsedElement], [], + (parsedElement as t.Element).name, hoistedAttrs.attributes, hoistedAttrs.inputs, + hoistedAttrs.outputs, templateAttrs, [parsedElement], [/* no references */], templateVariables, element.sourceSpan, element.startSourceSpan, element.endSourceSpan, element.i18n); } diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index aa9dfbb989..5038bf8b44 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -576,9 +576,8 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver attributes.push(...getAttributeNameLiterals(attr.name), o.literal(attr.value)); }); - // this will build the instructions so that they fall into the following syntax - // add attributes for directive matching purposes - attributes.push(...this.prepareBindingsAttrs(allOtherInputs, element.outputs, stylingBuilder)); + // add attributes for directive and projection matching purposes + attributes.push(...this.prepareNonRenderAttrs(allOtherInputs, element.outputs, stylingBuilder)); parameters.push(this.toAttrsParam(attributes)); // local refs (ex.:
) @@ -774,6 +773,7 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } visitTemplate(template: t.Template) { + const NG_TEMPLATE_TAG_NAME = 'ng-template'; const templateIndex = this.allocateDataSlot(); if (this.i18n) { @@ -794,13 +794,14 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver ]; // find directives matching on a given node - this.matchDirectives('ng-template', template); + this.matchDirectives(NG_TEMPLATE_TAG_NAME, template); // prepare attributes parameter (including attributes used for directive matching) const attrsExprs: o.Expression[] = []; template.attributes.forEach( (a: t.TextAttribute) => { attrsExprs.push(asLiteral(a.name), asLiteral(a.value)); }); - attrsExprs.push(...this.prepareBindingsAttrs(template.inputs, template.outputs)); + attrsExprs.push(...this.prepareNonRenderAttrs( + template.inputs, template.outputs, undefined, template.templateAttrs)); parameters.push(this.toAttrsParam(attrsExprs)); // local refs (ex.: ) @@ -840,23 +841,19 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver // handle property bindings e.g. ɵelementProperty(1, 'ngForOf', ɵbind(ctx.items)); const context = o.variable(CONTEXT_NAME); - template.inputs.forEach(input => { - const value = input.value.visit(this._valueConverter); - this.allocateBindingSlots(value); - this.updateInstruction(templateIndex, template.sourceSpan, R3.elementProperty, () => { - return [ - o.literal(templateIndex), o.literal(input.name), - this.convertPropertyBinding(context, value) - ]; - }); - }); + this.templatePropertyBindings(template, templateIndex, context, template.templateAttrs); - // Generate listeners for directive output - template.outputs.forEach((outputAst: t.BoundEvent) => { - this.creationInstruction( - outputAst.sourceSpan, R3.listener, - this.prepareListenerParameter('ng_template', outputAst, templateIndex)); - }); + // Only add normal input/output binding instructions on explicit ng-template elements. + if (template.tagName === NG_TEMPLATE_TAG_NAME) { + // Add the input bindings + this.templatePropertyBindings(template, templateIndex, context, template.inputs); + // Generate listeners for directive output + template.outputs.forEach((outputAst: t.BoundEvent) => { + this.creationInstruction( + outputAst.sourceSpan, R3.listener, + this.prepareListenerParameter('ng_template', outputAst, templateIndex)); + }); + } } // These should be handled in the template or element directly. @@ -949,6 +946,23 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver private bindingContext() { return `${this._bindingContext++}`; } + private templatePropertyBindings( + template: t.Template, templateIndex: number, context: o.ReadVarExpr, + attrs: (t.BoundAttribute|t.TextAttribute)[]) { + attrs.forEach(input => { + if (input instanceof t.BoundAttribute) { + const value = input.value.visit(this._valueConverter); + this.allocateBindingSlots(value); + this.updateInstruction(templateIndex, template.sourceSpan, R3.elementProperty, () => { + return [ + o.literal(templateIndex), o.literal(input.name), + this.convertPropertyBinding(context, value) + ]; + }); + } + }); + } + // Bindings must only be resolved after all local refs have been visited, so all // instructions are queued in callbacks that execute once the initial pass has completed. // Otherwise, we wouldn't be able to support local refs that are defined after their @@ -1051,9 +1065,9 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver * Note that this function will fully ignore all synthetic (@foo) attribute values * because those values are intended to always be generated as property instructions. */ - private prepareBindingsAttrs( - inputs: t.BoundAttribute[], outputs: t.BoundEvent[], - styles?: StylingBuilder): o.Expression[] { + private prepareNonRenderAttrs( + inputs: t.BoundAttribute[], outputs: t.BoundEvent[], styles?: StylingBuilder, + templateAttrs: (t.BoundAttribute|t.TextAttribute)[] = []): o.Expression[] { const alreadySeen = new Set(); const attrExprs: o.Expression[] = []; @@ -1102,6 +1116,11 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } } + if (templateAttrs.length) { + attrExprs.push(o.literal(core.AttributeMarker.Template)); + templateAttrs.forEach(attr => addAttrExpr(attr.name)); + } + return attrExprs; } diff --git a/packages/compiler/src/render3/view/util.ts b/packages/compiler/src/render3/view/util.ts index 3e51ebc1bc..876284e988 100644 --- a/packages/compiler/src/render3/view/util.ts +++ b/packages/compiler/src/render3/view/util.ts @@ -173,5 +173,9 @@ export function getAttrsForDirectiveMatching(elOrTpl: t.Element | t.Template): elOrTpl.inputs.forEach(i => { attributesMap[i.name] = ''; }); elOrTpl.outputs.forEach(o => { attributesMap[o.name] = ''; }); + if (elOrTpl instanceof t.Template) { + elOrTpl.templateAttrs.forEach(a => attributesMap[a.name] = ''); + } + return attributesMap; } diff --git a/packages/compiler/test/render3/r3_template_transform_spec.ts b/packages/compiler/test/render3/r3_template_transform_spec.ts index d41d598517..4b800f6153 100644 --- a/packages/compiler/test/render3/r3_template_transform_spec.ts +++ b/packages/compiler/test/render3/r3_template_transform_spec.ts @@ -32,6 +32,8 @@ class R3AstHumanizer implements t.Visitor { this.visitAll([ template.attributes, template.inputs, + template.outputs, + template.templateAttrs, template.references, template.variables, template.children, diff --git a/packages/core/src/render3/di.ts b/packages/core/src/render3/di.ts index b75f578d9a..639ebe8b20 100644 --- a/packages/core/src/render3/di.ts +++ b/packages/core/src/render3/di.ts @@ -17,10 +17,11 @@ import {getComponentDef, getDirectiveDef, getPipeDef} from './definition'; import {NG_ELEMENT_ID} from './fields'; import {DirectiveDef} from './interfaces/definition'; import {NO_PARENT_INJECTOR, NodeInjectorFactory, PARENT_INJECTOR, RelativeInjectorLocation, RelativeInjectorLocationFlags, TNODE, isFactory} from './interfaces/injector'; -import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType, isNameOnlyAttributeMarker} from './interfaces/node'; +import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType} from './interfaces/node'; import {DECLARATION_VIEW, INJECTOR, LView, TData, TVIEW, TView, T_HOST} from './interfaces/view'; import {assertNodeOfPossibleTypes} from './node_assert'; import {getLView, getPreviousOrParentTNode, setTNodeAndViewData} from './state'; +import {isNameOnlyAttributeMarker} from './util/attrs_utils'; import {getParentInjectorIndex, getParentInjectorView, hasParentInjector} from './util/injector_utils'; import {renderStringify} from './util/misc_utils'; import {findComponentView} from './util/view_traversal_utils'; diff --git a/packages/core/src/render3/interfaces/node.ts b/packages/core/src/render3/interfaces/node.ts index 79bf033e9e..7eadf2c58c 100644 --- a/packages/core/src/render3/interfaces/node.ts +++ b/packages/core/src/render3/interfaces/node.ts @@ -149,10 +149,6 @@ export const enum AttributeMarker { Template = 4, } -export function isNameOnlyAttributeMarker(marker: string | AttributeMarker) { - return marker === AttributeMarker.Bindings || marker === AttributeMarker.Template; -} - /** * A combination of: * - attribute names and values diff --git a/packages/core/src/render3/node_selector_matcher.ts b/packages/core/src/render3/node_selector_matcher.ts index b5c63a4980..d4af2755cf 100644 --- a/packages/core/src/render3/node_selector_matcher.ts +++ b/packages/core/src/render3/node_selector_matcher.ts @@ -10,9 +10,10 @@ import '../util/ng_dev_mode'; import {assertDefined, assertNotEqual} from '../util/assert'; -import {AttributeMarker, TAttributes, TNode, TNodeType, isNameOnlyAttributeMarker, unusedValueExportToPlacateAjd as unused1} from './interfaces/node'; +import {AttributeMarker, TAttributes, TNode, TNodeType, unusedValueExportToPlacateAjd as unused1} from './interfaces/node'; import {CssSelector, CssSelectorList, NG_PROJECT_AS_ATTR_NAME, SelectorFlags, unusedValueExportToPlacateAjd as unused2} from './interfaces/projection'; import {getInitialClassNameValue} from './styling/class_and_style_bindings'; +import {isNameOnlyAttributeMarker} from './util/attrs_utils'; const unusedValueToPlacateAjd = unused1 + unused2; @@ -35,7 +36,7 @@ function isCssClassMatching(nodeClassAttrVal: string, cssClassToMatch: string): /** * Function that checks whether a given tNode matches tag-based selector and has a valid type. * - * Matching can be perfomed in 2 modes: projection mode (when we project nodes) and regular + * Matching can be performed in 2 modes: projection mode (when we project nodes) and regular * directive matching mode. In "projection" mode, we do not need to check types, so if tag name * matches selector, we declare a match. In "directive matching" mode, we also check whether tNode * is of expected type: @@ -53,8 +54,10 @@ function hasTagAndTypeMatch( /** * A utility function to match an Ivy node static data against a simple CSS selector * - * @param node static data to match - * @param selector + * @param node static data of the node to match + * @param selector The selector to try matching against the node. + * @param isProjectionMode if `true` we are matching for content projection, otherwise we are doing + * directive matching. * @returns true if node matches the selector. */ export function isNodeMatchingSelector( @@ -64,14 +67,7 @@ export function isNodeMatchingSelector( const nodeAttrs = tNode.attrs || []; // Find the index of first attribute that has no value, only a name. - let nameOnlyMarkerIdx = nodeAttrs && nodeAttrs.length; - for (let i = 0; i < nodeAttrs.length; i++) { - const nodeAttr = nodeAttrs[i]; - if (isNameOnlyAttributeMarker(nodeAttr)) { - nameOnlyMarkerIdx = i; - break; - } - } + const nameOnlyMarkerIdx = getNameOnlyMarkerIndex(nodeAttrs); // When processing ":not" selectors, we skip to the next ":not" if the // current one doesn't match @@ -114,8 +110,11 @@ export function isNodeMatchingSelector( continue; } + const isInlineTemplate = + tNode.type == TNodeType.Container && tNode.tagName !== NG_TEMPLATE_SELECTOR; const attrName = (mode & SelectorFlags.CLASS) ? 'class' : current; - const attrIndexInNode = findAttrIndexInNode(attrName, nodeAttrs); + const attrIndexInNode = + findAttrIndexInNode(attrName, nodeAttrs, isInlineTemplate, isProjectionMode); if (attrIndexInNode === -1) { if (isPositive(mode)) return false; @@ -125,12 +124,11 @@ export function isNodeMatchingSelector( if (selectorAttrValue !== '') { let nodeAttrValue: string; - const maybeAttrName = nodeAttrs[attrIndexInNode]; if (attrIndexInNode > nameOnlyMarkerIdx) { nodeAttrValue = ''; } else { ngDevMode && assertNotEqual( - maybeAttrName, AttributeMarker.NamespaceURI, + nodeAttrs[attrIndexInNode], AttributeMarker.NamespaceURI, 'We do not match directives on namespaced attributes'); nodeAttrValue = nodeAttrs[attrIndexInNode + 1] as string; } @@ -164,34 +162,64 @@ function readClassValueFromTNode(tNode: TNode): string { } /** - * Examines an attribute's definition array from a node to find the index of the - * attribute with the specified name. + * Examines the attribute's definition array for a node to find the index of the + * attribute that matches the given `name`. * - * NOTE: Will not find namespaced attributes. + * NOTE: This will not match namespaced attributes. + * + * Attribute matching depends upon `isInlineTemplate` and `isProjectionMode`. + * The following table summarizes which types of attributes we attempt to match: + * + * ========================================================================================= + * Modes | Normal Attributes | Bindings Attributes | Template Attributes + * ========================================================================================= + * Inline + Projection | YES | YES | NO + * ----------------------------------------------------------------------------------------- + * Inline + Directive | NO | NO | YES + * ----------------------------------------------------------------------------------------- + * Non-inline + Projection | YES | YES | NO + * ----------------------------------------------------------------------------------------- + * Non-inline + Directive | YES | YES | NO + * ========================================================================================= * * @param name the name of the attribute to find * @param attrs the attribute array to examine + * @param isInlineTemplate true if the node being matched is an inline template (e.g. `*ngFor`) + * rather than a manually expanded template node (e.g ``). + * @param isProjectionMode true if we are matching against content projection otherwise we are + * matching against directives. */ -function findAttrIndexInNode(name: string, attrs: TAttributes | null): number { +function findAttrIndexInNode( + name: string, attrs: TAttributes | null, isInlineTemplate: boolean, + isProjectionMode: boolean): number { if (attrs === null) return -1; - let nameOnlyMode = false; - let i = 0; - while (i < attrs.length) { - const maybeAttrName = attrs[i]; - if (maybeAttrName === name) { - return i; - } else if (maybeAttrName === AttributeMarker.NamespaceURI) { - // NOTE(benlesh): will not find namespaced attributes. This is by design. - i += 4; - } else { - if (isNameOnlyAttributeMarker(maybeAttrName)) { - nameOnlyMode = true; - } - i += nameOnlyMode ? 1 : 2; - } - } - return -1; + let i = 0; + + if (isProjectionMode || !isInlineTemplate) { + let bindingsMode = false; + while (i < attrs.length) { + const maybeAttrName = attrs[i]; + if (maybeAttrName === name) { + return i; + } else if (maybeAttrName === AttributeMarker.Bindings) { + bindingsMode = true; + } else if (maybeAttrName === AttributeMarker.Template) { + // We do not care about Template attributes in this scenario. + break; + } else if (maybeAttrName === AttributeMarker.NamespaceURI) { + // Skip the whole namespaced attribute and value. This is by design. + i += 4; + continue; + } + // In binding mode there are only names, rather than name-value pairs. + i += bindingsMode ? 1 : 2; + } + // We did not match the attribute + return -1; + } else { + return matchTemplateAttribute(attrs, name); + } } export function isNodeMatchingSelectorList( @@ -222,8 +250,8 @@ export function getProjectAsAttrValue(tNode: TNode): string|null { * Checks a given node against matching projection selectors and returns * selector index (or 0 if none matched). * - * This function takes into account the ngProjectAs attribute: if present its value will be compared - * to the raw (un-parsed) CSS selector instead of using standard selector matching logic. + * This function takes into account the ngProjectAs attribute: if present its value will be + * compared to the raw (un-parsed) CSS selector instead of using standard selector matching logic. */ export function matchingProjectionSelectorIndex( tNode: TNode, selectors: CssSelectorList[], textSelectors: string[]): number { @@ -239,3 +267,25 @@ export function matchingProjectionSelectorIndex( } return 0; } + +function getNameOnlyMarkerIndex(nodeAttrs: TAttributes) { + for (let i = 0; i < nodeAttrs.length; i++) { + const nodeAttr = nodeAttrs[i]; + if (isNameOnlyAttributeMarker(nodeAttr)) { + return i; + } + } + return nodeAttrs.length; +} + +function matchTemplateAttribute(attrs: TAttributes, name: string): number { + let i = attrs.indexOf(AttributeMarker.Template); + if (i > -1) { + i++; + while (i < attrs.length) { + if (attrs[i] === name) return i; + i++; + } + } + return -1; +} diff --git a/packages/core/src/render3/util/attrs_utils.ts b/packages/core/src/render3/util/attrs_utils.ts index f810cd6b0d..ec580a25f5 100644 --- a/packages/core/src/render3/util/attrs_utils.ts +++ b/packages/core/src/render3/util/attrs_utils.ts @@ -105,3 +105,14 @@ export function attrsStylingIndexOf(attrs: TAttributes, startIndex: number): num } return -1; } + +/** + * Test whether the given value is a marker that indicates that the following + * attribute values in a `TAttributes` array are only the names of attributes, + * and not name-value pairs. + * @param marker The attribute marker to test. + * @returns true if the marker is a "name-only" marker (e.g. `Bindings` or `Template`). + */ +export function isNameOnlyAttributeMarker(marker: string | AttributeMarker) { + return marker === AttributeMarker.Bindings || marker === AttributeMarker.Template; +} diff --git a/packages/core/test/render3/common_integration_spec.ts b/packages/core/test/render3/common_integration_spec.ts index d50d4b8acd..de1fd83e05 100644 --- a/packages/core/test/render3/common_integration_spec.ts +++ b/packages/core/test/render3/common_integration_spec.ts @@ -48,7 +48,9 @@ describe('@angular/common integration', () => { template: (rf: RenderFlags, ctx: MyApp) => { if (rf & RenderFlags.Create) { elementStart(0, 'ul'); - { template(1, liTemplate, 2, 1, 'li', ['ngForOf', '']); } + { + template(1, liTemplate, 2, 1, 'li', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -111,7 +113,9 @@ describe('@angular/common integration', () => { template: (rf: RenderFlags, ctx: MyApp) => { if (rf & RenderFlags.Create) { elementStart(0, 'ul'); - { template(1, liTemplate, 2, 3, 'li', ['ngForOf', '']); } + { + template(1, liTemplate, 2, 3, 'li', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -175,7 +179,8 @@ describe('@angular/common integration', () => { vars: 1, template: (rf: RenderFlags, ctx: MyApp) => { if (rf & RenderFlags.Create) { - template(0, ngForTemplate, 1, 0, 'comp', ['ngForOf', '']); + template( + 0, ngForTemplate, 1, 0, 'comp', [AttributeMarker.Template, 'ngFor', 'ngForOf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngForOf', bind(ctx.rows)); @@ -247,7 +252,9 @@ describe('@angular/common integration', () => { } elementEnd(); elementStart(2, 'ul'); - { template(3, liTemplate, 2, 1, 'li', ['ngForOf', '']); } + { + template(3, liTemplate, 2, 1, 'li', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -302,7 +309,9 @@ describe('@angular/common integration', () => { template: (rf: RenderFlags, ctx: MyApp) => { if (rf & RenderFlags.Create) { elementStart(0, 'ul'); - { template(1, liTemplate, 2, 1, 'li', ['ngForOf', '']); } + { + template(1, liTemplate, 2, 1, 'li', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -317,7 +326,9 @@ describe('@angular/common integration', () => { function liTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'li'); - { template(1, spanTemplate, 2, 3, 'span', ['ngForOf', '']); } + { + template(1, spanTemplate, 2, 3, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -392,7 +403,7 @@ describe('@angular/common integration', () => { vars: 1, template: (rf: RenderFlags, ctx: MyApp) => { if (rf & RenderFlags.Create) { - template(0, divTemplate, 2, 1, 'div', ['ngForOf', '']); + template(0, divTemplate, 2, 1, 'div', [AttributeMarker.Template, 'ngFor', 'ngForOf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngForOf', bind(ctx.items)); @@ -406,7 +417,7 @@ describe('@angular/common integration', () => { function divTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'div'); - { template(1, pTemplate, 3, 2, 'p', ['ngForOf', '']); } + { template(1, pTemplate, 3, 2, 'p', [AttributeMarker.Template, 'ngFor', 'ngForOf']); } elementEnd(); } if (rf & RenderFlags.Update) { @@ -486,7 +497,7 @@ describe('@angular/common integration', () => { vars: 1, template: (rf: RenderFlags, ctx: MyApp) => { if (rf & RenderFlags.Create) { - template(0, divTemplate, 2, 1, 'div', ['ngForOf', '']); + template(0, divTemplate, 2, 1, 'div', [AttributeMarker.Template, 'ngFor', 'ngForOf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngForOf', bind(ctx.items)); @@ -500,7 +511,10 @@ describe('@angular/common integration', () => { function divTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'div'); - { template(1, innerDivTemplate, 2, 1, 'div', ['ngForOf', '']); } + { + template( + 1, innerDivTemplate, 2, 1, 'div', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -512,7 +526,9 @@ describe('@angular/common integration', () => { function innerDivTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'div'); - { template(1, spanTemplate, 2, 2, 'span', ['ngForOf', '']); } + { + template(1, spanTemplate, 2, 2, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -654,7 +670,8 @@ describe('@angular/common integration', () => { vars: 1, template: (rf: RenderFlags, ctx: MyApp) => { if (rf & RenderFlags.Create) { - template(0, itemTemplate0, 2, 1, 'span', ['ngForOf', '']); + template( + 0, itemTemplate0, 2, 1, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngForOf', bind(ctx.items)); @@ -668,7 +685,10 @@ describe('@angular/common integration', () => { function itemTemplate0(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'span'); - { template(1, itemTemplate1, 2, 1, 'span', ['ngForOf', '']); } + { + template( + 1, itemTemplate1, 2, 1, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -680,7 +700,10 @@ describe('@angular/common integration', () => { function itemTemplate1(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'span'); - { template(1, itemTemplate2, 2, 1, 'span', ['ngForOf', '']); } + { + template( + 1, itemTemplate2, 2, 1, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -692,7 +715,10 @@ describe('@angular/common integration', () => { function itemTemplate2(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'span'); - { template(1, itemTemplate3, 2, 1, 'span', ['ngForOf', '']); } + { + template( + 1, itemTemplate3, 2, 1, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -704,7 +730,10 @@ describe('@angular/common integration', () => { function itemTemplate3(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'span'); - { template(1, itemTemplate4, 2, 1, 'span', ['ngForOf', '']); } + { + template( + 1, itemTemplate4, 2, 1, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -716,7 +745,10 @@ describe('@angular/common integration', () => { function itemTemplate4(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'span'); - { template(1, itemTemplate5, 2, 1, 'span', ['ngForOf', '']); } + { + template( + 1, itemTemplate5, 2, 1, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -728,7 +760,10 @@ describe('@angular/common integration', () => { function itemTemplate5(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'span'); - { template(1, itemTemplate6, 2, 1, 'span', ['ngForOf', '']); } + { + template( + 1, itemTemplate6, 2, 1, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -740,7 +775,10 @@ describe('@angular/common integration', () => { function itemTemplate6(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'span'); - { template(1, itemTemplate7, 2, 1, 'span', ['ngForOf', '']); } + { + template( + 1, itemTemplate7, 2, 1, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -752,7 +790,10 @@ describe('@angular/common integration', () => { function itemTemplate7(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'span'); - { template(1, itemTemplate8, 2, 10, 'span', ['ngForOf', '']); } + { + template( + 1, itemTemplate8, 2, 10, 'span', [AttributeMarker.Template, 'ngFor', 'ngForOf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -822,8 +863,8 @@ describe('@angular/common integration', () => { */ template: (rf: RenderFlags, ctx: MyApp) => { if (rf & RenderFlags.Create) { - template(0, templateOne, 2, 1, 'div', ['ngIf', '']); - template(1, templateTwo, 2, 1, 'div', ['ngIf', '']); + template(0, templateOne, 2, 1, 'div', [AttributeMarker.Template, 'ngIf']); + template(1, templateTwo, 2, 1, 'div', [AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.showing)); @@ -892,7 +933,7 @@ describe('@angular/common integration', () => { vars: 1, template: (rf: RenderFlags, ctx: AppComponent) => { if (rf & RenderFlags.Create) { - template(0, divTemplate, 2, 1, 'div', ['ngIf', '']); + template(0, divTemplate, 2, 1, 'div', [AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.showing)); @@ -906,7 +947,7 @@ describe('@angular/common integration', () => { function divTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'div'); - { template(1, outerDivTemplate, 2, 1, 'div', ['ngIf', '']); } + { template(1, outerDivTemplate, 2, 1, 'div', [AttributeMarker.Template, 'ngIf']); } elementEnd(); } if (rf & RenderFlags.Update) { @@ -918,7 +959,7 @@ describe('@angular/common integration', () => { function outerDivTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'div'); - { template(1, innerDivTemplate, 2, 1, 'div', ['ngIf', '']); } + { template(1, innerDivTemplate, 2, 1, 'div', [AttributeMarker.Template, 'ngIf']); } elementEnd(); } if (rf & RenderFlags.Update) { diff --git a/packages/core/test/render3/component_spec.ts b/packages/core/test/render3/component_spec.ts index 6a4064d6fc..ec3e944626 100644 --- a/packages/core/test/render3/component_spec.ts +++ b/packages/core/test/render3/component_spec.ts @@ -186,7 +186,7 @@ it('should not invoke renderer destroy method for embedded views', () => { elementStart(0, 'div'); text(1, 'Root view'); elementEnd(); - template(2, MyComponent_div_Template_2, 2, 0, null, [AttributeMarker.Bindings, 'ngIf']); + template(2, MyComponent_div_Template_2, 2, 0, 'div', [AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(2, 'ngIf', bind(ctx.visible)); @@ -514,8 +514,12 @@ describe('recursive components', () => { if (rf & RenderFlags.Create) { text(0); - template(1, IfTemplate, 1, 1, 'ng-if-tree', [AttributeMarker.Bindings, 'ngIf']); - template(2, IfTemplate2, 1, 1, 'ng-if-tree', [AttributeMarker.Bindings, 'ngIf']); + template( + 1, IfTemplate, 1, 1, 'ng-if-tree', + [AttributeMarker.Bindings, 'data', AttributeMarker.Template, 'ngIf']); + template( + 2, IfTemplate2, 1, 1, 'ng-if-tree', + [AttributeMarker.Bindings, 'data', AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { textBinding(0, bind(ctx.data.value)); diff --git a/packages/core/test/render3/content_spec.ts b/packages/core/test/render3/content_spec.ts index c2cfe38ae2..caf51bbc71 100644 --- a/packages/core/test/render3/content_spec.ts +++ b/packages/core/test/render3/content_spec.ts @@ -945,7 +945,7 @@ describe('content projection', () => { projectionDef([[['div']]], ['div']); projection(0); text(1, 'Before-'); - template(2, IfTemplate, 1, 0, '', [AttributeMarker.Bindings, 'ngIf']); + template(2, IfTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); text(3, '-After'); } if (rf & RenderFlags.Update) { @@ -1184,7 +1184,7 @@ describe('content projection', () => { const Child = createComponent('child', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { projectionDef(); - { template(0, ForTemplate, 3, 1, undefined, ['ngForOf', '']); } + { template(0, ForTemplate, 3, 1, 'div', [AttributeMarker.Template, 'ngFor', 'ngForOf']); } } if (rf & RenderFlags.Update) { elementProperty(0, 'ngForOf', bind(items)); @@ -1461,7 +1461,7 @@ describe('content projection', () => { // // - // + // // // function MyApp_ng_container_1_child_comp_1_Template(rf: RenderFlags, ctx: any) { @@ -1472,7 +1472,9 @@ describe('content projection', () => { function MyApp_ng_container_1_Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementContainerStart(0); - template(1, MyApp_ng_container_1_child_comp_1_Template, 1, 0, 'nested-comp', [3, 'ngIf']); + template( + 1, MyApp_ng_container_1_child_comp_1_Template, 1, 0, 'nested-comp', + [AttributeMarker.Template, 'ngIf']); elementContainerEnd(); } if (rf & RenderFlags.Update) { @@ -1495,7 +1497,7 @@ describe('content projection', () => { elementStart(0, 'root-comp'); template( 1, MyApp_ng_container_1_Template, 2, 1, 'ng-container', - ['ngFor', '', 3, 'ngForOf']); + [AttributeMarker.Template, 'ngFor', 'ngForOf']); elementEnd(); } if (rf & RenderFlags.Update) { @@ -2089,7 +2091,7 @@ describe('content projection', () => { const Parent = createComponent('parent', function(rf: RenderFlags, ctx: {value: any}) { if (rf & RenderFlags.Create) { elementStart(0, 'child'); - { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Bindings, 'ngIf']); } + { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Template, 'ngIf']); } elementEnd(); } if (rf & RenderFlags.Update) { diff --git a/packages/core/test/render3/di_spec.ts b/packages/core/test/render3/di_spec.ts index bbd6952bea..f972dabf03 100644 --- a/packages/core/test/render3/di_spec.ts +++ b/packages/core/test/render3/di_spec.ts @@ -490,7 +490,7 @@ describe('di', () => { const App = createComponent('app', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { elementStart(0, 'div', ['dirB', '']); - { template(1, IfTemplate, 4, 1, 'div', [AttributeMarker.Bindings, 'ngIf', '']); } + { template(1, IfTemplate, 4, 1, 'div', [AttributeMarker.Template, 'ngIf']); } elementEnd(); } if (rf & RenderFlags.Update) { @@ -1245,7 +1245,10 @@ describe('di', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'div', ['dirB', '']); - { template(1, IfTemplate, 1, 0, 'div', ['ngIf', '']); } + { + template( + 1, IfTemplate, 1, 0, 'div', ['dirA', '', AttributeMarker.Template, 'ngIf']); + } elementEnd(); } if (rf & RenderFlags.Update) { @@ -1787,7 +1790,7 @@ describe('di', () => { it('should inject current component ChangeDetectorRef into directives on the same node as components', () => { - /** {{ dir.value }} */ + /** {{ dir.value }} */ const MyApp = createComponent('my-app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { element(0, 'my-comp', ['dir', '', 'dirSame', ''], ['dir', 'dir']); @@ -1821,7 +1824,7 @@ describe('di', () => { consts: 3, vars: 1, factory: () => new MyApp(directiveInject(ChangeDetectorRef as any)), - /**
{{ dir.value }}
*/ + /**
{{ dir.value }}
*/ template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'div', ['dir', '', 'dirSame', ''], ['dir', 'dir']); @@ -1859,7 +1862,7 @@ describe('di', () => { factory: () => new MyApp(directiveInject(ChangeDetectorRef as any)), /** * - *
+ *
*
* {{ dir.value }} */ @@ -1903,7 +1906,7 @@ describe('di', () => { vars: 0, /** * % if (showing) { - *
{{ dir.value }}
+ *
{{ dir.value }}
* % } */ template: function(rf: RenderFlags, ctx: MyApp) { @@ -1967,10 +1970,15 @@ describe('di', () => { factory: () => new MyApp(directiveInject(ChangeDetectorRef as any)), consts: 1, vars: 0, - /**
{{ dir.value }}
*/ + /**
{{ dir.value }}
*/ template: function(rf: RenderFlags, ctx: MyApp) { if (rf & RenderFlags.Create) { - template(0, C1, 3, 1, 'div', ['ngIf', 'showing']); + template( + 0, C1, 3, 1, 'div', + ['dir', '', 'dirSame', '', AttributeMarker.Template, 'ngIf']); + } + if (rf & RenderFlags.Update) { + elementProperty(0, 'ngIf', bind(ctx.showing)); } }, directives: directives diff --git a/packages/core/test/render3/directive_spec.ts b/packages/core/test/render3/directive_spec.ts index 045bbcf373..ab65c7828f 100644 --- a/packages/core/test/render3/directive_spec.ts +++ b/packages/core/test/render3/directive_spec.ts @@ -208,7 +208,7 @@ describe('directive', () => { if (rf & RenderFlags.Create) { template( 0, MyComponent_ng_container_Template_0, 2, 0, 'ng-container', - [AttributeMarker.Bindings, 'ngIf']); + ['directiveA', '', AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.visible)); diff --git a/packages/core/test/render3/discovery_utils_spec.ts b/packages/core/test/render3/discovery_utils_spec.ts index 1a9a2a8637..52b16866d5 100644 --- a/packages/core/test/render3/discovery_utils_spec.ts +++ b/packages/core/test/render3/discovery_utils_spec.ts @@ -7,7 +7,7 @@ */ import {StaticInjector} from '../../src/di/injector'; import {createInjector} from '../../src/di/r3_injector'; -import {ProvidersFeature, RenderFlags, defineComponent, defineDirective, elementContainerEnd, elementContainerStart, getHostElement, i18n, i18nApply, i18nExp} from '../../src/render3/index'; +import {AttributeMarker, ProvidersFeature, RenderFlags, defineComponent, defineDirective, elementContainerEnd, elementContainerStart, getHostElement, i18n, i18nApply, i18nExp} from '../../src/render3/index'; import {getComponent, getContext, getDirectives, getInjectionTokens, getInjector, getListeners, getLocalRefs, getRootComponents, getViewComponent, loadLContext} from '../../src/render3/util/discovery_utils'; import {element, elementEnd, elementStart, elementStyling, elementStylingApply, template, bind, elementProperty, text, textBinding, markDirty, listener} from '../../src/render3/instructions'; @@ -122,7 +122,7 @@ describe('discovery utils', () => { if (rf & RenderFlags.Create) { element(0, 'child'); } - }, 1, 0, 'child', ['ngIf', '']); + }, 1, 0, 'child', ['dirA', AttributeMarker.Template, 'ngIf']); elementStart(9, 'i18n'); i18n(10, MSG_DIV); elementEnd(); diff --git a/packages/core/test/render3/exports_spec.ts b/packages/core/test/render3/exports_spec.ts index 4e3b8d0ff9..01188cf90e 100644 --- a/packages/core/test/render3/exports_spec.ts +++ b/packages/core/test/render3/exports_spec.ts @@ -232,7 +232,7 @@ describe('exports', () => { if (rf & RenderFlags.Create) { elementStart(0, 'input', ['value', 'one'], ['outerInput', '']); elementEnd(); - template(2, outerTemplate, 5, 2, 'div', [AttributeMarker.Bindings, 'ngIf']); + template(2, outerTemplate, 5, 2, 'div', [AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(2, 'ngIf', bind(app.outer)); @@ -246,7 +246,7 @@ describe('exports', () => { text(1); elementStart(2, 'input', ['value', 'two'], ['innerInput', '']); elementEnd(); - template(4, innerTemplate, 2, 2, 'div', [AttributeMarker.Bindings, 'ngIf']); + template(4, innerTemplate, 2, 2, 'div', [AttributeMarker.Template, 'ngIf']); } elementEnd(); } diff --git a/packages/core/test/render3/host_binding_spec.ts b/packages/core/test/render3/host_binding_spec.ts index 9bb9813c05..e74b9630fa 100644 --- a/packages/core/test/render3/host_binding_spec.ts +++ b/packages/core/test/render3/host_binding_spec.ts @@ -506,7 +506,7 @@ describe('host bindings', () => { */ const App = createComponent('parent', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - template(0, NgForTemplate, 2, 0, 'div', ['ngForOf', '']); + template(0, NgForTemplate, 2, 0, 'div', [AttributeMarker.Template, 'ngFor', 'ngForOf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngForOf', bind(ctx.rows)); diff --git a/packages/core/test/render3/i18n_spec.ts b/packages/core/test/render3/i18n_spec.ts index 2a43416bbc..a23584352e 100644 --- a/packages/core/test/render3/i18n_spec.ts +++ b/packages/core/test/render3/i18n_spec.ts @@ -603,7 +603,7 @@ describe('Runtime i18n', () => { if (rf & RenderFlags.Create) { i18nStart(0, MSG_DIV, 1); elementStart(1, 'div'); - template(2, subTemplate_2, 2, 0, 'span', ['ngIf', '']); + template(2, subTemplate_2, 2, 0, 'span', [AttributeMarker.Template, 'ngIf']); elementEnd(); i18nEnd(); } @@ -632,7 +632,7 @@ describe('Runtime i18n', () => { if (rf & RenderFlags.Create) { elementStart(0, 'div'); i18nStart(1, MSG_DIV); - template(2, subTemplate_1, 3, 1, 'div', ['ngIf', '']); + template(2, subTemplate_1, 3, 1, 'div', [AttributeMarker.Template, 'ngIf']); i18nEnd(); elementEnd(); } @@ -739,7 +739,7 @@ describe('Runtime i18n', () => { if (rf & RenderFlags.Create) { elementStart(0, 'div'); i18nStart(1, MSG_DIV); - template(2, subTemplate_1, 2, 2, 'span', [3, 'ngIf']); + template(2, subTemplate_1, 2, 2, 'span', [AttributeMarker.Template, 'ngIf']); i18nEnd(); elementEnd(); } diff --git a/packages/core/test/render3/instructions_spec.ts b/packages/core/test/render3/instructions_spec.ts index f69ec88ee5..577c6e4748 100644 --- a/packages/core/test/render3/instructions_spec.ts +++ b/packages/core/test/render3/instructions_spec.ts @@ -304,12 +304,13 @@ describe('instructions', () => { describe('performance counters', () => { it('should create tViews only once for each nested level', () => { - const _c0 = ['ngFor', '', 'ngForOf', '']; + const _c0 = [AttributeMarker.Template, 'ngFor', 'ngForOf']; + const _c1 = [AttributeMarker.Template, 'ngFor', 'ngForOf']; function ToDoAppComponent_NgForOf_Template_0(rf: RenderFlags, ctx0: NgForOfContext) { if (rf & RenderFlags.Create) { elementStart(0, 'ul'); - template(1, ToDoAppComponent_NgForOf_NgForOf_Template_1, 2, 1, 'li', _c0); + template(1, ToDoAppComponent_NgForOf_NgForOf_Template_1, 2, 1, 'li', _c1); elementEnd(); } if (rf & RenderFlags.Update) { diff --git a/packages/core/test/render3/integration_spec.ts b/packages/core/test/render3/integration_spec.ts index 6e825ebd0f..bf09baa1a2 100644 --- a/packages/core/test/render3/integration_spec.ts +++ b/packages/core/test/render3/integration_spec.ts @@ -721,8 +721,7 @@ describe('render3 integration test', () => { const TestCmpt = createComponent('test-cmpt', function(rf: RenderFlags, ctx: {value: any}) { if (rf & RenderFlags.Create) { - template( - 0, ngIfTemplate, 2, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); + template(0, ngIfTemplate, 2, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.value)); diff --git a/packages/core/test/render3/lifecycle_spec.ts b/packages/core/test/render3/lifecycle_spec.ts index eb9c497948..980195ba87 100644 --- a/packages/core/test/render3/lifecycle_spec.ts +++ b/packages/core/test/render3/lifecycle_spec.ts @@ -198,7 +198,7 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, IfTemplate, 1, 0, 'comp', ['ngIf', '']); + template(0, IfTemplate, 1, 0, 'comp', [AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.showing)); @@ -2969,8 +2969,7 @@ describe('lifecycles', () => { function conditionTpl(rf: RenderFlags, ctx: Cmpt) { if (rf & RenderFlags.Create) { - template( - 0, null, 0, 1, 'ng-template', [AttributeMarker.Bindings, 'onDestroyDirective']); + template(0, null, 0, 1, 'ng-template', [AttributeMarker.Bindings, 'onDestroyDirective']); } } diff --git a/packages/core/test/render3/pure_function_spec.ts b/packages/core/test/render3/pure_function_spec.ts index 73e3566d6b..61499cc15f 100644 --- a/packages/core/test/render3/pure_function_spec.ts +++ b/packages/core/test/render3/pure_function_spec.ts @@ -87,7 +87,9 @@ describe('array literals', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, IfTemplate, 1, 3, 'my-comp', [AttributeMarker.Bindings, 'ngIf']); + template( + 0, IfTemplate, 1, 3, 'my-comp', + [AttributeMarker.Bindings, 'names', AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.showing)); diff --git a/packages/core/test/render3/query_spec.ts b/packages/core/test/render3/query_spec.ts index eccb58954e..46c20f5376 100644 --- a/packages/core/test/render3/query_spec.ts +++ b/packages/core/test/render3/query_spec.ts @@ -1392,7 +1392,8 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, Cmpt_Template_1, 2, 0, 'ng-template', ['ngIf', '']); + template( + 0, Cmpt_Template_1, 2, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { elementProperty(0, 'ngIf', bind(ctx.value)); @@ -2207,7 +2208,7 @@ describe('query', () => { function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { template( - 0, AppComponent_Template_1, 1, 0, 'div', [AttributeMarker.Bindings, 'someDir']); + 0, AppComponent_Template_1, 1, 0, 'div', [AttributeMarker.Template, 'someDir']); element(1, 'div', null, ['foo', '']); } }, @@ -2392,7 +2393,7 @@ describe('query', () => { const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { elementStart(0, 'shallow-comp'); - { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Bindings, 'ngIf', '']); } + { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Template, 'ngIf', '']); } elementEnd(); } if (rf & RenderFlags.Update) { From 809452b921d1d32b46eb0841bd699c39e154ba63 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Thu, 7 Mar 2019 08:31:31 +0000 Subject: [PATCH 0262/1073] test(ivy): add tests for projection on inline-templates (#29041) PR Close #29041 --- packages/core/test/acceptance/content_spec.ts | 113 +++++++++++++++++- 1 file changed, 112 insertions(+), 1 deletion(-) diff --git a/packages/core/test/acceptance/content_spec.ts b/packages/core/test/acceptance/content_spec.ts index da7853c9d1..12898d4a71 100644 --- a/packages/core/test/acceptance/content_spec.ts +++ b/packages/core/test/acceptance/content_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component} from '@angular/core'; +import {Component, Directive} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; @@ -56,4 +56,115 @@ describe('projection', () => { fixture.detectChanges(); expect(fixture.nativeElement).toHaveText('6|7|8|'); }); + + describe('on inline templates (e.g. *ngIf)', () => { + it('should work when matching the element name', () => { + let divDirectives = 0; + @Component({selector: 'selector-proj', template: ''}) + class SelectedNgContentComp { + } + + @Directive({selector: 'div'}) + class DivDirective { + constructor() { divDirectives++; } + } + + @Component({ + selector: 'main-selector', + template: '
Hello world!
' + }) + class SelectorMainComp { + } + + TestBed.configureTestingModule( + {declarations: [DivDirective, SelectedNgContentComp, SelectorMainComp]}); + const fixture = TestBed.createComponent(SelectorMainComp); + + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('Hello world!'); + expect(divDirectives).toEqual(1); + }); + + it('should work when matching attributes', () => { + let xDirectives = 0; + @Component({selector: 'selector-proj', template: ''}) + class SelectedNgContentComp { + } + + @Directive({selector: '[x]'}) + class XDirective { + constructor() { xDirectives++; } + } + + @Component({ + selector: 'main-selector', + template: '
Hello world!
' + }) + class SelectorMainComp { + } + + TestBed.configureTestingModule( + {declarations: [XDirective, SelectedNgContentComp, SelectorMainComp]}); + const fixture = TestBed.createComponent(SelectorMainComp); + + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('Hello world!'); + expect(xDirectives).toEqual(1); + }); + + it('should work when matching classes', () => { + let xDirectives = 0; + @Component({selector: 'selector-proj', template: ''}) + class SelectedNgContentComp { + } + + @Directive({selector: '.x'}) + class XDirective { + constructor() { xDirectives++; } + } + + @Component({ + selector: 'main-selector', + template: '
Hello world!
' + }) + class SelectorMainComp { + } + + TestBed.configureTestingModule( + {declarations: [XDirective, SelectedNgContentComp, SelectorMainComp]}); + const fixture = TestBed.createComponent(SelectorMainComp); + + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('Hello world!'); + expect(xDirectives).toEqual(1); + }); + + it('should ignore synthesized attributes (e.g. ngTrackBy)', () => { + @Component( + {selector: 'selector-proj', template: ''}) + class SelectedNgContentComp { + } + + @Component({ + selector: 'main-selector', + template: + 'inline(
{{item.name}}
)' + + 'ng-template(
{{item.name}}
)' + }) + class SelectorMainComp { + items = [ + {id: 1, name: 'one'}, + {id: 2, name: 'two'}, + {id: 3, name: 'three'}, + ]; + getItemId(item: {id: number}) { return item.id; } + } + + TestBed.configureTestingModule({declarations: [SelectedNgContentComp, SelectorMainComp]}); + const fixture = TestBed.createComponent(SelectorMainComp); + + fixture.detectChanges(); + expect(fixture.nativeElement).toHaveText('inline()ng-template(onetwothree)'); + }); + }); }); \ No newline at end of file From 5ad2097be857dd037706a83c44016346237f4d59 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Thu, 7 Mar 2019 08:31:31 +0000 Subject: [PATCH 0263/1073] fix(ivy): teach template type checker about template attributes (#29041) For the template type checking to work correctly, it needs to know what attributes are bound to expressions or directives, which may require expressions in the template to be evaluated in a different scope. In inline templates, there are attributes that are now marked as "Template" attributes. We need to ensure that the template type checking code looks at these "bound" attributes as well as the "input" attributes. PR Close #29041 --- .../ngtsc/typecheck/src/type_check_block.ts | 47 ++++++++++++------- packages/compiler/src/render3/r3_ast.ts | 2 +- .../compiler/src/render3/view/t2_binder.ts | 41 ++++++++-------- 3 files changed, 50 insertions(+), 40 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts index 3dfcc90f13..a928f16898 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {AST, BindingType, BoundTarget, ImplicitReceiver, PropertyRead, TmplAstBoundText, TmplAstElement, TmplAstNode, TmplAstTemplate, TmplAstVariable} from '@angular/compiler'; +import {AST, BindingType, BoundTarget, ImplicitReceiver, PropertyRead, TmplAstBoundAttribute, TmplAstBoundText, TmplAstElement, TmplAstNode, TmplAstTemplate, TmplAstTextAttribute, TmplAstVariable} from '@angular/compiler'; import * as ts from 'typescript'; import {Reference, ReferenceEmitter} from '../../imports'; @@ -16,6 +16,7 @@ import {TypeCheckBlockMetadata, TypeCheckableDirectiveMeta} from './api'; import {astToTypescript} from './expression'; + /** * Given a `ts.ClassDeclaration` for a component, and metadata regarding that component, compose a * "type check block" function. @@ -430,7 +431,10 @@ function tcbProcessTemplateDeclaration(tmpl: TmplAstTemplate, tcb: Context, scop // any template guards, and generate them if needed. dir.ngTemplateGuards.forEach(inputName => { // For each template guard function on the directive, look for a binding to that input. - const boundInput = tmpl.inputs.find(i => i.name === inputName); + const boundInput = tmpl.inputs.find(i => i.name === inputName) || + tmpl.templateAttrs.find( + (i: TmplAstTextAttribute | TmplAstBoundAttribute): i is TmplAstBoundAttribute => + i instanceof TmplAstBoundAttribute && i.name === inputName); if (boundInput !== undefined) { // If there is such a binding, generate an expression for it. const expr = tcbExpression(boundInput.value, tcb, scope); @@ -524,20 +528,28 @@ function tcbGetInputBindingExpressions( propMatch.set(inputs[key] as string, key); }); - // Add a binding expression to the map for each input of the directive that has a - // matching binding. - el.inputs.filter(input => propMatch.has(input.name)).forEach(input => { - // Produce an expression representing the value of the binding. - const expr = tcbExpression(input.value, tcb, scope); - - // Call the callback. - bindings.push({ - property: input.name, - field: propMatch.get(input.name) !, - expression: expr, - }); - }); + el.inputs.forEach(processAttribute); + if (el instanceof TmplAstTemplate) { + el.templateAttrs.forEach(processAttribute); + } return bindings; + + /** + * Add a binding expression to the map for each input/template attribute of the directive that has + * a matching binding. + */ + function processAttribute(attr: TmplAstBoundAttribute | TmplAstTextAttribute): void { + if (attr instanceof TmplAstBoundAttribute && propMatch.has(attr.name)) { + // Produce an expression representing the value of the binding. + const expr = tcbExpression(attr.value, tcb, scope); + // Call the callback. + bindings.push({ + property: attr.name, + field: propMatch.get(attr.name) !, + expression: expr, + }); + } + } } /** @@ -633,6 +645,7 @@ function tcbResolve(ast: AST, tcb: Context, scope: Scope): ts.Expression|null { } else if (ast instanceof ImplicitReceiver) { // AST instances representing variables and references look very similar to property reads from // the component context: both have the shape PropertyRead(ImplicitReceiver, 'propertyName'). + // // `tcbExpression` will first try to `tcbResolve` the outer PropertyRead. If this works, it's // because the `BoundTarget` found an expression target for the whole expression, and therefore // `tcbExpression` will never attempt to `tcbResolve` the ImplicitReceiver of that PropertyRead. @@ -662,8 +675,8 @@ function tcbResolveVariable(binding: TmplAstVariable, tcb: Context, scope: Scope if (tmpl === null) { throw new Error(`Expected TmplAstVariable to be mapped to a TmplAstTemplate`); } - // Look for a context variable for the template. This should've been declared before anything - // that could reference the template's variables. + // Look for a context variable for the template. This should've been declared before anything that + // could reference the template's variables. const ctx = scope.getTemplateCtx(tmpl); if (ctx === null) { throw new Error('Expected template context to exist.'); diff --git a/packages/compiler/src/render3/r3_ast.ts b/packages/compiler/src/render3/r3_ast.ts index e51bd6ff89..a5a3c17f6b 100644 --- a/packages/compiler/src/render3/r3_ast.ts +++ b/packages/compiler/src/render3/r3_ast.ts @@ -246,4 +246,4 @@ export function transformAll( changed = changed || newNode != node; } return changed ? result : nodes; -} \ No newline at end of file +} diff --git a/packages/compiler/src/render3/view/t2_binder.ts b/packages/compiler/src/render3/view/t2_binder.ts index fdab572717..d67b353551 100644 --- a/packages/compiler/src/render3/view/t2_binder.ts +++ b/packages/compiler/src/render3/view/t2_binder.ts @@ -282,27 +282,21 @@ class DirectiveBinder implements Visitor { } }); - // Associate bindings on the node with directives or with the node itself. - - // Inputs: - [...node.attributes, ...node.inputs].forEach(binding => { - let dir = directives.find(dir => dir.inputs.hasOwnProperty(binding.name)); + // Associate attributes/bindings on the node with directives or with the node itself. + const processAttribute = (attribute: BoundAttribute | BoundEvent | TextAttribute) => { + let dir = directives.find(dir => dir.inputs.hasOwnProperty(attribute.name)); if (dir !== undefined) { - this.bindings.set(binding, dir); + this.bindings.set(attribute, dir); } else { - this.bindings.set(binding, node); + this.bindings.set(attribute, node); } - }); - - // Outputs: - node.outputs.forEach(binding => { - let dir = directives.find(dir => dir.outputs.hasOwnProperty(binding.name)); - if (dir !== undefined) { - this.bindings.set(binding, dir); - } else { - this.bindings.set(binding, node); - } - }); + }; + node.attributes.forEach(processAttribute); + node.inputs.forEach(processAttribute); + node.outputs.forEach(processAttribute); + if (node instanceof Template) { + node.templateAttrs.forEach(processAttribute); + } // Recurse into the node's children. node.children.forEach(child => child.visit(this)); @@ -378,10 +372,12 @@ class TemplateBinder extends RecursiveAstVisitor implements Visitor { private ingest(template: Template|Node[]): void { if (template instanceof Template) { - // For s, process inputs, outputs, variables, and child nodes. References were - // processed in the scope of the containing template. + // For s, process inputs, outputs, template attributes, + // variables, and child nodes. + // References were processed in the scope of the containing template. template.inputs.forEach(this.visitNode); template.outputs.forEach(this.visitNode); + template.templateAttrs.forEach(this.visitNode); template.variables.forEach(this.visitNode); template.children.forEach(this.visitNode); @@ -394,16 +390,17 @@ class TemplateBinder extends RecursiveAstVisitor implements Visitor { } visitElement(element: Element) { - // Vist the inputs, outputs, and children of the element. + // Visit the inputs, outputs, and children of the element. element.inputs.forEach(this.visitNode); element.outputs.forEach(this.visitNode); element.children.forEach(this.visitNode); } visitTemplate(template: Template) { - // First, visit the inputs, outputs of the template node. + // First, visit inputs, outputs and template attributes of the template node. template.inputs.forEach(this.visitNode); template.outputs.forEach(this.visitNode); + template.templateAttrs.forEach(this.visitNode); // References are also evaluated in the outer context. template.references.forEach(this.visitNode); From 36a1550e0032f8dc5195e97f01a157d7382fa9f1 Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Thu, 7 Mar 2019 11:13:10 -0800 Subject: [PATCH 0264/1073] feat(bazel): Eject Bazel (#29167) Add command line flag to expose Bazel files on disk. `ng build --leaveBazelFilesOnDisk` PR Close #29167 --- packages/bazel/src/builders/index.ts | 6 ++- packages/bazel/src/builders/schema.d.ts | 13 ++++++ packages/bazel/src/builders/schema.json | 59 ++++++++++++++----------- 3 files changed, 50 insertions(+), 28 deletions(-) diff --git a/packages/bazel/src/builders/index.ts b/packages/bazel/src/builders/index.ts index 6df7a4a4ca..814dfdd3c0 100644 --- a/packages/bazel/src/builders/index.ts +++ b/packages/bazel/src/builders/index.ts @@ -20,7 +20,7 @@ class BazelBuilder implements Builder { run(config: BuilderConfiguration>): Observable { const {host, logger, workspace} = this.context; const root: Path = workspace.root; - const {bazelCommand, targetLabel, watch} = config.options as Schema; + const {bazelCommand, leaveBazelFilesOnDisk, targetLabel, watch} = config.options as Schema; const executable = watch ? 'ibazel' : 'bazel'; const binary = checkInstallation(executable, root) as Path; @@ -35,7 +35,9 @@ class BazelBuilder implements Builder { logger.error(err.message); return {success: false}; } finally { - await deleteBazelFiles(host, bazelFiles); // this will never throw + if (!leaveBazelFilesOnDisk) { + await deleteBazelFiles(host, bazelFiles); // this will never throw + } } })); } diff --git a/packages/bazel/src/builders/schema.d.ts b/packages/bazel/src/builders/schema.d.ts index 79426a2eed..dbcf8d8da9 100644 --- a/packages/bazel/src/builders/schema.d.ts +++ b/packages/bazel/src/builders/schema.d.ts @@ -9,14 +9,27 @@ * Options for Bazel Builder */ export interface Schema { + /** + * Common commands supported by Bazel. + */ bazelCommand: BazelCommand; + /** + * If true, leave Bazel files on disk after running command. + */ + leaveBazelFilesOnDisk?: boolean; /** * Target to be executed under Bazel. */ targetLabel: string; + /** + * If true, watch the filesystem using ibazel. + */ watch?: boolean; } +/** + * Common commands supported by Bazel. + */ export enum BazelCommand { Build = 'build', Run = 'run', diff --git a/packages/bazel/src/builders/schema.json b/packages/bazel/src/builders/schema.json index 22bdfa55a9..694f45617c 100644 --- a/packages/bazel/src/builders/schema.json +++ b/packages/bazel/src/builders/schema.json @@ -1,29 +1,36 @@ { - "$schema": "http://json-schema.org/schema", - "title": "Bazel builder schema", - "description": "Options for Bazel Builder", - "type": "object", - "properties": { - "targetLabel": { - "type": "string", - "description": "Target to be executed under Bazel." - }, - "bazelCommand": { - "type": "string", - "enum": [ - "run", - "build", - "test" - ] - }, - "watch": { - "type": "boolean", - "default": false - } + "$schema": "http://json-schema.org/schema", + "title": "Bazel builder schema", + "description": "Options for Bazel Builder", + "type": "object", + "properties": { + "targetLabel": { + "type": "string", + "description": "Target to be executed under Bazel." }, - "additionalProperties": false, - "required": [ - "targetLabel", - "bazelCommand" - ] + "bazelCommand": { + "type": "string", + "description": "Common commands supported by Bazel.", + "enum": [ + "run", + "build", + "test" + ] + }, + "watch": { + "type": "boolean", + "description": "If true, watch the filesystem using ibazel.", + "default": false + }, + "leaveBazelFilesOnDisk": { + "type": "boolean", + "description": "If true, leave Bazel files on disk after running command.", + "default": false + } + }, + "additionalProperties": false, + "required": [ + "targetLabel", + "bazelCommand" + ] } From f4f20daee3040f13f7bcec98945323a4fc86e3db Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Wed, 6 Mar 2019 17:50:57 -0800 Subject: [PATCH 0265/1073] refactor(bazel): Remove bazel-workspace schematics (#29148) `bazel-workspace` schematics is no longer needed now that the Bazel files are injected into the project by the Bazel builder. PR Close #29148 --- integration/bazel-schematics/test.sh | 4 + integration/bazel-schematics/yarn.lock | 34 +++- package.json | 4 +- packages/bazel/BUILD.bazel | 1 - packages/bazel/package.json | 2 +- packages/bazel/src/schematics/BUILD.bazel | 1 - .../schematics/bazel-workspace/BUILD.bazel | 34 ---- .../files/BUILD.bazel.template | 7 - .../bazel-workspace/files/WORKSPACE.template | 63 -------- .../files/__dot__bazelignore.template | 2 - .../files/__dot__bazelrc.template | 29 ---- .../files/e2e/BUILD.bazel.template | 50 ------ .../files/src/BUILD.bazel.template | 153 ------------------ .../src/schematics/bazel-workspace/index.ts | 76 --------- .../schematics/bazel-workspace/index_spec.ts | 120 -------------- .../schematics/bazel-workspace/schema.d.ts | 13 -- .../schematics/bazel-workspace/schema.json | 19 --- packages/bazel/src/schematics/collection.json | 6 - .../bazel/src/schematics/ng-add/BUILD.bazel | 1 - .../angular-metadata.tsconfig.json.template | 0 .../e2e/protractor.on-prepare.js.template | 0 .../files/src/initialize_testbed.ts.template | 0 .../files/{ => src}/main.dev.ts.template | 0 .../files/{ => src}/main.prod.ts.template | 0 .../files/src/rxjs_shims.js.template | 0 packages/bazel/src/schematics/ng-add/index.ts | 18 +-- .../bazel/src/schematics/ng-add/index_spec.ts | 116 ++++++------- .../bazel/src/schematics/ng-new/index_spec.ts | 7 +- yarn.lock | 30 +++- 29 files changed, 127 insertions(+), 663 deletions(-) delete mode 100644 packages/bazel/src/schematics/bazel-workspace/BUILD.bazel delete mode 100644 packages/bazel/src/schematics/bazel-workspace/files/BUILD.bazel.template delete mode 100644 packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template delete mode 100644 packages/bazel/src/schematics/bazel-workspace/files/__dot__bazelignore.template delete mode 100644 packages/bazel/src/schematics/bazel-workspace/files/__dot__bazelrc.template delete mode 100644 packages/bazel/src/schematics/bazel-workspace/files/e2e/BUILD.bazel.template delete mode 100644 packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template delete mode 100644 packages/bazel/src/schematics/bazel-workspace/index.ts delete mode 100644 packages/bazel/src/schematics/bazel-workspace/index_spec.ts delete mode 100644 packages/bazel/src/schematics/bazel-workspace/schema.d.ts delete mode 100644 packages/bazel/src/schematics/bazel-workspace/schema.json rename packages/bazel/src/schematics/{bazel-workspace => ng-add}/files/angular-metadata.tsconfig.json.template (100%) rename packages/bazel/src/schematics/{bazel-workspace => ng-add}/files/e2e/protractor.on-prepare.js.template (100%) rename packages/bazel/src/schematics/{bazel-workspace => ng-add}/files/src/initialize_testbed.ts.template (100%) rename packages/bazel/src/schematics/ng-add/files/{ => src}/main.dev.ts.template (100%) rename packages/bazel/src/schematics/ng-add/files/{ => src}/main.prod.ts.template (100%) rename packages/bazel/src/schematics/{bazel-workspace => ng-add}/files/src/rxjs_shims.js.template (100%) diff --git a/integration/bazel-schematics/test.sh b/integration/bazel-schematics/test.sh index 12485d5fb0..d61b582a51 100755 --- a/integration/bazel-schematics/test.sh +++ b/integration/bazel-schematics/test.sh @@ -32,6 +32,10 @@ function testBazel() { ng build ng test ng e2e + if [ -e 'WORKSPACE' ] || [ -e 'BUILD.bazel' ]; then + echo 'WORKSPACE / BUILD.bazel file should not exist in project' + exit 1 + fi } function testNonBazel() { diff --git a/integration/bazel-schematics/yarn.lock b/integration/bazel-schematics/yarn.lock index b6b57e7865..65378ca9ca 100644 --- a/integration/bazel-schematics/yarn.lock +++ b/integration/bazel-schematics/yarn.lock @@ -40,6 +40,17 @@ rxjs "6.3.3" source-map "0.7.3" +"@angular-devkit/core@7.3.5": + version "7.3.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.5.tgz#2a59a913eab358e2385f52ba28132b81435e63b3" + integrity sha512-J/Tztq2BZ3tpwUsbiz8N61rf9lwqn85UvJsDui2SPIdzDR9KmPr5ESI2Irc/PEb9i+CBXtVuhr8AIqo7rR6ZTg== + dependencies: + ajv "6.9.1" + chokidar "2.0.4" + fast-json-stable-stringify "2.0.0" + rxjs "6.3.3" + source-map "0.7.3" + "@angular-devkit/schematics@7.3.2", "@angular-devkit/schematics@^7.3.0-rc.0": version "7.3.2" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.2.tgz#e9d3c1f2128a56f66ea846ce3f80c69d4c3a9ae9" @@ -48,15 +59,23 @@ "@angular-devkit/core" "7.3.2" rxjs "6.3.3" +"@angular-devkit/schematics@7.3.5": + version "7.3.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.5.tgz#7b007f8a86dea76e93eef007d4fb6e7d8324b7bb" + integrity sha512-BFCCkwRMBC4aFlngaloi1avCTgGrl1MFc/0Av2sCpBh/fdm1FqSVzmOiTfu93dehRVVL/bTrA2qj+xpNsXCxzA== + dependencies: + "@angular-devkit/core" "7.3.5" + rxjs "6.3.3" + "@angular/bazel@file:../../dist/packages-dist/bazel": - version "8.0.0-beta.6" + version "8.0.0-beta.7" dependencies: "@angular-devkit/architect" "^0.13.4" "@angular-devkit/core" "^7.0.4" "@angular-devkit/schematics" "^7.3.0-rc.0" "@bazel/typescript" "^0.26.0" "@microsoft/api-extractor" "^7.0.21" - "@schematics/angular" "^7.0.4" + "@schematics/angular" "^7.3.5" "@types/node" "6.0.84" semver "^5.6.0" shelljs "0.8.2" @@ -158,7 +177,7 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.7.tgz#8fb4a9f4fdf01f1469c9fc54b0ad2d36ec57c25d" integrity sha512-0bqNlQT8aR4Iq9xx/OsY579Zeqon9uTZDIuvl+XXu16TPPN2sASeKojwm366jA2MjgXd9iyTWpJM5/P1QJ4Dxg== -"@schematics/angular@7.3.2", "@schematics/angular@^7.0.4": +"@schematics/angular@7.3.2": version "7.3.2" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.2.tgz#470f972a9d80ab8af9900e33972bce44aa567718" integrity sha512-ClqG1qA919QqsikIXIP/jKl2Boj70lihCbpXhZgjsahLY8UJgq9oh8K1QuvYJtz4AI4GADfG1fGzPdYfy94+kg== @@ -167,6 +186,15 @@ "@angular-devkit/schematics" "7.3.2" typescript "3.2.4" +"@schematics/angular@^7.3.5": + version "7.3.5" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.5.tgz#7af1cd446b051b2be3fbe59cb4ba140ec06e2d87" + integrity sha512-fKNZccf1l2OcDwtDupYj54N/YuiMLCWeaXNxcJNUYvGnBtzxQJ4P2LtSCjB4HDvYCtseQM7iyc7D1Xrr5gI8nw== + dependencies: + "@angular-devkit/core" "7.3.5" + "@angular-devkit/schematics" "7.3.5" + typescript "3.2.4" + "@schematics/update@0.13.2": version "0.13.2" resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.13.2.tgz#14ba82076b435814896ac141ba4dfad0dd3dadcd" diff --git a/package.json b/package.json index 3053a1c2bb..a28da5f656 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "@bazel/karma": "0.26.0", "@bazel/typescript": "0.26.0", "@microsoft/api-extractor": "^7.0.21", - "@schematics/angular": "^7.3.2", + "@schematics/angular": "^7.3.5", "@types/angular": "^1.6.47", "@types/base64-js": "1.2.5", "@types/chokidar": "^1.7.5", @@ -157,4 +157,4 @@ "resolutions": { "natives": "1.1.6" } -} \ No newline at end of file +} diff --git a/packages/bazel/BUILD.bazel b/packages/bazel/BUILD.bazel index 1b7410dbb8..5deeaae06f 100644 --- a/packages/bazel/BUILD.bazel +++ b/packages/bazel/BUILD.bazel @@ -33,7 +33,6 @@ npm_package( "//packages/bazel/src/ng_package:lib", "//packages/bazel/src/ngc-wrapped:ngc_lib", "//packages/bazel/src/protractor/utils", - "//packages/bazel/src/schematics/bazel-workspace", "//packages/bazel/src/schematics/ng-add", "//packages/bazel/src/schematics/ng-new", ], diff --git a/packages/bazel/package.json b/packages/bazel/package.json index 67c794cb93..038687cc18 100644 --- a/packages/bazel/package.json +++ b/packages/bazel/package.json @@ -23,7 +23,7 @@ "@angular-devkit/schematics": "^7.3.0-rc.0", "@bazel/typescript": "^0.26.0", "@microsoft/api-extractor": "^7.0.21", - "@schematics/angular": "^7.0.4", + "@schematics/angular": "^7.3.5", "@types/node": "6.0.84", "semver": "^5.6.0", "shelljs": "0.8.2", diff --git a/packages/bazel/src/schematics/BUILD.bazel b/packages/bazel/src/schematics/BUILD.bazel index 16e9cf968e..a51a76767d 100644 --- a/packages/bazel/src/schematics/BUILD.bazel +++ b/packages/bazel/src/schematics/BUILD.bazel @@ -14,7 +14,6 @@ jasmine_node_test( name = "test", bootstrap = ["angular/tools/testing/init_node_spec.js"], deps = [ - "//packages/bazel/src/schematics/bazel-workspace:test", "//packages/bazel/src/schematics/ng-add:test", "//packages/bazel/src/schematics/ng-new:test", "//packages/bazel/src/schematics/utility:test", diff --git a/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel b/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel deleted file mode 100644 index a59b2da406..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/BUILD.bazel +++ /dev/null @@ -1,34 +0,0 @@ -load("//tools:defaults.bzl", "ts_library") - -package(default_visibility = ["//visibility:public"]) - -ts_library( - name = "bazel-workspace", - srcs = [ - "index.ts", - "schema.d.ts", - ], - data = glob(["files/**/*"]) + [ - "schema.json", - ], - deps = [ - "@npm//@angular-devkit/core", - "@npm//@angular-devkit/schematics", - "@npm//@schematics/angular", - ], -) - -ts_library( - name = "test", - testonly = True, - srcs = [ - "index_spec.ts", - ], - data = [ - "//packages/bazel/src/schematics:package_assets", - ], - deps = [ - ":bazel-workspace", - "@npm//@angular-devkit/schematics", - ], -) diff --git a/packages/bazel/src/schematics/bazel-workspace/files/BUILD.bazel.template b/packages/bazel/src/schematics/bazel-workspace/files/BUILD.bazel.template deleted file mode 100644 index 27b2fa1432..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/files/BUILD.bazel.template +++ /dev/null @@ -1,7 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -# This export allows targets in other packages to reference files that live -# in this package. -exports_files([ - "tsconfig.json", -]) diff --git a/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template b/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template deleted file mode 100644 index 5b4d987081..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/files/WORKSPACE.template +++ /dev/null @@ -1,63 +0,0 @@ -# WARNING: This file is generated and it's not meant to be edited. -# Before making any changes, please read Bazel documentation. -# https://docs.bazel.build/versions/master/be/workspace.html -# The WORKSPACE file tells Bazel that this directory is a "workspace", which is like a project root. -# The content of this file specifies all the external dependencies Bazel needs to perform a build. - -#################################### -# ESModule imports (and TypeScript imports) can be absolute starting with the workspace name. -# The name of the workspace should match the npm package where we publish, so that these -# imports also make sense when referencing the published package. -workspace(name = "<%= utils.underscore(name) %>") - -load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") - -RULES_NODEJS_VERSION = "<%= RULES_NODEJS_VERSION %>" -http_archive( - name = "build_bazel_rules_nodejs", - sha256 = "<%= RULES_NODEJS_SHA256 %>", - url = "https://github.com/bazelbuild/rules_nodejs/releases/download/%s/rules_nodejs-%s.tar.gz" % (RULES_NODEJS_VERSION, RULES_NODEJS_VERSION), -) - -<% if (sass) { %> -# Rules for compiling sass -RULES_SASS_VERSION = "<%= RULES_SASS_VERSION %>" -http_archive( - name = "io_bazel_rules_sass", - sha256 = "<%= RULES_SASS_SHA256 %>", - url = "https://github.com/bazelbuild/rules_sass/archive/%s.zip" % RULES_SASS_VERSION, - strip_prefix = "rules_sass-%s" % RULES_SASS_VERSION, -) -<% } %> -#################################### -# Load and install our dependencies downloaded above. - -load("@build_bazel_rules_nodejs//:defs.bzl", "check_bazel_version", "node_repositories", "yarn_install") -# 0.18.0 is needed for .bazelignore -check_bazel_version("0.18.0") -node_repositories() -yarn_install( - name = "npm", - data = ["//:angular-metadata.tsconfig.json"], - package_json = "//:package.json", - yarn_lock = "//:yarn.lock", -) - -load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies") -install_bazel_dependencies() - -load("@npm_bazel_karma//:package.bzl", "rules_karma_dependencies") -rules_karma_dependencies() - -load("@io_bazel_rules_webtesting//web:repositories.bzl", "web_test_repositories") -web_test_repositories() - -load("@npm_bazel_karma//:browser_repositories.bzl", "browser_repositories") -browser_repositories() - -load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace") -ts_setup_workspace() -<% if (sass) { %> -load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories") -sass_repositories() -<% } %> diff --git a/packages/bazel/src/schematics/bazel-workspace/files/__dot__bazelignore.template b/packages/bazel/src/schematics/bazel-workspace/files/__dot__bazelignore.template deleted file mode 100644 index de4d1f007d..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/files/__dot__bazelignore.template +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules diff --git a/packages/bazel/src/schematics/bazel-workspace/files/__dot__bazelrc.template b/packages/bazel/src/schematics/bazel-workspace/files/__dot__bazelrc.template deleted file mode 100644 index 1b544399da..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/files/__dot__bazelrc.template +++ /dev/null @@ -1,29 +0,0 @@ -# Make TypeScript and Angular compilation fast, by keeping a few copies of the -# compiler running as daemons, and cache SourceFile AST's to reduce parse time. -build --strategy=TypeScriptCompile=worker -build --strategy=AngularTemplateCompile=worker - -# Don't create bazel-* symlinks in the WORKSPACE directory, except `bazel-out`, -# which is mandatory. -# These require .gitignore and may scare users. -# Also, it's a workaround for https://github.com/bazelbuild/rules_typescript/issues/12 -# which affects the common case of having `tsconfig.json` in the WORKSPACE directory. -# -# Instead, the output will appear in `dist/bin`. You'll need to ignore the -# `bazel-out` directory that is created in the workspace root. -build --symlink_prefix=dist/ - -# Turn on --incompatible_strict_action_env which was on by default -# in Bazel 0.21.0 but turned off again in 0.22.0. Follow -# https://github.com/bazelbuild/bazel/issues/7026 for more details. -# This flag is needed to so that the bazel cache is not invalidated -# when running bazel via `yarn bazel`. -# See https://github.com/angular/angular/issues/27514. -build --incompatible_strict_action_env -run --incompatible_strict_action_env -test --incompatible_strict_action_env - -test --test_output=errors - -# Use the Angular 6 compiler -build --define=compile=legacy diff --git a/packages/bazel/src/schematics/bazel-workspace/files/e2e/BUILD.bazel.template b/packages/bazel/src/schematics/bazel-workspace/files/e2e/BUILD.bazel.template deleted file mode 100644 index b38c34575f..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/files/e2e/BUILD.bazel.template +++ /dev/null @@ -1,50 +0,0 @@ -load("@npm_bazel_typescript//:index.bzl", "ts_library") -load("@npm_angular_bazel//:index.bzl", "protractor_web_test_suite") - -ts_library( - name = "e2e_lib", - testonly = 1, - srcs = glob(["src/**/*.ts"]), - tsconfig = ":tsconfig.e2e.json", - deps = [ - "@npm//@types/jasmine", - "@npm//@types/jasminewd2", - "@npm//@types/node", - "@npm//jasmine", - "@npm//protractor", - "@npm//tslib", - ], - data = [ - "//:tsconfig.json", - ], -) - -protractor_web_test_suite( - name = "prodserver_test", - data = [ - "@npm//@angular/bazel", - "@npm//protractor", - ], - on_prepare = ":protractor.on-prepare.js", - server = "//src:prodserver", - deps = [":e2e_lib"], -) - -protractor_web_test_suite( - name = "devserver_test", - data = [ - "@npm//@angular/bazel", - "@npm//protractor", - ], - on_prepare = ":protractor.on-prepare.js", - server = "//src:devserver", - deps = [":e2e_lib"], -) - -# Default target in this package is to run the e2e tests on the devserver. -# This is a faster round-trip but doesn't exercise production optimizations like -# code-splitting and lazy loading. -alias( - name = "e2e", - actual = "devserver_test", -) diff --git a/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template b/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template deleted file mode 100644 index 237f039881..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/files/src/BUILD.bazel.template +++ /dev/null @@ -1,153 +0,0 @@ -package(default_visibility = ["//visibility:public"]) - -load("@npm_angular_bazel//:index.bzl", "ng_module") -load("@npm_bazel_karma//:index.bzl", "ts_web_test_suite") -load("@build_bazel_rules_nodejs//:defs.bzl", "rollup_bundle", "history_server") -load("@build_bazel_rules_nodejs//internal/web_package:web_package.bzl", "web_package") -load("@npm_bazel_typescript//:index.bzl", "ts_devserver", "ts_library") -<% if (sass) { %>load("@io_bazel_rules_sass//:defs.bzl", "multi_sass_binary") - -multi_sass_binary( - name = "styles", - srcs = glob(["**/*.scss"]), -) -<% } %> -ng_module( - name = "src", - srcs = glob( - include = ["**/*.ts"], - exclude = [ - "**/*.spec.ts", - "main.ts", - "test.ts", - "initialize_testbed.ts", - ], - ), - assets = glob([ - "**/*.css", - "**/*.html", - ])<% if (sass) { %> + [":styles"]<% } %>, - deps = [ - "@npm//@angular/core", - "@npm//@angular/platform-browser",<% if (routing) { %> - "@npm//@angular/router",<% } %> - "@npm//@types", - "@npm//rxjs", - ], -) - -rollup_bundle( - name = "bundle", - entry_point = "src/main.prod", - deps = [ - "//src", - "@npm//rxjs", - ], -) - -web_package( - name = "prodapp", - assets = [ - # do not sort - "@npm//node_modules/zone.js:dist/zone.min.js", - ":bundle.min.js", - ], - data = [ - "favicon.ico", - ], - index_html = "index.html", -) - -history_server( - name = "prodserver", - data = [":prodapp"], - templated_args = ["src/prodapp"], -) - -filegroup( - name = "rxjs_umd_modules", - srcs = [ - # do not sort - "@npm//node_modules/rxjs:bundles/rxjs.umd.js", - ":rxjs_shims.js", - ], -) - -ts_devserver( - name = "devserver", - port = 4200, - entry_module = "<%= utils.underscore(name) %>/src/main.dev", - serving_path = "/bundle.min.js", - scripts = [ - "@npm//node_modules/@angular/common:bundles/common.umd.js", - "@npm//node_modules/@angular/common:bundles/common-http.umd.js", - "@npm//node_modules/@angular/core:bundles/core.umd.js", - "@npm//node_modules/@angular/platform-browser:bundles/platform-browser.umd.js", - "@npm//node_modules/tslib:tslib.js", - ":rxjs_umd_modules", - ], - static_files = [ - "@npm//node_modules/zone.js:dist/zone.min.js", - ], - data = [ - "favicon.ico", - ], - index_html = "index.html", - deps = [":src"], -) - -ts_library( - name = "test_lib", - testonly = 1, - srcs = glob(["**/*.spec.ts"]), - deps = [ - ":src", - "@npm//@angular/core", - "@npm//@types", - ], -) - -ts_library( - name = "initialize_testbed", - testonly = 1, - srcs = [ - "initialize_testbed.ts", - ], - deps = [ - "@npm//@angular/core", - "@npm//@angular/platform-browser-dynamic", - "@npm//@types", - ], -) - -ts_web_test_suite( - name = "test", - srcs = [ - "@npm//node_modules/@angular/common:bundles/common.umd.js", - "@npm//node_modules/@angular/compiler:bundles/compiler.umd.js", - "@npm//node_modules/@angular/compiler:bundles/compiler-testing.umd.js", - "@npm//node_modules/@angular/core:bundles/core.umd.js", - "@npm//node_modules/@angular/core:bundles/core-testing.umd.js", - "@npm//node_modules/@angular/platform-browser:bundles/platform-browser.umd.js", - "@npm//node_modules/@angular/platform-browser:bundles/platform-browser-testing.umd.js", - "@npm//node_modules/@angular/platform-browser-dynamic:bundles/platform-browser-dynamic.umd.js", - "@npm//node_modules/@angular/platform-browser-dynamic:bundles/platform-browser-dynamic-testing.umd.js", - "@npm//node_modules/tslib:tslib.js", - ], - runtime_deps = [ - ":initialize_testbed", - ], - # do not sort - bootstrap = [ - "@npm//node_modules/zone.js:dist/zone-testing-bundle.js", - "@npm//node_modules/reflect-metadata:Reflect.js", - ], - browsers = [ - "@io_bazel_rules_webtesting//browsers:chromium-local", - ], - deps = [ - ":rxjs_umd_modules", - ":test_lib", - "@npm//karma-jasmine", - ], -) diff --git a/packages/bazel/src/schematics/bazel-workspace/index.ts b/packages/bazel/src/schematics/bazel-workspace/index.ts deleted file mode 100644 index 0fbdf9beb6..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/index.ts +++ /dev/null @@ -1,76 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - * - * @fileoverview Schematics for bazel-workspace - */ - -import {strings} from '@angular-devkit/core'; -import {Rule, SchematicContext, Tree, apply, applyTemplates, mergeWith, url} from '@angular-devkit/schematics'; -import {getWorkspace} from '@schematics/angular/utility/config'; -import {validateProjectName} from '@schematics/angular/utility/validation'; - -import {Schema as BazelWorkspaceOptions} from './schema'; - -/** - * Clean the version string and return version in the form "1.2.3". Return - * null if version string is invalid. This is similar to semver.clean() but - * takes characters like '^' and '~' into account. - */ -export function clean(version: string): string|null { - const matches = version.match(/(\d+\.\d+\.\d+)/); - return matches && matches.pop() || null; -} - -/** - * Returns true if project contains routing module, false otherwise. - */ -function hasRoutingModule(host: Tree) { - let hasRouting = false; - host.visit((file: string) => { hasRouting = hasRouting || file.endsWith('-routing.module.ts'); }); - return hasRouting; -} - -/** - * Returns true if project uses SASS stylesheets, false otherwise. - */ -function hasSassStylesheet(host: Tree) { - let hasSass = false; - // The proper extension for SASS is .scss - host.visit((file: string) => { hasSass = hasSass || file.endsWith('.scss'); }); - return hasSass; -} - -export default function(options: BazelWorkspaceOptions): Rule { - return (host: Tree, context: SchematicContext) => { - const name = options.name || getWorkspace(host).defaultProject; - if (!name) { - throw new Error('Please provide a name for Bazel workspace'); - } - validateProjectName(name); - - if (!host.exists('yarn.lock')) { - host.create('yarn.lock', ''); - } - - const workspaceVersions = { - 'RULES_NODEJS_VERSION': '0.26.0', - 'RULES_NODEJS_SHA256': '5c86b055c57e15bf32d9009a15bcd6d8e190c41b1ff2fb18037b75e0012e4e7c', - 'RULES_SASS_VERSION': '1.17.2', - 'RULES_SASS_SHA256': 'e5316ee8a09d1cbb732d3938b400836bf94dba91a27476e9e27706c4c0edae1f', - }; - - return mergeWith(apply(url('./files'), [ - applyTemplates({ - utils: strings, - name, - 'dot': '.', ...workspaceVersions, - routing: hasRoutingModule(host), - sass: hasSassStylesheet(host), - }), - ])); - }; -} diff --git a/packages/bazel/src/schematics/bazel-workspace/index_spec.ts b/packages/bazel/src/schematics/bazel-workspace/index_spec.ts deleted file mode 100644 index af39661f61..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/index_spec.ts +++ /dev/null @@ -1,120 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {HostTree} from '@angular-devkit/schematics'; -import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; -import {clean} from './index'; - -describe('Bazel-workspace Schematic', () => { - const schematicRunner = - new SchematicTestRunner('@angular/bazel', require.resolve('../collection.json')); - const defaultOptions = { - name: 'demo', - }; - - it('should generate Bazel workspace files', () => { - const options = {...defaultOptions}; - const host = schematicRunner.runSchematic('bazel-workspace', options); - const files = host.files; - expect(files).toContain('/.bazelignore'); - expect(files).toContain('/.bazelrc'); - expect(files).toContain('/BUILD.bazel'); - expect(files).toContain('/src/BUILD.bazel'); - expect(files).toContain('/WORKSPACE'); - expect(files).toContain('/yarn.lock'); - }); - - it('should generate empty yarn.lock file', () => { - const host = schematicRunner.runSchematic('bazel-workspace', defaultOptions); - expect(host.files).toContain('/yarn.lock'); - expect(host.readContent('/yarn.lock')).toBe(''); - }); - - it('should not replace yarn.lock if it exists', () => { - let host = new UnitTestTree(new HostTree()); - host.create('yarn.lock', 'some content'); - expect(host.files).toContain('/yarn.lock'); - host = schematicRunner.runSchematic('bazel-workspace', defaultOptions, host); - expect(host.files).toContain('/yarn.lock'); - expect(host.readContent('/yarn.lock')).toBe('some content'); - }); - - it('should have the correct entry_module for devserver', () => { - const options = {...defaultOptions, name: 'demo-app'}; - const host = schematicRunner.runSchematic('bazel-workspace', options); - const {files} = host; - expect(files).toContain('/src/BUILD.bazel'); - const content = host.readContent('/src/BUILD.bazel'); - expect(content).toContain('entry_module = "demo_app/src/main.dev"'); - }); - - it('should add router if project contains routing module', () => { - let host = new UnitTestTree(new HostTree); - host.create('/src/app/app-routing.module.ts', ''); - expect(host.files).toContain('/src/app/app-routing.module.ts'); - const options = {...defaultOptions}; - host = schematicRunner.runSchematic('bazel-workspace', options, host); - expect(host.files).toContain('/src/BUILD.bazel'); - const content = host.readContent('/src/BUILD.bazel'); - expect(content).toContain('@npm//@angular/router'); - }); - - describe('WORKSPACE', () => { - it('should contain project name', () => { - const options = {...defaultOptions}; - const host = schematicRunner.runSchematic('bazel-workspace', options); - expect(host.files).toContain('/WORKSPACE'); - const content = host.readContent('/WORKSPACE'); - expect(content).toContain('workspace(name = "demo")'); - }); - - it('should convert dashes in name to underscore', () => { - const options = {...defaultOptions, name: 'demo-project'}; - const host = schematicRunner.runSchematic('bazel-workspace', options); - expect(host.files).toContain('/WORKSPACE'); - const content = host.readContent('/WORKSPACE'); - expect(content).toContain('workspace(name = "demo_project"'); - }); - }); - - describe('SASS', () => { - let host = new UnitTestTree(new HostTree); - beforeAll(() => { - host.create('/src/app/app.component.scss', ''); - expect(host.files).toContain('/src/app/app.component.scss'); - const options = {...defaultOptions}; - host = schematicRunner.runSchematic('bazel-workspace', options, host); - expect(host.files).toContain('/WORKSPACE'); - expect(host.files).toContain('/src/BUILD.bazel'); - }); - - it('should download and load rules_sass in WORKSPACE', () => { - const content = host.readContent('/WORKSPACE'); - expect(content).toContain('RULES_SASS_VERSION'); - expect(content).toContain( - 'load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories")'); - }); - - it('should add multi_sass_binary rule in src/BUILD', () => { - const content = host.readContent('/src/BUILD.bazel'); - expect(content).toContain('load("@io_bazel_rules_sass//:defs.bzl", "multi_sass_binary")'); - expect(content).toContain('glob(["**/*.scss"])'); - }); - }); -}); - -describe('clean', () => { - [['1.2.3', '1.2.3'], [' 1.2.3', '1.2.3'], ['1.2.3 ', '1.2.3'], ['~1.2.3', '1.2.3'], - ['^1.2.3', '1.2.3'], ['v1.2.3', '1.2.3'], ['1.2', null], ['a.b.c', null], - ].forEach(([version, want]: [string, string]) => { - it(`should match ${version} with ${want}`, () => { - const got = clean(version); - expect(got).toBe(want); - }); - }); -}); diff --git a/packages/bazel/src/schematics/bazel-workspace/schema.d.ts b/packages/bazel/src/schematics/bazel-workspace/schema.d.ts deleted file mode 100644 index 4006879eb3..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/schema.d.ts +++ /dev/null @@ -1,13 +0,0 @@ - -// THIS FILE IS AUTOMATICALLY GENERATED. TO UPDATE THIS FILE YOU NEED TO CHANGE -// THE CORRESPONDING JSON SCHEMA FILE. See README.md. - -// tslint:disable:no-global-tslint-disable -// tslint:disable - -export interface Schema { - /** - * The name of the project. - */ - name?: string; -} diff --git a/packages/bazel/src/schematics/bazel-workspace/schema.json b/packages/bazel/src/schematics/bazel-workspace/schema.json deleted file mode 100644 index 173e464b2d..0000000000 --- a/packages/bazel/src/schematics/bazel-workspace/schema.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "http://json-schema.org/schema", - "id": "SchematicsAngularBazelWorkspace", - "title": "Angular Bazel Workspace Schema", - "type": "object", - "properties": { - "name": { - "description": "The name of the project.", - "type": "string", - "format": "html-selector", - "$default": { - "$source": "argv", - "index": 0 - } - } - }, - "required": [ - ] -} diff --git a/packages/bazel/src/schematics/collection.json b/packages/bazel/src/schematics/collection.json index 534f02cd62..b237962c63 100644 --- a/packages/bazel/src/schematics/collection.json +++ b/packages/bazel/src/schematics/collection.json @@ -11,12 +11,6 @@ "factory": "./ng-new", "schema": "./ng-new/schema.json", "description": "Create an Angular project that builds with Bazel." - }, - "bazel-workspace": { - "factory": "./bazel-workspace", - "schema": "./bazel-workspace/schema.json", - "description": "Setup Bazel workspace", - "hidden": true } } } diff --git a/packages/bazel/src/schematics/ng-add/BUILD.bazel b/packages/bazel/src/schematics/ng-add/BUILD.bazel index 1a67bbc1c0..c3b6070dcb 100644 --- a/packages/bazel/src/schematics/ng-add/BUILD.bazel +++ b/packages/bazel/src/schematics/ng-add/BUILD.bazel @@ -12,7 +12,6 @@ ts_library( "schema.json", ], deps = [ - "//packages/bazel/src/schematics/bazel-workspace", "//packages/bazel/src/schematics/utility", "@npm//@angular-devkit/core", "@npm//@angular-devkit/schematics", diff --git a/packages/bazel/src/schematics/bazel-workspace/files/angular-metadata.tsconfig.json.template b/packages/bazel/src/schematics/ng-add/files/angular-metadata.tsconfig.json.template similarity index 100% rename from packages/bazel/src/schematics/bazel-workspace/files/angular-metadata.tsconfig.json.template rename to packages/bazel/src/schematics/ng-add/files/angular-metadata.tsconfig.json.template diff --git a/packages/bazel/src/schematics/bazel-workspace/files/e2e/protractor.on-prepare.js.template b/packages/bazel/src/schematics/ng-add/files/e2e/protractor.on-prepare.js.template similarity index 100% rename from packages/bazel/src/schematics/bazel-workspace/files/e2e/protractor.on-prepare.js.template rename to packages/bazel/src/schematics/ng-add/files/e2e/protractor.on-prepare.js.template diff --git a/packages/bazel/src/schematics/bazel-workspace/files/src/initialize_testbed.ts.template b/packages/bazel/src/schematics/ng-add/files/src/initialize_testbed.ts.template similarity index 100% rename from packages/bazel/src/schematics/bazel-workspace/files/src/initialize_testbed.ts.template rename to packages/bazel/src/schematics/ng-add/files/src/initialize_testbed.ts.template diff --git a/packages/bazel/src/schematics/ng-add/files/main.dev.ts.template b/packages/bazel/src/schematics/ng-add/files/src/main.dev.ts.template similarity index 100% rename from packages/bazel/src/schematics/ng-add/files/main.dev.ts.template rename to packages/bazel/src/schematics/ng-add/files/src/main.dev.ts.template diff --git a/packages/bazel/src/schematics/ng-add/files/main.prod.ts.template b/packages/bazel/src/schematics/ng-add/files/src/main.prod.ts.template similarity index 100% rename from packages/bazel/src/schematics/ng-add/files/main.prod.ts.template rename to packages/bazel/src/schematics/ng-add/files/src/main.prod.ts.template diff --git a/packages/bazel/src/schematics/bazel-workspace/files/src/rxjs_shims.js.template b/packages/bazel/src/schematics/ng-add/files/src/rxjs_shims.js.template similarity index 100% rename from packages/bazel/src/schematics/bazel-workspace/files/src/rxjs_shims.js.template rename to packages/bazel/src/schematics/ng-add/files/src/rxjs_shims.js.template diff --git a/packages/bazel/src/schematics/ng-add/index.ts b/packages/bazel/src/schematics/ng-add/index.ts index 9bb354900d..5b76c2eda4 100755 --- a/packages/bazel/src/schematics/ng-add/index.ts +++ b/packages/bazel/src/schematics/ng-add/index.ts @@ -61,20 +61,13 @@ function addDevDependenciesToPackageJson(options: Schema) { } /** - * Append main.dev.ts and main.prod.ts to src directory. These files are needed - * by Bazel for devserver and prodserver, respectively. They are different from - * main.ts generated by CLI because they use platformBrowser (AOT) instead of - * platformBrowserDynamic (JIT). + * Append additional Javascript / Typescript files needed to compile an Angular + * project under Bazel. */ -function addDevAndProdMainForAot(options: Schema) { +function addFilesRequiredByBazel(options: Schema) { return (host: Tree) => { return mergeWith(apply(url('./files'), [ - applyTemplates({ - utils: strings, - ...options, - 'dot': '.', - }), - move('/src'), + applyTemplates({}), ])); }; } @@ -331,8 +324,7 @@ export default function(options: Schema): Rule { validateProjectName(options.name); return chain([ - schematic('bazel-workspace', options), - addDevAndProdMainForAot(options), + addFilesRequiredByBazel(options), addDevDependenciesToPackageJson(options), addPostinstallToGenerateNgSummaries(), backupAngularJson(), diff --git a/packages/bazel/src/schematics/ng-add/index_spec.ts b/packages/bazel/src/schematics/ng-add/index_spec.ts index 4e5d62d5e4..efc4610d19 100644 --- a/packages/bazel/src/schematics/ng-add/index_spec.ts +++ b/packages/bazel/src/schematics/ng-add/index_spec.ts @@ -17,54 +17,45 @@ describe('ng-add schematic', () => { beforeEach(() => { host = new UnitTestTree(new HostTree()); - host.create( - 'package.json', JSON.stringify( - { - name: 'demo', - dependencies: { - '@angular/core': '1.2.3', - 'rxjs': '~6.3.3', - }, - devDependencies: { - 'typescript': '3.2.2', - }, - }, - null, 2)); - host.create( - 'tsconfig.json', JSON.stringify( - { - compileOnSave: false, - compilerOptions: { - baseUrl: './', - outDir: './dist/out-tsc', - } - }, - null, 2)); - host.create( - 'angular.json', JSON.stringify( - { - projects: { - 'demo': { - architect: { - build: {}, - serve: {}, - test: {}, - 'extract-i18n': { - builder: '@angular-devkit/build-angular:extract-i18n', - }, - }, - }, - 'demo-e2e': { - architect: { - e2e: {}, - lint: { - builder: '@angular-devkit/build-angular:tslint', - }, - }, - }, - }, - }, - null, 2)); + host.create('package.json', JSON.stringify({ + name: 'demo', + dependencies: { + '@angular/core': '1.2.3', + 'rxjs': '~6.3.3', + }, + devDependencies: { + 'typescript': '3.2.2', + }, + })); + host.create('tsconfig.json', JSON.stringify({ + compileOnSave: false, + compilerOptions: { + baseUrl: './', + outDir: './dist/out-tsc', + } + })); + host.create('angular.json', JSON.stringify({ + projects: { + 'demo': { + architect: { + build: {}, + serve: {}, + test: {}, + 'extract-i18n': { + builder: '@angular-devkit/build-angular:extract-i18n', + }, + }, + }, + 'demo-e2e': { + architect: { + e2e: {}, + lint: { + builder: '@angular-devkit/build-angular:tslint', + }, + }, + }, + }, + })); schematicRunner = new SchematicTestRunner('@angular/bazel', require.resolve('../collection.json')); }); @@ -109,11 +100,11 @@ describe('ng-add schematic', () => { expect(devDeps).toContain('@bazel/karma'); }); - it('should create Bazel workspace file', () => { + it('should not create Bazel workspace file', () => { host = schematicRunner.runSchematic('ng-add', defaultOptions, host); const {files} = host; - expect(files).toContain('/WORKSPACE'); - expect(files).toContain('/BUILD.bazel'); + expect(files).not.toContain('/WORKSPACE'); + expect(files).not.toContain('/BUILD.bazel'); }); it('should produce main.dev.ts and main.prod.ts for AOT', () => { @@ -225,19 +216,16 @@ describe('ng-add schematic', () => { ]; for (const [version, upgrade] of cases) { it(`should ${upgrade ? '' : 'not '}upgrade v${version}')`, () => { - host.overwrite( - 'package.json', JSON.stringify( - { - name: 'demo', - dependencies: { - '@angular/core': '1.2.3', - 'rxjs': version, - }, - devDependencies: { - 'typescript': '3.2.2', - }, - }, - null, 2)); + host.overwrite('package.json', JSON.stringify({ + name: 'demo', + dependencies: { + '@angular/core': '1.2.3', + 'rxjs': version, + }, + devDependencies: { + 'typescript': '3.2.2', + }, + })); host = schematicRunner.runSchematic('ng-add', defaultOptions, host); expect(host.files).toContain('/package.json'); const content = host.readContent('/package.json'); diff --git a/packages/bazel/src/schematics/ng-new/index_spec.ts b/packages/bazel/src/schematics/ng-new/index_spec.ts index 66177ea67c..3c33b3fb95 100644 --- a/packages/bazel/src/schematics/ng-new/index_spec.ts +++ b/packages/bazel/src/schematics/ng-new/index_spec.ts @@ -25,12 +25,11 @@ describe('ng-new schematic', () => { expect(files).toContain('/demo/package.json'); }); - it('should call ng-add to generate Bazel files', () => { + it('should call ng-add to generate additional files needed by Bazel', () => { const options = {...defaultOptions}; const host = schematicRunner.runSchematic('ng-new', options); const {files} = host; - expect(files).toContain('/demo/WORKSPACE'); - expect(files).toContain('/demo/BUILD.bazel'); - expect(files).toContain('/demo/src/BUILD.bazel'); + expect(files).toContain('/demo/src/main.dev.ts'); + expect(files).toContain('/demo/src/main.prod.ts'); }); }); diff --git a/yarn.lock b/yarn.lock index f5a868ae11..89e3901369 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,6 +31,17 @@ rxjs "6.3.3" source-map "0.7.3" +"@angular-devkit/core@7.3.5": + version "7.3.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.5.tgz#2a59a913eab358e2385f52ba28132b81435e63b3" + integrity sha512-J/Tztq2BZ3tpwUsbiz8N61rf9lwqn85UvJsDui2SPIdzDR9KmPr5ESI2Irc/PEb9i+CBXtVuhr8AIqo7rR6ZTg== + dependencies: + ajv "6.9.1" + chokidar "2.0.4" + fast-json-stable-stringify "2.0.0" + rxjs "6.3.3" + source-map "0.7.3" + "@angular-devkit/schematics@7.3.2", "@angular-devkit/schematics@^7.3.2": version "7.3.2" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.2.tgz#e9d3c1f2128a56f66ea846ce3f80c69d4c3a9ae9" @@ -39,6 +50,14 @@ "@angular-devkit/core" "7.3.2" rxjs "6.3.3" +"@angular-devkit/schematics@7.3.5": + version "7.3.5" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.5.tgz#7b007f8a86dea76e93eef007d4fb6e7d8324b7bb" + integrity sha512-BFCCkwRMBC4aFlngaloi1avCTgGrl1MFc/0Av2sCpBh/fdm1FqSVzmOiTfu93dehRVVL/bTrA2qj+xpNsXCxzA== + dependencies: + "@angular-devkit/core" "7.3.5" + rxjs "6.3.3" + "@angular/bazel@file:./tools/npm/@angular_bazel": version "0.0.0" @@ -265,7 +284,7 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.12.5.tgz#c448a38902ccb5601c1b2ef3b1a105012ef7712c" integrity sha512-xEAyvLXo4Cter/b0EMCWUZTgXOfLOPJ/Xr52WdjVclPx9eDmNTGFtZl8Pn/nqSnZsQBNcHL0eHk/YyRyyXXpiQ== -"@schematics/angular@7.3.2", "@schematics/angular@^7.3.2": +"@schematics/angular@7.3.2": version "7.3.2" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.2.tgz#470f972a9d80ab8af9900e33972bce44aa567718" integrity sha512-ClqG1qA919QqsikIXIP/jKl2Boj70lihCbpXhZgjsahLY8UJgq9oh8K1QuvYJtz4AI4GADfG1fGzPdYfy94+kg== @@ -274,6 +293,15 @@ "@angular-devkit/schematics" "7.3.2" typescript "3.2.4" +"@schematics/angular@^7.3.5": + version "7.3.5" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.5.tgz#7af1cd446b051b2be3fbe59cb4ba140ec06e2d87" + integrity sha512-fKNZccf1l2OcDwtDupYj54N/YuiMLCWeaXNxcJNUYvGnBtzxQJ4P2LtSCjB4HDvYCtseQM7iyc7D1Xrr5gI8nw== + dependencies: + "@angular-devkit/core" "7.3.5" + "@angular-devkit/schematics" "7.3.5" + typescript "3.2.4" + "@schematics/update@0.13.2": version "0.13.2" resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.13.2.tgz#14ba82076b435814896ac141ba4dfad0dd3dadcd" From 4f2773eaef56b7a7ec8ea6f40d1bf0ac137f9785 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Thu, 28 Feb 2019 16:42:32 +0200 Subject: [PATCH 0266/1073] docs: add missing guides, examples, images to CODEOWNERS (#28597) PR Close #28597 --- .github/CODEOWNERS | 98 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 92 insertions(+), 6 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e2984c874b..cf41164407 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -39,6 +39,7 @@ # (just to make this file easier to understand) # ================================================ +# alan-agius4 - Alan Agius # alexeagle - Alex Eagle # alxhub - Alex Rickabaugh # AndrewKushnir - Andrew Kushnir @@ -293,6 +294,17 @@ # - IgorMinar +# =========================================================== +# @angular/tools-docs-libraries +# =========================================================== +# +# - alan-agius4 +# - alexeagle +# - hansl +# - IgorMinar +# - mgechev + + # =========================================================== # @angular/fw-docs-marketing # =========================================================== @@ -349,10 +361,19 @@ /packages/animations/** @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /packages/platform-browser/animations/** @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + /aio/content/guide/animations.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/animations/** @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/images/guide/animations/** @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/complex-animation-sequences.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + +/aio/content/guide/reusable-animations.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + +/aio/content/guide/route-animations.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + +/aio/content/guide/transition-and-triggers.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + # ================================================ @@ -383,12 +404,13 @@ # ================================================ -# @angular/compiler-cli/ngtools +# Framework/cli integration # # a rule to control API changes between @angular/compiler-cli and @angular/cli # ================================================ /packages/compiler-cli/src/ngtools/** @angular/tools-cli @angular/framework-global-approvers +/aio/content/guide/ivy.md @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -408,6 +430,14 @@ /packages/platform-webworker/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /packages/platform-webworker-dynamic/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/architecture-components.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/architecture-modules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/architecture-next-steps.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/architecture-services.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/architecture.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/architecture/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/images/guide/architecture/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + /aio/content/guide/attribute-directives.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/attribute-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/images/guide/attribute-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -415,6 +445,8 @@ /aio/content/guide/bootstrapping.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/bootstrapping/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/cheatsheet.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + /aio/content/guide/component-interaction.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/component-interaction/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/images/guide/component-interaction/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -430,7 +462,13 @@ /aio/content/examples/dependency-injection-in-action/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/images/guide/dependency-injection-in-action/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/dependency-injection-pattern.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/dependency-injection-navtree.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + +/aio/content/guide/dependency-injection-providers.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + +/aio/content/guide/displaying-data.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/displaying-data/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/images/guide/displaying-data/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/dynamic-component-loader.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/dynamic-component-loader/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -474,6 +512,8 @@ /aio/content/guide/module-types.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/template-syntax.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/event-binding/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/interpolation/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/template-syntax/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/images/guide/template-syntax/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -496,6 +536,10 @@ /aio/content/examples/structural-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/images/guide/structural-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/user-input.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/user-input/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/images/guide/user-input/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + # ================================================ @@ -521,6 +565,7 @@ /aio/content/guide/elements.md @angular/fw-elements @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + # ================================================ # @angular/forms # ================================================ @@ -651,6 +696,7 @@ testing/** @angular/fw-test /packages/platform-browser/src/security/** @angular/fw-security /aio/content/guide/security.md @angular/fw-security @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/security/** @angular/fw-security @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/images/guide/security/** @angular/fw-security @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -681,6 +727,14 @@ testing/** @angular/fw-test /aio/tests/** @angular/docs-infra @angular/framework-global-approvers /aio/tools/** @angular/docs-infra @angular/framework-global-approvers +# Hidden docs +/aio/content/guide/change-log.md @angular/docs-infra @angular/framework-global-approvers +/aio/content/guide/docs-style-guide.md @angular/docs-infra @angular/framework-global-approvers +/aio/content/examples/docs-style-guide/** @angular/docs-infra @angular/framework-global-approvers +/aio/content/images/guide/docs-style-guide/** @angular/docs-infra @angular/framework-global-approvers +/aio/content/guide/visual-studio-2015.md @angular/docs-infra @angular/framework-global-approvers +/aio/content/examples/visual-studio-2015/** @angular/docs-infra @angular/framework-global-approvers + # ================================================ @@ -688,7 +742,17 @@ testing/** @angular/fw-test # ================================================ /aio/content/guide/quickstart.md @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/cli-quickstart/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/images/guide/cli-quickstart/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/tutorial/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/images/guide/toh/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/toh-pt0/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/toh-pt1/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/toh-pt2/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/toh-pt3/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/toh-pt4/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/toh-pt5/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/toh-pt6/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -696,17 +760,17 @@ testing/** @angular/fw-test # Docs: observables # ================================================ +/aio/content/guide/observables.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/observables/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/images/guide/observables/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/observables.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/comparing-observables.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/observables-in-angular.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/observables-in-angular/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/images/guide/observables-in-angular/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/observables-in-angular.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/practical-observable-usage/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/practical-observable-usage.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/rx-library/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/practical-observable-usage/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/rx-library.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/rx-library/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -717,12 +781,27 @@ testing/** @angular/fw-test /aio/content/guide/npm-packages.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/browser-support.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/typescript-configuration.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/examples/quickstart/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/setup-systemjs-anatomy.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/setup.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/setup/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/build.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/images/guide/build/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/deployment.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/file-structure.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/releases.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/updating.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/workspace-config.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes + + + +# ================================================ +# Docs: libraries +# ================================================ + +/aio/content/guide/creating-libraries.md @angular/tools-docs-libraries @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/libraries.md @angular/tools-docs-libraries @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes +/aio/content/guide/using-libraries.md @angular/tools-docs-libraries @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -768,6 +847,8 @@ testing/** @angular/fw-test /tools/* *.bzl @angular/fw-dev-infra + + # ================================================ # Material CI # ================================================ @@ -775,11 +856,16 @@ testing/** @angular/fw-test /tools/material-ci/** @angular/fw-core @angular/framework-global-approvers + # ================================================ # Public API # ================================================ /tools/public_api_guard/** @angular/fw-public-api +/aio/content/guide/glossary.md @angular/fw-public-api +/aio/content/guide/styleguide.md @angular/fw-public-api +/aio/content/examples/styleguide/** @angular/fw-public-api +/aio/content/images/guide/styleguide/** @angular/fw-public-api From ad9415af1d00cf36e630fab67f25f37245b18510 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Thu, 28 Feb 2019 16:42:33 +0200 Subject: [PATCH 0267/1073] docs: remove unused examples and images (#28597) PR Close #28597 --- .github/CODEOWNERS | 6 ---- .../property-binding/src/app/app.component.ts | 30 ------------------ aio/content/guide/template-syntax.md | 2 +- .../application-under-test/bongos-heroes.png | Bin 11563 -> 0 bytes .../Jasmine-not-running-tests.png | Bin 2491 -> 0 bytes .../passed-2-specs-0-failures.png | Bin 8149 -> 0 bytes .../test-passed-once-again.png | Bin 11415 -> 0 bytes aio/content/images/guide/intro/people.png | Bin 16526 -> 0 bytes .../jasmine-1-spec-0-failures.png | Bin 8463 -> 0 bytes .../null-to-equal-undefined.png | Bin 51743 -> 0 bytes .../spec-list-2-specs-1-failure.png | Bin 4240 -> 0 bytes .../test-report-1-spec-0-failures.png | Bin 2885 -> 0 bytes .../test-report-2-specs-0-failures.png | Bin 3401 -> 0 bytes .../test-report-2-specs-1-failure.png | Bin 9796 -> 0 bytes .../guide/ngcontainer/hero-traits-bad.png | Bin 1787 -> 0 bytes .../guide/ngcontainer/hero-traits-good.png | Bin 1881 -> 0 bytes .../guide/ngmodule/contact-1b-plunker.png | Bin 33226 -> 0 bytes .../guide/ngmodule/contact-2-plunker.png | Bin 23401 -> 0 bytes .../images/guide/ngmodule/final-plunker.png | Bin 22813 -> 0 bytes .../images/guide/ngmodule/minimal-plunker.png | Bin 20163 -> 0 bytes .../images/guide/ngmodule/v3-plunker.png | Bin 25574 -> 0 bytes .../images/guide/quickstart/hello-angular.png | Bin 2078 -> 0 bytes .../images/guide/quickstart/my-first-app.png | Bin 10061 -> 0 bytes .../guide/quickstart/quickstart-plnkr-big.png | Bin 20869 -> 0 bytes .../guide/quickstart/quickstart-plnkr.png | Bin 14674 -> 0 bytes .../syntax-diagram.svg | 0 .../5-specs-0-failures.png | Bin 11764 -> 0 bytes .../big-time-fail-screen.png | Bin 1279 -> 0 bytes .../testing-an-angular-pipe/two-failures.png | Bin 1992 -> 0 bytes .../testing-an-angular-pipe/zero-failures.png | Bin 2923 -> 0 bytes .../images/guide/unit-testing/spectrum.png | Bin 30822 -> 0 bytes 31 files changed, 1 insertion(+), 37 deletions(-) delete mode 100644 aio/content/examples/property-binding/src/app/app.component.ts delete mode 100644 aio/content/images/guide/application-under-test/bongos-heroes.png delete mode 100644 aio/content/images/guide/first-app-tests/Jasmine-not-running-tests.png delete mode 100644 aio/content/images/guide/first-app-tests/passed-2-specs-0-failures.png delete mode 100644 aio/content/images/guide/first-app-tests/test-passed-once-again.png delete mode 100644 aio/content/images/guide/intro/people.png delete mode 100644 aio/content/images/guide/jasmine-testing-101/jasmine-1-spec-0-failures.png delete mode 100644 aio/content/images/guide/jasmine-testing-101/null-to-equal-undefined.png delete mode 100644 aio/content/images/guide/jasmine-testing-101/spec-list-2-specs-1-failure.png delete mode 100644 aio/content/images/guide/jasmine-testing-101/test-report-1-spec-0-failures.png delete mode 100644 aio/content/images/guide/jasmine-testing-101/test-report-2-specs-0-failures.png delete mode 100644 aio/content/images/guide/jasmine-testing-101/test-report-2-specs-1-failure.png delete mode 100644 aio/content/images/guide/ngcontainer/hero-traits-bad.png delete mode 100644 aio/content/images/guide/ngcontainer/hero-traits-good.png delete mode 100644 aio/content/images/guide/ngmodule/contact-1b-plunker.png delete mode 100644 aio/content/images/guide/ngmodule/contact-2-plunker.png delete mode 100644 aio/content/images/guide/ngmodule/final-plunker.png delete mode 100644 aio/content/images/guide/ngmodule/minimal-plunker.png delete mode 100644 aio/content/images/guide/ngmodule/v3-plunker.png delete mode 100644 aio/content/images/guide/quickstart/hello-angular.png delete mode 100644 aio/content/images/guide/quickstart/my-first-app.png delete mode 100644 aio/content/images/guide/quickstart/quickstart-plnkr-big.png delete mode 100644 aio/content/images/guide/quickstart/quickstart-plnkr.png rename aio/content/images/guide/{event-binding => template-syntax}/syntax-diagram.svg (100%) delete mode 100644 aio/content/images/guide/testing-an-angular-pipe/5-specs-0-failures.png delete mode 100644 aio/content/images/guide/testing-an-angular-pipe/big-time-fail-screen.png delete mode 100644 aio/content/images/guide/testing-an-angular-pipe/two-failures.png delete mode 100644 aio/content/images/guide/testing-an-angular-pipe/zero-failures.png delete mode 100644 aio/content/images/guide/unit-testing/spectrum.png diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cf41164407..3ccf1000fe 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -495,12 +495,9 @@ /aio/content/images/guide/lifecycle-hooks/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/ngcontainer/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/ngcontainer/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/ngmodules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/ngmodules/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/ngmodule/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/ngmodule/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/ngmodule-api.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -762,11 +759,9 @@ testing/** @angular/fw-test /aio/content/guide/observables.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/observables/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/observables/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/comparing-observables.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/observables-in-angular.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/observables-in-angular/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/observables-in-angular/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/practical-observable-usage.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/practical-observable-usage/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/rx-library.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes @@ -782,7 +777,6 @@ testing/** @angular/fw-test /aio/content/guide/browser-support.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/typescript-configuration.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/quickstart/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/setup-systemjs-anatomy.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/setup.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/examples/setup/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes /aio/content/guide/build.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes diff --git a/aio/content/examples/property-binding/src/app/app.component.ts b/aio/content/examples/property-binding/src/app/app.component.ts deleted file mode 100644 index 1c52d44ebe..0000000000 --- a/aio/content/examples/property-binding/src/app/app.component.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Component } from '@angular/core'; - - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.css'] -}) -export class AppComponent { - itemImageUrl = '../assets/lamp.png'; - isUnchanged = true; - classes = 'special'; - // #docregion parent-data-type - parentItem = 'bananas'; - // #enddocregion parent-data-type - - // #docregion pass-object - currentItem = [{ - id: 21, - name: 'peaches' - }]; - // #enddocregion pass-object - - interpolationTitle = 'Interpolation'; - propertyTitle = 'Property binding'; - - // #docregion malicious-content - evilTitle = 'Template Syntax'; - // #enddocregion malicious-content -} diff --git a/aio/content/guide/template-syntax.md b/aio/content/guide/template-syntax.md index 4e177a3b85..0df3622663 100644 --- a/aio/content/guide/template-syntax.md +++ b/aio/content/guide/template-syntax.md @@ -956,7 +956,7 @@ The following event binding listens for the button's click events, calling the component's `onSave()` method whenever a click occurs:
- Syntax diagram + Syntax diagram
### Target event diff --git a/aio/content/images/guide/application-under-test/bongos-heroes.png b/aio/content/images/guide/application-under-test/bongos-heroes.png deleted file mode 100644 index 17e4861d8e7b4d651dbe0c82e143080929c8dc49..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11563 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 RQ~NUpvb8*qs6OkR@E`2L&r$#Y diff --git a/aio/content/images/guide/first-app-tests/passed-2-specs-0-failures.png b/aio/content/images/guide/first-app-tests/passed-2-specs-0-failures.png deleted file mode 100644 index 1c0dbb680d2a69e2831125c6d5e22c83f6398bb4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8149 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 diff --git a/aio/content/images/guide/first-app-tests/test-passed-once-again.png b/aio/content/images/guide/first-app-tests/test-passed-once-again.png deleted file mode 100644 index 258c0dd390cba899cd1120e8431ab0eec9ef3610..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11415 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 INf-zHA50e5g8%>k diff --git a/aio/content/images/guide/intro/people.png b/aio/content/images/guide/intro/people.png deleted file mode 100644 index 64efccfe079d72f0310a5715055719e8fd8da165..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16526 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 diff --git a/aio/content/images/guide/jasmine-testing-101/jasmine-1-spec-0-failures.png b/aio/content/images/guide/jasmine-testing-101/jasmine-1-spec-0-failures.png deleted file mode 100644 index 6115a865a3bb4bc613a8b90fb4e90c1f9c6eb595..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8463 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 diff --git a/aio/content/images/guide/jasmine-testing-101/null-to-equal-undefined.png b/aio/content/images/guide/jasmine-testing-101/null-to-equal-undefined.png deleted file mode 100644 index 5f7a7bd847e39fa2d3991517ed4972e4261b44b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51743 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 diff --git a/aio/content/images/guide/jasmine-testing-101/test-report-1-spec-0-failures.png b/aio/content/images/guide/jasmine-testing-101/test-report-1-spec-0-failures.png deleted file mode 100644 index dd85b01a09150795d1088c86954ddb63e6317076..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2885 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δ#U#VF6M2 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 diff --git a/aio/content/images/guide/ngcontainer/hero-traits-good.png b/aio/content/images/guide/ngcontainer/hero-traits-good.png deleted file mode 100644 index 0ce389b2a3b6b7982e582340e2ea17252fd5dcda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1881 zcmV-f2d4OmP)fFDZ*Bk+2_Yi@000VfMObu0Z*X~XX=iA30IUzpIsgCw4s=CWbVG7w zVRUJ4ZXk4NZDjy8_YVmG000SeMObuGZ)S9NVRB^vU2y+80000BbVXQnL}_zlY+-3_ zWpV(wz_gD5000PdMObuKVRCM1Zf5|%8|H@q000McMObuGZ*_8GWdQa6gX;hQ00?wN zSad^gZEa<4bO83umcIZ100wkLSaeirbZlh+sP57y000IgNklL6HK9f&z(xf+7+n(iRjckSJ0_qDVo3lp;lnTz`N)HXdVgqqnR3GR0~I*fT!I z$M%f#^?Y8BaS$g()s0Wh?!$MP#C~>q?y_qYd0vopclGfp^}MLME?><5{-y2h>3yF6 z!lu4D6y1JI)6?^xwjUlOouFp#VCufd9@jQY>sLGcS~L~}ey+`<`*-5|{(cx)hilos zedPaz$bZY+{D}4^?d?byWo94Oi=RJHi)^VKY(aWMGvQ;|#i1s7ek7(a2+LrXA zsFrHB?g5PSyRhe>t5ZHjP& z9i_FY1^d2eswDL1j_X0by`7gAw1ejIfUU~5Hn&3KG{r+vSZv4qWSAZb65a|Y124C8 zoi3ie@KCUC389+HOBo7=T)?)Q(Wy9gHeC@f$QIpAL7YF1vMLKvP)JH4sDS}ul-Zmj z^F%owlW!va4e?eSpvE4TCXM`;c@TS=Cp+DTz7Xw+9EPE4388U4UNzBDHw2gII^MSz zOgbmX_k&fmY$`=%KT$NMzKA@Z#6re(G00as9dY| zQU>!d9Kp5*h&UDN)XXsp-AlgjqEURj2)Ecu#;BQlzYk5~&!pp&;Z9Lrq-gJ5Ccfd_ zN_`C!?xkP$ZXTyI5Bg5K8+|F-r=nV}+2=~M^S~WXITRlS#+7L0#8Hh3UJ+fF`((%y zF53CP;1U}cM4NhZw-cSxhvo*48q24qR?%^^#)-%CvS=5|RXp_ID5L>^RJv1DE1`D< z+hVv=PCR%wRAepBI^kvnH59XG*$czWvr&dR#d#5;rQJY0=-}pA#zKKS@NfHFJgB1G zk3JAB!(dizpZhE_U9^EgU)D*E#`CIZ!)h@4G4XOA`nIWxEQteO?q6V1Q;KKJI)lAsW~U4- zFqy^hSAk=|FlvsY`8h%v=G4NA5Uti$pCt+pOq=Z84j!NuUO*p;R=Ooxhuha_UkyjW zo}Dz<+GG+f)+apo16!}QdUjkUOSTailUm)O3~F8QSAj9Mvd4+U^Qvf7phUc@SHm%; z4ud$!%DNxUrF17%D>ds5w#_U~HDtx`*VP#0(gnMVu~CLOweYeuS@RJpk-bfQ8bpJL*0j@N&)urQkLlcG(YDAPc3Qr4+C{q=rxwp! zcG^iCb+zEwIvs&e*~xHmH_fUAnso=;vd7w-V)|KaO?=Zai`IRo znI*}$ba@l`_8uPKA!9%KnrK-P43@9=h;|;Dw^cn}3WGES9-9Nn9y!KR(3 z-o`nCZ84iuTt9$(_v$e(#PZs?y?ShPit_@R0DpS*xG$*7ieGoIph1@5%EOWx-){F8 z(AP!FBA0wxM2r9E%eboXg=YJn7G$DhTg;bN>isPyLU5Jm`Qf4LrtRajnpY{8elv>O zt*|)Jcy6aGRF$*|s=Qxb?hXY^tHo5_eKI`zmdrq~ad6e@3z`eqwuRf`)S6z3J5N6< z>LPNxrv;b57-bfx7%xf_d2<>jb*0UcTHMnDB6jgG@cZ25w#Es4;o$4}v0r6v`n!Mk zG*szN|EleOZy(YADkIr{v?rJR0nJAHs>&bxi1r`1u1K5l7sof&Y0-aZ`eFM6dlS(; Tq?vNl00000NkvXXu0mjfSfho$ diff --git a/aio/content/images/guide/ngmodule/contact-1b-plunker.png b/aio/content/images/guide/ngmodule/contact-1b-plunker.png deleted file mode 100644 index 4063efc23dbc9c4da8f22207e3ef6a597dbd4602..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33226 zcmY&;XCPc%*Y@Zk3_{e=MHf9By_ZDqqW9>G8qrBa8$H_SEowv;L~nyZL?_yePKc7| zpZk4&egDomdtGZ^tDLoKjJBo<5djSW2m~ThQ&rRjfv^A&2ow4U>*32J>mC2Y3$?bo zzS8~u{WsL^#l^+t<>k@QQA|wC@$s={VA=BW@{b=sc6WELudmI_%>MlOqp7L6xw*N& zzkhRcbAEpQ@87>)zkVSQ2y1KWjEs!4v$NaV+oGbPxw*N%zP^TrhV}LJ?Ck9L`1qux zBqS2Kv$NCL*=cNSTwY$TrKP2-tJ~e(eSCQ}w0r39@4vORRaseCT3VWymse0wz|71H zhr^?yqTJlv+BSEFhK3dv7G`E<4i67&YinE9w?BRQl$x4aS62sv!3+%z_4W0utE(-o ztXf)HN=i!5Xmru|QgCqa`r%R2%>3l!v9+~* z_wJo}OdS*oegFRb?Ck98*RNAjQUU`5^+GGOgFc6bhB|q8nwpxH4kA)ICKF1^TwPsl zU=1GrZ`s(`(!Vsk&&+mqb`}MIre7NkE9l^OSZ@3Gim|EJA8NlWY!vnmHY~2z%`Sai zLfI!bxwyFGjm&@QnSPVj;u8_&;Nn{QbG~}=Xa4uzil3{oO=AJkF*S4R0ma=J&26fB z`p}@@@~M?~WqmH*z6q_!@{w^_RW)dCr$HN+3|EtD2&me!$|viiXFAGFA7<8+!UtFPC*2 zl8Td25|WhC>^Uq9yCE)SGm=-l<$s;9@tbjx7~EGSzj#xr|Z{+3P~Y!PGx-m(PY?9&O2=-o;@EX7Q*X>+Z94bm)dm z9QYFM;&2~yNdffjO>fhocK5f!u{?<&t%v@8shdbPD{<{IR@GWA)@?1J+e7uhUU6(4 zrrI3=&b728szS?+m_Y>*rhy(0ge+2B`B#rGOSB=uf-KH>HWN66!L8H7o=EfN2fdUDyUC zW}B17@IKQ0AdxPWH^>=sNbW&)C2-}rcyN5L%?a<8;MK-ikgpyKOy0Py~e5f&r(Dru?U6j?x5;+_W)*I<*nZG`B` zac*;6<|>GN^;gq;JT2KjyHeT~sDB*+XP7|UWO6$~uB&qI#-WC$cP?F4o6gWNP7PcS zy+c~G>wcsz4DMu(VOXUk!|8aiE{h;F*MNl;r)b_`PunWSA9c&+-B(=03;dbO`Nz|R z`io*|1*Eu&N%AqjPf`#1>=tDso79Y-K-HU~-?V{n=}dm&<{h#|Vmp!{duYO*fFF_H zP}!O~Vrj&hHwp)9>_1LTsIRN|_tz$6zmJ#Uh9^Osk&Evs$X0n*c+Dbcrq3do?gevY zfe~{_115;WFJ4ROnAEG@C^T`j6JoEnX-RodMF8uE){v}v10`G5jhrVKvj?By-;fig z-Rfv^(+wU)Iq222Grn=LoJl&gHf0rv!jg?mGKyrjF@E`*f?npCgY-DjPolZMqY9Az;+?vh4iIn)N`uFUwORsa;l;{xg%3mh3=XgpfrxxmlVwl zvNPX=mXue@w?O#|95bF$rJX5B#qUmj{>@s`Zr~Lw20fNc)$8f` zu@Ja>X@Zqn>>{6?=ACcit+&(r7e2O} zYY*eQHj6e031z}*7Ug$6y9O#C&$h=0-D%U%W{7~tQ>x& z$}o@mKmGWZH~(CM9EDyWlJ58RqO@$h`6rDZ2Wc`;H=GFpIE(6KHC!G1VIh9`wp`M< zll$R2#$X=Lk%>WwB*v%~3j2(L@bwmSR)GCgN4Zbfc?H~b`AxM2rQ($zewqCP*#SX- z7p(H7DrpJVq$+9#>ks@ts((!kxrVGfq39h6@`2dQF?r2OMXA(czCd!$E1P21kKo($ z9|=wWq!!>4%!-Ke4MsZAbRkT`mOgebPRT&Hx!kAhyK+^39qRk---Yffl6zVW+ znu@Zeqvs9Uz?aK+#0PA_)LGXju$oB~IeI%cL!^>3jpagnnvt zCzXCL(EaJ3mbaUlHUUs@+{-$>0ZTpsRysij~opBmiGfs(%CCway{tK*8 zBhq!la>*PH=lg0S5}u#Jl1G{yX(1lgnPD3k11F-;`qU=URjUdZJ%87H@d3_O=7SB< zIX;BW&wThRk#V}XeXoy1XKI;BW#!V3pyt!GQba0mo@et}KLJ=EF`Q6VmA`%%s1Z_A zY3&e(UiRm^s9~>use4L+m~zt-E1vD*ePLRBp(Nx%{K_G4DlWO86$gh&BV3 z5Z?_q{wy*4tY+X~bDJoiS`Cu#j=PS&)fv8I6)xZ=sX1m!Emkb7A|f^5u$6ekCY-D{ z=v0tk<4TV(u^vG0R=|yYl`uH0GwNE*-%Mq{$hWG7kI0#N_oL{CXo%gMtZ0`+0RxITxg7Ytn*OAGGBT$1&`-qUe+A5 z-g~bqX#aNXgn2+w!U6_n{Z4Fnn29zs+rJk~OA!bKGS*q}k<-+1I(K#MmbF%16bRyUO+sn*c^YB*UC zYiE)zjGaw}V}?=?5i>1~##5x^f~Rnq@X|ElN59TVq(VrAa;f(3SkrB5n?Fj(n3m}# zKBUD2%*(Q*xAcaNUf&~RdgSB_S>i1EKncfb~>85wZ{8!h+Fih_wB&2 z-6iw~bI5>>^uJWMt--w--&QD&3-*0Te+!T49Vc6Tu^?d5c<(%%kDopw&8#AI zZxxG8@MS(jjP~WJc%xs>zpEVQ}v<3tJ}9W9Tn%OUu-JWj;CD#oJ9qt?IZuZR{- zPv@jxtAz;hNxcqjW?R@VCEQn^P8|1yT0i3%tq&KoKvvUoN53zw5ksfhvx(aS*-v}| zUey$6(emPj?lCKXLxVCRQ*}G$h23h5H20X{YK?rlkCf1Th(u^m;Z?FE~)OPaVn`g>YQ45spxEd)ftj=o8y(<;=TJ@Ct%5y6!~W|cyQ4g{l@ZsvhGv1 zIZ-bI>3Dhd=>iSkwmlWM<1={7fKA)4`G(6dsPK=$VS7thbxrz`=_BgSp8ah{Mf9kW zA*?R1M}I?JJY(Y07tFV9^4VsVRzSa1ZqnO=PD^Ylb@cENh$O%h$XhQtWI`*x5{DkX zw(xJ>;z!L`Q*m4OA_P#2o~2d84-Md?XHR#M6Q zMlpi)Li6+=^a}doB`<2RjiV?A{l;+!NfR-SARR{)2xr|I@Zxm9B}S+0hjb|1XOex_ zaO;I5qjC$bA+04;aU->)x+GTpfE4^F*Sv8AOo-0yuJZ{6zStwwHO*mgx#wcnVQd+Z z&3%|Fzo+LK;qO<6XlQ@wX4^d7i7TMqKricQzCW6&Ie+nC>A>P-VI|3!WtRtp?L;I^ z_40}CQ&5SB{2m6?4=4NW>LjkhWhgT%Tb-pm!M`KuvPBv1_P#Yeag3!_hC4UAf%BDT zmCv3dx}fCpWq(!aE27T&i?1QR^xH6N2PxBidr^xwD9cjr;hKflU@0#ggHq6#S5I^ z{3z|OJSrsqS^(W!qK%WtKXa1*nny>U68^ZhE!g|?E2jqkym{dq6eO7jy4YP{3|b0n zi<~aOfkBv<&)i5&K|8D%C75dR46j%o6E=TI0D5R%4Jpju)k2HJeZ^lR8?4Zti9F>F zTZ|!RQeSI6jCr8W|Kwp_1QIYFUkcShqZ)n`1=~EcUM0YE9km1@$IUY(q~&$zt?J}I z;$4A?R2`5uRPCm^bXQ9_A z<^6YDH3A%o+~&ieXmW#Aqmr!;LSG?sTS6IRF*#pI{R(XgVK>tIDG=QG zmIid4+Ka#!&f(-@Z7FES4|EzWik9xZ5qN|jVe5#Bbx07#M7k2~m0;+-A?2#+?&5RY z=kKG$q?a+Z-5CFclekIt;q%ip%@7c`%C{6c-_Ly9GYvuiWchyg-6V5GHZ{nmuwr|D zc^jk&C?_;p6)1cbKRZZ?@Nqk^vC)eMR<`^sB|fyO1l~dA>nX2}|0*KS#Lw+6Lk!tq)5YBktmNir8N|L96sKt`W1JI*(bRCGA0-Z7HV{od$8r%#iV7xlYULJj zY^s)mpyzy#@!p6xV|KtPqhvHr$>BbO)!*XAb00mzbCO>$X;s$2OZ;*IwRmEI)GH;^ zV=wcrA)DGxU3>8Wc%N}99EC;4CZ+{D?;pLCIfgor@NMI)p~o04kdM1ZFGqjf-m#Jn zVLBHci@t3pGTSuN z$r9FnRB6ja74-Y2gJJnQz3DFy0zwX<{WD(e+Kir$ck@V{IT*W2kWjY@HtiJzwZIoGh8K zKM-r4aqCMxw=?nTsZX=92+_xu3cyJWYT-7SEL+=xD*Zz^ z8lhF^X4uw`TK2{mo772Cb6eHl<+tL9zOF|9>$7>E^mgjd$s8tp{*Q+$;Y)-CqYlIh zx-~DT-}zYZ(3)EYMyd^?t55SzV4Xa4d=Ru(76~0phHgEpyhjWYe%y1Kow9tR8daN^1!RG zLda1=3RyLY6pe=g7{F0ZF6Y$FVG?qE7xfcG*pS}kgKwuRL|%^HtquNbGD0derYI=ehb8CXVdFaE4+hKnlQ(Bhz+|ZcLKx zo)imy1!|dhM6H^XrSu7IO{!CoqDnMO0N8BMulN=|(smI+PQ0G5sPkZLQiGy#{qSqH zYJmoLaNbd2g0(fUM6k^$j z-?P{+{56y0;9ZaNm*&7bl2xfNsB3CEyrBW*&wiH{`H)DPH`SPmaC^4?@AsVy~ueU>CGuKnoMz7MWwo5LtjeRe<#Ka$d6}q%kOha|1b1vqCO!c7I z(4@oTrHCR3c)uFLVuWTz$N?{6DS^R^BYd=;(sZ`m>SY7-n>>RV`>`6 ziScpjG|2$kbZ-RSXb^D~1xz)Gsd1W8SAt!+rGgFrVq#5wY_?I$^XJUe18?p_T;~8Y zqz9xT2xQEn;5t`e0!tHn&6ZYHAVVVu%-4FiLKw1izHla^BK9`WXO_^CI7IuMF>8Lr z<2`nR_sdLa#q3tRjz&OFQ%JLv89XjkXwT*!9}x1|c4Jpljxu@1NM4Eq4-H`j+R)$Y zDkRjjY0FNe|Bk-N=eE3fk5{$Z#|B6XGI*66Nv$791(M1upcTb*=rO)ZJ`=w>^x!D> z!qbKsm-hdR!24NZm;7UquB=btS08D=c%0&73Emip` z)ww*#h_E~Aq@z~Xw))OUN>j;dUY+W_P7v;}&{jA8*gx)F@64l`KA78%cN zd%%e$e1A0PrSA5C;Rcdr9e1O))jio}OrtNhv8)ijydaIAq`;uZ)o;xG(JrBg>kl6e zP2X!>`K|{CUl{x=vUHiBx7xp|qCmM;zcK3g?b`V{*vorG3^rBu1(RXn6&Ty%S2$8c z7&EXC@--zDv80A{JQZr3yGK6CghZyk91we(pm#<2?(ap~3yL9(8+HzhN&VRL!3ato zw%nejH%?W?7&S9lel;%U9gPP5jTX)Wu)d!e$bSXI-_}xL!INIf_ft~%>~~-$6JcLo ztMA0^^77rt%Yf&smu{tubc6Auz)LBymu`!tuTTu>n;dV7rl@vfpsa6M%Rg*}c;i6Q zPOlnTlkTB|3%Ko+dI=x2kvPF{=^}|zsib;MsSaynq>`%w^XIXznqIUlj*^U0h~)I9 zpp?^_@to%7W?Ut(CFzp^ZQ`);ZMqtWj|8aW`yPc?Z9HB!R|bd7#41Zu1^tPxTV?cZ z@^6u#g}Hr(IO$nNU9Hhi?e%9l6$tgs*Vq8$7A z?aYTkS9-1?L+0OXIDSy~O9>Iy zXb0yzGr2;a&{Kq0nteR{W!~^tV=E5DJ1qNH_)rO4pM$yi39$dYmelJLo=1R9{cZH* z;|j?qTV#Mir1e9-In zMv6#1?(TQ%9>-7(&?NN{2IoZ#X`UqCOxYe@m`;y|-wt-&`>xbm1v2oP6f@(l&`6v7 zvtAmnkHfpTVHjU&ByEU5XBw}&e{7-34y)?Z%pxZ(ru#{Sa8dM+=1#*k>?-tN%n7W1A;5=zjZ z5w&R!vCs2v)QKH2W12@KPtW{$rKvPeBoawMl_1OwJ+R%7aT6K%{tB>V_zcPUO{bSb zaAazpYM3?qu^G-Tf1Y0v_%ZnL>?;5kLsF8WgrrL9*xs8?qwsen$hBf@;cyf!JH(xP zL=KrgD=dSbGRJ!X7=d=?KwAS%t`YQ6mf>G2OHz6qB_!>FQs?q^iL-Vm)|Z=Qp+ek} z`PmPk0`{A2vNnaC6JNXGOIM6FT6TziFWK8Y;l~-!f|D90%&W;{C1iHV%=tnL^e)pE z)GaDQHOz|urX3_Z!q|| zzk3GCXy|NW5c@^^~aOu`*!F@wl78{tU=wposI52TLFxXCh)|5@!`Bx zHayDobFD8U%y<)T_39~wIHIL6o>QzO<~t1oe2A~87)Tg#CnyYBpn$^8f5)SUIs+5* z$|wF@TUC2j2GIwvQm#i$JO%wVQq+XIz9$6kGKxr&2mN5gs5dTrVaZtbF7kT@9NX!` zokpW4sl-p5Fu2OiSU=%0qtc%N(i7CPI*~5eCMZ?S<0#B!I&@tzPe~<{qr}UZF$iL5 zg9hpl3*~vsqC$Y^ApzVO3yJP%n4kr9P&%Oek&=IctR*Zh_*@BZn;PorkSO^RdK`R_ ze&jNh<}C!3r^`&@+*U@psx*DKBy<&U!CpY|R8o9REp>uQS5kCtmVSd$7-Ur63Zs`* zzs=73gmZ4=qWWK*5Q5m^)K8IY+u8uHaxslQcA^-rLw;1!%QlW1z7=?QV)uN8zYNm+)i?5aXGuC6+oX|u z0r(6@FIYOD>;jE{O(qvFgE1mqh|3^CS8c&S4;>_})X^C)qrZMcXXT@n3zr7$+w=ku zzdNks@IrNK<4--K9*p{S`8%Z4QH|W*jt0-b1f3*xOrCcttNo1KGil4&NDHi%QrM7O zLY7Zu(jeK8OMmWi7!DI^W?!&AwxK!Nn-m@TV-^6u|)N&}eK<>pH31;p2YvXKPC@~jvH>g?i;#2m_5hg&X{hGEqCl1mcd6>XHfwH=V z+>cLvEu$N;!AUs&BaQ5+Aoq`h^6QP9))@0N2PKa+y~Dqg8F>Y0UTaMCRAQY;?KQ6X zAg=%Age9N_P|mf_hsNkqvHU_uYDU&2#E5{4a*d=a0rbwc=4j6q(85$+rhDUx5JhFKk8oNV2q{g2bfUk*-l3?2c)Uo)X+-bQG#8vdVe zd8!8Ihk9Wi4u2dCTL zzIpSlI{!3LUncq;$l^IRh%PDy(src5{+DV^WE=O(8CJ(8qEPAwp_QrLXa&g<##(}Q z9+S#q*Zf>h{A~7jjAV+V@a0%e6&Zhh%~iOWjALygqHw+HYY6i1m$h_m0%31=E*0lr zTK&$KpImhdG4YpsjY3Kl>EkQV0sRi`EAE#^h$NQ3ya{CBG@*W?U8LRiW+!^~=-l%)J}IP4GPn7NbQgcp8!G*g%Tx}dn3Dr8o+WR7UyX$P z53K3UY9O<1Qeu$2c^vnc*Yy@6qbH;CN^=CR5V&9#^HUa^;?U zD)0WEZ`wKWmXiq{#uYlhs=e*y)N8n3nL}Ztjg;%sr>Wi5Y6(HJ8=UU zl>mn?uc_1aw;LDtgIC`?P4WQ@A|Fd#(*1^&E1wmYNW2JbRx>^ zA=tSvIY3A$v(s2^82`Xlr=cD)@9*UHV*DudHzG?3XX1)Op0v?x)t9n0iQ}QS0Ar0_G$Sbv)pH@}MV_NLka98n2#ugbXmTxqg*= z%BG9qFRqMU3y`ieAc2P1k?nWkqYz=d~T&-UuE91<{;ZZR&bV2+Q=deU!Oig5EqYL@@|v6Jac%pMzx<)iB?zoTBa7L4!ozpf@+GQX670{ z1=W@EvXijl?+EvR7Rdh@0RN=J!;tN3FFIXq<0feS;yu9hx0NyiTK`C11r-C5) zdZP>9A;ac&;9LK{oZ)Uwa4$*y?5E~{UO58AU4i*TaTQ->a5O_w@l%^n7TcdRtt zh9w@y(L{J;BsVlsDgk?^oG=Xl=Ya?;MO}jUs6@QL2WS=A`goY|L;sMS2+^Zp{hWii z8i)mk3nCxy2W)A;=^wSQ&pS51xfgy96(pq3f)YqSjKqne$EJN`;*vU}mldJcJ7X!h zw905k$XEbq8$y-ayI7r$25APqAx^y;9V> zz?x)@OO4h*xYtSx_4mM;sH`)QT_*$fwi+rO6a+i&48^+JVqON9Pb3ADgv3Z&3y7ZN zNL(ngPF>0}dM)r0PQMs;*HBIv?Wtt`8o-|vKSh6#dB{=Z_ztB+P#51O;TQhsTG3#J zJ&z39vslm!2WPRG^r$u4$2da0nXAsOxzx4kQrue1q`7&Uez{|Xl@ zpC0GHE35{eYhKtro?s~X{Vt4AfJ0?}f#rV+`bJ*}!JmYWOV#LQ8CiZz>h2*n<@uQe zVU1yTrk}*ISM*Jj&R7uRMvU?2-6dRaYy*Sm;XF{11Fiqz*T8PhXBAGaN2(a?;CWiO z(0H&TK?XDdaar+NR+DiOWUiK1URicQ*>pu4^<>GQcpkq#*ha7&a&v}v$+i7Vh2icg)s%NPrxCVPMHezn&SpwfqrsgT=6K?0odzE?Gz+e_RVdE`Ij|f|C*H9h~;wrKk^ZA@Ps}7}tJ_tGCQAZFAAsOij;S zt{BrqLd1e?*PtUuE_an#W}HH>)HHR%ZIVg9=2~=nEZhmfZ;7@-R|u5!oyu;mVf0CO z;w`J$4xJIT>WBs%`3DT5;FBkY5t>3ja<1zJ#b?EkK@Ng}C2z5y$J=ABQ`ZC~?AfxC zuUD|!&q0(Kp&M7-A}H7GPDnZ3?!O$t+A>_Ug(&pf?H|odhmHm-oLe;@0xz*BW-Es5 zKxHZVX9g{V)|5$?Ohh9FE^4(FB`w}KR52*y`F~=T<|DdlrVYtOI0L8*qfTpSS zZ``32o!!;W?ERH#r&@zVA`P9l>Kx&Df`ZCJLZ)}8b86Yzx_y!Ob~qqD=+=4l4SA?|Aw5>2lX~U z378K@e}N2{F;rh%j003avUAv6FL&E`#;b%(%M6sK8|c^#SvXv=cz_kgq?saw3Bs}w zfz85Gt3Z>Xob0UroF1TphI)dl7jB?|b&9u*Y$FvU%OI)bp;ltpY<8Op=+lJx@jZHc z(;w@QuC^?N%}C|CyM4&RT^{Ua{BmO#stOjY<^CvCzB;x!(Q22=$sQww=LQ5=TCmcn zw$q&1d0i?7i^%K#&6$)+U@zYM=Wdj$V3}0D8ub!tMg~P!;8U`coBo=8-tuF>S-So#WovMc+#nf^Be%^_1vkrqi?yd<_>_Gw-Z_rq5`IUwM(l20i&o&>id z#Vr6)3_asG$PQF~a^UDFEyxxk0*LYCA}xW5=iFLS3V=pqneeA{uGDRy*$1G{*Z8HA zw>=C+Xu}TT3zE>2bT?*P^q4Ps9rdf%hUCYj$E@!t#5Ae?$s9`_abJEple#ki@Xav6 zcEbxR-R|!@DHy*+|2331ZWl=F^PJD>jShrrdOjM=BhBchEm{xGoA9E=m3iKdvq~xR z(huNi4Y)%vH7%kLdc^&PZa|f7$9K359ngq{S*KYxq7&O}g1fXUS`Z8QlUAPhuIHc+ z6T8YW!L-XsT+8g)!e*e2G5Ce9S&%Yt0Klgd(BGU7pxWjK*mHH%59=9+_e=rWm3(-7 z*Jf$)M~4OWH({r(@-^ND)Nr$)Jq%4kZQ=Cbe|+NdD$& za~991O-U{Arp^w?h8%K>e0|(|@i3v9|HuCg>N8iG8t`)BY1ib`S-4(XU)8AEQ(k@5 z*>@*va*H));iVv$i3*F_zm@k)ntvN3wGQxiUgu0;YroQRSJ9*nWY;GDM+}~ZQDM##u#aJlCQ~8v^EG01F4*fnu-H_iOeFePU1onmAi5qI zoPTnA6?+;u z@Oyy6vrlr}!0V|Ff9~vW#cN}_?yuz&%>unE=dQ@>ck^Aq=uO82+OD%=hsFAa0j*{e z$6v&OiK5coqK=8kNWUr|spqv|cfs$%h!oNeTtdSWW)uCSD0k-YMRqTJ{Pz6W5f%S! z(Q~zle@87foB8=((spF4mh`Jv%@Xb#!M}Kt`=~X3w+!DOpK3N_T*=M(`;9RqM3_6l zNK4)=Ie#P0JPYmd{~}NMm9bbei84?!Corb=_d!~hPdUTmq0CKI2c7b5RW%&2Re4X)@(;rweS~#qD)V1FEH~!_XR5 z(;Aaa3eF>vOPE}+dLpvv@H<=Ru4Y;QQ(U@k$c18SK89q&yN1E|%u>M&r9F|oxmfI- zd3f6S)~=X;NYk_3Dh5~+dbo^q5I6^!Bj{9h%81F`l4ySqykJh4j}IsWev$UGt+a2o z4vs=rE_)%@B-=k}`5FgDDSiEL|=Z24fw^~*mG6Ce<@A;sA zDc)O^W{HwF-|B`-*?3rezmyIS;!n*Qp%sj7Qn9B0Khd@4BZrx(x&k6Yuyr~{QC@PU zg&j~sqRDqVlFZ(>TUG`JPm2;wmTg}mky~c+=fiJ57`4pBXQq1mJbvQ&7#E9?*^!rfO97&;{+04L$74)b@I}e z9&RN*Hb9mEL6hq;miN*227sp5-&yVM!)UE4urur=py=iWgbLPifAFs?LNZB}hBS@g z`Fbz=27SJjj8BZ@VSe0v3t|Av5`39*g~tMDN5?!Cv9&IM8lN%i{AZvGRzM>}ARYVh zS~}c%^2y{}qU?(jOl=$LO9nE(WAO zXO<;&UanQ836DN12>g)UT&`l8B^0%{+e`}=$B#SpuI(K$dfQq#I#Kxc+f#2@u6T_K z0+HyOx^brHjKsOYU(4Ecf+9|ZfVHM&f`?&s3~+GwnhJZ+D+%bQqWTs}Lr|G$iyYvw zAhd|55q4Cz1*>j*D0xna`@Z(A!5ls&Pe@$Czz+9<*nt(*LNwL>C>C`KuzS}MgWQ`0 z@m8xpFwc&iP)G@13^EsehJD8Ho=gRrfg8%FRD)_;vSlgxsTg^H+Q6&43Zkv$9GV|l zsS-HfRdpi5E2t7Wb&PH&TRJ$xl?WSNfmb0fdxr$0jeI`HSy8EEv8d5bqrzQ~m(j)s zP#j4kM@^DBrA4OJ1+o3) z+dcKhy#+D0g|D$`{3v**joHF*IZ}sFLNu5f1BZ*F=dadk&VroTG1sgoj(ccAAAyJCn_SD) zvDO21{A7U4nwNg?Z6)xhC_={@p1h>460c^5B%Fjrk4UXRdV{;+%fspTq?@E!LXT0K z)`D6hDo|+~O$WQ{$&UgtV_6u86aHi0t>HKV`Cm$Nue9(UR5HUL+IsruiJEWW)QlBJC2w!v4+Id2dJxE86SJ08`<5(8Nv?j>e?n%mk(zUI^@VD8F)~G#HQL^VaRs^CwDXm{tpCVVX5pt9p{W-eIWQ$am$n0 zo0-|WEc{L5i+jZ_Y(;KtQXyNgM2f4}Y4fRmBbU^D(C9=|?JQ2!%u)@oB+Y)Mv2$}e z{#&8jL$2<4eHvbII$ryI*V<}<`ihN2eALA=de5!*ls}e`)MP54x|x7t&3abg@n5g2 zRraq!xJGg5H1*6Druv^6-B0nF50 z`a259_q${94tcoQKMpjI5oZcL&KG=RL-djUbfH%j5&rbgjtQ$5(W9zJsj$w%#lcrp z1TI9+$|JvXx>}2Q#%AGq9~37fWU$6FuFA|`eHk+$%3?{(bJDyu4X&?Y9nD-{TQJ}K&iI40;q~pc@2i_vtKT($*gCVM-<+Qk>=?DcFv8I2e>LUuVm7}| zug|-u<4gy0Gw9=g-R;qdR z$28k8UnI$bI0-oah9{4)$a4KwMoT3=v68~rKe6aJlS-+r7f!HZHD5dmvXEzgvUpL! zHFYxZc78*utFQj~w^3&6vwsb>n73DEsfp}4Kl2iwQPC9J*Qwe^486U+8S24WxoTF~ zcDnJ=!V9zi#Y$GrN==;5(>j(8ut;dlJcr!~(bP~6@r9i0_QDn3&E2;xhK0R1x-eL{ zlcoC>*x&qvlIDC@#$$o6`LzDV_R2qOhIqBpv`JLgQ)c6E>hJF#5}?_oGo1E{Bc1u# z!2#kKXR_!1U8mVU;FO{VUwr7ZPtMk#DM4v{*k+q_e0POU-+-M?UHjuI= zDvI+oDhi7YHAAO3FQckF86)9j{^wJp9NWWsBlK6##9dF=ZAnf|C|GmUFK$J~lEdxl zvlQ}Ko%9NjR8_pqQ#~$~cQlLxJ0FD+p3{F!O2hLAHU(9-s3;#94F!04Y*z&FPf*9t z((FRQ&|N>|NJ8cCo?S!N+1x?Z^WgJc243w@ab_d9DV^b4N~4g)aBXZlH^T-`r!U&} z(J~d}pIC{yYzwCr|56yEEe!--7e9J(AUV!68S2*tG0iuK*o!}>N8+V+51B#Z62@o^t+xC!E|*Ds1`+?C z@6UgE)2_W{tpewsV{Z*WLg$1nEOXlLD973Y-HsXbzF|Pn>D=`3%HOd2XC#VKwi?1) zx<;;bzQq2UtqGASVk;NO4=iLLV9511t0xqe(6&?%_DobjWRs7-i47Pg;g%#eFW+kV=p8G zl(ha1Xp?6!WRr z*W%}o7H4=!{>5Dt05}p)VI($h+R^smFJOS_f4-$#X!=$aSc@~+zfUi^Lz7b`+ob5{ z^fx2qvJU^zfPZAEpz%(|nSn4?Z%xv((oQ{USfq;R0q)FfqFed^+tfTQGWKbC0Q~{*5I7bs>$b>k?Wu zq1KHTw^d411;MbmCpk9%96IjEK8zQ>CFstXc+DXn>vi5j5b;I8k7*`fwwLyOxTh5aZ)#ZcR`v|Koq&(H6Cx}AqW*!7UMWMM0!~gHRr!2)~Y4_ zIQj;=Q9!MnL6)J#0}7rCXxA;r4lS0KrAqtZ7yfnE(?2jX@+6DFyIRz~g)rKqIvn6d z$o0ZoLUFfTjbu2j4)leR7U!{d7Pmopop!3q(6H}F`YpAkL(1Mxg)CT%rWaWuDl6ebCtG3hRb^RPX)jZ)Cbxiv-V^ueIH z(@!Y_csuy7j?}`q%X~OtFsYlk6m6z6Q(2z3Ti&CUoA8kWYCnM;vwK}xC|mm#Vh zjk^K$je)QIz%%;g4tur82eqW>q#_<)=|OMbhPYZ> zrrD$!_0M8w5vnhs?ur)8O~I6Nyq}Nrc!W$TO%XPa_X$KtbXug;hi^_uY5k}3UObBb z#%K6N&Yh!YH} zYza_`lZ$$mXR5y|n-fFl*WRPcZ#Te`XFSG|+?w;|3**$f0DfB669XwD^<>=A8Mz{t zj|TPh%Q`m0CZZ8DLPfix-ZH3; zC+HhRf_s2q2X}(|;_e#UAq2N@4ielgxZA;k9NY=+?i$>JTYv;70bc&k`~6lub?=9} zwY62-J=?vrvs2wO)&1+Q&~^_2!oW9rwM<}Ry|lV#pQ%%k#=tjg;f$Od2l+g3#lUpL zhe7SjSPyr-{i4mCdH0~=ta3r^5F5<-1*sa1N>X;TD#~IZRn!DnMmbmM7CkY+U*c@i34IT~7unqe}kihZZjv#=?W+A5d^0Y7=Q{>~+ z2j2_?m0WF;u*foQn@BGn8#mi9GftSwTM=vQIBYn^>F)xQlu2Hsi9kcI_rK`frlA>n z#Q3cFIGhITaBhY|%j{z!#xIQ22A zof=17iJ>Cn3`ta@y%ko{RKmeE0n(3fNw>aydujM2?8Mjm@pAG8+dP9GaaIaKGFkIR z13JPVV7Bq|DfaT9q`21>?+kvV0Ro#tqOjGZup-MMpi|DY$!6p!O+dO_)Js7uN1c~Z z`AzX;&7wFgvvD=JRkYFCMa@Z)G->*fM|?#WdPu<2UDN)ceEO0Rx|)?Kwmd6P_?<3Q zg6y6j_Rb}V!VPURF?w)tt)Jui;@@#z3GzDL;r@~?Bdkk~TP(x&+L2T2#oia&g{NK} zvs~FW+hR+2kX#3q`Osnq%7U-vWsd|k`SwlqyW&8UfGa+C)Y3!n0j417fzVM2T3lQU2v7^~!H&C~Ar!7fpVIrx?n6 zNIn^~%Z(L6d2?aZ{%m9-@h7^^kSJ<5L|?7!LfW3hWk--h7*JK_@^dFKfX=!!!29cYy&;dr$dRy5?_M_ zf1erRx?0ng1;*nl5B#UjL`#dNEdkHW7&0TA7l!nQu?H0=Ba#X2Lyjh=4)L{^Q&=2wG7;E@XkStG!W|klAH-eYXpppe~ zYIoFLqo}`ofr^fB$SCUcQZzUbH@@15MxWxf&pXyp;?TownhhC>jM)~`GpkMTK9oP_ ztGY5o;NbDUxWNrE{p1~k$c$i;;vK|Xq^}t4;O-^gG-bP~yY zmJb7rp&zi>9#{@Ao$0p!3Iq|wO$t=6^@C8f-hHoU4YOIfmxFSeGWLhZ; zYi_4oJ;BJE#Q||AdrS)IE7^!AWF5b4`fT^+$EQH649@L8%`C+0F#lT8z{?S!SK1AH?$ZnH^0JGw5z*n*_-UrVrM`dPYe6 zpUYoV4Cq0;xn_yO=n&udy;(t*7MVCgf0-=G0+mFbuxc=vWkI zoLd)XM5+zkt38TqaM%(*JRe;HQ9mAvFl{$-%a7*55wAt=7V1xx=Omd7QD*IS&NjsE zRwS8>@o1&g@vcyEPNL*hP)tb;Dm`{l%5j?C;Uis$i-zA+bRT5uf4e$BPrvR_ zXV4BG|!o?rfme}3=`kjcG(+VWG4yLeQ)OTXPKq#dqq!PpSVGp}&EoxLQh3vjD`t1j`E z4arz{@kYcMLx0JmO6Lh4h7}b9XlZrZmu(3Re8a4w?K`S(+V>DjfVO~QKS>!+!~2g} z4d!B49>Khi72$Oy093f~Ksl4vIg39dOQd{k&N;zSKye0`#Q~$L$$ROic~|_qUN?MycHx8s$Z(mcHhXGl6KARQ$sZT}gO9bK$d=Xxpl)PvLldV+4SbQ)zv%!y3 zmNPda?+r1!z5=|zTs=V*ZSFc}w#LbLI|s`JVelES3bL8#n$kpsQ2t(_MSpTh(F@+SyVPh(i-6h#;i6f zXc#~9Th$~$^QqRf<9=YYAu^YHr7=U=VNZp1Pt^Lyl)c)ESSvbzSG@D6J@%C1ppF?m zSj3#~uxCAT@Zqgp!P_Nz#)$%1Q)45V$p=%nPuSDB0ICR~)Fa%)+xi<{MAo>)14mKV zCc{ts_jn(!q!=B%MCJE>Ph7z_)MkZ{NadDT;C9idW0OJTP?-aJRVP;$KsK@h+W(Z| z9eGD~iA@jA136LN6Mk_2Mn4C=kcA`f_4xZ~$x0i1yFz? z#qJAd^1g1NIjbMb4~%$Jfy<2@xcT<&4MLpHa|0*JZfKEtH1FYGJP8}RYW;FC<1LB{ z{4{yfBNe?U|J`Ppk#G1O2mfeTw-I>9;{1esSQ8s`{F5;XM6%23QAV0R4rK}woxazD zS=eBMFa|zFt!9QSbBQa5R_%ws{-cpd+7$24rgiK=z0>2y(83bny5q)QHS1~vHDB77 zrK~~LVtbiEs2CsV`@xI>|6jqt8HV`i7$&seSu7hBxH&CESgs6XEI%uS%w4c;TjVh7 z#d;P&Oepje1&`*I*k+#+QO?x*C8F?i#wfzXPhkASEf@gtI zJDA8O)Wie9lJ;=}5|mMb=o+`_`cp)hLWG|u1o3O4!@LXnajtrU`=lm_1#gN6N6NzNdMAm%RtG5kjr$$6G zc?@3!m_+_RF-I7)cs%J#EB${>Y0W`vMr`~UcvJU^xVt^O-Ts2?ru6payCdK}%j-@R z3B5`$d_O@F+1W0nW!Fg85wa=us?03{h|D2;&I0^0P21U}aQ~V&;I5~LWWlL_n~omn)0}i&An;#*^R~QB3oB6)1oGK5uAMCejSftBh>om){7Sc;#BQbp6_2!JJh$+H zvudjlLdq`E^_w{;`yOO6)8_=og#AW*awUVO{3+)5MU&2S2b{;h7xU7+z#}BE$mF-j zy42UXMUgxKwSxmDCu2y0ou}#p)Xip&pMI|)<#&r%X6^cwVfTcY#cCO2I3$- z$3q_IOZ3mi)sd{S;BqbAH8qzV!gUt;tShT~ZOG?8YhGWZP4))PtUg!%arh^QeMNA& zSfUXb`Hz1Rt%5ypO07kXR{%2F=fIT}+I8R3siFa9_|> zNXh(9MROjyAcIgx76794-nmer!y8%0 zp(?U|8xBOB2o7-%;v&bnNR4S(VMf}hogBKgf$?3HE^3^s;K zd+PsetXjvX#d_`jtvt0$4uXDR7pMOrYaYY58qnxCWUMW<7eE3HU+o4dSX2?Gm5%@Zc9kM-$+SgBJT6NzZu5cxIf^P3?;6#P!b%RaoDWZw|?PTAmlg_)F%219NyA z{p5q1ZwYYaz;HDIb?$$voTMNYZYVcj7n>{wwxXtaBHlg460~2;J1PD!#}C$QIP%R0 zyk6JwRN|@|Nul<&u{LSiA?XKih|w}y;*-P!4jPR5*(T74dGpu<`6wXG^Ma{HyUIDC z7SmTkXDMN!`m4qZ|LVlhhYQ6ok}3d&B7m}gqJe?oiUn4)0`-O1k!q?A{hCf-=YJ={n5#7V$nrrc#=qSCZGr+sEI1|eFGuuL(k~OcHQ^Q63c%r` z{X%^X4_7Cr;`h}za*4WOz)A_0*?lqKXOC#{pRz!EIG?jgt}q_2%zk<6L9Y#{)eSw{ z1oNjK))4fn2`}mPq)!m+yi(-u*OWmcEjF276L@aUagSBcqVRT8 z!?Y9IVs6%Ie!{#&av#6vPR9ZwWu%x!95<(HEj?=azlBb18Mi6k?#?ewt~m5V@$WwC zV(z}aHZkQ#wGJN0Hx`?>Sfo{adzS_Fwd>xawpY$vaBp(on->%V(tgV;{n-cW1s46p zVKP~WzA=Ef5Rbezw8Zm5W)dX!0c+ib)h;&xN1~^LlIXjD{MpkczYPjB1vU9qzDcdo zUl_A^UCNxI;ddRh4yUOOFG5Pr9FbaqLxNwK_+h=3yz*J|Be07_YbO^&g9$GOMV=pe zVZhBJpG~_Xyi*o_L~qe+lPgWATbEG<(bvr8i515+D3lY{<<{%5^4nw5pdwE(i+1vX zDb49Lq$SSIB93@)i(8)Dc?mji15q>OveD0)$DV_BhnOVYMP>bl9Tctd*<7qZb#xeA z+8x#YhxxMH-o9B>02i~Xt{Vq$!A8EVtE)6T&J-0mfHxb~$!YfSThBW_Q)2lE?w#c{ zVvd#_{QKgn8wnqC69K{^?`HwBjm7g|Gw;CM+=oW#N{SxMF#V<)$|}*j6lrW{CPvBq zWd>(j`CTydK}Bt!&nd&OBkIjkv6>k@?X0S+0HAmq^DQynx=kAU@vLmZWGXjSqnHs)Vl_u}IWY*TtO-)NgbzR7AOPw<>`w}ho`uJhoK?w7RU zEw(leKz=Z25H{|5AOP&rV|;UYl7&gz#+%c}GBtIGp{erRj>Uj#cbn`0p9y!!bSacq zx=%+fZbhO6WYd+3Z^VDxQZrZZ)u6?Vu_pN4kvb)H)JjpZ=9_IgdTc=UwQPDil(r2rnl!b~`JjiLw#DzSrPf$BrLLA^Y;Z&hNJ6NQJDBBXF*c%o{mGS9OLv|9 zb$gKq3Oe>Q?TQNHD@bx*|2rAuFfmSKGpi2uXi6ej0HkWeJQ3K=; zNXLh^Y|IA)je`xGx|;<SBEcW9FliA#!B5phg0@l>pZ_wcur+Bj2nf4XZsW1Kfn41`*@a`@| zTGAcDNoZhd0*QS2bmfcwrBDL~Q6(pri|oO89QRXI0%Ba^%h)9~2pS#)b zTQs|plUHyI$M@dc@l--t{C)>`pfa2#Rqk4Av}jn zs3*BG8{-dO1arNKowF*q)uH*h(X_t(&p`Bw@!rVe5JPVmd;3W1)irncV;3{bY&n@4 zl(!{YHzTK@0zVjZkbuAJ;tF&i*|NW;jEJRB4{Xz*{EqznqlI&STdRPC>rXtM=n^4Q zg(?;^*HHq#7_U7Sd&J#Rc07oxZHPTNIaZ1p365zF9j<_mjl<3Yt}ZE!P(@?)Eu18V zxdFah_qC;w%G{oWB7EQK+l_dFo^JB=hQLWlH9jjnlO8MZJ8^a!`0Q4YEK$z!bJoUp zVpm{mrQMPYxd1La*zZ;$1wP*jnbh0F8c=cdJm z;~yC3e2+ONc&y%sGEl|@i)D;zU&Ux=aoIo4snF0or{d-f_JS*t$d(0G4K1||+TR*5 z)lxI;4p%9u$UQm-HBn1TKU+v)_@*k_TotURnN{^|-U__VtMJH_prxztN-f{0|1(wV zE9}O(fF0sPXPrSD(Q8)y3g+ccuxY6r^3qTJJ1 zp+3mKq5c~jlT{^}2su3^3nAt>TzFRD_|uWUYxqqsmrfEpOi@-ok4PPCIE0D%i&zMr!BVheZ(AhARUGYJ>kg01(> zfN-1H2qe4_5}3*!2!8qEm`c1ewl=#Yc04utO740mO;K&lnI?6jz^>T_)-)1t2AEqL zDqn*h&9qNsTJ0u*67USz^IHztMBd_<+q^U<;F|0oOurW?#U@|3wwn&iY5?ccqX;*E zJtlu5j_UCIWA4*qkZ<5&G&;7~J97oowIh8{8NmxP#ID~e4zC$^ey6^-9i5ezYDsUE zQ1tPatLjeD=K^rd)}jX`#t51zRjgQLDfBhscshDsf?)XXKX}6K3SD}Q)Zo%uB1zmG zdQ_?Fk}s~MM87p?OfAtu-$)tSdXHyFS)hed%t^Js6uB@owQCQukH4#X0%fI-e)I$#32T0E}zuvezs#0SY({JC`6Azi!IyGvFn=e~a4@I&0ql(z}6 zXE<4Zu$y{I5guP+C;nXv#onjyb5;mL$|@By(=`L^+UIo z!vf9%K0BBHKsLtua@)UayI(Kcjt51=?lIIRBAIN+Lc~fcc9u%o(TejS>k=*G{D+%= z@y~y$=eF5GxQ*oKMcTf^C1e+6(!f-?FfbMH72}@Arm`Buz3kf$j)chaYXzYeaw?Hh zI`;}SKOei`sbMlg9#lehQZYa>LfjT3gWN%9*yna$Fw!P+(FpjQRWw=mdfTul>XC%2 zun!)ydAMM|P4ld03V%*o)ix~tfqU!`Pcv{^0ihnefnJQ&SOH~9K;WJ^VCC_IT{Aul zKyDqEK;wflPcecNJpwCel(z{f67n(-vT7nkdVy>5`^|}l!=eci=^^aZ zAlu=$Qn7s8R7Ax+_cA#}A#MtcuanDV=*fo#>$qRNl|EFMe@5+ykz(~q>lsNw)~7&g z&W?C^o=d}*&Pr@3mw-JRB6KBQCtx!TOq7*mBMpJ%AAM|WF-i^D?+@A$b(;DS;5DNp z+{Y>e)%ELv7?n&~IR;rIPQFnVO%`Rr17+-Z-IzC_6Cshjibesq8Pr3D<_|ecJmzkS zuRDc#zAErAroY;FaK(e7Ye&acd8AIIORgpsD%Xbz+=p%l-BvDBxsXi!)48e8ToC-7e%h9`%L;9t!ndeT! zzru3I`wrUm;}{mH&GbHSV$ImkBMdekOi3Z(g<#xtBeP-X6b@F>B6oh0a1&fdFl;9J z8n5jbgVy;@lB{4`-~(aAo*D*niFeHTMUFxcM}+SpL8ipOz@CEkPD0<;7gI}2Ul}y( zONJ|P^U1mnN3|Fl8hcE?K)D!b1Rfa_UCp`TPNQIGP|+oOh9n*uZk2C$ypT5=HB!0! z1N6=hn_#&&ys>mCPKGN6g~*j}m_9_+WX&PIj$iUo%@L|1`XSh?kh3T3{#+q$^i_xD ztBz0DWS4Sklkm-U8*i*9l*@&W;awEUaia8TY68a#0p8nQ5QW%8d+{F)gwwKnU$+N) zY_`9#0NHX3EEcd=)WA$HV}x|H1KAUK7O&#W>3)n(vH3A~qTgxi9eJ|%JSz^V>iMnH8#yM8@UXyz!yZ`SH=g`2X zXT3@wZD}HNlt?w`TX9pSl^T*2C-i1)e1e1Wdm*qR~C%Z6pcLG7qDHMGaZ%?UqWXSEFM`HBCw}*@nSPBI zM7+N#h$F6*6#Qw3gMfsACI^i_buH;nY?xntO?^peKVZ@$INg$>#3XOCQIquU3zGiM zPhfb_3i$T4!O?ggS;RQ2K|+=JQ+w?E$Ssu?9hhu_MlBC62_540g%8~HVdjD-f<|Qe zJUb|?wIm^xKJhcD3)S!ZHggc|1NbQ7T+;!;22se-&~bY+{BdHC3Em*FY@tL=@wcD3 zZ5=ow0(1LZep?vg%^qP_OYv-Uv0%QEhH zMW8YG-7m5eL?wBm;9&$JsiuK5lVP`n!e9lXDEGskgspzPiC+U>T=_J~ZUOdP8Z2g%@zQRAqH`N%TZvJhJ zjM7b!KH-_EO-wA;&tdXsiuYz&J_I~xXH7h$-xtq9d188OrwYi3Re)gt7u_vb&XYLi z0L06g1-U$P;g2f=0`o&*Ngt@4esQ%@}iOkW9V1ejtFtntIL{rGbdZ`X}fQl^uUbkFiNY zAT&5mjH4eFt`M-n4GwA(AC}zE>Sb1um`RXlRa@$jMWst&M;inBj(vr=NV{}D^J#=2 z@b-ZQpee+HIRgake3c}`*9$!4U&+}>!o^=Z6@m-5+}@lgQw${pDJJ2LRw zNCv9??{H6zrDgAaZE1Y17(P-CJ}&3)QAQhXs>aEFwjQedi4i4qPEEhsI{&=_h}V8i zQw{s>CO3U&!PHN3gqZg_m&TaCf|9fsrxlal1K1CiZ3d;I6N@YeJb_N0q$+CdTPk@I z9M-WGNS43UP)F4)>OulBD^J1(aP!Spd!FLQH7#Tl=NmuLC~uUcmb?eTk3x}Z@2vL{ z?rCOP96o|WQ`IH2<4CKAXO5JSJ)k+5e;v>qDPZm|#U!=7+t0)MrL`YNn4{WKZXm|9 zZyDt6SgF#6veAjLV9MP9+R($Jl;D6K) zCd}irX)aDj$(ZPY&7;2*eoOqcNBpm07d%=Fx+qC{_Qrhg>#jF-LUKy*hh|f8D4EgT_^3gPx<9$)J_O0 zv#J?w2(Lw8Js0;~> zO3m-mZxwHXPQgE3ZjCnn z?t-7Apno=nXX}hEH|?(s8A34!5d7F~T2j>)meo%V=wWS>YoD2iNs>xLbE(VZ@~782 zD1GFL@LZZV*jky(8SEAp%!DMuwQ z{D}k7mHA(cUM-}?%m}FqQ`K zmFRvpabb6B_3;>*`3F5Y1i#{vY?>PRWa3^5Jjn1o7yIr!wUA}xfw5mWQ9PZxV)BRHuuS7Sx z1doMO0vbG@tCjBrJDWY_27Udy?&8M0a#q*czm$vQ z%Hby)-pLr)?m%!f>glS*5h7g*3$x*-df)a-fJr_%f0I);`&Ej}I%gP*7Qle1y5J>o zid7TlBRPyI)Sm3_VIJC*s(Bd)SKFkjf)TQj9=?R>raqZP5XwKMj=k&~J6eENEq6z& z_(ucq%WwK_L8p57F#}bq(46< zh*9`omb?f)Y3ZGeS3i3awNXx+dOkIJF62FyzpS*oxB)w0bW<-DH^_dOI-VKWaS||0Z93R2}!_<}|CGSUlL{IFTz%ZTVD7 zww8etT8i)0=&XH?Xb(%maBm0GS|1xJB4k&o%6Xo8Ea`15H8d$SmOCp^1T&0jVe=Pj zkRdwaEB zk>Wa|FXv^K&_sJh6puGQ=uOYb$FFRNsgGt=CDLRGFY+!Shc7tZ63aH4U&w+7V{EC@yMVlL#@4{v zE(FiRGGFqV3!v-Tp|QREw3jg$FL|7KV_`KoP_N06x@!TeQ#(zC#t)*;?C!Gy{p}lX z7#jG`lMdgb@Cy++6idb|Om{y6VI$1HU0B|$J3ZFu=F*%8w$z#^2O4@A zKWN(Z6Mg$Pm`@EcaKZD$Z=4GpTwOu#nZ#~SLDbWZsg8KVG#M$$Kn5wV3F(0s#)gZDEq$1E!B{Rqvq!NxJo$-SP3O{<%U z3;$ZWq0FJkn|T_B!CGs;EzmyQ+*RUFufwnJN-ux=7S+KqhrglYEwV=UDLl)*VT%mW z3_)RncX#BW;2|oLYvPz)6@CVE z;!!6y=&dca@bh2x{dG1L#%X4fbgcxC_Gv8jQH3jg#01j6DE%^nR$jDPl=%<&_PkUE z7KWE(7B^puEB-uxiGyH!D_KTuNYF~MZNSgBb)49^5EQgq7H5x8qoff6c*)t*|w4P{?upMI!!JCZ^EGCJEV4 zW79)z6*=#M*agPJfD6eHJNu66sIk^mF|Jr)f$vsQ&wMHD^S@Mj5R1=yUY=3HPExMc zI4JFlQK%wVzpk*oT_548>;4cfY)y7*45oR3IuvgX{XF8-ESehBdU;iX=bbXPI{mAIGxZex z>e(8{A@6{-iPH;%UR|Z3eOoGa`7l?2H1dDXdb$IzkBU1i4w;#kbG%9+{K>KAagyTk zDIka6e^bT%)qASUa3G0McNH?8@+->#kC7X=(IA}b-ej@rJvz8nJiZgj_|IR{20p7a zQP1Q0c{C60k+g@5|17Jd8H@Twmwbf=uf*q>DlKn+riYl)@`@acw=`|XO&Tkljv21| zQFxpx**$tvZ3dH%oR5Eo1zC6SNtWd#J&EVJ5({%%OB(n`KCA)F8E~QtVlEbilmGOy*Do$+z z*Ebg!rZXyqQo-FJrdj?--%sAmy6X*NB>2^Et-GfX0;U;z1geizfj~=ZK?ZNUu8v&> zx{mytA#0MDHSkXJzJ}#^h^A`>rV8`0x}z3=g=2_am-%N>4qZ%tGH+1q#3L(NT243h z2J)8n6{zT|$D>TC5n+jyM@a^AQ)Lsb6<=8r2y9p;YR;-W_2utAjfmyg?;nMTI40O! zgm0P8%$ouh&5mu=utVd567W7m1ilAo3%y$qs9!T2`MF}xQ~GPWrP~HcgMa^^r;Y$c zcTb`JMM$+gvb6@Y6aCE0XwH(`Wl+-K7k2}^wWyCVg!O;r6%S7~GNJHy)}eWmRqv}H zmxn7Tu;zTNT7}oMbCWgYuHBbb)%Lt%nv09YUMow7iS=4T9jOeTqA&h0; zEf{BZME~^uzxPYS5|}Rn^_;b|`eXmro_oSJvx?7;0khrdOY*4d>f-W$#&1*=8ak(~ z^*=MOc@R4{!PeL4a_la$$}sj|c44|^mA`fz;r3bGZZ`{<{%ix3^syY7-vqpKhVcOf z2d7eDd06)ND)9oY56E)Q7mF=W@#WTRB3KY-+%82prJ@8+1Z#+w4;9-i=+6+-B*xpK zMjtdgw84s*!rXxu$_d_TTfgHEX1F;Q7R^>3x6I1o!i|kjuzeB#tD~z;V?WYbz3H`| zE6GpCN-Y5#6#oS5fR{q3+0xG7IPBul!1Qj9&*yT>tr+wj{T8qNd~^MR4bIMdcf7^b zvlr)7r-#k8agNiJ`NqL_ZF~)1h3&mpp93Pa_zmOE5BJahAS*;42>~)c zn)g06Koh*-uy0;h3lIR?Bu)Ak&Yt!j{N>1N1+X7ZSLkf=cNly3&WQQ-iPee(co3Yg zQX~9y>nGo!j(JzfAmMl4nz97prXw^X;k2ZOIIW64f0V2WvrI!HO+ZVml|*0V37uC; zNW$Hu2i||R2D%86ub<#Pk<_l5vm9{_vS2j5x9#WjFrtqC941(gRaW-pRBg-gZQm@| zO`PrUJ5w+jHWjL%vQk=O4~yj}zg0wE8lo&N?~*@iqVG!$u}P2bWE%qNO`q zoOVN&l>5PTSnOApCay`(I{+fmt&j>;5SmC)$&u8|QcEarU8MXT(F>04Oyx5)ko#=40Pe(X=C$iOKB2apC zNP@XO6*>br#Va8be@`oHH=Oe7V3*_dC&D*i6RX4D=Y2kWPY?OjXB^1rJeWCTv} zAOh$AWcs)evkb5&%uOOUp%=qy&+o+zySz%Ktige6rhFqb7;#*dfizgSGu5$XeXdr0oN9z)v!9dSY>XCb^seGGljUQhU=q=$lrzY-{ndp zXZ^CMFW-L+2EcYz6}A%zm=S7#CSBLP?On_2J7m)s-6 z+6We7mh3H_*<7@?8$006(9KwIA3G*SLCUUFDI>V|EMcH?Mh%m=LL zhiaTtAi`qxC?C{bae@E8xjfdY4>P=0F~)_Hr4EhEFVRHcU+F{QR=K@kJ9B!9XeXb7 zA{@Noh6Msa6U^pnR1owG{E`2kkk*0(*IsjFPOnL${$wrg&O_b$`Pu(=C44j+auUqM zcj@Y=!I!MQ821(SJ*@2CeV(_}pL~cveBiyZ+j{m-hP_4+WZ#!D|7c`Hb`1TVLV0U| zZ?qc74C=!fj7u;tdlO59m2oIV3t@;}dPaJl&z-MEo!Vb1oF1%)E=|_YfV+78;`_D@ zyk7d%x89H0*j`B)^2dQgV?ro^^^BN# z3Q8O8|#*BO}~i>co_e)fqe%QGG>m zgT3Yy1A|6ebR>ci;Eoo!8Z$6?5KPP<=x|YRdZ{9H&l9-*-C~kxl0ARIB~YzMB6Dmz zhE#(jTbiKbQyp@Qroef={S+zOk+TSe>FJ_~1Y-v@q5+6=ispqMGmfIg-yuqq z--D65>`m_w`GA1tqB5%iY5ODv2?Zb3P4Aas^mDw!?+(^Ztak-IqRlfS6Efob`Rdk+ z9wwfQo#5K}I%dCWe~4jsnd#^~*^{xTg;5mPG_3=~mXUM?zMnQ9AB)l#{5%9_p?bt1 z$RX2)D3I2BjkRZ=sdD>^1}8jSEAg7QP7AIbt&>AO0E;(#TM9qHC>Q@VKOK2bg-lJj z=Zw@b3v9Bwch}g)VT0J=%q-x6a>@*!e5U8E0IAs0@w~ zCAk-Yzjw6bu-%FhHil?C5LcJqn}>V8n=uzwQu4;CrLQXKrOjixMWt%Ss-2j@3JNbu z2}vC;;nk=aGdyZOxgedId1TJ1_{ww`Ho8T985j+|wE|{cQDsTnC)!ve7OUiPsQgtC zkjw=H;AR9X;B1}Y7MiVq{*a;ZioH93O0=qs+l_aFxiIkJaP_$UfVlONg{fMrvl!tD z(f+csIZ#S-?&U!UtKgfiAHu$NNH5zL?s1zMH=s~WZw*Q{u*835eKc@Vv{*ZkJczID zy!+GZrmN=00s~cw@Y9>=T!?&L2q^Yfc4hY~-pr1C3GLz?JcTxZcN)N;450#5B4Y#W zRqQB+W@g2=oS(Xpk1BPLcqk6lrK|u`euOlG)I6UYnzuXlfn1DmBiDRA25k=rgh?OYHZ%fpB-5n8`lz#ht{yNEc;xau>{TDT?b}cFKN*ZC$ zfLI7gF4J=|dinPF6QWyDH27;TMVi)=sGzTlLw+Zv0Tma!tjFw>3%TZ$GQ<>n1$I5u z#RTI~$F*|6{B@*_{XGbi)h{m)!z7>IcD&wrP{T0UO=%3ApjPn}AD7C0?i*;;lYkrh zYHQsqb>cC!>W!g`{XlKixp83=Eyu7>RrXnhQjKp8{+BGVT?+*=g2l|TUZr?;(qXKo zYl5{jm9|WGQ|z`|EV((-Qbi$IX8CK*ks3g z_*VzhF#nmP3Y=q{@_I$qty0z~9LuB9S3=ySE{up4rU=q2o#&4EMB{ZW<0og0Elr8) zEk!i=#pEB2$TP8`3NWJmln_y-2$e4V7C4a3(|jM$>QxNh8j$gIR{dhzYPO@AQWoYp z{`qq2OJ%R;*Q~s!zHzS~a}x-AC3=2?_O=;7LkE_JrrftWU8gigZ~fPDf2)8 diff --git a/aio/content/images/guide/ngmodule/contact-2-plunker.png b/aio/content/images/guide/ngmodule/contact-2-plunker.png deleted file mode 100644 index 909f928e3d13918646a6fccf68b2f456c067391f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23401 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%0At!=E2H&tz3vkNXeA@9F{6jjE8#B_NS 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 D4}|pj diff --git a/aio/content/images/guide/ngmodule/minimal-plunker.png b/aio/content/images/guide/ngmodule/minimal-plunker.png deleted file mode 100644 index 0c7bb90e989acbc38f64d57f6e682e5652b5f888..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20163 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 G3I2ay54Pq2 diff --git a/aio/content/images/guide/quickstart/hello-angular.png b/aio/content/images/guide/quickstart/hello-angular.png deleted file mode 100644 index 751728014ab026a554ecd02ad7fea5487024eb77..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2078 zcmV+(2;ujMP)b%700OZ5rHi6(b6ENT*adchU4UI+7uW^Z1$Kd5fL&l0*ag@HcEQ>^57$(dD2)G6 zp-Brhw9uqV3)R;G0lEEN2?)M=n*m=H1|-4)`v@$E0)jzU2qG*P0{eOd=8U;Fbh$6HKWyBv-9{k1Xuq8J%0|8e-%*#~ zuZTaOfqbJnX&Bf`hdfi>@zx;6+7Psg=+Z^L`4rKbSgO?LL>JLTblqKUa~rst*-#lNH1)#dNqRojeqKoKSh4-L+aS{?;L>JL@2l4Jv>So*a>a08mn9;l-x`-~K zOIqA6CEB*le*1UiQmXz$bP-)d*Tu=xM6XuZ>7rQiY1=2dh%P0%;!(d*f0}3MPv3oh zbB|@es9W7(7_XDA%W&YBWi$JrvY8dPL`7lCNHlD(=`L(=wrUQSUg*5DoA|udf7hj< zXSa)m>n=?{Fp7rb-73^v@ZFaUH;5PdL(Mu*d^u>;HsAvSH-#-eS;yn&u61~nd%(7C z?rMC>GI{gm;*%=sMZ2x$)EMOfh>4)k;cdQ*< z(a%}g|pkrzWr<&3=wo41{1Z{`?#@{1dk;|$xpBC6=q2sGh zV#D^%Tv+JN-irIh><=)lNzi3AYNC5#FP&&HT24J9>VaINqY+(^`*Lq_JJHf*my77y zEkN(h4*@=0)ajBpkz2z<0xa3HBL%t?ngNz7bQIS@o{{{E58B=h5ARK~9k?VD( z;5qWNZoeCmOFlefdA;a@5a5S&>14XZx@xdngNSj~)dIR;Uj)Ab3tgS)8aL^Q&1ySOLerRS+Z_By>7g{lv^c;(Z7XVF-aP;XLmdRrt&pJXJVFhrKe> zhAs#Jp0>UDxWw6?Yi;@LHgxS8-gO!yzFg*YPdmOIbb(L6su8w?OmMPQ(uK1`(T)TO zbUi%aH_uCgoqyWpwe zEG)#OAohbkbfHw}0v|)+4VGO!&UXR*;>ZX7^wZ;Tb#(dWgJod@Or%HXG;)HAK!k}f z-~$Nh!qE};Wa`J8bFatt#E9aPQCGTnIP~mBt5~RPW@YKJdNPB!%{;y6f_Eh>`}1fO zbm4u$#ZjmAl{uGo#e-qL)jlX0nb|Hdnusp(Itp7ZWI=zr z&?nUClD{w9q<5sNpK>bEbpcA|1*HS`fv(WA>${&yu23XGM}a34ZBBG)F?WI6p@~z& z^32QAgU6Db-G%+BMi=k@$QEx@%4aq3#>GV7t!Y9R41gt>f72jmh#y8_PF&G2eXmZ}igJcH zDdC15LMTrcP9V6OqE45*^q~t}t@6_0YoZGtpKI9ff;6ePf(Emi=&9;-;ZIZHei!zG z6kWI!!~~B7U4j4=uW(Q3f-nhdHL${9>%k<3t~H$gAPA$&71wISPy;Hg)qt^-uYMAr z>c>r9OaZIYC10yCvH%I}3Y?{JvyMAfI;%<-J{hq%dqbTr@p4hW8hLKRhUo*-bVfX$ z_ROe%Xl!PIz*w0sSVg4d>kM)IBR=Gh>2>*d5+hP|x@L;((!x5!X*+o^a1Ne|>kMa` zby)X!=Htl9)0Ipz;Q^TupA{LJFByE`-q3|*qiFbW(xFCvvtUcG1(i*(H7pSvLZP=Z zT?tTa^%{A+U$M#11>u1F;edNUm+;&h7FG`V`#Rq>w#)dOTWslJx^$F-)_$;bfyO;ngE#??Cy(Fv+2r69BS36M zpm@k1w;&~gL;N98b-F-&(9YrJ>@0M*29YqGfY(9G9{v`BXWwBr**{)#u$}FQD1*YZi-U3P+~xhqp@B;dLsT|6M0<9yHEoN3iZj7wE#bjmeND|B4&Lkot$< zPy@P1BycZSLy}bJB9X*X0SW0MksRylx8f1-8#dMKK+->dLc^{c1po>Hro)jP4u3#l!?@4a{5nUwG zB_DcCqh2hq=_z{nS@sk6oYq=I7l}l4kw`=riA2(aE)t3K4-z`4jxVn)umAu607*qo IM6N<$fDskrhpMHm89_MuxAZG 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 diff --git a/aio/content/images/guide/quickstart/quickstart-plnkr-big.png b/aio/content/images/guide/quickstart/quickstart-plnkr-big.png deleted file mode 100644 index 0738a4a4eb8fe7a790b1fc5381609749641eb2ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20869 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

DdLROgj;rU?rW8Sx)e2a$l4Fx(ED&*smI% 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 CC{5e| diff --git a/aio/content/images/guide/quickstart/quickstart-plnkr.png b/aio/content/images/guide/quickstart/quickstart-plnkr.png deleted file mode 100644 index 757c70dac3182fd065bd59ac805cffe5ae3d037d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14674 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

5JM^kuTVC;4b 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 diff --git a/aio/content/images/guide/testing-an-angular-pipe/big-time-fail-screen.png b/aio/content/images/guide/testing-an-angular-pipe/big-time-fail-screen.png deleted file mode 100644 index a1525c39962fbaaa5529be17fbe21f5121ba8d93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1279 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 diff --git a/aio/content/images/guide/testing-an-angular-pipe/zero-failures.png b/aio/content/images/guide/testing-an-angular-pipe/zero-failures.png deleted file mode 100644 index f461fee8898c6112d6d88dcd86ed0be5878aef44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2923 zcmYLKc{tST7au~pDBaYQxRzYqEYp>;wAjizifiA7Y>f#SjTkf|jH@ukkReLeDN7hj zGj=hujxyG<4yFhrvNjFBFVFAy{LUZeIp^~^+xtH6bKWPGw~WPpll%NneM3{avFOnJyr2#?;gD!>t%kT_6)W5cf4z> zN+_>SqjEUo&1HpqQr0{Uw4qZ93n}z{6fpO&eZH)@nNmpEBRF(Ahd$WK=&tDaTtlZ* zD71nPKn{@f-x6&E5E6lH10q|oNCXH;0D6Fsb?pGaVUtM+P{YV1Jr{(`C4b>?zI6K_ z5k7Qw3X{WO0x=^gNCby7(%ygok-8^2oc4y?Ne&y-PzNH_rH~Nq^zQbCIu3`1Q^(Qv z3XYNB>VNy%kFD|{ZIs~6^E`Z}qi=T60+6Tj|nFR)3@lkwUA zXxc@nulaH1Tq0!F1rQv$lqvkxzJavx71V0?*v--t*CGgY=+N5mbX~Y-Qh0VvH^Zxv z^bBo!B4tgL6;dzi!0TI}rdsU&s$zdh$9C3#%vgnaY0*eX2mD{xgX!Kf%k8cODcxqSn3K=qo9B2qp%yBMj^!5a>fZq-HJ$Q0Cw6kJ}!pWk-$v zEgbDmk8$mhd?9c$dz`xiPCu}_QISnH%V>2?brMnW`_-XAWumSr<*vJ1nXPGljT$Wq z{hW1zJAwc4f*+zi{cP&K^qPG;MQ8~mG;a*+a+|rICTjW13i8of5>(5&W2IEEO0rv_ z9X|Keu*p5VK!{d;(O%wMk1~+vb9U!s><+gVYz;Y6nb2Ln<#^oL7FjnQ;PQ|?5Aj*E zH?T(~&Dm*)A0+)mnSwP8b&L5N^F=?&*FFDRI!Br;k%*5A#CUQJWtdVPAB@uCiBUP?+m2uPBck)?vmF zt({7-6#{f((@@5Cr#27)<-*>$ZSC}BiJa}!C4LR2higBON|+8)omIHXA3-t*=JQQ{);P*&DogWjR}kdS{iqulBA`C4f{iVi7W(B1=YMi_^b{weP+8xNiKLwhdB{eL& zEY?4>l-Q)fNngRJn?p5a%!8#}i|m2*n-1!D9XpFaw}+wOA-mt_2IiWD%e;$0<=4D+)6Q)$`tpY@t`iq(jfrIt#u6zzejT&%tLFc==1#KS6hX66?Ojv4 z`*LO_%{D5}6g=m!N;lRh1kSH1I>Wdze{^NgXN8 zfCRX5HYXa83$?KK>xCKfWYpZCCOHaKofsMwB&7nuIrQAQFXtZ{J7i7_$%*Y!b@?#61j^1ftOB@u2OyOGsV}G~mb3at$l&HPlt_P#+Cf zxlZV-5W68KJk5H*U}rpkI!~@!^*?A|J6iQVd7^A8Q?-BbZg?zxuD)H;5iIF?1y(~( zhbYE+7nW2V@#}a9=kf`D_2Vs2xjeeN4sb zv!%KMiBF}TCbN*~57=@;AuO#^@=5vLFu~iY4ddI>0unD6YC{&mq8;*tNNET8!U4gd z*cmS^iD+x@xyl(EszW2#hVM{z1@r2=Fd_i>QEaB|Ou(<30JvBZy8nEsPqnoV(N7wWC@&6Xls z;Dxy;Ywu5jy(WW#ayN9kEHps9;~$8$Ox#<4C`2VAvc9RIo#943rcK@Gs8gEBTVj>Iw`upBA?;@e@yZ^bg zn!2I3H2E+iYG$HrD&GlH72Sj97}-^@Si9T7Y+A*tXx1K3o6^_1VcEV5Bi@H*?zxD1&iJl%&Cu&xsvlkews+kx|PwQSGsjAMP$i|ps!7TkaBlH)z zM)i{{uG)}bFRZ`4-+5{AeKudLG}uVABeLm*^aB6U|82QeH$&mQ%?AzL5%MM)XoJ-f R754ruQ^Q*~-WlAE`VY@~1g8K1 diff --git a/aio/content/images/guide/unit-testing/spectrum.png b/aio/content/images/guide/unit-testing/spectrum.png deleted file mode 100644 index 2a5f123afc84832cfe8d551417376e7295bc1d15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30822 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 From d95e0594805c06867d41885fadd3f07e593c5884 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Thu, 28 Feb 2019 16:42:33 +0200 Subject: [PATCH 0268/1073] test(docs-infra): add script for verifying all guides/examples/images have owners (#28597) It is useful for manually checking that all guides/examples/images have owners in `.github/CODEOWNERS`, but is not used for automatic verification (e.g. on CI) for now. PR Close #28597 --- aio/scripts/verify-guide-codeownership.js | 87 +++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 aio/scripts/verify-guide-codeownership.js diff --git a/aio/scripts/verify-guide-codeownership.js b/aio/scripts/verify-guide-codeownership.js new file mode 100644 index 0000000000..1632072970 --- /dev/null +++ b/aio/scripts/verify-guide-codeownership.js @@ -0,0 +1,87 @@ +'use strict'; + +// Imports +const fs = require('fs'); +const path = require('path'); + +// Constants +const PROJECT_ROOT_DIR = path.resolve(__dirname, '../..'); +const CODEOWNERS_PATH = path.resolve(PROJECT_ROOT_DIR, '.github/CODEOWNERS'); +const AIO_CONTENT_DIR = path.resolve(PROJECT_ROOT_DIR, 'aio/content'); +const AIO_GUIDES_DIR = path.resolve(AIO_CONTENT_DIR, 'guide'); +const AIO_GUIDE_IMAGES_DIR = path.resolve(AIO_CONTENT_DIR, 'images/guide'); +const AIO_GUIDE_EXAMPLES_DIR = path.resolve(AIO_CONTENT_DIR, 'examples'); + +// Run +_main(); + +// Functions - Definitions +function _main() { + const {guides: acGuidePaths, images: acGuideImagesPaths, examples: acExamplePaths} = getPathsFromAioContent(); + const {guides: coGuidePaths, images: coGuideImagesPaths, examples: coExamplePaths} = getPathsFromCodeowners(); + + const guidesDiff = arrayDiff(acGuidePaths, coGuidePaths); + const imagesDiff = arrayDiff(acGuideImagesPaths, coGuideImagesPaths); + const examplesDiff = arrayDiff(acExamplePaths, coExamplePaths); + const hasDiff = !!(guidesDiff.diffCount || imagesDiff.diffCount || examplesDiff.diffCount); + + if (hasDiff) { + const expectedGuidesSrc = path.relative(PROJECT_ROOT_DIR, AIO_GUIDES_DIR); + const expectedImagesSrc = path.relative(PROJECT_ROOT_DIR, AIO_GUIDE_IMAGES_DIR); + const expectedExamplesSrc = path.relative(PROJECT_ROOT_DIR, AIO_GUIDE_EXAMPLES_DIR); + const actualSrc = path.relative(PROJECT_ROOT_DIR, CODEOWNERS_PATH); + + reportDiff(guidesDiff, expectedGuidesSrc, actualSrc); + reportDiff(imagesDiff, expectedImagesSrc, actualSrc); + reportDiff(examplesDiff, expectedExamplesSrc, actualSrc); + } + + process.exit(hasDiff ? 1 : 0); +} + +function arrayDiff(expected, actual) { + const missing = expected.filter(x => !actual.includes(x)).sort(); + const extra = actual.filter(x => !expected.includes(x)).sort(); + + return {missing, extra, diffCount: missing.length + extra.length}; +} + +function getPathsFromAioContent() { + return { + guides: fs.readdirSync(AIO_GUIDES_DIR), + images: fs.readdirSync(AIO_GUIDE_IMAGES_DIR), + examples: fs.readdirSync(AIO_GUIDE_EXAMPLES_DIR). + filter(name => fs.statSync(`${AIO_GUIDE_EXAMPLES_DIR}/${name}`).isDirectory()), + }; +} + +function getPathsFromCodeowners() { + const guidesOrImagesPathRe = /^\/aio\/content\/(?:(images\/)?guide|(examples))\/([^\s/]+)/; + + return fs. + readFileSync(CODEOWNERS_PATH, 'utf8'). + split('\n'). + map(l => l.trim().match(guidesOrImagesPathRe)). + filter(m => m). + reduce((aggr, [, isImage, isExample, path]) => { + const list = isExample ? aggr.examples : + isImage ? aggr.images : + aggr.guides; + list.push(path); + return aggr; + }, {guides: [], images: [], examples: []}); +} + +function reportDiff(diff, expectedSrc, actualSrc) { + if (diff.missing.length) { + console.error( + `\nEntries in '${expectedSrc}' but not in '${actualSrc}':\n` + + diff.missing.map(x => ` - ${x}`).join('\n')); + } + + if (diff.extra.length) { + console.error( + `\nEntries in '${actualSrc}' but not in '${expectedSrc}':\n` + + diff.extra.map(x => ` - ${x}`).join('\n')); + } +} From 22c71b69ceb0fcbcd2cb4381a599fab7482ddcfa Mon Sep 17 00:00:00 2001 From: Judy Bogart Date: Tue, 29 May 2018 12:25:26 -0700 Subject: [PATCH 0269/1073] docs: route interface and types doc example (#29012) PR Close #29012 --- packages/router/src/config.ts | 462 ++++++++++++++++++---------------- packages/router/src/router.ts | 93 ++++--- 2 files changed, 302 insertions(+), 253 deletions(-) diff --git a/packages/router/src/config.ts b/packages/router/src/config.ts index c7722bc83b..a6db3affb2 100644 --- a/packages/router/src/config.ts +++ b/packages/router/src/config.ts @@ -16,53 +16,134 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; /** - * @description + * Represents a route configuration for the Router service. + * An array of `Route` objects, used in `Router.config` and for nested route configurations + * in `Route.children`. * - * Represents router configuration. + * @see `Route` + * @see `Router` + */ +export type Routes = Route[]; + +/** + * Represents the result of matching URLs with a custom matching function. * - * `Routes` is an array of route configurations. Each one has the following properties: + * * `consumed` is an array of the consumed URL segments. + * * `posParams` is a map of positional parameters. * - * - `path` is a string that uses the route matcher DSL. - * - `pathMatch` is a string that specifies the matching strategy. Options are `prefix` (default) - * and `full`. See [Matching Strategy](#matching-strategy) below for more information. - * - `matcher` defines a custom strategy for path matching and supersedes `path` and `pathMatch`. - * - `component` is a component type. - * - `redirectTo` is the url fragment which will replace the current matched segment. - * - `outlet` is the name of the outlet the component should be placed into. - * - `canActivate` is an array of DI tokens used to look up CanActivate handlers. See - * `CanActivate` for more info. - * - `canActivateChild` is an array of DI tokens used to look up CanActivateChild handlers. See - * `CanActivateChild` for more info. - * - `canDeactivate` is an array of DI tokens used to look up CanDeactivate handlers. See - * `CanDeactivate` for more info. - * - `canLoad` is an array of DI tokens used to look up CanLoad handlers. See - * `CanLoad` for more info. - * - `data` is additional data provided to the component via `ActivatedRoute`. - * - `resolve` is a map of DI tokens used to look up data resolvers. See `Resolve` for more - * info. - * - `runGuardsAndResolvers` defines when guards and resolvers will be run. By default they run only - * when the matrix parameters of the route change. Options include: - * - `paramsChange` (default) - Run guards and resolvers when path or matrix params change. This - * mode ignores query param changes. - * - `paramsOrQueryParamsChange` - Guards and resolvers will run when any parameters change. This - * includes path, matrix, and query params. - * - `pathParamsChange` - Run guards and resolvers path or any path params change. This mode is - * useful if you want to ignore changes to all optional parameters such as query *and* matrix - * params. - * - `pathParamsOrQueryParamsChange` - Same as `pathParamsChange`, but also rerun when any query - * param changes - * - `always` - Run guards and resolvers on every navigation. - * - (from: ActivatedRouteSnapshot, to: ActivatedRouteSnapshot) => boolean - Use a predicate - * function when none of the pre-configured modes fit the needs of the application. An example - * might be when you need to ignore updates to a param such as `sortDirection`, but need to - * reload guards and resolvers when changing the `searchRoot` param. - * - `children` is an array of child route definitions. - * - `loadChildren` is a reference to lazy loaded child routes. See `LoadChildren` for more - * info. + * @see `UrlMatcher()` + * + */ +export type UrlMatchResult = { + consumed: UrlSegment[]; posParams?: {[name: string]: UrlSegment}; +}; + +/** + * A function for matching a route against URLs. Implement a custom URL matcher + * for `Route.matcher` when a combination of `path` and `pathMatch` + * is not expressive enough. + * + * @param segments An array of URL segments. + * @param group A segment group. + * @param route The route to match against. + * @returns The match-result, * * @usageNotes + * + * The following matcher matches HTML files. + * + * ``` + * export function htmlFiles(url: UrlSegment[]) { + * return url.length === 1 && url[0].path.endsWith('.html') ? ({consumed: url}) : null; + * } + * + * export const routes = [{ matcher: htmlFiles, component: AnyComponent }]; + * ``` + * + */ +export type UrlMatcher = (segments: UrlSegment[], group: UrlSegmentGroup, route: Route) => + UrlMatchResult; + +/** + * + * Represents static data associated with a particular route. + * + * @see `Route#data` + * + */ +export type Data = { + [name: string]: any +}; + +/** + * + * Represents the resolved data associated with a particular route. + * + * @see `Route#resolve`. + * + */ +export type ResolveData = { + [name: string]: any +}; + +/** + * + * A function that is called to resolve a collection of lazy-loaded routes. + * + * @see `Route#loadChildren`. + * + */ +export type LoadChildrenCallback = () => + Type| NgModuleFactory| Promise>| Observable>; + +/** + * + * A string of the form `path/to/file#exportName` that acts as a URL for a set of routes to load, + * or a function that returns such a set. + * + * @see `Route#loadChildren`. + * + */ +export type LoadChildren = string | LoadChildrenCallback; + +/** + * + * How to handle query parameters in a router link. + * One of: + * - `merge` : Merge new with current parameters. + * - `preserve` : Preserve current parameters. + * + * @see `RouterLink#queryParamsHandling`. + * + */ +export type QueryParamsHandling = 'merge' | 'preserve' | ''; + +/** + * + * A policy for when to run guards and resolvers on a route. + * + * @see `Route#runGuardsAndResolvers` + */ +export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParamsChange' | + 'paramsChange' | 'paramsOrQueryParamsChange' | 'always' | + ((from: ActivatedRouteSnapshot, to: ActivatedRouteSnapshot) => boolean); + +/** + * Collects and stores the properties of a navigation route. + * A set of routes collected in a `Routes` object defines a router configuration. + * + * Supports static, parameterized, redirect, and wildcard routes, as well as + * custom route data and resolve methods. + * + * For detailed usage information, see the [Routing Guide](guide/router). + * + * @usageNotes + * * ### Simple Configuration * + * When navigating to `/team/11/user/bob`, the router will create the team component with the user + * component in it. + * * ``` * [{ * path: 'team/:id', @@ -74,11 +155,11 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * When navigating to `/team/11/user/bob`, the router will create the team component with the user - * component in it. - * * ### Multiple Outlets * + * When navigating to `/team/11(aux:chat/jim)`, the router will create the team component next to + * the chat component. The chat component will be placed into the aux outlet. + * * ``` * [{ * path: 'team/:id', @@ -90,11 +171,11 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * When navigating to `/team/11(aux:chat/jim)`, the router will create the team component next to - * the chat component. The chat component will be placed into the aux outlet. * * ### Wild Cards * + * Regardless of where you navigate to, the router will instantiate the sink component. + * * ``` * [{ * path: '**', @@ -102,10 +183,12 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * Regardless of where you navigate to, the router will instantiate the sink component. - * * ### Redirects * + * When navigating to '/team/11/legacy/user/jim', the router will change the URL to + * '/team/11/user/jim', and then instantiate the team component with the user component + * in it. + * * ``` * [{ * path: 'team/:id', @@ -120,17 +203,15 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * When navigating to '/team/11/legacy/user/jim', the router will change the url to - * '/team/11/user/jim', and then will instantiate the team component with the user component - * in it. - * - * If the `redirectTo` value starts with a '/', then it is an absolute redirect. E.g., if in the - * example above we change the `redirectTo` to `/user/:name`, the result url will be '/user/jim'. - * + * Note that if the `redirectTo` value starts with a '/', then it is an absolute redirect. + * If we change the `redirectTo` in the example to `/user/:name`, the result URL + * is '/user/jim'. + * ### Empty Path * * Empty-path route configurations can be used to instantiate components that do not 'consume' - * any url segments. Let's look at the following configuration: + * any URL segments. In the following configuration, when navigating to + * `/team/11`, the router will instantiate the 'AllUsers' component. * * ``` * [{ @@ -146,9 +227,11 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * When navigating to `/team/11`, the router will instantiate the AllUsers component. + * Empty-path routes can have children. In the following example, when navigating + * to `/team/11/user/jim`, the router will instantiate the wrapper component with + * the user component in it. * - * Empty-path routes can have children. + * Note that an empty path route inherits its parent's parameters and data. * * ``` * [{ @@ -165,21 +248,11 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * When navigating to `/team/11/user/jim`, the router will instantiate the wrapper component with - * the user component in it. - * - * An empty path route inherits its parent's params and data. This is because it cannot have its - * own params, and, as a result, it often uses its parent's params and data as its own. - * * ### Matching Strategy * - * By default the router will look at what is left in the url, and check if it starts with - * the specified path (e.g., `/team/11/user` starts with `team/:id`). - * - * We can change the matching strategy to make sure that the path covers the whole unconsumed url, - * which is akin to `unconsumedUrl === path` or `$` regular expressions. - * - * This is particularly important when redirecting empty-path routes. + * The default path-match strategy is 'prefix', which means that the router + * checks URL elements from the left to see if the URL matches a specified path. + * For example, '/team/11/user' matches 'team/:id'. * * ``` * [{ @@ -192,11 +265,14 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * Since an empty path is a prefix of any url, even when navigating to '/main', the router will - * still apply the redirect. + * You can specify the path-match strategy 'full' to make sure that the path + * covers the whole unconsumed URL. It is important to do this when redirecting + * empty-path routes. Otherwise, because an empty path is a prefix of any URL, + * the router would apply the redirect even when navigating to the redirect destination, + * creating an endless loop. * - * If `pathMatch: full` is provided, the router will apply the redirect if and only if navigating to - * '/'. + * In the following example, supplying the 'full' `patchMatch` strategy ensures + * that the router applies the redirect if and only if navigating to '/'. * * ``` * [{ @@ -211,13 +287,15 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * * ### Componentless Routes * - * It is useful at times to have the ability to share parameters between sibling components. + * You can share parameters between sibling components. + * For example, suppose that two sibling components should go next to each other, + * and both of them require an ID parameter. You can accomplish this using a route + * that does not specify a component at the top level. * - * Say we have two components--ChildCmp and AuxCmp--that we want to put next to each other and both - * of them require some id parameter. - * - * One way to do that would be to have a bogus parent component, so both the siblings can get the id - * parameter from it. This is not ideal. Instead, you can use a componentless route. + * In the following example, 'ChildCmp' and 'AuxCmp' are siblings. + * When navigating to 'parent/10/(a//aux:b)', the route instantiates + * the main child and aux child components next to each other. + * For this to work, the application component must have the primary and aux outlets defined. * * ``` * [{ @@ -229,15 +307,13 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * So when navigating to `parent/10/(a//aux:b)`, the route will instantiate the main child and aux - * child components next to each other. In this example, the application component - * has to have the primary and aux outlets defined. + * The router merges the parameters, data, and resolve of the componentless + * parent into the parameters, data, and resolve of the children. * - * The router will also merge the `params`, `data`, and `resolve` of the componentless parent into - * the `params`, `data`, and `resolve` of the children. This is done because there is no component - * that can inject the activated route of the componentless parent. - * - * This is especially useful when child components are defined as follows: + * This is especially useful when child components are defined + * with an empty path string, as in the following example. + * With this configuration, navigating to '/parent/10' creates + * the main child and aux components. * * ``` * [{ @@ -249,14 +325,16 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * With this configuration in place, navigating to '/parent/10' will create the main child and aux - * components. - * * ### Lazy Loading * - * Lazy loading speeds up our application load time by splitting it into multiple bundles, and - * loading them on demand. The router is designed to make lazy loading simple and easy. Instead of - * providing the children property, you can provide the `loadChildren` property, as follows: + * Lazy loading speeds up application load time by splitting the application + * into multiple bundles and loading them on demand. + * To use lazy loading, provide the `loadChildren` property instead of the `children` property. + * + * Given the following example route, the router uses the registered + * `NgModuleFactoryLoader` to fetch an NgModule associated with 'team'. + * It then extracts the set of routes defined in that NgModule, + * and transparently adds those routes to the main configuration. * * ``` * [{ @@ -266,140 +344,100 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * }] * ``` * - * The router will use registered NgModuleFactoryLoader to fetch an NgModule associated with 'team'. - * Then it will extract the set of routes defined in that NgModule, and will transparently add - * those routes to the main configuration. - * - * @publicApi - */ -export type Routes = Route[]; - -/** - * @description Represents the results of the URL matching. - * - * * `consumed` is an array of the consumed URL segments. - * * `posParams` is a map of positional parameters. - * - * @publicApi - */ -export type UrlMatchResult = { - consumed: UrlSegment[]; posParams?: {[name: string]: UrlSegment}; -}; - -/** - * @description - * - * A function matching URLs - * - * A custom URL matcher can be provided when a combination of `path` and `pathMatch` isn't - * expressive enough. - * - * For instance, the following matcher matches html files. - * - * ``` - * export function htmlFiles(url: UrlSegment[]) { - * return url.length === 1 && url[0].path.endsWith('.html') ? ({consumed: url}) : null; - * } - * - * export const routes = [{ matcher: htmlFiles, component: AnyComponent }]; - * ``` - * - * @publicApi - */ -export type UrlMatcher = (segments: UrlSegment[], group: UrlSegmentGroup, route: Route) => - UrlMatchResult; - -/** - * @description - * - * Represents the static data associated with a particular route. - * - * See `Routes` for more details. - * - * @publicApi - */ -export type Data = { - [name: string]: any -}; - -/** - * @description - * - * Represents the resolved data associated with a particular route. - * - * See `Routes` for more details. - * - * @publicApi - */ -export type ResolveData = { - [name: string]: any -}; - -/** - * @description - * - * The type of `loadChildren`. - * - * See `Routes` for more details. - * - * @publicApi - */ -export type LoadChildrenCallback = () => - Type| NgModuleFactory| Promise>| Observable>; - -/** - * @description - * - * The type of `loadChildren`. - * - * See `Routes` for more details. - * - * @publicApi - */ -export type LoadChildren = string | LoadChildrenCallback; - -/** - * @description - * - * The type of `queryParamsHandling`. - * - * See `RouterLink` for more details. - * - */ -export type QueryParamsHandling = 'merge' | 'preserve' | ''; - -/** - * @description - * - * The type of `runGuardsAndResolvers`. - * - * See `Routes` for more details. - * @publicApi - */ -export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParamsChange' | - 'paramsChange' | 'paramsOrQueryParamsChange' | 'always' | - ((from: ActivatedRouteSnapshot, to: ActivatedRouteSnapshot) => boolean); - -/** - * See `Routes` for more details. - * - * @publicApi */ export interface Route { + /** + * The path to match against, a URL string that uses router matching notation. + * Can include wild-card characters (*). [where is that defined?] + * Default is "/" (the root path). + */ path?: string; + /** + * The path-matching strategy, one of 'prefix' or 'full'. + * Default is 'prefix'. + * + * By default, the router checks URL elements from the left to see if the URL + * matches a given path, and stops when there is a match. For example, + * '/team/11/user' matches 'team/:id'. + * The path-match strategy 'full' matches against the entire URL. + * It is important to do this when redirecting empty-path routes. + * Otherwise, because an empty path is a prefix of any URL, + * the router would apply the redirect even when navigating + * to the redirect destination, creating an endless loop. + * + */ pathMatch?: string; + /** + * A URL-matching function to use as a custom strategy for path matching. + * If present, supersedes `path` and `pathMatch`. + */ matcher?: UrlMatcher; + /** + * The component to instantiate when the path matches. + * Can be empty if child routes specify components. + */ component?: Type; + /** + * A URL to which to redirect when a the path matches. + * Absolute if the URL begins with a slash (/), otherwise relative to the path URL. + * When not present, router does not redirect. + */ redirectTo?: string; + /** + * Name of a `RouterOutlet` object where the component can be placed + * when the path matches. + */ outlet?: string; + /** + * An array of dependency-injection tokens used to look up `CanActivate()` + * handlers, in order to determine if the current user is allowed to + * activate the component. By default, any user can activate. + */ canActivate?: any[]; + /** + * An array of DI tokens used to look up `CanActivateChild()` handlers, + * in order to determine if the current user is allowed to activate + * a child of the component. By default, any user can activate a child. + */ canActivateChild?: any[]; + /** + * An array of DI tokens used to look up `CanDeactivate()` + * handlers, in order to determine if the current user is allowed to + * deactivate the component. By default, any user can deactivate. + * + */ canDeactivate?: any[]; + /** + * An array of DI tokens used to look up `CanLoad()` + * handlers, in order to determine if the current user is allowed to + * load the component. By default, any user can load. + */ canLoad?: any[]; + /** + * Additional developer-defined data provided to the component via + * `ActivatedRoute`. By default, no additional data is passed. + */ data?: Data; + /** + * A map of DI tokens used to look up data resolvers. See `Resolve`. + */ resolve?: ResolveData; + /** + * An array of child `Route` objects that specifies a nested route + * configuration. + */ children?: Routes; + /** + * A `LoadChildren` object specifying lazy-loaded child routes. + */ loadChildren?: LoadChildren; + /** + * Defines when guards and resolvers will be run. One of + * - `paramsOrQueryParamsChange` : Run when query parameters change. + * - `always` : Run on every execution. + * By default, guards and resolvers run only when the matrix + * parameters of the route change. + */ runGuardsAndResolvers?: RunGuardsAndResolvers; /** * Filled for routes with `loadChildren` once the module has been loaded diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index 270ff37414..db8c189ed4 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -36,7 +36,7 @@ import {isUrlTree} from './utils/type_guards'; /** * @description * - * Represents the extra options used during navigation. + * Options that modify the navigation strategy. * * @publicApi */ @@ -96,9 +96,8 @@ export interface NavigationExtras { fragment?: string; /** - * Preserves the query parameters for the next navigation. - * - * deprecated, use `queryParamsHandling` instead + * DEPRECATED: Use `queryParamsHandling` instead to preserve + * query parameters for the next navigation. * * ``` * // Preserve query params from /results?page=1 to /view?page=1 @@ -110,7 +109,7 @@ export interface NavigationExtras { preserveQueryParams?: boolean; /** - * config strategy to handle the query parameters for the next navigation. + * Configuration strategy for how to handle query parameters for the next navigation. * * ``` * // from /results?page=1 to /view?page=1&page=2 @@ -280,9 +279,10 @@ function defaultRouterHook(snapshot: RouterStateSnapshot, runExtras: { /** * @description * - * Provides the navigation and url manipulation capabilities. + * An NgModule that provides navigation and URL manipulation capabilities. * - * See `Routes` for more details and examples. + * @see `Route`. + * @see [Routing and Navigation Guide](guide/router). * * @ngModule RouterModule * @@ -305,13 +305,17 @@ export class Router { private console: Console; private isNgZoneEnabled: boolean = false; + /** + * An event stream for routing events in this NgModule. + */ public readonly events: Observable = new Subject(); + /** + * The current state of routing in this NgModule. + */ public readonly routerState: RouterState; /** - * Error handler that is invoked when a navigation errors. - * - * See `ErrorHandler` for more information. + * A handler for navigation errors in this NgModule. */ errorHandler: ErrorHandler = defaultErrorHandler; @@ -325,14 +329,17 @@ export class Router { url: string) => UrlTree = defaultMalformedUriErrorHandler; /** - * Indicates if at least one navigation happened. + * True if at least one navigation event has occurred, + * false otherwise. */ navigated: boolean = false; private lastSuccessfulId: number = -1; /** - * Used by RouterModule. This allows us to - * pause the navigation either before preactivation or after it. + * Hooks that enable you to pause navigation, + * either before or after the preactivation phase. + * Used by `RouterModule`. + * * @internal */ hooks: {beforePreactivation: RouterHook, afterPreactivation: RouterHook} = { @@ -345,23 +352,26 @@ export class Router { */ urlHandlingStrategy: UrlHandlingStrategy = new DefaultUrlHandlingStrategy(); + /** + * The strategy for re-using routes. + */ routeReuseStrategy: RouteReuseStrategy = new DefaultRouteReuseStrategy(); /** - * Define what the router should do if it receives a navigation request to the current URL. - * By default, the router will ignore this navigation. However, this prevents features such - * as a "refresh" button. Use this option to configure the behavior when navigating to the - * current URL. Default is 'ignore'. + * How to handle a navigation request to the current URL. One of: + * - `'ignore'` : The router ignores the request. + * - `'reload'` : The router reloads the URL. Use to implement a "refresh" feature. */ onSameUrlNavigation: 'reload'|'ignore' = 'ignore'; /** - * Defines how the router merges params, data and resolved data from parent to child - * routes. Available options are: + * How to merge parameters, data, and resolved data from parent to child + * routes. One of: * - * - `'emptyOnly'`, the default, only inherits parent params for path-less or component-less - * routes. - * - `'always'`, enables unconditional inheritance of parent params. + * - `'emptyOnly'` : Inherit parent parameters, data, and resolved data + * for path-less or component-less routes. + * - `'always'` : Inherit parent parameters, data, and resolved data + * for all child routes. */ paramsInheritanceStrategy: 'emptyOnly'|'always' = 'emptyOnly'; @@ -519,7 +529,7 @@ export class Router { t.id, this.serializeUrl(t.extractedUrl), this.serializeUrl(t.urlAfterRedirects), t.targetSnapshot !); eventsSubject.next(routesRecognized); - }), ); + })); } else { const processPreviousUrl = urlTransition && this.rawUrlTree && this.urlHandlingStrategy.shouldProcessUrl(this.rawUrlTree); @@ -631,7 +641,7 @@ export class Router { t.id, this.serializeUrl(t.extractedUrl), this.serializeUrl(t.urlAfterRedirects), t.targetSnapshot !); this.triggerEvent(resolveEnd); - }), ); + })); } return undefined; }), @@ -747,7 +757,7 @@ export class Router { } } return EMPTY; - }), ); + })); // TODO(jasonaden): remove cast once g3 is on updated TypeScript })) as any as Observable; } @@ -799,7 +809,7 @@ export class Router { } } - /** The current url */ + /** The current URL. */ get url(): string { return this.serializeUrl(this.currentUrlTree); } /** The current Navigation object if one exists */ @@ -811,9 +821,9 @@ export class Router { /** * Resets the configuration used for navigation and generating links. * - * @usageNotes + * @param config The route array for the new configuration. * - * ### Example + * @usageNotes * * ``` * router.resetConfig([ @@ -834,7 +844,7 @@ export class Router { /** @docsNotRequired */ ngOnDestroy(): void { this.dispose(); } - /** Disposes of the router */ + /** Disposes of the router. */ dispose(): void { if (this.locationSubscription) { this.locationSubscription.unsubscribe(); @@ -843,14 +853,16 @@ export class Router { } /** - * Applies an array of commands to the current url tree and creates a new url tree. + * Applies an array of commands to the current URL tree and creates a new URL tree. * * When given an activate route, applies the given commands starting from the route. * When not given a route, applies the given command starting from the root. * - * @usageNotes + * @param commands An array of commands to apply. + * @param navigationExtras + * @returns The new URL tree. * - * ### Example + * @usageNotes * * ``` * // create /team/33/user/11 @@ -915,12 +927,15 @@ export class Router { } /** - * Navigate based on the provided url. This navigation is always absolute. + * Navigate based on the provided URL, which must be absolute. * - * Returns a promise that: - * - resolves to 'true' when navigation succeeds, - * - resolves to 'false' when navigation fails, - * - is rejected when an error happens. + * @param url An absolute URL. The function does not apply any delta to the current URL. + * @param extras An object containing properties that modify the navigation strategy. + * The function ignores any properties in the `NavigationExtras` that would change the + * provided URL. + * + * @returns A Promise that resolves to 'true' when navigation succeeds, + * to 'false' when navigation fails, or is rejected on error. * * @usageNotes * @@ -933,10 +948,6 @@ export class Router { * router.navigateByUrl("/team/33/user/11", { skipLocationChange: true }); * ``` * - * Since `navigateByUrl()` takes an absolute URL as the first parameter, - * it will not apply any delta to the current URL and ignores any properties - * in the second parameter (the `NavigationExtras`) that would change the - * provided URL. */ navigateByUrl(url: string|UrlTree, extras: NavigationExtras = {skipLocationChange: false}): Promise { From b14df413eb64a3eea932b4d37387c6aa79a9e775 Mon Sep 17 00:00:00 2001 From: Judy Bogart Date: Tue, 5 Mar 2019 11:32:29 -0800 Subject: [PATCH 0270/1073] docs: add publicapi flag (#29012) PR Close #29012 --- packages/router/src/config.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/router/src/config.ts b/packages/router/src/config.ts index a6db3affb2..a6c55f512d 100644 --- a/packages/router/src/config.ts +++ b/packages/router/src/config.ts @@ -22,6 +22,7 @@ import {UrlSegment, UrlSegmentGroup} from './url_tree'; * * @see `Route` * @see `Router` + * @publicApi */ export type Routes = Route[]; @@ -32,7 +33,7 @@ export type Routes = Route[]; * * `posParams` is a map of positional parameters. * * @see `UrlMatcher()` - * + * @publicApi */ export type UrlMatchResult = { consumed: UrlSegment[]; posParams?: {[name: string]: UrlSegment}; @@ -60,6 +61,7 @@ export type UrlMatchResult = { * export const routes = [{ matcher: htmlFiles, component: AnyComponent }]; * ``` * + * @publicApi */ export type UrlMatcher = (segments: UrlSegment[], group: UrlSegmentGroup, route: Route) => UrlMatchResult; @@ -70,6 +72,7 @@ export type UrlMatcher = (segments: UrlSegment[], group: UrlSegmentGroup, route: * * @see `Route#data` * + * @publicApi */ export type Data = { [name: string]: any @@ -81,6 +84,7 @@ export type Data = { * * @see `Route#resolve`. * + * @publicApi */ export type ResolveData = { [name: string]: any @@ -91,7 +95,7 @@ export type ResolveData = { * A function that is called to resolve a collection of lazy-loaded routes. * * @see `Route#loadChildren`. - * + * @publicApi */ export type LoadChildrenCallback = () => Type| NgModuleFactory| Promise>| Observable>; @@ -102,7 +106,7 @@ export type LoadChildrenCallback = () => * or a function that returns such a set. * * @see `Route#loadChildren`. - * + * @publicApi */ export type LoadChildren = string | LoadChildrenCallback; @@ -114,7 +118,7 @@ export type LoadChildren = string | LoadChildrenCallback; * - `preserve` : Preserve current parameters. * * @see `RouterLink#queryParamsHandling`. - * + * @publicApi */ export type QueryParamsHandling = 'merge' | 'preserve' | ''; @@ -123,6 +127,7 @@ export type QueryParamsHandling = 'merge' | 'preserve' | ''; * A policy for when to run guards and resolvers on a route. * * @see `Route#runGuardsAndResolvers` + * @publicApi */ export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParamsChange' | 'paramsChange' | 'paramsOrQueryParamsChange' | 'always' | @@ -344,6 +349,7 @@ export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParam * }] * ``` * + * @publicApi */ export interface Route { /** From aa6db0d191fd8b9cb0863417392a4e09c10f1dfd Mon Sep 17 00:00:00 2001 From: Judy Bogart Date: Thu, 7 Mar 2019 14:13:18 -0800 Subject: [PATCH 0271/1073] docs: clarify intro and examples (#29012) PR Close #29012 --- packages/router/src/config.ts | 45 +++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/packages/router/src/config.ts b/packages/router/src/config.ts index a6c55f512d..e739f424c6 100644 --- a/packages/router/src/config.ts +++ b/packages/router/src/config.ts @@ -134,8 +134,10 @@ export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParam ((from: ActivatedRouteSnapshot, to: ActivatedRouteSnapshot) => boolean); /** - * Collects and stores the properties of a navigation route. - * A set of routes collected in a `Routes` object defines a router configuration. + * A configuration object that defines a single route. + * A set of routes are collected in a `Routes` array to define a `Router` configuration. + * The router attempts to match segments of a given URL against each route, + * using the configuration options defined in this object. * * Supports static, parameterized, redirect, and wildcard routes, as well as * custom route data and resolve methods. @@ -146,8 +148,9 @@ export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParam * * ### Simple Configuration * - * When navigating to `/team/11/user/bob`, the router will create the team component with the user - * component in it. + * The following route specifies that when navigating to, for example, + * `/team/11/user/bob`, the router creates the 'Team' component + * with the 'User' child component in it. * * ``` * [{ @@ -162,8 +165,9 @@ export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParam * * ### Multiple Outlets * - * When navigating to `/team/11(aux:chat/jim)`, the router will create the team component next to - * the chat component. The chat component will be placed into the aux outlet. + * The following route creates sibling components with multiple outlets. + * When navigating to `/team/11(aux:chat/jim)`, the router creates the 'Team' component next to + * the 'Chat' component. The 'Chat' component is placed into the 'aux' outlet. * * ``` * [{ @@ -176,23 +180,26 @@ export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParam * }] * ``` * - * * ### Wild Cards * - * Regardless of where you navigate to, the router will instantiate the sink component. + * The following route uses wild-card notation to specify a component + * that is always instantiated regardless of where you navigate to. * * ``` * [{ * path: '**', - * component: Sink + * component: WildcardComponent * }] * ``` * * ### Redirects * - * When navigating to '/team/11/legacy/user/jim', the router will change the URL to - * '/team/11/user/jim', and then instantiate the team component with the user component - * in it. + * The following route uses the `redirectTo` property to ignore a segment of + * a given URL when looking for a child path. + * + * When navigating to '/team/11/legacy/user/jim', the router changes the URL segment + * '/team/11/legacy/user/jim' to '/team/11/user/jim', and then instantiates + * the Team component with the User child component in it. * * ``` * [{ @@ -208,15 +215,17 @@ export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParam * }] * ``` * - * Note that if the `redirectTo` value starts with a '/', then it is an absolute redirect. - * If we change the `redirectTo` in the example to `/user/:name`, the result URL - * is '/user/jim'. + * The redirect path can be relative, as shown in this example, or absolute. + * If we change the `redirectTo` value in the example to the absolute URL segment '/user/:name', + * the result URL is also absolute, '/user/jim'. * ### Empty Path * * Empty-path route configurations can be used to instantiate components that do not 'consume' - * any URL segments. In the following configuration, when navigating to - * `/team/11`, the router will instantiate the 'AllUsers' component. + * any URL segments. + * + * In the following configuration, when navigating to + * `/team/11`, the router instantiates the 'AllUsers' component. * * ``` * [{ @@ -233,7 +242,7 @@ export type RunGuardsAndResolvers = 'pathParamsChange' | 'pathParamsOrQueryParam * ``` * * Empty-path routes can have children. In the following example, when navigating - * to `/team/11/user/jim`, the router will instantiate the wrapper component with + * to `/team/11/user/jim`, the router instantiates the wrapper component with * the user component in it. * * Note that an empty path route inherits its parent's parameters and data. From fd5cd100a3c8fb357f2a85769c74e5a847ddcd4a Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Thu, 7 Mar 2019 14:24:54 -0800 Subject: [PATCH 0272/1073] fix(ivy): move i18n instructions after listener ones (#29173) Prior to this commit, i18n instructions (i18n, i18nStart) were generated before listener instructions. As a result, event listeners were attached to the wrong element (text node, not the parent element). This change updates the order of instructions and puts i18n ones after listeners, to make sure listeners are attached to the right elements. PR Close #29173 --- .../compliance/r3_view_compiler_i18n_spec.ts | 22 +++++++++++++++++++ .../compiler/src/render3/view/template.ts | 12 +++++----- packages/core/test/i18n_integration_spec.ts | 20 +++++++++++++++++ 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts index 2a13f675b1..6a63a39bd4 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts @@ -1270,6 +1270,28 @@ describe('i18n support in the view compiler', () => { verify(input, output); }); + + it('should generate event listeners instructions before i18n ones', () => { + const input = ` +

+ `; + + const output = String.raw ` + const $_c0$ = [${AttributeMarker.Bindings}, "click"]; + const $MSG_EXTERNAL_3902961887793684628$$APP_SPEC_TS_1$ = goog.getMsg("Hello"); + … + template: function MyComponent_Template(rf, ctx) { + if (rf & 1) { + $r3$.ɵelementStart(0, "div", $_c0$); + $r3$.ɵlistener("click", function MyComponent_Template_div_click_0_listener($event) { return ctx.onClick(); }); + $r3$.ɵi18n(1, $MSG_EXTERNAL_3902961887793684628$$APP_SPEC_TS_1$); + $r3$.ɵelementEnd(); + } + } + `; + + verify(input, output); + }); }); describe('self-closing i18n instructions', () => { diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index 5038bf8b44..bca6947265 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -657,12 +657,6 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver } } - // Note: it's important to keep i18n/i18nStart instructions after i18nAttributes ones, - // to make sure i18nAttributes instruction targets current element at runtime. - if (isI18nRootElement) { - this.i18nStart(element.sourceSpan, element.i18n !, createSelfClosingI18nInstruction); - } - // The style bindings code is placed into two distinct blocks within the template function AOT // code: creation and update. The creation code contains the `elementStyling` instructions // which will apply the collected binding values to the element. `elementStyling` is @@ -680,6 +674,12 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver outputAst.sourceSpan, R3.listener, this.prepareListenerParameter(element.name, outputAst, elementIndex)); }); + + // Note: it's important to keep i18n/i18nStart instructions after i18nAttributes and + // listeners, to make sure i18nAttributes instruction targets current element at runtime. + if (isI18nRootElement) { + this.i18nStart(element.sourceSpan, element.i18n !, createSelfClosingI18nInstruction); + } } // the code here will collect all update-level styling instructions and add them to the diff --git a/packages/core/test/i18n_integration_spec.ts b/packages/core/test/i18n_integration_spec.ts index 7a9e297d39..e04bc596e0 100644 --- a/packages/core/test/i18n_integration_spec.ts +++ b/packages/core/test/i18n_integration_spec.ts @@ -28,6 +28,9 @@ class MyComp { age = 20; count = 2; otherLabel = 'other label'; + clicks = 0; + + onClick() { this.clicks++; } } const TRANSLATIONS: any = { @@ -254,6 +257,23 @@ onlyInIvy('Ivy i18n logic').describe('i18n', function() { const element = fixture.nativeElement.firstChild; expect(element).toHaveText('Bonjour John'); }); + + it('should work correctly with event listeners', () => { + const content = 'Hello {{ name }}'; + const template = ` +
${content}
+ `; + const fixture = getFixtureWithOverrides({template}); + + const element = fixture.nativeElement.firstChild; + const instance = fixture.componentInstance; + + expect(element).toHaveText('Bonjour John'); + expect(instance.clicks).toBe(0); + + element.click(); + expect(instance.clicks).toBe(1); + }); }); describe('ng-container and ng-template support', () => { From 63d18064fea1c32b96b6eb82ff68eb2a97cefe2f Mon Sep 17 00:00:00 2001 From: Andrew Seguin Date: Fri, 8 Mar 2019 00:17:31 +0000 Subject: [PATCH 0273/1073] test(ivy): add table root causes (#29177) PR Close #29177 --- tools/material-ci/angular_material_test_blocklist.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 0ac38241a4..37795369a0 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -55,11 +55,11 @@ window.testBlocklist = { }, "CdkTable should be able to apply classes to rows based on their context": { "error": "Error: Expected false to be true.", - "notes": "Unknown" + "notes": "FW-842: View engine dirty-checks projected views when the declaration place is checked" }, "CdkTable should be able to apply classes to cells based on their row context": { "error": "Error: Expected false to be true.", - "notes": "Unknown" + "notes": "FW-842: View engine dirty-checks projected views when the declaration place is checked" }, "CdkDrag in a drop container should be able to customize the preview element": { "error": "Error: Expected cdk-drag cdk-drag-preview to contain 'custom-preview'.", From 014841dfefd0186ed3da197593b0e2599c32c182 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Thu, 7 Mar 2019 18:46:24 -0800 Subject: [PATCH 0274/1073] test(ivy): fix failing view ref test (#29178) PR Close #29178 --- packages/core/test/acceptance/view_ref_spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/test/acceptance/view_ref_spec.ts b/packages/core/test/acceptance/view_ref_spec.ts index 975d38e6a2..fcb1cf28f6 100644 --- a/packages/core/test/acceptance/view_ref_spec.ts +++ b/packages/core/test/acceptance/view_ref_spec.ts @@ -47,10 +47,10 @@ describe('ViewRef', () => { const appComponent = fixture.componentInstance; appComponent.create(); fixture.detectChanges(); - expect(document.body.querySelector('dynamic-cpt')).not.toBeUndefined(); + expect(document.body.querySelector('dynamic-cpt')).not.toBeFalsy(); appComponent.destroy(); fixture.detectChanges(); - expect(document.body.querySelector('dynamic-cpt')).toBeUndefined(); + expect(document.body.querySelector('dynamic-cpt')).toBeFalsy(); }); }); From a68b1a1894b37a7064bf5f9fdd62b8338bc53ba0 Mon Sep 17 00:00:00 2001 From: Renan Montebelo Date: Thu, 21 Feb 2019 22:47:07 -0600 Subject: [PATCH 0275/1073] feat(forms): clear (remove all) components from a FormArray (#28918) This method is a more convenient and efficient way of removing all components from a FormArray. Before it, we needed to loop the FormArray removing each component until empty. Resolves #18531 PR Close #28918 --- packages/forms/src/model.ts | 37 +++++++++++++++++++++++++ packages/forms/test/form_array_spec.ts | 14 ++++++++++ tools/public_api_guard/forms/forms.d.ts | 1 + 3 files changed, 52 insertions(+) diff --git a/packages/forms/src/model.ts b/packages/forms/src/model.ts index 23b066866c..71d6ad0f6b 100644 --- a/packages/forms/src/model.ts +++ b/packages/forms/src/model.ts @@ -1895,6 +1895,43 @@ export class FormArray extends AbstractControl { }); } + /** + * Remove all controls in the `FormArray`. + * + * @usageNotes + * ### Remove all elements from a FormArray + * + * ```ts + * const arr = new FormArray([ + * new FormControl(), + * new FormControl() + * ]); + * console.log(arr.length); // 2 + * + * arr.clear(); + * console.log(arr.length); // 0 + * ``` + * + * It's a simpler and more efficient alternative to removing all elements one by one: + * + * ```ts + * const arr = new FormArray([ + * new FormControl(), + * new FormControl() + * ]); + * + * while (arr.length) { + * arr.removeAt(0); + * } + * ``` + */ + clear(): void { + if (this.controls.length < 1) return; + this._forEachChild((control: AbstractControl) => control._registerOnCollectionChange(() => {})); + this.controls.splice(0); + this.updateValueAndValidity(); + } + /** @internal */ _syncPendingControls(): boolean { let subtreeUpdated = this.controls.reduce((updated: boolean, child: AbstractControl) => { diff --git a/packages/forms/test/form_array_spec.ts b/packages/forms/test/form_array_spec.ts index 2a94c68a44..fe89f77238 100644 --- a/packages/forms/test/form_array_spec.ts +++ b/packages/forms/test/form_array_spec.ts @@ -59,6 +59,20 @@ import {of } from 'rxjs'; expect(a.controls).toEqual([c1, c3]); }); + it('should support clearing', () => { + a.push(c1); + a.push(c2); + a.push(c3); + + a.clear(); + + expect(a.controls).toEqual([]); + + a.clear(); + + expect(a.controls).toEqual([]); + }); + it('should support inserting', () => { a.push(c1); a.push(c3); diff --git a/tools/public_api_guard/forms/forms.d.ts b/tools/public_api_guard/forms/forms.d.ts index f76319ff16..f9e915c065 100644 --- a/tools/public_api_guard/forms/forms.d.ts +++ b/tools/public_api_guard/forms/forms.d.ts @@ -170,6 +170,7 @@ export declare class FormArray extends AbstractControl { readonly length: number; constructor(controls: AbstractControl[], validatorOrOpts?: ValidatorFn | ValidatorFn[] | AbstractControlOptions | null, asyncValidator?: AsyncValidatorFn | AsyncValidatorFn[] | null); at(index: number): AbstractControl; + clear(): void; getRawValue(): any[]; insert(index: number, control: AbstractControl): void; patchValue(value: any[], options?: { From d4728c40d9c3a649efcf8f7a88c67c4602f71b52 Mon Sep 17 00:00:00 2001 From: Patrick Roche Date: Thu, 7 Mar 2019 18:47:27 -0500 Subject: [PATCH 0276/1073] docs: add ending slash to input in TOH pt1 and pt2 examples (#29176) PR Close #29176 --- .../examples/toh-pt1/src/app/heroes/heroes.component.1.html | 2 +- .../examples/toh-pt1/src/app/heroes/heroes.component.html | 2 +- .../examples/toh-pt2/src/app/heroes/heroes.component.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/aio/content/examples/toh-pt1/src/app/heroes/heroes.component.1.html b/aio/content/examples/toh-pt1/src/app/heroes/heroes.component.1.html index 611f67251c..2879760218 100644 --- a/aio/content/examples/toh-pt1/src/app/heroes/heroes.component.1.html +++ b/aio/content/examples/toh-pt1/src/app/heroes/heroes.component.1.html @@ -11,7 +11,7 @@
diff --git a/aio/content/examples/toh-pt1/src/app/heroes/heroes.component.html b/aio/content/examples/toh-pt1/src/app/heroes/heroes.component.html index fb2b96b5c6..9a5af7e30c 100644 --- a/aio/content/examples/toh-pt1/src/app/heroes/heroes.component.html +++ b/aio/content/examples/toh-pt1/src/app/heroes/heroes.component.html @@ -5,6 +5,6 @@
id: {{hero.id}}
diff --git a/aio/content/examples/toh-pt2/src/app/heroes/heroes.component.html b/aio/content/examples/toh-pt2/src/app/heroes/heroes.component.html index ff9ba0206d..f8bcb64918 100644 --- a/aio/content/examples/toh-pt2/src/app/heroes/heroes.component.html +++ b/aio/content/examples/toh-pt2/src/app/heroes/heroes.component.html @@ -18,7 +18,7 @@
id: {{selectedHero.id}}
From 142ac41cacb018ea5fd7cd1a6727f8789c76b6b2 Mon Sep 17 00:00:00 2001 From: Pete Bacon Darwin Date: Thu, 7 Mar 2019 11:44:12 +0000 Subject: [PATCH 0277/1073] fix(ivy): ngcc - handle prototype pseudo-member from typings file in ESM5 host (#29158) When processing a JavaScript program, TS may come across a symbol that has been imported from a TypeScript typings file. In this case the compiler may pass the ReflectionHost a `prototype` symbol as an export of the class. This pseudo-member symbol has no declarations, which previously caused the code in `Esm5ReflectionHost.reflectMembers()` to crash. Now we just quietly ignore such a symbol and leave `Esm2015ReflectionHost` to deal with it. (As it happens `Esm2015ReflectionHost` also quietly ignores this symbol). PR Close #29158 --- .../src/ngcc/src/host/esm2015_host.ts | 3 +++ .../src/ngcc/src/host/esm5_host.ts | 2 +- .../src/ngcc/test/host/esm5_host_spec.ts | 19 +++++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts b/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts index b99eff1bb8..9b387129b0 100644 --- a/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts +++ b/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts @@ -775,6 +775,9 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N const node = symbol.valueDeclaration || symbol.declarations && symbol.declarations[0]; if (!node) { + // If the symbol has been imported from a TypeScript typings file then the compiler + // may pass the `prototype` symbol as an export of the class. + // But this has no declaration. In this case we just quietly ignore it. return null; } diff --git a/packages/compiler-cli/src/ngcc/src/host/esm5_host.ts b/packages/compiler-cli/src/ngcc/src/host/esm5_host.ts index 77490430aa..c6ab1d85be 100644 --- a/packages/compiler-cli/src/ngcc/src/host/esm5_host.ts +++ b/packages/compiler-cli/src/ngcc/src/host/esm5_host.ts @@ -228,7 +228,7 @@ export class Esm5ReflectionHost extends Esm2015ReflectionHost { protected reflectMembers(symbol: ts.Symbol, decorators?: Decorator[], isStatic?: boolean): ClassMember[]|null { const node = symbol.valueDeclaration || symbol.declarations && symbol.declarations[0]; - const propertyDefinition = getPropertyDefinition(node); + const propertyDefinition = node && getPropertyDefinition(node); if (propertyDefinition) { const members: ClassMember[] = []; if (propertyDefinition.setter) { diff --git a/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts b/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts index b83110b36a..0f93aa57e8 100644 --- a/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts @@ -520,6 +520,15 @@ const DECORATED_FILES = [ } ]; +const UNWANTED_PROTOTYPE_EXPORT_FILE = { + name: '/library.d.ts', + contents: ` + export declare class SomeParam { + someInstanceMethod(): void; + static someStaticProp: any; + }` +}; + describe('Esm5ReflectionHost', () => { describe('getDecoratorsOfDeclaration()', () => { @@ -906,6 +915,16 @@ describe('Esm5ReflectionHost', () => { expect(decorators[0].args).toEqual([]); }); }); + + it('should ignore the prototype pseudo-static property on class imported from typings files', + () => { + const program = makeTestProgram(UNWANTED_PROTOTYPE_EXPORT_FILE); + const host = new Esm5ReflectionHost(false, program.getTypeChecker()); + const classNode = getDeclaration( + program, UNWANTED_PROTOTYPE_EXPORT_FILE.name, 'SomeParam', ts.isClassDeclaration); + const members = host.getMembersOfClass(classNode); + expect(members.find(m => m.name === 'prototype')).toBeUndefined(); + }); }); describe('getConstructorParameters', () => { From 37c5a264214811382bc918bdcac61edd3375a502 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 6 Mar 2019 14:26:56 -0800 Subject: [PATCH 0278/1073] perf(ivy): switch ngtsc to use single-file emit (#29147) In the TypeScript compiler API, emit() can be performed either on a single ts.SourceFile or on the entire ts.Program simultaneously. ngtsc previously used whole-program emit, which was convenient to use while spinning up the project but has a significant drawback: it causes a type checking operation to occur for the whole program, including .d.ts files. In large Bazel environments (such as Google's codebase), an ngtsc invocation can have a few .ts files and thousands of .d.ts inputs. This unwanted type checking is therefore a significant drain on performance. This commit switches ngtsc to emit each .ts file individually, avoiding the unwanted type checking. PR Close #29147 --- packages/compiler-cli/src/ngtsc/program.ts | 33 ++++++++++++++-------- 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/program.ts b/packages/compiler-cli/src/ngtsc/program.ts index 22a667ef87..50d1b9eb7f 100644 --- a/packages/compiler-cli/src/ngtsc/program.ts +++ b/packages/compiler-cli/src/ngtsc/program.ts @@ -293,19 +293,28 @@ export class NgtscProgram implements api.Program { beforeTransforms.push(...customTransforms.beforeTs); } + const emitResults: ts.EmitResult[] = []; + for (const targetSourceFile of this.tsProgram.getSourceFiles()) { + if (targetSourceFile.isDeclarationFile) { + continue; + } + + emitResults.push(emitCallback({ + targetSourceFile, + program: this.tsProgram, + host: this.host, + options: this.options, + emitOnlyDtsFiles: false, writeFile, + customTransformers: { + before: beforeTransforms, + after: customTransforms && customTransforms.afterTs, + afterDeclarations: afterDeclarationsTransforms, + }, + })); + } + // Run the emit, including a custom transformer that will downlevel the Ivy decorators in code. - const emitResult = emitCallback({ - program: this.tsProgram, - host: this.host, - options: this.options, - emitOnlyDtsFiles: false, writeFile, - customTransformers: { - before: beforeTransforms, - after: customTransforms && customTransforms.afterTs, - afterDeclarations: afterDeclarationsTransforms, - }, - }); - return emitResult; + return ((opts && opts.mergeEmitResultsCallback) || mergeEmitResults)(emitResults); } private compileTypeCheckProgram(ctx: TypeCheckContext): ReadonlyArray { From b6f6b1178f06442d0bf3271fed2380bdebc8a94f Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Wed, 6 Mar 2019 16:35:08 -0800 Subject: [PATCH 0279/1073] fix(ivy): generate type references to a default import (#29146) This commit refactors and expands ngtsc's support for generating imports of values from imports of types (this is used for example when importing a class referenced in a type annotation in a constructor). Previously, this logic handled "import {Foo} from" and "import * as foo from" style imports, but failed on imports of default values ("import Foo from"). This commit moves the type-to-value logic to a separate file and expands it to cover the default import case. Doing this also required augmenting the ImportManager to track default as well as non-default import generation. The APIs were made a little cleaner at the same time. PR Close #29146 --- .../src/ngcc/src/rendering/esm_renderer.ts | 12 +- .../src/ngcc/src/rendering/renderer.ts | 4 +- .../test/rendering/esm2015_renderer_spec.ts | 15 +- .../ngcc/test/rendering/esm5_renderer_spec.ts | 15 +- .../src/ngcc/test/rendering/renderer_spec.ts | 15 +- .../src/ngtsc/reflection/index.ts | 3 +- .../src/ngtsc/reflection/src/type_to_value.ts | 185 ++++++++++++++++++ .../src/ngtsc/reflection/src/typescript.ts | 128 +----------- .../src/ngtsc/reflection/test/ts_host_spec.ts | 27 +++ .../src/ngtsc/transform/src/utils.ts | 18 +- .../src/ngtsc/translator/BUILD.bazel | 1 + .../src/ngtsc/translator/src/translator.ts | 46 +++-- .../src/ngtsc/typecheck/src/context.ts | 8 +- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 28 +++ 14 files changed, 349 insertions(+), 156 deletions(-) create mode 100644 packages/compiler-cli/src/ngtsc/reflection/src/type_to_value.ts diff --git a/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts b/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts index 9bb8165a11..580ce15b99 100644 --- a/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts +++ b/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts @@ -23,9 +23,17 @@ export class EsmRenderer extends Renderer { /** * Add the imports at the top of the file */ - addImports(output: MagicString, imports: {name: string; as: string;}[]): void { + addImports(output: MagicString, imports: { + specifier: string; qualifier: string; isDefault: boolean + }[]): void { // The imports get inserted at the very top of the file. - imports.forEach(i => { output.appendLeft(0, `import * as ${i.as} from '${i.name}';\n`); }); + imports.forEach(i => { + if (!i.isDefault) { + output.appendLeft(0, `import * as ${i.qualifier} from '${i.specifier}';\n`); + } else { + output.appendLeft(0, `import ${i.qualifier} from '${i.specifier}';\n`); + } + }); } addExports(output: MagicString, entryPointBasePath: string, exports: { diff --git a/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts b/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts index e310b6172b..00fc737b3f 100644 --- a/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts +++ b/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts @@ -245,7 +245,9 @@ export abstract class Renderer { protected abstract addConstants(output: MagicString, constants: string, file: ts.SourceFile): void; - protected abstract addImports(output: MagicString, imports: {name: string, as: string}[]): void; + protected abstract addImports( + output: MagicString, + imports: {specifier: string, qualifier: string, isDefault: boolean}[]): void; protected abstract addExports(output: MagicString, entryPointBasePath: string, exports: { identifier: string, from: string diff --git a/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts b/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts index a45ad7e28f..fd6419e8cc 100644 --- a/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts @@ -115,13 +115,24 @@ describe('Esm2015Renderer', () => { it('should insert the given imports at the start of the source file', () => { const {renderer} = setup(PROGRAM); const output = new MagicString(PROGRAM.contents); - renderer.addImports( - output, [{name: '@angular/core', as: 'i0'}, {name: '@angular/common', as: 'i1'}]); + renderer.addImports(output, [ + {specifier: '@angular/core', qualifier: 'i0', isDefault: false}, + {specifier: '@angular/common', qualifier: 'i1', isDefault: false} + ]); expect(output.toString()).toContain(`import * as i0 from '@angular/core'; import * as i1 from '@angular/common'; /* A copyright notice */`); }); + + it('should insert a default import at the start of the source file', () => { + const {renderer} = setup(PROGRAM); + const output = new MagicString(PROGRAM.contents); + renderer.addImports(output, [ + {specifier: 'test', qualifier: 'i0', isDefault: true}, + ]); + expect(output.toString()).toContain(`import i0 from 'test';`); + }); }); describe('addExports', () => { diff --git a/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts b/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts index fe8bf2aaa3..23f21f3d94 100644 --- a/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts @@ -152,13 +152,24 @@ describe('Esm5Renderer', () => { it('should insert the given imports at the start of the source file', () => { const {renderer} = setup(PROGRAM); const output = new MagicString(PROGRAM.contents); - renderer.addImports( - output, [{name: '@angular/core', as: 'i0'}, {name: '@angular/common', as: 'i1'}]); + renderer.addImports(output, [ + {specifier: '@angular/core', qualifier: 'i0', isDefault: false}, + {specifier: '@angular/common', qualifier: 'i1', isDefault: false} + ]); expect(output.toString()).toContain(`import * as i0 from '@angular/core'; import * as i1 from '@angular/common'; /* A copyright notice */`); }); + + it('should insert a default import at the start of the source file', () => { + const {renderer} = setup(PROGRAM); + const output = new MagicString(PROGRAM.contents); + renderer.addImports(output, [ + {specifier: 'test', qualifier: 'i0', isDefault: true}, + ]); + expect(output.toString()).toContain(`import i0 from 'test';`); + }); }); describe('addExports', () => { diff --git a/packages/compiler-cli/src/ngcc/test/rendering/renderer_spec.ts b/packages/compiler-cli/src/ngcc/test/rendering/renderer_spec.ts index 0c582c52f1..dc2f48f679 100644 --- a/packages/compiler-cli/src/ngcc/test/rendering/renderer_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/rendering/renderer_spec.ts @@ -23,7 +23,8 @@ class TestRenderer extends Renderer { constructor(host: Esm2015ReflectionHost, isCore: boolean, bundle: EntryPointBundle) { super(host, isCore, bundle, '/src', '/dist'); } - addImports(output: MagicString, imports: {name: string, as: string}[]) { + addImports( + output: MagicString, imports: {specifier: string, qualifier: string, isDefault: boolean}[]) { output.prepend('\n// ADD IMPORTS\n'); } addExports(output: MagicString, baseEntryPointPath: string, exports: { @@ -171,7 +172,7 @@ A.ngComponentDef = ɵngcc0.ɵdefineComponent({ type: A, selectors: [["a"]], fact const addImportsSpy = renderer.addImports as jasmine.Spy; expect(addImportsSpy.calls.first().args[0].toString()).toEqual(RENDERED_CONTENTS); expect(addImportsSpy.calls.first().args[1]).toEqual([ - {name: '@angular/core', as: 'ɵngcc0'} + {specifier: '@angular/core', qualifier: 'ɵngcc0', isDefault: false} ]); }); @@ -287,7 +288,9 @@ A.ngDirectiveDef = ɵngcc0.ɵdefineDirective({ type: A, selectors: [["", "a", "" expect(addDefinitionsSpy.calls.first().args[2]) .toContain(`/*@__PURE__*/ ɵngcc0.setClassMetadata(`); const addImportsSpy = renderer.addImports as jasmine.Spy; - expect(addImportsSpy.calls.first().args[1]).toEqual([{name: './r3_symbols', as: 'ɵngcc0'}]); + expect(addImportsSpy.calls.first().args[1]).toEqual([ + {specifier: './r3_symbols', qualifier: 'ɵngcc0', isDefault: false} + ]); }); it('should render no imports in FESM bundles', () => { @@ -502,9 +505,9 @@ A.ngDirectiveDef = ɵngcc0.ɵdefineDirective({ type: A, selectors: [["", "a", "" export declare function withProviders8(): (MyModuleWithProviders)&{ngModule:SomeModule};`); expect(renderer.addImports).toHaveBeenCalledWith(jasmine.any(MagicString), [ - {name: './module', as: 'ɵngcc0'}, - {name: '@angular/core', as: 'ɵngcc1'}, - {name: 'some-library', as: 'ɵngcc2'}, + {specifier: './module', qualifier: 'ɵngcc0', isDefault: false}, + {specifier: '@angular/core', qualifier: 'ɵngcc1', isDefault: false}, + {specifier: 'some-library', qualifier: 'ɵngcc2', isDefault: false}, ]); diff --git a/packages/compiler-cli/src/ngtsc/reflection/index.ts b/packages/compiler-cli/src/ngtsc/reflection/index.ts index d5615ed5ac..75186f70d8 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/index.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/index.ts @@ -7,4 +7,5 @@ */ export * from './src/host'; -export {TypeScriptReflectionHost, filterToMembersWithDecorator, reflectIdentifierOfDeclaration, reflectNameOfDeclaration, reflectObjectLiteral, reflectTypeEntityToDeclaration, typeNodeToValueExpr} from './src/typescript'; \ No newline at end of file +export {DEFAULT_EXPORT_NAME, typeNodeToValueExpr} from './src/type_to_value'; +export {TypeScriptReflectionHost, filterToMembersWithDecorator, reflectIdentifierOfDeclaration, reflectNameOfDeclaration, reflectObjectLiteral, reflectTypeEntityToDeclaration} from './src/typescript'; \ No newline at end of file diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/type_to_value.ts b/packages/compiler-cli/src/ngtsc/reflection/src/type_to_value.ts new file mode 100644 index 0000000000..f8ffff8aad --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/reflection/src/type_to_value.ts @@ -0,0 +1,185 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {TypeValueReference} from './host'; + +export const DEFAULT_EXPORT_NAME = '*'; + +/** + * Potentially convert a `ts.TypeNode` to a `TypeValueReference`, which indicates how to use the + * type given in the `ts.TypeNode` in a value position. + * + * This can return `null` if the `typeNode` is `null`, if it does not refer to a symbol with a value + * declaration, or if it is not possible to statically understand. + */ +export function typeToValue( + typeNode: ts.TypeNode | null, checker: ts.TypeChecker): TypeValueReference|null { + // It's not possible to get a value expression if the parameter doesn't even have a type. + if (typeNode === null || !ts.isTypeReferenceNode(typeNode)) { + return null; + } + + const symbols = resolveTypeSymbols(typeNode, checker); + if (symbols === null) { + return null; + } + + const {local, decl} = symbols; + // It's only valid to convert a type reference to a value reference if the type actually + // has a value declaration associated with it. + if (decl.valueDeclaration === undefined) { + return null; + } + + // The type points to a valid value declaration. Rewrite the TypeReference into an + // Expression which references the value pointed to by the TypeReference, if possible. + + // Look at the local `ts.Symbol`'s declarations and see if it comes from an import + // statement. If so, extract the module specifier and the name of the imported type. + const firstDecl = local.declarations && local.declarations[0]; + + if (firstDecl && isImportSource(firstDecl)) { + const origin = extractModuleAndNameFromImport(firstDecl, symbols.importName); + return {local: false, valueDeclaration: decl.valueDeclaration, ...origin}; + } else { + const expression = typeNodeToValueExpr(typeNode); + if (expression !== null) { + return { + local: true, + expression, + }; + } else { + return null; + } + } +} + +/** + * Attempt to extract a `ts.Expression` that's equivalent to a `ts.TypeNode`, as the two have + * different AST shapes but can reference the same symbols. + * + * This will return `null` if an equivalent expression cannot be constructed. + */ +export function typeNodeToValueExpr(node: ts.TypeNode): ts.Expression|null { + if (ts.isTypeReferenceNode(node)) { + return entityNameToValue(node.typeName); + } else { + return null; + } +} + +/** + * Resolve a `TypeReference` node to the `ts.Symbol`s for both its declaration and its local source. + * + * In the event that the `TypeReference` refers to a locally declared symbol, these will be the + * same. If the `TypeReference` refers to an imported symbol, then `decl` will be the fully resolved + * `ts.Symbol` of the referenced symbol. `local` will be the `ts.Symbol` of the `ts.Identifer` which + * points to the import statement by which the symbol was imported. + * + * In the event `typeRef` refers to a default import, an `importName` will also be returned to + * give the identifier name within the current file by which the import is known. + */ +function resolveTypeSymbols(typeRef: ts.TypeReferenceNode, checker: ts.TypeChecker): + {local: ts.Symbol, decl: ts.Symbol, importName: string | null}|null { + const typeName = typeRef.typeName; + // typeRefSymbol is the ts.Symbol of the entire type reference. + const typeRefSymbol: ts.Symbol|undefined = checker.getSymbolAtLocation(typeName); + if (typeRefSymbol === undefined) { + return null; + } + + // local is the ts.Symbol for the local ts.Identifier for the type. + // If the type is actually locally declared or is imported by name, for example: + // import {Foo} from './foo'; + // then it'll be the same as top. If the type is imported via a namespace import, for example: + // import * as foo from './foo'; + // and then referenced as: + // constructor(f: foo.Foo) + // then local will be the ts.Symbol of `foo`, whereas top will be the ts.Symbol of `foo.Foo`. + // This allows tracking of the import behind whatever type reference exists. + let local = typeRefSymbol; + let importName: string|null = null; + + // TODO(alxhub): this is technically not correct. The user could have any import type with any + // amount of qualification following the imported type: + // + // import * as foo from 'foo' + // constructor(inject: foo.X.Y.Z) + // + // What we really want is the ability to express the arbitrary operation of `.X.Y.Z` on top of + // whatever import we generate for 'foo'. This logic is sufficient for now, though. + if (ts.isQualifiedName(typeName) && ts.isIdentifier(typeName.left) && + ts.isIdentifier(typeName.right)) { + const localTmp = checker.getSymbolAtLocation(typeName.left); + if (localTmp !== undefined) { + local = localTmp; + importName = typeName.right.text; + } + } + + // De-alias the top-level type reference symbol to get the symbol of the actual declaration. + let decl = typeRefSymbol; + if (typeRefSymbol.flags & ts.SymbolFlags.Alias) { + decl = checker.getAliasedSymbol(typeRefSymbol); + } + return {local, decl, importName}; +} + +function entityNameToValue(node: ts.EntityName): ts.Expression|null { + if (ts.isQualifiedName(node)) { + const left = entityNameToValue(node.left); + return left !== null ? ts.createPropertyAccess(left, node.right) : null; + } else if (ts.isIdentifier(node)) { + return ts.getMutableClone(node); + } else { + return null; + } +} + +function isImportSource(node: ts.Declaration): node is( + ts.ImportSpecifier | ts.NamespaceImport | ts.ImportClause) { + return ts.isImportSpecifier(node) || ts.isNamespaceImport(node) || ts.isImportClause(node); +} + +function extractModuleAndNameFromImport( + node: ts.ImportSpecifier | ts.NamespaceImport | ts.ImportClause, + localName: string | null): {name: string, moduleName: string} { + let name: string; + let moduleSpecifier: ts.Expression; + switch (node.kind) { + case ts.SyntaxKind.ImportSpecifier: + // The symbol was imported by name, in a ts.ImportSpecifier. + name = (node.propertyName || node.name).text; + moduleSpecifier = node.parent.parent.parent.moduleSpecifier; + break; + case ts.SyntaxKind.NamespaceImport: + // The symbol was imported via a namespace import. In this case, the name to use when + // importing it was extracted by resolveTypeSymbols. + if (localName === null) { + // resolveTypeSymbols() should have extracted the correct local name for the import. + throw new Error(`Debug failure: no local name provided for NamespaceImport`); + } + name = localName; + moduleSpecifier = node.parent.parent.moduleSpecifier; + break; + case ts.SyntaxKind.ImportClause: + name = DEFAULT_EXPORT_NAME; + moduleSpecifier = node.parent.moduleSpecifier; + break; + default: + throw new Error(`Unreachable: ${ts.SyntaxKind[(node as ts.Node).kind]}`); + } + + if (!ts.isStringLiteral(moduleSpecifier)) { + throw new Error('not a module specifier'); + } + const moduleName = moduleSpecifier.text; + return {moduleName, name}; +} diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts index 04aa900f06..f06b084a8e 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/typescript.ts @@ -9,6 +9,7 @@ import * as ts from 'typescript'; import {ClassMember, ClassMemberKind, CtorParameter, Declaration, Decorator, FunctionDefinition, Import, ReflectionHost, TypeValueReference} from './host'; +import {typeToValue} from './type_to_value'; /** * reflector.ts implements static reflection of declarations using the TypeScript `ts.TypeChecker`. @@ -48,7 +49,7 @@ export class TypeScriptReflectionHost implements ReflectionHost { // It may or may not be possible to write an expression that refers to the value side of the // type named for the parameter. - let typeValueExpr: TypeValueReference|null = null; + let originalTypeNode = node.type || null; let typeNode = originalTypeNode; @@ -67,68 +68,11 @@ export class TypeScriptReflectionHost implements ReflectionHost { } } - // It's not possible to get a value expression if the parameter doesn't even have a type. - if (typeNode && ts.isTypeReferenceNode(typeNode)) { - const symbols = resolveTypeSymbols(typeNode, this.checker); - if (symbols !== null) { - const {local, decl} = symbols; - // It's only valid to convert a type reference to a value reference if the type actually - // has a value declaration associated with it. - if (decl.valueDeclaration !== undefined) { - // The type points to a valid value declaration. Rewrite the TypeReference into an - // Expression which references the value pointed to by the TypeReference, if possible. - - // Look at the local `ts.Symbol`'s declarations and see if it comes from an import - // statement. If so, extract the module specifier and the name of the imported type. - const firstDecl = local.declarations && local.declarations[0]; - - if (firstDecl && ts.isImportSpecifier(firstDecl)) { - // The symbol was imported by name, in a ts.ImportSpecifier. - const name = (firstDecl.propertyName || firstDecl.name).text; - const moduleSpecifier = firstDecl.parent.parent.parent.moduleSpecifier; - if (!ts.isStringLiteral(moduleSpecifier)) { - throw new Error('not a module specifier'); - } - const moduleName = moduleSpecifier.text; - typeValueExpr = { - local: false, - name, - moduleName, - valueDeclaration: decl.valueDeclaration, - }; - } else if ( - firstDecl && ts.isNamespaceImport(firstDecl) && symbols.importName !== null) { - // The symbol was imported via a namespace import. In this case, the name to use when - // importing it was extracted by resolveTypeSymbols. - const name = symbols.importName; - const moduleSpecifier = firstDecl.parent.parent.moduleSpecifier; - if (!ts.isStringLiteral(moduleSpecifier)) { - throw new Error('not a module specifier'); - } - const moduleName = moduleSpecifier.text; - typeValueExpr = { - local: false, - name, - moduleName, - valueDeclaration: decl.valueDeclaration, - }; - } else { - const expression = typeNodeToValueExpr(typeNode); - if (expression !== null) { - typeValueExpr = { - local: true, - expression, - }; - } - } - } - } - } + const typeValueReference = typeToValue(typeNode, this.checker); return { name, - nameNode: node.name, - typeValueReference: typeValueExpr, + nameNode: node.name, typeValueReference, typeNode: originalTypeNode, decorators, }; }); @@ -490,25 +434,6 @@ function parameterName(name: ts.BindingName): string|null { } } -export function typeNodeToValueExpr(node: ts.TypeNode): ts.Expression|null { - if (ts.isTypeReferenceNode(node)) { - return entityNameToValue(node.typeName); - } else { - return null; - } -} - -function entityNameToValue(node: ts.EntityName): ts.Expression|null { - if (ts.isQualifiedName(node)) { - const left = entityNameToValue(node.left); - return left !== null ? ts.createPropertyAccess(left, node.right) : null; - } else if (ts.isIdentifier(node)) { - return ts.getMutableClone(node); - } else { - return null; - } -} - function propertyNameToString(node: ts.PropertyName): string|null { if (ts.isIdentifier(node) || ts.isStringLiteral(node) || ts.isNumericLiteral(node)) { return node.text; @@ -516,48 +441,3 @@ function propertyNameToString(node: ts.PropertyName): string|null { return null; } } - -/** - * Resolve a `TypeReference` node to the `ts.Symbol`s for both its declaration and its local source. - * - * In the event that the `TypeReference` refers to a locally declared symbol, these will be the - * same. If the `TypeReference` refers to an imported symbol, then `decl` will be the fully resolved - * `ts.Symbol` of the referenced symbol. `local` will be the `ts.Symbol` of the `ts.Identifer` which - * points to the import statement by which the symbol was imported. - */ -function resolveTypeSymbols(typeRef: ts.TypeReferenceNode, checker: ts.TypeChecker): - {local: ts.Symbol, decl: ts.Symbol, importName: string | null}|null { - const typeName = typeRef.typeName; - // typeRefSymbol is the ts.Symbol of the entire type reference. - const typeRefSymbol: ts.Symbol|undefined = checker.getSymbolAtLocation(typeName); - if (typeRefSymbol === undefined) { - return null; - } - - // local is the ts.Symbol for the local ts.Identifier for the type. - // If the type is actually locally declared or is imported by name, for example: - // import {Foo} from './foo'; - // then it'll be the same as top. If the type is imported via a namespace import, for example: - // import * as foo from './foo'; - // and then referenced as: - // constructor(f: foo.Foo) - // then local will be the ts.Symbol of `foo`, whereas top will be the ts.Symbol of `foo.Foo`. - // This allows tracking of the import behind whatever type reference exists. - let local = typeRefSymbol; - let importName: string|null = null; - if (ts.isQualifiedName(typeName) && ts.isIdentifier(typeName.left) && - ts.isIdentifier(typeName.right)) { - const localTmp = checker.getSymbolAtLocation(typeName.left); - if (localTmp !== undefined) { - local = localTmp; - importName = typeName.right.text; - } - } - - // De-alias the top-level type reference symbol to get the symbol of the actual declaration. - let decl = typeRefSymbol; - if (typeRefSymbol.flags & ts.SymbolFlags.Alias) { - decl = checker.getAliasedSymbol(typeRefSymbol); - } - return {local, decl, importName}; -} diff --git a/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts b/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts index 2425512d61..0ad0c20598 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts @@ -147,6 +147,33 @@ describe('reflector', () => { expectParameter(args[0], 'bar', {moduleName: './bar', name: 'Bar'}); }); + it('should reflect an argument from a default import', () => { + const {program} = makeProgram([ + { + name: 'bar.ts', + contents: ` + export default class Bar {} + ` + }, + { + name: 'entry.ts', + contents: ` + import Bar from './bar'; + + class Foo { + constructor(bar: Bar) {} + } + ` + } + ]); + const clazz = getDeclaration(program, 'entry.ts', 'Foo', ts.isClassDeclaration); + const checker = program.getTypeChecker(); + const host = new TypeScriptReflectionHost(checker); + const args = host.getConstructorParameters(clazz) !; + expect(args.length).toBe(1); + expectParameter(args[0], 'bar', {moduleName: './bar', name: '*'}); + }); + it('should reflect a nullable argument', () => { const {program} = makeProgram([ { diff --git a/packages/compiler-cli/src/ngtsc/transform/src/utils.ts b/packages/compiler-cli/src/ngtsc/transform/src/utils.ts index 9e6df27e95..513d263cd6 100644 --- a/packages/compiler-cli/src/ngtsc/transform/src/utils.ts +++ b/packages/compiler-cli/src/ngtsc/transform/src/utils.ts @@ -19,10 +19,22 @@ export function addImports( extraStatements: ts.Statement[] = []): ts.SourceFile { // Generate the import statements to prepend. const addedImports = importManager.getAllImports(sf.fileName).map(i => { + const qualifier = ts.createIdentifier(i.qualifier); + let importClause: ts.ImportClause; + if (!i.isDefault) { + importClause = ts.createImportClause( + /* name */ undefined, + /* namedBindings */ ts.createNamespaceImport(qualifier)); + } else { + importClause = ts.createImportClause( + /* name */ qualifier, + /* namedBindings */ undefined); + } return ts.createImportDeclaration( - undefined, undefined, - ts.createImportClause(undefined, ts.createNamespaceImport(ts.createIdentifier(i.as))), - ts.createLiteral(i.name)); + /* decorators */ undefined, + /* modifiers */ undefined, + /* importClause */ importClause, + /* moduleSpecifier */ ts.createLiteral(i.specifier)); }); // Filter out the existing imports and the source file body. All new statements diff --git a/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel b/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel index 351b1a7513..966e62bcbb 100644 --- a/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel @@ -9,6 +9,7 @@ ts_library( "//packages:types", "//packages/compiler", "//packages/compiler-cli/src/ngtsc/imports", + "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/util", "@npm//typescript", ], diff --git a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts index 5fd405ab35..0ffd59cc20 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts @@ -10,6 +10,7 @@ import {ArrayType, AssertNotNull, BinaryOperator, BinaryOperatorExpr, BuiltinTyp import * as ts from 'typescript'; import {ImportRewriter, NoopImportRewriter} from '../../imports'; +import {DEFAULT_EXPORT_NAME} from '../../reflection'; export class Context { constructor(readonly isStatement: boolean) {} @@ -38,11 +39,9 @@ const BINARY_OPERATORS = new Map([ [BinaryOperator.Plus, ts.SyntaxKind.PlusToken], ]); - - export class ImportManager { - private moduleToIndex = new Map(); - private importedModules = new Set(); + private nonDefaultImports = new Map(); + private defaultImports = new Map(); private nextIndex = 0; constructor(protected rewriter: ImportRewriter = new NoopImportRewriter(), private prefix = 'i') { @@ -61,20 +60,39 @@ export class ImportManager { } // If not, this symbol will be imported. Allocate a prefix for the imported module if needed. - if (!this.moduleToIndex.has(moduleName)) { - this.moduleToIndex.set(moduleName, `${this.prefix}${this.nextIndex++}`); - } - const moduleImport = this.moduleToIndex.get(moduleName) !; - return {moduleImport, symbol}; + const isDefault = symbol === DEFAULT_EXPORT_NAME; + + // Use a different map for non-default vs default imports. This allows the same module to be + // imported in both ways simultaneously. + const trackingMap = !isDefault ? this.nonDefaultImports : this.defaultImports; + + if (!trackingMap.has(moduleName)) { + trackingMap.set(moduleName, `${this.prefix}${this.nextIndex++}`); + } + const moduleImport = trackingMap.get(moduleName) !; + + if (isDefault) { + // For an import of a module's default symbol, the moduleImport *is* the name to use to refer + // to the import. + return {moduleImport: null, symbol: moduleImport}; + } else { + // Non-default imports have a qualifier and the symbol name to import. + return {moduleImport, symbol}; + } } - getAllImports(contextPath: string): {name: string, as: string}[] { - return Array.from(this.moduleToIndex.keys()).map(name => { - const as = this.moduleToIndex.get(name) !; - name = this.rewriter.rewriteSpecifier(name, contextPath); - return {name, as}; + getAllImports(contextPath: string): {specifier: string, qualifier: string, isDefault: boolean}[] { + const imports: {specifier: string, qualifier: string, isDefault: boolean}[] = []; + this.nonDefaultImports.forEach((qualifier, specifier) => { + specifier = this.rewriter.rewriteSpecifier(specifier, contextPath); + imports.push({specifier, qualifier, isDefault: false}); }); + this.defaultImports.forEach((qualifier, specifier) => { + specifier = this.rewriter.rewriteSpecifier(specifier, contextPath); + imports.push({specifier, qualifier, isDefault: true}); + }); + return imports; } } diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/context.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/context.ts index b9c7ab09d3..02f160e036 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/context.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/context.ts @@ -135,7 +135,13 @@ export class TypeCheckContext { // Write out the imports that need to be added to the beginning of the file. let imports = importManager.getAllImports(sf.fileName) - .map(i => `import * as ${i.as} from '${i.name}';`) + .map(i => { + if (!i.isDefault) { + return `import * as ${i.qualifier} from '${i.specifier}';`; + } else { + return `import ${i.qualifier} from '${i.specifier}';`; + } + }) .join('\n'); code = imports + '\n' + code; diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 6aaf47e99e..f3545e0abc 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -1970,6 +1970,34 @@ describe('ngtsc behavioral tests', () => { expect(jsContents).toMatch(setClassMetadataRegExp('type: i\\d\\.MyTypeB')); }); + it('should use default-imported types if they can be represented as values', () => { + env.tsconfig({}); + + env.write(`types.ts`, ` + export default class Default {} + export class Other {} + `); + env.write(`test.ts`, ` + import {Component} from '@angular/core'; + import {Other} from './types'; + import Default from './types'; + + @Component({selector: 'test', template: 'test'}) + export class SomeCmp { + constructor(arg: Default, other: Other) {} + } + `); + + env.driveMain(); + const jsContents = trim(env.getContents('test.js')); + expect(jsContents).toContain(`import i1 from "./types";`); + expect(jsContents).toContain(`import * as i2 from "./types";`); + expect(jsContents).toContain('i0.ɵdirectiveInject(i1)'); + expect(jsContents).toContain('i0.ɵdirectiveInject(i2.Other)'); + expect(jsContents).toMatch(setClassMetadataRegExp('type: i1')); + expect(jsContents).toMatch(setClassMetadataRegExp('type: i2.Other')); + }); + it('should use `undefined` in setClassMetadata if types can\'t be represented as values', () => { env.tsconfig({}); From a746b5b1ea4766167a8bdf9cb8159c1b200ecffc Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 8 Mar 2019 18:21:15 +0100 Subject: [PATCH 0280/1073] fix(ivy): inherited host listeners called twice (#29170) Fixes host listeners being inherited twice when going through `setClassMetadata`. This PR resolves FW-1142. PR Close #29170 --- .../src/reflection/reflection_capabilities.ts | 2 +- packages/core/src/render3/jit/directive.ts | 2 +- .../core/test/render3/jit/directive_spec.ts | 39 ++++++++++++++++++- .../angular_material_test_blocklist.js | 20 ++++++++++ 4 files changed, 59 insertions(+), 4 deletions(-) diff --git a/packages/core/src/reflection/reflection_capabilities.ts b/packages/core/src/reflection/reflection_capabilities.ts index fa47d0e074..77827fb428 100644 --- a/packages/core/src/reflection/reflection_capabilities.ts +++ b/packages/core/src/reflection/reflection_capabilities.ts @@ -214,7 +214,7 @@ export class ReflectionCapabilities implements PlatformReflectionCapabilities { if (!isType(typeOrFunc)) { return {}; } - return this._ownPropMetadata(typeOrFunc, Object) || {}; + return this._ownPropMetadata(typeOrFunc, getParentCtor(typeOrFunc)) || {}; } hasLifecycleHook(type: any, lcProperty: string): boolean { diff --git a/packages/core/src/render3/jit/directive.ts b/packages/core/src/render3/jit/directive.ts index f26e338b32..86e19f6870 100644 --- a/packages/core/src/render3/jit/directive.ts +++ b/packages/core/src/render3/jit/directive.ts @@ -137,7 +137,7 @@ export function extendsDirectlyFromObject(type: Type): boolean { * Extract the `R3DirectiveMetadata` for a particular directive (either a `Directive` or a * `Component`). */ -function directiveMetadata(type: Type, metadata: Directive): R3DirectiveMetadataFacade { +export function directiveMetadata(type: Type, metadata: Directive): R3DirectiveMetadataFacade { // Reflect inputs and outputs. const propMetadata = getReflect().ownPropMetadata(type); diff --git a/packages/core/test/render3/jit/directive_spec.ts b/packages/core/test/render3/jit/directive_spec.ts index 46f13a1969..c81842c475 100644 --- a/packages/core/test/render3/jit/directive_spec.ts +++ b/packages/core/test/render3/jit/directive_spec.ts @@ -6,8 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {WrappedNodeExpr} from '@angular/compiler'; -import {convertToR3QueryMetadata, extendsDirectlyFromObject} from '../../../src/render3/jit/directive'; +import {Directive, HostListener} from '@angular/core'; +import {setClassMetadata} from '@angular/core/src/render3/metadata'; + +import {convertToR3QueryMetadata, directiveMetadata, extendsDirectlyFromObject} from '../../../src/render3/jit/directive'; describe('jit directive helper functions', () => { @@ -96,4 +98,37 @@ describe('jit directive helper functions', () => { }); }); + + describe('directiveMetadata', () => { + it('should not inherit propMetadata from super class', () => { + class SuperDirective {} + setClassMetadata( + SuperDirective, [{type: Directive, args: []}], null, + {handleClick: [{type: HostListener, args: ['click']}]}); + + class SubDirective extends SuperDirective {} + setClassMetadata(SubDirective, [{type: Directive, args: []}], null, null); + + expect(directiveMetadata(SuperDirective, {}).propMetadata.handleClick).toBeTruthy(); + expect(directiveMetadata(SubDirective, {}).propMetadata.handleClick).toBeFalsy(); + }); + + it('should not inherit propMetadata from grand super class', () => { + class SuperSuperDirective {} + setClassMetadata( + SuperSuperDirective, [{type: Directive, args: []}], null, + {handleClick: [{type: HostListener, args: ['click']}]}); + + class SuperDirective {} + setClassMetadata(SuperDirective, [{type: Directive, args: []}], null, null); + + class SubDirective extends SuperDirective {} + + setClassMetadata(SubDirective, [{type: Directive, args: []}], null, null); + + expect(directiveMetadata(SuperSuperDirective, {}).propMetadata.handleClick).toBeTruthy(); + expect(directiveMetadata(SuperDirective, {}).propMetadata.handleClick).toBeFalsy(); + expect(directiveMetadata(SubDirective, {}).propMetadata.handleClick).toBeFalsy(); + }); + }); }); diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 37795369a0..bbc480ecc9 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -197,6 +197,26 @@ window.testBlocklist = { "error": "TypeError: Cannot read property 'nativeElement' of undefined", "notes": "Unknown" }, + "MatStepper basic stepper should not do anything when pressing the ENTER key with a modifier": { + "error": "Expected 0 to be 1, 'Expected index of focused step to increase by 1 after pressing the next key.'", + "notes": "FW-1146: Components should be able to inherit view queries from directives" + }, + "MatStepper basic stepper should not do anything when pressing the SPACE key with a modifier": { + "error": "Expected 0 to be 1, 'Expected index of focused step to increase by 1 after pressing the next key.'", + "notes": "FW-1146: Components should be able to inherit view queries from directives" + }, + "MatStepper vertical stepper should support using the left/right arrows to move focus": { + "error": "Expected 0 to be 1, 'Expected index of focused step to increase by 1 after pressing the next key.'", + "notes": "FW-1146: Components should be able to inherit view queries from directives" + }, + "MatStepper vertical stepper should support using the up/down arrows to move focus": { + "error": "Expected 0 to be 1, 'Expected index of focused step to increase by 1 after pressing the next key.'", + "notes": "FW-1146: Components should be able to inherit view queries from directives" + }, + "MatStepper vertical stepper should reverse arrow key focus in RTL mode": { + "error": "Expected 0 to be 1", + "notes": "FW-1146: Components should be able to inherit view queries from directives" + }, "MatSidenav should be fixed position when in fixed mode": { "error": "Error: Expected ng-tns-c24896-0 ng-trigger ng-trigger-transform mat-drawer mat-sidenav mat-drawer-over ng-star-inserted to contain 'mat-sidenav-fixed'.", "notes": "FW-1132: Host class bindings don't work if super class has host class bindings" From 7b0e9eddd19857f6fd66f03ddee5e920767bd951 Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 6 Mar 2019 09:04:18 +0100 Subject: [PATCH 0281/1073] build: enable bundle_dts for core package (#28884) `ng_module` will now include an `src/r3_symbol.d.ts` when compiling the core package under `ngc` togather with `dts bundling`, This is due that `ngcc` relies on this file to be present, but the `r3_symbols` file which is not part of our public api. With this change, we can now ship an addition dts file which is flattened. PR Close #28884 --- packages/bazel/src/api-extractor/index.ts | 16 ++++- packages/bazel/src/ng_module.bzl | 60 +++++++++++++------ packages/bazel/src/ng_package/ng_package.bzl | 4 +- .../test/ng_package/core_package.spec.ts | 49 +++++++-------- packages/core/BUILD.bazel | 2 - packages/core/src/render3/definition.ts | 4 +- packages/core/testing/BUILD.bazel | 2 - 7 files changed, 83 insertions(+), 54 deletions(-) diff --git a/packages/bazel/src/api-extractor/index.ts b/packages/bazel/src/api-extractor/index.ts index 4df9ecd8f7..2d327e4970 100644 --- a/packages/bazel/src/api-extractor/index.ts +++ b/packages/bazel/src/api-extractor/index.ts @@ -114,5 +114,19 @@ api-extractor: running with } const [tsConfig, entryPoint, dtsBundleOut] = process.argv.slice(2); - process.exitCode = runMain(tsConfig, entryPoint, dtsBundleOut); + const entryPoints = entryPoint.split(','); + const dtsBundleOuts = dtsBundleOut.split(','); + + if (entryPoints.length !== entryPoints.length) { + throw new Error( + `Entry points count (${entryPoints.length}) does not match Bundle out count (${dtsBundleOuts.length})`); + } + + for (let i = 0; i < entryPoints.length; i++) { + process.exitCode = runMain(tsConfig, entryPoints[i], dtsBundleOuts[i]); + + if (process.exitCode !== 0) { + break; + } + } } diff --git a/packages/bazel/src/ng_module.bzl b/packages/bazel/src/ng_module.bzl index 416927ff3d..07685f90fe 100644 --- a/packages/bazel/src/ng_module.bzl +++ b/packages/bazel/src/ng_module.bzl @@ -21,6 +21,7 @@ load( ) _FLAT_DTS_FILE_SUFFIX = ".bundle.d.ts" +_R3_SYMBOLS_DTS_FILE = "src/r3_symbols.d.ts" def compile_strategy(ctx): """Detect which strategy should be used to implement ng_module. @@ -142,6 +143,25 @@ def _should_produce_dts_bundle(ctx): # see: https://github.com/Microsoft/web-build-tools/issues/1029 return _is_legacy_ngc(ctx) and hasattr(ctx.attr, "bundle_dts") and ctx.attr.bundle_dts +def _should_produce_r3_symbols_bundle(ctx): + """Should we produce r3_symbols bundle. + + NGCC relies on having r3_symbols file. This file is located in @angular/core + And should only be included when bundling core in legacy mode. + + Args: + ctx: skylark rule execution context + + Returns: + true when we should produce r3_symbols dts. + """ + + # iif we are compiling @angular/core with ngc we should add this addition dts bundle + # because ngcc relies on having this file. + # see: https://github.com/angular/angular/blob/84406e4d6d93b28b23efbb1701bc5ae1084da67b/packages/compiler-cli/src/ngcc/src/packages/entry_point_bundle.ts#L56 + # todo: alan-agius4: remove when ngcc doesn't need this anymore + return _is_legacy_ngc(ctx) and ctx.attr.module_name == "@angular/core" + def _should_produce_flat_module_outs(ctx): """Should we produce flat module outputs. @@ -221,13 +241,16 @@ def _expected_outs(ctx): if not _is_bazel(): metadata_files += [ctx.actions.declare_file(basename + ext) for ext in metadata] - dts_bundle = None + dts_bundles = None if _should_produce_dts_bundle(ctx): # We need to add a suffix to bundle as it might collide with the flat module dts. # The flat module dts out contains several other exports - # https://github.com/angular/angular/blob/master/packages/compiler-cli/src/metadata/index_writer.ts#L18 + # https://github.com/angular/angular/blob/84406e4d6d93b28b23efbb1701bc5ae1084da67b/packages/compiler-cli/src/metadata/index_writer.ts#L18 # the file name will be like 'core.bundle.d.ts' - dts_bundle = ctx.actions.declare_file(ctx.label.name + _FLAT_DTS_FILE_SUFFIX) + dts_bundles = [ctx.actions.declare_file(ctx.label.name + _FLAT_DTS_FILE_SUFFIX)] + + if _should_produce_r3_symbols_bundle(ctx): + dts_bundles.append(ctx.actions.declare_file(_R3_SYMBOLS_DTS_FILE.replace(".d.ts", _FLAT_DTS_FILE_SUFFIX))) # We do this just when producing a flat module index for a publishable ng_module if _should_produce_flat_module_outs(ctx): @@ -254,7 +277,7 @@ def _expected_outs(ctx): declarations = declaration_files, summaries = summary_files, metadata = metadata_files, - dts_bundle = dts_bundle, + dts_bundles = dts_bundles, bundle_index_typings = bundle_index_typings, i18n_messages = i18n_messages_files, ) @@ -337,7 +360,7 @@ def ngc_compile_action( node_opts, locale = None, i18n_args = [], - dts_bundle_out = None): + dts_bundles_out = None): """Helper function to create the ngc action. This is exposed for google3 to wire up i18n replay rules, and is not intended @@ -353,7 +376,7 @@ def ngc_compile_action( node_opts: list of strings, extra nodejs options. locale: i18n locale, or None i18n_args: additional command-line arguments to ngc - dts_bundle_out: produced flattened dts file + dts_bundles_out: produced flattened dts file Returns: the parameters of the compilation which will be used to replay the ngc action for i18N. @@ -412,25 +435,28 @@ def ngc_compile_action( mnemonic = "Angular2MessageExtractor", ) - if dts_bundle_out != None: + if dts_bundles_out != None: # combine the inputs and outputs and filter .d.ts and json files filter_inputs = [f for f in inputs + outputs if f.path.endswith(".d.ts") or f.path.endswith(".json")] if _should_produce_flat_module_outs(ctx): - dts_entry_point = "%s.d.ts" % _flat_module_out_file(ctx) + dts_entry_points = ["%s.d.ts" % _flat_module_out_file(ctx)] else: - dts_entry_point = ctx.attr.entry_point.replace(".ts", ".d.ts") + dts_entry_points = [ctx.attr.entry_point.replace(".ts", ".d.ts")] + + if _should_produce_r3_symbols_bundle(ctx): + dts_entry_points.append(_R3_SYMBOLS_DTS_FILE) ctx.actions.run( progress_message = "Bundling DTS %s" % str(ctx.label), mnemonic = "APIExtractor", executable = ctx.executable._api_extractor, inputs = filter_inputs, - outputs = [dts_bundle_out], + outputs = dts_bundles_out, arguments = [ tsconfig_file.path, - "/".join([ctx.bin_dir.path, ctx.label.package, dts_entry_point]), - dts_bundle_out.path, + ",".join(["/".join([ctx.bin_dir.path, ctx.label.package, f]) for f in dts_entry_points]), + ",".join([f.path for f in dts_bundles_out]), ], ) @@ -454,7 +480,7 @@ def _filter_ts_inputs(all_inputs): if f.path.endswith(".js") or f.path.endswith(".ts") or f.path.endswith(".json") ] -def _compile_action(ctx, inputs, outputs, dts_bundle_out, messages_out, tsconfig_file, node_opts): +def _compile_action(ctx, inputs, outputs, dts_bundles_out, messages_out, tsconfig_file, node_opts): # Give the Angular compiler all the user-listed assets file_inputs = list(ctx.files.assets) @@ -483,7 +509,7 @@ def _compile_action(ctx, inputs, outputs, dts_bundle_out, messages_out, tsconfig ], ) - return ngc_compile_action(ctx, ctx.label, action_inputs, outputs, messages_out, tsconfig_file, node_opts, None, [], dts_bundle_out) + return ngc_compile_action(ctx, ctx.label, action_inputs, outputs, messages_out, tsconfig_file, node_opts, None, [], dts_bundles_out) def _prodmode_compile_action(ctx, inputs, outputs, tsconfig_file, node_opts): outs = _expected_outs(ctx) @@ -492,7 +518,7 @@ def _prodmode_compile_action(ctx, inputs, outputs, tsconfig_file, node_opts): def _devmode_compile_action(ctx, inputs, outputs, tsconfig_file, node_opts): outs = _expected_outs(ctx) compile_action_outputs = outputs + outs.devmode_js + outs.declarations + outs.summaries + outs.metadata - _compile_action(ctx, inputs, compile_action_outputs, outs.dts_bundle, None, tsconfig_file, node_opts) + _compile_action(ctx, inputs, compile_action_outputs, outs.dts_bundles, None, tsconfig_file, node_opts) def _ts_expected_outs(ctx, label, srcs_files = []): # rules_typescript expects a function with two or more arguments, but our @@ -553,8 +579,8 @@ def ng_module_impl(ctx, ts_compile_actions): flat_module_out_file = _flat_module_out_file(ctx), ) - if outs.dts_bundle != None: - providers["dts_bundle"] = outs.dts_bundle + if outs.dts_bundles != None: + providers["dts_bundles"] = outs.dts_bundles return providers diff --git a/packages/bazel/src/ng_package/ng_package.bzl b/packages/bazel/src/ng_package/ng_package.bzl index c1b4c64492..1fe0d5a365 100644 --- a/packages/bazel/src/ng_package/ng_package.bzl +++ b/packages/bazel/src/ng_package/ng_package.bzl @@ -229,8 +229,8 @@ def _ng_package_impl(ctx): # fallback to a reasonable default flat_module_out_file = "index.js" - if hasattr(dep, "dts_bundle"): - bundled_type_definitions.append(dep.dts_bundle) + if hasattr(dep, "dts_bundles"): + bundled_type_definitions += dep.dts_bundles elif len(type_definitions) == 0: # Filter out all TypeScript definitions generated by NGC as well as definition files # that do not belong to the current package. We only want to package types that belong diff --git a/packages/bazel/test/ng_package/core_package.spec.ts b/packages/bazel/test/ng_package/core_package.spec.ts index 7d231884fe..a30e27eab5 100644 --- a/packages/bazel/test/ng_package/core_package.spec.ts +++ b/packages/bazel/test/ng_package/core_package.spec.ts @@ -27,13 +27,9 @@ function p(templateStringArray: TemplateStringsArray) { return path.join(...segments); } - describe('@angular/core ng_package', () => { - describe('misc root files', () => { - describe('README.md', () => { - it('should have a README.md file with basic info', () => { expect(shx.cat('README.md')).toContain(`Angular`); expect(shx.cat('README.md')).toContain(`https://github.com/angular/angular`); @@ -41,17 +37,13 @@ describe('@angular/core ng_package', () => { }); }); - describe('primary entry-point', () => { - describe('package.json', () => { - const packageJson = 'package.json'; it('should have a package.json file', () => { expect(shx.grep('"name":', packageJson)).toContain(`@angular/core`); }); - it('should contain correct version number with the PLACEHOLDER string replaced', () => { expect(shx.grep('"version":', packageJson)).toMatch(/\d+\.\d+\.\d+(?!-PLACEHOLDER)/); }); @@ -72,31 +64,33 @@ describe('@angular/core ng_package', () => { }); }); - describe('typescript support', () => { - it('should have an index d.ts file', - () => { expect(shx.cat('core.d.ts')).toContain(`export *`); }); + if (ivyEnabled) { + it('should have an index d.ts file', + () => { expect(shx.cat('core.d.ts')).toContain(`export *`); }); - it('should not have amd module names', - () => { expect(shx.cat('public_api.d.ts')).not.toContain(' { expect(shx.cat('public_api.d.ts')).not.toContain(' { expect(shx.cat('core.d.ts')).toContain('export declare'); }); + it('should have an r3_symbols d.ts file', + () => { expect(shx.cat('src/r3_symbols.d.ts')).toContain('export declare'); }); + } }); - describe('closure', () => { it('should contain externs', () => { expect(shx.cat('src/testability/testability.externs.js')).toContain('/** @externs */'); }); }); - obsoleteInIvy('metadata files are no longer needed or produced in Ivy') .describe('angular metadata', () => { - it('should have metadata.json files', () => { expect(shx.cat('core.metadata.json')).toContain(`"__symbolic":"module"`); }); }); - describe('fesm2015', () => { it('should have a fesm15 file in the /fesm2015 directory', () => { expect(shx.cat('fesm2015/core.js')).toContain(`export {`); }); @@ -117,9 +111,7 @@ describe('@angular/core ng_package', () => { }); }); - describe('fesm5', () => { - it('should have a fesm5 file in the /fesm5 directory', () => { expect(shx.cat('fesm5/core.js')).toContain(`export {`); }); @@ -151,7 +143,6 @@ describe('@angular/core ng_package', () => { () => { expect(shx.cat('fesm5/core.js')).toMatch('export {.*makeParamDecorator'); }); }); - describe('esm2015', () => { it('should not contain any *.ngfactory.js files', () => { expect(shx.find('esm2015').filter(f => f.endsWith('.ngfactory.js'))).toEqual([]); @@ -162,7 +153,6 @@ describe('@angular/core ng_package', () => { }); }); - describe('esm5', () => { it('should not contain any *.ngfactory.js files', () => { expect(shx.find('esm5').filter(f => f.endsWith('.ngfactory.js'))).toEqual([]); }); @@ -171,9 +161,7 @@ describe('@angular/core ng_package', () => { () => { expect(shx.find('esm5').filter(f => f.endsWith('.ngsummary.js'))).toEqual([]); }); }); - describe('umd', () => { - it('should have a umd file in the /bundles directory', () => { expect(shx.ls('bundles/core.umd.js').length).toBe(1, 'File not found'); }); @@ -204,7 +192,6 @@ describe('@angular/core ng_package', () => { describe('secondary entry-point', () => { describe('package.json', () => { - const packageJson = p `testing/package.json`; it('should have a package.json file', @@ -222,9 +209,15 @@ describe('@angular/core ng_package', () => { }); describe('typings', () => { - const typingsFile = p `testing/index.d.ts`; - it('should have a typings file', - () => { expect(shx.cat(typingsFile)).toContain(`export * from './public_api';`); }); + if (ivyEnabled) { + const typingsFile = p `testing/index.d.ts`; + it('should have a typings file', + () => { expect(shx.cat(typingsFile)).toContain(`export * from './public_api';`); }); + } else { + const typingsFile = p `testing/testing.d.ts`; + it('should have a typings file', + () => { expect(shx.cat(typingsFile)).toContain('export declare'); }); + } obsoleteInIvy( 'now that we don\'t need metadata files, we don\'t need these redirects to help resolve paths to them') @@ -268,7 +261,6 @@ describe('@angular/core ng_package', () => { }); describe('umd', () => { - it('should have a umd file in the /bundles directory', () => { expect(shx.ls('bundles/core-testing.umd.js').length).toBe(1, 'File not found'); }); @@ -292,7 +284,6 @@ describe('@angular/core ng_package', () => { it('should define ng global symbols', () => { expect(shx.cat('bundles/core-testing.umd.js')).toContain('global.ng.core.testing = {}'); }); - }); }); }); diff --git a/packages/core/BUILD.bazel b/packages/core/BUILD.bazel index e67e93dc22..a722331a72 100644 --- a/packages/core/BUILD.bazel +++ b/packages/core/BUILD.bazel @@ -10,8 +10,6 @@ ng_module( "src/**/*.ts", ], ), - # PR to support this https://github.com/angular/angular/pull/28884 - bundle_dts = False, deps = [ "//packages:types", "//packages/core/src/compiler", diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 87d644ab6c..5f6bc7eb5d 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -19,7 +19,9 @@ import {stringify} from '../util/stringify'; import {EMPTY_ARRAY, EMPTY_OBJ} from './empty'; import {NG_COMPONENT_DEF, NG_DIRECTIVE_DEF, NG_MODULE_DEF, NG_PIPE_DEF} from './fields'; import {BaseDef, ComponentDef, ComponentDefFeature, ComponentTemplate, ComponentType, ContentQueriesFunction, DirectiveDef, DirectiveDefFeature, DirectiveType, DirectiveTypesOrFactory, FactoryFn, HostBindingsFunction, PipeDef, PipeType, PipeTypesOrFactory, ViewQueriesFunction} from './interfaces/definition'; -import {CssSelectorList} from './interfaces/projection'; +// while SelectorFlags is unused here, it's required so that types don't get resolved lazily +// see: https://github.com/Microsoft/web-build-tools/issues/1050 +import {CssSelectorList, SelectorFlags} from './interfaces/projection'; let _renderCompCount = 0; diff --git a/packages/core/testing/BUILD.bazel b/packages/core/testing/BUILD.bazel index 5095757d46..8009d9f276 100644 --- a/packages/core/testing/BUILD.bazel +++ b/packages/core/testing/BUILD.bazel @@ -9,8 +9,6 @@ ng_module( srcs = glob( ["**/*.ts"], ), - # PR to support this https://github.com/angular/angular/pull/28884 - bundle_dts = False, deps = [ "//packages:types", "//packages/compiler", From b3ffdf92c5bcc2d36399f350d9c95ca14fab8d26 Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 6 Mar 2019 09:05:06 +0100 Subject: [PATCH 0282/1073] test: fix ngcc tests to work with flattened dts files (#28884) PR Close #28884 --- integration/ngcc/test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integration/ngcc/test.sh b/integration/ngcc/test.sh index 0e8e17d49e..f2f09d7865 100755 --- a/integration/ngcc/test.sh +++ b/integration/ngcc/test.sh @@ -34,9 +34,9 @@ ivy-ngcc if [[ $? != 0 ]]; then exit 1; fi # Did it transform @angular/core typing files correctly? - grep "import [*] as ɵngcc0 from './r3_symbols';" node_modules/@angular/core/src/application_module.d.ts + grep "import [*] as ɵngcc0 from './src/r3_symbols';" node_modules/@angular/core/core.d.ts if [[ $? != 0 ]]; then exit 1; fi - grep "static ngInjectorDef: ɵngcc0.InjectorDef;" node_modules/@angular/core/src/application_module.d.ts + grep "static ngInjectorDef: ɵngcc0.InjectorDef;" node_modules/@angular/core/core.d.ts if [[ $? != 0 ]]; then exit 1; fi # Did it generate a base factory call for synthesized constructors correctly? From b012ab210b461f244b113b11f57971db274b77be Mon Sep 17 00:00:00 2001 From: Alan Date: Wed, 6 Mar 2019 09:06:34 +0100 Subject: [PATCH 0283/1073] test: add interm fix for test that rely on an index.d.ts file (#28884) At the moment, certain tests relies on resolving the module with an index.d.ts, this root cause might be some implementations are missing from the mocks. Similar to: https://github.com/angular/angular/commit/58b40453597b1d03353b046fe3d1a3cedef08b1d PR Close #28884 --- packages/compiler-cli/test/test_support.ts | 11 +++++++++-- packages/compiler/test/aot/test_util.ts | 5 +++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/compiler-cli/test/test_support.ts b/packages/compiler-cli/test/test_support.ts index b033097299..34ac6e6a92 100644 --- a/packages/compiler-cli/test/test_support.ts +++ b/packages/compiler-cli/test/test_support.ts @@ -122,8 +122,15 @@ export function setupBazelTo(tmpDirPath: string) { fs.mkdirSync(nodeModulesPath); fs.mkdirSync(angularDirectory); - getAngularPackagesFromRunfiles().forEach( - ({pkgPath, name}) => { fs.symlinkSync(pkgPath, path.join(angularDirectory, name), 'dir'); }); + getAngularPackagesFromRunfiles().forEach(({pkgPath, name}) => { + fs.symlinkSync(pkgPath, path.join(angularDirectory, name), 'dir'); + + // todo: check why we always need an index.d.ts + if (!fs.existsSync(path.join(angularDirectory, name, 'index.d.ts'))) { + fs.symlinkSync( + path.join(pkgPath, `${name}.d.ts`), path.join(angularDirectory, name, 'index.d.ts')); + } + }); // Link typescript const typeScriptSource = resolveNpmTreeArtifact('npm/node_modules/typescript'); diff --git a/packages/compiler/test/aot/test_util.ts b/packages/compiler/test/aot/test_util.ts index ce969725ef..bd1b416821 100644 --- a/packages/compiler/test/aot/test_util.ts +++ b/packages/compiler/test/aot/test_util.ts @@ -591,6 +591,11 @@ function readBazelWrittenFilesFrom( } try { processDirectory(bazelPackageRoot, path.join('/node_modules/@angular', packageName)); + // todo: check why we always need an index.d.ts + if (fs.existsSync(path.join(bazelPackageRoot, `${packageName}.d.ts`))) { + const content = fs.readFileSync(path.join(bazelPackageRoot, `${packageName}.d.ts`), 'utf8'); + map.set(path.join('/node_modules/@angular', packageName, 'index.d.ts'), content); + } } catch (e) { console.error( `Consider adding //packages/${packageName} as a data dependency in the BUILD.bazel rule for the failing test`); From fc305305e165b971129269ccc26fb7d81dc341c1 Mon Sep 17 00:00:00 2001 From: Renan Montebelo Date: Thu, 7 Mar 2019 22:26:20 -0600 Subject: [PATCH 0284/1073] docs(forms): adding `clear` method to FormArray documentation (#29180) PR Close #29180 --- packages/forms/src/model.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/forms/src/model.ts b/packages/forms/src/model.ts index 71d6ad0f6b..711ff372ab 100644 --- a/packages/forms/src/model.ts +++ b/packages/forms/src/model.ts @@ -1639,7 +1639,7 @@ export class FormGroup extends AbstractControl { * * ### Adding or removing controls from a form array * - * To change the controls in the array, use the `push`, `insert`, or `removeAt` methods + * To change the controls in the array, use the `push`, `insert`, `removeAt` or `clear` methods * in `FormArray` itself. These methods ensure the controls are properly tracked in the * form's hierarchy. Do not modify the array of `AbstractControl`s used to instantiate * the `FormArray` directly, as that result in strange and unexpected behavior such From c37ec8b2557e2f224fd7720586e5528d013050fc Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 8 Mar 2019 11:32:49 -0800 Subject: [PATCH 0285/1073] fix(ivy): produce ts.Diagnostics for NgModule scope errors (#29191) Previously, when the NgModule scope resolver discovered semantic errors within a users NgModules, it would throw assertion errors. TODOs in the codebase indicated these should become ts.Diagnostics eventually. Besides producing better-looking errors, there is another reason to make this change asap: these assertions were shadowing actual errors, via an interesting mechanism: 1) a component would produce a ts.Diagnostic during its analyze() step 2) as a result, it wouldn't register component metadata with the scope resolver 3) the NgModule for the component references it in exports, which was detected as an invalid export (no metadata registering it as a component). 4) the resulting assertion error would crash the compiler, hiding the real cause of the problem (an invalid component). This commit should mitigate this problem by converting scoping errors to proper ts.Diagnostics. Additionally, we should consider registering some marker indicating a class is a directive/component/pipe without actually requiring full metadata to be produced for it, which would allow suppression of errors like "invalid export" for such invalid types. PR Close #29191 --- .../src/ngtsc/annotations/src/ng_module.ts | 36 +++-- .../src/ngtsc/diagnostics/index.ts | 2 +- .../src/ngtsc/diagnostics/src/code.ts | 23 ++- .../src/ngtsc/diagnostics/src/error.ts | 22 +-- .../compiler-cli/src/ngtsc/scope/BUILD.bazel | 1 + .../compiler-cli/src/ngtsc/scope/src/local.ts | 149 ++++++++++++++++-- .../src/ngtsc/scope/test/local_spec.ts | 8 +- .../src/ngtsc/transform/src/api.ts | 5 +- .../src/ngtsc/transform/src/compilation.ts | 27 +++- packages/compiler-cli/test/ngtsc/BUILD.bazel | 1 + .../compiler-cli/test/ngtsc/scope_spec.ts | 134 ++++++++++++++++ 11 files changed, 358 insertions(+), 50 deletions(-) create mode 100644 packages/compiler-cli/test/ngtsc/scope_spec.ts diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts index 0dce76e968..828c3ee344 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts @@ -60,6 +60,7 @@ export class NgModuleDecoratorHandler implements DecoratorHandler { + const name = node.name !.text; if (decorator.args === null || decorator.args.length > 1) { throw new FatalDiagnosticError( ErrorCode.DECORATOR_ARITY_WRONG, decorator.node, @@ -93,28 +94,28 @@ export class NgModuleDecoratorHandler implements DecoratorHandler[] = []; let rawImports: ts.Expression|null = null; if (ngModule.has('imports')) { rawImports = ngModule.get('imports') !; const importsMeta = this.evaluator.evaluate(rawImports, moduleResolvers); - imports = this.resolveTypeList(rawImports, importsMeta, 'imports'); + imports = this.resolveTypeList(rawImports, importsMeta, name, 'imports'); } let exports: Reference[] = []; let rawExports: ts.Expression|null = null; if (ngModule.has('exports')) { rawExports = ngModule.get('exports') !; const exportsMeta = this.evaluator.evaluate(rawExports, moduleResolvers); - exports = this.resolveTypeList(rawExports, exportsMeta, 'exports'); + exports = this.resolveTypeList(rawExports, exportsMeta, name, 'exports'); this.referencesRegistry.add(node, ...exports); } let bootstrap: Reference[] = []; if (ngModule.has('bootstrap')) { const expr = ngModule.get('bootstrap') !; const bootstrapMeta = this.evaluator.evaluate(expr, forwardRefResolver); - bootstrap = this.resolveTypeList(expr, bootstrapMeta, 'bootstrap'); + bootstrap = this.resolveTypeList(expr, bootstrapMeta, name, 'bootstrap'); } // Register this module's information with the LocalModuleScopeRegistry. This ensures that @@ -156,12 +157,11 @@ export class NgModuleDecoratorHandler implements DecoratorHandler[] { + private resolveTypeList( + expr: ts.Node, resolvedList: ResolvedValue, className: string, + arrayName: string): Reference[] { const refList: Reference[] = []; if (!Array.isArray(resolvedList)) { throw new FatalDiagnosticError( - ErrorCode.VALUE_HAS_WRONG_TYPE, expr, `Expected array when reading property ${name}`); + ErrorCode.VALUE_HAS_WRONG_TYPE, expr, + `Expected array when reading property ${arrayName}`); } resolvedList.forEach((entry, idx) => { @@ -341,17 +345,19 @@ export class NgModuleDecoratorHandler implements DecoratorHandler(); + private cache = new Map(); /** * Tracks whether a given component requires "remote scoping". @@ -88,6 +96,11 @@ export class LocalModuleScopeRegistry { */ private remoteScoping = new Set(); + /** + * Tracks errors accumulated in the processing of scopes for each module declaration. + */ + private scopeErrors = new Map(); + constructor( private dependencyScopeReader: DtsModuleScopeResolver, private refEmitter: ReferenceEmitter, private aliasGenerator: AliasGenerator|null) {} @@ -124,15 +137,43 @@ export class LocalModuleScopeRegistry { * Collects registered data for a module and its directives/pipes and convert it into a full * `LocalModuleScope`. * - * This method implements the logic of NgModule imports and exports. + * This method implements the logic of NgModule imports and exports. It returns the + * `LocalModuleScope` for the given NgModule if one can be produced, and `null` if no scope is + * available or the scope contains errors. */ getScopeOfModule(clazz: ts.Declaration): LocalModuleScope|null { + const scope = this.getScopeOfModuleInternal(clazz); + // Translate undefined -> null. + return scope !== undefined ? scope : null; + } + + /** + * Retrieves any `ts.Diagnostic`s produced during the calculation of the `LocalModuleScope` for + * the given NgModule, or `null` if no errors were present. + */ + getDiagnosticsOfModule(clazz: ts.Declaration): ts.Diagnostic[]|null { + // Required to ensure the errors are populated for the given class. If it has been processed + // before, this will be a no-op due to the scope cache. + this.getScopeOfModule(clazz); + + if (this.scopeErrors.has(clazz)) { + return this.scopeErrors.get(clazz) !; + } else { + return null; + } + } + + /** + * Implementation of `getScopeOfModule` which differentiates between no scope being available + * (returns `null`) and a scope being produced with errors (returns `undefined`). + */ + private getScopeOfModuleInternal(clazz: ts.Declaration): LocalModuleScope|null|undefined { // Seal the registry to protect the integrity of the `LocalModuleScope` cache. this.sealed = true; // Look for cached data if available. if (this.cache.has(clazz)) { - return this.cache.get(clazz) !; + return this.cache.get(clazz); } // `clazz` should be an NgModule previously added to the registry. If not, a scope for it @@ -142,6 +183,10 @@ export class LocalModuleScopeRegistry { } const ngModule = this.ngModuleData.get(clazz) !; + // Errors produced during computation of the scope are recorded here. At the end, if this array + // isn't empty then `undefined` will be cached and returned to indicate this scope is invalid. + const diagnostics: ts.Diagnostic[] = []; + // At this point, the goal is to produce two distinct transitive sets: // - the directives and pipes which are visible to components declared in the NgModule. // - the directives and pipes which are exported to any NgModules which import this one. @@ -189,10 +234,17 @@ export class LocalModuleScopeRegistry { // 2) process imports. for (const decl of ngModule.imports) { - const importScope = this.getExportedScope(decl); + const importScope = this.getExportedScope(decl, diagnostics, clazz, 'import'); if (importScope === null) { - // TODO(alxhub): produce a ts.Diagnostic - throw new Error(`Unknown import: ${decl.debugName}`); + // An import wasn't an NgModule, so record an error. + diagnostics.push(invalidRef(clazz, decl, 'import')); + continue; + } else if (importScope === undefined) { + // An import was an NgModule but contained errors of its own. Record this as an error too, + // because this scope is always going to be incorrect if one of its imports could not be + // read. + diagnostics.push(invalidTransitiveNgModuleRef(clazz, decl, 'import')); + continue; } for (const directive of importScope.exported.directives) { compilationDirectives.set(directive.ref.node, directive); @@ -209,8 +261,14 @@ export class LocalModuleScopeRegistry { // imported types. for (const decl of ngModule.exports) { // Attempt to resolve decl as an NgModule. - const importScope = this.getExportedScope(decl); - if (importScope !== null) { + const importScope = this.getExportedScope(decl, diagnostics, clazz, 'export'); + if (importScope === undefined) { + // An export was an NgModule but contained errors of its own. Record this as an error too, + // because this scope is always going to be incorrect if one of its exports could not be + // read. + diagnostics.push(invalidTransitiveNgModuleRef(clazz, decl, 'export')); + continue; + } else if (importScope !== null) { // decl is an NgModule. for (const directive of importScope.exported.directives) { exportDirectives.set(directive.ref.node, directive); @@ -228,8 +286,12 @@ export class LocalModuleScopeRegistry { exportPipes.set(decl.node, pipe); } else { // decl is an unknown export. - // TODO(alxhub): produce a ts.Diagnostic - throw new Error(`Unknown export: ${decl.debugName}`); + if (this.directiveData.has(decl.node) || this.pipeData.has(decl.node)) { + diagnostics.push(invalidReexport(clazz, decl)); + } else { + diagnostics.push(invalidRef(clazz, decl, 'export')); + } + continue; } } @@ -272,7 +334,17 @@ export class LocalModuleScopeRegistry { } } + // Check if this scope had any errors during production. + if (diagnostics.length > 0) { + // Cache undefined, to mark the fact that the scope is invalid. + this.cache.set(clazz, undefined); + // Save the errors for retrieval. + this.scopeErrors.set(clazz, diagnostics); + + // Return undefined to indicate the scope is invalid. + return undefined; + } // Finally, produce the `LocalModuleScope` with both the compilation and export scopes. const scope = { @@ -302,18 +374,30 @@ export class LocalModuleScopeRegistry { * * The NgModule in question may be declared locally in the current ts.Program, or it may be * declared in a .d.ts file. + * + * This function will return `null` if no scope could be found, or `undefined` if an invalid scope + * was found. It can also contribute diagnostics of its own by adding to the given `diagnostics` + * array parameter. */ - private getExportedScope(ref: Reference): ExportScope|null { + private getExportedScope( + ref: Reference, diagnostics: ts.Diagnostic[], ownerForErrors: ts.Declaration, + type: 'import'|'export'): ExportScope|null|undefined { if (ref.node.getSourceFile().isDeclarationFile) { // The NgModule is declared in a .d.ts file. Resolve it with the `DependencyScopeReader`. if (!ts.isClassDeclaration(ref.node)) { - // TODO(alxhub): produce a ts.Diagnostic - throw new Error(`Reference to an NgModule ${ref.debugName} which isn't a class?`); + // The NgModule is in a .d.ts file but is not declared as a ts.ClassDeclaration. This is an + // error in the .d.ts metadata. + const code = type === 'import' ? ErrorCode.NGMODULE_INVALID_IMPORT : + ErrorCode.NGMODULE_INVALID_EXPORT; + diagnostics.push(makeDiagnostic( + code, identifierOfNode(ref.node) || ref.node, + `Appears in the NgModule.${type}s of ${nodeNameForError(ownerForErrors)}, but could not be resolved to an NgModule`)); + return undefined; } return this.dependencyScopeReader.resolve(ref as Reference); } else { // The NgModule is declared locally in the current program. Resolve it from the registry. - return this.getScopeOfModule(ref.node); + return this.getScopeOfModuleInternal(ref.node); } } @@ -323,3 +407,40 @@ export class LocalModuleScopeRegistry { } } } + +/** + * Produce a `ts.Diagnostic` for an invalid import or export from an NgModule. + */ +function invalidRef( + clazz: ts.Declaration, decl: Reference, + type: 'import' | 'export'): ts.Diagnostic { + const code = + type === 'import' ? ErrorCode.NGMODULE_INVALID_IMPORT : ErrorCode.NGMODULE_INVALID_EXPORT; + const resolveTarget = type === 'import' ? 'NgModule' : 'NgModule, Component, Directive, or Pipe'; + return makeDiagnostic( + code, identifierOfNode(decl.node) || decl.node, + `Appears in the NgModule.${type}s of ${nodeNameForError(clazz)}, but could not be resolved to an ${resolveTarget} class`); +} + +/** + * Produce a `ts.Diagnostic` for an import or export which itself has errors. + */ +function invalidTransitiveNgModuleRef( + clazz: ts.Declaration, decl: Reference, + type: 'import' | 'export'): ts.Diagnostic { + const code = + type === 'import' ? ErrorCode.NGMODULE_INVALID_IMPORT : ErrorCode.NGMODULE_INVALID_EXPORT; + return makeDiagnostic( + code, identifierOfNode(decl.node) || decl.node, + `Appears in the NgModule.${type}s of ${nodeNameForError(clazz)}, but itself has errors`); +} + +/** + * Produce a `ts.Diagnostic` for an exported directive or pipe which was not declared or imported + * by the NgModule in question. + */ +function invalidReexport(clazz: ts.Declaration, decl: Reference): ts.Diagnostic { + return makeDiagnostic( + ErrorCode.NGMODULE_INVALID_REEXPORT, identifierOfNode(decl.node) || decl.node, + `Present in the NgModule.exports of ${nodeNameForError(clazz)} but neither declared nor imported`); +} diff --git a/packages/compiler-cli/src/ngtsc/scope/test/local_spec.ts b/packages/compiler-cli/src/ngtsc/scope/test/local_spec.ts index 6a38e632d3..10b39c5d8b 100644 --- a/packages/compiler-cli/src/ngtsc/scope/test/local_spec.ts +++ b/packages/compiler-cli/src/ngtsc/scope/test/local_spec.ts @@ -126,7 +126,13 @@ describe('LocalModuleScopeRegistry', () => { registry.registerNgModule(ModuleA.node, {exports: [Dir], imports: [], declarations: []}); registry.registerNgModule(ModuleB.node, {declarations: [Dir], exports: [Dir], imports: []}); - expect(() => registry.getScopeOfModule(ModuleA.node)).toThrow(); + expect(registry.getScopeOfModule(ModuleA.node)).toBe(null); + + // ModuleA should have associated diagnostics as it exports `Dir` without declaring it. + expect(registry.getDiagnosticsOfModule(ModuleA.node)).not.toBeNull(); + + // ModuleB should have no diagnostics as it correctly declares `Dir`. + expect(registry.getDiagnosticsOfModule(ModuleB.node)).toBeNull(); }); }); diff --git a/packages/compiler-cli/src/ngtsc/transform/src/api.ts b/packages/compiler-cli/src/ngtsc/transform/src/api.ts index 1120661ae1..ef5c8aa216 100644 --- a/packages/compiler-cli/src/ngtsc/transform/src/api.ts +++ b/packages/compiler-cli/src/ngtsc/transform/src/api.ts @@ -123,4 +123,7 @@ export interface CompileResult { type: Type; } -export interface ResolveResult { reexports?: Reexport[]; } +export interface ResolveResult { + reexports?: Reexport[]; + diagnostics?: ts.Diagnostic[]; +} diff --git a/packages/compiler-cli/src/ngtsc/transform/src/compilation.ts b/packages/compiler-cli/src/ngtsc/transform/src/compilation.ts index 240fcc077e..e3b3416466 100644 --- a/packages/compiler-cli/src/ngtsc/transform/src/compilation.ts +++ b/packages/compiler-cli/src/ngtsc/transform/src/compilation.ts @@ -247,15 +247,26 @@ export class IvyCompilation { for (const match of ivyClass.matchedHandlers) { if (match.handler.resolve !== undefined && match.analyzed !== null && match.analyzed.analysis !== undefined) { - const res = match.handler.resolve(node, match.analyzed.analysis); - if (res.reexports !== undefined) { - const fileName = node.getSourceFile().fileName; - if (!this.reexportMap.has(fileName)) { - this.reexportMap.set(fileName, new Map()); + try { + const res = match.handler.resolve(node, match.analyzed.analysis); + if (res.reexports !== undefined) { + const fileName = node.getSourceFile().fileName; + if (!this.reexportMap.has(fileName)) { + this.reexportMap.set(fileName, new Map()); + } + const fileReexports = this.reexportMap.get(fileName) !; + for (const reexport of res.reexports) { + fileReexports.set(reexport.asAlias, [reexport.fromModule, reexport.symbolName]); + } } - const fileReexports = this.reexportMap.get(fileName) !; - for (const reexport of res.reexports) { - fileReexports.set(reexport.asAlias, [reexport.fromModule, reexport.symbolName]); + if (res.diagnostics !== undefined) { + this._diagnostics.push(...res.diagnostics); + } + } catch (err) { + if (err instanceof FatalDiagnosticError) { + this._diagnostics.push(err.toDiagnostic()); + } else { + throw err; } } } diff --git a/packages/compiler-cli/test/ngtsc/BUILD.bazel b/packages/compiler-cli/test/ngtsc/BUILD.bazel index 880234345e..e5bfd3f84f 100644 --- a/packages/compiler-cli/test/ngtsc/BUILD.bazel +++ b/packages/compiler-cli/test/ngtsc/BUILD.bazel @@ -7,6 +7,7 @@ ts_library( deps = [ "//packages/compiler", "//packages/compiler-cli", + "//packages/compiler-cli/src/ngtsc/diagnostics", "//packages/compiler-cli/src/ngtsc/routing", "//packages/compiler-cli/src/ngtsc/util", "//packages/compiler-cli/test:test_utils", diff --git a/packages/compiler-cli/test/ngtsc/scope_spec.ts b/packages/compiler-cli/test/ngtsc/scope_spec.ts new file mode 100644 index 0000000000..07588c4484 --- /dev/null +++ b/packages/compiler-cli/test/ngtsc/scope_spec.ts @@ -0,0 +1,134 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {ErrorCode, ngErrorCode} from '../../src/ngtsc/diagnostics'; + +import {NgtscTestEnvironment} from './env'; + +describe('ngtsc module scopes', () => { + let env !: NgtscTestEnvironment; + beforeEach(() => { + env = NgtscTestEnvironment.setup(); + env.tsconfig(); + }); + + describe('diagnostics', () => { + describe('imports', () => { + it('should produce an error when an invalid class is imported', () => { + env.write('test.ts', ` + import {NgModule} from '@angular/core'; + + class NotAModule {} + + @NgModule({imports: [NotAModule]}) + class IsAModule {} + `); + const [error] = env.driveDiagnostics(); + expect(error).not.toBeUndefined(); + expect(error.messageText).toContain('IsAModule'); + expect(error.messageText).toContain('NgModule.imports'); + expect(error.code).toEqual(ngErrorCode(ErrorCode.NGMODULE_INVALID_IMPORT)); + expect(diagnosticToNode(error, ts.isIdentifier).text).toEqual('NotAModule'); + }); + + it('should produce an error when a non-class is imported from a .d.ts dependency', () => { + env.write('dep.d.ts', `export declare let NotAClass: Function;`); + env.write('test.ts', ` + import {NgModule} from '@angular/core'; + import {NotAClass} from './dep'; + + @NgModule({imports: [NotAClass]}) + class IsAModule {} + `); + const [error] = env.driveDiagnostics(); + expect(error).not.toBeUndefined(); + expect(error.messageText).toContain('IsAModule'); + expect(error.messageText).toContain('NgModule.imports'); + expect(error.code).toEqual(ngErrorCode(ErrorCode.VALUE_HAS_WRONG_TYPE)); + expect(diagnosticToNode(error, ts.isIdentifier).text).toEqual('NotAClass'); + }); + }); + + describe('exports', () => { + it('should produce an error when a non-NgModule class is exported', () => { + env.write('test.ts', ` + import {NgModule} from '@angular/core'; + + class NotAModule {} + + @NgModule({exports: [NotAModule]}) + class IsAModule {} + `); + const [error] = env.driveDiagnostics(); + expect(error).not.toBeUndefined(); + expect(error.messageText).toContain('IsAModule'); + expect(error.messageText).toContain('NgModule.exports'); + expect(error.code).toEqual(ngErrorCode(ErrorCode.NGMODULE_INVALID_EXPORT)); + expect(diagnosticToNode(error, ts.isIdentifier).text).toEqual('NotAModule'); + }); + + it('should produce a transitive error when an invalid NgModule is exported', () => { + env.write('test.ts', ` + import {NgModule} from '@angular/core'; + + export class NotAModule {} + + @NgModule({ + imports: [NotAModule], + }) + class InvalidModule {} + + @NgModule({exports: [InvalidModule]}) + class IsAModule {} + `); + + // Find the diagnostic referencing InvalidModule, which should have come from IsAModule. + const error = env.driveDiagnostics().find( + error => diagnosticToNode(error, ts.isIdentifier).text === 'InvalidModule'); + if (error === undefined) { + return fail('Expected to find a diagnostic referencing InvalidModule'); + } + expect(error.messageText).toContain('IsAModule'); + expect(error.messageText).toContain('NgModule.exports'); + expect(error.code).toEqual(ngErrorCode(ErrorCode.NGMODULE_INVALID_EXPORT)); + }); + }); + + describe('re-exports', () => { + it('should produce an error when a non-declared/imported class is re-exported', () => { + env.write('test.ts', ` + import {Directive, NgModule} from '@angular/core'; + + @Directive({selector: 'test'}) + class Dir {} + + @NgModule({exports: [Dir]}) + class IsAModule {} + `); + const [error] = env.driveDiagnostics(); + expect(error).not.toBeUndefined(); + expect(error.messageText).toContain('IsAModule'); + expect(error.messageText).toContain('NgModule.exports'); + expect(error.code).toEqual(ngErrorCode(ErrorCode.NGMODULE_INVALID_REEXPORT)); + expect(diagnosticToNode(error, ts.isIdentifier).text).toEqual('Dir'); + }); + }); + }); +}); + +function diagnosticToNode( + diag: ts.Diagnostic, guard: (node: ts.Node) => node is T): T { + if (diag.file === undefined) { + throw new Error(`Expected ts.Diagnostic to have a file source`); + } + const node = (ts as any).getTokenAtPosition(diag.file, diag.start) as ts.Node; + expect(guard(node)).toBe(true); + return node as T; +} From 3a6ba002867080ebf5199ed825d7bd7bbb4918fe Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 8 Mar 2019 14:03:49 -0800 Subject: [PATCH 0286/1073] fix(ivy): escape all required characters in reexport aliases (#29194) Previously, the compiler did not escape . or $, and this was causing issues in google3. Now these characters are escaped. PR Close #29194 --- .../src/ngtsc/imports/src/alias.ts | 4 +-- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/imports/src/alias.ts b/packages/compiler-cli/src/ngtsc/imports/src/alias.ts index 89b2e54b83..b7231f7faa 100644 --- a/packages/compiler-cli/src/ngtsc/imports/src/alias.ts +++ b/packages/compiler-cli/src/ngtsc/imports/src/alias.ts @@ -12,8 +12,8 @@ import * as ts from 'typescript'; import {FileToModuleHost, ReferenceEmitStrategy} from './emitter'; import {ImportMode, Reference} from './references'; -// Escape anything that isn't alphanumeric, '/', '_', '.', or '$'. -const CHARS_TO_ESCAPE = /[^a-zA-Z0-9/_\.$]/g; +// Escape anything that isn't alphanumeric, '/' or '_'. +const CHARS_TO_ESCAPE = /[^a-zA-Z0-9/_]/g; export class AliasGenerator { constructor(private fileToModuleHost: FileToModuleHost) {} diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index f3545e0abc..30d1ff7078 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -3565,6 +3565,36 @@ export const Foo = Foo__PRE_R3__; const jsContents = env.getContents('index.js'); expect(jsContents).toContain('export { FooDir as ɵng$root$foo$$FooDir } from "root/foo";'); }); + + it('should escape unusual characters in aliased filenames', () => { + env.tsconfig({'_useHostForImportGeneration': true}); + env.write('other._$test.ts', ` + import {Directive, NgModule} from '@angular/core'; + + @Directive({selector: 'test'}) + export class TestDir {} + + @NgModule({ + declarations: [TestDir], + exports: [TestDir], + }) + export class OtherModule {} + `); + env.write('index.ts', ` + import {NgModule} from '@angular/core'; + import {OtherModule} from './other._$test'; + + @NgModule({ + exports: [OtherModule], + }) + export class IndexModule {} + `); + env.driveMain(); + const jsContents = env.getContents('index.js'); + expect(jsContents) + .toContain( + 'export { TestDir as ɵng$root$other___test$$TestDir } from "root/other._$test";'); + }); }); describe('inline resources', () => { From 49dccf4bfc9da80806fa10aa4662d921a8fd0f16 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 8 Mar 2019 13:18:32 -0800 Subject: [PATCH 0287/1073] fix(ivy): process separate declarations and exports for summaries (#29193) ngsummary files were generated with an export for each class declaration. However, some Angular code declares classes (class Foo) and exports them (export {Foo}) separately, which was causing incomplete summary files. This commit expands the set of symbol names for which summary exports will be generated, fixing this issue. PR Close #29193 --- .../src/ngtsc/shims/src/summary_generator.ts | 35 +++++++++++++------ .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 18 ++++++++++ 2 files changed, 43 insertions(+), 10 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/shims/src/summary_generator.ts b/packages/compiler-cli/src/ngtsc/shims/src/summary_generator.ts index ef14fae7b7..6e6b6bae1b 100644 --- a/packages/compiler-cli/src/ngtsc/shims/src/summary_generator.ts +++ b/packages/compiler-cli/src/ngtsc/shims/src/summary_generator.ts @@ -34,16 +34,31 @@ export class SummaryGenerator implements ShimGenerator { // to semantically understand which decorators are Angular decorators. It's okay to output an // overly broad set of summary exports as the exports are no-ops anyway, and summaries are a // compatibility layer which will be removed after Ivy is enabled. - const symbolNames = original - .statements - // Pick out top level class declarations... - .filter(ts.isClassDeclaration) - // which are named, exported, and have decorators. - .filter( - decl => isExported(decl) && decl.decorators !== undefined && - decl.name !== undefined) - // Grab the symbol name. - .map(decl => decl.name !.text); + const symbolNames: string[] = []; + for (const stmt of original.statements) { + if (ts.isClassDeclaration(stmt)) { + // If the class isn't exported, or if it's not decorated, then skip it. + if (!isExported(stmt) || stmt.decorators === undefined || stmt.name === undefined) { + continue; + } + symbolNames.push(stmt.name.text); + } else if (ts.isExportDeclaration(stmt)) { + // Look for an export statement of the form "export {...};". If it doesn't match that, then + // skip it. + if (stmt.exportClause === undefined || stmt.moduleSpecifier !== undefined) { + continue; + } + + for (const specifier of stmt.exportClause.elements) { + // At this point, there is no guarantee that specifier here refers to a class declaration, + // but that's okay. + + // Use specifier.name as that's guaranteed to be the exported name, regardless of whether + // specifier.propertyName is set. + symbolNames.push(specifier.name.text); + } + } + } const varLines = symbolNames.map(name => `export const ${name}NgSummary: any = null;`); diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 30d1ff7078..d9247ca57c 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -1768,6 +1768,24 @@ describe('ngtsc behavioral tests', () => { expect(summaryContents).toEqual(`export var TestModuleNgSummary = null;\n`); }); + it('should generate a summary stub for classes exported via exports', () => { + env.tsconfig({'allowEmptyCodegenFiles': true}); + + env.write('test.ts', ` + import {Injectable, NgModule} from '@angular/core'; + + @NgModule({}) + class NotDirectlyExported {} + + export {NotDirectlyExported}; + `); + + env.driveMain(); + + const summaryContents = env.getContents('test.ngsummary.js'); + expect(summaryContents).toEqual(`export var NotDirectlyExportedNgSummary = null;\n`); + }); + it('it should generate empty export when there are no other summary symbols, to ensure the output is a valid ES module', () => { env.tsconfig({'allowEmptyCodegenFiles': true}); From a5b8420234a131112e57b1639ce576cdc9adb6cd Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Thu, 14 Feb 2019 18:59:46 +0100 Subject: [PATCH 0288/1073] fix(ivy): render alias exports for private declarations if possible (#28735) Sometimes declarations are not exported publicly but are exported under a private name. In this case, rather than adding a completely new export to the entry point, we should create an export that aliases the private name back to the original public name. This is important when the typings files have been rolled-up using a tool such as the [API Extractor](https://api-extractor.com/). In this case the internal type of an aliased private export will be removed completely from the typings file, so there is no "original" type to re-export. For example: If there are the following TS files: **entry-point.ts** ```ts export {Internal as External} from './internal'; ``` **internal.ts** ```ts export class Internal { foo(): void; } ``` Then the API Extractor might roll up the .d.ts files into: ```ts export declare class External { foo(): void; } ``` In this case ngcc should add an export so the file looks like: ```ts export declare class External { foo(): void; } export {External as Internal}; ``` PR Close #28735 --- packages/compiler-cli/src/ngcc/BUILD.bazel | 1 + .../analysis/private_declarations_analyzer.ts | 50 +++- packages/compiler-cli/src/ngcc/src/main.ts | 2 +- .../src/ngcc/src/rendering/esm_renderer.ts | 24 +- .../src/ngcc/src/rendering/renderer.ts | 13 +- .../private_declarations_analyzer_spec.ts | 254 ++++++++++++------ .../test/rendering/esm2015_renderer_spec.ts | 23 +- .../ngcc/test/rendering/esm5_renderer_spec.ts | 23 +- 8 files changed, 278 insertions(+), 112 deletions(-) diff --git a/packages/compiler-cli/src/ngcc/BUILD.bazel b/packages/compiler-cli/src/ngcc/BUILD.bazel index 00658a5e0e..129cbb02b8 100644 --- a/packages/compiler-cli/src/ngcc/BUILD.bazel +++ b/packages/compiler-cli/src/ngcc/BUILD.bazel @@ -20,6 +20,7 @@ ts_library( "//packages/compiler-cli/src/ngtsc/scope", "//packages/compiler-cli/src/ngtsc/transform", "//packages/compiler-cli/src/ngtsc/translator", + "//packages/compiler-cli/src/ngtsc/util", "@npm//@types/convert-source-map", "@npm//@types/node", "@npm//@types/shelljs", diff --git a/packages/compiler-cli/src/ngcc/src/analysis/private_declarations_analyzer.ts b/packages/compiler-cli/src/ngcc/src/analysis/private_declarations_analyzer.ts index bfa76cf0c6..465c069534 100644 --- a/packages/compiler-cli/src/ngcc/src/analysis/private_declarations_analyzer.ts +++ b/packages/compiler-cli/src/ngcc/src/analysis/private_declarations_analyzer.ts @@ -16,6 +16,7 @@ export interface ExportInfo { identifier: string; from: string; dtsFrom?: string|null; + alias?: string|null; } export type PrivateDeclarationsAnalyses = ExportInfo[]; @@ -40,22 +41,65 @@ export class PrivateDeclarationsAnalyzer { rootFiles: ts.SourceFile[], declarations: Map): PrivateDeclarationsAnalyses { const privateDeclarations: Map = new Map(declarations); + const exportAliasDeclarations: Map = new Map(); + rootFiles.forEach(f => { const exports = this.host.getExportsOfModule(f); if (exports) { exports.forEach((declaration, exportedName) => { - if (hasNameIdentifier(declaration.node) && declaration.node.name.text === exportedName) { - privateDeclarations.delete(declaration.node.name); + if (hasNameIdentifier(declaration.node)) { + const privateDeclaration = privateDeclarations.get(declaration.node.name); + if (privateDeclaration) { + if (privateDeclaration.node !== declaration.node) { + throw new Error(`${declaration.node.name.text} is declared multiple times.`); + } + + if (declaration.node.name.text === exportedName) { + // This declaration is public so we can remove it from the list + privateDeclarations.delete(declaration.node.name); + } else if (!this.host.getDtsDeclaration(declaration.node)) { + // The referenced declaration is exported publicly but via an alias. + // In some cases the original declaration is missing from the dts program, such as + // when rolling up (flattening) the dts files. + // This is because the original declaration gets renamed to the exported alias. + + // There is a constraint on this which we cannot handle. Consider the following + // code: + // + // /src/entry_point.js: + // export {MyComponent as aliasedMyComponent} from './a'; + // export {MyComponent} from './b';` + // + // /src/a.js: + // export class MyComponent {} + // + // /src/b.js: + // export class MyComponent {} + // + // //typings/entry_point.d.ts: + // export declare class aliasedMyComponent {} + // export declare class MyComponent {} + // + // In this case we would end up matching the `MyComponent` from `/src/a.js` to the + // `MyComponent` declared in `/typings/entry_point.d.ts` even though that + // declaration is actually for the `MyComponent` in `/src/b.js`. + + exportAliasDeclarations.set(declaration.node.name, exportedName); + } + } } }); } }); + return Array.from(privateDeclarations.keys()).map(id => { const from = id.getSourceFile().fileName; const declaration = privateDeclarations.get(id) !; + const alias = exportAliasDeclarations.get(id) || null; const dtsDeclaration = this.host.getDtsDeclaration(declaration.node); const dtsFrom = dtsDeclaration && dtsDeclaration.getSourceFile().fileName; - return {identifier: id.text, from, dtsFrom}; + + return {identifier: id.text, from, dtsFrom, alias}; }); } } diff --git a/packages/compiler-cli/src/ngcc/src/main.ts b/packages/compiler-cli/src/ngcc/src/main.ts index f8c613d18a..a339919b01 100644 --- a/packages/compiler-cli/src/ngcc/src/main.ts +++ b/packages/compiler-cli/src/ngcc/src/main.ts @@ -79,7 +79,7 @@ export function mainNgcc(args: string[]): number { }); }); } catch (e) { - console.error(e.stack); + console.error(e.stack || e.message); return 1; } diff --git a/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts b/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts index 580ce15b99..7f8360ad93 100644 --- a/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts +++ b/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts @@ -12,6 +12,8 @@ import {NgccReflectionHost, POST_R3_MARKER, PRE_R3_MARKER, SwitchableVariableDec import {CompiledClass} from '../analysis/decoration_analyzer'; import {RedundantDecoratorMap, Renderer, stripExtension} from './renderer'; import {EntryPointBundle} from '../packages/entry_point_bundle'; +import {ExportInfo} from '../analysis/private_declarations_analyzer'; +import {isDtsPath} from '../../../ngtsc/util/src/typescript'; export class EsmRenderer extends Renderer { constructor( @@ -36,15 +38,21 @@ export class EsmRenderer extends Renderer { }); } - addExports(output: MagicString, entryPointBasePath: string, exports: { - identifier: string, - from: string - }[]): void { + addExports(output: MagicString, entryPointBasePath: string, exports: ExportInfo[]): void { exports.forEach(e => { - const basePath = stripExtension(e.from); - const relativePath = './' + relative(dirname(entryPointBasePath), basePath); - const exportFrom = entryPointBasePath !== basePath ? ` from '${relativePath}'` : ''; - const exportStr = `\nexport {${e.identifier}}${exportFrom};`; + let exportFrom = ''; + const isDtsFile = isDtsPath(entryPointBasePath); + const from = isDtsFile ? e.dtsFrom : e.from; + + if (from) { + const basePath = stripExtension(from); + const relativePath = './' + relative(dirname(entryPointBasePath), basePath); + exportFrom = entryPointBasePath !== basePath ? ` from '${relativePath}'` : ''; + } + + // aliases should only be added in dts files as these are lost when rolling up dts file. + const exportStatement = e.alias && isDtsFile ? `${e.alias} as ${e.identifier}` : e.identifier; + const exportStr = `\nexport {${exportStatement}}${exportFrom};`; output.append(exportStr); }); } diff --git a/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts b/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts index 00fc737b3f..70bd3fc70b 100644 --- a/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts +++ b/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts @@ -248,10 +248,8 @@ export abstract class Renderer { protected abstract addImports( output: MagicString, imports: {specifier: string, qualifier: string, isDefault: boolean}[]): void; - protected abstract addExports(output: MagicString, entryPointBasePath: string, exports: { - identifier: string, - from: string - }[]): void; + protected abstract addExports( + output: MagicString, entryPointBasePath: string, exports: ExportInfo[]): void; protected abstract addDefinitions( output: MagicString, compiledClass: CompiledClass, definitions: string): void; protected abstract removeDecorators( @@ -391,19 +389,18 @@ export abstract class Renderer { // Capture the private declarations that need to be re-exported if (privateDeclarationsAnalyses.length) { - const dtsExports = privateDeclarationsAnalyses.map(e => { - if (!e.dtsFrom) { + privateDeclarationsAnalyses.forEach(e => { + if (!e.dtsFrom && !e.alias) { throw new Error( `There is no typings path for ${e.identifier} in ${e.from}.\n` + `We need to add an export for this class to a .d.ts typings file because ` + `Angular compiler needs to be able to reference this class in compiled code, such as templates.\n` + `The simplest fix for this is to ensure that this class is exported from the package's entry-point.`); } - return {identifier: e.identifier, from: e.dtsFrom}; }); const dtsEntryPoint = this.bundle.dts !.file; const renderInfo = dtsMap.get(dtsEntryPoint) || new DtsRenderInfo(); - renderInfo.privateExports = dtsExports; + renderInfo.privateExports = privateDeclarationsAnalyses; dtsMap.set(dtsEntryPoint, renderInfo); } diff --git a/packages/compiler-cli/src/ngcc/test/analysis/private_declarations_analyzer_spec.ts b/packages/compiler-cli/src/ngcc/test/analysis/private_declarations_analyzer_spec.ts index ed74e29212..98e6879093 100644 --- a/packages/compiler-cli/src/ngcc/test/analysis/private_declarations_analyzer_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/analysis/private_declarations_analyzer_spec.ts @@ -14,142 +14,228 @@ import {PrivateDeclarationsAnalyzer} from '../../src/analysis/private_declaratio import {Esm2015ReflectionHost} from '../../src/host/esm2015_host'; import {getDeclaration, makeTestBundleProgram, makeTestProgram} from '../helpers/utils'; -const TEST_PROGRAM = [ - { - name: '/src/entry_point.js', - isRoot: true, - contents: ` +describe('PrivateDeclarationsAnalyzer', () => { + describe('analyzeProgram()', () => { + + const TEST_PROGRAM = [ + { + name: '/src/entry_point.js', + isRoot: true, + contents: ` export {PublicComponent} from './a'; export {ModuleA} from './mod'; export {ModuleB} from './b'; ` - }, - { - name: '/src/a.js', - isRoot: false, - contents: ` + }, + { + name: '/src/a.js', + isRoot: false, + contents: ` import {Component} from '@angular/core'; export class PublicComponent {} PublicComponent.decorators = [ {type: Component, args: [{selectors: 'a', template: ''}]} ]; ` - }, - { - name: '/src/b.js', - isRoot: false, - contents: ` + }, + { + name: '/src/b.js', + isRoot: false, + contents: ` import {Component, NgModule} from '@angular/core'; - class PrivateComponent {} - PrivateComponent.decorators = [ + class PrivateComponent1 {} + PrivateComponent1.decorators = [ {type: Component, args: [{selectors: 'b', template: ''}]} ]; + class PrivateComponent2 {} + PrivateComponent2.decorators = [ + {type: Component, args: [{selectors: 'c', template: ''}]} + ]; export class ModuleB {} ModuleB.decorators = [ - {type: NgModule, args: [{declarations: [PrivateComponent]}]} + {type: NgModule, args: [{declarations: [PrivateComponent1]}]} ]; ` - }, - { - name: '/src/c.js', - isRoot: false, - contents: ` + }, + { + name: '/src/c.js', + isRoot: false, + contents: ` import {Component} from '@angular/core'; - export class InternalComponent {} - InternalComponent.decorators = [ - {type: Component, args: [{selectors: 'c', template: ''}]} + export class InternalComponent1 {} + InternalComponent1.decorators = [ + {type: Component, args: [{selectors: 'd', template: ''}]} + ]; + export class InternalComponent2 {} + InternalComponent2.decorators = [ + {type: Component, args: [{selectors: 'e', template: ''}]} ]; ` - }, - { - name: '/src/mod.js', - isRoot: false, - contents: ` + }, + { + name: '/src/mod.js', + isRoot: false, + contents: ` import {Component, NgModule} from '@angular/core'; import {PublicComponent} from './a'; import {ModuleB} from './b'; - import {InternalComponent} from './c'; + import {InternalComponent1} from './c'; export class ModuleA {} ModuleA.decorators = [ {type: NgModule, args: [{ - declarations: [PublicComponent, InternalComponent], + declarations: [PublicComponent, InternalComponent1], imports: [ModuleB] }]} ]; ` - } -]; -const TEST_DTS_PROGRAM = [ - { - name: '/typings/entry_point.d.ts', - isRoot: true, - contents: ` + } + ]; + const TEST_DTS_PROGRAM = [ + { + name: '/typings/entry_point.d.ts', + isRoot: true, + contents: ` export {PublicComponent} from './a'; export {ModuleA} from './mod'; export {ModuleB} from './b'; ` - }, - { - name: '/typings/a.d.ts', - isRoot: false, - contents: ` + }, + { + name: '/typings/a.d.ts', + isRoot: false, + contents: ` export declare class PublicComponent {} ` - }, - { - name: '/typings/b.d.ts', - isRoot: false, - contents: ` + }, + { + name: '/typings/b.d.ts', + isRoot: false, + contents: ` export declare class ModuleB {} ` - }, - { - name: '/typings/c.d.ts', - isRoot: false, - contents: ` - export declare class InternalComponent {} + }, + { + name: '/typings/c.d.ts', + isRoot: false, + contents: ` + export declare class InternalComponent1 {} ` - }, - { - name: '/typings/mod.d.ts', - isRoot: false, - contents: ` + }, + { + name: '/typings/mod.d.ts', + isRoot: false, + contents: ` import {PublicComponent} from './a'; import {ModuleB} from './b'; - import {InternalComponent} from './c'; + import {InternalComponent1} from './c'; export declare class ModuleA {} ` - }, -]; + }, + ]; -describe('PrivateDeclarationsAnalyzer', () => { - describe('analyzeProgram()', () => { it('should find all NgModule declarations that were not publicly exported from the entry-point', () => { - const program = makeTestProgram(...TEST_PROGRAM); - const dts = makeTestBundleProgram(TEST_DTS_PROGRAM); - const host = new Esm2015ReflectionHost(false, program.getTypeChecker(), dts); - const referencesRegistry = new NgccReferencesRegistry(host); - const analyzer = new PrivateDeclarationsAnalyzer(host, referencesRegistry); + const {program, referencesRegistry, analyzer} = setup(TEST_PROGRAM, TEST_DTS_PROGRAM); - // Set up the registry with references - this would normally be done by the - // decoration handlers in the `DecorationAnalyzer`. - const publicComponentDeclaration = - getDeclaration(program, '/src/a.js', 'PublicComponent', ts.isClassDeclaration); - referencesRegistry.add(null !, new Reference(publicComponentDeclaration)); - const privateComponentDeclaration = - getDeclaration(program, '/src/b.js', 'PrivateComponent', ts.isClassDeclaration); - referencesRegistry.add(null !, new Reference(privateComponentDeclaration)); - const internalComponentDeclaration = - getDeclaration(program, '/src/c.js', 'InternalComponent', ts.isClassDeclaration); - referencesRegistry.add(null !, new Reference(internalComponentDeclaration)); + addToReferencesRegistry(program, referencesRegistry, '/src/a.js', 'PublicComponent'); + addToReferencesRegistry(program, referencesRegistry, '/src/b.js', 'PrivateComponent1'); + addToReferencesRegistry(program, referencesRegistry, '/src/c.js', 'InternalComponent1'); const analyses = analyzer.analyzeProgram(program); + // Note that `PrivateComponent2` and `InternalComponent2` are not found because they are + // not added to the ReferencesRegistry (i.e. they were not declared in an NgModule). expect(analyses.length).toEqual(2); expect(analyses).toEqual([ - {identifier: 'PrivateComponent', from: '/src/b.js', dtsFrom: null}, - {identifier: 'InternalComponent', from: '/src/c.js', dtsFrom: '/typings/c.d.ts'}, + {identifier: 'PrivateComponent1', from: '/src/b.js', dtsFrom: null, alias: null}, + { + identifier: 'InternalComponent1', + from: '/src/c.js', + dtsFrom: '/typings/c.d.ts', + alias: null + }, ]); }); + + const ALIASED_EXPORTS_PROGRAM = [ + { + name: '/src/entry_point.js', + isRoot: true, + contents: ` + // This component is only exported as an alias. + export {ComponentOne as aliasedComponentOne} from './a'; + // This component is exported both as itself and an alias. + export {ComponentTwo as aliasedComponentTwo, ComponentTwo} from './a'; + ` + }, + { + name: '/src/a.js', + isRoot: false, + contents: ` + import {Component} from '@angular/core'; + export class ComponentOne {} + ComponentOne.decorators = [ + {type: Component, args: [{selectors: 'a', template: ''}]} + ]; + + export class ComponentTwo {} + Component.decorators = [ + {type: Component, args: [{selectors: 'a', template: ''}]} + ]; + ` + } + ]; + const ALIASED_EXPORTS_DTS_PROGRAM = [ + { + name: '/typings/entry_point.d.ts', + isRoot: true, + contents: ` + export declare class aliasedComponentOne {} + export declare class ComponentTwo {} + export {ComponentTwo as aliasedComponentTwo} + ` + }, + ]; + + it('should find all non-public declarations that were aliased', () => { + const {program, referencesRegistry, analyzer} = + setup(ALIASED_EXPORTS_PROGRAM, ALIASED_EXPORTS_DTS_PROGRAM); + + addToReferencesRegistry(program, referencesRegistry, '/src/a.js', 'ComponentOne'); + addToReferencesRegistry(program, referencesRegistry, '/src/a.js', 'ComponentTwo'); + + const analyses = analyzer.analyzeProgram(program); + expect(analyses).toEqual([{ + identifier: 'ComponentOne', + from: '/src/a.js', + dtsFrom: null, + alias: 'aliasedComponentOne', + }]); + }); }); }); + +type Files = { + name: string, + contents: string, isRoot?: boolean | undefined +}[]; + +function setup(jsProgram: Files, dtsProgram: Files) { + const program = makeTestProgram(...jsProgram); + const dts = makeTestBundleProgram(dtsProgram); + const host = new Esm2015ReflectionHost(false, program.getTypeChecker(), dts); + const referencesRegistry = new NgccReferencesRegistry(host); + const analyzer = new PrivateDeclarationsAnalyzer(host, referencesRegistry); + return {program, referencesRegistry, analyzer}; +} + +/** + * Add up the named component to the references registry. + * + * This would normally be done by the decoration handlers in the `DecorationAnalyzer`. + */ +function addToReferencesRegistry( + program: ts.Program, registry: NgccReferencesRegistry, fileName: string, + componentName: string) { + const declaration = getDeclaration(program, fileName, componentName, ts.isClassDeclaration); + registry.add(null !, new Reference(declaration)); +} diff --git a/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts b/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts index fd6419e8cc..b5154418d8 100644 --- a/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts @@ -140,10 +140,10 @@ import * as i1 from '@angular/common'; const {renderer} = setup(PROGRAM); const output = new MagicString(PROGRAM.contents); renderer.addExports(output, PROGRAM.name.replace(/\.js$/, ''), [ - {from: '/some/a.js', identifier: 'ComponentA1'}, - {from: '/some/a.js', identifier: 'ComponentA2'}, - {from: '/some/foo/b.js', identifier: 'ComponentB'}, - {from: PROGRAM.name, identifier: 'TopLevelComponent'}, + {from: '/some/a.js', dtsFrom: '/some/a.d.ts', identifier: 'ComponentA1'}, + {from: '/some/a.js', dtsFrom: '/some/a.d.ts', identifier: 'ComponentA2'}, + {from: '/some/foo/b.js', dtsFrom: '/some/foo/b.d.ts', identifier: 'ComponentB'}, + {from: PROGRAM.name, dtsFrom: PROGRAM.name, identifier: 'TopLevelComponent'}, ]); expect(output.toString()).toContain(` // Some other content @@ -152,6 +152,21 @@ export {ComponentA2} from './a'; export {ComponentB} from './foo/b'; export {TopLevelComponent};`); }); + + it('should not insert alias exports in js output', () => { + const {renderer} = setup(PROGRAM); + const output = new MagicString(PROGRAM.contents); + renderer.addExports(output, PROGRAM.name.replace(/\.js$/, ''), [ + {from: '/some/a.js', alias: 'eComponentA1', identifier: 'ComponentA1'}, + {from: '/some/a.js', alias: 'eComponentA2', identifier: 'ComponentA2'}, + {from: '/some/foo/b.js', alias: 'eComponentB', identifier: 'ComponentB'}, + {from: PROGRAM.name, alias: 'eTopLevelComponent', identifier: 'TopLevelComponent'}, + ]); + const outputString = output.toString(); + expect(outputString).not.toContain(`{eComponentA1 as ComponentA1}`); + expect(outputString).not.toContain(`{eComponentB as ComponentB}`); + expect(outputString).not.toContain(`{eTopLevelComponent as TopLevelComponent}`); + }); }); describe('addConstants', () => { diff --git a/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts b/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts index 23f21f3d94..62ecd76e8a 100644 --- a/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts @@ -177,10 +177,10 @@ import * as i1 from '@angular/common'; const {renderer} = setup(PROGRAM); const output = new MagicString(PROGRAM.contents); renderer.addExports(output, PROGRAM.name.replace(/\.js$/, ''), [ - {from: '/some/a.js', identifier: 'ComponentA1'}, - {from: '/some/a.js', identifier: 'ComponentA2'}, - {from: '/some/foo/b.js', identifier: 'ComponentB'}, - {from: PROGRAM.name, identifier: 'TopLevelComponent'}, + {from: '/some/a.js', dtsFrom: '/some/a.d.ts', identifier: 'ComponentA1'}, + {from: '/some/a.js', dtsFrom: '/some/a.d.ts', identifier: 'ComponentA2'}, + {from: '/some/foo/b.js', dtsFrom: '/some/foo/b.d.ts', identifier: 'ComponentB'}, + {from: PROGRAM.name, dtsFrom: PROGRAM.name, identifier: 'TopLevelComponent'}, ]); expect(output.toString()).toContain(` export {A, B, C, NoIife, BadIife}; @@ -189,6 +189,21 @@ export {ComponentA2} from './a'; export {ComponentB} from './foo/b'; export {TopLevelComponent};`); }); + + it('should not insert alias exports in js output', () => { + const {renderer} = setup(PROGRAM); + const output = new MagicString(PROGRAM.contents); + renderer.addExports(output, PROGRAM.name.replace(/\.js$/, ''), [ + {from: '/some/a.js', alias: 'eComponentA1', identifier: 'ComponentA1'}, + {from: '/some/a.js', alias: 'eComponentA2', identifier: 'ComponentA2'}, + {from: '/some/foo/b.js', alias: 'eComponentB', identifier: 'ComponentB'}, + {from: PROGRAM.name, alias: 'eTopLevelComponent', identifier: 'TopLevelComponent'}, + ]); + const outputString = output.toString(); + expect(outputString).not.toContain(`{eComponentA1 as ComponentA1}`); + expect(outputString).not.toContain(`{eComponentB as ComponentB}`); + expect(outputString).not.toContain(`{eTopLevelComponent as TopLevelComponent}`); + }); }); describe('addConstants', () => { From ca20f571b8c94d61b3bbd30e034e70819a093f97 Mon Sep 17 00:00:00 2001 From: Alan Date: Thu, 7 Mar 2019 12:02:39 +0100 Subject: [PATCH 0289/1073] fix(ivy): always convert `rootDirs` to `AbsoluteFsPath` in `getRootDirs` (#29151) `getCurrentDirectory` directory doesn't return a posix separated normalized path. While `rootDir` and `rootDirs` should return posix separated paths, it's best to not assume as other paths within the compiler options can be returned not posix separated such as `basePath` See: https://github.com/Microsoft/TypeScript/blob/master/src/compiler/sys.ts#L635 This partially fixes #29140, however there needs to be a change in the CLI as well to handle this, as at the moment we are leaking devkit paths which is not correct. Fixes #29140 PR Close #29151 --- packages/compiler-cli/src/ngtsc/util/src/typescript.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/src/ngtsc/util/src/typescript.ts b/packages/compiler-cli/src/ngtsc/util/src/typescript.ts index d672cc651b..a63ded5d28 100644 --- a/packages/compiler-cli/src/ngtsc/util/src/typescript.ts +++ b/packages/compiler-cli/src/ngtsc/util/src/typescript.ts @@ -78,7 +78,12 @@ export function getRootDirs(host: ts.CompilerHost, options: ts.CompilerOptions): } else { rootDirs.push(host.getCurrentDirectory()); } - return rootDirs.map(rootDir => AbsoluteFsPath.fromUnchecked(rootDir)); + + // In Windows the above might not always return posix separated paths + // See: + // https://github.com/Microsoft/TypeScript/blob/3f7357d37f66c842d70d835bc925ec2a873ecfec/src/compiler/sys.ts#L650 + // Also compiler options might be set via an API which doesn't normalize paths + return rootDirs.map(rootDir => AbsoluteFsPath.from(rootDir)); } export function nodeDebugInfo(node: ts.Node): string { From 4b9eb6185f0bbc8c14781ddf903d20d060581abe Mon Sep 17 00:00:00 2001 From: Marc Laval Date: Mon, 11 Mar 2019 17:12:50 +0100 Subject: [PATCH 0290/1073] test(ivy): diagnose root causes of failures in CdkTree and MatTree (#29224) PR Close #29224 --- .../angular_material_test_blocklist.js | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index bbc480ecc9..991b88e898 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -87,27 +87,27 @@ window.testBlocklist = { }, "CdkTree flat tree should initialize should be able to use units different from px for the indentation": { "error": "Error: Failed: Expected node level to be 15rem but was 28px", - "notes": "Unknown" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (CdkTree is OnPush)" }, "CdkTree flat tree should initialize should default to px if no unit is set for string value indentation": { "error": "Error: Failed: Expected node level to be 17px but was 28px", - "notes": "Unknown" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (CdkTree is OnPush)" }, "CdkTree flat tree with toggle should expand/collapse the node": { "error": "Error: Failed: Expected node level to be 40px but was ", - "notes": "Unknown" + "notes": "Breaking change: Static directive inputs evaluated in creation mode (CdkTreeNode.mostRecentTreeNode.data is set after inputs)" }, "CdkTree flat tree with toggle should expand/collapse the node recursively": { "error": "Error: Failed: Expected node level to be 40px but was ", - "notes": "Unknown" + "notes": "Breaking change: Static directive inputs evaluated in creation mode (CdkTreeNode.mostRecentTreeNode.data is set after inputs)" }, "CdkTree nested tree with toggle should expand/collapse the node multiple times": { "error": "Error: Expected 3 to be 1, 'Expect node expanded'.", - "notes": "Unknown" + "notes": "1) Breaking change: Change detection follows insertion tree only, not declaration tree (CdkTree is OnPush) - 2) Breaking change: Content queries and descendants flag (fix test by removing
in NestedCdkTreeAppWithToggle)" }, "CdkTree nested tree with toggle should expand/collapse the node recursively": { "error": "Error: Failed: Expected node descendant num to be 2 but was 0", - "notes": "Unknown" + "notes": "Breaking change: Content queries and descendants flag (fix test by removing
in NestedCdkTreeAppWithToggle)" }, "MatChipList StandardChipList basic behaviors should toggle the chips disabled state based on whether it is disabled": { "error": "Error: Expected true to be false.", @@ -227,19 +227,19 @@ window.testBlocklist = { }, "MatTree flat tree with toggle should expand/collapse the node": { "error": "Error: Expected 0 to be 1, 'Expect node expanded one level'.", - "notes": "Unknown" + "notes": "Breaking change: Static directive inputs evaluated in creation mode (CdkTreeNode.mostRecentTreeNode.data is set after inputs)" }, "MatTree flat tree with toggle should expand/collapse the node recursively": { "error": "Error: Expected 0 to be 3, 'Expect nodes expanded'.", - "notes": "Unknown" + "notes": "Breaking change: Static directive inputs evaluated in creation mode (CdkTreeNode.mostRecentTreeNode.data is set after inputs)" }, "MatTree nested tree with toggle should expand/collapse the node": { "error": "Error: Expected 0 to be 1, 'Expect node expanded'.", - "notes": "Unknown" + "notes": "1) Breaking change: Content queries and descendants flag (fix test by removing
in NestedMatTreeAppWithToggle) - 2) Breaking change: Ivy inherits metadata from superclasses (remove (click) in MatTreeNodeToggle)" }, "MatTree nested tree with toggle should expand/collapse the node recursively": { "error": "Error: Expected 0 to be 3, 'Expect node expanded'.", - "notes": "Unknown" + "notes": "1) Breaking change: Content queries and descendants flag (fix test by removing
in NestedMatTreeAppWithToggle) - 2) Breaking change: Ivy inherits metadata from superclasses (remove (click) in MatTreeNodeToggle)" }, "MatInput without forms validates the type": { "error": "Error: Input type \"file\" isn't supported by matInput.", From a29ce5773243633aaa081dd91c1b697b6a36d560 Mon Sep 17 00:00:00 2001 From: Adam Plumer Date: Fri, 9 Nov 2018 20:23:46 -0600 Subject: [PATCH 0291/1073] docs: migrate examples from @angular/http to @angular/common/http (#28296) PR Close #28296 --- .../examples/http/src/browser-test-shim.js | 1 - .../05-04/app/heroes/shared/hero.service.ts | 11 +- .../hero-list/hero-list.component.avoid.ts | 7 +- .../07-01/app/heroes/shared/hero.service.ts | 8 +- .../heroes/shared/hero-arena.service.avoid.ts | 4 +- .../app/heroes/shared/hero-arena.service.ts | 4 +- .../examples/styleguide/src/app/app.module.ts | 6 +- .../src/app/model/http-hero.service.spec.ts | 126 - .../src/app/model/http-hero.service.ts | 69 - aio/content/examples/testing/src/tests.html | 1 - aio/content/examples/testing/src/tests.sb.ts | 1 - .../upgrade-module/src/systemjs.config.1.js | 2 +- .../app/app.module.ts | 20 +- .../app/core/phone/phone.service.spec.ts | 35 +- .../app/core/phone/phone.service.ts | 13 +- .../karma-test-shim.1.js | 1 - .../karma-test-shim.js | 1 - .../systemjs.config.1.js | 2 +- .../app/app.module.ts | 4 +- .../app/core/phone/phone.service.spec.ts | 33 +- .../app/core/phone/phone.service.ts | 13 +- .../karma-test-shim.js | 2 +- .../upgrade-phonecat-3-final/karma.conf.js | 4 + .../systemjs.config.1.js | 2 +- aio/content/guide/npm-packages.md | 1 - aio/content/guide/testing.md | 7 - aio/content/guide/upgrade.md | 8 +- .../customizer/package-json/base.json | 1 - .../shared/boilerplate/cli/package.json | 3 +- .../shared/boilerplate/i18n/package.json | 3 +- .../boilerplate/service-worker/package.json | 3 +- .../systemjs/src/systemjs.config.js | 1 - .../systemjs/src/systemjs.config.web.build.js | 2 - .../systemjs/src/systemjs.config.web.js | 1 - .../shared/boilerplate/universal/package.json | 2 +- aio/tools/examples/shared/yarn.lock | 4762 ++++++++--------- .../processors/computeApiBreadCrumbs.spec.js | 22 - .../processors/generateApiListDoc.spec.js | 4 +- 38 files changed, 2432 insertions(+), 2758 deletions(-) delete mode 100644 aio/content/examples/testing/src/app/model/http-hero.service.spec.ts delete mode 100644 aio/content/examples/testing/src/app/model/http-hero.service.ts diff --git a/aio/content/examples/http/src/browser-test-shim.js b/aio/content/examples/http/src/browser-test-shim.js index 6a7ce2698b..1b0e954aac 100644 --- a/aio/content/examples/http/src/browser-test-shim.js +++ b/aio/content/examples/http/src/browser-test-shim.js @@ -28,7 +28,6 @@ '@angular/compiler/testing': 'npm:@angular/compiler/bundles/compiler-testing.umd.js', '@angular/platform-browser/testing': 'npm:@angular/platform-browser/bundles/platform-browser-testing.umd.js', '@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic-testing.umd.js', - '@angular/http/testing': 'npm:@angular/http/bundles/http-testing.umd.js', '@angular/router/testing': 'npm:@angular/router/bundles/router-testing.umd.js', '@angular/forms/testing': 'npm:@angular/forms/bundles/forms-testing.umd.js', }, diff --git a/aio/content/examples/styleguide/src/05-04/app/heroes/shared/hero.service.ts b/aio/content/examples/styleguide/src/05-04/app/heroes/shared/hero.service.ts index a12fdf487e..78b3e247c2 100644 --- a/aio/content/examples/styleguide/src/05-04/app/heroes/shared/hero.service.ts +++ b/aio/content/examples/styleguide/src/05-04/app/heroes/shared/hero.service.ts @@ -1,19 +1,16 @@ import { Injectable } from '@angular/core'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { Hero } from './hero.model'; +import { Hero } from './hero.model'; @Injectable() export class HeroService { - constructor(private http: Http) {} + constructor(private http: HttpClient) {} getHeroes(): Observable { - return this.http.get('api/heroes').pipe( - map(resp => resp.json().data as Hero[]) - ); + return this.http.get('api/heroes'); } } diff --git a/aio/content/examples/styleguide/src/05-15/app/heroes/hero-list/hero-list.component.avoid.ts b/aio/content/examples/styleguide/src/05-15/app/heroes/hero-list/hero-list.component.avoid.ts index 8f9334b468..5a27406eed 100644 --- a/aio/content/examples/styleguide/src/05-15/app/heroes/hero-list/hero-list.component.avoid.ts +++ b/aio/content/examples/styleguide/src/05-15/app/heroes/hero-list/hero-list.component.avoid.ts @@ -2,10 +2,10 @@ /* avoid */ import { OnInit } from '@angular/core'; -import { Http, Response } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; -import { catchError, finalize, map } from 'rxjs/operators'; +import { catchError, finalize } from 'rxjs/operators'; import { Hero } from '../shared/hero.model'; @@ -13,11 +13,10 @@ const heroesUrl = 'http://angular.io'; export class HeroListComponent implements OnInit { heroes: Hero[]; - constructor(private http: Http) {} + constructor(private http: HttpClient) {} getHeroes() { this.heroes = []; this.http.get(heroesUrl).pipe( - map((response: Response) => response.json().data), catchError(this.catchBadResponse), finalize(() => this.hideSpinner()) ).subscribe((heroes: Hero[]) => this.heroes = heroes); diff --git a/aio/content/examples/styleguide/src/07-01/app/heroes/shared/hero.service.ts b/aio/content/examples/styleguide/src/07-01/app/heroes/shared/hero.service.ts index b44a72967e..5affff16ae 100644 --- a/aio/content/examples/styleguide/src/07-01/app/heroes/shared/hero.service.ts +++ b/aio/content/examples/styleguide/src/07-01/app/heroes/shared/hero.service.ts @@ -1,18 +1,16 @@ // #docregion import { Injectable } from '@angular/core'; -import { Http, Response } from '@angular/http'; -import { map } from 'rxjs/operators'; +import { HttpClient } from '@angular/common/http'; import { Hero } from './hero.model'; @Injectable() // #docregion example export class HeroService { - constructor(private http: Http) { } + constructor(private http: HttpClient) { } getHeroes() { - return this.http.get('api/heroes').pipe( - map((response: Response) => response.json())); + return this.http.get('api/heroes'); } } // #enddocregion example diff --git a/aio/content/examples/styleguide/src/07-04/app/heroes/shared/hero-arena.service.avoid.ts b/aio/content/examples/styleguide/src/07-04/app/heroes/shared/hero-arena.service.avoid.ts index 698fa65239..76815e51d7 100644 --- a/aio/content/examples/styleguide/src/07-04/app/heroes/shared/hero-arena.service.avoid.ts +++ b/aio/content/examples/styleguide/src/07-04/app/heroes/shared/hero-arena.service.avoid.ts @@ -1,6 +1,6 @@ // #docregion import { Inject } from '@angular/core'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { HeroService } from './hero.service'; // #docregion example @@ -9,6 +9,6 @@ import { HeroService } from './hero.service'; export class HeroArena { constructor( @Inject(HeroService) private heroService: HeroService, - @Inject(Http) private http: Http) {} + @Inject(HttpClient) private http: HttpClient) {} } // #enddocregion example diff --git a/aio/content/examples/styleguide/src/07-04/app/heroes/shared/hero-arena.service.ts b/aio/content/examples/styleguide/src/07-04/app/heroes/shared/hero-arena.service.ts index 22392ab4fd..339d811637 100644 --- a/aio/content/examples/styleguide/src/07-04/app/heroes/shared/hero-arena.service.ts +++ b/aio/content/examples/styleguide/src/07-04/app/heroes/shared/hero-arena.service.ts @@ -1,7 +1,7 @@ // #docplaster // #docregion import { Injectable } from '@angular/core'; -import { Http } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { HeroService } from './hero.service'; @@ -10,7 +10,7 @@ import { HeroService } from './hero.service'; export class HeroArena { constructor( private heroService: HeroService, - private http: Http) {} + private http: HttpClient) {} // #enddocregion example // test harness getParticipants() { diff --git a/aio/content/examples/styleguide/src/app/app.module.ts b/aio/content/examples/styleguide/src/app/app.module.ts index 1e974baf5f..2420170d4f 100644 --- a/aio/content/examples/styleguide/src/app/app.module.ts +++ b/aio/content/examples/styleguide/src/app/app.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; +import { BrowserModule } from '@angular/platform-browser'; -import { HttpModule } from '@angular/http'; +import { HttpClientModule } from '@angular/common/http'; import { InMemoryWebApiModule } from 'angular-in-memory-web-api'; import { RouterModule } from '@angular/router'; @@ -44,7 +44,7 @@ import * as s0901 from '../09-01/app/app.module'; @NgModule({ imports: [ BrowserModule, - HttpModule, + HttpClientModule, InMemoryWebApiModule.forRoot(HeroData), s0101.AppModule, diff --git a/aio/content/examples/testing/src/app/model/http-hero.service.spec.ts b/aio/content/examples/testing/src/app/model/http-hero.service.spec.ts deleted file mode 100644 index 54b23e1851..0000000000 --- a/aio/content/examples/testing/src/app/model/http-hero.service.spec.ts +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Test the HeroService when implemented with the OLD HttpModule - */ -import { - async, inject, TestBed -} from '@angular/core/testing'; - -import { - MockBackend, - MockConnection -} from '@angular/http/testing'; - -import { - HttpModule, Http, XHRBackend, Response, ResponseOptions -} from '@angular/http'; - -import { of } from 'rxjs'; - -import { Hero } from './hero'; -import { HttpHeroService } from './http-hero.service'; - -const makeHeroData = () => [ - { id: 1, name: 'Windstorm' }, - { id: 2, name: 'Bombasto' }, - { id: 3, name: 'Magneta' }, - { id: 4, name: 'Tornado' } -] as Hero[]; - -//////// Tests ///////////// -describe('HttpHeroService (using old HttpModule)', () => { - let backend: MockBackend; - let service: HttpHeroService; - - beforeEach( () => { - TestBed.configureTestingModule({ - imports: [ HttpModule ], - providers: [ - HttpHeroService, - { provide: XHRBackend, useClass: MockBackend } - ] - }); - }); - - it('can instantiate service via DI', () => { - service = TestBed.get(HttpHeroService); - expect(service instanceof HttpHeroService).toBe(true); - }); - - it('can instantiate service with "new"', () => { - const http = TestBed.get(Http); - expect(http).not.toBeNull('http should be provided'); - let service = new HttpHeroService(http); - expect(service instanceof HttpHeroService).toBe(true, 'new service should be ok'); - }); - - it('can provide the mockBackend as XHRBackend', () => { - const backend = TestBed.get(XHRBackend); - expect(backend).not.toBeNull('backend should be provided'); - }); - - describe('when getHeroes', () => { - let fakeHeroes: Hero[]; - let http: Http; - let response: Response; - - beforeEach(() => { - - backend = TestBed.get(XHRBackend); - http = TestBed.get(Http); - - service = new HttpHeroService(http); - fakeHeroes = makeHeroData(); - let options = new ResponseOptions({status: 200, body: {data: fakeHeroes}}); - response = new Response(options); - }); - - it('should have expected fake heroes (then)', () => { - backend.connections.subscribe((c: MockConnection) => c.mockRespond(response)); - - service.getHeroes().toPromise() - // .then(() => Promise.reject('deliberate')) - .then(heroes => { - expect(heroes.length).toBe(fakeHeroes.length, - 'should have expected no. of heroes'); - }) - .catch(fail); - }); - - it('should have expected fake heroes (Observable tap)', () => { - backend.connections.subscribe((c: MockConnection) => c.mockRespond(response)); - - service.getHeroes().subscribe( - heroes => { - expect(heroes.length).toBe(fakeHeroes.length, - 'should have expected no. of heroes'); - }, - fail - ); - }); - - - it('should be OK returning no heroes', () => { - let resp = new Response(new ResponseOptions({status: 200, body: {data: []}})); - backend.connections.subscribe((c: MockConnection) => c.mockRespond(resp)); - - service.getHeroes().subscribe( - heroes => { - expect(heroes.length).toBe(0, 'should have no heroes'); - }, - fail - ); - }); - - it('should treat 404 as an Observable error', () => { - let resp = new Response(new ResponseOptions({status: 404})); - backend.connections.subscribe((c: MockConnection) => c.mockRespond(resp)); - - service.getHeroes().subscribe( - heroes => fail('should not respond with heroes'), - err => { - expect(err).toMatch(/Bad response status/, 'should catch bad response status code'); - return of(null); // failure is the expected test result - }); - }); - }); -}); diff --git a/aio/content/examples/testing/src/app/model/http-hero.service.ts b/aio/content/examples/testing/src/app/model/http-hero.service.ts deleted file mode 100644 index 4c6b79be79..0000000000 --- a/aio/content/examples/testing/src/app/model/http-hero.service.ts +++ /dev/null @@ -1,69 +0,0 @@ -// The OLD Http module. See HeroService for use of the current HttpClient -// #docplaster -// #docregion -import { Injectable } from '@angular/core'; -import { Http, Response } from '@angular/http'; -import { Headers, RequestOptions } from '@angular/http'; -import { Hero } from './hero'; - -import { Observable } from 'rxjs'; -import { throwError } from 'rxjs'; -import { catchError, map } from 'rxjs/operators'; - -@Injectable() -export class HttpHeroService { - private _heroesUrl = 'app/heroes'; // URL to web api - - constructor (private http: Http) {} - - getHeroes (): Observable { - return this.http.get(this._heroesUrl).pipe( - map(this.extractData), - // tap(data => console.log(data)), // eyeball results in the console - catchError(this.handleError) - ); - } - - getHero(id: number | string) { - return this.http.get('app/heroes/?id=${id}').pipe( - map((r: Response) => r.json().data as Hero[]) - ); - } - - addHero (name: string): Observable { - let body = JSON.stringify({ name }); - let headers = new Headers({ 'Content-Type': 'application/json' }); - let options = new RequestOptions({ headers: headers }); - - return this.http.post(this._heroesUrl, body, options).pipe( - map(this.extractData), - catchError(this.handleError) - ); - } - - updateHero (hero: Hero): Observable { - let body = JSON.stringify(hero); - let headers = new Headers({ 'Content-Type': 'application/json' }); - let options = new RequestOptions({ headers: headers }); - - return this.http.put(this._heroesUrl, body, options).pipe( - map(this.extractData), - catchError(this.handleError) - ); - } - - private extractData(res: Response) { - if (res.status < 200 || res.status >= 300) { - throw new Error('Bad response status: ' + res.status); - } - let body = res.json(); - return body.data || { }; - } - - private handleError (error: any) { - // In a real world app, we might send the error to remote logging infrastructure - let errMsg = error.message || 'Server error'; - console.error(errMsg); // log to console instead - return throwError(errMsg); - } -} diff --git a/aio/content/examples/testing/src/tests.html b/aio/content/examples/testing/src/tests.html index 0125f88500..256f51194b 100644 --- a/aio/content/examples/testing/src/tests.html +++ b/aio/content/examples/testing/src/tests.html @@ -41,7 +41,6 @@ 'app/hero/hero-detail.component.spec', 'app/hero/hero-list.component.spec', 'app/model/hero.service.spec', - 'app/model/http-hero.service.spec', 'app/shared/highlight.directive.spec', 'app/shared/title-case.pipe.spec', 'app/twain/twain.component.spec', diff --git a/aio/content/examples/testing/src/tests.sb.ts b/aio/content/examples/testing/src/tests.sb.ts index c255cca180..2cb3b440f6 100644 --- a/aio/content/examples/testing/src/tests.sb.ts +++ b/aio/content/examples/testing/src/tests.sb.ts @@ -17,7 +17,6 @@ import './app/hero/hero-detail.component.no-testbed.spec.ts'; import './app/hero/hero-detail.component.spec.ts'; import './app/hero/hero-list.component.spec.ts'; import './app/model/hero.service.spec.ts'; -import './app/model/http-hero.service.spec.ts'; import './app/model/testing/http-client.spec.ts'; import './app/shared/highlight.directive.spec.ts'; import './app/shared/title-case.pipe.spec.ts'; diff --git a/aio/content/examples/upgrade-module/src/systemjs.config.1.js b/aio/content/examples/upgrade-module/src/systemjs.config.1.js index 67e5fa5464..bba4904f62 100644 --- a/aio/content/examples/upgrade-module/src/systemjs.config.1.js +++ b/aio/content/examples/upgrade-module/src/systemjs.config.1.js @@ -15,10 +15,10 @@ // angular bundles '@angular/core': 'npm:@angular/core/bundles/core.umd.js', '@angular/common': 'npm:@angular/common/bundles/common.umd.js', + '@angular/common/http': 'npm:@angular/common/bundles/common-http.umd.js', '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js', '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', - '@angular/http': 'npm:@angular/http/bundles/http.umd.js', '@angular/router': 'npm:@angular/router/bundles/router.umd.js', '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', // #docregion upgrade-static-umd diff --git a/aio/content/examples/upgrade-phonecat-2-hybrid/app/app.module.ts b/aio/content/examples/upgrade-phonecat-2-hybrid/app/app.module.ts index ba8b01c246..21cf1234ba 100644 --- a/aio/content/examples/upgrade-phonecat-2-hybrid/app/app.module.ts +++ b/aio/content/examples/upgrade-phonecat-2-hybrid/app/app.module.ts @@ -6,9 +6,9 @@ import { BrowserModule } from '@angular/platform-browser'; // #docregion upgrademodule import { UpgradeModule } from '@angular/upgrade/static'; // #enddocregion upgrademodule -// #docregion httpmodule -import { HttpModule } from '@angular/http'; -// #enddocregion httpmodule +// #docregion httpclientmodule +import { HttpClientModule } from '@angular/common/http'; +// #enddocregion httpclientmodule // #docregion phonelist import { FormsModule } from '@angular/forms'; // #enddocregion phonelist @@ -28,7 +28,7 @@ import { routeParamsProvider } from './ajs-upgraded-providers'; import { PhoneDetailComponent } from './phone-detail/phone-detail.component'; // #enddocregion phonedetail -// #docregion bare, upgrademodule, httpmodule, phone, phonelist, phonedetail, checkmarkpipe +// #docregion bare, upgrademodule, httpclientmodule, phone, phonelist, phonedetail, checkmarkpipe @NgModule({ imports: [ @@ -36,12 +36,12 @@ import { PhoneDetailComponent } from './phone-detail/phone-detail.component'; // #enddocregion bare UpgradeModule, // #enddocregion upgrademodule - HttpModule, - // #enddocregion httpmodule, phone + HttpClientModule, + // #enddocregion httpclientmodule, phone FormsModule, - // #docregion bare, upgrademodule, httpmodule, phone + // #docregion bare, upgrademodule, httpclientmodule, phone ], - // #enddocregion bare, upgrademodule, httpmodule, phone + // #enddocregion bare, upgrademodule, httpclientmodule, phone declarations: [ PhoneListComponent, // #enddocregion phonelist @@ -63,7 +63,7 @@ import { PhoneDetailComponent } from './phone-detail/phone-detail.component'; // #docregion phone ] // #enddocregion routeparams -// #docregion bare, upgrademodule, httpmodule, phonelist +// #docregion bare, upgrademodule, httpclientmodule, phonelist }) export class AppModule { // #enddocregion bare @@ -73,4 +73,4 @@ export class AppModule { } // #docregion bare } -// #enddocregion bare, upgrademodule, httpmodule, phone, phonelist, phonedetail, checkmarkpipe +// #enddocregion bare, upgrademodule, httpclientmodule, phone, phonelist, phonedetail, checkmarkpipe diff --git a/aio/content/examples/upgrade-phonecat-2-hybrid/app/core/phone/phone.service.spec.ts b/aio/content/examples/upgrade-phonecat-2-hybrid/app/core/phone/phone.service.spec.ts index a0c1655c20..54b1a719aa 100644 --- a/aio/content/examples/upgrade-phonecat-2-hybrid/app/core/phone/phone.service.spec.ts +++ b/aio/content/examples/upgrade-phonecat-2-hybrid/app/core/phone/phone.service.spec.ts @@ -1,12 +1,6 @@ // #docregion import { inject, TestBed } from '@angular/core/testing'; -import { - Http, - BaseRequestOptions, - ResponseOptions, - Response -} from '@angular/http'; -import { MockBackend, MockConnection } from '@angular/http/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { Phone, PhoneData } from './phone.service'; describe('Phone', function() { @@ -16,35 +10,34 @@ describe('Phone', function() { {name: 'Phone Y', snippet: '', images: []}, {name: 'Phone Z', snippet: '', images: []} ]; - let mockBackend: MockBackend; + let httpMock: HttpTestingController; beforeEach(() => { TestBed.configureTestingModule({ + imports: [ + HttpClientTestingModule + ], providers: [ Phone, - MockBackend, - BaseRequestOptions, - { provide: Http, - useFactory: (backend: MockBackend, options: BaseRequestOptions) => new Http(backend, options), - deps: [MockBackend, BaseRequestOptions] - } ] }); }); - beforeEach(inject([MockBackend, Phone], (_mockBackend_: MockBackend, _phone_: Phone) => { - mockBackend = _mockBackend_; + beforeEach(inject([HttpTestingController, Phone], (_httpMock_: HttpTestingController, _phone_: Phone) => { + httpMock = _httpMock_; phone = _phone_; })); - it('should fetch the phones data from `/phones/phones.json`', (done: () => void) => { - mockBackend.connections.subscribe((conn: MockConnection) => { - conn.mockRespond(new Response(new ResponseOptions({body: JSON.stringify(phonesData)}))); - }); + afterEach(() => { + httpMock.verify(); + }); + + it('should fetch the phones data from `/phones/phones.json`', () => { phone.query().subscribe(result => { expect(result).toEqual(phonesData); - done(); }); + const req = httpMock.expectOne(`/phones/phones.json`); + req.flush(phonesData); }); }); diff --git a/aio/content/examples/upgrade-phonecat-2-hybrid/app/core/phone/phone.service.ts b/aio/content/examples/upgrade-phonecat-2-hybrid/app/core/phone/phone.service.ts index 22ff7d7ce5..c5b4702e95 100644 --- a/aio/content/examples/upgrade-phonecat-2-hybrid/app/core/phone/phone.service.ts +++ b/aio/content/examples/upgrade-phonecat-2-hybrid/app/core/phone/phone.service.ts @@ -1,8 +1,7 @@ // #docregion import { Injectable } from '@angular/core'; -import { Http, Response } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; // #docregion downgrade-injectable declare var angular: angular.IAngularStatic; @@ -22,16 +21,12 @@ export interface PhoneData { @Injectable() export class Phone { // #enddocregion classdef, downgrade-injectable - constructor(private http: Http) { } + constructor(private http: HttpClient) { } query(): Observable { - return this.http.get(`phones/phones.json`).pipe( - map((res: Response) => res.json()) - ); + return this.http.get(`phones/phones.json`); } get(id: string): Observable { - return this.http.get(`phones/${id}.json`).pipe( - map((res: Response) => res.json()) - ); + return this.http.get(`phones/${id}.json`); } // #docregion classdef, downgrade-injectable } diff --git a/aio/content/examples/upgrade-phonecat-2-hybrid/karma-test-shim.1.js b/aio/content/examples/upgrade-phonecat-2-hybrid/karma-test-shim.1.js index b92085c014..433870151d 100644 --- a/aio/content/examples/upgrade-phonecat-2-hybrid/karma-test-shim.1.js +++ b/aio/content/examples/upgrade-phonecat-2-hybrid/karma-test-shim.1.js @@ -41,7 +41,6 @@ System.config({ '@angular/compiler/testing': 'npm:@angular/compiler/bundles/compiler-testing.umd.js', '@angular/platform-browser/testing': 'npm:@angular/platform-browser/bundles/platform-browser-testing.umd.js', '@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic-testing.umd.js', - '@angular/http/testing': 'npm:@angular/http/bundles/http-testing.umd.js', '@angular/router/testing': 'npm:@angular/router/bundles/router-testing.umd.js', '@angular/forms/testing': 'npm:@angular/forms/bundles/forms-testing.umd.js', }, diff --git a/aio/content/examples/upgrade-phonecat-2-hybrid/karma-test-shim.js b/aio/content/examples/upgrade-phonecat-2-hybrid/karma-test-shim.js index 6030abfd3d..7916766ed4 100644 --- a/aio/content/examples/upgrade-phonecat-2-hybrid/karma-test-shim.js +++ b/aio/content/examples/upgrade-phonecat-2-hybrid/karma-test-shim.js @@ -48,7 +48,6 @@ System.config({ '@angular/compiler/testing': 'npm:@angular/compiler/bundles/compiler-testing.umd.js', '@angular/platform-browser/testing': 'npm:@angular/platform-browser/bundles/platform-browser-testing.umd.js', '@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic-testing.umd.js', - '@angular/http/testing': 'npm:@angular/http/bundles/http-testing.umd.js', '@angular/router/testing': 'npm:@angular/router/bundles/router-testing.umd.js', '@angular/forms/testing': 'npm:@angular/forms/bundles/forms-testing.umd.js', }, diff --git a/aio/content/examples/upgrade-phonecat-2-hybrid/systemjs.config.1.js b/aio/content/examples/upgrade-phonecat-2-hybrid/systemjs.config.1.js index 8cde9dab12..681684ffc4 100644 --- a/aio/content/examples/upgrade-phonecat-2-hybrid/systemjs.config.1.js +++ b/aio/content/examples/upgrade-phonecat-2-hybrid/systemjs.config.1.js @@ -16,10 +16,10 @@ // angular bundles '@angular/core': 'npm:@angular/core/bundles/core.umd.js', '@angular/common': 'npm:@angular/common/bundles/common.umd.js', + '@angular/common/http': 'npm:@angular/common/bundles/common-http.umd.js', '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js', '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', - '@angular/http': 'npm:@angular/http/bundles/http.umd.js', '@angular/router': 'npm:@angular/router/bundles/router.umd.js', '@angular/router/upgrade': 'npm:@angular/router/bundles/router-upgrade.umd.js', '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', diff --git a/aio/content/examples/upgrade-phonecat-3-final/app/app.module.ts b/aio/content/examples/upgrade-phonecat-3-final/app/app.module.ts index 607ecab8c9..d7ab65b498 100644 --- a/aio/content/examples/upgrade-phonecat-3-final/app/app.module.ts +++ b/aio/content/examples/upgrade-phonecat-3-final/app/app.module.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; import { BrowserModule } from '@angular/platform-browser'; import { FormsModule } from '@angular/forms'; -import { HttpModule } from '@angular/http'; +import { HttpClientModule } from '@angular/common/http'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; @@ -15,7 +15,7 @@ import { PhoneListComponent } from './phone-list/phone-list.component'; imports: [ BrowserModule, FormsModule, - HttpModule, + HttpClientModule, AppRoutingModule ], declarations: [ diff --git a/aio/content/examples/upgrade-phonecat-3-final/app/core/phone/phone.service.spec.ts b/aio/content/examples/upgrade-phonecat-3-final/app/core/phone/phone.service.spec.ts index e3a422965b..0961491cff 100644 --- a/aio/content/examples/upgrade-phonecat-3-final/app/core/phone/phone.service.spec.ts +++ b/aio/content/examples/upgrade-phonecat-3-final/app/core/phone/phone.service.spec.ts @@ -1,11 +1,5 @@ import { inject, TestBed } from '@angular/core/testing'; -import { - Http, - BaseRequestOptions, - ResponseOptions, - Response -} from '@angular/http'; -import { MockBackend, MockConnection } from '@angular/http/testing'; +import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; import { Phone, PhoneData } from './phone.service'; describe('Phone', function() { @@ -15,35 +9,26 @@ describe('Phone', function() { {name: 'Phone Y', snippet: '', images: []}, {name: 'Phone Z', snippet: '', images: []} ]; - let mockBackend: MockBackend; + let mockHttp: HttpTestingController; beforeEach(() => { TestBed.configureTestingModule({ - providers: [ - Phone, - MockBackend, - BaseRequestOptions, - { provide: Http, - useFactory: (backend: MockBackend, options: BaseRequestOptions) => new Http(backend, options), - deps: [MockBackend, BaseRequestOptions] - } - ] + imports: [HttpClientTestingModule], + providers: [Phone] }); }); - beforeEach(inject([MockBackend, Phone], (_mockBackend_: MockBackend, _phone_: Phone) => { - mockBackend = _mockBackend_; + beforeEach(inject([HttpTestingController, Phone], (_mockHttp_: HttpTestingController, _phone_: Phone) => { + mockHttp = _mockHttp_; phone = _phone_; })); - it('should fetch the phones data from `/phones/phones.json`', (done: () => void) => { - mockBackend.connections.subscribe((conn: MockConnection) => { - conn.mockRespond(new Response(new ResponseOptions({body: JSON.stringify(phonesData)}))); - }); + it('should fetch the phones data from `/phones/phones.json`', () => { phone.query().subscribe(result => { expect(result).toEqual(phonesData); - done(); }); + const req = mockHttp.expectOne(`/phones/phones.json`); + req.flush(phonesData); }); }); diff --git a/aio/content/examples/upgrade-phonecat-3-final/app/core/phone/phone.service.ts b/aio/content/examples/upgrade-phonecat-3-final/app/core/phone/phone.service.ts index df2cac0d9d..33643a900d 100644 --- a/aio/content/examples/upgrade-phonecat-3-final/app/core/phone/phone.service.ts +++ b/aio/content/examples/upgrade-phonecat-3-final/app/core/phone/phone.service.ts @@ -1,8 +1,7 @@ // #docregion import { Injectable } from '@angular/core'; -import { Http, Response } from '@angular/http'; +import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; export interface PhoneData { name: string; @@ -12,15 +11,11 @@ export interface PhoneData { @Injectable() export class Phone { - constructor(private http: Http) { } + constructor(private http: HttpClient) { } query(): Observable { - return this.http.get(`phones/phones.json`).pipe( - map((res: Response) => res.json()) - ); + return this.http.get(`phones/phones.json`); } get(id: string): Observable { - return this.http.get(`phones/${id}.json`).pipe( - map((res: Response) => res.json()) - ); + return this.http.get(`phones/${id}.json`); } } diff --git a/aio/content/examples/upgrade-phonecat-3-final/karma-test-shim.js b/aio/content/examples/upgrade-phonecat-3-final/karma-test-shim.js index 1b8d6acdd4..7916766ed4 100644 --- a/aio/content/examples/upgrade-phonecat-3-final/karma-test-shim.js +++ b/aio/content/examples/upgrade-phonecat-3-final/karma-test-shim.js @@ -44,10 +44,10 @@ System.config({ map: { '@angular/core/testing': 'npm:@angular/core/bundles/core-testing.umd.js', '@angular/common/testing': 'npm:@angular/common/bundles/common-testing.umd.js', + '@angular/common/http/testing': 'npm:@angular/common/bundles/common-http-testing.umd.js', '@angular/compiler/testing': 'npm:@angular/compiler/bundles/compiler-testing.umd.js', '@angular/platform-browser/testing': 'npm:@angular/platform-browser/bundles/platform-browser-testing.umd.js', '@angular/platform-browser-dynamic/testing': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic-testing.umd.js', - '@angular/http/testing': 'npm:@angular/http/bundles/http-testing.umd.js', '@angular/router/testing': 'npm:@angular/router/bundles/router-testing.umd.js', '@angular/forms/testing': 'npm:@angular/forms/bundles/forms-testing.umd.js', }, diff --git a/aio/content/examples/upgrade-phonecat-3-final/karma.conf.js b/aio/content/examples/upgrade-phonecat-3-final/karma.conf.js index d290d6e61e..fe8a6bc8dc 100644 --- a/aio/content/examples/upgrade-phonecat-3-final/karma.conf.js +++ b/aio/content/examples/upgrade-phonecat-3-final/karma.conf.js @@ -38,6 +38,10 @@ module.exports = function(config) { { pattern: 'node_modules/rxjs/**/*.js', included: false, watched: false }, { pattern: 'node_modules/rxjs/**/*.js.map', included: false, watched: false }, + // tslib (TS helper fns such as `__extends`) + { pattern: 'node_modules/tslib/**/*.js', included: false, watched: false }, + { pattern: 'node_modules/tslib/**/*.js.map', included: false, watched: false }, + // Paths loaded via module imports: // Angular itself { pattern: 'node_modules/@angular/**/*.js', included: false, watched: false }, diff --git a/aio/content/examples/upgrade-phonecat-3-final/systemjs.config.1.js b/aio/content/examples/upgrade-phonecat-3-final/systemjs.config.1.js index a6e82c8737..abdcdfc6d9 100644 --- a/aio/content/examples/upgrade-phonecat-3-final/systemjs.config.1.js +++ b/aio/content/examples/upgrade-phonecat-3-final/systemjs.config.1.js @@ -16,10 +16,10 @@ // angular bundles '@angular/core': 'npm:@angular/core/bundles/core.umd.js', '@angular/common': 'npm:@angular/common/bundles/common.umd.js', + '@angular/common/http': 'npm:@angular/common/bundles/common-http.umd.js', '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js', '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', - '@angular/http': 'npm:@angular/http/bundles/http.umd.js', '@angular/router': 'npm:@angular/router/bundles/router.umd.js', '@angular/router/upgrade': 'npm:@angular/router/bundles/router-upgrade.umd.js', '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', diff --git a/aio/content/guide/npm-packages.md b/aio/content/guide/npm-packages.md index feb6d79056..10af26d525 100644 --- a/aio/content/guide/npm-packages.md +++ b/aio/content/guide/npm-packages.md @@ -67,7 +67,6 @@ Package name | Description **@angular/compiler** | Angular's template compiler. It understands templates and can convert them to code that makes the application run and render. Typically you don’t interact with the compiler directly; rather, you use it indirectly via `platform-browser-dynamic` when JIT compiling in the browser. For more information, see the [Ahead-of-time Compilation guide](guide/aot-compiler). [**@angular/core**](api/core) | Critical runtime parts of the framework that are needed by every application. Includes all metadata decorators, `Component`, `Directive`, dependency injection, and the component lifecycle hooks. [**@angular/forms**](api/forms) | Support for both [template-driven](guide/forms) and [reactive forms](guide/reactive-forms). For information about choosing the best forms approach for your app, see [Introduction to forms](guide/forms-overview). -[**@angular/http**](api/http) | Angular's legacy HTTP client, which was deprecated in version 5.0 in favor of [@angular/common/http](api/common/http). [**@angular/
platform‑browser**](api/platform-browser) | Everything DOM and browser related, especially the pieces that help render into the DOM. This package also includes the `bootstrapModuleFactory()` method for bootstrapping applications for production builds that pre-compile with [AOT](guide/aot-compiler). [**@angular/
platform‑browser‑dynamic**](api/platform-browser-dynamic) | Includes [providers](api/core/Provider) and methods to compile and run the app on the client using the [JIT compiler](guide/aot-compiler). [**@angular/router**](api/router) | The router module navigates among your app pages when the browser URL changes. For more information, see [Routing and Navigation](guide/router). diff --git a/aio/content/guide/testing.md b/aio/content/guide/testing.md index a900bea96e..a94fe23bd1 100644 --- a/aio/content/guide/testing.md +++ b/aio/content/guide/testing.md @@ -470,13 +470,6 @@ While the _code sample_ accompanying this guide demonstrates `HttpClientTestingM this page defers to the [Http guide](guide/http#testing-http-requests), which covers testing with the `HttpClientTestingModule` in detail. -
- -This guide's sample code also demonstrates testing of the _legacy_ `HttpModule` -in `app/model/http-hero.service.spec.ts`. - -
- ## Component Test Basics diff --git a/aio/content/guide/upgrade.md b/aio/content/guide/upgrade.md index 3ced4f715b..e3493a3fe2 100644 --- a/aio/content/guide/upgrade.md +++ b/aio/content/guide/upgrade.md @@ -1324,11 +1324,11 @@ ngResource and you're using it for two things: You can replace this implementation with an Angular service class, while keeping the controllers in AngularJS land. -In the new version, you import the Angular HTTP module and call its `Http` service instead of `ngResource`. +In the new version, you import the Angular HTTP module and call its `HttpClient` service instead of `ngResource`. -Re-open the `app.module.ts` file, import and add `HttpModule` to the `imports` array of the `AppModule`: +Re-open the `app.module.ts` file, import and add `HttpClientModule` to the `imports` array of the `AppModule`: - + Now you're ready to upgrade the Phone service itself. Replace the ngResource-based @@ -1343,7 +1343,7 @@ by the [Dependency Injection Guide](guide/dependency-injection), this is a marker decorator you need to use for classes that have no other Angular decorators but still need to have their dependencies injected. -In its constructor the class expects to get the `Http` service. It will +In its constructor the class expects to get the `HttpClient` service. It will be injected to it and it is stored as a private field. The service is then used in the two instance methods, one of which loads the list of all phones, and the other loads the details of a specified phone: diff --git a/aio/tools/example-zipper/customizer/package-json/base.json b/aio/tools/example-zipper/customizer/package-json/base.json index a31942af05..e272597f06 100644 --- a/aio/tools/example-zipper/customizer/package-json/base.json +++ b/aio/tools/example-zipper/customizer/package-json/base.json @@ -8,7 +8,6 @@ "@angular/compiler", "@angular/core", "@angular/forms", - "@angular/http", "@angular/platform-browser", "@angular/platform-browser-dynamic", "@angular/router", diff --git a/aio/tools/examples/shared/boilerplate/cli/package.json b/aio/tools/examples/shared/boilerplate/cli/package.json index 0a2e16a71e..e06993f14c 100644 --- a/aio/tools/examples/shared/boilerplate/cli/package.json +++ b/aio/tools/examples/shared/boilerplate/cli/package.json @@ -17,11 +17,10 @@ "@angular/compiler": "^7.0.0", "@angular/core": "^7.0.0", "@angular/forms": "^7.0.0", - "@angular/http": "^7.0.0", "@angular/platform-browser": "^7.0.0", "@angular/platform-browser-dynamic": "^7.0.0", "@angular/router": "^7.0.0", - "angular-in-memory-web-api": "^0.6.0", + "angular-in-memory-web-api": "^0.8.0", "core-js": "^2.5.4", "rxjs": "^6.3.0", "web-animations-js": "^2.3.1", diff --git a/aio/tools/examples/shared/boilerplate/i18n/package.json b/aio/tools/examples/shared/boilerplate/i18n/package.json index 40edfd1d78..ec04e72201 100644 --- a/aio/tools/examples/shared/boilerplate/i18n/package.json +++ b/aio/tools/examples/shared/boilerplate/i18n/package.json @@ -20,11 +20,10 @@ "@angular/compiler": "^7.0.0", "@angular/core": "^7.0.0", "@angular/forms": "^7.0.0", - "@angular/http": "^7.0.0", "@angular/platform-browser": "^7.0.0", "@angular/platform-browser-dynamic": "^7.0.0", "@angular/router": "^7.0.0", - "angular-in-memory-web-api": "^0.6.0", + "angular-in-memory-web-api": "^0.8.0", "core-js": "^2.5.4", "rxjs": "^6.3.0", "web-animations-js": "^2.3.1", diff --git a/aio/tools/examples/shared/boilerplate/service-worker/package.json b/aio/tools/examples/shared/boilerplate/service-worker/package.json index 7de5334909..1b1f5756f2 100644 --- a/aio/tools/examples/shared/boilerplate/service-worker/package.json +++ b/aio/tools/examples/shared/boilerplate/service-worker/package.json @@ -17,12 +17,11 @@ "@angular/compiler": "^7.0.0", "@angular/core": "^7.0.0", "@angular/forms": "^7.0.0", - "@angular/http": "^7.0.0", "@angular/platform-browser": "^7.0.0", "@angular/platform-browser-dynamic": "^7.0.0", "@angular/router": "^7.0.0", "@angular/service-worker": "^7.0.0", - "angular-in-memory-web-api": "^0.6.0", + "angular-in-memory-web-api": "^0.8.0", "core-js": "^2.5.4", "rxjs": "^6.3.0", "web-animations-js": "^2.3.1", diff --git a/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.js b/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.js index 43ccdcdfa9..5999428991 100644 --- a/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.js +++ b/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.js @@ -23,7 +23,6 @@ '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', '@angular/platform-browser/animations': 'npm:@angular/platform-browser/bundles/platform-browser-animations.umd.js', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', - '@angular/http': 'npm:@angular/http/bundles/http.umd.js', '@angular/router': 'npm:@angular/router/bundles/router.umd.js', '@angular/router/upgrade': 'npm:@angular/router/bundles/router-upgrade.umd.js', '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', diff --git a/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.web.build.js b/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.web.build.js index 27547d8dbe..5bc80cdf45 100644 --- a/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.web.build.js +++ b/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.web.build.js @@ -54,7 +54,6 @@ can be found in the LICENSE file at http://angular.io/license '@angular/platform-browser': 'ng:platform-browser-builds/master/bundles/platform-browser.umd.js', '@angular/platform-browser/animations': 'ng:animations-builds/master/bundles/platform-browser-animations.umd.js', '@angular/platform-browser-dynamic': 'ng:platform-browser-dynamic-builds/master/bundles/platform-browser-dynamic.umd.js', - '@angular/http': 'ng:http-builds/master/bundles/http.umd.js', '@angular/router': 'ng:router-builds/master/bundles/router.umd.js', '@angular/router/upgrade': 'ng:router-builds/master/bundles/router-upgrade.umd.js', '@angular/forms': 'ng:forms-builds/master/bundles/forms.umd.js', @@ -68,7 +67,6 @@ can be found in the LICENSE file at http://angular.io/license '@angular/compiler/testing': 'ng:compiler-builds/master/bundles/compiler-testing.umd.js', '@angular/platform-browser/testing': 'ng:platform-browser-builds/master/bundles/platform-browser-testing.umd.js', '@angular/platform-browser-dynamic/testing': 'ng:platform-browser-dynamic-builds/master/bundles/platform-browser-dynamic-testing.umd.js', - '@angular/http/testing': 'ng:http-builds/master/bundles/http-testing.umd.js', '@angular/router/testing': 'ng:router-builds/master/bundles/router-testing.umd.js', '@angular/forms/testing': 'ng:forms-builds/master/bundles/forms-testing.umd.js', diff --git a/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.web.js b/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.web.js index d97df093d3..e9b97f4928 100644 --- a/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.web.js +++ b/aio/tools/examples/shared/boilerplate/systemjs/src/systemjs.config.web.js @@ -50,7 +50,6 @@ can be found in the LICENSE file at http://angular.io/license '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js', '@angular/platform-browser/animations': 'npm:@angular/platform-browser/bundles/platform-browser-animations.umd.js', '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js', - '@angular/http': 'npm:@angular/http/bundles/http.umd.js', '@angular/router': 'npm:@angular/router/bundles/router.umd.js', '@angular/router/upgrade': 'npm:@angular/router/bundles/router-upgrade.umd.js', '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js', diff --git a/aio/tools/examples/shared/boilerplate/universal/package.json b/aio/tools/examples/shared/boilerplate/universal/package.json index 9ad06b2fc5..243c274fd0 100644 --- a/aio/tools/examples/shared/boilerplate/universal/package.json +++ b/aio/tools/examples/shared/boilerplate/universal/package.json @@ -28,7 +28,7 @@ "@nguniversal/common": "^7.0.0", "@nguniversal/express-engine": "^7.0.0", "@nguniversal/module-map-ngfactory-loader": "^7.0.0", - "angular-in-memory-web-api": "^0.6.0", + "angular-in-memory-web-api": "^0.8.0", "core-js": "^2.5.4", "rxjs": "^6.3.0", "web-animations-js": "^2.3.1", diff --git a/aio/tools/examples/shared/yarn.lock b/aio/tools/examples/shared/yarn.lock index 6bed0fdac0..97e3b4963a 100644 --- a/aio/tools/examples/shared/yarn.lock +++ b/aio/tools/examples/shared/yarn.lock @@ -10,12 +10,12 @@ "@angular-devkit/core" "7.1.4" rxjs "6.3.3" -"@angular-devkit/architect@0.13.1": - version "0.13.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.13.1.tgz#39597ce94f72d89bdd89ee567cb937cff4c13b98" - integrity sha512-QDmIbqde75ZZSEFbw6Q6kQWq4cY6C7D67yujXw6XTyubDNAs1tyXJyxTIB8vjSlEKwRizTTDd/B0ZXVcke3Mvw== +"@angular-devkit/architect@0.13.4": + version "0.13.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.13.4.tgz#f5db62f028e3c0971db5719be9c17a78fd8a67a2" + integrity sha512-wJF8oz8MurtpFi0ik42bkI2F5gEnuOe79KHPO1i3SYfdhEp5NY8igVKZ6chB/eq4Ml50aHxas8Hh9ke12K+Pxw== dependencies: - "@angular-devkit/core" "7.3.1" + "@angular-devkit/core" "7.3.4" rxjs "6.3.3" "@angular-devkit/build-angular@^0.11.0": @@ -102,42 +102,42 @@ rxjs "6.3.3" source-map "0.7.3" -"@angular-devkit/core@7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.1.tgz#d92f6545796579cabdcfc29579a2c977f7a96c6c" - integrity sha512-56XDWWfIzOAkEk69lBLgmCYybPUA4yjunhmMlCk7vVdb7gbQUyzNjFD04Uj0GjlejatAQ5F76tRwygD9C+3RXQ== +"@angular-devkit/core@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.4.tgz#fae0521652c7430237025f117531ca3262ef8335" + integrity sha512-MBfen51iOBKfK4tlg5KwmPxePsF1QoFNUMGLuvUUwPkteonrGcupX1Q7NWTpf+HA+i08mOnZGuepeuQkD12IQw== dependencies: - ajv "6.7.0" + ajv "6.9.1" chokidar "2.0.4" fast-json-stable-stringify "2.0.0" rxjs "6.3.3" source-map "0.7.3" -"@angular-devkit/schematics@7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.1.tgz#7dc704005b966ea6c1ee62f380120183bb76eee6" - integrity sha512-cd7usiasfSgw75INz72/VssrLr9tiVRYfo1TEdvr9ww0GuQbuQpB33xbV8W135eAV8+wzQ3Ce8ohaDHibvj6Yg== +"@angular-devkit/schematics@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.4.tgz#918c9349835f3a4c9a7128ebcda0738b623fc89e" + integrity sha512-BLI4MDHmpzw+snu/2Dw1nMmfJ0VAARTbU6DrmzXyl2Se45+iE/tdRy4yNx3IfHhyoCrVZ15R0y9CXeEsLftlIg== dependencies: - "@angular-devkit/core" "7.3.1" + "@angular-devkit/core" "7.3.4" rxjs "6.3.3" "@angular/animations@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.2.4.tgz#4d0a0b9f14d6bfc38ca773613b61729d020435e6" - integrity sha512-Wx6cqU6koFOASlyl4aCygtbtROoehU6OKwV2EZTkfzHx6Eu/QyTiSa5kyoApVM5LMmCNeb8SxJMSAnKXztNl0A== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.2.7.tgz#14aa9b4006dbffb08bd705842cdcc1d0b502ae90" + integrity sha512-eU/wSkBmukZXCCe/epUl02xsKPauF+deMbncxBE+w/NmmWjJ77Q09iZAcgzM92RVXj2LsVYQXsNEBGT3X0hRZw== dependencies: tslib "^1.9.0" "@angular/cli@^7.1.0": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.3.1.tgz#a18acdec84deb03a1fae79cae415bbc8f9c87ffa" - integrity sha512-8EvXYRhTqTaTk5PKv7VZxIWJiyG51R9RC9gtpRFx4bbnurqBHdEUxGMmaRsGT8QDbfvVsWnuakE0eeW1CrfZAQ== + version "7.3.4" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.3.4.tgz#6bd2214c71391bdd07de806a2ca2777da2e3fd2a" + integrity sha512-uGL8xiQf+GvuJvqvMUu/XHcijbq9ocbX487LO2PgJ29etHfI7dC0toJbQ8ob+HnF9e1qwMe+uu45OU4C2p+a1A== dependencies: - "@angular-devkit/architect" "0.13.1" - "@angular-devkit/core" "7.3.1" - "@angular-devkit/schematics" "7.3.1" - "@schematics/angular" "7.3.1" - "@schematics/update" "0.13.1" + "@angular-devkit/architect" "0.13.4" + "@angular-devkit/core" "7.3.4" + "@angular-devkit/schematics" "7.3.4" + "@schematics/angular" "7.3.4" + "@schematics/update" "0.13.4" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" inquirer "6.2.1" @@ -148,19 +148,19 @@ symbol-observable "1.2.0" "@angular/common@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.2.4.tgz#9f1ed530e5dc7613a263e015c203ead390d50336" - integrity sha512-3/i8RtnLTx/90gJHk5maE8zwsSiHgHvLItaa0qVfNlWiU0eCId/PL6TgDkut5vN9SQYL0oxhxFaVd35HmwsmuQ== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.2.7.tgz#d0078a1cabc5e5c34ceb7691c2a31440ce7630fb" + integrity sha512-U1l2CIcmpTAJMWcyTXI9qt1E8CxwKNW1vr6XWZo4X5ziCIzf7RvClzK7Ci5KZKkoPJrJqBJu661Q75Yt22dJsg== dependencies: tslib "^1.9.0" "@angular/compiler-cli@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.2.4.tgz#3de23fd5f558a859a444c58dab18f2981c9c2937" - integrity sha512-UhLosSeuwFIfaGqGcYOh9WSOuzEpeuhIRAOt81MeqOQEqkoreUjfxrQq8XWNkdqsPZHtiptF5ZwXlMBxlj9jJg== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.2.7.tgz#01adbb176075d2d02959a92053409dd0af343e2f" + integrity sha512-UPWROJzBLejgNf+aqgEUXYts8UiFOl2IavDhS/olA9irszv2lNFj9Yqr8OKdy0jK/lKaipZog3VZEx8g5dNeBA== dependencies: canonical-path "1.0.0" - chokidar "^1.4.2" + chokidar "^2.1.1" convert-source-map "^1.5.1" dependency-graph "^0.7.2" magic-string "^0.25.0" @@ -172,165 +172,175 @@ yargs "9.0.1" "@angular/compiler@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.2.4.tgz#133eb97fc3169ec9ff84f134eb9e3497fa37537e" - integrity sha512-+zyMzPCL45ePEV9nrnYJvhAVgp2Y19bDaq0f0YdZAqAjgDqHzXGGR6wX8GueyJWmUYWx5vwK6Apla4HwDrYA1w== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.2.7.tgz#3f3deb851634db871e92acde2f1ee56362d8c47f" + integrity sha512-e61YVxW5x4w+X4yjGaptYoJIja7HwH0+8FFEaH6VuPl/DrK8wP4HDMhLo4NzdgeZKLR2jBIQSqLmoM8W7UXcqw== dependencies: tslib "^1.9.0" "@angular/core@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.2.4.tgz#a6c84940c8edcfa37158f666a1f99c6e4a97bf95" - integrity sha512-kfAxhIxl89PmB7y81FR/RAv0yWRFcEYxEnTwV+o8jKGfemAXtQ0g/Vh+lJR0SD/TBgFilMxotN1mhwH4A8GShw== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.2.7.tgz#4311028181a98aa844572ea4b6cb9e87fc58d9ba" + integrity sha512-E7qjMQdS77SbRROKu13VsfL+MJN52eTlrU0SzEAFGUOgdvbmDYJOaEwjqrouKpYZ0pul8KOoalvlPB7oVflC7A== dependencies: tslib "^1.9.0" "@angular/elements@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-7.2.4.tgz#4b77cb0f815deb3fd83d8a3c9a807bcca11c2373" - integrity sha512-5V4kFmpncQTJEVdREaSBb4DVjZz88eLQBjzzvEUM3r7szhbQ1DYuubG7Sj2a1iIYSI/HTkPPvX57rQk3vq6AEw== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-7.2.7.tgz#cd998043b8c64a4c3cd21eac3c13d4d83fc6b3a0" + integrity sha512-GFpshIqNnwOOqLxXu9+NOLd2AU77rO0OZggsmaXo0XENG3izkLlbw0j9U4mdYsRqQQUzeiP2PpN63duDtYJjXg== dependencies: tslib "^1.9.0" "@angular/forms@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.2.4.tgz#be89cf83ad16fa3c813c12e4cff85da5409cf7a0" - integrity sha512-DAtOrdlTRsgvmZrsvczCAkY8dhTwZb5DXBmPuSXh0UR9lvEiCgNHGbwEiIiIkAHpw1wSeXZrq0qyy/oJRvf18g== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.2.7.tgz#bdffad0070e01bd0e1f6f7045909cc9aa33e59f0" + integrity sha512-2gBs+BG2cMPsHq9JVEzmu2Ev539zjfHmr6cna2W38KLXeGbNf42rbbMUXpYD8cndY0QTYcnwfMpRNIl9zKRZnw== dependencies: tslib "^1.9.0" "@angular/http@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.2.4.tgz#fc151ac15c8c7542cb7242a430ad2319655c2ff5" - integrity sha512-kazJREm7MtSCYbE+9zU/CcUXI5Csu53PooeQlAp80/TOHqry6fVKIMHCI892Db9ScY2ds0SzbyTmrxEQo7PP1A== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.2.7.tgz#f76789b83094eda8952cd08fd13ad5f6224fcd00" + integrity sha512-HTHYF3qR4S55A+9pyThSOy7++7Makp+klbZTNmpwwJj8yL3qgy9PyDXtf+xhZcUEd8xfXmnz8s4hZr0O9GUy1A== dependencies: tslib "^1.9.0" "@angular/language-service@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.2.4.tgz#db72460040b070410cbff678410c142f4d682af8" - integrity sha512-A9Rud/27hHMSUUjpgn57nVeLsoYgdvFwJhtlZA/oCuSpmlD+LqqBsEpPhivwn++u44+DSrFXsic29jlFnsBotw== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.2.7.tgz#c92d7fde437d6bddd2a4fe197f9c06005f3a5c53" + integrity sha512-d3iCBpOfgLNSGMrtqZvN6NHZIEnKD2MV8Hz4WsRLU4WY0RbshZj5dqx2nO3YRT2tACpAvhWBQoYvtLpTCPzsMA== "@angular/platform-browser-dynamic@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.4.tgz#24dce1bb0d9dab541b3b1b3eda3084a732f11b64" - integrity sha512-J/xWlmaYOPUoCHZ5TiIRiyYa4uRMtCz3aGdBfY8k/NWtNo8SCYaS3aut7Sk4RS5rK8aAVi+aYFlY5YOrlW+Hbg== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.7.tgz#22db038715c5b17464627a89898a63ece149c840" + integrity sha512-3nlcwCZOzlKw/4CMJ4zy1JEVy8Ky4KyLRRePLledOMdsGbuDIoq/kyAnBzg295Xe9ovBxv8cmuSkShci+s/x8g== dependencies: tslib "^1.9.0" "@angular/platform-browser@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.2.4.tgz#2cf5305878d0620d6b8c02eff00ac3ca8dbc5970" - integrity sha512-Klt8aKR5SP9bqfMfpSY5vQOY7AQEs8JGuZOk5Bfc2dUtYT2IEIvK2IqO8v2rcFRVO13HOPUxl328efyHqLgI7g== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.2.7.tgz#a1a14181354e07c19d38218a7a4af6ea4defa569" + integrity sha512-9C3ffZs0ZUw+dYg1oJKiONf64UKTdAzIOaTQXTrVrCa3oN7Jb2tUfmpenmB+ATRxwhL2n7Yi725YWwxY2FwqvQ== dependencies: tslib "^1.9.0" "@angular/platform-server@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-7.2.4.tgz#276803cc7cac8da54d1ad2f05e052e4f8af64a85" - integrity sha512-3KbLHw7xMbkxun93HeYX8pSiPmFWim3ftvKbfPlB01fjhdZvhHpf39Dn4T7iyT1vrZMccXL87psv4/lJkTf04A== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-7.2.7.tgz#c1383edeeff2e7329e71659230fe16b9088ced5d" + integrity sha512-9KtfnUF3IhPk6riVaFhwn1iPNEPO8wjOLSmI4RltMDXha5xGUC4eMBcT2MhfPsB1+4m6D4D7pBmv8uhn4v/J2g== dependencies: domino "^2.1.0" tslib "^1.9.0" xhr2 "^0.1.4" "@angular/router@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.2.4.tgz#83f1997c2a4e6acda93b991b8d7f3dad2b3f91f0" - integrity sha512-T8Uqf2H1SV1MQI38WwYJ4aa+4NNnvlp2Tp/rkfg6tKcp/cLkKqE6OOfiy9lmW+i/624v8tMgYoBMOUNBjAG23g== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.2.7.tgz#66705f6b6f4546adae1dc58f5701b9d7a6b2723c" + integrity sha512-59+M8+IH7V2NPPqWw2mwdg+kh/jfwQcXE0tB8iZ5V2ldACPucY/Td6qiT5H6t7EkELtvkKJwS6vKFV22qdRp3w== dependencies: tslib "^1.9.0" "@angular/service-worker@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.2.4.tgz#d16d6d08c0d5c29c93e9f80cddc4013c9b8859fb" - integrity sha512-IYsHshkgCYYmWLwtP7wwk8tfwphE4IJrkUitEu+ST6x+er/K9LyLo09WQeEZHIwDaPm9icoqc3TJJdXI46mrmg== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.2.7.tgz#718fe4b8b6ed80650c7e14303781b8f6cedac986" + integrity sha512-oKPHZWXQnKR6gX1PvhBlk4TC6mSl7EgNd4MaZu/FwOuc5f+zo4oZPTAbzBYqkhbaqpvRyNylolTyJX5QeV9iPg== dependencies: tslib "^1.9.0" "@angular/upgrade@^7.1.0": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-7.2.4.tgz#49ecce8f8a6c290599179d5d96d19812a496145a" - integrity sha512-sRDXl2Uy9fZrMROfe7eNZDWwb1fgoWYzJ8VrviUCRakTJf3ZQLuEf4ToTc3KY/KGxEubA4jiuI8LXbyTTmRMQw== + version "7.2.7" + resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-7.2.7.tgz#c2a804c12afe987f3abb9ef949f5cc640d6828f6" + integrity sha512-syUlleizrsFjSd3ZGgvZOOJmbDu6FJ4ZXpXeFnIY2InhO/xswgYFMiPYiwtraMFg458E/ZXoz41SToNgcYEfpA== dependencies: tslib "^1.9.0" "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== dependencies: "@babel/highlight" "^7.0.0" -"@babel/generator@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" +"@babel/generator@^7.0.0", "@babel/generator@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" + integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.3.4" jsesc "^2.5.1" - lodash "^4.17.10" + lodash "^4.17.11" source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-function-name@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0.tgz#a68cc8d04420ccc663dd258f9cc41b8261efa2d4" +"@babel/helper-function-name@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" + integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== dependencies: "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.0.0" + "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== dependencies: "@babel/types" "^7.0.0" "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== dependencies: "@babel/types" "^7.0.0" "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0.tgz#697655183394facffb063437ddf52c0277698775" +"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" + integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== -"@babel/template@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0.tgz#c2bc9870405959c89a9c814376a2ecb247838c80" +"@babel/template@^7.0.0", "@babel/template@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" "@babel/traverse@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0.tgz#b1fe9b6567fdf3ab542cfad6f3b31f854d799a61" + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" + integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.0.0" - "@babel/helper-function-name" "^7.0.0" + "@babel/generator" "^7.3.4" + "@babel/helper-function-name" "^7.1.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.0.0" - "@babel/types" "^7.0.0" - debug "^3.1.0" + "@babel/parser" "^7.3.4" + "@babel/types" "^7.3.4" + debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.10" + lodash "^4.17.11" -"@babel/types@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" +"@babel/types@^7.0.0", "@babel/types@^7.2.2", "@babel/types@^7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" + integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== dependencies: esutils "^2.0.2" - lodash "^4.17.10" + lodash "^4.17.11" to-fast-properties "^2.0.0" "@ngtools/webpack@7.1.4": @@ -359,22 +369,22 @@ resolved "https://registry.yarnpkg.com/@nguniversal/module-map-ngfactory-loader/-/module-map-ngfactory-loader-7.1.0.tgz#70ea905c1b32c2edc484cb77aa7a3f3208069966" integrity sha512-GYfb24OLJKBY58CgUsIsGgci5ceZAt4+GrVKh7RZRIHtZ/bjdGsvpIbfE9udqsnSowxIxHA5KzYHbC1x6AAB0A== -"@schematics/angular@7.3.1": - version "7.3.1" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.1.tgz#6fcd7004210fa9305310c3109c084df5c5521776" - integrity sha512-0Ne8APPlTAjKg5CSZqluwCuW/5yPjr3ALCWzqwPxN0suE745usThtasBmqrjw0RMIt8nRqRgtg54Z7lCPO9ZFg== +"@schematics/angular@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.4.tgz#ba36efdd5474b793eb693d47772f998e6bd6043e" + integrity sha512-Bb5DZQ8MeP8yhxPe6nVqyQ7sGVNwUx6nXPlrQV45ZycD3nJlqsuxr2DE75HFpn5oU+vlkq9J/Sys4WLJ4E/OMw== dependencies: - "@angular-devkit/core" "7.3.1" - "@angular-devkit/schematics" "7.3.1" + "@angular-devkit/core" "7.3.4" + "@angular-devkit/schematics" "7.3.4" typescript "3.2.4" -"@schematics/update@0.13.1": - version "0.13.1" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.13.1.tgz#481475aee18b4a9472a06512b2e4d6429af68231" - integrity sha512-EHOqolT/d/jRGuVTCUESLpk8JNpuaPlsVHfeK7Kdp/t0wSEnmtOelZX4+leS25lGXDaDUF3138ntjrZR4n6bGw== +"@schematics/update@0.13.4": + version "0.13.4" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.13.4.tgz#a6e3b2a546940e647beef9d9e5e2e73e2f16f53d" + integrity sha512-YarSCCBSVPVG/MyN5H/FliRwaIDoeercy5Nip+NWZJsDyvtsAekO9s6QwizSvAr3541MmSQFeQICsjyM2dl3Bg== dependencies: - "@angular-devkit/core" "7.3.1" - "@angular-devkit/schematics" "7.3.1" + "@angular-devkit/core" "7.3.4" + "@angular-devkit/schematics" "7.3.4" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" pacote "9.4.0" @@ -385,101 +395,135 @@ "@types/angular-animate@^1.5.10": version "1.5.10" resolved "https://registry.yarnpkg.com/@types/angular-animate/-/angular-animate-1.5.10.tgz#b94b45358c61163f1478768e8b081c76439c515f" + integrity sha512-MnYYvTHAPUbtT6gqwrnl6k3a03A5BlNz1nVlwVGxyS+MeWCX4DC14SJ/pgJUa8wj+J04wZ2prMxFsOfp6cyjjQ== dependencies: "@types/angular" "*" "@types/angular-mocks@^1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@types/angular-mocks/-/angular-mocks-1.6.0.tgz#bd32f55b678c239880d2d0d9a3a79b5cad45547e" + version "1.7.0" + resolved "https://registry.yarnpkg.com/@types/angular-mocks/-/angular-mocks-1.7.0.tgz#310d999a3c47c10ecd8eef466b5861df84799429" + integrity sha512-MeT5vxWBx4Ny5/sNZJjpZdv4K2KGwqQYiRQQZctan1TTaNyiVlFRYbcmheolhM4KKbTWmoxTVeuvGzniTDg1kw== dependencies: "@types/angular" "*" "@types/angular-resource@^1.5.14": - version "1.5.14" - resolved "https://registry.yarnpkg.com/@types/angular-resource/-/angular-resource-1.5.14.tgz#902f34e8c98f708ae99493c6d416b39b4a22d9fe" + version "1.5.15" + resolved "https://registry.yarnpkg.com/@types/angular-resource/-/angular-resource-1.5.15.tgz#5afad92af99b74884ca788fc48d47ebe4be32413" + integrity sha512-9YZwDxh+YMYtVvgEtW8oVQXKDJf0QcLrvR5hS9NMi/faDm2V+87TuHBtQBMPKEgMo0SyyVxKzhg8gsscNVMFUw== dependencies: "@types/angular" "*" "@types/angular-route@^1.3.5": - version "1.3.5" - resolved "https://registry.yarnpkg.com/@types/angular-route/-/angular-route-1.3.5.tgz#78b8e0b069d5efe55ec7072461f4e2f6ae20767b" + version "1.7.0" + resolved "https://registry.yarnpkg.com/@types/angular-route/-/angular-route-1.7.0.tgz#ba12d09df1aac3c88e3684500001daedfc97fb69" + integrity sha512-gctkSXUY7hDwFeW8il7f3+sdMmds0JaMnHvrZmqX79DHXf2D72+SHxJHIt5i6+0BrhoqdWdpgziSxuKnkAUAQw== dependencies: "@types/angular" "*" "@types/angular@*", "@types/angular@^1.6.47": - version "1.6.47" - resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.47.tgz#f7a31279a02c0892ed9aa76aae2da1b17791bacd" + version "1.6.54" + resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.54.tgz#f9d5a03e4da7b021a6dabe5d63e899ed4567a5bd" + integrity sha512-xA1FuozWXeRQ7FClUbvk8ePL+dydBeDoCWRPFTHU5+8uvVtIIfLGiHA8CMkwsbddFCYnTDVbLxG85a/HBx7LtA== "@types/body-parser@*": - version "1.16.7" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.16.7.tgz#455fc23fd0ddaaeda6cd6cbb653558276e5920fa" + version "1.17.0" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" + integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.32" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" + integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== dependencies: - "@types/express" "*" "@types/node" "*" "@types/express-serve-static-core@*": - version "4.0.55" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.55.tgz#f53868838a955f98b380819ec9134f5df7d9482f" + version "4.16.1" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz#35df7b302299a4ab138a643617bd44078e74d44e" + integrity sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA== dependencies: "@types/node" "*" + "@types/range-parser" "*" -"@types/express@*", "@types/express@^4.0.35": - version "4.0.39" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.39.tgz#1441f21d52b33be8d4fa8a865c15a6a91cd0fa09" +"@types/express@^4.0.35": + version "4.16.1" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.1.tgz#d756bd1a85c34d87eaf44c888bad27ba8a4b7cf0" + integrity sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg== dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "*" "@types/serve-static" "*" "@types/jasmine@*": - version "2.6.2" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.6.2.tgz#6e6d4cb183cd55c7a1ad6270bced10fdd5367a3c" + version "3.3.9" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.3.9.tgz#ee886a9113db567e722a8a0c37f0e6283f2cefa3" + integrity sha512-vw3VyFPa9mlba6NZPBZC3q2Zrnkgy5xuCVI43/tTLX6umdYrYvcFtQUKi2zH3PjFZQ9XCxNM/NMrM9uk8TPOzg== "@types/jasmine@~2.8.8": - version "2.8.8" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.8.tgz#bf53a7d193ea8b03867a38bfdb4fbb0e0bf066c9" + version "2.8.16" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.16.tgz#a6cb24b1149d65293bd616923500014838e14e7d" + integrity sha512-056oRlBBp7MDzr+HoU5su099s/s7wjZ3KcHxLfv+Byqb9MwdLUvsfLgw1VS97hsh3ddxSPyQu+olHMnoVTUY6g== "@types/jasminewd2@^2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.4.tgz#12422ee719f372d30c3cc7d99cc72dadba6ace01" + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.6.tgz#2f57a8d9875a6c9ef328a14bd070ba14a055ac39" + integrity sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw== dependencies: "@types/jasmine" "*" "@types/jquery@^3.3.4": - version "3.3.4" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.4.tgz#f1850fb9a70041a14ace4f81a7ed782db8548317" + version "3.3.29" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.29.tgz#680a2219ce3c9250483722fccf5570d1e2d08abd" + integrity sha512-FhJvBninYD36v3k6c+bVk1DSZwh7B5Dpb/Pyk3HKVsiohn0nhbefZZ+3JXbWQhFyt0MxSl2jRDdGQPHeOHFXrQ== + dependencies: + "@types/sizzle" "*" "@types/mime@*": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" + integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== "@types/node@*": - version "8.0.47" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.47.tgz#968e596f91acd59069054558a00708c445ca30c2" - -"@types/node@^6.0.46": - version "6.0.90" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.90.tgz#0ed74833fa1b73dcdb9409dcb1c97ec0a8b13b02" + version "11.10.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-11.10.4.tgz#3f5fc4f0f322805f009e00ab35a2ff3d6b778e42" + integrity sha512-wa09itaLE8L705aXd8F80jnFpxz3Y1/KRHfKsYL2bPc0XF+wEWu8sR9n5bmeu8Ba1N9z2GRNzm/YdHcghLkLKg== "@types/node@~8.9.4": version "8.9.5" - resolved "http://registry.npmjs.org/@types/node/-/node-8.9.5.tgz#162b864bc70be077e6db212b322754917929e976" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.9.5.tgz#162b864bc70be077e6db212b322754917929e976" + integrity sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ== "@types/q@^0.0.32": version "0.0.32" resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" + integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU= + +"@types/range-parser@*": + version "1.2.3" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" + integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== "@types/selenium-webdriver@^3.0.0": - version "3.0.10" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.10.tgz#e98cc6f05b4b436277671c784ee2f9d05a634f9b" + version "3.0.15" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.15.tgz#024c24051c3798e9a0cf5cceb1c893140df1bc31" + integrity sha512-5nh8/K2u9p4bk95GGCJB7KBvewaB0TUziZ9DTr+mR2I6RoO4OJVqx7rxK83hs2J1tomwtCGkhiW+Dy8EUnfB+Q== "@types/serve-static@*": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.0.tgz#2ef359d8d5982bc011a7a8fa36016e629e8b7635" + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" + integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== dependencies: "@types/express-serve-static-core" "*" "@types/mime" "*" +"@types/sizzle@*": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" + integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== + "@webassemblyjs/ast@1.7.10": version "1.7.10" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.10.tgz#0cfc61d61286240b72fc522cb755613699eea40a" @@ -626,10 +670,12 @@ "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" + integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== "@yarnpkg/lockfile@1.1.0": version "1.1.0" @@ -647,28 +693,17 @@ JSONStream@^1.3.4: abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= -accepts@1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" - dependencies: - mime-types "~2.1.11" - negotiator "0.6.1" - -accepts@~1.3.3, accepts@~1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" - dependencies: - mime-types "~2.1.16" - negotiator "0.6.1" - -accepts@~1.3.5: +accepts@~1.3.4, accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" + integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: mime-types "~2.1.18" negotiator "0.6.1" @@ -676,32 +711,29 @@ accepts@~1.3.5: acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" + integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== dependencies: acorn "^5.0.0" -acorn@^5.0.0, acorn@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" +acorn@^5.0.0, acorn@^5.2.1, acorn@^5.6.2: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== -acorn@^5.6.2: - version "5.7.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5" - -adm-zip@^0.4.7: - version "0.4.7" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" - -after@0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" +adm-zip@^0.4.9: + version "0.4.13" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a" + integrity sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw== after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" + integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" + integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: es6-promisify "^5.0.0" @@ -713,69 +745,59 @@ agentkeepalive@^3.4.1: humanize-ms "^1.2.1" ajv-errors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== ajv-keywords@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" + version "3.4.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" + integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== ajv@6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" + integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@6.7.0: - version "6.7.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" - integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== +ajv@6.9.1: + version "6.9.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" + integrity sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ajv@^5.0.0, ajv@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" - dependencies: - co "^4.6.0" - fast-deep-equal "^1.0.0" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - -ajv@^5.3.0: +ajv@^5.0.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.4.0.tgz#d3aff78e9277549771daf0164cff48482b754fc6" +ajv@^6.1.0, ajv@^6.5.5: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== dependencies: - fast-deep-equal "^1.0.0" + fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.3.0" - uri-js "^3.0.2" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" @@ -784,6 +806,7 @@ align-text@^0.1.1, align-text@^0.1.3: amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= "angular-in-memory-web-api@github:brandonroberts/in-memory-web-api-bazel#50a34d8": version "0.8.0" @@ -792,64 +815,51 @@ amdefine@>=0.0.4: tslib "^1.9.0" ansi-colors@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.1.0.tgz#dcfaacc90ef9187de413ec3ef8d5eb981a98808f" + version "3.2.4" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" + integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - -ansi-regex@^0.2.0, ansi-regex@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== -ansi-styles@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -ansi-styles@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" - dependencies: - color-convert "^1.9.0" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" @@ -857,161 +867,188 @@ anymatch@^2.0.0: append-transform@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" + integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== dependencies: default-require-extensions "^2.0.0" aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + version "1.1.5" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" + integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== dependencies: delegates "^1.0.0" readable-stream "^2.0.6" argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-flatten@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" + integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - -arraybuffer.slice@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" + integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -arrify@^1.0.0, arrify@^1.0.1: +arrify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^4.0.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" + version "4.10.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" + integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + version "0.2.4" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== + dependencies: + safer-buffer "~2.1.0" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" + integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= dependencies: util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= async-each-series@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" + integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI= -async-each@^1.0.0: +async-each@^1.0.0, async-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" + integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7" + integrity sha1-rDYTsdqb7RtHUQu0ZRuJMeRxRsc= -async@1.5.2, async@1.x, async@^1.4.0, async@^1.5.2: +async@1.5.2, async@1.x, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.5.0, async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" + version "2.6.2" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" + integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== dependencies: - lodash "^4.17.10" + lodash "^4.17.11" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" +atob@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@9.3.1: version "9.3.1" @@ -1025,33 +1062,37 @@ autoprefixer@9.3.1: postcss "^7.0.5" postcss-value-parser "^3.3.1" -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - -aws4@^1.2.1, aws4@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" + integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== + +axios@0.17.1: + version "0.17.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d" + integrity sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0= + dependencies: + follow-redirects "^1.2.5" + is-buffer "^1.1.5" babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" js-tokens "^3.0.2" babel-generator@^6.18.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -1059,18 +1100,20 @@ babel-generator@^6.18.0: detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.17.4" - source-map "^0.5.6" + source-map "^0.5.7" trim-right "^1.0.1" babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -1078,6 +1121,7 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.16.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -1088,6 +1132,7 @@ babel-template@^6.16.0: babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -1102,6 +1147,7 @@ babel-traverse@^6.18.0, babel-traverse@^6.26.0: babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -1111,34 +1157,37 @@ babel-types@^6.18.0, babel-types@^6.26.0: babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" + integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" + integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= base64-js@^1.0.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" - -base64id@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" + version "1.3.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" + integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" + integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1148,55 +1197,60 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -batch@0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" - batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= dependencies: tweetnacl "^0.14.3" better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" + integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= dependencies: callsite "1.0.0" big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" + integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" + version "1.13.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" + integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== -blob@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" +blob@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" + integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" blocking-proxy@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" + integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA== dependencies: minimist "^1.2.0" -bluebird@^3.3.0, bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - -bluebird@^3.5.3: +bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== @@ -1204,25 +1258,28 @@ bluebird@^3.5.3: bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -body-parser@1.18.2, body-parser@^1.16.1: - version "1.18.2" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" +body-parser@1.18.3, body-parser@^1.16.1: + version "1.18.3" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" + integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= dependencies: bytes "3.0.0" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.1" - http-errors "~1.6.2" - iconv-lite "0.4.19" + depd "~1.1.2" + http-errors "~1.6.3" + iconv-lite "0.4.23" on-finished "~2.3.0" - qs "6.5.1" - raw-body "2.3.2" - type-is "~1.6.15" + qs "6.5.2" + raw-body "2.3.3" + type-is "~1.6.16" bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= dependencies: array-flatten "^2.1.0" deep-equal "^1.0.1" @@ -1231,27 +1288,10 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -boom@4.x.x: - version "4.3.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" - dependencies: - hoek "4.x.x" - -boom@5.x.x: - version "5.2.0" - resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" - dependencies: - hoek "4.x.x" - brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1259,36 +1299,23 @@ brace-expansion@^1.1.7: braces@^0.1.2: version "0.1.5" resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" + integrity sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY= dependencies: expand-range "^0.1.0" braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - define-property "^1.0.0" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^2.3.1: +braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1304,65 +1331,77 @@ braces@^2.3.1: brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-resolve@^1.11.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" + version "1.11.3" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" + integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== dependencies: resolve "1.1.7" -browser-sync-client@2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.5.1.tgz#ec1ad69a49c2e2d4b645b18b1c06c29b3d9af8eb" +browser-sync-client@^2.26.2: + version "2.26.2" + resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.26.2.tgz#dd0070c80bdc6d9021e89f7837ee70ed0a8acf91" + integrity sha512-FEuVJD41fI24HJ30XOT2RyF5WcnEtdJhhTqeyDlnMk/8Ox9MZw109rvk9pdfRWye4soZLe+xcAo9tHSMxvgAdw== dependencies: - etag "^1.7.0" - fresh "^0.3.0" + etag "1.8.1" + fresh "0.5.2" + mitt "^1.1.3" + rxjs "^5.5.6" -browser-sync-ui@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-0.6.3.tgz#640a537c180689303d5be92bc476b9ebc441c0bc" +browser-sync-ui@^2.26.2: + version "2.26.2" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.26.2.tgz#a1d8e107cfed5849d77e3bbd84ae5d566beb4ea0" + integrity sha512-LF7GMWo8ELOE0eAlxuRCfnGQT1ZxKP9flCfGgZdXFc6BwmoqaJHlYe7MmVvykKkXjolRXTz8ztXAKGVqNwJ3EQ== dependencies: async-each-series "0.1.1" - connect-history-api-fallback "^1.1.0" - immutable "^3.7.6" + connect-history-api-fallback "^1" + immutable "^3" server-destroy "1.0.1" + socket.io-client "^2.0.4" stream-throttle "^0.1.3" - weinre "^2.0.0-pre-I0Z7U9OV" -browser-sync@^2.18.5: - version "2.18.13" - resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.18.13.tgz#c28dc3eb3be67c97a907082b772a37f915c14d7d" +browser-sync@^2.24.4: + version "2.26.3" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.26.3.tgz#1b59bd5935938a5b0fa73b3d78ef1050bd2bf912" + integrity sha512-VLzpjCA4uXqfzkwqWtMM6hvPm2PNHp2RcmzBXcbi6C9WpkUhhFb8SVAr4CFrCsFxDg+oY6HalOjn8F+egyvhag== dependencies: - browser-sync-client "2.5.1" - browser-sync-ui "0.6.3" + browser-sync-client "^2.26.2" + browser-sync-ui "^2.26.2" bs-recipes "1.3.4" - chokidar "1.7.0" - connect "3.5.0" + bs-snippet-injector "^2.0.1" + chokidar "^2.0.4" + connect "3.6.6" + connect-history-api-fallback "^1" dev-ip "^1.0.1" - easy-extender "2.3.2" - eazy-logger "3.0.2" - emitter-steward "^1.0.0" + easy-extender "^2.3.4" + eazy-logger "^3" + etag "^1.8.1" + fresh "^0.5.2" fs-extra "3.0.1" http-proxy "1.15.2" - immutable "3.8.1" - localtunnel "1.8.3" + immutable "^3" + localtunnel "1.9.1" micromatch "2.3.11" - opn "4.0.2" + opn "5.3.0" portscanner "2.1.1" - qs "6.2.1" + qs "6.2.3" + raw-body "^2.3.2" resp-modifier "6.0.2" rx "4.1.0" - serve-index "1.8.0" - serve-static "1.12.2" + send "0.16.2" + serve-index "1.9.1" + serve-static "1.13.2" server-destroy "1.0.1" - socket.io "1.6.0" - socket.io-client "1.6.0" - ua-parser-js "0.7.12" + socket.io "2.1.1" + ua-parser-js "0.7.17" yargs "6.4.0" browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1372,24 +1411,28 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: safe-buffer "^5.0.1" browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" evp_bytestokey "^1.0.0" browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" + integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1397,6 +1440,7 @@ browserify-rsa@^4.0.0: browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" + integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" @@ -1406,78 +1450,110 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" +browserify-zlib@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" + integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== dependencies: - pako "~0.2.0" + pako "~1.0.5" browserslist@^4.3.3: - version "4.4.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" - integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A== + version "4.4.2" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.2.tgz#6ea8a74d6464bb0bd549105f659b41197d8f0ba2" + integrity sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg== dependencies: - caniuse-lite "^1.0.30000929" - electron-to-chromium "^1.3.103" - node-releases "^1.1.3" + caniuse-lite "^1.0.30000939" + electron-to-chromium "^1.3.113" + node-releases "^1.1.8" browserstack@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.1.tgz#e2dfa66ffee940ebad0a07f7e00fd4687c455d66" + version "1.5.2" + resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.2.tgz#17d8bb76127a1cc0ea416424df80d218f803673f" + integrity sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg== dependencies: https-proxy-agent "^2.2.1" bs-recipes@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" + integrity sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU= + +bs-snippet-injector@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5" + integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU= btoa@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.1.2.tgz#3e40b81663f81d2dd6596a4cb714a8dc16cfabe0" + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== -buffer-from@^1.0.0: +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= -buffer-from@^1.1.0: +buffer-from@^1.0.0, buffer-from@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" + integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.0.0, builtin-modules@^1.1.0, builtin-modules@^1.1.1: +builtin-modules@^1.1.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" + integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" + integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== dependencies: bluebird "^3.5.1" chownr "^1.0.1" @@ -1493,7 +1569,7 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" -cacache@^11.0.1, cacache@^11.3.2: +cacache@^11.0.1, cacache@^11.0.2, cacache@^11.3.2: version "11.3.2" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== @@ -1513,28 +1589,10 @@ cacache@^11.0.1, cacache@^11.3.2: unique-filename "^1.1.1" y18n "^4.0.0" -cacache@^11.0.2: - version "11.2.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.2.0.tgz#617bdc0b02844af56310e411c0878941d5739965" - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - figgy-pudding "^3.1.0" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.3" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^6.0.0" - unique-filename "^1.1.0" - y18n "^4.0.0" - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1549,39 +1607,45 @@ cache-base@^1.0.1: callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" + integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2, camelcase@^1.2.1: +camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -caniuse-lite@^1.0.30000898: - version "1.0.30000935" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz#d1b59df00b46f4921bb84a8a34c1d172b346df59" - integrity sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ== +camelcase@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" + integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== -caniuse-lite@^1.0.30000929: - version "1.0.30000932" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000932.tgz#d01763e9ce77810962ca7391ff827b5949ce4272" - integrity sha512-4bghJFItvzz8m0T3lLZbacmEY9X1Z2AtIzTr7s7byqZIOumASfr4ynDx7rtm0J85nDmx8vsgR6vnaSoeU8Oh0A== +caniuse-lite@^1.0.30000898, caniuse-lite@^1.0.30000939: + version "1.0.30000941" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000941.tgz#f0810802b2ab8d27f4b625d4769a610e24d5a42c" + integrity sha512-4vzGb2MfZcO20VMPj1j6nRAixhmtlhkypM4fL4zhgzEucQIYiRzSqPcWIu1OF8i0FETD93FMIPWfUJCAcFvrqA== canonical-path@1.0.0: version "1.0.0" @@ -1591,27 +1655,20 @@ canonical-path@1.0.0: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" -chalk@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" - dependencies: - ansi-styles "^1.1.0" - escape-string-regexp "^1.0.0" - has-ansi "^0.1.0" - strip-ansi "^0.3.0" - supports-color "^0.2.0" - chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1619,23 +1676,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - -chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1647,25 +1688,12 @@ chalk@^2.4.2: chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - -chokidar@1.7.0, chokidar@^1.4.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== chokidar@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" + integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== dependencies: anymatch "^2.0.0" async-each "^1.0.0" @@ -1682,46 +1710,26 @@ chokidar@2.0.4: optionalDependencies: fsevents "^1.2.2" -chokidar@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.0.tgz#6686313c541d3274b2a5c01233342037948c911b" +chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4, chokidar@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" + integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg== dependencies: anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" + async-each "^1.0.1" + braces "^2.3.2" glob-parent "^3.1.0" - inherits "^2.0.1" + inherits "^2.0.3" is-binary-path "^1.0.0" is-glob "^4.0.0" - normalize-path "^2.1.1" + normalize-path "^3.0.0" path-is-absolute "^1.0.0" - readdirp "^2.0.0" + readdirp "^2.2.1" + upath "^1.1.0" optionalDependencies: - fsevents "^1.0.0" + fsevents "^1.2.7" -chokidar@^2.0.2, chokidar@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.0" - optionalDependencies: - fsevents "^1.1.2" - -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - -chownr@^1.1.1: +chownr@^1.0.1, chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== @@ -1729,12 +1737,14 @@ chownr@^1.1.1: chrome-trace-event@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" + integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== dependencies: tslib "^1.9.0" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -1742,14 +1752,17 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: circular-dependency-plugin@5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz#da168c0b37e7b43563fb9f912c1c007c213389ef" + integrity sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA== circular-json@^0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.5.tgz#64182ef359042d37cd8e767fc9de878b1e9447d3" + version "0.5.9" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" + integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -1759,38 +1772,44 @@ class-utils@^0.3.5: clean-css@4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" + integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== dependencies: source-map "~0.6.0" cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" wordwrap "0.0.2" -cliui@^3.0.3, cliui@^3.2.0: +cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" wrap-ansi "^2.0.0" cliui@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" @@ -1799,235 +1818,242 @@ cliui@^4.0.0: clone-deep@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" + integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ== dependencies: for-own "^1.0.0" is-plain-object "^2.0.4" kind-of "^6.0.0" shallow-clone "^1.0.0" -clone@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" - -clone@^2.1.2: +clone@^2.1.1, clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" + integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" color-convert@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== dependencies: - color-name "^1.1.1" + color-name "1.1.3" -color-name@^1.1.1: +color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@1.1.2, colors@^1.1.0: +colors@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= + +colors@^1.1.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== combine-lists@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" + integrity sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y= dependencies: lodash "^4.5.0" -combined-stream@1.0.6, combined-stream@~1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" - dependencies: - delayed-stream "~1.0.0" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" + integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== dependencies: delayed-stream "~1.0.0" commander@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" + integrity sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0= -commander@^2.12.1: - version "2.15.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" - -commander@^2.2.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" +commander@^2.12.1, commander@^2.2.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= compare-versions@^3.2.1: version "3.4.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" + integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - -component-emitter@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" + integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" + integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= -compressible@~2.0.11: - version "2.0.12" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" +compressible@~2.0.14: + version "2.0.16" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f" + integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA== dependencies: - mime-db ">= 1.30.0 < 2" + mime-db ">= 1.38.0 < 2" compression@^1.5.2: - version "1.7.1" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" + version "1.7.3" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" + integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== dependencies: - accepts "~1.3.4" + accepts "~1.3.5" bytes "3.0.0" - compressible "~2.0.11" + compressible "~2.0.14" debug "2.6.9" on-headers "~1.0.1" - safe-buffer "5.1.1" + safe-buffer "5.1.2" vary "~1.1.2" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.0, concat-stream@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" +concat-stream@1.6.2, concat-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== dependencies: + buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" concurrently@^3.0.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.5.0.tgz#8cf1b7707a6916a78a4ff5b77bb04dec54b379b2" + version "3.6.1" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.6.1.tgz#2f95baec5c4051294dfbb55b57a3b98a3e2b45ec" + integrity sha512-/+ugz+gwFSEfTGUxn0KHkY+19XPRTXR8+7oUK/HxgiN1n7FjeJmkrbSiXAJfyQ0zORgJYPaenmymwon51YXH9Q== dependencies: - chalk "0.5.1" + chalk "^2.4.1" commander "2.6.0" date-fns "^1.23.0" lodash "^4.5.1" + read-pkg "^3.0.0" rx "2.3.24" spawn-command "^0.0.2-1" supports-color "^3.2.3" tree-kill "^1.1.0" -connect-history-api-fallback@^1.1.0, connect-history-api-fallback@^1.2.0, connect-history-api-fallback@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz#3db24f973f4b923b0e82f619ce0df02411ca623d" +connect-history-api-fallback@^1, connect-history-api-fallback@^1.2.0, connect-history-api-fallback@^1.3.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" + integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== connect-logger@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/connect-logger/-/connect-logger-0.0.1.tgz#4d999978a1d20bb4608e7cd434d741652255174b" + integrity sha1-TZmZeKHSC7RgjnzUNNdBZSJVF0s= dependencies: moment "*" -connect@1.x: - version "1.9.2" - resolved "https://registry.yarnpkg.com/connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807" - dependencies: - formidable "1.0.x" - mime ">= 0.0.1" - qs ">= 0.4.0" - -connect@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198" - dependencies: - debug "~2.2.0" - finalhandler "0.5.0" - parseurl "~1.3.1" - utils-merge "1.0.0" - -connect@^3.6.0: - version "3.6.5" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.5.tgz#fb8dde7ba0763877d0ec9df9dac0b4b40e72c7da" +connect@3.6.6, connect@^3.6.0: + version "3.6.6" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" + integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= dependencies: debug "2.6.9" - finalhandler "1.0.6" + finalhandler "1.1.0" parseurl "~1.3.2" utils-merge "1.0.1" console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" + integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= dependencies: date-now "^0.1.4" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" + integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" - -convert-source-map@^1.5.0, convert-source-map@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" +convert-source-map@^1.1.1, convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" + integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== + dependencies: + safe-buffer "~5.1.1" cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== dependencies: aproba "^1.1.1" fs-write-stream-atomic "^1.0.8" @@ -2039,10 +2065,12 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= copy-webpack-plugin@4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz#f2b2782b3cd5225535c3dc166a80067e7d940f27" + integrity sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ== dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -2053,29 +2081,25 @@ copy-webpack-plugin@4.5.4: p-limit "^1.0.0" serialize-javascript "^1.4.0" -core-js@^2.2.0, core-js@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" - -core-js@^2.5.4: - version "2.5.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" - -core-js@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" +core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.4: + version "2.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" + integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= corser@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c= cosmiconfig@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" + integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" @@ -2083,24 +2107,28 @@ cosmiconfig@^4.0.0: require-from-string "^2.0.1" create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" + version "4.0.3" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" + integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== dependencies: bn.js "^4.1.0" elliptic "^6.0.0" create-hash@^1.1.0, create-hash@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== dependencies: cipher-base "^1.0.1" inherits "^2.0.1" - ripemd160 "^2.0.0" + md5.js "^1.3.4" + ripemd160 "^2.0.1" sha.js "^2.4.0" create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -2112,6 +2140,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: cross-spawn@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" + integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= dependencies: lru-cache "^4.0.1" which "^1.2.9" @@ -2119,6 +2148,7 @@ cross-spawn@^3.0.0: cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -2127,6 +2157,7 @@ cross-spawn@^5.0.1: cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -2134,21 +2165,10 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -cryptiles@3.x.x: - version "3.1.2" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" - dependencies: - boom "5.x.x" - crypto-browserify@^3.11.0: - version "3.11.1" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -2160,119 +2180,116 @@ crypto-browserify@^3.11.0: pbkdf2 "^3.0.3" public-encrypt "^4.0.0" randombytes "^2.0.0" + randomfill "^1.0.3" css-parse@1.7.x: version "1.7.0" resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" + integrity sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs= currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" + integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" date-fns@^1.23.0: - version "1.29.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== date-format@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" + integrity sha1-YV6CjiM90aubua4JUODOzPpuytg= date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" + integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@*, debug@3.1.0, debug@^3.1.0, debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" +debug@*, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== dependencies: - ms "2.0.0" - -debug@2.2.0, debug@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" - dependencies: - ms "0.7.1" - -debug@2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" - dependencies: - ms "0.7.2" - -debug@2.6.4: - version "2.6.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0" - dependencies: - ms "0.7.3" - -debug@2.6.8: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - dependencies: - ms "2.0.0" + ms "^2.1.1" debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.2.5: +debug@3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decamelize@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" + integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== dependencies: xregexp "4.0.0" decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= default-gateway@^2.6.0: version "2.7.2" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== dependencies: execa "^0.10.0" ip-regex "^2.1.0" @@ -2280,24 +2297,28 @@ default-gateway@^2.6.0: default-require-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" + integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= dependencies: strip-bom "^3.0.0" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" @@ -2305,6 +2326,7 @@ define-property@^2.0.2: del@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -2317,6 +2339,7 @@ del@^2.2.0: del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= dependencies: globby "^6.1.0" is-path-cwd "^1.0.0" @@ -2328,26 +2351,27 @@ del@^3.0.0: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -depd@1.1.1, depd@~1.1.0, depd@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" + integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= dependency-graph@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.7.2.tgz#91db9de6eb72699209d88aea4c1fd5221cac1c49" + integrity sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ== des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" + integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -2355,59 +2379,70 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= detect-node@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + version "2.0.4" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" + integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== dev-ip@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" + integrity sha1-p2o+0YVb56ASu4rBbLgPPADcKPA= di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" + integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= -diff@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" - -diff@^3.2.0: +diff@^3.1.0, diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" randombytes "^2.0.0" dir-glob@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + version "2.2.2" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" + integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== dependencies: - arrify "^1.0.1" path-type "^3.0.0" dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= -dns-packet@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a" +dns-packet@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" + integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -2415,16 +2450,19 @@ dns-packet@^1.0.1: dns-txt@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= dependencies: buffer-indexof "^1.0.0" docopt@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/docopt/-/docopt-0.6.2.tgz#b28e9e2220da5ec49f7ea5bb24a47787405eeb11" + integrity sha1-so6eIiDaXsSffqW7JKR3h0Be6xE= dom-serialize@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" + integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= dependencies: custom-event "~1.0.0" ent "~2.2.0" @@ -2432,43 +2470,51 @@ dom-serialize@^2.2.0: void-elements "^2.0.0" domain-browser@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" + version "1.2.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" + integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== domino@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.0.tgz#653ba7d331441113b42e40ba05f24253ec86e02e" + version "2.1.2" + resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.2.tgz#70e8367839ee8ad8bde3aeb4857cf3d93bd98b85" + integrity sha512-nzg76s4Smji9teyLwOnqqUCdFVOho+OQFqUwp+42Wo+SEZ1FGw7uhemv6OKk2qp8YIgnGB3jVt0sJWU96wbPgA== -duplexify@^3.1.2, duplexify@^3.4.2: - version "3.5.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" +duplexify@^3.4.2, duplexify@^3.6.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" + integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" readable-stream "^2.0.0" stream-shift "^1.0.0" -easy-extender@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.2.tgz#3d3248febe2b159607316d8f9cf491c16648221d" +easy-extender@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" + integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== dependencies: - lodash "^3.10.1" + lodash "^4.17.10" -eazy-logger@3.0.2: +eazy-logger@^3: version "3.0.2" resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc" + integrity sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw= dependencies: tfunk "^3.0.1" ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= dependencies: jsbn "~0.1.0" + safer-buffer "^2.1.0" ecstatic@^1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-1.4.1.tgz#32cb7b6fa2e290d58668674d115e8f0c3d567d6a" + integrity sha1-Mst7b6LikNWGaGdNEV6PDD1WfWo= dependencies: he "^0.5.0" mime "^1.2.11" @@ -2478,15 +2524,22 @@ ecstatic@^1.4.0: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.103: - version "1.3.109" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.109.tgz#ee04a55a5157a5580a5ea88e526b02c84a3a7bc8" - integrity sha512-1qhgVZD9KIULMyeBkbjU/dWmm30zpPUfdWZfVO3nPhbtqMHJqHr4Ua5wBcWtAymVFrUCuAJxjMF1OhG+bR21Ow== +ejs@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" + integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== + +electron-to-chromium@^1.3.113: + version "1.3.113" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" + integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== elliptic@^6.0.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" + version "6.4.1" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" + integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2496,21 +2549,15 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -emitter-steward@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/emitter-steward/-/emitter-steward-1.0.0.tgz#f3411ade9758a7565df848b2da0cbbd1b46cbd64" - emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" + integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" - -encodeurl@~1.0.2: +encodeurl@~1.0.1, encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" @@ -2520,31 +2567,16 @@ encoding@^0.1.11: iconv-lite "~0.4.13" end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== dependencies: once "^1.4.0" -engine.io-client@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" - dependencies: - component-emitter "1.2.1" - component-inherit "0.0.3" - debug "2.3.3" - engine.io-parser "1.3.1" - has-cors "1.1.0" - indexof "0.0.1" - parsejson "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - ws "1.1.1" - xmlhttprequest-ssl "1.5.3" - yeast "0.1.2" - engine.io-client@~3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" + integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== dependencies: component-emitter "1.2.1" component-inherit "0.0.3" @@ -2558,41 +2590,38 @@ engine.io-client@~3.2.0: xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-parser@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" +engine.io-client@~3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.2.tgz#04e068798d75beda14375a264bb3d742d7bc33aa" + integrity sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ== dependencies: - after "0.8.1" - arraybuffer.slice "0.0.6" - base64-arraybuffer "0.1.5" - blob "0.0.4" - has-binary "0.1.6" - wtf-8 "1.0.0" + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "~3.1.0" + engine.io-parser "~2.1.1" + has-cors "1.1.0" + indexof "0.0.1" + parseqs "0.0.5" + parseuri "0.0.5" + ws "~6.1.0" + xmlhttprequest-ssl "~1.5.4" + yeast "0.1.2" engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196" + version "2.1.3" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" + integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== dependencies: after "0.8.2" arraybuffer.slice "~0.0.7" base64-arraybuffer "0.1.5" - blob "0.0.4" + blob "0.0.5" has-binary2 "~1.0.2" -engine.io@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" - dependencies: - accepts "1.3.3" - base64id "0.1.0" - cookie "0.3.1" - debug "2.3.3" - engine.io-parser "1.3.1" - ws "1.1.1" - engine.io@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.0.tgz#54332506f42f2edc71690d2f2a42349359f3bf7d" + version "3.2.1" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2" + integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w== dependencies: accepts "~1.3.4" base64id "1.0.0" @@ -2601,17 +2630,10 @@ engine.io@~3.2.0: engine.io-parser "~2.1.0" ws "~3.3.1" -enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: +enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -enhanced-resolve@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" + integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" @@ -2620,53 +2642,53 @@ enhanced-resolve@^4.0.0: ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" + integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= err-code@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= -errno@^0.1.1, errno@^0.1.3, errno@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" +errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== dependencies: - prr "~0.0.0" + prr "~1.0.1" error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" es6-promise@^4.0.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" - -es6-promise@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" - -es6-promise@~4.0.3: - version "4.0.5" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" + version "4.2.6" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" + integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== es6-promisify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= dependencies: es6-promise "^4.0.3" escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= dependencies: esprima "^2.7.1" estraverse "^1.9.1" @@ -2676,8 +2698,9 @@ escodegen@1.8.x: source-map "~0.2.0" eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" + version "4.0.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.2.tgz#5f10cd6cabb1965bf479fa65745673439e21cb0e" + integrity sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg== dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -2685,49 +2708,64 @@ eslint-scope@^4.0.0: esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esrecurse@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== dependencies: estraverse "^4.1.0" - object-assign "^4.0.1" estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - -estree-walker@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" + integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= estree-walker@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.0.tgz#aae3b57c42deb8010e349c892462f0e71c5dd1aa" + version "0.5.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" + integrity sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== + +estree-walker@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" + integrity sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw== esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -etag@^1.7.0, etag@~1.8.0, etag@~1.8.1: +etag@1.8.1, etag@^1.8.1, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +eventemitter3@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" + integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== + +events@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" + integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== eventsource@^1.0.7: version "1.0.7" @@ -2739,6 +2777,7 @@ eventsource@^1.0.7: evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" @@ -2746,6 +2785,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" + integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== dependencies: cross-spawn "^6.0.0" get-stream "^3.0.0" @@ -2758,6 +2798,7 @@ execa@^0.10.0: execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -2767,13 +2808,28 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-braces@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" + integrity sha1-SIsdHSRRyz06axks/AMPRMWFX+o= dependencies: array-slice "^0.2.3" array-unique "^0.2.1" @@ -2782,12 +2838,14 @@ expand-braces@^0.1.1: expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -2800,6 +2858,7 @@ expand-brackets@^2.1.4: expand-range@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" + integrity sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ= dependencies: is-number "^0.1.1" repeat-string "^0.2.2" @@ -2807,25 +2866,25 @@ expand-range@^0.1.0: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" -express@2.5.x: - version "2.5.11" - resolved "https://registry.yarnpkg.com/express/-/express-2.5.11.tgz#4ce8ea1f3635e69e49f0ebb497b6a4b0a51ce6f0" +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= dependencies: - connect "1.x" - mime "1.2.4" - mkdirp "0.3.0" - qs "0.4.x" + homedir-polyfill "^1.0.1" -express@^4.14.1: - version "4.16.3" - resolved "http://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" +express@^4.14.1, express@^4.16.2: + version "4.16.4" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== dependencies: accepts "~1.3.5" array-flatten "1.1.1" - body-parser "1.18.2" + body-parser "1.18.3" content-disposition "0.5.2" content-type "~1.0.4" cookie "0.3.1" @@ -2842,10 +2901,10 @@ express@^4.14.1: on-finished "~2.3.0" parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~2.0.3" - qs "6.5.1" + proxy-addr "~2.0.4" + qs "6.5.2" range-parser "~1.2.0" - safe-buffer "5.1.1" + safe-buffer "5.1.2" send "0.16.2" serve-static "1.13.2" setprototypeof "1.1.0" @@ -2854,65 +2913,30 @@ express@^4.14.1: utils-merge "1.0.1" vary "~1.1.2" -express@^4.16.2: - version "4.16.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" - dependencies: - accepts "~1.3.4" - array-flatten "1.1.1" - body-parser "1.18.2" - content-disposition "0.5.2" - content-type "~1.0.4" - cookie "0.3.1" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.1" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.1.0" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.2" - path-to-regexp "0.1.7" - proxy-addr "~2.0.2" - qs "6.5.1" - range-parser "~1.2.0" - safe-buffer "5.1.1" - send "0.16.1" - serve-static "1.13.1" - setprototypeof "1.1.0" - statuses "~1.3.1" - type-is "~1.6.15" - utils-merge "1.0.1" - vary "~1.1.2" - extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -extend@~3.0.2: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" @@ -2921,12 +2945,14 @@ external-editor@^3.0.0: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" -extglob@^2.0.2, extglob@^2.0.4: +extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -2937,38 +2963,50 @@ extglob@^2.0.2, extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@~1.6.5: - version "1.6.5" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.5.tgz#99a06735b6ea20ea9b705d779acffcc87cff0440" +extract-zip@^1.6.5: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= dependencies: - concat-stream "1.6.0" - debug "2.2.0" - mkdirp "0.5.0" + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" yauzl "2.4.1" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" + integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-json-stable-stringify@2.0.0, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" @@ -2982,22 +3020,26 @@ faye-websocket@~0.11.1: fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= dependencies: pend "~1.2.0" -figgy-pudding@^3.1.0, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: +figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-loader@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" + integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== dependencies: loader-utils "^1.0.2" schema-utils "^1.0.0" @@ -3005,58 +3047,41 @@ file-loader@2.0.0: filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fileset@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" + integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= dependencies: glob "^7.0.3" minimatch "^3.0.3" fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + version "2.2.4" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^1.1.3" + randomatic "^3.0.0" repeat-element "^1.1.2" repeat-string "^1.5.2" fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" -finalhandler@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" - dependencies: - debug "~2.2.0" - escape-html "~1.0.3" - on-finished "~2.3.0" - statuses "~1.3.0" - unpipe "~1.0.0" - -finalhandler@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" - dependencies: - debug "2.6.9" - encodeurl "~1.0.1" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.2" - statuses "~1.3.1" - unpipe "~1.0.0" - finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= dependencies: debug "2.6.9" encodeurl "~1.0.1" @@ -3068,7 +3093,8 @@ finalhandler@1.1.0: finalhandler@1.1.1: version "1.1.1" - resolved "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" + integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== dependencies: debug "2.6.9" encodeurl "~1.0.2" @@ -3081,6 +3107,7 @@ finalhandler@1.1.1: find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= dependencies: commondir "^1.0.1" make-dir "^1.0.0" @@ -3089,6 +3116,7 @@ find-cache-dir@^1.0.0: find-cache-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== dependencies: commondir "^1.0.1" make-dir "^1.0.0" @@ -3097,6 +3125,7 @@ find-cache-dir@^2.0.0: find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -3104,99 +3133,101 @@ find-up@^1.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" -flush-write-stream@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +flush-write-stream@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +follow-redirects@^1.0.0, follow-redirects@^1.2.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" + integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== + dependencies: + debug "^3.2.6" for-in@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" + integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" for-own@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= dependencies: for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= form-data@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "1.0.6" + combined-stream "^1.0.6" mime-types "^2.1.12" -formidable@1.0.x: - version "1.0.17" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" - forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" -fresh@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" - -fresh@0.5.2: +fresh@0.5.2, fresh@^0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - -fresh@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" readable-stream "^2.0.0" @@ -3204,20 +3235,23 @@ from2@^2.1.0: fs-access@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" + integrity sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o= dependencies: null-check "^1.0.0" fs-extra@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= dependencies: graceful-fs "^4.1.2" jsonfile "^3.0.0" universalify "^0.1.0" -fs-extra@~1.0.0: +fs-extra@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3226,12 +3260,14 @@ fs-extra@~1.0.0: fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" + integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== dependencies: minipass "^2.2.1" fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= dependencies: graceful-fs "^4.1.2" iferr "^0.1.5" @@ -3241,39 +3277,20 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.36" - -fsevents@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" - -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" +fsevents@^1.2.2, fsevents@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== dependencies: nan "^2.9.2" node-pre-gyp "^0.10.0" -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: +fstream@^1.0.0, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -3283,6 +3300,7 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -3294,8 +3312,9 @@ gauge@~2.7.3: wide-align "^1.1.0" gaze@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" + version "1.1.3" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" + integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== dependencies: globule "^1.0.0" @@ -3305,18 +3324,21 @@ genfun@^5.0.0: integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.1.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -3326,16 +3348,19 @@ get-stream@^4.1.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -3343,12 +3368,14 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -3356,6 +3383,7 @@ glob-parent@^3.1.0: glob@7.0.x: version "7.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo= dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3364,9 +3392,10 @@ glob@7.0.x: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.3, glob@^7.1.3: +glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3378,6 +3407,7 @@ glob@7.1.3, glob@^7.1.3: glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" @@ -3385,42 +3415,40 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules-path@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" globals@^11.1.0: - version "11.7.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + version "11.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" + integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -3432,6 +3460,7 @@ globby@^5.0.0: globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -3442,6 +3471,7 @@ globby@^6.1.0: globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= dependencies: array-union "^1.0.1" dir-glob "^2.0.0" @@ -3451,18 +3481,15 @@ globby@^7.1.1: slash "^1.0.0" globule@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" + version "1.2.1" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" + integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== dependencies: glob "~7.1.1" - lodash "~4.17.4" + lodash "~4.17.10" minimatch "~3.0.2" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -graceful-fs@^4.1.15: +graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -3470,20 +3497,12 @@ graceful-fs@^4.1.15: handle-thing@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ= -handlebars@^4.0.1: - version "4.0.11" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" - dependencies: - async "^1.4.0" - optimist "^0.6.1" - source-map "^0.4.4" - optionalDependencies: - uglify-js "^2.6" - -handlebars@^4.0.11: - version "4.0.12" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" +handlebars@^4.0.1, handlebars@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" + integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== dependencies: async "^2.5.0" optimist "^0.6.1" @@ -3491,88 +3510,57 @@ handlebars@^4.0.11: optionalDependencies: uglify-js "^3.1.4" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" + version "5.1.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" + integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== dependencies: - ajv "^5.3.0" + ajv "^6.5.5" har-schema "^2.0.0" -has-ansi@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" - dependencies: - ansi-regex "^0.2.0" - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-binary2@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" + integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== dependencies: isarray "2.0.1" -has-binary@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" - dependencies: - isarray "0.0.1" - -has-binary@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" - dependencies: - isarray "0.0.1" - has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" + integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-flag@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3581,6 +3569,7 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3589,90 +3578,70 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" -hash-base@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" - dependencies: - inherits "^2.0.1" - hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" + integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" - minimalistic-assert "^1.0.0" + minimalistic-assert "^1.0.1" -hasha@~2.2.0: +hasha@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" + integrity sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE= dependencies: is-stream "^1.0.1" pinkie-promise "^2.0.0" -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hawk@~6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" - dependencies: - boom "4.x.x" - cryptiles "3.x.x" - hoek "4.x.x" - sntp "2.x.x" - he@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" + integrity sha1-LAX/rvkLaOhg8/0rVO9YCYknfuI= hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" -hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" - -hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" - -hosted-git-info@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" +hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" + integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= dependencies: inherits "^2.0.1" obuf "^1.0.0" @@ -3682,6 +3651,7 @@ hpack.js@^2.1.6: html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= http-cache-semantics@^3.8.1: version "3.8.1" @@ -3691,27 +3661,22 @@ http-cache-semantics@^3.8.1: http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.6.2, http-errors@~1.6.1, http-errors@~1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" +http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" + integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= dependencies: - depd "1.1.1" + depd "~1.1.2" inherits "2.0.3" - setprototypeof "1.0.3" - statuses ">= 1.3.1 < 2" - -http-errors@~1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" - dependencies: - inherits "2.0.3" - setprototypeof "1.0.2" - statuses ">= 1.3.1 < 2" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" http-parser-js@>=0.4.0: - version "0.4.9" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1" + version "0.5.0" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" + integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== http-proxy-agent@^2.1.0: version "2.1.0" @@ -3724,6 +3689,7 @@ http-proxy-agent@^2.1.0: http-proxy-middleware@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + integrity sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q== dependencies: http-proxy "^1.16.2" is-glob "^4.0.0" @@ -3733,20 +3699,24 @@ http-proxy-middleware@~0.18.0: http-proxy@1.15.2: version "1.15.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31" + integrity sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE= dependencies: eventemitter3 "1.x.x" requires-port "1.x.x" http-proxy@^1.13.0, http-proxy@^1.16.2, http-proxy@^1.8.1: - version "1.16.2" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" + version "1.17.0" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" + integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== dependencies: - eventemitter3 "1.x.x" - requires-port "1.x.x" + eventemitter3 "^3.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" http-server@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.9.0.tgz#8f1b06bdc733618d4dc42831c7ba1aff4e06001a" + integrity sha1-jxsGvcczYY1NxCgxx7oa/04GABo= dependencies: colors "1.0.3" corser "~2.0.0" @@ -3757,29 +3727,24 @@ http-server@^0.9.0: portfinder "0.4.x" union "~0.4.3" -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -https-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" +https-browserify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" + integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= https-proxy-agent@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" + integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== dependencies: agent-base "^4.1.0" debug "^3.1.0" @@ -3791,65 +3756,75 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.19: - version "0.4.19" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" +iconv-lite@0.4.23: + version "0.4.23" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" + integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== + dependencies: + safer-buffer ">= 2.1.2 < 3" iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + version "1.1.12" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" + integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" + integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: minimatch "^3.0.4" ignore@^3.3.5: - version "3.3.7" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= -immutable@3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" - -immutable@^3.7.6: +immutable@^3: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" + integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" + integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= dependencies: import-from "^2.1.0" import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" + integrity sha1-M1238qev/VOqpHHUuAId7ja387E= dependencies: resolve-from "^3.0.0" import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" + integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== dependencies: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" @@ -3857,24 +3832,29 @@ import-local@^2.0.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= in-publish@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" + integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" + integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -3882,20 +3862,18 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" + integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@1.3.5: +ini@1.3.5, ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -ini@^1.3.4, ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - inquirer@6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" @@ -3918,95 +3896,102 @@ inquirer@6.2.1: internal-ip@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== dependencies: default-gateway "^2.6.0" ipaddr.js "^1.5.2" interpret@^1.0.0, interpret@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + version "1.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" + integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" + integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - -ipaddr.js@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" + integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" + integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= ipaddr.js@^1.5.2: - version "1.8.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -4015,6 +4000,7 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -4023,286 +4009,321 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" + integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= dependencies: is-extglob "^2.1.1" is-number-like@^1.0.3: version "1.0.8" resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" + integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== dependencies: lodash.isfinite "^3.3.2" is-number@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" + integrity sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY= is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - -is-odd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" - dependencies: - is-number "^3.0.0" - -is-odd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" - dependencies: - is-number "^4.0.0" + integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= dependencies: path-is-inside "^1.0.1" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isarray@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" + integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= isbinaryfile@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + version "3.0.3" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" + integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== + dependencies: + buffer-alloc "^1.2.0" isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.0.6.tgz#cd7b33ee678f6c01531d05f5e567ebbcd25f8ecc" +istanbul-api@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.1.tgz#194b773f6d9cbc99a9258446848b0f988951c4d0" + integrity sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw== dependencies: async "^2.6.1" compare-versions "^3.2.1" fileset "^2.0.3" - istanbul-lib-coverage "^2.0.1" - istanbul-lib-hook "^2.0.1" - istanbul-lib-instrument "^3.0.0" - istanbul-lib-report "^2.0.2" - istanbul-lib-source-maps "^2.0.1" - istanbul-reports "^2.0.1" + istanbul-lib-coverage "^2.0.3" + istanbul-lib-hook "^2.0.3" + istanbul-lib-instrument "^3.1.0" + istanbul-lib-report "^2.0.4" + istanbul-lib-source-maps "^3.0.2" + istanbul-reports "^2.1.1" js-yaml "^3.12.0" make-dir "^1.3.0" + minimatch "^3.0.4" once "^1.4.0" istanbul-instrumenter-loader@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949" + integrity sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w== dependencies: convert-source-map "^1.5.0" istanbul-lib-instrument "^1.7.3" loader-utils "^1.1.0" schema-utils "^0.3.0" -istanbul-lib-coverage@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" +istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== -istanbul-lib-coverage@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" +istanbul-lib-coverage@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba" + integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw== -istanbul-lib-hook@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72" +istanbul-lib-hook@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz#e0e581e461c611be5d0e5ef31c5f0109759916fb" + integrity sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA== dependencies: append-transform "^1.0.0" istanbul-lib-instrument@^1.7.3: - version "1.9.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e" + version "1.10.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" - istanbul-lib-coverage "^1.1.1" + istanbul-lib-coverage "^1.2.1" semver "^5.3.0" -istanbul-lib-instrument@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9" +istanbul-lib-instrument@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971" + integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA== dependencies: "@babel/generator" "^7.0.0" "@babel/parser" "^7.0.0" "@babel/template" "^7.0.0" "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" - istanbul-lib-coverage "^2.0.1" + istanbul-lib-coverage "^2.0.3" semver "^5.5.0" -istanbul-lib-report@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" +istanbul-lib-report@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz#bfd324ee0c04f59119cb4f07dab157d09f24d7e4" + integrity sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA== dependencies: - istanbul-lib-coverage "^2.0.1" + istanbul-lib-coverage "^2.0.3" make-dir "^1.3.0" - supports-color "^5.4.0" + supports-color "^6.0.0" -istanbul-lib-source-maps@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" +istanbul-lib-source-maps@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz#f1e817229a9146e8424a28e5d69ba220fda34156" + integrity sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ== dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^2.0.1" + debug "^4.1.1" + istanbul-lib-coverage "^2.0.3" make-dir "^1.3.0" rimraf "^2.6.2" source-map "^0.6.1" -istanbul-reports@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" +istanbul-reports@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9" + integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw== dependencies: - handlebars "^4.0.11" + handlebars "^4.1.0" istanbul@0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= dependencies: abbrev "1.0.x" async "1.x" @@ -4322,26 +4343,31 @@ istanbul@0.4.5: jasmine-core@~2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" + integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4= jasmine-core@~2.99.1: version "2.99.1" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.99.1.tgz#e6400df1e6b56e130b61c4bcd093daa7f6e8ca15" + integrity sha1-5kAN8ea1bhMLYcS80JPap/boyhU= jasmine-marbles@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/jasmine-marbles/-/jasmine-marbles-0.4.0.tgz#de72331d189d4968e4b1e78b638e51654040c755" + version "0.4.1" + resolved "https://registry.yarnpkg.com/jasmine-marbles/-/jasmine-marbles-0.4.1.tgz#5e0b492c124b3a34f958c40c0587f3abccea6485" + integrity sha512-i5jjbwSX2dxMCt6uhNZCHh8QhjD4rJtUZDhCqz6NwelQezV6ScM22cuvWNlDQrGSvdM71elKUfGQrSMJYIoS2g== dependencies: lodash "^4.5.0" jasmine-spec-reporter@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz#1d632aec0341670ad324f92ba84b4b32b35e9e22" + integrity sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg== dependencies: colors "1.1.2" jasmine@2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" + integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4= dependencies: exit "^0.1.2" glob "^7.0.6" @@ -4350,36 +4376,27 @@ jasmine@2.8.0: jasminewd2@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" + integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= js-base64@^2.1.8: - version "2.3.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" + version "2.5.1" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" + integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== -js-tokens@^3.0.0, js-tokens@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.x: - version "3.11.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@^3.12.0, js-yaml@^3.9.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.7.0: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" +js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: + version "3.12.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" + integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4387,65 +4404,74 @@ js-yaml@^3.7.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@^2.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@3.3.2, json3@^3.3.2: +json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= optionalDependencies: graceful-fs "^4.1.6" -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -4454,6 +4480,7 @@ jsonparse@^1.2.0: jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -4461,46 +4488,47 @@ jsprim@^1.2.2: verror "1.10.0" jszip@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.1.5.tgz#e3c2a6c6d706ac6e603314036d43cd40beefdf37" + version "3.2.0" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.0.tgz#1c179e8692777490ca4e9b8f3ced08f9b820da2c" + integrity sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ== dependencies: - core-js "~2.3.0" - es6-promise "~3.0.2" - lie "~3.1.0" + lie "~3.3.0" pako "~1.0.2" - readable-stream "~2.0.6" + readable-stream "~2.3.6" + set-immediate-shim "~1.0.1" karma-chrome-launcher@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" + integrity sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w== dependencies: fs-access "^1.0.0" which "^1.2.1" karma-coverage-istanbul-reporter@~2.0.1: - version "2.0.4" - resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz#402ae4ed6eadb9d9dafbd408ffda17897c0d003a" + version "2.0.5" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.5.tgz#ca5899d4905e44a5984dd4f963adfc1a74dce767" + integrity sha512-yPvAlKtY3y+rKKWbOo0CzBMVTvJEeMOgbMXuVv3yWvS8YtYKC98AU9vFF0mVBZ2RP1E9SgS90+PT6Kf14P3S4w== dependencies: - istanbul-api "^2.0.5" + istanbul-api "^2.1.1" minimatch "^3.0.4" karma-jasmine-html-reporter@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz#48a8e5ef18807617ee2b5e33c1194c35b439524c" + integrity sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw= dependencies: karma-jasmine "^1.0.2" -karma-jasmine@^1.0.2: - version "1.1.0" - resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" - -karma-jasmine@~1.1.2: +karma-jasmine@^1.0.2, karma-jasmine@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.2.tgz#394f2b25ffb4a644b9ada6f22d443e2fd08886c3" + integrity sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM= karma-phantomjs-launcher@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2" + integrity sha1-0jyjSAG9qYY60xjju0vUBisTrNI= dependencies: lodash "^4.0.1" phantomjs-prebuilt "^2.1.7" @@ -4508,12 +4536,14 @@ karma-phantomjs-launcher@^1.0.2: karma-source-map-support@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz#36dd4d8ca154b62ace95696236fae37caf0a7dde" + integrity sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q== dependencies: source-map-support "^0.5.5" karma@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/karma/-/karma-3.0.0.tgz#6da83461a8a28d8224575c3b5b874e271b4730c3" + integrity sha512-ZTjyuDXVXhXsvJ1E4CnZzbCjSxD6sEdzEsFYogLuZM0yqvg/mgz+O+R1jb0J7uAQeuzdY8kJgx6hSNXLwFuHIQ== dependencies: bluebird "^3.3.0" body-parser "^1.16.1" @@ -4543,65 +4573,70 @@ karma@~3.0.0: tmp "0.0.33" useragent "2.2.1" -kew@~0.7.0: +kew@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" + integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= killable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" + version "1.0.1" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" + integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0, kind-of@^5.0.2: +kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= optionalDependencies: graceful-fs "^4.1.9" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - -lazy-cache@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" - dependencies: - set-getter "^0.1.0" + integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" lcid@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== dependencies: invert-kv "^2.0.0" less-loader@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e" + integrity sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg== dependencies: clone "^2.1.1" loader-utils "^1.1.0" @@ -4610,6 +4645,7 @@ less-loader@4.1.0: less@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" + integrity sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q== dependencies: clone "^2.1.2" optionalDependencies: @@ -4625,6 +4661,7 @@ less@3.8.1: levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -4632,24 +4669,28 @@ levn@~0.3.0: license-webpack-plugin@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.0.2.tgz#9d34b521cb7fca8527945310b05be6ef0248b687" + integrity sha512-GsomZw5VoT20ST8qH2tOjBgbyhn6Pgs9M94g0mbvfBIV1VXufm1iKY+4dbgfTObj1Mp6nSRE3Zf74deOZr0KwA== dependencies: webpack-sources "^1.2.0" -lie@~3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" +lie@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" + integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== dependencies: immediate "~3.0.5" limiter@^1.0.5: - version "1.1.2" - resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.2.tgz#229d8055891c8b11af9e0ee5200e8e09bb3dcbeb" + version "1.1.4" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.4.tgz#87c9c3972d389fdb0ba67a45aadbc5d2f8413bc1" + integrity sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg== lite-server@^2.2.2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/lite-server/-/lite-server-2.3.0.tgz#5b4cc8f5d5fd4836105480ab2ac48a3a0de2b0c8" + version "2.4.0" + resolved "https://registry.yarnpkg.com/lite-server/-/lite-server-2.4.0.tgz#e3e122885836b168895d7b6b4eca06047d204c0d" + integrity sha512-Vo06tHpXrqm37i6T7tVdq5PSbrFmvQRw64+dlFXdh1tltv6KCvpE+xzXz2+x6KWJ8ja+GgwSy4P13GUWyhaDHQ== dependencies: - browser-sync "^2.18.5" + browser-sync "^2.24.4" connect-history-api-fallback "^1.2.0" connect-logger "0.0.1" lodash "^4.11.1" @@ -4658,6 +4699,7 @@ lite-server@^2.2.2: load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4667,37 +4709,61 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" - resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" pify "^2.0.0" strip-bom "^3.0.0" -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" -loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-runner@^2.3.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" + integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + +loader-utils@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" + integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= dependencies: big.js "^3.1.3" emojis-list "^2.0.0" json5 "^0.5.0" -localtunnel@1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.3.tgz#dcc5922fd85651037d4bde24fd93248d0b24eb05" +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" + integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== dependencies: - debug "2.6.8" + big.js "^5.2.2" + emojis-list "^2.0.0" + json5 "^1.0.1" + +localtunnel@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.9.1.tgz#1d1737eab658add5a40266d8e43f389b646ee3b1" + integrity sha512-HWrhOslklDvxgOGFLxi6fQVnvpl6XdX4sPscfqMZkzi3gtt9V7LKBWYvNUcpHSVvjwCQ6xzXacVvICNbNcyPnQ== + dependencies: + axios "0.17.1" + debug "2.6.9" openurl "1.1.1" - request "2.81.0" - yargs "3.29.0" + yargs "6.6.0" locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -4705,6 +4771,7 @@ locate-path@^2.0.0: locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" path-exists "^3.0.0" @@ -4712,46 +4779,42 @@ locate-path@^3.0.0: lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.isfinite@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" + integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= lodash.mergewith@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== lodash.tail@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" + integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= -lodash@^3.10.1: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.16.2, lodash@^4.17.4, lodash@^4.5.0, lodash@^4.5.1, lodash@~4.17.4: - version "4.17.4" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" - -lodash@^4.17.10: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - -lodash@^4.17.5: - version "4.17.5" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" +lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.16.2, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0, lodash@^4.5.1, lodash@~4.17.10: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== log4js@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.5.tgz#b80146bfebad68b430d4f3569556d8a6edfef303" + version "3.0.6" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.6.tgz#e6caced94967eeeb9ce399f9f8682a4b2b28c8ff" + integrity sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ== dependencies: circular-json "^0.5.5" date-format "^1.2.0" @@ -4760,22 +4823,26 @@ log4js@^3.0.0: streamroller "0.7.0" loglevel@^1.4.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.5.1.tgz#189078c94ab9053ee215a0acdbf24244ea0f6502" + version "1.6.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" + integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== dependencies: - js-tokens "^3.0.0" + js-tokens "^3.0.0 || ^4.0.0" loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" @@ -4783,15 +4850,9 @@ loud-rejection@^1.0.0: lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" + integrity sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0= -lru-cache@^4.0.1, lru-cache@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^4.1.2: +lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -4799,13 +4860,6 @@ lru-cache@^4.1.2: pseudomap "^1.0.2" yallist "^2.1.2" -lru-cache@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4814,32 +4868,30 @@ lru-cache@^5.1.1: yallist "^3.0.2" magic-string@^0.22.4: - version "0.22.4" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff" + version "0.22.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" + integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== dependencies: - vlq "^0.2.1" + vlq "^0.2.2" magic-string@^0.25.0: - version "0.25.0" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.0.tgz#1f3696f9931ff0a1ed4c132250529e19cad6759b" + version "0.25.2" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" + integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== dependencies: - sourcemap-codec "^1.4.1" + sourcemap-codec "^1.4.4" -make-dir@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" - dependencies: - pify "^3.0.0" - -make-dir@^1.3.0: +make-dir@^1.0.0, make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" make-error@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" + version "1.3.5" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" + integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== make-fetch-happen@^4.0.1: version "4.0.1" @@ -4859,53 +4911,68 @@ make-fetch-happen@^4.0.1: ssri "^6.0.0" map-age-cleaner@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== dependencies: p-defer "^1.0.0" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" +math-random@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== + md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== dependencies: hash-base "^3.0.0" inherits "^2.0.1" + safe-buffer "^5.1.2" media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: mimic-fn "^1.0.0" mem@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" + version "4.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.1.0.tgz#aeb9be2d21f47e78af29e4ac5978e8afa2ca5b8a" + integrity sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg== dependencies: map-age-cleaner "^0.1.1" mimic-fn "^1.0.0" - p-is-promise "^1.1.0" + p-is-promise "^2.0.0" memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" + integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -4913,6 +4980,7 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -4928,14 +4996,17 @@ meow@^3.7.0: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@2.3.11, micromatch@^2.1.5, micromatch@^2.3.11: +micromatch@2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -4951,27 +5022,10 @@ micromatch@2.3.11, micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.0" - define-property "^1.0.0" - extend-shallow "^2.0.1" - extglob "^2.0.2" - fragment-cache "^0.2.1" - kind-of "^6.0.0" - nanomatch "^1.2.5" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -micromatch@^3.1.8, micromatch@^3.1.9: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -4990,57 +5044,42 @@ micromatch@^3.1.8, micromatch@^3.1.9: miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.30.0 < 2": - version "1.31.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb" +"mime-db@>= 1.38.0 < 2", mime-db@~1.38.0: + version "1.38.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" + integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-db@~1.36.0: - version "1.36.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" - -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.22" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" + integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== dependencies: - mime-db "~1.30.0" + mime-db "~1.38.0" -mime-types@~2.1.18, mime-types@~2.1.19: - version "2.1.20" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" - dependencies: - mime-db "~1.36.0" - -mime@1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7" - -mime@1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" - -mime@1.4.1, mime@^1.2.11, mime@^1.4.1: +mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -"mime@>= 0.0.1": - version "2.0.3" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.0.3.tgz#4353337854747c48ea498330dc034f9f4bbbcc0b" +mime@^1.2.11, mime@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" + version "2.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" + integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== mimic-fn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== mini-css-extract-plugin@0.4.4: version "0.4.4" @@ -5051,40 +5090,39 @@ mini-css-extract-plugin@0.4.4: schema-utils "^1.0.0" webpack-sources "^1.1.0" -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minipass@^2.3.4, minipass@^2.3.5: +minipass@^2.2.1, minipass@^2.3.4, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -5092,12 +5130,6 @@ minipass@^2.3.4, minipass@^2.3.5: safe-buffer "^5.1.2" yallist "^3.0.0" -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - dependencies: - minipass "^2.2.1" - minizlib@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" @@ -5108,6 +5140,7 @@ minizlib@^1.1.1: mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== dependencies: concat-stream "^1.5.0" duplexify "^3.4.2" @@ -5123,6 +5156,7 @@ mississippi@^2.0.0: mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== dependencies: concat-stream "^1.5.0" duplexify "^3.4.2" @@ -5135,9 +5169,15 @@ mississippi@^3.0.0: stream-each "^1.1.0" through2 "^2.0.0" +mitt@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.3.tgz#528c506238a05dce11cd914a741ea2cc332da9b8" + integrity sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA== + mixin-deep@^1.2.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -5145,33 +5185,27 @@ mixin-deep@^1.2.0: mixin-object@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" + integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= dependencies: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" - -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" - dependencies: - minimist "0.0.8" - -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" moment@*: - version "2.19.1" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" + integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= dependencies: aproba "^1.1.1" copy-concurrently "^1.0.0" @@ -5180,25 +5214,10 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -ms@0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" - -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - -ms@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" - -ms@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-1.0.0.tgz#59adcd22edc543f7b5381862d31387b1f4bc9473" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.0.0, ms@^2.1.1: version "2.1.1" @@ -5208,56 +5227,36 @@ ms@^2.0.0, ms@^2.1.1: multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= multicast-dns@^6.0.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde" + version "6.2.3" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" + integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== dependencies: - dns-packet "^1.0.1" - thunky "^0.1.0" + dns-packet "^1.3.1" + thunky "^1.0.2" mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" - -nan@^2.3.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" - -nan@^2.9.2: - version "2.11.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" - -nanomatch@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^1.0.0" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - is-odd "^1.0.0" - kind-of "^5.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" +nan@^2.10.0, nan@^2.9.2: + version "2.12.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" + integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== nanomatch@^1.2.9: - version "1.2.9" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" + version "1.2.13" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" - is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" @@ -5268,6 +5267,7 @@ nanomatch@^1.2.9: needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" + integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -5276,14 +5276,17 @@ needle@^2.2.1: negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" + integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= neo-async@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" + version "2.6.0" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" + integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch-npm@^2.0.2: version "2.0.2" @@ -5294,13 +5297,15 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" -node-forge@0.6.33: - version "0.6.33" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" +node-forge@0.7.5: + version "0.7.5" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" + integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== node-gyp@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" + integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -5316,36 +5321,38 @@ node-gyp@^3.8.0: which "1" node-libs-browser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" + integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== dependencies: assert "^1.1.1" - browserify-zlib "^0.1.4" + browserify-zlib "^0.2.0" buffer "^4.3.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" + events "^3.0.0" + https-browserify "^1.0.0" + os-browserify "^0.3.0" path-browserify "0.0.0" - process "^0.11.0" + process "^0.11.10" punycode "^1.2.4" querystring-es3 "^0.2.0" - readable-stream "^2.0.5" + readable-stream "^2.3.3" stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^2.0.2" + stream-http "^2.7.2" + string_decoder "^1.0.0" + timers-browserify "^2.0.4" tty-browserify "0.0.0" url "^0.11.0" - util "^0.10.3" + util "^0.11.0" vm-browserify "0.0.4" node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" + integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -5358,41 +5365,10 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-pre-gyp@^0.6.36: - version "0.6.38" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" - dependencies: - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - dependencies: - detect-libc "^1.0.2" - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - -node-releases@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.6.tgz#47d160033e24a64e79487a62de63cf691052ec54" - integrity sha512-lODUVHEIZutZx+TDdOk47qLik8FJMXzJ+WnyUGci1MTvTOyzZrz5eVPIIpc5Hb3NfHZGeGHeuwrRYVI1PEITWg== +node-releases@^1.1.8: + version "1.1.9" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.9.tgz#70d0985ec4bf7de9f08fc481f5dae111889ca482" + integrity sha512-oic3GT4OtbWWKfRolz5Syw0Xus0KRFxeorLNj0s93ofX6PWyuzKjsiGxsCtWktBwwmTF6DdRRf2KreGqeOk5KA== dependencies: semver "^5.3.0" @@ -5421,51 +5397,52 @@ node-sass@4.10.0: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" -"nopt@2 || 3", nopt@3.0.x, nopt@3.x: +"nopt@2 || 3", nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.4.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== dependencies: hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" + resolve "^1.10.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-package-data@^2.4.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.2.tgz#6b2abd85774e51f7936f1395e45acb905dc849b2" - integrity sha512-YcMnjqeoUckXTPKZSAsPjUPLxH85XotbpqK3w4RyCwdFQSU5FxxBys8buehkSfg0j9fKvV1hn7O0+8reEgkAiw== - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= npm-bundled@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" + version "1.0.6" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" + integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== npm-package-arg@6.1.0, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: version "6.1.0" @@ -5477,17 +5454,10 @@ npm-package-arg@6.1.0, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: semver "^5.5.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.12: - version "1.2.0" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.2.0.tgz#55a60e793e272f00862c7089274439a4cc31fc7f" - integrity sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-packlist@^1.1.6: - version "1.1.11" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" +npm-packlist@^1.1.12, npm-packlist@^1.1.6: + version "1.4.1" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" + integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -5516,12 +5486,14 @@ npm-registry-fetch@^3.8.0: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -5531,38 +5503,37 @@ npm-run-path@^2.0.0: null-check@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" + integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0= num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" + integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1, oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - -object-assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" + integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -5571,16 +5542,19 @@ object-copy@^0.1.0: object-path@^0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" + integrity sha1-D9mnT8X60a45aLWGvaXGMr1sBaU= object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -5588,76 +5562,69 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" obuf@^1.0.0, obuf@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-headers@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + version "1.0.2" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" -open@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" - opener@~1.4.0: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" + integrity sha1-XG2ixdflgx6P+jlklQ+NZnSskLg= openurl@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" - -opn@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" - dependencies: - object-assign "^4.0.1" - pinkie-promise "^2.0.0" + integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c= opn@5.3.0: version "5.3.0" - resolved "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" + integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== dependencies: is-wsl "^1.1.0" -opn@5.4.0: +opn@5.4.0, opn@^5.1.0, opn@^5.3.0: version "5.4.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw== dependencies: is-wsl "^1.1.0" -opn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" - dependencies: - is-wsl "^1.1.0" - optimist@0.6.x, optimist@^0.6.1, optimist@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -5665,6 +5632,7 @@ optimist@0.6.x, optimist@^0.6.1, optimist@~0.6.0: optionator@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -5673,10 +5641,6 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" -options@>=0.0.5: - version "0.0.6" - resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" - original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -5684,50 +5648,50 @@ original@^1.0.0: dependencies: url-parse "^1.4.3" -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" +os-browserify@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" + integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= dependencies: lcid "^1.0.0" os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: execa "^0.7.0" lcid "^1.0.0" mem "^1.1.0" os-locale@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== dependencies: - execa "^0.10.0" + execa "^1.0.0" lcid "^2.0.0" mem "^4.0.0" os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -osenv@^0.1.5: +osenv@0, osenv@^0.1.4, osenv@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -5735,54 +5699,60 @@ osenv@^0.1.5: p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^1.1.0: - version "1.1.0" - resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" +p-is-promise@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" + integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg== -p-limit@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" +p-limit@^1.0.0, p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" -p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" - p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== dependencies: p-try "^2.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" + integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== pacote@9.4.0: version "9.4.0" @@ -5817,35 +5787,36 @@ pacote@9.4.0: unique-filename "^1.1.1" which "^1.3.1" -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - -pako@~1.0.2: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" +pako@~1.0.2, pako@~1.0.5: + version "1.0.10" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" + integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== parallel-transform@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= dependencies: cyclist "~0.2.2" inherits "^2.0.3" readable-stream "^2.1.5" parse-asn1@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" + version "5.1.4" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" + integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -5855,87 +5826,103 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= + parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - -parsejson@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" - dependencies: - better-assert "~1.0.0" + integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" + integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= dependencies: better-assert "~1.0.0" parseuri@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" + integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= dependencies: better-assert "~1.0.0" -parseurl@~1.3.1, parseurl@~1.3.2: +parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" + integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" + integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-parse@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -5944,18 +5931,21 @@ path-type@^1.0.0: path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= dependencies: pify "^2.0.0" path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" pbkdf2@^3.0.3: - version "3.0.14" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" + version "3.0.17" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" + integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5966,62 +5956,68 @@ pbkdf2@^3.0.3: pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= phantomjs-prebuilt@^2.1.7: - version "2.1.15" - resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.15.tgz#20f86e82d3349c505917527745b7a411e08b3903" + version "2.1.16" + resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" + integrity sha1-79ISpKOWbTZHaE6ouniFSb4q7+8= dependencies: - es6-promise "~4.0.3" - extract-zip "~1.6.5" - fs-extra "~1.0.0" - hasha "~2.2.0" - kew "~0.7.0" - progress "~1.1.8" - request "~2.81.0" - request-progress "~2.0.1" - which "~1.2.10" + es6-promise "^4.0.3" + extract-zip "^1.6.5" + fs-extra "^1.0.0" + hasha "^2.2.0" + kew "^0.7.0" + progress "^1.1.8" + request "^2.81.0" + request-progress "^2.0.1" + which "^1.2.10" pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: find-up "^2.1.0" pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" + integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== dependencies: find-up "^3.0.0" portfinder@0.4.x: version "0.4.0" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-0.4.0.tgz#a3ffadffafe4fb98e0601a85eda27c27ce84ca1e" + integrity sha1-o/+t/6/k+5jgYBqF7aJ8J86Eyh4= dependencies: async "0.9.0" mkdirp "0.5.x" @@ -6029,14 +6025,16 @@ portfinder@0.4.x: portfinder@1.0.17: version "1.0.17" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" + integrity sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ== dependencies: async "^1.5.2" debug "^2.2.0" mkdirp "0.5.x" portfinder@^1.0.9: - version "1.0.13" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + version "1.0.20" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== dependencies: async "^1.5.2" debug "^2.2.0" @@ -6045,6 +6043,7 @@ portfinder@^1.0.9: portscanner@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" + integrity sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y= dependencies: async "1.5.2" is-number-like "^1.0.3" @@ -6052,10 +6051,12 @@ portscanner@2.1.1: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-import@12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.0.tgz#149f96a4ef0b27525c419784be8517ebd17e92c5" + integrity sha512-3KqKRZcaZAvxbY8DVLdd81tG5uKzbUQuiWIvy0o0fzEC42bKacqPYFWbfCQyw6L4LWUaqPz/idvIdbhpgQ32eQ== dependencies: postcss "^7.0.1" postcss-value-parser "^3.2.3" @@ -6065,6 +6066,7 @@ postcss-import@12.0.0: postcss-load-config@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" + integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ== dependencies: cosmiconfig "^4.0.0" import-cwd "^2.0.0" @@ -6072,30 +6074,28 @@ postcss-load-config@^2.0.0: postcss-loader@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" + integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== dependencies: loader-utils "^1.1.0" postcss "^7.0.0" postcss-load-config "^2.0.0" schema-utils "^1.0.0" -postcss-value-parser@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" - -postcss-value-parser@^3.3.1: +postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss@7.0.5, postcss@^7.0.0, postcss@^7.0.1: +postcss@7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55" + integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ== dependencies: chalk "^2.4.1" source-map "^0.6.1" supports-color "^5.5.0" -postcss@^7.0.5: +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5: version "7.0.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== @@ -6107,30 +6107,32 @@ postcss@^7.0.5: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -process@^0.11.0: +process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@~1.1.8: +progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise-retry@^1.1.1: version "1.1.1" @@ -6143,6 +6145,7 @@ promise-retry@^1.1.1: promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" @@ -6154,10 +6157,10 @@ protoduck@^5.0.1: genfun "^5.0.0" protractor@~5.4.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.1.tgz#011a99e38df7aa45d22455b889ffbb13a6ce0bd9" + version "5.4.2" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.2.tgz#329efe37f48b2141ab9467799be2d4d12eb48c13" + integrity sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA== dependencies: - "@types/node" "^6.0.46" "@types/q" "^0.0.32" "@types/selenium-webdriver" "^3.0.0" blocking-proxy "^1.0.0" @@ -6174,52 +6177,45 @@ protractor@~5.4.0: webdriver-js-extender "2.1.0" webdriver-manager "^12.0.6" -proxy-addr@~2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.5.2" - -proxy-addr@~2.0.3: +proxy-addr@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" + integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== dependencies: forwarded "~0.1.2" ipaddr.js "1.8.0" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: - version "1.1.29" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" + version "1.1.31" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" + integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" + safe-buffer "^5.1.2" -pump@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^2.0.1: +pump@^2.0.0, pump@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -6227,121 +6223,128 @@ pump@^2.0.1: pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" once "^1.3.1" pumpify@^1.3.3: - version "1.3.5" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" + version "1.5.1" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" + integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== dependencies: - duplexify "^3.1.2" - inherits "^2.0.1" - pump "^1.0.0" + duplexify "^3.6.0" + inherits "^2.0.3" + pump "^2.0.0" punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== q@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" + integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= q@^1.4.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qjobs@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" + version "1.2.0" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" + integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== -qs@0.4.x: - version "0.4.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f" +qs@6.2.3: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4= -qs@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" - -qs@6.5.1, "qs@>= 0.4.0", qs@~6.5.1: - version "6.5.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" +qs@6.5.2, qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== qs@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha1-6eha2+ddoLvkyOBHaghikPhjtAQ= querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" + integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" +randomatic@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" -randombytes@^2.0.0, randombytes@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" + integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= -raw-body@2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" +raw-body@2.3.3, raw-body@^2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" + integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== dependencies: bytes "3.0.0" - http-errors "1.6.2" - iconv-lite "0.4.19" + http-errors "1.6.3" + iconv-lite "0.4.23" unpipe "1.0.0" raw-loader@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - -rc@^1.1.7: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" + integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" ini "~1.3.0" @@ -6351,12 +6354,14 @@ rc@^1.2.7: read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= dependencies: pify "^2.3.0" read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -6364,6 +6369,7 @@ read-pkg-up@^1.0.1: read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: find-up "^2.0.0" read-pkg "^2.0.0" @@ -6371,6 +6377,7 @@ read-pkg-up@^2.0.0: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -6379,26 +6386,25 @@ read-pkg@^1.0.0: read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= dependencies: load-json-file "^2.0.0" normalize-package-data "^2.3.2" path-type "^2.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.2.9: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" -readable-stream@^2.3.0: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -6408,62 +6414,51 @@ readable-stream@^2.3.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" +readdirp@^2.0.0, readdirp@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~0.10.x" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" + graceful-fs "^4.1.11" + micromatch "^3.1.10" readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= dependencies: resolve "^1.1.6" redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" reflect-metadata@^0.1.2: - version "0.1.10" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a" + version "0.1.13" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" + integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" -regex-not@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" - dependencies: - extend-shallow "^2.0.1" - -regex-not@^1.0.2: +regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" @@ -6471,115 +6466,41 @@ regex-not@^1.0.2: remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" + integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== repeat-string@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" + integrity sha1-x6jTI2BoNiBZp+RlH8aITosftK4= repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" -request-progress@~2.0.1: +request-progress@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" + integrity sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg= dependencies: throttleit "^1.0.0" -request@2.81.0, request@~2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -request@^2.78.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.83.0: - version "2.85.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - hawk "~6.0.2" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - stringstream "~0.0.5" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.87.0, request@^2.88.0: +request@^2.81.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" + integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -6605,52 +6526,64 @@ request@^2.87.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= requires-port@1.x.x, requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.1.7, resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== dependencies: - path-parse "^1.0.5" - -resolve@^1.3.2: - version "1.7.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" - dependencies: - path-parse "^1.0.5" + path-parse "^1.0.6" resp-modifier@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" + integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08= dependencies: debug "^2.2.0" minimatch "^3.0.2" @@ -6658,6 +6591,7 @@ resp-modifier@6.0.2: restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -6665,43 +6599,46 @@ restore-cursor@^2.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= rfdc@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349" + integrity sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA== right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== dependencies: - glob "^7.0.5" - -rimraf@~2.2.6: - version "2.2.8" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + glob "^7.1.3" ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== dependencies: - hash-base "^2.0.0" + hash-base "^3.0.0" inherits "^2.0.1" rollup-plugin-commonjs@^8.0.2: - version "8.2.5" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.5.tgz#924421278a6f879fd976b2ef1a28391b1e4f2a6e" + version "8.4.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" + integrity sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A== dependencies: - acorn "^5.1.2" + acorn "^5.2.1" estree-walker "^0.5.0" magic-string "^0.22.4" resolve "^1.4.0" @@ -6710,6 +6647,7 @@ rollup-plugin-commonjs@^8.0.2: rollup-plugin-node-resolve@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.0.0.tgz#07e0ae94ac002a3ea36e8f33ca121d9f836b1309" + integrity sha1-B+CulKwAKj6jbo8zyhIdn4NrEwk= dependencies: browser-resolve "^1.11.0" builtin-modules "^1.1.0" @@ -6718,75 +6656,91 @@ rollup-plugin-node-resolve@2.0.0: rollup-plugin-uglify@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-1.0.2.tgz#d4aa6f5df13522eae1ba17780c7c4c7096038359" + integrity sha1-1KpvXfE1Iurhuhd4DHxMcJYDg1k= dependencies: uglify-js "^2.6.1" rollup-pluginutils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" + version "2.4.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.4.1.tgz#de43ab54965bbf47843599a7f3adceb723de38db" + integrity sha512-wesMQ9/172IJDIW/lYWm0vW0LiKe5Ekjws481R7z9WTRtmO59cqyM/2uUlxvf6yzm/fElFmHUobeQOYz46dZJw== dependencies: - estree-walker "^0.3.0" - micromatch "^2.3.11" + estree-walker "^0.6.0" + micromatch "^3.1.10" rollup@^0.41.6: version "0.41.6" resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" + integrity sha1-4NBUl4d6OYwQTYFtJzOnGKepTio= dependencies: source-map-support "^0.4.0" run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: aproba "^1.1.1" rx@2.3.24: version "2.3.24" resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" + integrity sha1-FPlQpCF9fjXapxu8vljv9o6ksrc= rx@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= -rxjs@6.3.3, rxjs@^6.3.0: +rxjs@6.3.3: version "6.3.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" + integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== dependencies: tslib "^1.9.0" -rxjs@^6.1.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" +rxjs@^5.5.6: + version "5.5.12" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +rxjs@^6.1.0, rxjs@^6.3.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== dependencies: tslib "^1.9.0" -safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -safe-buffer@^5.1.2: +safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" + integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= dependencies: glob "^7.0.0" lodash "^4.0.0" @@ -6796,6 +6750,7 @@ sass-graph@^2.2.4: sass-loader@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" + integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w== dependencies: clone-deep "^2.0.1" loader-utils "^1.0.1" @@ -6807,26 +6762,31 @@ sass-loader@7.1.0: saucelabs@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" + integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ== dependencies: https-proxy-agent "^2.2.1" sax@0.5.x: version "0.5.8" resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" + integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== schema-utils@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" + integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= dependencies: ajv "^5.0.0" schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" + version "0.4.7" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" + integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== dependencies: ajv "^6.1.0" ajv-keywords "^3.1.0" @@ -6834,6 +6794,7 @@ schema-utils@^0.4.4, schema-utils@^0.4.5: schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: ajv "^6.1.0" ajv-errors "^1.0.0" @@ -6842,6 +6803,7 @@ schema-utils@^1.0.0: scss-tokenizer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" + integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= dependencies: js-base64 "^2.1.8" source-map "^0.4.2" @@ -6849,10 +6811,12 @@ scss-tokenizer@^0.2.3: select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: version "3.6.0" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" + integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q== dependencies: jszip "^3.1.3" rimraf "^2.5.4" @@ -6860,77 +6824,38 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: xml2js "^0.4.17" selfsigned@^1.9.1: - version "1.10.1" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52" + version "1.10.4" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" + integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== dependencies: - node-forge "0.6.33" + node-forge "0.7.5" semver-intersect@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.4.0.tgz#bdd9c06bedcdd2fedb8cd352c3c43ee8c61321f3" + integrity sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ== dependencies: semver "^5.0.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -semver@5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" - -semver@5.6.0, semver@^5.4.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@5.6.0, semver@^5.0.0, semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== -semver@^5.0.0, semver@^5.0.1, semver@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@5.5.1: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -send@0.15.2: - version "0.15.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.15.2.tgz#f91fab4403bcf87e716f70ceb5db2f578bdc17d6" - dependencies: - debug "2.6.4" - depd "~1.1.0" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.0" - fresh "0.5.0" - http-errors "~1.6.1" - mime "1.3.4" - ms "1.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" - -send@0.16.1: - version "0.16.1" - resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" - dependencies: - debug "2.6.9" - depd "~1.1.1" - destroy "~1.0.4" - encodeurl "~1.0.1" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.6.2" - mime "1.4.1" - ms "2.0.0" - on-finished "~2.3.0" - range-parser "~1.2.0" - statuses "~1.3.1" + integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" + integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" depd "~1.1.2" @@ -6947,24 +6872,14 @@ send@0.16.2: statuses "~1.4.0" serialize-javascript@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005" + version "1.6.1" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" + integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== -serve-index@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b" - dependencies: - accepts "~1.3.3" - batch "0.5.3" - debug "~2.2.0" - escape-html "~1.0.3" - http-errors "~1.5.0" - mime-types "~2.1.11" - parseurl "~1.3.1" - -serve-index@^1.7.2: +serve-index@1.9.1, serve-index@^1.7.2: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= dependencies: accepts "~1.3.4" batch "0.6.1" @@ -6974,27 +6889,10 @@ serve-index@^1.7.2: mime-types "~2.1.17" parseurl "~1.3.2" -serve-static@1.12.2: - version "1.12.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.2.tgz#e546e2726081b81b4bcec8e90808ebcdd323afba" - dependencies: - encodeurl "~1.0.1" - escape-html "~1.0.3" - parseurl "~1.3.1" - send "0.15.2" - -serve-static@1.13.1: - version "1.13.1" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" - dependencies: - encodeurl "~1.0.1" - escape-html "~1.0.3" - parseurl "~1.3.2" - send "0.16.1" - serve-static@1.13.2: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" + integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -7004,24 +6902,22 @@ serve-static@1.13.2: server-destroy@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" + integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-getter@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" - dependencies: - to-object-path "^0.3.0" - -set-immediate-shim@^1.0.1: +set-immediate-shim@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -7031,6 +6927,7 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -7040,22 +6937,17 @@ set-value@^2.0.0: setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - -setprototypeof@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" - -setprototypeof@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.9" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -7063,6 +6955,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: shallow-clone@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" + integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA== dependencies: is-extendable "^0.1.1" kind-of "^5.0.0" @@ -7071,16 +6964,19 @@ shallow-clone@^1.0.0: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shelljs@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" + version "0.8.3" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" + integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -7089,10 +6985,12 @@ shelljs@^0.8.1: signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= smart-buffer@4.0.2: version "4.0.2" @@ -7102,6 +7000,7 @@ smart-buffer@4.0.2: snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -7110,12 +7009,14 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + version "0.8.2" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== dependencies: base "^0.11.1" debug "^2.2.0" @@ -7124,50 +7025,17 @@ snapdragon@^0.8.1: map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" - use "^2.0.0" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -sntp@2.x.x: - version "2.1.0" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" - dependencies: - hoek "4.x.x" - -socket.io-adapter@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" - dependencies: - debug "2.3.3" - socket.io-parser "2.3.1" + use "^3.1.0" socket.io-adapter@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" - -socket.io-client@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" - dependencies: - backo2 "1.0.2" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "2.3.3" - engine.io-client "1.8.0" - has-binary "0.1.7" - indexof "0.0.1" - object-component "0.0.3" - parseuri "0.0.5" - socket.io-parser "2.3.1" - to-array "0.1.4" + integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= socket.io-client@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" + integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== dependencies: backo2 "1.0.2" base64-arraybuffer "0.1.5" @@ -7184,38 +7052,48 @@ socket.io-client@2.1.1: socket.io-parser "~3.2.0" to-array "0.1.4" -socket.io-parser@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" +socket.io-client@^2.0.4: + version "2.2.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" + integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== dependencies: - component-emitter "1.1.2" - debug "2.2.0" - isarray "0.0.1" - json3 "3.3.2" + backo2 "1.0.2" + base64-arraybuffer "0.1.5" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "~3.1.0" + engine.io-client "~3.3.1" + has-binary2 "~1.0.2" + has-cors "1.1.0" + indexof "0.0.1" + object-component "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + socket.io-parser "~3.3.0" + to-array "0.1.4" socket.io-parser@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" + integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== dependencies: component-emitter "1.2.1" debug "~3.1.0" isarray "2.0.1" -socket.io@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" +socket.io-parser@~3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" + integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== dependencies: - debug "2.3.3" - engine.io "1.8.0" - has-binary "0.1.7" - object-assign "4.1.0" - socket.io-adapter "0.5.0" - socket.io-client "1.6.0" - socket.io-parser "2.3.1" + component-emitter "1.2.1" + debug "~3.1.0" + isarray "2.0.1" socket.io@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" + integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== dependencies: debug "~3.1.0" engine.io "~3.2.0" @@ -7239,6 +7117,7 @@ sockjs-client@1.3.0: sockjs@0.3.19: version "0.3.19" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== dependencies: faye-websocket "^0.10.0" uuid "^3.0.1" @@ -7260,46 +7139,52 @@ socks@~2.2.0: smart-buffer "4.0.2" source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" + version "2.0.1" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== source-list-map@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" + integrity sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY= source-map-explorer@^1.3.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-1.5.0.tgz#654e2ba0db158fecfc99b9cefdf891b755b767d1" + version "1.7.0" + resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-1.7.0.tgz#d6ff79eaf11990223c35ced78788c09d6e864968" + integrity sha512-S9Tb48Ia4ozNLvr0khOzygfoFjtzRVLD/h2I0VzwUoWz+rmuvNMzuzmbAHcK7/F6Gley3yhr1Mhoavokv5qg8A== dependencies: btoa "^1.1.2" convert-source-map "^1.1.1" docopt "^0.6.2" + ejs "^2.6.1" glob "^7.1.2" - open "0.0.5" + opn "^5.3.0" source-map "^0.5.1" - temp "^0.8.3" - underscore "^1.8.3" + temp "^0.9.0" source-map-loader@0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.4.tgz#c18b0dc6e23bf66f6792437557c569a11e072271" + integrity sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ== dependencies: async "^2.5.0" loader-utils "^1.1.0" source-map-resolve@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + version "0.5.2" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" + integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== dependencies: - atob "^2.0.0" + atob "^2.1.1" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@0.5.9, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.6: +source-map-support@0.5.9: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -7307,72 +7192,104 @@ source-map-support@0.5.9, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@^0.4.0, source-map-support@~0.4.0: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" +source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.9: + version "0.5.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" + integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" + integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= dependencies: amdefine ">=0.0.4" source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" + integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= source-map@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" + integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@^0.4.2, source-map@^0.4.4, source-map@~0.4.1: +source-map@^0.4.2, source-map@~0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= dependencies: amdefine ">=0.0.4" -sourcemap-codec@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz#c8fd92d91889e902a07aee392bdd2c5863958ba2" +sourcemap-codec@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== spawn-command@^0.0.2-1: - version "0.0.2" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" + version "0.0.2-1" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" + integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" +spdx-correct@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" + integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" +spdx-exceptions@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" + integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" + integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g== spdy-transport@^2.0.18: - version "2.0.20" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" + version "2.1.1" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.1.tgz#c54815d73858aadd06ce63001e7d25fa6441623b" + integrity sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q== dependencies: debug "^2.6.8" detect-node "^2.0.3" @@ -7385,6 +7302,7 @@ spdy-transport@^2.0.18: spdy@^3.4.1: version "3.4.7" resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw= dependencies: debug "^2.6.8" handle-thing "^1.2.5" @@ -7403,42 +7321,48 @@ speed-measure-webpack-plugin@1.2.3: split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + version "1.16.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" ecc-jsbn "~0.1.1" + getpass "^0.1.1" jsbn "~0.1.0" + safer-buffer "^2.0.2" tweetnacl "~0.14.0" ssri@^5.2.4: version "5.3.0" resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" + integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== dependencies: safe-buffer "^5.1.1" ssri@^6.0.0, ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: figgy-pudding "^3.5.1" static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -7446,54 +7370,68 @@ static-extend@^0.1.1: stats-webpack-plugin@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz#ccffe9b745de8bbb155571e063f8263fc0e2bc06" + integrity sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ== dependencies: lodash "^4.17.4" -"statuses@>= 1.3.1 < 2", statuses@~1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= -statuses@~1.3.0, statuses@~1.3.1: +statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= + +statuses@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== stdout-stream@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" + version "1.4.1" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" + integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== dependencies: readable-stream "^2.0.1" stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" + version "2.0.2" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" + integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== dependencies: inherits "~2.0.1" readable-stream "^2.0.2" stream-each@^1.1.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + version "1.2.3" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" + integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== dependencies: end-of-stream "^1.1.0" stream-shift "^1.0.0" -stream-http@^2.3.1: - version "2.7.2" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" +stream-http@^2.7.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" + integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.2.6" + readable-stream "^2.3.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= stream-throttle@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" + integrity sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM= dependencies: commander "^2.2.0" limiter "^1.0.5" @@ -7501,6 +7439,7 @@ stream-throttle@^0.1.3: streamroller@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" + integrity sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ== dependencies: date-format "^1.2.0" debug "^3.1.0" @@ -7510,53 +7449,45 @@ streamroller@0.7.0: string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@^0.10.25, string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" +string_decoder@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== dependencies: safe-buffer "~5.1.0" string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" -stringstream@~0.0.4, stringstream@~0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" - dependencies: - ansi-regex "^0.2.1" - strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" @@ -7570,26 +7501,31 @@ strip-ansi@^5.0.0: strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= style-loader@0.23.1: version "0.23.1" @@ -7602,6 +7538,7 @@ style-loader@0.23.1: stylus-loader@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" + integrity sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA== dependencies: loader-utils "^1.0.2" lodash.clonedeep "^4.5.0" @@ -7610,6 +7547,7 @@ stylus-loader@3.0.2: stylus@0.54.5: version "0.54.5" resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" + integrity sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk= dependencies: css-parse "1.7.x" debug "*" @@ -7618,103 +7556,64 @@ stylus@0.54.5: sax "0.5.x" source-map "0.1.x" -supports-color@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" - supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.1.0, supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" -supports-color@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" - dependencies: - has-flag "^2.0.0" - -supports-color@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" - dependencies: - has-flag "^2.0.0" - -supports-color@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" - dependencies: - has-flag "^3.0.0" - -supports-color@^5.4.0, supports-color@^5.5.0: +supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: +supports-color@^6.0.0, supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= + symbol-observable@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== systemjs@0.19.39: version "0.19.39" resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-0.19.39.tgz#e513e6f91a25a37b8b607c51c7989ee0d67b9356" + integrity sha1-5RPm+Rolo3uLYHxRx5ie4NZ7k1Y= dependencies: when "^3.7.5" -tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" +tapable@^1.0.0, tapable@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== -tapable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" - -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.0.0, tar@^2.2.1: +tar@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= dependencies: block-stream "*" fstream "^1.0.2" inherits "2" -tar@^4: - version "4.4.6" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.3.3" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.2" - -tar@^4.4.8: +tar@^4, tar@^4.4.8: version "4.4.8" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== @@ -7727,16 +7626,17 @@ tar@^4.4.8: safe-buffer "^5.1.2" yallist "^3.0.2" -temp@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" +temp@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.0.tgz#61391795a11bd9738d4c4d7f55f012cb8f55edaa" + integrity sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ== dependencies: - os-tmpdir "^1.0.0" - rimraf "~2.2.6" + rimraf "~2.6.2" terser-webpack-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" + integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA== dependencies: cacache "^11.0.2" find-cache-dir "^2.0.0" @@ -7748,16 +7648,18 @@ terser-webpack-plugin@1.1.0: worker-farm "^1.5.2" terser@^3.8.1: - version "3.8.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.2.tgz#48b880f949f8d038aca4dfd00a37c53d96ecf9fb" + version "3.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493" + integrity sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow== dependencies: commander "~2.17.1" source-map "~0.6.1" - source-map-support "~0.5.6" + source-map-support "~0.5.9" tfunk@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b" + integrity sha1-OORBT8ZJd9h6/apy+sttKfgve1s= dependencies: chalk "^1.1.1" object-path "^0.9.0" @@ -7765,120 +7667,131 @@ tfunk@^3.0.1: throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" + integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== dependencies: - readable-stream "^2.1.5" + readable-stream "~2.3.6" xtend "~4.0.1" "through@>=2.2.7 <3", through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -thunky@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e" +thunky@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" + integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== -timers-browserify@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" +timers-browserify@^2.0.4: + version "2.0.10" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" + integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== dependencies: setimmediate "^1.0.4" tmp@0.0.30: version "0.0.30" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" + integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0= dependencies: os-tmpdir "~1.0.1" tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" + integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" -to-regex@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" - dependencies: - define-property "^0.2.5" - extend-shallow "^2.0.1" - regex-not "^1.0.0" - -to-regex@^3.0.2: +to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" regex-not "^1.0.2" safe-regex "^1.1.0" -tough-cookie@~2.3.0, tough-cookie@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - dependencies: - punycode "^1.4.1" - tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" + integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: psl "^1.1.24" punycode "^1.4.1" -tree-kill@1.2.0, tree-kill@^1.1.0: +tree-kill@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" + integrity sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg== + +tree-kill@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" + integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= "true-case-path@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" + version "1.0.3" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" + integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== dependencies: - glob "^6.0.4" + glob "^7.1.2" ts-loader@^4.2.0: - version "4.4.1" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.4.1.tgz#c93a46eea430ebce1f790dfe438caefb8670d365" + version "4.5.0" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.5.0.tgz#a1ce70b2dc799941fb2197605f0d67874097859b" + integrity sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw== dependencies: chalk "^2.3.0" enhanced-resolve "^4.0.0" @@ -7889,6 +7802,7 @@ ts-loader@^4.2.0: ts-node@~7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" + integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== dependencies: arrify "^1.0.0" buffer-from "^1.1.0" @@ -7899,17 +7813,15 @@ ts-node@~7.0.0: source-map-support "^0.5.6" yn "^2.0.0" -tslib@^1.8.0, tslib@^1.8.1: - version "1.9.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" - -tslib@^1.9.0: +tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== tslint@~5.11.0: version "5.11.0" resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" + integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0= dependencies: babel-code-frame "^6.22.0" builtin-modules "^1.1.1" @@ -7927,39 +7839,38 @@ tslint@~5.11.0: tsutils@^2.27.2: version "2.29.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" + integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== dependencies: tslib "^1.8.1" tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" + integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" -type-is@~1.6.15: - version "1.6.15" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" - dependencies: - media-typer "0.3.0" - mime-types "~2.1.15" - type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" + integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== dependencies: media-typer "0.3.0" mime-types "~2.1.18" @@ -7967,8 +7878,9 @@ type-is@~1.6.16: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.1.6: +typescript@3.1.6, typescript@~3.1.1: version "3.1.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== @@ -7978,24 +7890,23 @@ typescript@3.2.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d" integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg== -typescript@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.1.tgz#3362ba9dd1e482ebb2355b02dfe8bcd19a2c7c96" - -ua-parser-js@0.7.12: - version "0.7.12" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" +ua-parser-js@0.7.17: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + integrity sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g== uglify-es@^3.3.4: - version "3.3.8" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.8.tgz#f2c68e6cff0d0f9dc9577e4da207151c2e753b7e" + version "3.3.9" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" + integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== dependencies: commander "~2.13.0" source-map "~0.6.1" -uglify-js@^2.6, uglify-js@^2.6.1: +uglify-js@^2.6.1: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -8005,6 +7916,7 @@ uglify-js@^2.6, uglify-js@^2.6.1: uglify-js@^3.1.4: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" + integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -8012,10 +7924,12 @@ uglify-js@^3.1.4: uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= uglifyjs-webpack-plugin@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.4.tgz#5eec941b2e9b8538be0a20fc6eda25b14c7c1043" + version "1.3.0" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" + integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -8026,29 +7940,15 @@ uglifyjs-webpack-plugin@^1.2.4: webpack-sources "^1.1.0" worker-farm "^1.5.2" -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -ultron@1.0.x: - version "1.0.2" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" - ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - -underscore@1.7.x: - version "1.7.0" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" - -underscore@^1.8.3: - version "1.8.3" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -8058,16 +7958,11 @@ union-value@^1.0.0: union@~0.4.3: version "0.4.6" resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0" + integrity sha1-GY+9rrolTniLDvy2MLwR8kopWeA= dependencies: qs "~2.3.3" -unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" - dependencies: - unique-slug "^2.0.0" - -unique-filename@^1.1.1: +unique-filename@^1.1.0, unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== @@ -8075,49 +7970,51 @@ unique-filename@^1.1.1: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + version "2.0.1" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" + integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== dependencies: imurmurhash "^0.1.4" universalify@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.0.0, upath@^1.0.5: +upath@^1.0.5, upath@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - -uri-js@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa" - dependencies: - punycode "^2.1.0" + integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" + integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-join@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" + integrity sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg= url-parse@^1.4.3: version "1.4.4" @@ -8130,21 +8027,20 @@ url-parse@^1.4.3: url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" + integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" -use@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" - dependencies: - define-property "^0.2.5" - isobject "^3.0.0" - lazy-cache "^2.0.2" +use@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== useragent@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" + integrity sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4= dependencies: lru-cache "2.2.x" tmp "0.0.x" @@ -8152,135 +8048,150 @@ useragent@2.2.1: util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util@0.10.3, util@^0.10.3: +util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" + integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" -utils-merge@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" +util@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" + integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== + dependencies: + inherits "2.0.3" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.0, uuid@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -uuid@^3.0.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" - -uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== v8-compile-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" + integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: builtins "^1.0.3" vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -vlq@^0.2.1: +vlq@^0.2.2: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" + integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" + integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= dependencies: indexof "0.0.1" void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" + integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= watchpack@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed" + version "1.6.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" + integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" wbuf@^1.1.0, wbuf@^1.7.2: - version "1.7.2" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" web-animations-js@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/web-animations-js/-/web-animations-js-2.3.1.tgz#3a6d9bc15196377a90f8e2803fa5262165b04510" + integrity sha1-Om2bwVGWN3qQ+OKAP6UmIWWwRRA= webdriver-js-extender@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" + integrity sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ== dependencies: "@types/selenium-webdriver" "^3.0.0" selenium-webdriver "^3.0.1" webdriver-manager@^12.0.6: - version "12.0.6" - resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.0.6.tgz#3df1a481977010b4cbf8c9d85c7a577828c0e70b" + version "12.1.1" + resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.1.tgz#66c3271f69cefdaa9fdfca617ae95afae41c3c62" + integrity sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA== dependencies: - adm-zip "^0.4.7" + adm-zip "^0.4.9" chalk "^1.1.1" del "^2.2.0" glob "^7.0.3" ini "^1.3.4" minimist "^1.2.0" q "^1.4.1" - request "^2.78.0" + request "^2.87.0" rimraf "^2.5.2" semver "^5.3.0" xml2js "^0.4.17" webpack-cli@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.2.3.tgz#13653549adfd8ccd920ad7be1ef868bacc22e346" + integrity sha512-Ik3SjV6uJtWIAN5jp5ZuBMWEAaP5E4V78XJ2nI+paFPh8v4HPSwo/myN0r29Xc/6ZKnd2IdrAlpSgNOu2CDQ6Q== dependencies: chalk "^2.4.1" cross-spawn "^6.0.5" enhanced-resolve "^4.1.0" - global-modules-path "^2.3.0" + findup-sync "^2.0.0" + global-modules "^1.0.0" import-local "^2.0.0" interpret "^1.1.0" loader-utils "^1.1.0" supports-color "^5.5.0" v8-compile-cache "^2.0.2" - yargs "^12.0.2" + yargs "^12.0.4" webpack-core@^0.6.8: version "0.6.9" resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" + integrity sha1-/FcViMhVjad76e+23r3Fo7FyvcI= dependencies: source-list-map "~0.1.7" source-map "~0.4.1" @@ -8332,6 +8243,7 @@ webpack-dev-server@3.1.10: webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== dependencies: ansi-colors "^3.0.0" uuid "^3.3.2" @@ -8339,17 +8251,19 @@ webpack-log@^2.0.0: webpack-merge@4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" + integrity sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ== dependencies: lodash "^4.17.5" -webpack-sources@1.2.0, webpack-sources@^1.2.0: +webpack-sources@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" + integrity sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-sources@1.3.0, webpack-sources@^1.3.0: +webpack-sources@1.3.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== @@ -8357,16 +8271,10 @@ webpack-sources@1.3.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - webpack-subresource-integrity@1.1.0-rc.6: version "1.1.0-rc.6" resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz#37f6f1264e1eb378e41465a98da80fad76ab8886" + integrity sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w== dependencies: webpack-core "^0.6.8" @@ -8403,97 +8311,86 @@ webpack@4.23.1: websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= dependencies: http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d" - -weinre@^2.0.0-pre-I0Z7U9OV: - version "2.0.0-pre-I0Z7U9OV" - resolved "https://registry.yarnpkg.com/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz#fef8aa223921f7b40bbbbd4c3ed4302f6fd0a813" - dependencies: - express "2.5.x" - nopt "3.0.x" - underscore "1.7.x" + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== when@^3.7.5: version "3.7.8" resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" + integrity sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I= when@~3.6.x: version "3.6.4" resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" + integrity sha1-RztRfsFZ4rhQBUl6E5g/CVQS404= which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.1.1, which@^1.2.1, which@^1.2.9: - version "1.3.0" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" - dependencies: - isexe "^2.0.0" - -which@^1.3.1: +which@1, which@^1.1.1, which@^1.2.1, which@^1.2.10, which@^1.2.14, which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -which@~1.2.10: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - dependencies: - isexe "^2.0.0" - wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - string-width "^1.0.2" + string-width "^1.0.2 || 2" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - -window-size@^0.1.2: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" + integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= worker-farm@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae" + version "1.6.0" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" + integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== dependencies: - errno "^0.1.4" - xtend "^4.0.1" + errno "~0.1.7" wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -8501,100 +8398,117 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -ws@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" - dependencies: - options ">=0.0.5" - ultron "1.0.x" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= ws@~3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== dependencies: async-limiter "~1.0.0" safe-buffer "~5.1.0" ultron "~1.1.0" -wtf-8@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" +ws@~6.1.0: + version "6.1.4" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" + integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== + dependencies: + async-limiter "~1.0.0" xhr2@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" + integrity sha1-f4dliEdxbbUCYyOBL4GMras4el8= xml2js@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" + integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== dependencies: sax ">=0.6.0" xmlbuilder "~9.0.1" xmlbuilder@~9.0.1: - version "9.0.4" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f" - -xmlhttprequest-ssl@1.5.3: - version "1.5.3" - resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" + integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= xmlhttprequest-ssl@~1.5.4: version "1.5.5" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" + integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" + integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -y18n@^3.2.0, y18n@^3.2.1: +y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== yargs-parser@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: camelcase "^4.1.0" -yargs-parser@^4.1.0: +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^4.1.0, yargs-parser@^4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw= dependencies: camelcase "^3.0.0" yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= dependencies: camelcase "^3.0.0" yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" + integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= dependencies: camelcase "^4.1.0" -yargs@12.0.2, yargs@^12.0.2: +yargs@12.0.2: version "12.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" + integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== dependencies: cliui "^4.0.0" decamelize "^2.0.0" @@ -8609,20 +8523,10 @@ yargs@12.0.2, yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" -yargs@3.29.0: - version "3.29.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.29.0.tgz#1aab9660eae79d8b8f675bcaeeab6ee34c2cf69c" - dependencies: - camelcase "^1.2.1" - cliui "^3.0.3" - decamelize "^1.0.0" - os-locale "^1.4.0" - window-size "^0.1.2" - y18n "^3.2.0" - yargs@6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.4.0.tgz#816e1a866d5598ccf34e5596ddce22d92da490d4" + integrity sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ= dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -8639,9 +8543,29 @@ yargs@6.4.0: y18n "^3.2.1" yargs-parser "^4.1.0" +yargs@6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg= + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + yargs@9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" + integrity sha1-UqzCP+7Kw0BCB47njAwAf1CF20w= dependencies: camelcase "^4.1.0" cliui "^3.2.0" @@ -8657,9 +8581,28 @@ yargs@9.0.1: y18n "^3.2.1" yargs-parser "^7.0.0" +yargs@^12.0.4: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -8678,6 +8621,7 @@ yargs@^7.0.0: yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" @@ -8687,17 +8631,21 @@ yargs@~3.10.0: yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= dependencies: fd-slicer "~1.0.1" yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" + integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= yn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" + integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= zone.js@~0.8.26: - version "0.8.26" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.26.tgz#7bdd72f7668c5a7ad6b118148b4ea39c59d08d2d" + version "0.8.29" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.29.tgz#8dce92aa0dd553b50bc5bfbb90af9986ad845a12" + integrity sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ== diff --git a/aio/tools/transforms/angular-api-package/processors/computeApiBreadCrumbs.spec.js b/aio/tools/transforms/angular-api-package/processors/computeApiBreadCrumbs.spec.js index 2266cc149b..e595134f31 100644 --- a/aio/tools/transforms/angular-api-package/processors/computeApiBreadCrumbs.spec.js +++ b/aio/tools/transforms/angular-api-package/processors/computeApiBreadCrumbs.spec.js @@ -17,17 +17,10 @@ describe('angular-api-package: computeApiBreadCrumbs processor', () => { const API_DOC_TYPES_TO_RENDER = ['class', 'interface', 'package']; const processor = processorFactory(API_DOC_TYPES_TO_RENDER); - const httpPackage = { docType: 'package', name: '@angular/http', id: 'http', path: 'http', isPrimaryPackage: true }; - const httpTestingPackage = { docType: 'package', name: '@angular/http/testing', id: 'http/testing', path: 'http/testing', packageInfo: { primary: httpPackage } }; - const testRequestClass = { docType: 'class', name: 'TestRequest', path: 'http/testing/test-request', moduleDoc: httpTestingPackage }; - const docs = [ { docType: 'class', name: 'ClassA', path: 'module-1/class-a', moduleDoc: { id: 'moduleOne', path: 'module-1' } }, { docType: 'interface', name: 'InterfaceB', path: 'module-2/interface-b', moduleDoc: { id: 'moduleTwo', path: 'module-2' } }, { docType: 'guide', name: 'Guide One', path: 'guide/guide-1' }, - httpPackage, - httpTestingPackage, - testRequestClass ]; processor.$process(docs); @@ -42,20 +35,5 @@ describe('angular-api-package: computeApiBreadCrumbs processor', () => { { text: 'InterfaceB', path: 'module-2/interface-b' }, ]); expect(docs[2].breadCrumbs).toBeUndefined(); - expect(docs[3].breadCrumbs).toEqual([ - { text: 'API', path: '/api' }, - { text: '@angular/http', path: 'http' }, - ]); - expect(docs[4].breadCrumbs).toEqual([ - { text: 'API', path: '/api' }, - { text: '@angular/http', path: 'http' }, - { text: '@angular/http/testing', path: 'http/testing' }, - ]); - expect(docs[5].breadCrumbs).toEqual([ - { text: 'API', path: '/api' }, - { text: '@angular/http', path: 'http' }, - { text: '@angular/http/testing', path: 'http/testing' }, - { text: 'TestRequest', path: 'http/testing/test-request' }, - ]); }); }); diff --git a/aio/tools/transforms/angular-api-package/processors/generateApiListDoc.spec.js b/aio/tools/transforms/angular-api-package/processors/generateApiListDoc.spec.js index 14eda0482f..52c55efcf2 100644 --- a/aio/tools/transforms/angular-api-package/processors/generateApiListDoc.spec.js +++ b/aio/tools/transforms/angular-api-package/processors/generateApiListDoc.spec.js @@ -40,13 +40,11 @@ describe('generateApiListDoc processor', () => { const docs = [ { docType: 'package', id: '@angular/common/index', exports: [], path: 'common' }, { docType: 'package', id: '@angular/core/index', exports: [], path: 'core' }, - { docType: 'package', id: '@angular/http/index', exports: [], path: 'http' }, ]; processor.$process(docs); - expect(docs[3].data).toEqual([ + expect(docs[2].data).toEqual([ { name: '@angular/common', title: '@angular/common', items: [], path: 'common' }, { name: '@angular/core', title: '@angular/core', items: [], path: 'core' }, - { name: '@angular/http', title: '@angular/http', items: [], path: 'http' }, ]); }); From 6b6fdffc1281250a36b359917599f9c2785b3a96 Mon Sep 17 00:00:00 2001 From: Adam Plumer Date: Thu, 7 Mar 2019 10:16:19 -0600 Subject: [PATCH 0292/1073] fixup! docs: update Universal guide (#28296) PR Close #28296 --- .../upgrade-phonecat-3-final/karma.conf.js | 4 - aio/tools/examples/shared/yarn.lock | 4774 +++++++++-------- .../processors/computeApiBreadCrumbs.spec.js | 22 + 3 files changed, 2435 insertions(+), 2365 deletions(-) diff --git a/aio/content/examples/upgrade-phonecat-3-final/karma.conf.js b/aio/content/examples/upgrade-phonecat-3-final/karma.conf.js index fe8a6bc8dc..d290d6e61e 100644 --- a/aio/content/examples/upgrade-phonecat-3-final/karma.conf.js +++ b/aio/content/examples/upgrade-phonecat-3-final/karma.conf.js @@ -38,10 +38,6 @@ module.exports = function(config) { { pattern: 'node_modules/rxjs/**/*.js', included: false, watched: false }, { pattern: 'node_modules/rxjs/**/*.js.map', included: false, watched: false }, - // tslib (TS helper fns such as `__extends`) - { pattern: 'node_modules/tslib/**/*.js', included: false, watched: false }, - { pattern: 'node_modules/tslib/**/*.js.map', included: false, watched: false }, - // Paths loaded via module imports: // Angular itself { pattern: 'node_modules/@angular/**/*.js', included: false, watched: false }, diff --git a/aio/tools/examples/shared/yarn.lock b/aio/tools/examples/shared/yarn.lock index 97e3b4963a..6bed0fdac0 100644 --- a/aio/tools/examples/shared/yarn.lock +++ b/aio/tools/examples/shared/yarn.lock @@ -10,12 +10,12 @@ "@angular-devkit/core" "7.1.4" rxjs "6.3.3" -"@angular-devkit/architect@0.13.4": - version "0.13.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.13.4.tgz#f5db62f028e3c0971db5719be9c17a78fd8a67a2" - integrity sha512-wJF8oz8MurtpFi0ik42bkI2F5gEnuOe79KHPO1i3SYfdhEp5NY8igVKZ6chB/eq4Ml50aHxas8Hh9ke12K+Pxw== +"@angular-devkit/architect@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.13.1.tgz#39597ce94f72d89bdd89ee567cb937cff4c13b98" + integrity sha512-QDmIbqde75ZZSEFbw6Q6kQWq4cY6C7D67yujXw6XTyubDNAs1tyXJyxTIB8vjSlEKwRizTTDd/B0ZXVcke3Mvw== dependencies: - "@angular-devkit/core" "7.3.4" + "@angular-devkit/core" "7.3.1" rxjs "6.3.3" "@angular-devkit/build-angular@^0.11.0": @@ -102,42 +102,42 @@ rxjs "6.3.3" source-map "0.7.3" -"@angular-devkit/core@7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.4.tgz#fae0521652c7430237025f117531ca3262ef8335" - integrity sha512-MBfen51iOBKfK4tlg5KwmPxePsF1QoFNUMGLuvUUwPkteonrGcupX1Q7NWTpf+HA+i08mOnZGuepeuQkD12IQw== +"@angular-devkit/core@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.1.tgz#d92f6545796579cabdcfc29579a2c977f7a96c6c" + integrity sha512-56XDWWfIzOAkEk69lBLgmCYybPUA4yjunhmMlCk7vVdb7gbQUyzNjFD04Uj0GjlejatAQ5F76tRwygD9C+3RXQ== dependencies: - ajv "6.9.1" + ajv "6.7.0" chokidar "2.0.4" fast-json-stable-stringify "2.0.0" rxjs "6.3.3" source-map "0.7.3" -"@angular-devkit/schematics@7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.4.tgz#918c9349835f3a4c9a7128ebcda0738b623fc89e" - integrity sha512-BLI4MDHmpzw+snu/2Dw1nMmfJ0VAARTbU6DrmzXyl2Se45+iE/tdRy4yNx3IfHhyoCrVZ15R0y9CXeEsLftlIg== +"@angular-devkit/schematics@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.1.tgz#7dc704005b966ea6c1ee62f380120183bb76eee6" + integrity sha512-cd7usiasfSgw75INz72/VssrLr9tiVRYfo1TEdvr9ww0GuQbuQpB33xbV8W135eAV8+wzQ3Ce8ohaDHibvj6Yg== dependencies: - "@angular-devkit/core" "7.3.4" + "@angular-devkit/core" "7.3.1" rxjs "6.3.3" "@angular/animations@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.2.7.tgz#14aa9b4006dbffb08bd705842cdcc1d0b502ae90" - integrity sha512-eU/wSkBmukZXCCe/epUl02xsKPauF+deMbncxBE+w/NmmWjJ77Q09iZAcgzM92RVXj2LsVYQXsNEBGT3X0hRZw== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.2.4.tgz#4d0a0b9f14d6bfc38ca773613b61729d020435e6" + integrity sha512-Wx6cqU6koFOASlyl4aCygtbtROoehU6OKwV2EZTkfzHx6Eu/QyTiSa5kyoApVM5LMmCNeb8SxJMSAnKXztNl0A== dependencies: tslib "^1.9.0" "@angular/cli@^7.1.0": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.3.4.tgz#6bd2214c71391bdd07de806a2ca2777da2e3fd2a" - integrity sha512-uGL8xiQf+GvuJvqvMUu/XHcijbq9ocbX487LO2PgJ29etHfI7dC0toJbQ8ob+HnF9e1qwMe+uu45OU4C2p+a1A== + version "7.3.1" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.3.1.tgz#a18acdec84deb03a1fae79cae415bbc8f9c87ffa" + integrity sha512-8EvXYRhTqTaTk5PKv7VZxIWJiyG51R9RC9gtpRFx4bbnurqBHdEUxGMmaRsGT8QDbfvVsWnuakE0eeW1CrfZAQ== dependencies: - "@angular-devkit/architect" "0.13.4" - "@angular-devkit/core" "7.3.4" - "@angular-devkit/schematics" "7.3.4" - "@schematics/angular" "7.3.4" - "@schematics/update" "0.13.4" + "@angular-devkit/architect" "0.13.1" + "@angular-devkit/core" "7.3.1" + "@angular-devkit/schematics" "7.3.1" + "@schematics/angular" "7.3.1" + "@schematics/update" "0.13.1" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" inquirer "6.2.1" @@ -148,19 +148,19 @@ symbol-observable "1.2.0" "@angular/common@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.2.7.tgz#d0078a1cabc5e5c34ceb7691c2a31440ce7630fb" - integrity sha512-U1l2CIcmpTAJMWcyTXI9qt1E8CxwKNW1vr6XWZo4X5ziCIzf7RvClzK7Ci5KZKkoPJrJqBJu661Q75Yt22dJsg== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.2.4.tgz#9f1ed530e5dc7613a263e015c203ead390d50336" + integrity sha512-3/i8RtnLTx/90gJHk5maE8zwsSiHgHvLItaa0qVfNlWiU0eCId/PL6TgDkut5vN9SQYL0oxhxFaVd35HmwsmuQ== dependencies: tslib "^1.9.0" "@angular/compiler-cli@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.2.7.tgz#01adbb176075d2d02959a92053409dd0af343e2f" - integrity sha512-UPWROJzBLejgNf+aqgEUXYts8UiFOl2IavDhS/olA9irszv2lNFj9Yqr8OKdy0jK/lKaipZog3VZEx8g5dNeBA== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.2.4.tgz#3de23fd5f558a859a444c58dab18f2981c9c2937" + integrity sha512-UhLosSeuwFIfaGqGcYOh9WSOuzEpeuhIRAOt81MeqOQEqkoreUjfxrQq8XWNkdqsPZHtiptF5ZwXlMBxlj9jJg== dependencies: canonical-path "1.0.0" - chokidar "^2.1.1" + chokidar "^1.4.2" convert-source-map "^1.5.1" dependency-graph "^0.7.2" magic-string "^0.25.0" @@ -172,175 +172,165 @@ yargs "9.0.1" "@angular/compiler@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.2.7.tgz#3f3deb851634db871e92acde2f1ee56362d8c47f" - integrity sha512-e61YVxW5x4w+X4yjGaptYoJIja7HwH0+8FFEaH6VuPl/DrK8wP4HDMhLo4NzdgeZKLR2jBIQSqLmoM8W7UXcqw== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.2.4.tgz#133eb97fc3169ec9ff84f134eb9e3497fa37537e" + integrity sha512-+zyMzPCL45ePEV9nrnYJvhAVgp2Y19bDaq0f0YdZAqAjgDqHzXGGR6wX8GueyJWmUYWx5vwK6Apla4HwDrYA1w== dependencies: tslib "^1.9.0" "@angular/core@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.2.7.tgz#4311028181a98aa844572ea4b6cb9e87fc58d9ba" - integrity sha512-E7qjMQdS77SbRROKu13VsfL+MJN52eTlrU0SzEAFGUOgdvbmDYJOaEwjqrouKpYZ0pul8KOoalvlPB7oVflC7A== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.2.4.tgz#a6c84940c8edcfa37158f666a1f99c6e4a97bf95" + integrity sha512-kfAxhIxl89PmB7y81FR/RAv0yWRFcEYxEnTwV+o8jKGfemAXtQ0g/Vh+lJR0SD/TBgFilMxotN1mhwH4A8GShw== dependencies: tslib "^1.9.0" "@angular/elements@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-7.2.7.tgz#cd998043b8c64a4c3cd21eac3c13d4d83fc6b3a0" - integrity sha512-GFpshIqNnwOOqLxXu9+NOLd2AU77rO0OZggsmaXo0XENG3izkLlbw0j9U4mdYsRqQQUzeiP2PpN63duDtYJjXg== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/elements/-/elements-7.2.4.tgz#4b77cb0f815deb3fd83d8a3c9a807bcca11c2373" + integrity sha512-5V4kFmpncQTJEVdREaSBb4DVjZz88eLQBjzzvEUM3r7szhbQ1DYuubG7Sj2a1iIYSI/HTkPPvX57rQk3vq6AEw== dependencies: tslib "^1.9.0" "@angular/forms@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.2.7.tgz#bdffad0070e01bd0e1f6f7045909cc9aa33e59f0" - integrity sha512-2gBs+BG2cMPsHq9JVEzmu2Ev539zjfHmr6cna2W38KLXeGbNf42rbbMUXpYD8cndY0QTYcnwfMpRNIl9zKRZnw== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.2.4.tgz#be89cf83ad16fa3c813c12e4cff85da5409cf7a0" + integrity sha512-DAtOrdlTRsgvmZrsvczCAkY8dhTwZb5DXBmPuSXh0UR9lvEiCgNHGbwEiIiIkAHpw1wSeXZrq0qyy/oJRvf18g== dependencies: tslib "^1.9.0" "@angular/http@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.2.7.tgz#f76789b83094eda8952cd08fd13ad5f6224fcd00" - integrity sha512-HTHYF3qR4S55A+9pyThSOy7++7Makp+klbZTNmpwwJj8yL3qgy9PyDXtf+xhZcUEd8xfXmnz8s4hZr0O9GUy1A== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.2.4.tgz#fc151ac15c8c7542cb7242a430ad2319655c2ff5" + integrity sha512-kazJREm7MtSCYbE+9zU/CcUXI5Csu53PooeQlAp80/TOHqry6fVKIMHCI892Db9ScY2ds0SzbyTmrxEQo7PP1A== dependencies: tslib "^1.9.0" "@angular/language-service@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.2.7.tgz#c92d7fde437d6bddd2a4fe197f9c06005f3a5c53" - integrity sha512-d3iCBpOfgLNSGMrtqZvN6NHZIEnKD2MV8Hz4WsRLU4WY0RbshZj5dqx2nO3YRT2tACpAvhWBQoYvtLpTCPzsMA== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.2.4.tgz#db72460040b070410cbff678410c142f4d682af8" + integrity sha512-A9Rud/27hHMSUUjpgn57nVeLsoYgdvFwJhtlZA/oCuSpmlD+LqqBsEpPhivwn++u44+DSrFXsic29jlFnsBotw== "@angular/platform-browser-dynamic@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.7.tgz#22db038715c5b17464627a89898a63ece149c840" - integrity sha512-3nlcwCZOzlKw/4CMJ4zy1JEVy8Ky4KyLRRePLledOMdsGbuDIoq/kyAnBzg295Xe9ovBxv8cmuSkShci+s/x8g== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.4.tgz#24dce1bb0d9dab541b3b1b3eda3084a732f11b64" + integrity sha512-J/xWlmaYOPUoCHZ5TiIRiyYa4uRMtCz3aGdBfY8k/NWtNo8SCYaS3aut7Sk4RS5rK8aAVi+aYFlY5YOrlW+Hbg== dependencies: tslib "^1.9.0" "@angular/platform-browser@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.2.7.tgz#a1a14181354e07c19d38218a7a4af6ea4defa569" - integrity sha512-9C3ffZs0ZUw+dYg1oJKiONf64UKTdAzIOaTQXTrVrCa3oN7Jb2tUfmpenmB+ATRxwhL2n7Yi725YWwxY2FwqvQ== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.2.4.tgz#2cf5305878d0620d6b8c02eff00ac3ca8dbc5970" + integrity sha512-Klt8aKR5SP9bqfMfpSY5vQOY7AQEs8JGuZOk5Bfc2dUtYT2IEIvK2IqO8v2rcFRVO13HOPUxl328efyHqLgI7g== dependencies: tslib "^1.9.0" "@angular/platform-server@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-7.2.7.tgz#c1383edeeff2e7329e71659230fe16b9088ced5d" - integrity sha512-9KtfnUF3IhPk6riVaFhwn1iPNEPO8wjOLSmI4RltMDXha5xGUC4eMBcT2MhfPsB1+4m6D4D7pBmv8uhn4v/J2g== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/platform-server/-/platform-server-7.2.4.tgz#276803cc7cac8da54d1ad2f05e052e4f8af64a85" + integrity sha512-3KbLHw7xMbkxun93HeYX8pSiPmFWim3ftvKbfPlB01fjhdZvhHpf39Dn4T7iyT1vrZMccXL87psv4/lJkTf04A== dependencies: domino "^2.1.0" tslib "^1.9.0" xhr2 "^0.1.4" "@angular/router@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.2.7.tgz#66705f6b6f4546adae1dc58f5701b9d7a6b2723c" - integrity sha512-59+M8+IH7V2NPPqWw2mwdg+kh/jfwQcXE0tB8iZ5V2ldACPucY/Td6qiT5H6t7EkELtvkKJwS6vKFV22qdRp3w== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.2.4.tgz#83f1997c2a4e6acda93b991b8d7f3dad2b3f91f0" + integrity sha512-T8Uqf2H1SV1MQI38WwYJ4aa+4NNnvlp2Tp/rkfg6tKcp/cLkKqE6OOfiy9lmW+i/624v8tMgYoBMOUNBjAG23g== dependencies: tslib "^1.9.0" "@angular/service-worker@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.2.7.tgz#718fe4b8b6ed80650c7e14303781b8f6cedac986" - integrity sha512-oKPHZWXQnKR6gX1PvhBlk4TC6mSl7EgNd4MaZu/FwOuc5f+zo4oZPTAbzBYqkhbaqpvRyNylolTyJX5QeV9iPg== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.2.4.tgz#d16d6d08c0d5c29c93e9f80cddc4013c9b8859fb" + integrity sha512-IYsHshkgCYYmWLwtP7wwk8tfwphE4IJrkUitEu+ST6x+er/K9LyLo09WQeEZHIwDaPm9icoqc3TJJdXI46mrmg== dependencies: tslib "^1.9.0" "@angular/upgrade@^7.1.0": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-7.2.7.tgz#c2a804c12afe987f3abb9ef949f5cc640d6828f6" - integrity sha512-syUlleizrsFjSd3ZGgvZOOJmbDu6FJ4ZXpXeFnIY2InhO/xswgYFMiPYiwtraMFg458E/ZXoz41SToNgcYEfpA== + version "7.2.4" + resolved "https://registry.yarnpkg.com/@angular/upgrade/-/upgrade-7.2.4.tgz#49ecce8f8a6c290599179d5d96d19812a496145a" + integrity sha512-sRDXl2Uy9fZrMROfe7eNZDWwb1fgoWYzJ8VrviUCRakTJf3ZQLuEf4ToTc3KY/KGxEubA4jiuI8LXbyTTmRMQw== dependencies: tslib "^1.9.0" "@babel/code-frame@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" - integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== dependencies: "@babel/highlight" "^7.0.0" -"@babel/generator@^7.0.0", "@babel/generator@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.4.tgz#9aa48c1989257877a9d971296e5b73bfe72e446e" - integrity sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg== +"@babel/generator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" dependencies: - "@babel/types" "^7.3.4" + "@babel/types" "^7.0.0" jsesc "^2.5.1" - lodash "^4.17.11" + lodash "^4.17.10" source-map "^0.5.0" trim-right "^1.0.1" -"@babel/helper-function-name@^7.1.0": - version "7.1.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" - integrity sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw== +"@babel/helper-function-name@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0.tgz#a68cc8d04420ccc663dd258f9cc41b8261efa2d4" dependencies: "@babel/helper-get-function-arity" "^7.0.0" - "@babel/template" "^7.1.0" + "@babel/template" "^7.0.0" "@babel/types" "^7.0.0" "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" - integrity sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ== dependencies: "@babel/types" "^7.0.0" "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" - integrity sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag== dependencies: "@babel/types" "^7.0.0" "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" - integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.2.2", "@babel/parser@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.4.tgz#a43357e4bbf4b92a437fb9e465c192848287f27c" - integrity sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ== +"@babel/parser@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0.tgz#697655183394facffb063437ddf52c0277698775" -"@babel/template@^7.0.0", "@babel/template@^7.1.0": - version "7.2.2" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" - integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== +"@babel/template@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0.tgz#c2bc9870405959c89a9c814376a2ecb247838c80" dependencies: "@babel/code-frame" "^7.0.0" - "@babel/parser" "^7.2.2" - "@babel/types" "^7.2.2" + "@babel/parser" "^7.0.0" + "@babel/types" "^7.0.0" "@babel/traverse@^7.0.0": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.3.4.tgz#1330aab72234f8dea091b08c4f8b9d05c7119e06" - integrity sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ== + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0.tgz#b1fe9b6567fdf3ab542cfad6f3b31f854d799a61" dependencies: "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.3.4" - "@babel/helper-function-name" "^7.1.0" + "@babel/generator" "^7.0.0" + "@babel/helper-function-name" "^7.0.0" "@babel/helper-split-export-declaration" "^7.0.0" - "@babel/parser" "^7.3.4" - "@babel/types" "^7.3.4" - debug "^4.1.0" + "@babel/parser" "^7.0.0" + "@babel/types" "^7.0.0" + debug "^3.1.0" globals "^11.1.0" - lodash "^4.17.11" + lodash "^4.17.10" -"@babel/types@^7.0.0", "@babel/types@^7.2.2", "@babel/types@^7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.4.tgz#bf482eaeaffb367a28abbf9357a94963235d90ed" - integrity sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ== +"@babel/types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" dependencies: esutils "^2.0.2" - lodash "^4.17.11" + lodash "^4.17.10" to-fast-properties "^2.0.0" "@ngtools/webpack@7.1.4": @@ -369,22 +359,22 @@ resolved "https://registry.yarnpkg.com/@nguniversal/module-map-ngfactory-loader/-/module-map-ngfactory-loader-7.1.0.tgz#70ea905c1b32c2edc484cb77aa7a3f3208069966" integrity sha512-GYfb24OLJKBY58CgUsIsGgci5ceZAt4+GrVKh7RZRIHtZ/bjdGsvpIbfE9udqsnSowxIxHA5KzYHbC1x6AAB0A== -"@schematics/angular@7.3.4": - version "7.3.4" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.4.tgz#ba36efdd5474b793eb693d47772f998e6bd6043e" - integrity sha512-Bb5DZQ8MeP8yhxPe6nVqyQ7sGVNwUx6nXPlrQV45ZycD3nJlqsuxr2DE75HFpn5oU+vlkq9J/Sys4WLJ4E/OMw== +"@schematics/angular@7.3.1": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.1.tgz#6fcd7004210fa9305310c3109c084df5c5521776" + integrity sha512-0Ne8APPlTAjKg5CSZqluwCuW/5yPjr3ALCWzqwPxN0suE745usThtasBmqrjw0RMIt8nRqRgtg54Z7lCPO9ZFg== dependencies: - "@angular-devkit/core" "7.3.4" - "@angular-devkit/schematics" "7.3.4" + "@angular-devkit/core" "7.3.1" + "@angular-devkit/schematics" "7.3.1" typescript "3.2.4" -"@schematics/update@0.13.4": - version "0.13.4" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.13.4.tgz#a6e3b2a546940e647beef9d9e5e2e73e2f16f53d" - integrity sha512-YarSCCBSVPVG/MyN5H/FliRwaIDoeercy5Nip+NWZJsDyvtsAekO9s6QwizSvAr3541MmSQFeQICsjyM2dl3Bg== +"@schematics/update@0.13.1": + version "0.13.1" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.13.1.tgz#481475aee18b4a9472a06512b2e4d6429af68231" + integrity sha512-EHOqolT/d/jRGuVTCUESLpk8JNpuaPlsVHfeK7Kdp/t0wSEnmtOelZX4+leS25lGXDaDUF3138ntjrZR4n6bGw== dependencies: - "@angular-devkit/core" "7.3.4" - "@angular-devkit/schematics" "7.3.4" + "@angular-devkit/core" "7.3.1" + "@angular-devkit/schematics" "7.3.1" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" pacote "9.4.0" @@ -395,135 +385,101 @@ "@types/angular-animate@^1.5.10": version "1.5.10" resolved "https://registry.yarnpkg.com/@types/angular-animate/-/angular-animate-1.5.10.tgz#b94b45358c61163f1478768e8b081c76439c515f" - integrity sha512-MnYYvTHAPUbtT6gqwrnl6k3a03A5BlNz1nVlwVGxyS+MeWCX4DC14SJ/pgJUa8wj+J04wZ2prMxFsOfp6cyjjQ== dependencies: "@types/angular" "*" "@types/angular-mocks@^1.6.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@types/angular-mocks/-/angular-mocks-1.7.0.tgz#310d999a3c47c10ecd8eef466b5861df84799429" - integrity sha512-MeT5vxWBx4Ny5/sNZJjpZdv4K2KGwqQYiRQQZctan1TTaNyiVlFRYbcmheolhM4KKbTWmoxTVeuvGzniTDg1kw== + version "1.6.0" + resolved "https://registry.yarnpkg.com/@types/angular-mocks/-/angular-mocks-1.6.0.tgz#bd32f55b678c239880d2d0d9a3a79b5cad45547e" dependencies: "@types/angular" "*" "@types/angular-resource@^1.5.14": - version "1.5.15" - resolved "https://registry.yarnpkg.com/@types/angular-resource/-/angular-resource-1.5.15.tgz#5afad92af99b74884ca788fc48d47ebe4be32413" - integrity sha512-9YZwDxh+YMYtVvgEtW8oVQXKDJf0QcLrvR5hS9NMi/faDm2V+87TuHBtQBMPKEgMo0SyyVxKzhg8gsscNVMFUw== + version "1.5.14" + resolved "https://registry.yarnpkg.com/@types/angular-resource/-/angular-resource-1.5.14.tgz#902f34e8c98f708ae99493c6d416b39b4a22d9fe" dependencies: "@types/angular" "*" "@types/angular-route@^1.3.5": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@types/angular-route/-/angular-route-1.7.0.tgz#ba12d09df1aac3c88e3684500001daedfc97fb69" - integrity sha512-gctkSXUY7hDwFeW8il7f3+sdMmds0JaMnHvrZmqX79DHXf2D72+SHxJHIt5i6+0BrhoqdWdpgziSxuKnkAUAQw== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/angular-route/-/angular-route-1.3.5.tgz#78b8e0b069d5efe55ec7072461f4e2f6ae20767b" dependencies: "@types/angular" "*" "@types/angular@*", "@types/angular@^1.6.47": - version "1.6.54" - resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.54.tgz#f9d5a03e4da7b021a6dabe5d63e899ed4567a5bd" - integrity sha512-xA1FuozWXeRQ7FClUbvk8ePL+dydBeDoCWRPFTHU5+8uvVtIIfLGiHA8CMkwsbddFCYnTDVbLxG85a/HBx7LtA== + version "1.6.47" + resolved "https://registry.yarnpkg.com/@types/angular/-/angular-1.6.47.tgz#f7a31279a02c0892ed9aa76aae2da1b17791bacd" "@types/body-parser@*": - version "1.17.0" - resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" - integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.32" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" - integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== + version "1.16.7" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.16.7.tgz#455fc23fd0ddaaeda6cd6cbb653558276e5920fa" dependencies: + "@types/express" "*" "@types/node" "*" "@types/express-serve-static-core@*": - version "4.16.1" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz#35df7b302299a4ab138a643617bd44078e74d44e" - integrity sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA== + version "4.0.55" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.55.tgz#f53868838a955f98b380819ec9134f5df7d9482f" dependencies: "@types/node" "*" - "@types/range-parser" "*" -"@types/express@^4.0.35": - version "4.16.1" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.1.tgz#d756bd1a85c34d87eaf44c888bad27ba8a4b7cf0" - integrity sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg== +"@types/express@*", "@types/express@^4.0.35": + version "4.0.39" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.39.tgz#1441f21d52b33be8d4fa8a865c15a6a91cd0fa09" dependencies: "@types/body-parser" "*" "@types/express-serve-static-core" "*" "@types/serve-static" "*" "@types/jasmine@*": - version "3.3.9" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.3.9.tgz#ee886a9113db567e722a8a0c37f0e6283f2cefa3" - integrity sha512-vw3VyFPa9mlba6NZPBZC3q2Zrnkgy5xuCVI43/tTLX6umdYrYvcFtQUKi2zH3PjFZQ9XCxNM/NMrM9uk8TPOzg== + version "2.6.2" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.6.2.tgz#6e6d4cb183cd55c7a1ad6270bced10fdd5367a3c" "@types/jasmine@~2.8.8": - version "2.8.16" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.16.tgz#a6cb24b1149d65293bd616923500014838e14e7d" - integrity sha512-056oRlBBp7MDzr+HoU5su099s/s7wjZ3KcHxLfv+Byqb9MwdLUvsfLgw1VS97hsh3ddxSPyQu+olHMnoVTUY6g== + version "2.8.8" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.8.tgz#bf53a7d193ea8b03867a38bfdb4fbb0e0bf066c9" "@types/jasminewd2@^2.0.4": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.6.tgz#2f57a8d9875a6c9ef328a14bd070ba14a055ac39" - integrity sha512-2ZOKrxb8bKRmP/po5ObYnRDgFE4i+lQiEB27bAMmtMWLgJSqlIDqlLx6S0IRorpOmOPRQ6O80NujTmQAtBkeNw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/jasminewd2/-/jasminewd2-2.0.4.tgz#12422ee719f372d30c3cc7d99cc72dadba6ace01" dependencies: "@types/jasmine" "*" "@types/jquery@^3.3.4": - version "3.3.29" - resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.29.tgz#680a2219ce3c9250483722fccf5570d1e2d08abd" - integrity sha512-FhJvBninYD36v3k6c+bVk1DSZwh7B5Dpb/Pyk3HKVsiohn0nhbefZZ+3JXbWQhFyt0MxSl2jRDdGQPHeOHFXrQ== - dependencies: - "@types/sizzle" "*" + version "3.3.4" + resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.3.4.tgz#f1850fb9a70041a14ace4f81a7ed782db8548317" "@types/mime@*": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" - integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" "@types/node@*": - version "11.10.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.10.4.tgz#3f5fc4f0f322805f009e00ab35a2ff3d6b778e42" - integrity sha512-wa09itaLE8L705aXd8F80jnFpxz3Y1/KRHfKsYL2bPc0XF+wEWu8sR9n5bmeu8Ba1N9z2GRNzm/YdHcghLkLKg== + version "8.0.47" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.47.tgz#968e596f91acd59069054558a00708c445ca30c2" + +"@types/node@^6.0.46": + version "6.0.90" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.90.tgz#0ed74833fa1b73dcdb9409dcb1c97ec0a8b13b02" "@types/node@~8.9.4": version "8.9.5" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.9.5.tgz#162b864bc70be077e6db212b322754917929e976" - integrity sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ== + resolved "http://registry.npmjs.org/@types/node/-/node-8.9.5.tgz#162b864bc70be077e6db212b322754917929e976" "@types/q@^0.0.32": version "0.0.32" resolved "https://registry.yarnpkg.com/@types/q/-/q-0.0.32.tgz#bd284e57c84f1325da702babfc82a5328190c0c5" - integrity sha1-vShOV8hPEyXacCur/IKlMoGQwMU= - -"@types/range-parser@*": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" - integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== "@types/selenium-webdriver@^3.0.0": - version "3.0.15" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.15.tgz#024c24051c3798e9a0cf5cceb1c893140df1bc31" - integrity sha512-5nh8/K2u9p4bk95GGCJB7KBvewaB0TUziZ9DTr+mR2I6RoO4OJVqx7rxK83hs2J1tomwtCGkhiW+Dy8EUnfB+Q== + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.10.tgz#e98cc6f05b4b436277671c784ee2f9d05a634f9b" "@types/serve-static@*": - version "1.13.2" - resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" - integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== + version "1.13.0" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.0.tgz#2ef359d8d5982bc011a7a8fa36016e629e8b7635" dependencies: "@types/express-serve-static-core" "*" "@types/mime" "*" -"@types/sizzle@*": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47" - integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg== - "@webassemblyjs/ast@1.7.10": version "1.7.10" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.10.tgz#0cfc61d61286240b72fc522cb755613699eea40a" @@ -670,12 +626,10 @@ "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== "@xtuc/long@4.2.1": version "4.2.1" resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" - integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== "@yarnpkg/lockfile@1.1.0": version "1.1.0" @@ -693,17 +647,28 @@ JSONStream@^1.3.4: abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== abbrev@1.0.x: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= -accepts@~1.3.4, accepts@~1.3.5: +accepts@1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" + dependencies: + mime-types "~2.1.11" + negotiator "0.6.1" + +accepts@~1.3.3, accepts@~1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + dependencies: + mime-types "~2.1.16" + negotiator "0.6.1" + +accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" - integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= dependencies: mime-types "~2.1.18" negotiator "0.6.1" @@ -711,29 +676,32 @@ accepts@~1.3.4, accepts@~1.3.5: acorn-dynamic-import@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== dependencies: acorn "^5.0.0" -acorn@^5.0.0, acorn@^5.2.1, acorn@^5.6.2: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== +acorn@^5.0.0, acorn@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" -adm-zip@^0.4.9: - version "0.4.13" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.13.tgz#597e2f8cc3672151e1307d3e95cddbc75672314a" - integrity sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw== +acorn@^5.6.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5" + +adm-zip@^0.4.7: + version "0.4.7" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" + +after@0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" - integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" - integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: es6-promisify "^5.0.0" @@ -745,59 +713,69 @@ agentkeepalive@^3.4.1: humanize-ms "^1.2.1" ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" ajv-keywords@^3.1.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" - integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== + version "3.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.1.0.tgz#ac2b27939c543e95d2c06e7f7f5c27be4aa543be" ajv@6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" - integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" - integrity sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA== +ajv@6.7.0: + version "6.7.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96" + integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^5.0.0: - version "5.5.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" - integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= +ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.0.0, ajv@^5.1.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.3.0.tgz#4414ff74a50879c208ee5fdc826e32c303549eda" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0, ajv@^6.5.5: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== +ajv@^5.3.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: - fast-deep-equal "^2.0.1" + co "^4.6.0" + fast-deep-equal "^1.0.0" fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.4.0.tgz#d3aff78e9277549771daf0164cff48482b754fc6" + dependencies: + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + uri-js "^3.0.2" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" - integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc= dependencies: kind-of "^3.0.2" longest "^1.0.1" @@ -806,7 +784,6 @@ align-text@^0.1.1, align-text@^0.1.3: amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= "angular-in-memory-web-api@github:brandonroberts/in-memory-web-api-bazel#50a34d8": version "0.8.0" @@ -815,51 +792,64 @@ amdefine@>=0.0.4: tslib "^1.9.0" ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.1.0.tgz#dcfaacc90ef9187de413ec3ef8d5eb981a98808f" ansi-escapes@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" - integrity sha1-gTWEAhliqenm/QOflA0S9WynhZ4= + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= ansi-regex@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + +ansi-styles@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== dependencies: color-convert "^1.9.0" +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" @@ -867,188 +857,161 @@ anymatch@^2.0.0: append-transform@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" - integrity sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw== dependencies: default-require-extensions "^2.0.0" aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" dependencies: delegates "^1.0.0" readable-stream "^2.0.6" argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + version "1.0.9" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-flatten@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" - integrity sha1-3Tz7gO15c6dRF82sabC5nshhhvU= array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + +arraybuffer.slice@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" - integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== + version "4.9.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.1.tgz#48ba240b45a9280e94748990ba597d216617fd40" dependencies: bn.js "^4.0.0" inherits "^2.0.1" minimalistic-assert "^1.0.0" asn1@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg== - dependencies: - safer-buffer "~2.1.0" + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" assert@^1.1.1: version "1.4.1" resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= dependencies: util "0.10.3" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= async-each-series@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/async-each-series/-/async-each-series-0.1.1.tgz#7617c1917401fd8ca4a28aadce3dbae98afeb432" - integrity sha1-dhfBkXQB/Yykooqtzj266Yr+tDI= -async-each@^1.0.0, async-each@^1.0.1: +async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= async-foreach@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== async@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7" - integrity sha1-rDYTsdqb7RtHUQu0ZRuJMeRxRsc= -async@1.5.2, async@1.x, async@^1.5.2: +async@1.5.2, async@1.x, async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= async@^2.5.0, async@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.2.tgz#18330ea7e6e313887f5d2f2a904bac6fe4dd5381" - integrity sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg== + version "2.6.1" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610" dependencies: - lodash "^4.17.11" + lodash "^4.17.10" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +atob@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" autoprefixer@9.3.1: version "9.3.1" @@ -1062,37 +1025,33 @@ autoprefixer@9.3.1: postcss "^7.0.5" postcss-value-parser "^3.3.1" +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" - integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== - -axios@0.17.1: - version "0.17.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d" - integrity sha1-LY4+XQvb1zJ/kbyBT1xXZg+Bgk0= - dependencies: - follow-redirects "^1.2.5" - is-buffer "^1.1.5" babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= dependencies: chalk "^1.1.3" esutils "^2.0.2" js-tokens "^3.0.2" babel-generator@^6.18.0: - version "6.26.1" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" @@ -1100,20 +1059,18 @@ babel-generator@^6.18.0: detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.17.4" - source-map "^0.5.7" + source-map "^0.5.6" trim-right "^1.0.1" babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= dependencies: babel-runtime "^6.22.0" babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" @@ -1121,7 +1078,6 @@ babel-runtime@^6.22.0, babel-runtime@^6.26.0: babel-template@^6.16.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" @@ -1132,7 +1088,6 @@ babel-template@^6.16.0: babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" @@ -1147,7 +1102,6 @@ babel-traverse@^6.18.0, babel-traverse@^6.26.0: babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" @@ -1157,37 +1111,34 @@ babel-types@^6.18.0, babel-types@^6.26.0: babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== backo2@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" - integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= base64-arraybuffer@0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" - integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + +base64id@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/base64id/-/base64id-0.1.0.tgz#02ce0fdeee0cef4f40080e1e73e834f0b1bfce3f" base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" - integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== dependencies: cache-base "^1.0.1" class-utils "^0.3.5" @@ -1197,60 +1148,55 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +batch@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.5.3.tgz#3f3414f380321743bfc1042f9a83ff1d5824d464" + batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY= bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" dependencies: tweetnacl "^0.14.3" better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" - integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= dependencies: callsite "1.0.0" big.js@^3.1.3: version "3.2.0" resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== binary-extensions@^1.0.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.0.tgz#9523e001306a32444b907423f1de2164222f6ab1" - integrity sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw== + version "1.10.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" -blob@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" - integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== +blob@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= dependencies: inherits "~2.0.0" blocking-proxy@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" - integrity sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA== dependencies: minimist "^1.2.0" -bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3: +bluebird@^3.3.0, bluebird@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +bluebird@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== @@ -1258,28 +1204,25 @@ bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3: bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -body-parser@1.18.3, body-parser@^1.16.1: - version "1.18.3" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" - integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= +body-parser@1.18.2, body-parser@^1.16.1: + version "1.18.2" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" dependencies: bytes "3.0.0" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "~1.6.3" - iconv-lite "0.4.23" + depd "~1.1.1" + http-errors "~1.6.2" + iconv-lite "0.4.19" on-finished "~2.3.0" - qs "6.5.2" - raw-body "2.3.3" - type-is "~1.6.16" + qs "6.5.1" + raw-body "2.3.2" + type-is "~1.6.15" bonjour@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" - integrity sha1-jokKGD2O6aI5OzhExpGkK897yfU= dependencies: array-flatten "^2.1.0" deep-equal "^1.0.1" @@ -1288,10 +1231,27 @@ bonjour@^3.5.0: multicast-dns "^6.0.1" multicast-dns-service-types "^1.1.0" +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + version "1.1.8" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -1299,23 +1259,36 @@ brace-expansion@^1.1.7: braces@^0.1.2: version "0.1.5" resolved "https://registry.yarnpkg.com/braces/-/braces-0.1.5.tgz#c085711085291d8b75fdd74eab0f8597280711e6" - integrity sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY= dependencies: expand-range "^0.1.0" braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= dependencies: expand-range "^1.8.1" preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: +braces@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" @@ -1331,77 +1304,65 @@ braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= browser-resolve@^1.11.0: - version "1.11.3" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6" - integrity sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ== + version "1.11.2" + resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" dependencies: resolve "1.1.7" -browser-sync-client@^2.26.2: - version "2.26.2" - resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.26.2.tgz#dd0070c80bdc6d9021e89f7837ee70ed0a8acf91" - integrity sha512-FEuVJD41fI24HJ30XOT2RyF5WcnEtdJhhTqeyDlnMk/8Ox9MZw109rvk9pdfRWye4soZLe+xcAo9tHSMxvgAdw== +browser-sync-client@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/browser-sync-client/-/browser-sync-client-2.5.1.tgz#ec1ad69a49c2e2d4b645b18b1c06c29b3d9af8eb" dependencies: - etag "1.8.1" - fresh "0.5.2" - mitt "^1.1.3" - rxjs "^5.5.6" + etag "^1.7.0" + fresh "^0.3.0" -browser-sync-ui@^2.26.2: - version "2.26.2" - resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-2.26.2.tgz#a1d8e107cfed5849d77e3bbd84ae5d566beb4ea0" - integrity sha512-LF7GMWo8ELOE0eAlxuRCfnGQT1ZxKP9flCfGgZdXFc6BwmoqaJHlYe7MmVvykKkXjolRXTz8ztXAKGVqNwJ3EQ== +browser-sync-ui@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/browser-sync-ui/-/browser-sync-ui-0.6.3.tgz#640a537c180689303d5be92bc476b9ebc441c0bc" dependencies: async-each-series "0.1.1" - connect-history-api-fallback "^1" - immutable "^3" + connect-history-api-fallback "^1.1.0" + immutable "^3.7.6" server-destroy "1.0.1" - socket.io-client "^2.0.4" stream-throttle "^0.1.3" + weinre "^2.0.0-pre-I0Z7U9OV" -browser-sync@^2.24.4: - version "2.26.3" - resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.26.3.tgz#1b59bd5935938a5b0fa73b3d78ef1050bd2bf912" - integrity sha512-VLzpjCA4uXqfzkwqWtMM6hvPm2PNHp2RcmzBXcbi6C9WpkUhhFb8SVAr4CFrCsFxDg+oY6HalOjn8F+egyvhag== +browser-sync@^2.18.5: + version "2.18.13" + resolved "https://registry.yarnpkg.com/browser-sync/-/browser-sync-2.18.13.tgz#c28dc3eb3be67c97a907082b772a37f915c14d7d" dependencies: - browser-sync-client "^2.26.2" - browser-sync-ui "^2.26.2" + browser-sync-client "2.5.1" + browser-sync-ui "0.6.3" bs-recipes "1.3.4" - bs-snippet-injector "^2.0.1" - chokidar "^2.0.4" - connect "3.6.6" - connect-history-api-fallback "^1" + chokidar "1.7.0" + connect "3.5.0" dev-ip "^1.0.1" - easy-extender "^2.3.4" - eazy-logger "^3" - etag "^1.8.1" - fresh "^0.5.2" + easy-extender "2.3.2" + eazy-logger "3.0.2" + emitter-steward "^1.0.0" fs-extra "3.0.1" http-proxy "1.15.2" - immutable "^3" - localtunnel "1.9.1" + immutable "3.8.1" + localtunnel "1.8.3" micromatch "2.3.11" - opn "5.3.0" + opn "4.0.2" portscanner "2.1.1" - qs "6.2.3" - raw-body "^2.3.2" + qs "6.2.1" resp-modifier "6.0.2" rx "4.1.0" - send "0.16.2" - serve-index "1.9.1" - serve-static "1.13.2" + serve-index "1.8.0" + serve-static "1.12.2" server-destroy "1.0.1" - socket.io "2.1.1" - ua-parser-js "0.7.17" + socket.io "1.6.0" + socket.io-client "1.6.0" + ua-parser-js "0.7.12" yargs "6.4.0" browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" dependencies: buffer-xor "^1.0.3" cipher-base "^1.0.0" @@ -1411,28 +1372,24 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4: safe-buffer "^5.0.1" browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" dependencies: browserify-aes "^1.0.4" browserify-des "^1.0.0" evp_bytestokey "^1.0.0" browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + version "1.0.0" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" dependencies: cipher-base "^1.0.1" des.js "^1.0.0" inherits "^2.0.1" - safe-buffer "^5.1.2" browserify-rsa@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= dependencies: bn.js "^4.1.0" randombytes "^2.0.1" @@ -1440,7 +1397,6 @@ browserify-rsa@^4.0.0: browserify-sign@^4.0.0: version "4.0.4" resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= dependencies: bn.js "^4.1.1" browserify-rsa "^4.0.0" @@ -1450,110 +1406,78 @@ browserify-sign@^4.0.0: inherits "^2.0.1" parse-asn1 "^5.0.0" -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== +browserify-zlib@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" dependencies: - pako "~1.0.5" + pako "~0.2.0" browserslist@^4.3.3: - version "4.4.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.2.tgz#6ea8a74d6464bb0bd549105f659b41197d8f0ba2" - integrity sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg== + version "4.4.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" + integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A== dependencies: - caniuse-lite "^1.0.30000939" - electron-to-chromium "^1.3.113" - node-releases "^1.1.8" + caniuse-lite "^1.0.30000929" + electron-to-chromium "^1.3.103" + node-releases "^1.1.3" browserstack@^1.5.1: - version "1.5.2" - resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.2.tgz#17d8bb76127a1cc0ea416424df80d218f803673f" - integrity sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg== + version "1.5.1" + resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.1.tgz#e2dfa66ffee940ebad0a07f7e00fd4687c455d66" dependencies: https-proxy-agent "^2.2.1" bs-recipes@1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/bs-recipes/-/bs-recipes-1.3.4.tgz#0d2d4d48a718c8c044769fdc4f89592dc8b69585" - integrity sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU= - -bs-snippet-injector@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz#61b5393f11f52559ed120693100343b6edb04dd5" - integrity sha1-YbU5PxH1JVntEgaTEANDtu2wTdU= btoa@^1.1.2: - version "1.2.1" - resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" - integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.1.2.tgz#3e40b81663f81d2dd6596a4cb714a8dc16cfabe0" -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: +buffer-from@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" -buffer-from@^1.0.0, buffer-from@^1.1.0: +buffer-from@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" - integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= buffer@^4.3.0: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= dependencies: base64-js "^1.0.2" ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.1.0, builtin-modules@^1.1.1: +builtin-modules@^1.0.0, builtin-modules@^1.1.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= builtins@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== dependencies: bluebird "^3.5.1" chownr "^1.0.1" @@ -1569,7 +1493,7 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" -cacache@^11.0.1, cacache@^11.0.2, cacache@^11.3.2: +cacache@^11.0.1, cacache@^11.3.2: version "11.3.2" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== @@ -1589,10 +1513,28 @@ cacache@^11.0.1, cacache@^11.0.2, cacache@^11.3.2: unique-filename "^1.1.1" y18n "^4.0.0" +cacache@^11.0.2: + version "11.2.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.2.0.tgz#617bdc0b02844af56310e411c0878941d5739965" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + figgy-pudding "^3.1.0" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.3" + mississippi "^3.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^6.0.0" + unique-filename "^1.1.0" + y18n "^4.0.0" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" @@ -1607,45 +1549,39 @@ cache-base@^1.0.1: callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= dependencies: camelcase "^2.0.0" map-obj "^1.0.0" -camelcase@^1.0.2: +camelcase@^1.0.2, camelcase@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" - integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk= camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= camelcase@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" - integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== +caniuse-lite@^1.0.30000898: + version "1.0.30000935" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz#d1b59df00b46f4921bb84a8a34c1d172b346df59" + integrity sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ== -caniuse-lite@^1.0.30000898, caniuse-lite@^1.0.30000939: - version "1.0.30000941" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000941.tgz#f0810802b2ab8d27f4b625d4769a610e24d5a42c" - integrity sha512-4vzGb2MfZcO20VMPj1j6nRAixhmtlhkypM4fL4zhgzEucQIYiRzSqPcWIu1OF8i0FETD93FMIPWfUJCAcFvrqA== +caniuse-lite@^1.0.30000929: + version "1.0.30000932" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000932.tgz#d01763e9ce77810962ca7391ff827b5949ce4272" + integrity sha512-4bghJFItvzz8m0T3lLZbacmEY9X1Z2AtIzTr7s7byqZIOumASfr4ynDx7rtm0J85nDmx8vsgR6vnaSoeU8Oh0A== canonical-path@1.0.0: version "1.0.0" @@ -1655,20 +1591,27 @@ canonical-path@1.0.0: caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" - integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60= dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" +chalk@0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" @@ -1676,7 +1619,23 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1688,12 +1647,25 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.3.0, chalk@^2.4.1, chalk@^2.4.2: chardet@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +chokidar@1.7.0, chokidar@^1.4.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" chokidar@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== dependencies: anymatch "^2.0.0" async-each "^1.0.0" @@ -1710,26 +1682,46 @@ chokidar@2.0.4: optionalDependencies: fsevents "^1.2.2" -chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3, chokidar@^2.0.4, chokidar@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.2.tgz#9c23ea40b01638439e0513864d362aeacc5ad058" - integrity sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg== +chokidar@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.0.tgz#6686313c541d3274b2a5c01233342037948c911b" dependencies: anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" + async-each "^1.0.0" + braces "^2.3.0" glob-parent "^3.1.0" - inherits "^2.0.3" + inherits "^2.0.1" is-binary-path "^1.0.0" is-glob "^4.0.0" - normalize-path "^3.0.0" + normalize-path "^2.1.1" path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.0" + readdirp "^2.0.0" optionalDependencies: - fsevents "^1.2.7" + fsevents "^1.0.0" -chownr@^1.0.1, chownr@^1.1.1: +chokidar@^2.0.2, chokidar@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.3.tgz#dcbd4f6cbb2a55b4799ba8a840ac527e5f4b1176" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.0" + optionalDependencies: + fsevents "^1.1.2" + +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + +chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== @@ -1737,14 +1729,12 @@ chownr@^1.0.1, chownr@^1.1.1: chrome-trace-event@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== dependencies: tslib "^1.9.0" cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -1752,17 +1742,14 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: circular-dependency-plugin@5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/circular-dependency-plugin/-/circular-dependency-plugin-5.0.2.tgz#da168c0b37e7b43563fb9f912c1c007c213389ef" - integrity sha512-oC7/DVAyfcY3UWKm0sN/oVoDedQDQiw/vIiAnuTWTpE5s0zWf7l3WY417Xw/Fbi/QbAjctAkxgMiS9P0s3zkmA== circular-json@^0.5.5: - version "0.5.9" - resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" - integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== + version "0.5.5" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.5.tgz#64182ef359042d37cd8e767fc9de878b1e9447d3" class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== dependencies: arr-union "^3.1.0" define-property "^0.2.5" @@ -1772,44 +1759,38 @@ class-utils@^0.3.5: clean-css@4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17" - integrity sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g== dependencies: source-map "~0.6.0" cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= dependencies: restore-cursor "^2.0.0" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" - integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE= dependencies: center-align "^0.1.1" right-align "^0.1.1" wordwrap "0.0.2" -cliui@^3.2.0: +cliui@^3.0.3, cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" wrap-ansi "^2.0.0" cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== + version "4.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" dependencies: string-width "^2.1.1" strip-ansi "^4.0.0" @@ -1818,242 +1799,235 @@ cliui@^4.0.0: clone-deep@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-2.0.2.tgz#00db3a1e173656730d1188c3d6aced6d7ea97713" - integrity sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ== dependencies: for-own "^1.0.0" is-plain-object "^2.0.4" kind-of "^6.0.0" shallow-clone "^1.0.0" -clone@^2.1.1, clone@^2.1.2: +clone@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" + +clone@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= dependencies: map-visit "^1.0.0" object-visit "^1.0.0" color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" dependencies: - color-name "1.1.3" + color-name "^1.1.1" -color-name@1.1.3: +color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@1.1.2: +colors@1.1.2, colors@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= - -colors@^1.1.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" - integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== combine-lists@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" - integrity sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y= dependencies: lodash "^4.5.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" - integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== +combined-stream@1.0.6, combined-stream@~1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" dependencies: delayed-stream "~1.0.0" commander@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.6.0.tgz#9df7e52fb2a0cb0fb89058ee80c3104225f37e1d" - integrity sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0= -commander@^2.12.1, commander@^2.2.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" - integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== +commander@^2.12.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" + +commander@^2.2.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" commander@~2.13.0: version "2.13.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== commander@~2.17.1: version "2.17.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" - integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= compare-versions@^3.2.1: version "3.4.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.4.0.tgz#e0747df5c9cb7f054d6d3dc3e1dbc444f9e92b26" - integrity sha512-tK69D7oNXXqUW3ZNo/z7NXTEz22TCF0pTE+YF9cxvaAM9XnkLo1fV621xCLrRR6aevJlKxExkss0vWqUCUpqdg== component-bind@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" - integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= + +component-emitter@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" - integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= -compressible@~2.0.14: - version "2.0.16" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f" - integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA== +compressible@~2.0.11: + version "2.0.12" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" dependencies: - mime-db ">= 1.38.0 < 2" + mime-db ">= 1.30.0 < 2" compression@^1.5.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" - integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== + version "1.7.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" dependencies: - accepts "~1.3.5" + accepts "~1.3.4" bytes "3.0.0" - compressible "~2.0.14" + compressible "~2.0.11" debug "2.6.9" on-headers "~1.0.1" - safe-buffer "5.1.2" + safe-buffer "5.1.1" vary "~1.1.2" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@1.6.2, concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== +concat-stream@1.6.0, concat-stream@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" dependencies: - buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" concurrently@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.6.1.tgz#2f95baec5c4051294dfbb55b57a3b98a3e2b45ec" - integrity sha512-/+ugz+gwFSEfTGUxn0KHkY+19XPRTXR8+7oUK/HxgiN1n7FjeJmkrbSiXAJfyQ0zORgJYPaenmymwon51YXH9Q== + version "3.5.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-3.5.0.tgz#8cf1b7707a6916a78a4ff5b77bb04dec54b379b2" dependencies: - chalk "^2.4.1" + chalk "0.5.1" commander "2.6.0" date-fns "^1.23.0" lodash "^4.5.1" - read-pkg "^3.0.0" rx "2.3.24" spawn-command "^0.0.2-1" supports-color "^3.2.3" tree-kill "^1.1.0" -connect-history-api-fallback@^1, connect-history-api-fallback@^1.2.0, connect-history-api-fallback@^1.3.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" - integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== +connect-history-api-fallback@^1.1.0, connect-history-api-fallback@^1.2.0, connect-history-api-fallback@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.4.0.tgz#3db24f973f4b923b0e82f619ce0df02411ca623d" connect-logger@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/connect-logger/-/connect-logger-0.0.1.tgz#4d999978a1d20bb4608e7cd434d741652255174b" - integrity sha1-TZmZeKHSC7RgjnzUNNdBZSJVF0s= dependencies: moment "*" -connect@3.6.6, connect@^3.6.0: - version "3.6.6" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.6.tgz#09eff6c55af7236e137135a72574858b6786f524" - integrity sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ= +connect@1.x: + version "1.9.2" + resolved "https://registry.yarnpkg.com/connect/-/connect-1.9.2.tgz#42880a22e9438ae59a8add74e437f58ae8e52807" + dependencies: + formidable "1.0.x" + mime ">= 0.0.1" + qs ">= 0.4.0" + +connect@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.5.0.tgz#b357525a0b4c1f50599cd983e1d9efeea9677198" + dependencies: + debug "~2.2.0" + finalhandler "0.5.0" + parseurl "~1.3.1" + utils-merge "1.0.0" + +connect@^3.6.0: + version "3.6.5" + resolved "https://registry.yarnpkg.com/connect/-/connect-3.6.5.tgz#fb8dde7ba0763877d0ec9df9dac0b4b40e72c7da" dependencies: debug "2.6.9" - finalhandler "1.1.0" + finalhandler "1.0.6" parseurl "~1.3.2" utils-merge "1.0.1" console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= dependencies: date-now "^0.1.4" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= content-disposition@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -convert-source-map@^1.1.1, convert-source-map@^1.5.0, convert-source-map@^1.5.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" - integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== - dependencies: - safe-buffer "~5.1.1" +convert-source-map@^1.1.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + +convert-source-map@^1.5.0, convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== dependencies: aproba "^1.1.1" fs-write-stream-atomic "^1.0.8" @@ -2065,12 +2039,10 @@ copy-concurrently@^1.0.0: copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= copy-webpack-plugin@4.5.4: version "4.5.4" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz#f2b2782b3cd5225535c3dc166a80067e7d940f27" - integrity sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ== dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -2081,25 +2053,29 @@ copy-webpack-plugin@4.5.4: p-limit "^1.0.0" serialize-javascript "^1.4.0" -core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.4: - version "2.6.5" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895" - integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A== +core-js@^2.2.0, core-js@^2.4.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + +core-js@^2.5.4: + version "2.5.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" + +core-js@~2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= corser@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" - integrity sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c= cosmiconfig@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" - integrity sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ== dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" @@ -2107,28 +2083,24 @@ cosmiconfig@^4.0.0: require-from-string "^2.0.1" create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== + version "4.0.0" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" dependencies: bn.js "^4.1.0" elliptic "^6.0.0" create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + version "1.1.3" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.3.tgz#606042ac8b9262750f483caddab0f5819172d8fd" dependencies: cipher-base "^1.0.1" inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" + ripemd160 "^2.0.0" sha.js "^2.4.0" create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + version "1.1.6" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.6.tgz#acb9e221a4e17bdb076e90657c42b93e3726cf06" dependencies: cipher-base "^1.0.3" create-hash "^1.1.0" @@ -2140,7 +2112,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: cross-spawn@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= dependencies: lru-cache "^4.0.1" which "^1.2.9" @@ -2148,7 +2119,6 @@ cross-spawn@^3.0.0: cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" @@ -2157,7 +2127,6 @@ cross-spawn@^5.0.1: cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== dependencies: nice-try "^1.0.4" path-key "^2.0.1" @@ -2165,10 +2134,21 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + version "3.11.1" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.1.tgz#948945efc6757a400d6e5e5af47194d10064279f" dependencies: browserify-cipher "^1.0.0" browserify-sign "^4.0.0" @@ -2180,116 +2160,119 @@ crypto-browserify@^3.11.0: pbkdf2 "^3.0.3" public-encrypt "^4.0.0" randombytes "^2.0.0" - randomfill "^1.0.3" css-parse@1.7.x: version "1.7.0" resolved "https://registry.yarnpkg.com/css-parse/-/css-parse-1.7.0.tgz#321f6cf73782a6ff751111390fc05e2c657d8c9b" - integrity sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs= currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= dependencies: array-find-index "^1.0.1" custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" - integrity sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU= cyclist@~0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= dependencies: assert-plus "^1.0.0" date-fns@^1.23.0: - version "1.30.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" - integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + version "1.29.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" date-format@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/date-format/-/date-format-1.2.0.tgz#615e828e233dd1ab9bb9ae0950e0ceccfa6ecad8" - integrity sha1-YV6CjiM90aubua4JUODOzPpuytg= date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@*, debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== +debug@*, debug@3.1.0, debug@^3.1.0, debug@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: - ms "^2.1.1" + ms "2.0.0" + +debug@2.2.0, debug@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +debug@2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" + dependencies: + ms "0.7.2" + +debug@2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0" + dependencies: + ms "0.7.3" + +debug@2.6.8: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@3.1.0, debug@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: +debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= decamelize@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== dependencies: xregexp "4.0.0" decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" - integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU= deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= default-gateway@^2.6.0: version "2.7.2" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" - integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== dependencies: execa "^0.10.0" ip-regex "^2.1.0" @@ -2297,28 +2280,24 @@ default-gateway@^2.6.0: default-require-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" - integrity sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc= dependencies: strip-bom "^3.0.0" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" @@ -2326,7 +2305,6 @@ define-property@^2.0.2: del@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" @@ -2339,7 +2317,6 @@ del@^2.2.0: del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" - integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= dependencies: globby "^6.1.0" is-path-cwd "^1.0.0" @@ -2351,27 +2328,26 @@ del@^3.0.0: delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + +depd@1.1.1, depd@~1.1.0, depd@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" depd@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= dependency-graph@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.7.2.tgz#91db9de6eb72699209d88aea4c1fd5221cac1c49" - integrity sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ== des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= dependencies: inherits "^2.0.1" minimalistic-assert "^1.0.0" @@ -2379,70 +2355,59 @@ des.js@^1.0.0: destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= detect-node@^2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" - integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" dev-ip@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/dev-ip/-/dev-ip-1.0.1.tgz#a76a3ed1855be7a012bb8ac16cb80f3c00dc28f0" - integrity sha1-p2o+0YVb56ASu4rBbLgPPADcKPA= di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" - integrity sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw= -diff@^3.1.0, diff@^3.2.0: +diff@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + +diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + version "5.0.2" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" dependencies: bn.js "^4.1.0" miller-rabin "^4.0.0" randombytes "^2.0.0" dir-glob@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz#fa09f0694153c8918b18ba0deafae94769fc50c4" - integrity sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" dependencies: + arrify "^1.0.1" path-type "^3.0.0" dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= -dns-packet@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a" - integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg== +dns-packet@^1.0.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a" dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -2450,19 +2415,16 @@ dns-packet@^1.3.1: dns-txt@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" - integrity sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY= dependencies: buffer-indexof "^1.0.0" docopt@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/docopt/-/docopt-0.6.2.tgz#b28e9e2220da5ec49f7ea5bb24a47787405eeb11" - integrity sha1-so6eIiDaXsSffqW7JKR3h0Be6xE= dom-serialize@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" - integrity sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs= dependencies: custom-event "~1.0.0" ent "~2.2.0" @@ -2470,51 +2432,43 @@ dom-serialize@^2.2.0: void-elements "^2.0.0" domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== + version "1.1.7" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" domino@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.2.tgz#70e8367839ee8ad8bde3aeb4857cf3d93bd98b85" - integrity sha512-nzg76s4Smji9teyLwOnqqUCdFVOho+OQFqUwp+42Wo+SEZ1FGw7uhemv6OKk2qp8YIgnGB3jVt0sJWU96wbPgA== + version "2.1.0" + resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.0.tgz#653ba7d331441113b42e40ba05f24253ec86e02e" -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== +duplexify@^3.1.2, duplexify@^3.4.2: + version "3.5.1" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.1.tgz#4e1516be68838bc90a49994f0b39a6e5960befcd" dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" readable-stream "^2.0.0" stream-shift "^1.0.0" -easy-extender@^2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.4.tgz#298789b64f9aaba62169c77a2b3b64b4c9589b8f" - integrity sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q== +easy-extender@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/easy-extender/-/easy-extender-2.3.2.tgz#3d3248febe2b159607316d8f9cf491c16648221d" dependencies: - lodash "^4.17.10" + lodash "^3.10.1" -eazy-logger@^3: +eazy-logger@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/eazy-logger/-/eazy-logger-3.0.2.tgz#a325aa5e53d13a2225889b2ac4113b2b9636f4fc" - integrity sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw= dependencies: tfunk "^3.0.1" ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" dependencies: jsbn "~0.1.0" - safer-buffer "^2.1.0" ecstatic@^1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-1.4.1.tgz#32cb7b6fa2e290d58668674d115e8f0c3d567d6a" - integrity sha1-Mst7b6LikNWGaGdNEV6PDD1WfWo= dependencies: he "^0.5.0" mime "^1.2.11" @@ -2524,22 +2478,15 @@ ecstatic@^1.4.0: ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" - integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== - -electron-to-chromium@^1.3.113: - version "1.3.113" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" - integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== +electron-to-chromium@^1.3.103: + version "1.3.109" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.109.tgz#ee04a55a5157a5580a5ea88e526b02c84a3a7bc8" + integrity sha512-1qhgVZD9KIULMyeBkbjU/dWmm30zpPUfdWZfVO3nPhbtqMHJqHr4Ua5wBcWtAymVFrUCuAJxjMF1OhG+bR21Ow== elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== + version "6.4.0" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" dependencies: bn.js "^4.4.0" brorand "^1.0.1" @@ -2549,15 +2496,21 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +emitter-steward@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/emitter-steward/-/emitter-steward-1.0.0.tgz#f3411ade9758a7565df848b2da0cbbd1b46cbd64" + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= -encodeurl@~1.0.1, encodeurl@~1.0.2: +encodeurl@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" + +encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= encoding@^0.1.11: version "0.1.12" @@ -2567,16 +2520,31 @@ encoding@^0.1.11: iconv-lite "~0.4.13" end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + version "1.4.0" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" dependencies: once "^1.4.0" +engine.io-client@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" + dependencies: + component-emitter "1.2.1" + component-inherit "0.0.3" + debug "2.3.3" + engine.io-parser "1.3.1" + has-cors "1.1.0" + indexof "0.0.1" + parsejson "0.0.3" + parseqs "0.0.5" + parseuri "0.0.5" + ws "1.1.1" + xmlhttprequest-ssl "1.5.3" + yeast "0.1.2" + engine.io-client@~3.2.0: version "3.2.1" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.2.1.tgz#6f54c0475de487158a1a7c77d10178708b6add36" - integrity sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw== dependencies: component-emitter "1.2.1" component-inherit "0.0.3" @@ -2590,38 +2558,41 @@ engine.io-client@~3.2.0: xmlhttprequest-ssl "~1.5.4" yeast "0.1.2" -engine.io-client@~3.3.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.3.2.tgz#04e068798d75beda14375a264bb3d742d7bc33aa" - integrity sha512-y0CPINnhMvPuwtqXfsGuWE8BB66+B6wTtCofQDRecMQPYX3MYUZXFNKDhdrSe3EVjgOu4V3rxdeqN/Tr91IgbQ== +engine.io-parser@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-1.3.1.tgz#9554f1ae33107d6fbd170ca5466d2f833f6a07cf" dependencies: - component-emitter "1.2.1" - component-inherit "0.0.3" - debug "~3.1.0" - engine.io-parser "~2.1.1" - has-cors "1.1.0" - indexof "0.0.1" - parseqs "0.0.5" - parseuri "0.0.5" - ws "~6.1.0" - xmlhttprequest-ssl "~1.5.4" - yeast "0.1.2" + after "0.8.1" + arraybuffer.slice "0.0.6" + base64-arraybuffer "0.1.5" + blob "0.0.4" + has-binary "0.1.6" + wtf-8 "1.0.0" engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" - integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== + version "2.1.2" + resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.1.2.tgz#4c0f4cff79aaeecbbdcfdea66a823c6085409196" dependencies: after "0.8.2" arraybuffer.slice "~0.0.7" base64-arraybuffer "0.1.5" - blob "0.0.5" + blob "0.0.4" has-binary2 "~1.0.2" +engine.io@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-1.8.0.tgz#3eeb5f264cb75dbbec1baaea26d61f5a4eace2aa" + dependencies: + accepts "1.3.3" + base64id "0.1.0" + cookie "0.3.1" + debug "2.3.3" + engine.io-parser "1.3.1" + ws "1.1.1" + engine.io@~3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.1.tgz#b60281c35484a70ee0351ea0ebff83ec8c9522a2" - integrity sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.2.0.tgz#54332506f42f2edc71690d2f2a42349359f3bf7d" dependencies: accepts "~1.3.4" base64id "1.0.0" @@ -2630,10 +2601,17 @@ engine.io@~3.2.0: engine.io-parser "~2.1.0" ws "~3.3.1" -enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: +enhanced-resolve@4.1.0, enhanced-resolve@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== + dependencies: + graceful-fs "^4.1.2" + memory-fs "^0.4.0" + tapable "^1.0.0" + +enhanced-resolve@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.0.0.tgz#e34a6eaa790f62fccd71d93959f56b2b432db10a" dependencies: graceful-fs "^4.1.2" memory-fs "^0.4.0" @@ -2642,53 +2620,53 @@ enhanced-resolve@4.1.0, enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: ent@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d" - integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0= err-code@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= -errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== +errno@^0.1.1, errno@^0.1.3, errno@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" dependencies: - prr "~1.0.1" + prr "~0.0.0" error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: is-arrayish "^0.2.1" es6-promise@^4.0.3: - version "4.2.6" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.6.tgz#b685edd8258886365ea62b57d30de28fadcd974f" - integrity sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q== + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-promise@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.0.2.tgz#010d5858423a5f118979665f46486a95c6ee2bb6" + +es6-promise@~4.0.3: + version "4.0.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" es6-promisify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= dependencies: es6-promise "^4.0.3" escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= escodegen@1.8.x: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= dependencies: esprima "^2.7.1" estraverse "^1.9.1" @@ -2698,9 +2676,8 @@ escodegen@1.8.x: source-map "~0.2.0" eslint-scope@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.2.tgz#5f10cd6cabb1965bf479fa65745673439e21cb0e" - integrity sha512-5q1+B/ogmHl8+paxtOKx38Z8LtWkVGuNt3+GQNErqwLl6ViNp/gdJGMCjZNxZ8j/VYjDNZ2Fo+eQc1TAVPIzbg== + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" @@ -2708,64 +2685,49 @@ eslint-scope@^4.0.0: esprima@2.7.x, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" dependencies: estraverse "^4.1.0" + object-assign "^4.0.1" estraverse@^1.9.1: version "1.9.3" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= + +estree-walker@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" estree-walker@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39" - integrity sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig== - -estree-walker@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.0.tgz#5d865327c44a618dde5699f763891ae31f257dae" - integrity sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw== + version "0.5.0" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.0.tgz#aae3b57c42deb8010e349c892462f0e71c5dd1aa" esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= -etag@1.8.1, etag@^1.8.1, etag@~1.8.1: +etag@^1.7.0, etag@~1.8.0, etag@~1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= -eventemitter3@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" - integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== - -events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== +events@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" eventsource@^1.0.7: version "1.0.7" @@ -2777,7 +2739,6 @@ eventsource@^1.0.7: evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== dependencies: md5.js "^1.3.4" safe-buffer "^5.1.1" @@ -2785,7 +2746,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: execa@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== dependencies: cross-spawn "^6.0.0" get-stream "^3.0.0" @@ -2798,7 +2758,6 @@ execa@^0.10.0: execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" @@ -2808,28 +2767,13 @@ execa@^0.7.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= expand-braces@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" - integrity sha1-SIsdHSRRyz06axks/AMPRMWFX+o= dependencies: array-slice "^0.2.3" array-unique "^0.2.1" @@ -2838,14 +2782,12 @@ expand-braces@^0.1.1: expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= dependencies: debug "^2.3.3" define-property "^0.2.5" @@ -2858,7 +2800,6 @@ expand-brackets@^2.1.4: expand-range@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" - integrity sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ= dependencies: is-number "^0.1.1" repeat-string "^0.2.2" @@ -2866,25 +2807,25 @@ expand-range@^0.1.0: expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= dependencies: fill-range "^2.1.0" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= +express@2.5.x: + version "2.5.11" + resolved "https://registry.yarnpkg.com/express/-/express-2.5.11.tgz#4ce8ea1f3635e69e49f0ebb497b6a4b0a51ce6f0" dependencies: - homedir-polyfill "^1.0.1" + connect "1.x" + mime "1.2.4" + mkdirp "0.3.0" + qs "0.4.x" -express@^4.14.1, express@^4.16.2: - version "4.16.4" - resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" - integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== +express@^4.14.1: + version "4.16.3" + resolved "http://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53" dependencies: accepts "~1.3.5" array-flatten "1.1.1" - body-parser "1.18.3" + body-parser "1.18.2" content-disposition "0.5.2" content-type "~1.0.4" cookie "0.3.1" @@ -2901,10 +2842,10 @@ express@^4.14.1, express@^4.16.2: on-finished "~2.3.0" parseurl "~1.3.2" path-to-regexp "0.1.7" - proxy-addr "~2.0.4" - qs "6.5.2" + proxy-addr "~2.0.3" + qs "6.5.1" range-parser "~1.2.0" - safe-buffer "5.1.2" + safe-buffer "5.1.1" send "0.16.2" serve-static "1.13.2" setprototypeof "1.1.0" @@ -2913,30 +2854,65 @@ express@^4.14.1, express@^4.16.2: utils-merge "1.0.1" vary "~1.1.2" +express@^4.16.2: + version "4.16.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + dependencies: + accepts "~1.3.4" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.1" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.0" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.2" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.1" + serve-static "1.13.1" + setprototypeof "1.1.0" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.1" + vary "~1.1.2" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== external-editor@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" - integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" @@ -2945,14 +2921,12 @@ external-editor@^3.0.0: extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= dependencies: is-extglob "^1.0.0" -extglob@^2.0.4: +extglob@^2.0.2, extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -2963,50 +2937,38 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-zip@^1.6.5: - version "1.6.7" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" - integrity sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k= +extract-zip@~1.6.5: + version "1.6.5" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.5.tgz#99a06735b6ea20ea9b705d779acffcc87cff0440" dependencies: - concat-stream "1.6.2" - debug "2.6.9" - mkdirp "0.5.1" + concat-stream "1.6.0" + debug "2.2.0" + mkdirp "0.5.0" yauzl "2.4.1" -extsprintf@1.3.0: +extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" - integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= fast-json-stable-stringify@2.0.0, fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= dependencies: websocket-driver ">=0.5.1" @@ -3020,26 +2982,22 @@ faye-websocket@~0.11.1: fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - integrity sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU= dependencies: pend "~1.2.0" -figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: +figgy-pudding@^3.1.0, figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= dependencies: escape-string-regexp "^1.0.5" file-loader@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" - integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== dependencies: loader-utils "^1.0.2" schema-utils "^1.0.0" @@ -3047,41 +3005,58 @@ file-loader@2.0.0: filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= fileset@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" - integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA= dependencies: glob "^7.0.3" minimatch "^3.0.3" fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" dependencies: is-number "^2.1.0" isobject "^2.0.0" - randomatic "^3.0.0" + randomatic "^1.1.3" repeat-element "^1.1.2" repeat-string "^1.5.2" fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" +finalhandler@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-0.5.0.tgz#e9508abece9b6dba871a6942a1d7911b91911ac7" + dependencies: + debug "~2.2.0" + escape-html "~1.0.3" + on-finished "~2.3.0" + statuses "~1.3.0" + unpipe "~1.0.0" + +finalhandler@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + finalhandler@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" - integrity sha1-zgtoVbRYU+eRsvzGgARtiCU91/U= dependencies: debug "2.6.9" encodeurl "~1.0.1" @@ -3093,8 +3068,7 @@ finalhandler@1.1.0: finalhandler@1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" - integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== + resolved "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" dependencies: debug "2.6.9" encodeurl "~1.0.2" @@ -3107,7 +3081,6 @@ finalhandler@1.1.1: find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= dependencies: commondir "^1.0.1" make-dir "^1.0.0" @@ -3116,7 +3089,6 @@ find-cache-dir@^1.0.0: find-cache-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" - integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== dependencies: commondir "^1.0.1" make-dir "^1.0.0" @@ -3125,7 +3097,6 @@ find-cache-dir@^2.0.0: find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" @@ -3133,101 +3104,99 @@ find-up@^1.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= dependencies: locate-path "^2.0.0" find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== dependencies: locate-path "^3.0.0" -findup-sync@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - integrity sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw= - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -follow-redirects@^1.0.0, follow-redirects@^1.2.5: - version "1.7.0" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.7.0.tgz#489ebc198dc0e7f64167bd23b03c4c19b5784c76" - integrity sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ== - dependencies: - debug "^3.2.6" + inherits "^2.0.1" + readable-stream "^2.0.4" for-in@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" - integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= dependencies: for-in "^1.0.1" for-own@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= dependencies: for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" + combined-stream "^1.0.5" mime-types "^2.1.12" +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +formidable@1.0.x: + version "1.0.17" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= dependencies: map-cache "^0.2.2" -fresh@0.5.2, fresh@^0.5.2: +fresh@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" + +fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + +fresh@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= dependencies: inherits "^2.0.1" readable-stream "^2.0.0" @@ -3235,23 +3204,20 @@ from2@^2.1.0: fs-access@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" - integrity sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o= dependencies: null-check "^1.0.0" fs-extra@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" - integrity sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE= dependencies: graceful-fs "^4.1.2" jsonfile "^3.0.0" universalify "^0.1.0" -fs-extra@^1.0.0: +fs-extra@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - integrity sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA= dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -3260,14 +3226,12 @@ fs-extra@^1.0.0: fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== dependencies: minipass "^2.2.1" fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= dependencies: graceful-fs "^4.1.2" iferr "^0.1.5" @@ -3277,20 +3241,39 @@ fs-write-stream-atomic@^1.0.8: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.2.2, fsevents@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" - integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== +fsevents@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.36" + +fsevents@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + +fsevents@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" dependencies: nan "^2.9.2" node-pre-gyp "^0.10.0" -fstream@^1.0.0, fstream@^1.0.2: +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" @@ -3300,7 +3283,6 @@ fstream@^1.0.0, fstream@^1.0.2: gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" @@ -3312,9 +3294,8 @@ gauge@~2.7.3: wide-align "^1.1.0" gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.2.tgz#847224677adb8870d679257ed3388fdb61e40105" dependencies: globule "^1.0.0" @@ -3324,21 +3305,18 @@ genfun@^5.0.0: integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.0.0, get-stream@^4.1.0: +get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== @@ -3348,19 +3326,16 @@ get-stream@^4.0.0, get-stream@^4.1.0: get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= dependencies: assert-plus "^1.0.0" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" @@ -3368,14 +3343,12 @@ glob-base@^0.3.0: glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= dependencies: is-glob "^2.0.0" glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= dependencies: is-glob "^3.1.0" path-dirname "^1.0.0" @@ -3383,7 +3356,6 @@ glob-parent@^3.1.0: glob@7.0.x: version "7.0.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" - integrity sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo= dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3392,10 +3364,9 @@ glob@7.0.x: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob@7.1.3, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -3407,7 +3378,6 @@ glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glo glob@^5.0.15: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= dependencies: inflight "^1.0.4" inherits "2" @@ -3415,40 +3385,42 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +global-modules-path@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" globals@^11.1.0: - version "11.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.11.0.tgz#dcf93757fa2de5486fbeed7118538adf789e9c2e" - integrity sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw== + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= dependencies: array-union "^1.0.1" arrify "^1.0.0" @@ -3460,7 +3432,6 @@ globby@^5.0.0: globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= dependencies: array-union "^1.0.1" glob "^7.0.3" @@ -3471,7 +3442,6 @@ globby@^6.1.0: globby@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" - integrity sha1-+yzP+UAfhgCUXfral0QMypcrhoA= dependencies: array-union "^1.0.1" dir-glob "^2.0.0" @@ -3481,15 +3451,18 @@ globby@^7.1.1: slash "^1.0.0" globule@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" - integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== + version "1.2.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" dependencies: glob "~7.1.1" - lodash "~4.17.10" + lodash "~4.17.4" minimatch "~3.0.2" -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@^4.1.15: version "4.1.15" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== @@ -3497,12 +3470,20 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 handle-thing@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" - integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ= -handlebars@^4.0.1, handlebars@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" - integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== +handlebars@^4.0.1: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +handlebars@^4.0.11: + version "4.0.12" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" dependencies: async "^2.5.0" optimist "^0.6.1" @@ -3510,57 +3491,88 @@ handlebars@^4.0.1, handlebars@^4.1.0: optionalDependencies: uglify-js "^3.1.4" +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" har-validator@~5.1.0: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.0" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29" dependencies: - ajv "^6.5.5" + ajv "^5.3.0" har-schema "^2.0.0" +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= dependencies: ansi-regex "^2.0.0" has-binary2@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" - integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== dependencies: isarray "2.0.1" +has-binary@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.6.tgz#25326f39cfa4f616ad8787894e3af2cfbc7b6e10" + dependencies: + isarray "0.0.1" + +has-binary@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-binary/-/has-binary-0.1.7.tgz#68e61eb16210c9545a0a5cce06a873912fe1e68c" + dependencies: + isarray "0.0.1" + has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" - integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= dependencies: get-value "^2.0.3" has-values "^0.1.4" @@ -3569,7 +3581,6 @@ has-value@^0.3.1: has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= dependencies: get-value "^2.0.6" has-values "^1.0.0" @@ -3578,70 +3589,90 @@ has-value@^1.0.0: has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= dependencies: is-number "^3.0.0" kind-of "^4.0.0" +hash-base@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" + dependencies: + inherits "^2.0.1" + hash-base@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" dependencies: inherits "^2.0.3" - minimalistic-assert "^1.0.1" + minimalistic-assert "^1.0.0" -hasha@^2.2.0: +hasha@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" - integrity sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE= dependencies: is-stream "^1.0.1" pinkie-promise "^2.0.0" +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + he@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" - integrity sha1-LAX/rvkLaOhg8/0rVO9YCYknfuI= hmac-drbg@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" -hosted-git-info@^2.1.4, hosted-git-info@^2.6.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047" - integrity sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w== +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +hosted-git-info@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI= dependencies: inherits "^2.0.1" obuf "^1.0.0" @@ -3651,7 +3682,6 @@ hpack.js@^2.1.6: html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= http-cache-semantics@^3.8.1: version "3.8.1" @@ -3661,22 +3691,27 @@ http-cache-semantics@^3.8.1: http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc= -http-errors@1.6.3, http-errors@~1.6.2, http-errors@~1.6.3: - version "1.6.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= +http-errors@1.6.2, http-errors@~1.6.1, http-errors@~1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" dependencies: - depd "~1.1.2" + depd "1.1.1" inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" + setprototypeof "1.0.3" + statuses ">= 1.3.1 < 2" + +http-errors@~1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.5.1.tgz#788c0d2c1de2c81b9e6e8c01843b6b97eb920750" + dependencies: + inherits "2.0.3" + setprototypeof "1.0.2" + statuses ">= 1.3.1 < 2" http-parser-js@>=0.4.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" - integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== + version "0.4.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1" http-proxy-agent@^2.1.0: version "2.1.0" @@ -3689,7 +3724,6 @@ http-proxy-agent@^2.1.0: http-proxy-middleware@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" - integrity sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q== dependencies: http-proxy "^1.16.2" is-glob "^4.0.0" @@ -3699,24 +3733,20 @@ http-proxy-middleware@~0.18.0: http-proxy@1.15.2: version "1.15.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.15.2.tgz#642fdcaffe52d3448d2bda3b0079e9409064da31" - integrity sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE= dependencies: eventemitter3 "1.x.x" requires-port "1.x.x" http-proxy@^1.13.0, http-proxy@^1.16.2, http-proxy@^1.8.1: - version "1.17.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" - integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== + version "1.16.2" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" dependencies: - eventemitter3 "^3.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" + eventemitter3 "1.x.x" + requires-port "1.x.x" http-server@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.9.0.tgz#8f1b06bdc733618d4dc42831c7ba1aff4e06001a" - integrity sha1-jxsGvcczYY1NxCgxx7oa/04GABo= dependencies: colors "1.0.3" corser "~2.0.0" @@ -3727,24 +3757,29 @@ http-server@^0.9.0: portfinder "0.4.x" union "~0.4.3" +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= +https-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" https-proxy-agent@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" - integrity sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ== dependencies: agent-base "^4.1.0" debug "^3.1.0" @@ -3756,75 +3791,65 @@ humanize-ms@^1.2.1: dependencies: ms "^2.0.0" -iconv-lite@0.4.23: - version "0.4.23" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" - integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== - dependencies: - safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.4.19: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= ignore-walk@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== dependencies: minimatch "^3.0.4" ignore@^3.3.5: - version "3.3.10" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug== + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" - integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= -immutable@^3: +immutable@3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.1.tgz#200807f11ab0f72710ea485542de088075f68cd2" + +immutable@^3.7.6: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" - integrity sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk= dependencies: import-from "^2.1.0" import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" - integrity sha1-M1238qev/VOqpHHUuAId7ja387E= dependencies: resolve-from "^3.0.0" import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== dependencies: pkg-dir "^3.0.0" resolve-cwd "^2.0.0" @@ -3832,29 +3857,24 @@ import-local@^2.0.0: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= in-publish@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= dependencies: repeating "^2.0.0" indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" @@ -3862,18 +3882,20 @@ inflight@^1.0.4: inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@1.3.5, ini@^1.3.4, ini@~1.3.0: +ini@1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== +ini@^1.3.4, ini@~1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" + inquirer@6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" @@ -3896,102 +3918,95 @@ inquirer@6.2.1: internal-ip@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" - integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== dependencies: default-gateway "^2.6.0" ipaddr.js "^1.5.2" interpret@^1.0.0, interpret@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" invariant@^2.2.2: - version "2.2.4" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== ip-regex@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" - integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= ip@^1.1.0, ip@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= + +ipaddr.js@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" ipaddr.js@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" - integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= ipaddr.js@^1.5.2: - version "1.9.0" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" - integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== + version "1.8.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.1.tgz#fa4b79fa47fd3def5e3b159825161c0a519c9427" is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== dependencies: kind-of "^6.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== dependencies: kind-of "^6.0.0" is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" @@ -4000,7 +4015,6 @@ is-descriptor@^0.1.0: is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" @@ -4009,321 +4023,286 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" - integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - integrity sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= dependencies: is-extglob "^1.0.0" is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= dependencies: is-extglob "^2.1.0" is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= dependencies: is-extglob "^2.1.1" is-number-like@^1.0.3: version "1.0.8" resolved "https://registry.yarnpkg.com/is-number-like/-/is-number-like-1.0.8.tgz#2e129620b50891042e44e9bbbb30593e75cfbbe3" - integrity sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA== dependencies: lodash.isfinite "^3.3.2" is-number@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" - integrity sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY= is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== + +is-odd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + dependencies: + is-number "^3.0.0" + +is-odd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" + dependencies: + is-number "^4.0.0" is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= is-path-in-cwd@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" - integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" dependencies: path-is-inside "^1.0.1" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= isarray@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" - integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= isbinaryfile@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" - integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== - dependencies: - buffer-alloc "^1.2.0" + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -istanbul-api@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.1.1.tgz#194b773f6d9cbc99a9258446848b0f988951c4d0" - integrity sha512-kVmYrehiwyeBAk/wE71tW6emzLiHGjYIiDrc8sfyty4F8M02/lrgXSm+R1kXysmF20zArvmZXjlE/mg24TVPJw== +istanbul-api@^2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-2.0.6.tgz#cd7b33ee678f6c01531d05f5e567ebbcd25f8ecc" dependencies: async "^2.6.1" compare-versions "^3.2.1" fileset "^2.0.3" - istanbul-lib-coverage "^2.0.3" - istanbul-lib-hook "^2.0.3" - istanbul-lib-instrument "^3.1.0" - istanbul-lib-report "^2.0.4" - istanbul-lib-source-maps "^3.0.2" - istanbul-reports "^2.1.1" + istanbul-lib-coverage "^2.0.1" + istanbul-lib-hook "^2.0.1" + istanbul-lib-instrument "^3.0.0" + istanbul-lib-report "^2.0.2" + istanbul-lib-source-maps "^2.0.1" + istanbul-reports "^2.0.1" js-yaml "^3.12.0" make-dir "^1.3.0" - minimatch "^3.0.4" once "^1.4.0" istanbul-instrumenter-loader@3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz#9957bd59252b373fae5c52b7b5188e6fde2a0949" - integrity sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w== dependencies: convert-source-map "^1.5.0" istanbul-lib-instrument "^1.7.3" loader-utils "^1.1.0" schema-utils "^0.3.0" -istanbul-lib-coverage@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" - integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ== +istanbul-lib-coverage@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" -istanbul-lib-coverage@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#0b891e5ad42312c2b9488554f603795f9a2211ba" - integrity sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw== +istanbul-lib-coverage@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#2aee0e073ad8c5f6a0b00e0dfbf52b4667472eda" -istanbul-lib-hook@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.3.tgz#e0e581e461c611be5d0e5ef31c5f0109759916fb" - integrity sha512-CLmEqwEhuCYtGcpNVJjLV1DQyVnIqavMLFHV/DP+np/g3qvdxu3gsPqYoJMXm15sN84xOlckFB3VNvRbf5yEgA== +istanbul-lib-hook@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-2.0.1.tgz#918a57b75a0f951d552a08487ca1fa5336433d72" dependencies: append-transform "^1.0.0" istanbul-lib-instrument@^1.7.3: - version "1.10.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" - integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A== + version "1.9.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" - istanbul-lib-coverage "^1.2.1" + istanbul-lib-coverage "^1.1.1" semver "^5.3.0" -istanbul-lib-instrument@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz#a2b5484a7d445f1f311e93190813fa56dfb62971" - integrity sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA== +istanbul-lib-instrument@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-3.0.0.tgz#b5f066b2a161f75788be17a9d556f40a0cf2afc9" dependencies: "@babel/generator" "^7.0.0" "@babel/parser" "^7.0.0" "@babel/template" "^7.0.0" "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" - istanbul-lib-coverage "^2.0.3" + istanbul-lib-coverage "^2.0.1" semver "^5.5.0" -istanbul-lib-report@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.4.tgz#bfd324ee0c04f59119cb4f07dab157d09f24d7e4" - integrity sha512-sOiLZLAWpA0+3b5w5/dq0cjm2rrNdAfHWaGhmn7XEFW6X++IV9Ohn+pnELAl9K3rfpaeBfbmH9JU5sejacdLeA== +istanbul-lib-report@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-2.0.2.tgz#430a2598519113e1da7af274ba861bd42dd97535" dependencies: - istanbul-lib-coverage "^2.0.3" + istanbul-lib-coverage "^2.0.1" make-dir "^1.3.0" - supports-color "^6.0.0" + supports-color "^5.4.0" -istanbul-lib-source-maps@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.2.tgz#f1e817229a9146e8424a28e5d69ba220fda34156" - integrity sha512-JX4v0CiKTGp9fZPmoxpu9YEkPbEqCqBbO3403VabKjH+NRXo72HafD5UgnjTEqHL2SAjaZK1XDuDOkn6I5QVfQ== +istanbul-lib-source-maps@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-2.0.1.tgz#ce8b45131d8293fdeaa732f4faf1852d13d0a97e" dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^2.0.3" + debug "^3.1.0" + istanbul-lib-coverage "^2.0.1" make-dir "^1.3.0" rimraf "^2.6.2" source-map "^0.6.1" -istanbul-reports@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.1.1.tgz#72ef16b4ecb9a4a7bd0e2001e00f95d1eec8afa9" - integrity sha512-FzNahnidyEPBCI0HcufJoSEoKykesRlFcSzQqjH9x0+LC8tnnE/p/90PBLu8iZTxr8yYZNyTtiAujUqyN+CIxw== +istanbul-reports@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-2.0.1.tgz#fb8d6ea850701a3984350b977a969e9a556116a7" dependencies: - handlebars "^4.1.0" + handlebars "^4.0.11" istanbul@0.4.5: version "0.4.5" resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= dependencies: abbrev "1.0.x" async "1.x" @@ -4343,31 +4322,26 @@ istanbul@0.4.5: jasmine-core@~2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.8.0.tgz#bcc979ae1f9fd05701e45e52e65d3a5d63f1a24e" - integrity sha1-vMl5rh+f0FcB5F5S5l06XWPxok4= jasmine-core@~2.99.1: version "2.99.1" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-2.99.1.tgz#e6400df1e6b56e130b61c4bcd093daa7f6e8ca15" - integrity sha1-5kAN8ea1bhMLYcS80JPap/boyhU= jasmine-marbles@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/jasmine-marbles/-/jasmine-marbles-0.4.1.tgz#5e0b492c124b3a34f958c40c0587f3abccea6485" - integrity sha512-i5jjbwSX2dxMCt6uhNZCHh8QhjD4rJtUZDhCqz6NwelQezV6ScM22cuvWNlDQrGSvdM71elKUfGQrSMJYIoS2g== + version "0.4.0" + resolved "https://registry.yarnpkg.com/jasmine-marbles/-/jasmine-marbles-0.4.0.tgz#de72331d189d4968e4b1e78b638e51654040c755" dependencies: lodash "^4.5.0" jasmine-spec-reporter@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz#1d632aec0341670ad324f92ba84b4b32b35e9e22" - integrity sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg== dependencies: colors "1.1.2" jasmine@2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-2.8.0.tgz#6b089c0a11576b1f16df11b80146d91d4e8b8a3e" - integrity sha1-awicChFXax8W3xG4AUbZHU6Lij4= dependencies: exit "^0.1.2" glob "^7.0.6" @@ -4376,27 +4350,36 @@ jasmine@2.8.0: jasminewd2@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" - integrity sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4= js-base64@^2.1.8: - version "2.5.1" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" - integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== + version "2.3.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-tokens@^3.0.2: +js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: - version "3.12.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" - integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + +js-yaml@3.x: + version "3.11.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.12.0, js-yaml@^3.9.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.7.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -4404,74 +4387,65 @@ js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" - integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@^3.3.2: +json3@3.3.2, json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= optionalDependencies: graceful-fs "^4.1.6" jsonfile@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" - integrity sha1-pezG9l9T9mLEQVx2daAzHQmS7GY= optionalDependencies: graceful-fs "^4.1.6" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -4480,7 +4454,6 @@ jsonparse@^1.2.0: jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= dependencies: assert-plus "1.0.0" extsprintf "1.3.0" @@ -4488,47 +4461,46 @@ jsprim@^1.2.2: verror "1.10.0" jszip@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.2.0.tgz#1c179e8692777490ca4e9b8f3ced08f9b820da2c" - integrity sha512-4WjbsaEtBK/DHeDZOPiPw5nzSGLDEDDreFRDEgnoMwmknPjTqa+23XuYFk6NiGbeiAeZCctiQ/X/z0lQBmDVOQ== + version "3.1.5" + resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.1.5.tgz#e3c2a6c6d706ac6e603314036d43cd40beefdf37" dependencies: - lie "~3.3.0" + core-js "~2.3.0" + es6-promise "~3.0.2" + lie "~3.1.0" pako "~1.0.2" - readable-stream "~2.3.6" - set-immediate-shim "~1.0.1" + readable-stream "~2.0.6" karma-chrome-launcher@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz#cf1b9d07136cc18fe239327d24654c3dbc368acf" - integrity sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w== dependencies: fs-access "^1.0.0" which "^1.2.1" karma-coverage-istanbul-reporter@~2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.5.tgz#ca5899d4905e44a5984dd4f963adfc1a74dce767" - integrity sha512-yPvAlKtY3y+rKKWbOo0CzBMVTvJEeMOgbMXuVv3yWvS8YtYKC98AU9vFF0mVBZ2RP1E9SgS90+PT6Kf14P3S4w== + version "2.0.4" + resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz#402ae4ed6eadb9d9dafbd408ffda17897c0d003a" dependencies: - istanbul-api "^2.1.1" + istanbul-api "^2.0.5" minimatch "^3.0.4" karma-jasmine-html-reporter@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-0.2.2.tgz#48a8e5ef18807617ee2b5e33c1194c35b439524c" - integrity sha1-SKjl7xiAdhfuK14zwRlMNbQ5Ukw= dependencies: karma-jasmine "^1.0.2" -karma-jasmine@^1.0.2, karma-jasmine@~1.1.2: +karma-jasmine@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" + +karma-jasmine@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.2.tgz#394f2b25ffb4a644b9ada6f22d443e2fd08886c3" - integrity sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM= karma-phantomjs-launcher@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2" - integrity sha1-0jyjSAG9qYY60xjju0vUBisTrNI= dependencies: lodash "^4.0.1" phantomjs-prebuilt "^2.1.7" @@ -4536,14 +4508,12 @@ karma-phantomjs-launcher@^1.0.2: karma-source-map-support@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz#36dd4d8ca154b62ace95696236fae37caf0a7dde" - integrity sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q== dependencies: source-map-support "^0.5.5" karma@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/karma/-/karma-3.0.0.tgz#6da83461a8a28d8224575c3b5b874e271b4730c3" - integrity sha512-ZTjyuDXVXhXsvJ1E4CnZzbCjSxD6sEdzEsFYogLuZM0yqvg/mgz+O+R1jb0J7uAQeuzdY8kJgx6hSNXLwFuHIQ== dependencies: bluebird "^3.3.0" body-parser "^1.16.1" @@ -4573,70 +4543,65 @@ karma@~3.0.0: tmp "0.0.33" useragent "2.2.1" -kew@^0.7.0: +kew@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" - integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= killable@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== + version "1.0.0" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: +kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= optionalDependencies: graceful-fs "^4.1.9" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" - integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4= + +lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + dependencies: + set-getter "^0.1.0" lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= dependencies: invert-kv "^1.0.0" lcid@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== dependencies: invert-kv "^2.0.0" less-loader@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-4.1.0.tgz#2c1352c5b09a4f84101490274fd51674de41363e" - integrity sha512-KNTsgCE9tMOM70+ddxp9yyt9iHqgmSs0yTZc5XH5Wo+g80RWRIYNqE58QJKm/yMud5wZEvz50ugRDuzVIkyahg== dependencies: clone "^2.1.1" loader-utils "^1.1.0" @@ -4645,7 +4610,6 @@ less-loader@4.1.0: less@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" - integrity sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q== dependencies: clone "^2.1.2" optionalDependencies: @@ -4661,7 +4625,6 @@ less@3.8.1: levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" @@ -4669,28 +4632,24 @@ levn@~0.3.0: license-webpack-plugin@2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.0.2.tgz#9d34b521cb7fca8527945310b05be6ef0248b687" - integrity sha512-GsomZw5VoT20ST8qH2tOjBgbyhn6Pgs9M94g0mbvfBIV1VXufm1iKY+4dbgfTObj1Mp6nSRE3Zf74deOZr0KwA== dependencies: webpack-sources "^1.2.0" -lie@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" - integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== +lie@~3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" dependencies: immediate "~3.0.5" limiter@^1.0.5: - version "1.1.4" - resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.4.tgz#87c9c3972d389fdb0ba67a45aadbc5d2f8413bc1" - integrity sha512-XCpr5bElgDI65vVgstP8TWjv6/QKWm9GU5UG0Pr5sLQ3QLo8NVKsioe+Jed5/3vFOe3IQuqE7DKwTvKQkjTHvg== + version "1.1.2" + resolved "https://registry.yarnpkg.com/limiter/-/limiter-1.1.2.tgz#229d8055891c8b11af9e0ee5200e8e09bb3dcbeb" lite-server@^2.2.2: - version "2.4.0" - resolved "https://registry.yarnpkg.com/lite-server/-/lite-server-2.4.0.tgz#e3e122885836b168895d7b6b4eca06047d204c0d" - integrity sha512-Vo06tHpXrqm37i6T7tVdq5PSbrFmvQRw64+dlFXdh1tltv6KCvpE+xzXz2+x6KWJ8ja+GgwSy4P13GUWyhaDHQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/lite-server/-/lite-server-2.3.0.tgz#5b4cc8f5d5fd4836105480ab2ac48a3a0de2b0c8" dependencies: - browser-sync "^2.24.4" + browser-sync "^2.18.5" connect-history-api-fallback "^1.2.0" connect-logger "0.0.1" lodash "^4.11.1" @@ -4699,7 +4658,6 @@ lite-server@^2.2.2: load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" @@ -4709,61 +4667,37 @@ load-json-file@^1.0.0: load-json-file@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= + resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" pify "^2.0.0" strip-bom "^3.0.0" -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - loader-runner@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" -loader-utils@1.1.0: +loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= dependencies: big.js "^3.1.3" emojis-list "^2.0.0" json5 "^0.5.0" -loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== +localtunnel@1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.8.3.tgz#dcc5922fd85651037d4bde24fd93248d0b24eb05" dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -localtunnel@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/localtunnel/-/localtunnel-1.9.1.tgz#1d1737eab658add5a40266d8e43f389b646ee3b1" - integrity sha512-HWrhOslklDvxgOGFLxi6fQVnvpl6XdX4sPscfqMZkzi3gtt9V7LKBWYvNUcpHSVvjwCQ6xzXacVvICNbNcyPnQ== - dependencies: - axios "0.17.1" - debug "2.6.9" + debug "2.6.8" openurl "1.1.1" - yargs "6.6.0" + request "2.81.0" + yargs "3.29.0" locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -4771,7 +4705,6 @@ locate-path@^2.0.0: locate-path@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== dependencies: p-locate "^3.0.0" path-exists "^3.0.0" @@ -4779,42 +4712,46 @@ locate-path@^3.0.0: lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= lodash.isfinite@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz#fb89b65a9a80281833f0b7478b3a5104f898ebb3" - integrity sha1-+4m2WpqAKBgz8LdHizpRBPiY67M= lodash.mergewith@^4.6.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" - integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.0.tgz#150cf0a16791f5903b8891eab154609274bdea55" lodash.tail@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" - integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= -lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.16.2, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.5.0, lodash@^4.5.1, lodash@~4.17.10: - version "4.17.11" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" - integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== +lodash@^3.10.1: + version "3.10.1" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" + +lodash@^4.0.0, lodash@^4.0.1, lodash@^4.11.1, lodash@^4.16.2, lodash@^4.17.4, lodash@^4.5.0, lodash@^4.5.1, lodash@~4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + +lodash@^4.17.10: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +lodash@^4.17.5: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" log4js@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.6.tgz#e6caced94967eeeb9ce399f9f8682a4b2b28c8ff" - integrity sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ== + version "3.0.5" + resolved "https://registry.yarnpkg.com/log4js/-/log4js-3.0.5.tgz#b80146bfebad68b430d4f3569556d8a6edfef303" dependencies: circular-json "^0.5.5" date-format "^1.2.0" @@ -4823,26 +4760,22 @@ log4js@^3.0.0: streamroller "0.7.0" loglevel@^1.4.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" - integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= + version "1.5.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.5.1.tgz#189078c94ab9053ee215a0acdbf24244ea0f6502" longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" - integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc= loose-envify@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: - js-tokens "^3.0.0 || ^4.0.0" + js-tokens "^3.0.0" loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= dependencies: currently-unhandled "^0.4.1" signal-exit "^3.0.0" @@ -4850,9 +4783,15 @@ loud-rejection@^1.0.0: lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" - integrity sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0= -lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: +lru-cache@^4.0.1, lru-cache@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^4.1.2: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -4860,6 +4799,13 @@ lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4868,30 +4814,32 @@ lru-cache@^5.1.1: yallist "^3.0.2" magic-string@^0.22.4: - version "0.22.5" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" - integrity sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w== + version "0.22.4" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff" dependencies: - vlq "^0.2.2" + vlq "^0.2.1" magic-string@^0.25.0: - version "0.25.2" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" - integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== + version "0.25.0" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.0.tgz#1f3696f9931ff0a1ed4c132250529e19cad6759b" dependencies: - sourcemap-codec "^1.4.4" + sourcemap-codec "^1.4.1" -make-dir@^1.0.0, make-dir@^1.3.0: +make-dir@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + dependencies: + pify "^3.0.0" + +make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== dependencies: pify "^3.0.0" make-error@^1.1.1: - version "1.3.5" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" - integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" make-fetch-happen@^4.0.1: version "4.0.1" @@ -4911,68 +4859,53 @@ make-fetch-happen@^4.0.1: ssri "^6.0.0" map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + version "0.1.2" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" dependencies: p-defer "^1.0.0" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= dependencies: object-visit "^1.0.0" -math-random@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A== - md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" dependencies: hash-base "^3.0.0" inherits "^2.0.1" - safe-buffer "^5.1.2" media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= dependencies: mimic-fn "^1.0.0" mem@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.1.0.tgz#aeb9be2d21f47e78af29e4ac5978e8afa2ca5b8a" - integrity sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg== + version "4.0.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.0.0.tgz#6437690d9471678f6cc83659c00cbafcd6b0cdaf" dependencies: map-age-cleaner "^0.1.1" mimic-fn "^1.0.0" - p-is-promise "^2.0.0" + p-is-promise "^1.1.0" memory-fs@^0.4.0, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= dependencies: errno "^0.1.3" readable-stream "^2.0.1" @@ -4980,7 +4913,6 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: meow@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= dependencies: camelcase-keys "^2.0.0" decamelize "^1.1.2" @@ -4996,17 +4928,14 @@ meow@^3.7.0: merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@2.3.11: +micromatch@2.3.11, micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" @@ -5022,10 +4951,27 @@ micromatch@2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: +micromatch@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.0" + define-property "^1.0.0" + extend-shallow "^2.0.1" + extglob "^2.0.2" + fragment-cache "^0.2.1" + kind-of "^6.0.0" + nanomatch "^1.2.5" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +micromatch@^3.1.8, micromatch@^3.1.9: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -5044,42 +4990,57 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, mic miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== dependencies: bn.js "^4.0.0" brorand "^1.0.1" -"mime-db@>= 1.38.0 < 2", mime-db@~1.38.0: - version "1.38.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.38.0.tgz#1a2aab16da9eb167b49c6e4df2d9c68d63d8e2ad" - integrity sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg== +"mime-db@>= 1.30.0 < 2": + version "1.31.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb" -mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19: - version "2.1.22" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.22.tgz#fe6b355a190926ab7698c9a0556a11199b2199bd" - integrity sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog== +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-db@~1.36.0: + version "1.36.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397" + +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: - mime-db "~1.38.0" + mime-db "~1.30.0" -mime@1.4.1: +mime-types@~2.1.18, mime-types@~2.1.19: + version "2.1.20" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19" + dependencies: + mime-db "~1.36.0" + +mime@1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.4.tgz#11b5fdaf29c2509255176b80ad520294f5de92b7" + +mime@1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" + +mime@1.4.1, mime@^1.2.11, mime@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" - integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mime@^1.2.11, mime@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +"mime@>= 0.0.1": + version "2.0.3" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.0.3.tgz#4353337854747c48ea498330dc034f9f4bbbcc0b" mime@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" - integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== + version "2.3.1" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + version "1.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" mini-css-extract-plugin@0.4.4: version "0.4.4" @@ -5090,39 +5051,40 @@ mini-css-extract-plugin@0.4.4: schema-utils "^1.0.0" webpack-sources "^1.1.0" -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== +minimalistic-assert@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.4, minipass@^2.3.5: +minipass@^2.2.1, minipass@^2.3.3: + version "2.3.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957" + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minipass@^2.3.4, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -5130,6 +5092,12 @@ minipass@^2.2.1, minipass@^2.3.4, minipass@^2.3.5: safe-buffer "^5.1.2" yallist "^3.0.0" +minizlib@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" + dependencies: + minipass "^2.2.1" + minizlib@^1.1.1: version "1.2.1" resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.2.1.tgz#dd27ea6136243c7c880684e8672bb3a45fd9b614" @@ -5140,7 +5108,6 @@ minizlib@^1.1.1: mississippi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== dependencies: concat-stream "^1.5.0" duplexify "^3.4.2" @@ -5156,7 +5123,6 @@ mississippi@^2.0.0: mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== dependencies: concat-stream "^1.5.0" duplexify "^3.4.2" @@ -5169,15 +5135,9 @@ mississippi@^3.0.0: stream-each "^1.1.0" through2 "^2.0.0" -mitt@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/mitt/-/mitt-1.1.3.tgz#528c506238a05dce11cd914a741ea2cc332da9b8" - integrity sha512-mUDCnVNsAi+eD6qA0HkRkwYczbLHJ49z17BGe2PYRhZL4wpZUFZGJHU7/5tmvohoma+Hdn0Vh/oJTiPEmgSruA== - mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== + version "1.3.0" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" dependencies: for-in "^1.0.2" is-extendable "^1.0.1" @@ -5185,27 +5145,33 @@ mixin-deep@^1.2.0: mixin-object@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" - integrity sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4= dependencies: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= dependencies: minimist "0.0.8" moment@*: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b" - integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg== + version "2.19.1" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= dependencies: aproba "^1.1.1" copy-concurrently "^1.0.0" @@ -5214,10 +5180,25 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +ms@0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" + +ms@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" + +ms@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-1.0.0.tgz#59adcd22edc543f7b5381862d31387b1f4bc9473" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= ms@^2.0.0, ms@^2.1.1: version "2.1.1" @@ -5227,36 +5208,56 @@ ms@^2.0.0, ms@^2.1.1: multicast-dns-service-types@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" - integrity sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE= multicast-dns@^6.0.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229" - integrity sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g== + version "6.1.1" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.1.1.tgz#6e7de86a570872ab17058adea7160bbeca814dde" dependencies: - dns-packet "^1.3.1" - thunky "^1.0.2" + dns-packet "^1.0.1" + thunky "^0.1.0" mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -nan@^2.10.0, nan@^2.9.2: - version "2.12.1" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.12.1.tgz#7b1aa193e9aa86057e3c7bbd0ac448e770925552" - integrity sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw== +nan@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" + +nan@^2.3.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" + +nan@^2.9.2: + version "2.11.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" + +nanomatch@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + is-odd "^1.0.0" + kind-of "^5.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== + version "1.2.9" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" + is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" @@ -5267,7 +5268,6 @@ nanomatch@^1.2.9: needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" - integrity sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA== dependencies: debug "^2.1.2" iconv-lite "^0.4.4" @@ -5276,17 +5276,14 @@ needle@^2.2.1: negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" - integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= neo-async@^2.5.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" - integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== + version "2.5.1" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== node-fetch-npm@^2.0.2: version "2.0.2" @@ -5297,15 +5294,13 @@ node-fetch-npm@^2.0.2: json-parse-better-errors "^1.0.0" safe-buffer "^5.1.1" -node-forge@0.7.5: - version "0.7.5" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" - integrity sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ== +node-forge@0.6.33: + version "0.6.33" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" node-gyp@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== dependencies: fstream "^1.0.0" glob "^7.0.3" @@ -5321,38 +5316,36 @@ node-gyp@^3.8.0: which "1" node-libs-browser@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.0.tgz#c72f60d9d46de08a940dedbb25f3ffa2f9bbaa77" - integrity sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA== + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" dependencies: assert "^1.1.1" - browserify-zlib "^0.2.0" + browserify-zlib "^0.1.4" buffer "^4.3.0" console-browserify "^1.1.0" constants-browserify "^1.0.0" crypto-browserify "^3.11.0" domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" + events "^1.0.0" + https-browserify "0.0.1" + os-browserify "^0.2.0" path-browserify "0.0.0" - process "^0.11.10" + process "^0.11.0" punycode "^1.2.4" querystring-es3 "^0.2.0" - readable-stream "^2.3.3" + readable-stream "^2.0.5" stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" + stream-http "^2.3.1" + string_decoder "^0.10.25" + timers-browserify "^2.0.2" tty-browserify "0.0.0" url "^0.11.0" - util "^0.11.0" + util "^0.10.3" vm-browserify "0.0.4" node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" - integrity sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A== dependencies: detect-libc "^1.0.2" mkdirp "^0.5.1" @@ -5365,10 +5358,41 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.8: - version "1.1.9" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.9.tgz#70d0985ec4bf7de9f08fc481f5dae111889ca482" - integrity sha512-oic3GT4OtbWWKfRolz5Syw0Xus0KRFxeorLNj0s93ofX6PWyuzKjsiGxsCtWktBwwmTF6DdRRf2KreGqeOk5KA== +node-pre-gyp@^0.6.36: + version "0.6.38" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz#e92a20f83416415bb4086f6d1fb78b3da73d113d" + dependencies: + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-releases@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.6.tgz#47d160033e24a64e79487a62de63cf691052ec54" + integrity sha512-lODUVHEIZutZx+TDdOk47qLik8FJMXzJ+WnyUGci1MTvTOyzZrz5eVPIIpc5Hb3NfHZGeGHeuwrRYVI1PEITWg== dependencies: semver "^5.3.0" @@ -5397,52 +5421,51 @@ node-sass@4.10.0: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" -"nopt@2 || 3", nopt@3.x: +"nopt@2 || 3", nopt@3.0.x, nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= dependencies: abbrev "1" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= dependencies: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: hosted-git-info "^2.1.4" - resolve "^1.10.0" + is-builtin-module "^1.0.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-package-data@^2.4.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.2.tgz#6b2abd85774e51f7936f1395e45acb905dc849b2" + integrity sha512-YcMnjqeoUckXTPKZSAsPjUPLxH85XotbpqK3w4RyCwdFQSU5FxxBys8buehkSfg0j9fKvV1hn7O0+8reEgkAiw== + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== + version "1.0.5" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" npm-package-arg@6.1.0, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: version "6.1.0" @@ -5454,10 +5477,17 @@ npm-package-arg@6.1.0, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: semver "^5.5.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.12, npm-packlist@^1.1.6: - version "1.4.1" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.1.tgz#19064cdf988da80ea3cee45533879d90192bbfbc" - integrity sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw== +npm-packlist@^1.1.12: + version "1.2.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.2.0.tgz#55a60e793e272f00862c7089274439a4cc31fc7f" + integrity sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + +npm-packlist@^1.1.6: + version "1.1.11" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de" dependencies: ignore-walk "^3.0.1" npm-bundled "^1.0.1" @@ -5486,14 +5516,12 @@ npm-registry-fetch@^3.8.0: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= dependencies: path-key "^2.0.0" "npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" @@ -5503,37 +5531,38 @@ npm-run-path@^2.0.0: null-check@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/null-check/-/null-check-1.0.0.tgz#977dffd7176012b9ec30d2a39db5cf72a0439edd" - integrity sha1-l33/1xdgErnsMNKjnbXPcqBDnt0= num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" - integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" @@ -5542,19 +5571,16 @@ object-copy@^0.1.0: object-path@^0.9.0: version "0.9.2" resolved "https://registry.yarnpkg.com/object-path/-/object-path-0.9.2.tgz#0fd9a74fc5fad1ae3968b586bda5c632bd6c05a5" - integrity sha1-D9mnT8X60a45aLWGvaXGMr1sBaU= object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= dependencies: for-own "^0.1.4" is-extendable "^0.1.1" @@ -5562,69 +5588,76 @@ object.omit@^2.0.0: object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= dependencies: isobject "^3.0.1" obuf@^1.0.0, obuf@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + version "1.1.1" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= dependencies: ee-first "1.1.1" on-headers@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= dependencies: mimic-fn "^1.0.0" +open@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" + opener@~1.4.0: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" - integrity sha1-XG2ixdflgx6P+jlklQ+NZnSskLg= openurl@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/openurl/-/openurl-1.1.1.tgz#3875b4b0ef7a52c156f0db41d4609dbb0f94b387" - integrity sha1-OHW0sO96UsFW8NtB1GCduw+Us4c= + +opn@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/opn/-/opn-4.0.2.tgz#7abc22e644dff63b0a96d5ab7f2790c0f01abc95" + dependencies: + object-assign "^4.0.1" + pinkie-promise "^2.0.0" opn@5.3.0: version "5.3.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" - integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== + resolved "http://registry.npmjs.org/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" dependencies: is-wsl "^1.1.0" -opn@5.4.0, opn@^5.1.0, opn@^5.3.0: +opn@5.4.0: version "5.4.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw== dependencies: is-wsl "^1.1.0" +opn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + dependencies: + is-wsl "^1.1.0" + optimist@0.6.x, optimist@^0.6.1, optimist@~0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - integrity sha1-2j6nRob6IaGaERwybpDrFaAZZoY= dependencies: minimist "~0.0.1" wordwrap "~0.0.2" @@ -5632,7 +5665,6 @@ optimist@0.6.x, optimist@^0.6.1, optimist@~0.6.0: optionator@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" - integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" @@ -5641,6 +5673,10 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" +options@>=0.0.5: + version "0.0.6" + resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" + original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" @@ -5648,50 +5684,50 @@ original@^1.0.0: dependencies: url-parse "^1.4.3" -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= +os-browserify@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= dependencies: lcid "^1.0.0" os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== dependencies: execa "^0.7.0" lcid "^1.0.0" mem "^1.1.0" os-locale@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + version "3.0.1" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" dependencies: - execa "^1.0.0" + execa "^0.10.0" lcid "^2.0.0" mem "^4.0.0" os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@0, osenv@^0.1.4, osenv@^0.1.5: +osenv@0, osenv@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +osenv@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -5699,60 +5735,54 @@ osenv@0, osenv@^0.1.4, osenv@^0.1.5: p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= -p-is-promise@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" - integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg== +p-is-promise@^1.1.0: + version "1.1.0" + resolved "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz#9c9456989e9f6588017b0434d56097675c3da05e" -p-limit@^1.0.0, p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== +p-limit@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" dependencies: p-try "^1.0.0" +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + p-limit@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" - integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" dependencies: p-try "^2.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= dependencies: p-limit "^1.1.0" p-locate@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== dependencies: p-limit "^2.0.0" p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= p-try@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== pacote@9.4.0: version "9.4.0" @@ -5787,36 +5817,35 @@ pacote@9.4.0: unique-filename "^1.1.1" which "^1.3.1" -pako@~1.0.2, pako@~1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== +pako@~0.2.0: + version "0.2.9" + resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" + +pako@~1.0.2: + version "1.0.6" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" parallel-transform@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= dependencies: cyclist "~0.2.2" inherits "^2.0.3" readable-stream "^2.1.5" parse-asn1@^5.0.0: - version "5.1.4" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.4.tgz#37f6628f823fbdeb2273b4d540434a22f3ef1fcc" - integrity sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.0.tgz#37c4f9b7ed3ab65c74817b5f2480937fbf97c712" dependencies: asn1.js "^4.0.0" browserify-aes "^1.0.0" create-hash "^1.1.0" evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" @@ -5826,103 +5855,87 @@ parse-glob@^3.0.4: parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= dependencies: error-ex "^1.2.0" parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" - integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== + +parsejson@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/parsejson/-/parsejson-0.0.3.tgz#ab7e3759f209ece99437973f7d0f1f64ae0e64ab" + dependencies: + better-assert "~1.0.0" parseqs@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" - integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= dependencies: better-assert "~1.0.0" parseuri@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" - integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= dependencies: better-assert "~1.0.0" -parseurl@~1.3.2: +parseurl@~1.3.1, parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" - integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= path-dirname@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= path-is-inside@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= dependencies: graceful-fs "^4.1.2" pify "^2.0.0" @@ -5931,21 +5944,18 @@ path-type@^1.0.0: path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= dependencies: pify "^2.0.0" path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== dependencies: pify "^3.0.0" pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== + version "3.0.14" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -5956,68 +5966,62 @@ pbkdf2@^3.0.3: pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= phantomjs-prebuilt@^2.1.7: - version "2.1.16" - resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz#efd212a4a3966d3647684ea8ba788549be2aefef" - integrity sha1-79ISpKOWbTZHaE6ouniFSb4q7+8= + version "2.1.15" + resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.15.tgz#20f86e82d3349c505917527745b7a411e08b3903" dependencies: - es6-promise "^4.0.3" - extract-zip "^1.6.5" - fs-extra "^1.0.0" - hasha "^2.2.0" - kew "^0.7.0" - progress "^1.1.8" - request "^2.81.0" - request-progress "^2.0.1" - which "^1.2.10" + es6-promise "~4.0.3" + extract-zip "~1.6.5" + fs-extra "~1.0.0" + hasha "~2.2.0" + kew "~0.7.0" + progress "~1.1.8" + request "~2.81.0" + request-progress "~2.0.1" + which "~1.2.10" pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= pkg-dir@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= dependencies: find-up "^2.1.0" pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== dependencies: find-up "^3.0.0" portfinder@0.4.x: version "0.4.0" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-0.4.0.tgz#a3ffadffafe4fb98e0601a85eda27c27ce84ca1e" - integrity sha1-o/+t/6/k+5jgYBqF7aJ8J86Eyh4= dependencies: async "0.9.0" mkdirp "0.5.x" @@ -6025,16 +6029,14 @@ portfinder@0.4.x: portfinder@1.0.17: version "1.0.17" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" - integrity sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ== dependencies: async "^1.5.2" debug "^2.2.0" mkdirp "0.5.x" portfinder@^1.0.9: - version "1.0.20" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" - integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" dependencies: async "^1.5.2" debug "^2.2.0" @@ -6043,7 +6045,6 @@ portfinder@^1.0.9: portscanner@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/portscanner/-/portscanner-2.1.1.tgz#eabb409e4de24950f5a2a516d35ae769343fbb96" - integrity sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y= dependencies: async "1.5.2" is-number-like "^1.0.3" @@ -6051,12 +6052,10 @@ portscanner@2.1.1: posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= postcss-import@12.0.0: version "12.0.0" resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.0.tgz#149f96a4ef0b27525c419784be8517ebd17e92c5" - integrity sha512-3KqKRZcaZAvxbY8DVLdd81tG5uKzbUQuiWIvy0o0fzEC42bKacqPYFWbfCQyw6L4LWUaqPz/idvIdbhpgQ32eQ== dependencies: postcss "^7.0.1" postcss-value-parser "^3.2.3" @@ -6066,7 +6065,6 @@ postcss-import@12.0.0: postcss-load-config@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.0.0.tgz#f1312ddbf5912cd747177083c5ef7a19d62ee484" - integrity sha512-V5JBLzw406BB8UIfsAWSK2KSwIJ5yoEIVFb4gVkXci0QdKgA24jLmHZ/ghe/GgX0lJ0/D1uUK1ejhzEY94MChQ== dependencies: cosmiconfig "^4.0.0" import-cwd "^2.0.0" @@ -6074,28 +6072,30 @@ postcss-load-config@^2.0.0: postcss-loader@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== dependencies: loader-utils "^1.1.0" postcss "^7.0.0" postcss-load-config "^2.0.0" schema-utils "^1.0.0" -postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.1: +postcss-value-parser@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15" + +postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss@7.0.5: +postcss@7.0.5, postcss@^7.0.0, postcss@^7.0.1: version "7.0.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55" - integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ== dependencies: chalk "^2.4.1" source-map "^0.6.1" supports-color "^5.5.0" -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5: +postcss@^7.0.5: version "7.0.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== @@ -6107,32 +6107,30 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5: prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== -process@^0.11.10: +process@^0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -progress@^1.1.8: +progress@~1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= promise-retry@^1.1.1: version "1.1.1" @@ -6145,7 +6143,6 @@ promise-retry@^1.1.1: promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== dependencies: asap "~2.0.3" @@ -6157,10 +6154,10 @@ protoduck@^5.0.1: genfun "^5.0.0" protractor@~5.4.0: - version "5.4.2" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.2.tgz#329efe37f48b2141ab9467799be2d4d12eb48c13" - integrity sha512-zlIj64Cr6IOWP7RwxVeD8O4UskLYPoyIcg0HboWJL9T79F1F0VWtKkGTr/9GN6BKL+/Q/GmM7C9kFVCfDbP5sA== + version "5.4.1" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.1.tgz#011a99e38df7aa45d22455b889ffbb13a6ce0bd9" dependencies: + "@types/node" "^6.0.46" "@types/q" "^0.0.32" "@types/selenium-webdriver" "^3.0.0" blocking-proxy "^1.0.0" @@ -6177,45 +6174,52 @@ protractor@~5.4.0: webdriver-js-extender "2.1.0" webdriver-manager "^12.0.6" -proxy-addr@~2.0.4: +proxy-addr@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.5.2" + +proxy-addr@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" - integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== dependencies: forwarded "~0.1.2" ipaddr.js "1.8.0" -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= psl@^1.1.24: - version "1.1.31" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.31.tgz#e9aa86d0101b5b105cbe93ac6b784cd547276184" - integrity sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw== + version "1.1.29" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + version "4.0.0" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" dependencies: bn.js "^4.1.0" browserify-rsa "^4.0.0" create-hash "^1.1.0" parse-asn1 "^5.0.0" randombytes "^2.0.1" - safe-buffer "^5.1.2" -pump@^2.0.0, pump@^2.0.1: +pump@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== dependencies: end-of-stream "^1.1.0" once "^1.3.1" @@ -6223,128 +6227,121 @@ pump@^2.0.0, pump@^2.0.1: pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" once "^1.3.1" pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== + version "1.3.5" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" + duplexify "^3.1.2" + inherits "^2.0.1" + pump "^1.0.0" punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= punycode@^1.2.4, punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" q@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" - integrity sha1-VXBbzZPF82c1MMLCy8DCs63cKG4= q@^1.4.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qjobs@^1.1.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071" - integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg== + version "1.1.5" + resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.1.5.tgz#659de9f2cf8dcc27a1481276f205377272382e73" -qs@6.2.3: - version "6.2.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" - integrity sha1-HPyyXBCpsrSDBT/zn138kjOQjP4= +qs@0.4.x: + version "0.4.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-0.4.2.tgz#3cac4c861e371a8c9c4770ac23cda8de639b8e5f" -qs@6.5.2, qs@~6.5.2: - version "6.5.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +qs@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.1.tgz#ce03c5ff0935bc1d9d69a9f14cbd18e568d67625" + +qs@6.5.1, "qs@>= 0.4.0", qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" qs@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" - integrity sha1-6eha2+ddoLvkyOBHaghikPhjtAQ= + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= querystringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" + is-number "^3.0.0" + kind-of "^4.0.0" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== +randombytes@^2.0.0, randombytes@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" dependencies: safe-buffer "^5.1.0" -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= -raw-body@2.3.3, raw-body@^2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" - integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== +raw-body@2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" dependencies: bytes "3.0.0" - http-errors "1.6.3" - iconv-lite "0.4.23" + http-errors "1.6.2" + iconv-lite "0.4.19" unpipe "1.0.0" raw-loader@0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= + +rc@^1.1.7: + version "1.2.2" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" ini "~1.3.0" @@ -6354,14 +6351,12 @@ rc@^1.2.7: read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha1-5mTvMRYRZsl1HNvo28+GtftY93Q= dependencies: pify "^2.3.0" read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= dependencies: find-up "^1.0.0" read-pkg "^1.0.0" @@ -6369,7 +6364,6 @@ read-pkg-up@^1.0.1: read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= dependencies: find-up "^2.0.0" read-pkg "^2.0.0" @@ -6377,7 +6371,6 @@ read-pkg-up@^2.0.0: read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" @@ -6386,25 +6379,26 @@ read-pkg@^1.0.0: read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= dependencies: load-json-file "^2.0.0" normalize-package-data "^2.3.2" path-type "^2.0.0" -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.2.9: + version "2.3.3" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +readable-stream@^2.3.0: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -6414,51 +6408,62 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readdirp@^2.0.0, readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== +readable-stream@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= dependencies: resolve "^1.1.6" redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= dependencies: indent-string "^2.1.0" strip-indent "^1.0.1" reflect-metadata@^0.1.2: - version "0.1.13" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== + version "0.1.10" + resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a" regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== + version "0.11.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== dependencies: is-equal-shallow "^0.1.3" -regex-not@^1.0.0, regex-not@^1.0.2: +regex-not@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + dependencies: + extend-shallow "^2.0.1" + +regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" @@ -6466,41 +6471,115 @@ regex-not@^1.0.0, regex-not@^1.0.2: remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" repeat-string@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" - integrity sha1-x6jTI2BoNiBZp+RlH8aITosftK4= repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= dependencies: is-finite "^1.0.0" -request-progress@^2.0.1: +request-progress@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" - integrity sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg= dependencies: throttleit "^1.0.0" -request@^2.81.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: +request@2.81.0, request@~2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +request@^2.78.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@^2.83.0: + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" - integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -6526,64 +6605,52 @@ request@^2.81.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= require-from-string@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= requires-port@1.x.x, requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8= resolve-cwd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= dependencies: resolve-from "^3.0.0" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= resolve@1.1.7, resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2, resolve@^1.4.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" - integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== +resolve@^1.1.6, resolve@^1.1.7, resolve@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" dependencies: - path-parse "^1.0.6" + path-parse "^1.0.5" + +resolve@^1.3.2: + version "1.7.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" + dependencies: + path-parse "^1.0.5" resp-modifier@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/resp-modifier/-/resp-modifier-6.0.2.tgz#b124de5c4fbafcba541f48ffa73970f4aa456b4f" - integrity sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08= dependencies: debug "^2.2.0" minimatch "^3.0.2" @@ -6591,7 +6658,6 @@ resp-modifier@6.0.2: restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= dependencies: onetime "^2.0.0" signal-exit "^3.0.2" @@ -6599,46 +6665,43 @@ restore-cursor@^2.0.0: ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== retry@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" - integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q= rfdc@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/rfdc/-/rfdc-1.1.2.tgz#e6e72d74f5dc39de8f538f65e00c36c18018e349" - integrity sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA== right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" - integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8= dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: - glob "^7.1.3" + glob "^7.0.5" + +rimraf@~2.2.6: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + version "2.0.1" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.1.tgz#0f4584295c53a3628af7e6d79aca21ce57d1c6e7" dependencies: - hash-base "^3.0.0" + hash-base "^2.0.0" inherits "^2.0.1" rollup-plugin-commonjs@^8.0.2: - version "8.4.1" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.4.1.tgz#5c9cea2b2c3de322f5fbccd147e07ed5e502d7a0" - integrity sha512-mg+WuD+jlwoo8bJtW3Mvx7Tz6TsIdMsdhuvCnDMoyjh0oxsVgsjB/N0X984RJCWwc5IIiqNVJhXeeITcc73++A== + version "8.2.5" + resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.5.tgz#924421278a6f879fd976b2ef1a28391b1e4f2a6e" dependencies: - acorn "^5.2.1" + acorn "^5.1.2" estree-walker "^0.5.0" magic-string "^0.22.4" resolve "^1.4.0" @@ -6647,7 +6710,6 @@ rollup-plugin-commonjs@^8.0.2: rollup-plugin-node-resolve@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-2.0.0.tgz#07e0ae94ac002a3ea36e8f33ca121d9f836b1309" - integrity sha1-B+CulKwAKj6jbo8zyhIdn4NrEwk= dependencies: browser-resolve "^1.11.0" builtin-modules "^1.1.0" @@ -6656,91 +6718,75 @@ rollup-plugin-node-resolve@2.0.0: rollup-plugin-uglify@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/rollup-plugin-uglify/-/rollup-plugin-uglify-1.0.2.tgz#d4aa6f5df13522eae1ba17780c7c4c7096038359" - integrity sha1-1KpvXfE1Iurhuhd4DHxMcJYDg1k= dependencies: uglify-js "^2.6.1" rollup-pluginutils@^2.0.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.4.1.tgz#de43ab54965bbf47843599a7f3adceb723de38db" - integrity sha512-wesMQ9/172IJDIW/lYWm0vW0LiKe5Ekjws481R7z9WTRtmO59cqyM/2uUlxvf6yzm/fElFmHUobeQOYz46dZJw== + version "2.0.1" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" dependencies: - estree-walker "^0.6.0" - micromatch "^3.1.10" + estree-walker "^0.3.0" + micromatch "^2.3.11" rollup@^0.41.6: version "0.41.6" resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a" - integrity sha1-4NBUl4d6OYwQTYFtJzOnGKepTio= dependencies: source-map-support "^0.4.0" run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= dependencies: is-promise "^2.1.0" run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= dependencies: aproba "^1.1.1" rx@2.3.24: version "2.3.24" resolved "https://registry.yarnpkg.com/rx/-/rx-2.3.24.tgz#14f950a4217d7e35daa71bbcbe58eff68ea4b2b7" - integrity sha1-FPlQpCF9fjXapxu8vljv9o6ksrc= rx@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" - integrity sha1-pfE/957zt0D+MKqAP7CfmIBdR4I= -rxjs@6.3.3: +rxjs@6.3.3, rxjs@^6.3.0: version "6.3.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" - integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== dependencies: tslib "^1.9.0" -rxjs@^5.5.6: - version "5.5.12" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.12.tgz#6fa61b8a77c3d793dbaf270bee2f43f652d741cc" - integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== - dependencies: - symbol-observable "1.0.1" - -rxjs@^6.1.0, rxjs@^6.3.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" - integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== +rxjs@^6.1.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.2.tgz#6a688b16c4e6e980e62ea805ec30648e1c60907f" dependencies: tslib "^1.9.0" -safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +safe-buffer@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== sass-graph@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= dependencies: glob "^7.0.0" lodash "^4.0.0" @@ -6750,7 +6796,6 @@ sass-graph@^2.2.4: sass-loader@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" - integrity sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w== dependencies: clone-deep "^2.0.1" loader-utils "^1.0.1" @@ -6762,31 +6807,26 @@ sass-loader@7.1.0: saucelabs@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" - integrity sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ== dependencies: https-proxy-agent "^2.2.1" sax@0.5.x: version "0.5.8" resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" - integrity sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE= sax@>=0.6.0, sax@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== schema-utils@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf" - integrity sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8= dependencies: ajv "^5.0.0" schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== + version "0.4.5" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e" dependencies: ajv "^6.1.0" ajv-keywords "^3.1.0" @@ -6794,7 +6834,6 @@ schema-utils@^0.4.4, schema-utils@^0.4.5: schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: ajv "^6.1.0" ajv-errors "^1.0.0" @@ -6803,7 +6842,6 @@ schema-utils@^1.0.0: scss-tokenizer@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= dependencies: js-base64 "^2.1.8" source-map "^0.4.2" @@ -6811,12 +6849,10 @@ scss-tokenizer@^0.2.3: select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo= selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: version "3.6.0" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" - integrity sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q== dependencies: jszip "^3.1.3" rimraf "^2.5.4" @@ -6824,38 +6860,77 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: xml2js "^0.4.17" selfsigned@^1.9.1: - version "1.10.4" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" - integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== + version "1.10.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52" dependencies: - node-forge "0.7.5" + node-forge "0.6.33" semver-intersect@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/semver-intersect/-/semver-intersect-1.4.0.tgz#bdd9c06bedcdd2fedb8cd352c3c43ee8c61321f3" - integrity sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ== dependencies: semver "^5.0.0" -"semver@2 || 3 || 4 || 5", semver@5.6.0, semver@^5.0.0, semver@^5.0.1, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" - integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +"semver@2 || 3 || 4 || 5", semver@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" semver@5.5.1: version "5.5.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" - integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== + +semver@5.6.0, semver@^5.4.1, semver@^5.6.0: + version "5.6.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" + integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== + +semver@^5.0.0, semver@^5.0.1, semver@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= + +send@0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/send/-/send-0.15.2.tgz#f91fab4403bcf87e716f70ceb5db2f578bdc17d6" + dependencies: + debug "2.6.4" + depd "~1.1.0" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.0" + fresh "0.5.0" + http-errors "~1.6.1" + mime "1.3.4" + ms "1.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +send@0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" + dependencies: + debug "2.6.9" + depd "~1.1.1" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" - integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== dependencies: debug "2.6.9" depd "~1.1.2" @@ -6872,14 +6947,24 @@ send@0.16.2: statuses "~1.4.0" serialize-javascript@^1.4.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.6.1.tgz#4d1f697ec49429a847ca6f442a2a755126c4d879" - integrity sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw== + version "1.4.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005" -serve-index@1.9.1, serve-index@^1.7.2: +serve-index@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.8.0.tgz#7c5d96c13fb131101f93c1c5774f8516a1e78d3b" + dependencies: + accepts "~1.3.3" + batch "0.5.3" + debug "~2.2.0" + escape-html "~1.0.3" + http-errors "~1.5.0" + mime-types "~2.1.11" + parseurl "~1.3.1" + +serve-index@^1.7.2: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= dependencies: accepts "~1.3.4" batch "0.6.1" @@ -6889,10 +6974,27 @@ serve-index@1.9.1, serve-index@^1.7.2: mime-types "~2.1.17" parseurl "~1.3.2" +serve-static@1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.2.tgz#e546e2726081b81b4bcec8e90808ebcdd323afba" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.1" + send "0.15.2" + +serve-static@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.1" + serve-static@1.13.2: version "1.13.2" resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" - integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" @@ -6902,22 +7004,24 @@ serve-static@1.13.2: server-destroy@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" - integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0= set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= -set-immediate-shim@~1.0.1: +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + dependencies: + to-object-path "^0.3.0" + +set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6927,7 +7031,6 @@ set-value@^0.4.3: set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" @@ -6937,17 +7040,22 @@ set-value@^2.0.0: setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" + +setprototypeof@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + version "2.4.9" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" dependencies: inherits "^2.0.1" safe-buffer "^5.0.1" @@ -6955,7 +7063,6 @@ sha.js@^2.4.0, sha.js@^2.4.8: shallow-clone@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-1.0.0.tgz#4480cd06e882ef68b2ad88a3ea54832e2c48b571" - integrity sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA== dependencies: is-extendable "^0.1.1" kind-of "^5.0.0" @@ -6964,19 +7071,16 @@ shallow-clone@^1.0.0: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shelljs@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" - integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + version "0.8.2" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -6985,12 +7089,10 @@ shelljs@^0.8.1: signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= smart-buffer@4.0.2: version "4.0.2" @@ -7000,7 +7102,6 @@ smart-buffer@4.0.2: snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== dependencies: define-property "^1.0.0" isobject "^3.0.0" @@ -7009,14 +7110,12 @@ snapdragon-node@^2.0.1: snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== + version "0.8.1" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" dependencies: base "^0.11.1" debug "^2.2.0" @@ -7025,17 +7124,50 @@ snapdragon@^0.8.1: map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" - use "^3.1.0" + use "^2.0.0" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +socket.io-adapter@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz#cb6d4bb8bec81e1078b99677f9ced0046066bb8b" + dependencies: + debug "2.3.3" + socket.io-parser "2.3.1" socket.io-adapter@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" - integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= + +socket.io-client@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-1.6.0.tgz#5b668f4f771304dfeed179064708386fa6717853" + dependencies: + backo2 "1.0.2" + component-bind "1.0.0" + component-emitter "1.2.1" + debug "2.3.3" + engine.io-client "1.8.0" + has-binary "0.1.7" + indexof "0.0.1" + object-component "0.0.3" + parseuri "0.0.5" + socket.io-parser "2.3.1" + to-array "0.1.4" socket.io-client@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.1.1.tgz#dcb38103436ab4578ddb026638ae2f21b623671f" - integrity sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ== dependencies: backo2 "1.0.2" base64-arraybuffer "0.1.5" @@ -7052,48 +7184,38 @@ socket.io-client@2.1.1: socket.io-parser "~3.2.0" to-array "0.1.4" -socket.io-client@^2.0.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" - integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== +socket.io-parser@2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-2.3.1.tgz#dd532025103ce429697326befd64005fcfe5b4a0" dependencies: - backo2 "1.0.2" - base64-arraybuffer "0.1.5" - component-bind "1.0.0" - component-emitter "1.2.1" - debug "~3.1.0" - engine.io-client "~3.3.1" - has-binary2 "~1.0.2" - has-cors "1.1.0" - indexof "0.0.1" - object-component "0.0.3" - parseqs "0.0.5" - parseuri "0.0.5" - socket.io-parser "~3.3.0" - to-array "0.1.4" + component-emitter "1.1.2" + debug "2.2.0" + isarray "0.0.1" + json3 "3.3.2" socket.io-parser@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.2.0.tgz#e7c6228b6aa1f814e6148aea325b51aa9499e077" - integrity sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA== dependencies: component-emitter "1.2.1" debug "~3.1.0" isarray "2.0.1" -socket.io-parser@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" - integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== +socket.io@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-1.6.0.tgz#3e40d932637e6bd923981b25caf7c53e83b6e2e1" dependencies: - component-emitter "1.2.1" - debug "~3.1.0" - isarray "2.0.1" + debug "2.3.3" + engine.io "1.8.0" + has-binary "0.1.7" + object-assign "4.1.0" + socket.io-adapter "0.5.0" + socket.io-client "1.6.0" + socket.io-parser "2.3.1" socket.io@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.1.1.tgz#a069c5feabee3e6b214a75b40ce0652e1cfb9980" - integrity sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA== dependencies: debug "~3.1.0" engine.io "~3.2.0" @@ -7117,7 +7239,6 @@ sockjs-client@1.3.0: sockjs@0.3.19: version "0.3.19" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== dependencies: faye-websocket "^0.10.0" uuid "^3.0.1" @@ -7139,52 +7260,46 @@ socks@~2.2.0: smart-buffer "4.0.2" source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + version "2.0.0" + resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" source-list-map@~0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106" - integrity sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY= source-map-explorer@^1.3.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-1.7.0.tgz#d6ff79eaf11990223c35ced78788c09d6e864968" - integrity sha512-S9Tb48Ia4ozNLvr0khOzygfoFjtzRVLD/h2I0VzwUoWz+rmuvNMzuzmbAHcK7/F6Gley3yhr1Mhoavokv5qg8A== + version "1.5.0" + resolved "https://registry.yarnpkg.com/source-map-explorer/-/source-map-explorer-1.5.0.tgz#654e2ba0db158fecfc99b9cefdf891b755b767d1" dependencies: btoa "^1.1.2" convert-source-map "^1.1.1" docopt "^0.6.2" - ejs "^2.6.1" glob "^7.1.2" - opn "^5.3.0" + open "0.0.5" source-map "^0.5.1" - temp "^0.9.0" + temp "^0.8.3" + underscore "^1.8.3" source-map-loader@0.2.4: version "0.2.4" resolved "https://registry.yarnpkg.com/source-map-loader/-/source-map-loader-0.2.4.tgz#c18b0dc6e23bf66f6792437557c569a11e072271" - integrity sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ== dependencies: async "^2.5.0" loader-utils "^1.1.0" source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" dependencies: - atob "^2.1.1" + atob "^2.0.0" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@0.5.9: +source-map-support@0.5.9, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.6: version "0.5.9" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -7192,104 +7307,72 @@ source-map-support@0.5.9: source-map-support@^0.4.0, source-map-support@~0.4.0: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== dependencies: source-map "^0.5.6" -source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.9: - version "0.5.10" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" - integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= source-map@0.1.x: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" - integrity sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y= dependencies: amdefine ">=0.0.4" source-map@0.5.6: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - integrity sha1-dc449SvwczxafwwRjYEzSiu19BI= source-map@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@^0.4.2, source-map@~0.4.1: +source-map@^0.4.2, source-map@^0.4.4, source-map@~0.4.1: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.6, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== source-map@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= dependencies: amdefine ">=0.0.4" -sourcemap-codec@^1.4.4: - version "1.4.4" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" - integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== +sourcemap-codec@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz#c8fd92d91889e902a07aee392bdd2c5863958ba2" spawn-command@^0.0.2-1: - version "0.0.2-1" - resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" - integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A= + version "0.0.2" + resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2.tgz#9544e1a43ca045f8531aac1a48cb29bdae62338e" -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" + spdx-license-ids "^1.0.2" -spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" -spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz#81c0ce8f21474756148bbb5f3bfc0f36bf15d76e" - integrity sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g== +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" spdy-transport@^2.0.18: - version "2.1.1" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.1.tgz#c54815d73858aadd06ce63001e7d25fa6441623b" - integrity sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q== + version "2.0.20" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" dependencies: debug "^2.6.8" detect-node "^2.0.3" @@ -7302,7 +7385,6 @@ spdy-transport@^2.0.18: spdy@^3.4.1: version "3.4.7" resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" - integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw= dependencies: debug "^2.6.8" handle-thing "^1.2.5" @@ -7321,48 +7403,42 @@ speed-measure-webpack-plugin@1.2.3: split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= sshpk@^1.7.0: - version "1.16.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg== + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" dashdash "^1.12.0" - ecc-jsbn "~0.1.1" getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" jsbn "~0.1.0" - safer-buffer "^2.0.2" tweetnacl "~0.14.0" ssri@^5.2.4: version "5.3.0" resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== dependencies: safe-buffer "^5.1.1" ssri@^6.0.0, ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: figgy-pudding "^3.5.1" static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= dependencies: define-property "^0.2.5" object-copy "^0.1.0" @@ -7370,68 +7446,54 @@ static-extend@^0.1.1: stats-webpack-plugin@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/stats-webpack-plugin/-/stats-webpack-plugin-0.7.0.tgz#ccffe9b745de8bbb155571e063f8263fc0e2bc06" - integrity sha512-NT0YGhwuQ0EOX+uPhhUcI6/+1Sq/pMzNuSCBVT4GbFl/ac6I/JZefBcjlECNfAb1t3GOx5dEj1Z7x0cAxeeVLQ== dependencies: lodash "^4.17.4" -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= - -statuses@~1.4.0: +"statuses@>= 1.3.1 < 2", statuses@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" - integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== + +statuses@~1.3.0, statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== + version "1.4.0" + resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.0.tgz#a2c7c8587e54d9427ea9edb3ac3f2cd522df378b" dependencies: readable-stream "^2.0.1" stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== + version "2.0.1" + resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" dependencies: inherits "~2.0.1" readable-stream "^2.0.2" stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== + version "1.2.2" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" dependencies: end-of-stream "^1.1.0" stream-shift "^1.0.0" -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== +stream-http@^2.3.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.3.6" + readable-stream "^2.2.6" to-arraybuffer "^1.0.0" xtend "^4.0.0" stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= stream-throttle@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/stream-throttle/-/stream-throttle-0.1.3.tgz#add57c8d7cc73a81630d31cd55d3961cfafba9c3" - integrity sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM= dependencies: commander "^2.2.0" limiter "^1.0.5" @@ -7439,7 +7501,6 @@ stream-throttle@^0.1.3: streamroller@0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/streamroller/-/streamroller-0.7.0.tgz#a1d1b7cf83d39afb0d63049a5acbf93493bdf64b" - integrity sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ== dependencies: date-format "^1.2.0" debug "^3.1.0" @@ -7449,45 +7510,53 @@ streamroller@0.7.0: string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" -string_decoder@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" - integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== +string_decoder@^0.10.25, string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" dependencies: safe-buffer "~5.1.0" string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== dependencies: safe-buffer "~5.1.0" +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= dependencies: ansi-regex "^3.0.0" @@ -7501,31 +7570,26 @@ strip-ansi@^5.0.0: strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= dependencies: is-utf8 "^0.2.0" strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= strip-indent@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= dependencies: get-stdin "^4.0.1" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= style-loader@0.23.1: version "0.23.1" @@ -7538,7 +7602,6 @@ style-loader@0.23.1: stylus-loader@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-3.0.2.tgz#27a706420b05a38e038e7cacb153578d450513c6" - integrity sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA== dependencies: loader-utils "^1.0.2" lodash.clonedeep "^4.5.0" @@ -7547,7 +7610,6 @@ stylus-loader@3.0.2: stylus@0.54.5: version "0.54.5" resolved "https://registry.yarnpkg.com/stylus/-/stylus-0.54.5.tgz#42b9560931ca7090ce8515a798ba9e6aa3d6dc79" - integrity sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk= dependencies: css-parse "1.7.x" debug "*" @@ -7556,64 +7618,103 @@ stylus@0.54.5: sax "0.5.x" source-map "0.1.x" +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= supports-color@^3.1.0, supports-color@^3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= dependencies: has-flag "^1.0.0" -supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== +supports-color@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" + dependencies: + has-flag "^2.0.0" + +supports-color@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" + dependencies: + has-flag "^2.0.0" + +supports-color@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" dependencies: has-flag "^3.0.0" -supports-color@^6.0.0, supports-color@^6.1.0: +supports-color@^5.4.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + +supports-color@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== dependencies: has-flag "^3.0.0" -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - integrity sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ= - symbol-observable@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" - integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== systemjs@0.19.39: version "0.19.39" resolved "https://registry.yarnpkg.com/systemjs/-/systemjs-0.19.39.tgz#e513e6f91a25a37b8b607c51c7989ee0d67b9356" - integrity sha1-5RPm+Rolo3uLYHxRx5ie4NZ7k1Y= dependencies: when "^3.7.5" -tapable@^1.0.0, tapable@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" - integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== +tapable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" -tar@^2.0.0: +tapable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" + +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar@^2.0.0, tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= dependencies: block-stream "*" fstream "^1.0.2" inherits "2" -tar@^4, tar@^4.4.8: +tar@^4: + version "4.4.6" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" + dependencies: + chownr "^1.0.1" + fs-minipass "^1.2.5" + minipass "^2.3.3" + minizlib "^1.1.0" + mkdirp "^0.5.0" + safe-buffer "^5.1.2" + yallist "^3.0.2" + +tar@^4.4.8: version "4.4.8" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== @@ -7626,17 +7727,16 @@ tar@^4, tar@^4.4.8: safe-buffer "^5.1.2" yallist "^3.0.2" -temp@^0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.0.tgz#61391795a11bd9738d4c4d7f55f012cb8f55edaa" - integrity sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ== +temp@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" dependencies: - rimraf "~2.6.2" + os-tmpdir "^1.0.0" + rimraf "~2.2.6" terser-webpack-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" - integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA== dependencies: cacache "^11.0.2" find-cache-dir "^2.0.0" @@ -7648,18 +7748,16 @@ terser-webpack-plugin@1.1.0: worker-farm "^1.5.2" terser@^3.8.1: - version "3.16.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493" - integrity sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow== + version "3.8.2" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.2.tgz#48b880f949f8d038aca4dfd00a37c53d96ecf9fb" dependencies: commander "~2.17.1" source-map "~0.6.1" - source-map-support "~0.5.9" + source-map-support "~0.5.6" tfunk@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/tfunk/-/tfunk-3.1.0.tgz#38e4414fc64977d87afdaa72facb6d29f82f7b5b" - integrity sha1-OORBT8ZJd9h6/apy+sttKfgve1s= dependencies: chalk "^1.1.1" object-path "^0.9.0" @@ -7667,131 +7765,120 @@ tfunk@^3.0.1: throttleit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" - integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw= through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: - readable-stream "~2.3.6" + readable-stream "^2.1.5" xtend "~4.0.1" "through@>=2.2.7 <3", through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -thunky@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" - integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== +thunky@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e" -timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== +timers-browserify@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.4.tgz#96ca53f4b794a5e7c0e1bd7cc88a372298fa01e6" dependencies: setimmediate "^1.0.4" tmp@0.0.30: version "0.0.30" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" - integrity sha1-ckGdSovn1s51FI/YsyTlk6cRwu0= dependencies: os-tmpdir "~1.0.1" tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== dependencies: os-tmpdir "~1.0.2" to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" - integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= dependencies: is-number "^3.0.0" repeat-string "^1.6.1" -to-regex@^3.0.1, to-regex@^3.0.2: +to-regex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + dependencies: + define-property "^0.2.5" + extend-shallow "^2.0.1" + regex-not "^1.0.0" + +to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" regex-not "^1.0.2" safe-regex "^1.1.0" +tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" - integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== dependencies: psl "^1.1.24" punycode "^1.4.1" -tree-kill@1.2.0: +tree-kill@1.2.0, tree-kill@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" - integrity sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg== - -tree-kill@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" - integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= "true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== + version "1.0.2" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.2.tgz#7ec91130924766c7f573be3020c34f8fdfd00d62" dependencies: - glob "^7.1.2" + glob "^6.0.4" ts-loader@^4.2.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.5.0.tgz#a1ce70b2dc799941fb2197605f0d67874097859b" - integrity sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw== + version "4.4.1" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.4.1.tgz#c93a46eea430ebce1f790dfe438caefb8670d365" dependencies: chalk "^2.3.0" enhanced-resolve "^4.0.0" @@ -7802,7 +7889,6 @@ ts-loader@^4.2.0: ts-node@~7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" - integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== dependencies: arrify "^1.0.0" buffer-from "^1.1.0" @@ -7813,15 +7899,17 @@ ts-node@~7.0.0: source-map-support "^0.5.6" yn "^2.0.0" -tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.0, tslib@^1.8.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" + +tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== tslint@~5.11.0: version "5.11.0" resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" - integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0= dependencies: babel-code-frame "^6.22.0" builtin-modules "^1.1.1" @@ -7839,38 +7927,39 @@ tslint@~5.11.0: tsutils@^2.27.2: version "2.29.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" - integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== dependencies: tslib "^1.8.1" tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= dependencies: prelude-ls "~1.1.2" +type-is@~1.6.15: + version "1.6.15" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" + dependencies: + media-typer "0.3.0" + mime-types "~2.1.15" + type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" - integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== dependencies: media-typer "0.3.0" mime-types "~2.1.18" @@ -7878,9 +7967,8 @@ type-is@~1.6.16: typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.1.6, typescript@~3.1.1: +typescript@3.1.6: version "3.1.6" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== @@ -7890,23 +7978,24 @@ typescript@3.2.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d" integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg== -ua-parser-js@0.7.17: - version "0.7.17" - resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" - integrity sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g== +typescript@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.1.tgz#3362ba9dd1e482ebb2355b02dfe8bcd19a2c7c96" + +ua-parser-js@0.7.12: + version "0.7.12" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== + version "3.3.8" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.8.tgz#f2c68e6cff0d0f9dc9577e4da207151c2e753b7e" dependencies: commander "~2.13.0" source-map "~0.6.1" -uglify-js@^2.6.1: +uglify-js@^2.6, uglify-js@^2.6.1: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" - integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0= dependencies: source-map "~0.5.1" yargs "~3.10.0" @@ -7916,7 +8005,6 @@ uglify-js@^2.6.1: uglify-js@^3.1.4: version "3.4.9" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" - integrity sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q== dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -7924,12 +8012,10 @@ uglify-js@^3.1.4: uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" - integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc= uglifyjs-webpack-plugin@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" - integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== + version "1.2.4" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.4.tgz#5eec941b2e9b8538be0a20fc6eda25b14c7c1043" dependencies: cacache "^10.0.4" find-cache-dir "^1.0.0" @@ -7940,15 +8026,29 @@ uglifyjs-webpack-plugin@^1.2.4: webpack-sources "^1.1.0" worker-farm "^1.5.2" +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +ultron@1.0.x: + version "1.0.2" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" + ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== + +underscore@1.7.x: + version "1.7.0" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209" + +underscore@^1.8.3: + version "1.8.3" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= dependencies: arr-union "^3.1.0" get-value "^2.0.6" @@ -7958,11 +8058,16 @@ union-value@^1.0.0: union@~0.4.3: version "0.4.6" resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0" - integrity sha1-GY+9rrolTniLDvy2MLwR8kopWeA= dependencies: qs "~2.3.3" -unique-filename@^1.1.0, unique-filename@^1.1.1: +unique-filename@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== @@ -7970,51 +8075,49 @@ unique-filename@^1.1.0, unique-filename@^1.1.1: unique-slug "^2.0.0" unique-slug@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.1.tgz#5e9edc6d1ce8fb264db18a507ef9bd8544451ca6" - integrity sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg== + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" dependencies: imurmurhash "^0.1.4" universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= dependencies: has-value "^0.3.1" isobject "^3.0.0" -upath@^1.0.5, upath@^1.1.0: +upath@^1.0.0, upath@^1.0.5: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== + +uri-js@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-3.0.2.tgz#f90b858507f81dea4dcfbb3c4c3dbfa2b557faaa" + dependencies: + punycode "^2.1.0" uri-js@^4.2.2: version "4.2.2" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== dependencies: punycode "^2.1.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= url-join@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" - integrity sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg= url-parse@^1.4.3: version "1.4.4" @@ -8027,20 +8130,21 @@ url-parse@^1.4.3: url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= dependencies: punycode "1.3.2" querystring "0.2.0" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +use@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + dependencies: + define-property "^0.2.5" + isobject "^3.0.0" + lazy-cache "^2.0.2" useragent@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" - integrity sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4= dependencies: lru-cache "2.2.x" tmp "0.0.x" @@ -8048,150 +8152,135 @@ useragent@2.2.1: util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util@0.10.3: +util@0.10.3, util@^0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= dependencies: inherits "2.0.1" -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" +utils-merge@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.3.2: +uuid@^3.0.0, uuid@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +uuid@^3.0.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +uuid@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== v8-compile-cache@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" - integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" validate-npm-package-name@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= dependencies: builtins "^1.0.3" vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" -vlq@^0.2.2: +vlq@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - integrity sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= dependencies: indexof "0.0.1" void-elements@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" - integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== + version "1.5.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.5.0.tgz#231e783af830a22f8966f65c4c4bacc814072eed" dependencies: chokidar "^2.0.2" graceful-fs "^4.1.2" neo-async "^2.5.0" wbuf@^1.1.0, wbuf@^1.7.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + version "1.7.2" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" dependencies: minimalistic-assert "^1.0.0" web-animations-js@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/web-animations-js/-/web-animations-js-2.3.1.tgz#3a6d9bc15196377a90f8e2803fa5262165b04510" - integrity sha1-Om2bwVGWN3qQ+OKAP6UmIWWwRRA= webdriver-js-extender@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz#57d7a93c00db4cc8d556e4d3db4b5db0a80c3bb7" - integrity sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ== dependencies: "@types/selenium-webdriver" "^3.0.0" selenium-webdriver "^3.0.1" webdriver-manager@^12.0.6: - version "12.1.1" - resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.1.1.tgz#66c3271f69cefdaa9fdfca617ae95afae41c3c62" - integrity sha512-L9TEQmZs6JbMMRQI1w60mfps265/NCr0toYJl7p/R2OAk6oXAfwI6jqYP7EWae+d7Ad2S2Aj4+rzxoSjqk3ZuA== + version "12.0.6" + resolved "https://registry.yarnpkg.com/webdriver-manager/-/webdriver-manager-12.0.6.tgz#3df1a481977010b4cbf8c9d85c7a577828c0e70b" dependencies: - adm-zip "^0.4.9" + adm-zip "^0.4.7" chalk "^1.1.1" del "^2.2.0" glob "^7.0.3" ini "^1.3.4" minimist "^1.2.0" q "^1.4.1" - request "^2.87.0" + request "^2.78.0" rimraf "^2.5.2" semver "^5.3.0" xml2js "^0.4.17" webpack-cli@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.2.3.tgz#13653549adfd8ccd920ad7be1ef868bacc22e346" - integrity sha512-Ik3SjV6uJtWIAN5jp5ZuBMWEAaP5E4V78XJ2nI+paFPh8v4HPSwo/myN0r29Xc/6ZKnd2IdrAlpSgNOu2CDQ6Q== + version "3.1.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.2.tgz#17d7e01b77f89f884a2bbf9db545f0f6a648e746" dependencies: chalk "^2.4.1" cross-spawn "^6.0.5" enhanced-resolve "^4.1.0" - findup-sync "^2.0.0" - global-modules "^1.0.0" + global-modules-path "^2.3.0" import-local "^2.0.0" interpret "^1.1.0" loader-utils "^1.1.0" supports-color "^5.5.0" v8-compile-cache "^2.0.2" - yargs "^12.0.4" + yargs "^12.0.2" webpack-core@^0.6.8: version "0.6.9" resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2" - integrity sha1-/FcViMhVjad76e+23r3Fo7FyvcI= dependencies: source-list-map "~0.1.7" source-map "~0.4.1" @@ -8243,7 +8332,6 @@ webpack-dev-server@3.1.10: webpack-log@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== dependencies: ansi-colors "^3.0.0" uuid "^3.3.2" @@ -8251,19 +8339,17 @@ webpack-log@^2.0.0: webpack-merge@4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" - integrity sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ== dependencies: lodash "^4.17.5" -webpack-sources@1.2.0: +webpack-sources@1.2.0, webpack-sources@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" - integrity sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw== dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack-sources@1.3.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0: +webpack-sources@1.3.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== @@ -8271,10 +8357,16 @@ webpack-sources@1.3.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-s source-list-map "^2.0.0" source-map "~0.6.1" +webpack-sources@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + webpack-subresource-integrity@1.1.0-rc.6: version "1.1.0-rc.6" resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz#37f6f1264e1eb378e41465a98da80fad76ab8886" - integrity sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w== dependencies: webpack-core "^0.6.8" @@ -8311,86 +8403,97 @@ webpack@4.23.1: websocket-driver@>=0.5.1: version "0.7.0" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" - integrity sha1-DK+dLXVdk67gSdS90NP+LMoqJOs= dependencies: http-parser-js ">=0.4.0" websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" - integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== + version "0.1.2" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.2.tgz#0e18781de629a18308ce1481650f67ffa2693a5d" + +weinre@^2.0.0-pre-I0Z7U9OV: + version "2.0.0-pre-I0Z7U9OV" + resolved "https://registry.yarnpkg.com/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz#fef8aa223921f7b40bbbbd4c3ed4302f6fd0a813" + dependencies: + express "2.5.x" + nopt "3.0.x" + underscore "1.7.x" when@^3.7.5: version "3.7.8" resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82" - integrity sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I= when@~3.6.x: version "3.6.4" resolved "https://registry.yarnpkg.com/when/-/when-3.6.4.tgz#473b517ec159e2b85005497a13983f095412e34e" - integrity sha1-RztRfsFZ4rhQBUl6E5g/CVQS404= which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.1.1, which@^1.2.1, which@^1.2.10, which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@1, which@^1.1.1, which@^1.2.1, which@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: isexe "^2.0.0" -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@~1.2.10: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" - integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0= + +window-size@^0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" window-size@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU= wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" - integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8= wordwrap@^1.0.0, wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== + version "1.5.2" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae" dependencies: - errno "~0.1.7" + errno "^0.1.4" + xtend "^4.0.1" wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" @@ -8398,117 +8501,100 @@ wrap-ansi@^2.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.1.tgz#082ddb6c641e85d4bb451f03d52f06eabdb1f018" + dependencies: + options ">=0.0.5" + ultron "1.0.x" ws@~3.3.1: version "3.3.3" resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== dependencies: async-limiter "~1.0.0" safe-buffer "~5.1.0" ultron "~1.1.0" -ws@~6.1.0: - version "6.1.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9" - integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA== - dependencies: - async-limiter "~1.0.0" +wtf-8@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" xhr2@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" - integrity sha1-f4dliEdxbbUCYyOBL4GMras4el8= xml2js@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" - integrity sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q== dependencies: sax ">=0.6.0" xmlbuilder "~9.0.1" xmlbuilder@~9.0.1: - version "9.0.7" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" - integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= + version "9.0.4" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f" + +xmlhttprequest-ssl@1.5.3: + version "1.5.3" + resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" xmlhttprequest-ssl@~1.5.4: version "1.5.5" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" - integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -y18n@^3.2.1: +y18n@^3.2.0, y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: - version "3.0.3" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" - integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== + version "3.0.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" yargs-parser@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== dependencies: camelcase "^4.1.0" -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^4.1.0, yargs-parser@^4.2.0: +yargs-parser@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" - integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw= dependencies: camelcase "^3.0.0" yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" - integrity sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo= dependencies: camelcase "^3.0.0" yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" - integrity sha1-jQrELxbqVd69MyyvTEA4s+P139k= dependencies: camelcase "^4.1.0" -yargs@12.0.2: +yargs@12.0.2, yargs@^12.0.2: version "12.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" - integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== dependencies: cliui "^4.0.0" decamelize "^2.0.0" @@ -8523,10 +8609,20 @@ yargs@12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" +yargs@3.29.0: + version "3.29.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.29.0.tgz#1aab9660eae79d8b8f675bcaeeab6ee34c2cf69c" + dependencies: + camelcase "^1.2.1" + cliui "^3.0.3" + decamelize "^1.0.0" + os-locale "^1.4.0" + window-size "^0.1.2" + y18n "^3.2.0" + yargs@6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.4.0.tgz#816e1a866d5598ccf34e5596ddce22d92da490d4" - integrity sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ= dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -8543,29 +8639,9 @@ yargs@6.4.0: y18n "^3.2.1" yargs-parser "^4.1.0" -yargs@6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" - integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg= - dependencies: - camelcase "^3.0.0" - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.2" - which-module "^1.0.0" - y18n "^3.2.1" - yargs-parser "^4.2.0" - yargs@9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" - integrity sha1-UqzCP+7Kw0BCB47njAwAf1CF20w= dependencies: camelcase "^4.1.0" cliui "^3.2.0" @@ -8581,28 +8657,9 @@ yargs@9.0.1: y18n "^3.2.1" yargs-parser "^7.0.0" -yargs@^12.0.4: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" - integrity sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg= dependencies: camelcase "^3.0.0" cliui "^3.2.0" @@ -8621,7 +8678,6 @@ yargs@^7.0.0: yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" - integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E= dependencies: camelcase "^1.0.2" cliui "^2.1.0" @@ -8631,21 +8687,17 @@ yargs@~3.10.0: yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - integrity sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU= dependencies: fd-slicer "~1.0.1" yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" - integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= yn@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" - integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= zone.js@~0.8.26: - version "0.8.29" - resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.29.tgz#8dce92aa0dd553b50bc5bfbb90af9986ad845a12" - integrity sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ== + version "0.8.26" + resolved "https://registry.yarnpkg.com/zone.js/-/zone.js-0.8.26.tgz#7bdd72f7668c5a7ad6b118148b4ea39c59d08d2d" diff --git a/aio/tools/transforms/angular-api-package/processors/computeApiBreadCrumbs.spec.js b/aio/tools/transforms/angular-api-package/processors/computeApiBreadCrumbs.spec.js index e595134f31..af81d206db 100644 --- a/aio/tools/transforms/angular-api-package/processors/computeApiBreadCrumbs.spec.js +++ b/aio/tools/transforms/angular-api-package/processors/computeApiBreadCrumbs.spec.js @@ -17,10 +17,17 @@ describe('angular-api-package: computeApiBreadCrumbs processor', () => { const API_DOC_TYPES_TO_RENDER = ['class', 'interface', 'package']; const processor = processorFactory(API_DOC_TYPES_TO_RENDER); + const corePackage = { docType: 'package', name: '@angular/core', id: 'core', path: 'core', isPrimaryPackage: true }; + const coreTestingPackage = { docType: 'package', name: '@angular/core/testing', id: 'core/testing', path: 'core/testing', packageInfo: { primary: corePackage } }; + const testRequestClass = { docType: 'class', name: 'InjectSetupWrapper', path: 'core/testing/test_bed', moduleDoc: coreTestingPackage }; + const docs = [ { docType: 'class', name: 'ClassA', path: 'module-1/class-a', moduleDoc: { id: 'moduleOne', path: 'module-1' } }, { docType: 'interface', name: 'InterfaceB', path: 'module-2/interface-b', moduleDoc: { id: 'moduleTwo', path: 'module-2' } }, { docType: 'guide', name: 'Guide One', path: 'guide/guide-1' }, + corePackage, + coreTestingPackage, + testRequestClass ]; processor.$process(docs); @@ -35,5 +42,20 @@ describe('angular-api-package: computeApiBreadCrumbs processor', () => { { text: 'InterfaceB', path: 'module-2/interface-b' }, ]); expect(docs[2].breadCrumbs).toBeUndefined(); + expect(docs[3].breadCrumbs).toEqual([ + { text: 'API', path: '/api' }, + { text: '@angular/core', path: 'core' }, + ]); + expect(docs[4].breadCrumbs).toEqual([ + { text: 'API', path: '/api' }, + { text: '@angular/core', path: 'core' }, + { text: '@angular/core/testing', path: 'core/testing' }, + ]); + expect(docs[5].breadCrumbs).toEqual([ + { text: 'API', path: '/api' }, + { text: '@angular/core', path: 'core' }, + { text: '@angular/core/testing', path: 'core/testing' }, + { text: 'InjectSetupWrapper', path: 'core/testing/test_bed' }, + ]); }); }); From 99aa9674b2f4a8ecaa29712d3bb2ede51f261f03 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 11 Mar 2019 18:51:11 +0100 Subject: [PATCH 0293/1073] test(ivy): remove chip list tests from blocklist (#29228) Updates the blocklist to enable the tests that were fixed by https://github.com/angular/material2/pull/15427. This PR resolves FW-1145. PR Close #29228 --- .../angular_material_test_blocklist.js | 52 ------------------- 1 file changed, 52 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 991b88e898..446bdb7dfd 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -109,58 +109,6 @@ window.testBlocklist = { "error": "Error: Failed: Expected node descendant num to be 2 but was 0", "notes": "Breaking change: Content queries and descendants flag (fix test by removing
in NestedCdkTreeAppWithToggle)" }, - "MatChipList StandardChipList basic behaviors should toggle the chips disabled state based on whether it is disabled": { - "error": "Error: Expected true to be false.", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList focus behaviors should focus the first chip on focus": { - "error": "Error: Expected -1 to be 0.", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList focus behaviors should watch for chip focus": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList focus behaviors on chip destroy should focus the next item": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList focus behaviors on chip destroy should focus the previous item": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList focus behaviors on chip destroy should not focus if chip list is not focused": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList keyboard behavior LTR (default) should focus previous item when press LEFT ARROW": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList keyboard behavior LTR (default) should focus next item when press RIGHT ARROW": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList keyboard behavior LTR (default) should focus the first item when pressing HOME": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList keyboard behavior RTL should focus previous item when press RIGHT ARROW": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList keyboard behavior RTL should focus next item when press LEFT ARROW": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList StandardChipList keyboard behavior should account for the direction changing": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, - "MatChipList with chip remove should properly focus next item if chip is removed through click": { - "error": "TypeError: Cannot read property 'focus' of undefined", - "notes": "MatChipList does not find MatChip content children because descendants is not true anymore. TODO: Fix spec so that it does not have the wrapping div" - }, "MatStepper basic stepper should go to next available step when the next button is clicked": { "error": "Error: Expected 2 to be 1.", "notes": "Unknown" From 1d88c2bb81b077efbf073318add678be2b035f4d Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Fri, 8 Mar 2019 15:32:31 -0800 Subject: [PATCH 0294/1073] fix(ivy): handle aliased Angular decorators (#29195) Prior to this change the code didn't take into account the fact that decorators can be aliases while importing into a script. As a result, these decorators were not recognized by Angular and various failures happened because of that. Now we take aliases into account and resolve decorator name properly. PR Close #29195 --- .../ngcc/src/analysis/decoration_analyzer.ts | 2 +- .../src/ngtsc/annotations/src/base_def.ts | 24 ++++--- .../src/ngtsc/annotations/src/component.ts | 5 +- .../src/ngtsc/annotations/src/directive.ts | 6 +- .../src/ngtsc/annotations/src/injectable.ts | 5 +- .../src/ngtsc/annotations/src/ng_module.ts | 5 +- .../src/ngtsc/annotations/src/pipe.ts | 5 +- .../src/ngtsc/annotations/src/util.ts | 20 +++++- packages/compiler-cli/src/ngtsc/program.ts | 2 +- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 69 +++++++++++++++++++ 10 files changed, 111 insertions(+), 32 deletions(-) diff --git a/packages/compiler-cli/src/ngcc/src/analysis/decoration_analyzer.ts b/packages/compiler-cli/src/ngcc/src/analysis/decoration_analyzer.ts index bbc4cfb50c..5d50f1d025 100644 --- a/packages/compiler-cli/src/ngcc/src/analysis/decoration_analyzer.ts +++ b/packages/compiler-cli/src/ngcc/src/analysis/decoration_analyzer.ts @@ -81,7 +81,7 @@ export class DecorationAnalyzer { importGraph = new ImportGraph(this.moduleResolver); cycleAnalyzer = new CycleAnalyzer(this.importGraph); handlers: DecoratorHandler[] = [ - new BaseDefDecoratorHandler(this.reflectionHost, this.evaluator), + new BaseDefDecoratorHandler(this.reflectionHost, this.evaluator, this.isCore), new ComponentDecoratorHandler( this.reflectionHost, this.evaluator, this.scopeRegistry, this.isCore, this.resourceManager, this.rootDirs, /* defaultPreserveWhitespaces */ false, /* i18nUseExternalIds */ true, diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/base_def.ts b/packages/compiler-cli/src/ngtsc/annotations/src/base_def.ts index 68941ae221..fd79d60cba 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/base_def.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/base_def.ts @@ -12,27 +12,30 @@ import * as ts from 'typescript'; import {PartialEvaluator} from '../../partial_evaluator'; import {ClassMember, Decorator, ReflectionHost} from '../../reflection'; import {AnalysisOutput, CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence} from '../../transform'; -import {isAngularCore} from './util'; -function containsNgTopLevelDecorator(decorators: Decorator[] | null): boolean { +import {isAngularDecorator} from './util'; + +function containsNgTopLevelDecorator(decorators: Decorator[] | null, isCore: boolean): boolean { if (!decorators) { return false; } - return decorators.find( - decorator => (decorator.name === 'Component' || decorator.name === 'Directive' || - decorator.name === 'NgModule') && - isAngularCore(decorator)) !== undefined; + return decorators.some( + decorator => isAngularDecorator(decorator, 'Component', isCore) || + isAngularDecorator(decorator, 'Directive', isCore) || + isAngularDecorator(decorator, 'NgModule', isCore)); } export class BaseDefDecoratorHandler implements DecoratorHandler { - constructor(private reflector: ReflectionHost, private evaluator: PartialEvaluator) {} + constructor( + private reflector: ReflectionHost, private evaluator: PartialEvaluator, + private isCore: boolean) {} readonly precedence = HandlerPrecedence.WEAK; detect(node: ts.ClassDeclaration, decorators: Decorator[]|null): DetectResult|undefined { - if (containsNgTopLevelDecorator(decorators)) { + if (containsNgTopLevelDecorator(decorators, this.isCore)) { // If the class is already decorated by @Component or @Directive let that // DecoratorHandler handle this. BaseDef is unnecessary. return undefined; @@ -44,12 +47,11 @@ export class BaseDefDecoratorHandler implements const {decorators} = property; if (decorators) { for (const decorator of decorators) { - const decoratorName = decorator.name; - if (decoratorName === 'Input' && isAngularCore(decorator)) { + if (isAngularDecorator(decorator, 'Input', this.isCore)) { result = result || {}; const inputs = result.inputs = result.inputs || []; inputs.push({decorator, property}); - } else if (decoratorName === 'Output' && isAngularCore(decorator)) { + } else if (isAngularDecorator(decorator, 'Output', this.isCore)) { result = result || {}; const outputs = result.outputs = result.outputs || []; outputs.push({decorator, property}); diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/component.ts b/packages/compiler-cli/src/ngtsc/annotations/src/component.ts index 10843c0544..9156e7890e 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/component.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/component.ts @@ -23,7 +23,7 @@ import {tsSourceMapBug29300Fixed} from '../../util/src/ts_source_map_bug_29300'; import {ResourceLoader} from './api'; import {extractDirectiveMetadata, extractQueriesFromDecorator, parseFieldArrayValue, queriesFromFields} from './directive'; import {generateSetClassMetadataCall} from './metadata'; -import {isAngularCore, isAngularCoreReference, unwrapExpression} from './util'; +import {findAngularDecorator, isAngularCoreReference, unwrapExpression} from './util'; const EMPTY_MAP = new Map(); const EMPTY_ARRAY: any[] = []; @@ -64,8 +64,7 @@ export class ComponentDecoratorHandler implements if (!decorators) { return undefined; } - const decorator = decorators.find( - decorator => decorator.name === 'Component' && (this.isCore || isAngularCore(decorator))); + const decorator = findAngularDecorator(decorators, 'Component', this.isCore); if (decorator !== undefined) { return { trigger: decorator.node, diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts b/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts index 4c36a13521..71099dfba7 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts @@ -7,7 +7,6 @@ */ import {ConstantPool, Expression, ParseError, ParsedHostBindings, R3DirectiveMetadata, R3QueryMetadata, Statement, WrappedNodeExpr, compileDirectiveFromMetadata, makeBindingParser, parseHostBindings, verifyHostBindings} from '@angular/compiler'; - import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; @@ -19,7 +18,7 @@ import {extractDirectiveGuards} from '../../scope/src/util'; import {AnalysisOutput, CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence} from '../../transform'; import {generateSetClassMetadataCall} from './metadata'; -import {getValidConstructorDependencies, isAngularCore, unwrapExpression, unwrapForwardRef} from './util'; +import {findAngularDecorator, getValidConstructorDependencies, unwrapExpression, unwrapForwardRef} from './util'; const EMPTY_OBJECT: {[key: string]: string} = {}; @@ -39,8 +38,7 @@ export class DirectiveDecoratorHandler implements if (!decorators) { return undefined; } - const decorator = decorators.find( - decorator => decorator.name === 'Directive' && (this.isCore || isAngularCore(decorator))); + const decorator = findAngularDecorator(decorators, 'Directive', this.isCore); if (decorator !== undefined) { return { trigger: decorator.node, diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts b/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts index 6bd05da041..cc90389f81 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts @@ -14,7 +14,7 @@ import {Decorator, ReflectionHost, reflectObjectLiteral} from '../../reflection' import {AnalysisOutput, CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence} from '../../transform'; import {generateSetClassMetadataCall} from './metadata'; -import {getConstructorDependencies, getValidConstructorDependencies, isAngularCore, validateConstructorDependencies} from './util'; +import {findAngularDecorator, getConstructorDependencies, getValidConstructorDependencies, validateConstructorDependencies} from './util'; export interface InjectableHandlerData { meta: R3InjectableMetadata; @@ -36,8 +36,7 @@ export class InjectableDecoratorHandler implements if (!decorators) { return undefined; } - const decorator = decorators.find( - decorator => decorator.name === 'Injectable' && (this.isCore || isAngularCore(decorator))); + const decorator = findAngularDecorator(decorators, 'Injectable', this.isCore); if (decorator !== undefined) { return { trigger: decorator.node, diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts index 828c3ee344..78e3b66118 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts @@ -20,7 +20,7 @@ import {getSourceFile} from '../../util/src/typescript'; import {generateSetClassMetadataCall} from './metadata'; import {ReferencesRegistry} from './references_registry'; -import {combineResolvers, forwardRefResolver, getValidConstructorDependencies, isAngularCore, toR3Reference, unwrapExpression} from './util'; +import {combineResolvers, findAngularDecorator, forwardRefResolver, getValidConstructorDependencies, toR3Reference, unwrapExpression} from './util'; export interface NgModuleAnalysis { ngModuleDef: R3NgModuleMetadata; @@ -47,8 +47,7 @@ export class NgModuleDecoratorHandler implements DecoratorHandler decorator.name === 'NgModule' && (this.isCore || isAngularCore(decorator))); + const decorator = findAngularDecorator(decorators, 'NgModule', this.isCore); if (decorator !== undefined) { return { trigger: decorator.node, diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/pipe.ts b/packages/compiler-cli/src/ngtsc/annotations/src/pipe.ts index e00c3c3c4f..ec7064d1ad 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/pipe.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/pipe.ts @@ -17,7 +17,7 @@ import {LocalModuleScopeRegistry} from '../../scope/src/local'; import {AnalysisOutput, CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence} from '../../transform'; import {generateSetClassMetadataCall} from './metadata'; -import {getValidConstructorDependencies, isAngularCore, unwrapExpression} from './util'; +import {findAngularDecorator, getValidConstructorDependencies, unwrapExpression} from './util'; export interface PipeHandlerData { meta: R3PipeMetadata; @@ -35,8 +35,7 @@ export class PipeDecoratorHandler implements DecoratorHandler decorator.name === 'Pipe' && (this.isCore || isAngularCore(decorator))); + const decorator = findAngularDecorator(decorators, 'Pipe', this.isCore); if (decorator !== undefined) { return { trigger: decorator.node, diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/util.ts b/packages/compiler-cli/src/ngtsc/annotations/src/util.ts index 65feb61606..c27253d8ad 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/util.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/util.ts @@ -12,7 +12,7 @@ import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; import {ImportMode, Reference, ReferenceEmitter} from '../../imports'; import {ForeignFunctionResolver} from '../../partial_evaluator'; -import {ClassMemberKind, CtorParameter, Decorator, ReflectionHost, TypeValueReference} from '../../reflection'; +import {ClassMemberKind, CtorParameter, Decorator, Import, ReflectionHost, TypeValueReference} from '../../reflection'; export enum ConstructorDepErrorKind { NO_SUITABLE_TOKEN, @@ -149,14 +149,28 @@ export function toR3Reference( return {value, type}; } -export function isAngularCore(decorator: Decorator): boolean { +export function isAngularCore(decorator: Decorator): decorator is Decorator&{import: Import} { return decorator.import !== null && decorator.import.from === '@angular/core'; } -export function isAngularCoreReference(reference: Reference, symbolName: string) { +export function isAngularCoreReference(reference: Reference, symbolName: string): boolean { return reference.ownedByModuleGuess === '@angular/core' && reference.debugName === symbolName; } +export function findAngularDecorator( + decorators: Decorator[], name: string, isCore: boolean): Decorator|undefined { + return decorators.find(decorator => isAngularDecorator(decorator, name, isCore)); +} + +export function isAngularDecorator(decorator: Decorator, name: string, isCore: boolean): boolean { + if (isCore) { + return decorator.name === name; + } else if (isAngularCore(decorator)) { + return decorator.import.name === name; + } + return false; +} + /** * Unwrap a `ts.Expression`, removing outer type-casts or parentheses until the expression is in its * lowest level form. diff --git a/packages/compiler-cli/src/ngtsc/program.ts b/packages/compiler-cli/src/ngtsc/program.ts index 50d1b9eb7f..403e48f9c4 100644 --- a/packages/compiler-cli/src/ngtsc/program.ts +++ b/packages/compiler-cli/src/ngtsc/program.ts @@ -381,7 +381,7 @@ export class NgtscProgram implements api.Program { // Set up the IvyCompilation, which manages state for the Ivy transformer. const handlers = [ - new BaseDefDecoratorHandler(this.reflector, evaluator), + new BaseDefDecoratorHandler(this.reflector, evaluator, this.isCore), new ComponentDecoratorHandler( this.reflector, evaluator, scopeRegistry, this.isCore, this.resourceManager, this.rootDirs, this.options.preserveWhitespaces || false, diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index d9247ca57c..9e8be5578e 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -293,6 +293,75 @@ describe('ngtsc behavioral tests', () => { expect(jsContents).toContain('/** @nocollapse */ TestCmp.ngComponentDef'); }); + it('should recognize aliased decorators', () => { + env.tsconfig({}); + env.write('test.ts', ` + import { + Component as AngularComponent, + Directive as AngularDirective, + Pipe as AngularPipe, + Injectable as AngularInjectable, + NgModule as AngularNgModule, + Input as AngularInput, + Output as AngularOutput + } from '@angular/core'; + + export class TestBase { + @AngularInput() input: any; + @AngularOutput() output: any; + } + + @AngularComponent({ + selector: 'test-component', + template: '...' + }) + export class TestComponent { + @AngularInput() input: any; + @AngularOutput() output: any; + } + + @AngularDirective({ + selector: 'test-directive' + }) + export class TestDirective {} + + @AngularPipe({ + name: 'test-pipe' + }) + export class TestPipe {} + + @AngularInjectable({}) + export class TestInjectable {} + + @AngularNgModule({ + declarations: [ + TestComponent, + TestDirective, + TestPipe + ], + exports: [ + TestComponent, + TestDirective, + TestPipe + ] + }) + class MyModule {} + `); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + expect(jsContents).toContain('TestBase.ngBaseDef = i0.ɵdefineBase'); + expect(jsContents).toContain('TestComponent.ngComponentDef = i0.ɵdefineComponent'); + expect(jsContents).toContain('TestDirective.ngDirectiveDef = i0.ɵdefineDirective'); + expect(jsContents).toContain('TestPipe.ngPipeDef = i0.ɵdefinePipe'); + expect(jsContents).toContain('TestInjectable.ngInjectableDef = i0.defineInjectable'); + expect(jsContents).toContain('MyModule.ngModuleDef = i0.ɵdefineNgModule'); + expect(jsContents).toContain('MyModule.ngInjectorDef = i0.defineInjector'); + expect(jsContents).toContain('inputs: { input: "input" }'); + expect(jsContents).toContain('outputs: { output: "output" }'); + }); + it('should compile Components with a templateUrl in a different rootDir', () => { env.tsconfig({}, ['./extraRootDir']); env.write('extraRootDir/test.html', '

Hello World

'); From 146256a4e000c13be39eeb85c00504a597d255c0 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 7 Mar 2019 22:51:27 +0000 Subject: [PATCH 0295/1073] build: update @angular-devkit/build-angular to version 0.13.5 (#29174) PR Close #29174 --- integration/cli-hello-world-ivy-compat/package.json | 2 +- integration/cli-hello-world-ivy-minimal/package.json | 2 +- integration/cli-hello-world/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/integration/cli-hello-world-ivy-compat/package.json b/integration/cli-hello-world-ivy-compat/package.json index 8b6914f937..0dc043870b 100644 --- a/integration/cli-hello-world-ivy-compat/package.json +++ b/integration/cli-hello-world-ivy-compat/package.json @@ -29,7 +29,7 @@ "zone.js": "file:../../node_modules/zone.js" }, "devDependencies": { - "@angular-devkit/build-angular": "0.13.0-rc.0", + "@angular-devkit/build-angular": "0.13.5", "@angular/cli": "file:../../node_modules/@angular/cli", "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", "@angular/language-service": "file:../../dist/packages-dist/language-service", diff --git a/integration/cli-hello-world-ivy-minimal/package.json b/integration/cli-hello-world-ivy-minimal/package.json index 4bf7345413..b0fa4b9485 100644 --- a/integration/cli-hello-world-ivy-minimal/package.json +++ b/integration/cli-hello-world-ivy-minimal/package.json @@ -29,7 +29,7 @@ "zone.js": "file:../../node_modules/zone.js" }, "devDependencies": { - "@angular-devkit/build-angular": "0.13.0-rc.0", + "@angular-devkit/build-angular": "0.13.5", "@angular/cli": "file:../../node_modules/@angular/cli", "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", "@angular/language-service": "file:../../dist/packages-dist/language-service", diff --git a/integration/cli-hello-world/package.json b/integration/cli-hello-world/package.json index 4ceb79b344..1c3b308744 100644 --- a/integration/cli-hello-world/package.json +++ b/integration/cli-hello-world/package.json @@ -29,7 +29,7 @@ "zone.js": "file:../../node_modules/zone.js" }, "devDependencies": { - "@angular-devkit/build-angular": "0.13.4", + "@angular-devkit/build-angular": "0.13.5", "@angular/cli": "file:../../node_modules/@angular/cli", "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", "@angular/language-service": "file:../../dist/packages-dist/language-service", From 4b39bdf7e55f9ff0abda9c3e6632b8425780640d Mon Sep 17 00:00:00 2001 From: Andrew Seguin Date: Mon, 11 Mar 2019 15:30:52 -0700 Subject: [PATCH 0296/1073] test(ivy): add table root cause (#29235) PR Close #29235 --- tools/material-ci/angular_material_test_blocklist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 446bdb7dfd..9c750dbdce 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -51,7 +51,7 @@ window.testBlocklist = { }, "CdkTable with trackBy should change row implicit data even when trackBy finds no changes": { "error": "Error: Expected 'a_1 b_1' to be 'a_2 b_2'.", - "notes": "Unknown" + "notes": "FW-842: View engine dirty-checks projected views when the declaration place is checked" }, "CdkTable should be able to apply classes to rows based on their context": { "error": "Error: Expected false to be true.", From ed4675e5a1fa3a570c652804994831c43b7cda1a Mon Sep 17 00:00:00 2001 From: Adam Plumer Date: Sun, 24 Feb 2019 17:50:00 -0600 Subject: [PATCH 0297/1073] docs: update Universal guide (#28956) PR Close #28956 --- aio/content/guide/universal.md | 739 ++++++++++----------------------- 1 file changed, 214 insertions(+), 525 deletions(-) diff --git a/aio/content/guide/universal.md b/aio/content/guide/universal.md index fae2051294..9618922477 100644 --- a/aio/content/guide/universal.md +++ b/aio/content/guide/universal.md @@ -1,17 +1,17 @@ -# Angular Universal: server-side rendering +# Server-side Rendering (SSR): An intro to Angular Universal -This guide describes **Angular Universal**, a technology that runs your Angular application on the server. +This guide describes **Angular Universal**, a technology that renders Angular applications on the server. A normal Angular application executes in the _browser_, rendering pages in the DOM in response to user actions. -Angular Universal generates _static_ application pages on the _server_ -through a process called _server-side rendering_ (SSR). -When Universal is integrated with your app, it can generate and serve those pages in response to requests from browsers. -It can also pre-generate pages as HTML files that you serve later. +Angular Universal executes on the _server_, generating _static_ application pages that later get bootstrapped on +the client. This means that the application generally renders more quickly, giving users a chance to view the application +layout before it becomes fully interactive. -You can easily prepare an app for server-side rendering using the [Angular CLI](guide/glossary#cli). The CLI schematic `@nguniversal/express-engine` performs the required steps, as described below. +For a more detailed look at different techniques and concepts surrounding SSR, please check out this +[article](https://developers.google.com/web/updates/2019/02/rendering-on-the-web). -This guide describes a Universal sample application that launches quickly as a server-rendered page. -Meanwhile, the browser downloads the full client version and switches to it automatically after the code loads. +You can easily prepare an app for server-side rendering using the [Angular CLI](guide/glossary#cli). +The CLI schematic `@nguniversal/express-engine` performs the required steps, as described below.
@@ -20,471 +20,16 @@ Meanwhile, the browser downloads the full client version and switches to it auto
-{@a why-do-it} - -## Why use server-side rendering? - -There are three main reasons to create a Universal version of your app. - -1. Facilitate web crawlers (SEO) -1. Improve performance on mobile and low-powered devices -1. Show the first page quickly - -{@a seo} -{@a web-crawlers} -### Facilitate web crawlers - -Google, Bing, Facebook, Twitter, and other social media sites rely on web crawlers to index your application content and make that content searchable on the web. -These web crawlers may be unable to navigate and index your highly interactive Angular application as a human user could do. - -Angular Universal can generate a static version of your app that is easily searchable, linkable, and navigable without JavaScript. -Universal also makes a site preview available since each URL returns a fully rendered page. - -Enabling web crawlers is often referred to as -[search engine optimization (SEO)](https://static.googleusercontent.com/media/www.google.com/en//webmasters/docs/search-engine-optimization-starter-guide.pdf). - -{@a no-javascript} - -### Improve performance on mobile and low-powered devices - -Some devices don't support JavaScript or execute JavaScript so poorly that the user experience is unacceptable. -For these cases, you may require a server-rendered, no-JavaScript version of the app. -This version, however limited, may be the only practical alternative for -people who otherwise couldn't use the app at all. - -{@a startup-performance} - -### Show the first page quickly - -Displaying the first page quickly can be critical for user engagement. -[53 percent of mobile site visits are abandoned](https://www.thinkwithgoogle.com/marketing-resources/data-measurement/mobile-page-speed-new-industry-benchmarks/) if pages take longer than 3 seconds to load. -Your app may have to launch faster to engage these users before they decide to do something else. - -With Angular Universal, you can generate landing pages for the app that look like the complete app. -The pages are pure HTML, and can display even if JavaScript is disabled. -The pages don't handle browser events, but they _do_ support navigation through the site using [`routerLink`](guide/router#router-link). - -In practice, you'll serve a static version of the landing page to hold the user's attention. -At the same time, you'll load the full Angular app behind it. -The user perceives near-instant performance from the landing page -and gets the full interactive experience after the full app loads. - -{@a how-does-it-work} - -## Universal web servers - -A Universal web server responds to application page requests with static HTML rendered by the [Universal template engine](#universal-engine). -The server receives and responds to HTTP requests from clients (usually browsers), and serves static assets such as scripts, CSS, and images. -It may respond to data requests, either directly or as a proxy to a separate data server. - -The sample web server for this guide is based on the popular [Express](https://expressjs.com/) framework. - -
- - **Note:** _Any_ web server technology can serve a Universal app as long as it can call Universal's `renderModuleFactory()` function. - The principles and decision points discussed here apply to any web server technology. - -
- -To make a Universal app, install the `platform-server` package, which provides server implementations -of the DOM, `XMLHttpRequest`, and other low-level features that don't rely on a browser. -Compile the client application with the `platform-server` module (instead of the `platform-browser` module) -and run the resulting Universal app on a web server. - -The server ([Node Express](https://expressjs.com/) in this guide's example) -passes client requests for application pages to Universal's `renderModuleFactory()` function. - -The `renderModuleFactory()` function takes as inputs a *template* HTML page (usually `index.html`), -an Angular *module* containing components, -and a *route* that determines which components to display. -The route comes from the client's request to the server. - -Each request results in the appropriate view for the requested route. -The `renderModuleFactory()` function renders the view within the `` tag of the template, -creating a finished HTML page for the client. - -Finally, the server returns the rendered page to the client. - -{@a summary} -## Preparing for server-side rendering - -Before your app can be rendered on a server, you must make changes in the app itself, and also set up the server. - -1. Install dependencies. -1. Prepare your app by modifying both the app code and its configuration. -1. Add a build target, and build a Universal bundle using the CLI with the `@nguniversal/express-engine` schematic. -1. Set up a server to run Universal bundles. -1. Pack and run the app on the server. - -The following sections go into each of these main steps in more detail. - -
- - **Note:** The [Universal tutorial](#the-example) below walks you through the steps using the Tour of Heroes sample app, and goes into more detail about what you can do and why you might want to do it. - - To see a working version of an app with server-side rendering, clone the [Angular Universal starter](https://github.com/angular/universal-starter). - -
- -
- -
Security for server requests
- -HTTP requests issued from a browser app aren't the same as those issued by the Universal app on the server. -Universal HTTP requests have different security requirements - -When a browser makes an HTTP request, the server can make assumptions about cookies, XSRF headers, and so on. -For example, the browser automatically sends authentication cookies for the current user. -Angular Universal can't forward these credentials to a separate data server. -If your server handles HTTP requests, you'll have to add your own security plumbing. - -
- -## Step 1: Install dependencies - -Install `@angular/platform-server` into your project. Use the same version as the other `@angular` packages in your project. You also need `ts-loader`, `webpack-cli` for your webpack build and `@nguniversal/module-map-ngfactory-loader` to handle lazy-loading in the context of a server-render. - - -$ npm install --save @angular/platform-server @nguniversal/module-map-ngfactory-loader ts-loader webpack-cli - - -## Step 2: Prepare your app - -To prepare your app for Universal rendering, take the following steps: - -* Add Universal support to your app. - -* Create a server root module. - -* Create a main file to export the server root module. - -* Configure the server root module. - -### 2a. Add Universal support to your app - -Make your `AppModule` compatible with Universal by adding `.withServerTransition()` and an application ID to your `BrowserModule` import in `src/app/app.module.ts`. - - -@NgModule({ - bootstrap: [AppComponent], - imports: [ - // Add .withServerTransition() to support Universal rendering. - // The application ID can be any identifier which is unique on - // the page. - BrowserModule.withServerTransition({appId: 'my-app'}), - ... - ], - -}) -export class AppModule {} - - -### 2b. Create a server root module - -Create a module named `AppServerModule` to act as the root module when running on the server. This example places it alongside `app.module.ts` in a file named `app.server.module.ts`. The new module imports everything from the root `AppModule`, and adds `ServerModule`. It also adds `ModuleMapLoaderModule` to help make lazy-loaded routes possible during server-side renders with the Angular CLI. - -Here's an example in `src/app/app.server.module.ts`. - - -import {NgModule} from '@angular/core'; -import {ServerModule} from '@angular/platform-server'; -import {ModuleMapLoaderModule} from '@nguniversal/module-map-ngfactory-loader'; - -import {AppModule} from './app.module'; -import {AppComponent} from './app.component'; - -@NgModule({ - imports: [ - // The AppServerModule should import your AppModule followed - // by the ServerModule from @angular/platform-server. - AppModule, - ServerModule, - ModuleMapLoaderModule // <-- *Important* to have lazy-loaded routes work - ], - // Since the bootstrapped component is not inherited from your - // imported AppModule, it needs to be repeated here. - bootstrap: [AppComponent], -}) -export class AppServerModule {} - - -### 2c. Create a main file to export AppServerModule - -Create a main file for your Universal bundle in the app `src/` folder to export your `AppServerModule` instance. This example calls the file `main.server.ts`. - - -export { AppServerModule } from './app/app.server.module'; - - -### 2d. Create a configuration file for AppServerModule - -Copy `tsconfig.app.json` to `tsconfig.server.json` and modify it as follows: - -* In `"compilerOptions"`, set the `"module"` target to `"commonjs"`. -* Add a section for `"angularCompilerOptions"` and set `"entryModule"` to point to your `AppServerModule` instance. Use the format `importPath#symbolName`. In this example, the entry module is `app/app.server.module#AppServerModule`. - - -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/app", - "baseUrl": "./", - // Set the module format to "commonjs": - "module": "commonjs", - "types": [] - }, - "exclude": [ - "test.ts", - "**/*.spec.ts" - ], - // Add "angularCompilerOptions" with the AppServerModule you wrote - // set as the "entryModule". - "angularCompilerOptions": { - "entryModule": "app/app.server.module#AppServerModule" - } -} - - -## Step 3: Create a new build target and build the bundle - -Open the Angular configuration file, `angular.json`, for your project, and add a new target in the `"architect"` section for the server build. The following example names the new target `"server"`. - - -"architect": { - "build": { ... } - "server": { - "builder": "@angular-devkit/build-angular:server", - "options": { - "outputPath": "dist/my-project-server", - "main": "src/main.server.ts", - "tsConfig": "src/tsconfig.server.json" - } - } -} - - -To build a server bundle for your application, use the `ng run` command, with the format `projectName#serverTarget`. In our example, there are now two targets configured, `"build"` and `"server"`. - - -# This builds your project using the server target, and places the output -# in dist/my-project-server/ -$ ng run my-project:server - -Date: 2017-07-24T22:42:09.739Z -Hash: 9cac7d8e9434007fd8da -Time: 4933ms -chunk {0} main.js (main) 9.49 kB [entry] [rendered] -chunk {1} styles.css (styles) 0 bytes [entry] [rendered] - - -## Step 4: Set up a server to run Universal bundles - -To run a Universal bundle, you need to send it to a server. - -The following example passes `AppServerModule` (compiled with AoT) to the `PlatformServer` method `renderModuleFactory()`, which serializes the app and returns the result to the browser. - - -app.engine('html', (_, options, callback) => { - renderModuleFactory(AppServerModuleNgFactory, { - // Our index.html - document: template, - url: options.req.url, - // configure DI to make lazy-loading work differently - // (we need to instantly render the view) - extraProviders: [ - provideModuleMap(LAZY_MODULE_MAP) - ] - }).then(html => { - callback(null, html); - }); -}); - - -This technique gives you complete flexibility. For convenience, you can also use the `@nguniversal/express-engine` tool that has some built-in features. - - -import { ngExpressEngine } from '@nguniversal/express-engine'; - -app.engine('html', ngExpressEngine({ - bootstrap: AppServerModuleNgFactory, - providers: [ - provideModuleMap(LAZY_MODULE_MAP) - ] -})); - - -The following simple example implements a bare-bones Node Express server to fire everything up. -(Note that this is for demonstration only. In a real production environment, you need to set up additional authentication and security.) - -At the root level of your project, next to `package.json`, create a file named `server.ts` and add the following content. - - -// These are important and needed before anything else -import 'zone.js/dist/zone-node'; -import 'reflect-metadata'; - -import { renderModuleFactory } from '@angular/platform-server'; -import { enableProdMode } from '@angular/core'; -import { provideModuleMap } from '@nguniversal/module-map-ngfactory-loader'; - -import * as express from 'express'; -import { join } from 'path'; -import { readFileSync } from 'fs'; - -// Faster server renders w/ Prod mode (dev mode never needed) -enableProdMode(); - -// Express server -const app = express(); - -const PORT = process.env.PORT || 4000; -const DIST_FOLDER = join(process.cwd(), 'dist'); - -// Our index.html we'll use as our template -const template = readFileSync(join(DIST_FOLDER, 'browser', 'index.html')).toString(); - -const { AppServerModuleNgFactory, LAZY_MODULE_MAP } = require('./server/main'); - - -app.engine('html', (_, options, callback) => { - renderModuleFactory(AppServerModuleNgFactory, { - // Our index.html - document: template, - url: options.req.url, - // DI so that we can get lazy-loading to work differently (since we need it to just instantly render it) - extraProviders: [ - provideModuleMap(LAZY_MODULE_MAP) - ] - }).then(html => { - callback(null, html); - }); -}); - -app.set('view engine', 'html'); -app.set('views', join(DIST_FOLDER, 'browser')); - -// Server static files from /browser -app.get('*.*', express.static(join(DIST_FOLDER, 'browser'))); - -// All regular routes use the Universal engine -app.get('*', (req, res) => { - res.render(join(DIST_FOLDER, 'browser', 'index.html'), { req }); -}); - -// Start up the Node server -app.listen(PORT, () => { - console.log(`Node server listening on http://localhost:${PORT}`); -}); - - -## Step 5: Pack and run the app on the server - -Set up a webpack configuration to handle the Node Express `server.ts` file and serve your application. - -In your app root directory, create a webpack configuration file (`webpack.server.config.js`) that compiles the `server.ts` file and its dependencies into `dist/server.js`. - - -const path = require('path'); -const webpack = require('webpack'); - -module.exports = { - entry: { server: './server.ts' }, - resolve: { extensions: ['.js', '.ts'] }, - target: 'node', - // this makes sure we include node_modules and other 3rd party libraries - externals: [/(node_modules|main\..*\.js)/], - output: { - path: path.join(__dirname, 'dist'), - filename: '[name].js' - }, - module: { - rules: [ - { test: /\.ts$/, loader: 'ts-loader' } - ] - }, - plugins: [ - // Temporary Fix for issue: https://github.com/angular/angular/issues/11580 - // for "WARNING Critical dependency: the request of a dependency is an expression" - new webpack.ContextReplacementPlugin( - /(.+)?angular(\\|\/)core(.+)?/, - path.join(__dirname, 'src'), // location of your src - {} // a map of your routes - ), - new webpack.ContextReplacementPlugin( - /(.+)?express(\\|\/)(.+)?/, - path.join(__dirname, 'src'), - {} - ) - ] -} - - -The project's `dist/` folder now contains both browser and server folders. - - -dist/ - browser/ - server/ - - -To run the app on the server, type the following in a command shell. - - -node dist/server.js - - -### Creating scripts - -Now let's create a few handy scripts to help us do all of this in the future. -You can add these in the `"scripts"` section of the `package.json`. - - -"scripts": { - "build:ssr": "npm run build:client-and-server-bundles && npm run webpack:server", - "serve:ssr": "node dist/server.js", - "build:client-and-server-bundles": "ng build --prod && ng run my-project:server:production", - "webpack:server": "webpack --config webpack.server.config.js --progress --colors", - ... -} - - -To run a production build of your app with Universal on your local system, use the following command. - - -npm run build:ssr && npm run serve:ssr - - -### Working around the browser APIs - -Because a Universal `platform-server` app doesn't execute in the browser, you may have to work around some of the browser APIs and capabilities that are missing on the server. - -For example, your server-side page can't reference browser-only native objects such as `window`, `document`, `navigator`, or `location`. -If you don't need these on the server-rendered page, you can side-step them with conditional logic. -Alternatively, you can find an injectable Angular abstraction over the object you need such as `Location` or `Document`; -it may substitute adequately for the specific API that you're calling. -If Angular doesn't provide it, you can write your own abstraction that delegates to the browser API while in the browser and to a satisfactory alternative implementation while on the server. - -Similarly, without mouse or keyboard events, a server-side app can't rely on a user clicking a button to show a component. -The app must determine what to render based solely on the incoming client request. -This is a good argument for making the app [routable](guide/router). - -Because the user of a server-rendered page can't do much more than click links, -you should swap in the real client app as quickly as possible for a proper interactive experience. - {@a the-example} - ## Universal tutorial The [Tour of Heroes tutorial](tutorial) is the foundation for this walkthrough. -The core application files are mostly untouched, with a few exceptions described below. -You'll add more files to support building and serving with Universal. - In this example, the Angular CLI compiles and bundles the Universal version of the app with the [Ahead-of-Time (AoT) compiler](guide/aot-compiler). -A Node Express web server turns client requests into the HTML pages rendered by Universal. +A Node Express web server compiles HTML pages with Universal based on client requests. -To create server-side app module, `app.server.module.ts`, run the following CLI command. +To create the server-side app module, `app.server.module.ts`, run the following CLI command. @@ -512,34 +57,203 @@ webpack.server.config.js * webpack server configuration The files marked with `*` are new and not in the original tutorial sample. -This guide covers them in the sections below. +### Universal in action + +To start rendering your app with Universal on your local system, use the following command. + + +npm run build:ssr && npm run serve:ssr + + +Open a browser and navigate to http://localhost:4000/. +You should see the familiar Tour of Heroes dashboard page. + +Navigation via `routerLinks` works correctly because they use the native anchor (`
`) tags. +You can go from the Dashboard to the Heroes page and back. +You can click a hero on the Dashboard page to display its Details page. + +If you throttle your network speed so that the client-side scripts take longer to download (instructions below), +you'll notice: +* Clicking a hero on the Heroes page does nothing. +* You can't add or delete a hero. +* The search box on the Dashboard page is ignored. +* The *Back* and *Save* buttons on the Details page don't work. + +User events other than `routerLink` clicks aren't supported. +You must wait for the full client app to bootstrap and run, or buffer the events using libraries like +[preboot](https://github.com/angular/preboot), which allow you to replay these events once the client-side scripts load. + +The transition from the server-rendered app to the client app happens quickly on a development machine, but you should +always test your apps in real-world scenarios. + +You can simulate a slower network to see the transition more clearly as follows: + +1. Open the Chrome Dev Tools and go to the Network tab. +1. Find the [Network Throttling](https://developers.google.com/web/tools/chrome-devtools/network-performance/reference#throttling) +dropdown on the far right of the menu bar. +1. Try one of the "3G" speeds. + +The server-rendered app still launches quickly but the full client app may take seconds to load. + +{@a why-do-it} +## Why use server-side rendering? + +There are three main reasons to create a Universal version of your app. + +1. Facilitate web crawlers through [search engine optimization (SEO)](https://static.googleusercontent.com/media/www.google.com/en//webmasters/docs/search-engine-optimization-starter-guide.pdf) +1. Improve performance on mobile and low-powered devices +1. Show the first page quickly with a [first-contentful paint (FCP)](https://developers.google.com/web/tools/lighthouse/audits/first-contentful-paint) + +{@a seo} +{@a web-crawlers} +### Facilitate web crawlers (SEO) + +Google, Bing, Facebook, Twitter, and other social media sites rely on web crawlers to index your application content and +make that content searchable on the web. +These web crawlers may be unable to navigate and index your highly interactive Angular application as a human user could do. + +Angular Universal can generate a static version of your app that is easily searchable, linkable, and navigable without JavaScript. +Universal also makes a site preview available since each URL returns a fully rendered page. + +{@a no-javascript} +### Improve performance on mobile and low-powered devices + +Some devices don't support JavaScript or execute JavaScript so poorly that the user experience is unacceptable. +For these cases, you may require a server-rendered, no-JavaScript version of the app. +This version, however limited, may be the only practical alternative for +people who otherwise couldn't use the app at all. + +{@a startup-performance} +### Show the first page quickly + +Displaying the first page quickly can be critical for user engagement. +[53 percent of mobile site visits are abandoned](https://www.thinkwithgoogle.com/marketing-resources/data-measurement/mobile-page-speed-new-industry-benchmarks/) +if pages take longer than 3 seconds to load. +Your app may have to launch faster to engage these users before they decide to do something else. + +With Angular Universal, you can generate landing pages for the app that look like the complete app. +The pages are pure HTML, and can display even if JavaScript is disabled. +The pages don't handle browser events, but they _do_ support navigation through the site using [`routerLink`](guide/router#router-link). + +In practice, you'll serve a static version of the landing page to hold the user's attention. +At the same time, you'll load the full Angular app behind it. +The user perceives near-instant performance from the landing page +and gets the full interactive experience after the full app loads. + +{@a how-does-it-work} +## Universal web servers + +A Universal web server responds to application page requests with static HTML rendered by the [Universal template engine](#universal-engine). +The server receives and responds to HTTP requests from clients (usually browsers), and serves static assets such as scripts, CSS, and images. +It may respond to data requests, either directly or as a proxy to a separate data server. + +The sample web server for this guide is based on the popular [Express](https://expressjs.com/) framework. + +
+ + **Note:** _Any_ web server technology can serve a Universal app as long as it can call Universal's `renderModuleFactory()` function. + The principles and decision points discussed here apply to any web server technology. + +
+ +Universal applications use the Angular `platform-server` package (as opposed to `platform-browser`), which provides +server implementations of the DOM, `XMLHttpRequest`, and other low-level features that don't rely on a browser. + +The server ([Node Express](https://expressjs.com/) in this guide's example) +passes client requests for application pages to the NgUniversal `ngExpressEngine`. Under the hood, this +calls Universal's `renderModuleFactory()` function, while providing caching and other helpful utilities. + +The `renderModuleFactory()` function takes as inputs a *template* HTML page (usually `index.html`), +an Angular *module* containing components, +and a *route* that determines which components to display. +The route comes from the client's request to the server. + +Each request results in the appropriate view for the requested route. +The `renderModuleFactory()` function renders the view within the `` tag of the template, +creating a finished HTML page for the client. + +Finally, the server returns the rendered page to the client. + +### Working around the browser APIs + +Because a Universal app doesn't execute in the browser, some of the browser APIs and capabilities may be missing on the server. + +For example, server-side applications can't reference browser-only global objects such as `window`, `document`, `navigator`, or `location`. + +Angular provides some injectable abstractions over these objects, such as [`Location`](api/common/Location) +or [`DOCUMENT`](api/common/DOCUMENT); it may substitute adequately for these APIs. +If Angular doesn't provide it, it's possible to write new abstractions that delegate to the browser APIs while in the browser +and to an alternative implementation while on the server (aka shimming). + +Similarly, without mouse or keyboard events, a server-side app can't rely on a user clicking a button to show a component. +The app must determine what to render based solely on the incoming client request. +This is a good argument for making the app [routable](guide/router). {@a http-urls} - ### Using absolute URLs for server requests The tutorial's `HeroService` and `HeroSearchService` delegate to the Angular `HttpClient` module to fetch application data. These services send requests to _relative_ URLs such as `api/heroes`. -In a Universal app, HTTP URLs must be _absolute_ (for example, `https://my-server.com/api/heroes`) even when the Universal web server is capable of handling relative requests. -This means you need to change your services to make requests with absolute URLs when running on the server and with relative URLs when running in the browser. +In a Universal app, HTTP URLs must be _absolute_ (for example, `https://my-server.com/api/heroes`). +This means you need to change your services to make requests with absolute URLs when running on the server and with relative +URLs when running in the browser. -One solution is to provide the server's runtime origin under Angular's [`APP_BASE_HREF`](api/common/APP_BASE_HREF) token, -inject it into the service, and prepend the origin to the request URL. +One solution is to provide the full URL to your application on the server, and write an interceptor that can retrieve this +value and prepend it to the request URL. If you're using the `ngExpressEngine`, as shown in the example in this guide, half +the work is already done. We'll assume this is the case, but it's trivial to provide the same functionality. -Start by changing the `HeroService` constructor to take a second `origin` parameter that is optionally injected via the `APP_BASE_HREF` token. +Start by creating an [HttpInterceptor](api/common/http/HttpInterceptor): + + + +import {Injectable, Inject, Optional} from '@angular/core'; +import {HttpInterceptor, HttpHandler, HttpRequest, HttpHeaders} from '@angular/common/http'; +import {Request} from 'express'; +import {REQUEST} from '@nguniversal/express-engine/tokens'; + +@Injectable() +export class UniversalInterceptor implements HttpInterceptor { + + constructor(@Optional() @Inject(REQUEST) protected request: Request) {} + + intercept(req: HttpRequest, next: HttpHandler) { + let serverReq: HttpRequest = req; + if (this.request) { + let newUrl = `${this.request.protocol}://${this.request.get('host')}`; + if (!req.url.startsWith('/')) { + newUrl += '/'; + } + newUrl += req.url; + serverReq = req.clone({url: newUrl}); + } + return next.handle(serverReq); + } +} - -The constructor uses the `@Optional()` directive to prepend the origin to `heroesUrl` _if it exists_. -You don't provide `APP_BASE_HREF` in the browser version, so `heroesUrl` remains relative. +Next, provide the interceptor in the providers for the server `AppModule` (app.server.module.ts): -
+ - **Note:** You can ignore `APP_BASE_HREF` in the browser if you've specified `` in the `index.html` file to satisfy the router's need for a base address (as the tutorial sample does). +import {HTTP_INTERCEPTORS} from '@angular/common/http'; +import {UniversalInterceptor} from './universal-interceptor'; -
+@NgModule({ + ... + providers: [{ + provide: HTTP_INTERCEPTORS, + useClass: UniversalInterceptor, + multi: true + }], +}) +export class AppServerModule {} + +
+ +Now, on every HTTP request made on the server, this interceptor will fire and replace the request URL with the absolute +URL provided in the Express `Request` object. {@a universal-engine} ### Universal template engine @@ -549,30 +263,35 @@ The important bit in the `server.ts` file is the `ngExpressEngine()` function. -The `ngExpressEngine()` function is a wrapper around Universal's `renderModuleFactory()` function which turns a client's requests into server-rendered HTML pages. -You'll call that function within a _template engine_ that's appropriate for your server stack. +The `ngExpressEngine()` function is a wrapper around Universal's `renderModuleFactory()` function which turns a client's +requests into server-rendered HTML pages. * The first parameter is `AppServerModule`. -It's the bridge between the Universal server-side renderer and your application. +It's the bridge between the Universal server-side renderer and the Angular application. -* The second parameter, `extraProviders`, is optional. It lets you specify dependency providers that apply only when running on this server. +* The second parameter, `extraProviders`, is optional. It lets you specify dependency providers that apply only when +running on this server. You can do this when your app needs information that can only be determined by the currently running server instance. -The required information in this case is the running server's *origin*, provided under the `APP_BASE_HREF` token, so that the app can [calculate absolute HTTP URLs](#http-urls). +One example could be the running server's *origin*, which could be used to [calculate absolute HTTP URLs](#http-urls) if +not using the `Request` token as shown above. The `ngExpressEngine()` function returns a `Promise` callback that resolves to the rendered page. -It's up to your engine to decide what to do with that page. +It's up to the engine to decide what to do with that page. This engine's `Promise` callback returns the rendered page to the web server, which then forwards it to the client in the HTTP response.
- **Note:** These wrappers help hide the complexity of the `renderModuleFactory()` function. There are more wrappers for different backend technologies - at the [Universal repository](https://github.com/angular/universal). + **Note:** These wrappers help hide the complexity of the `renderModuleFactory()` function. There are more wrappers + for different backend technologies at the [Universal repository](https://github.com/angular/universal).
### Filtering request URLs +NOTE: the basic behavior described below is handled automatically when using the NgUniversal Express schematic, this +is helpful when trying to understand the underlying behavior or replicate it without using the schematic. + The web server must distinguish _app page requests_ from other kinds of requests. It's not as simple as intercepting a request to the root address `/`. @@ -586,11 +305,11 @@ All static asset requests have a file extension (such as `main.js` or `/node_mod Because we use routing, we can easily recognize the three types of requests and handle them differently. -1. Data request - request URL that begins `/api`. -2. App navigation - request URL with no file extension. -3. Static asset - all other requests. +1. **Data request**: request URL that begins `/api`. +1. **App navigation**: request URL with no file extension. +1. **Static asset**: all other requests. -A Node Express server is a pipeline of middleware that filters and processes URL requests one after the other. +A Node Express server is a pipeline of middleware that filters and processes requests one after the other. You configure the Node Express server pipeline with calls to `app.get()` like this one for data requests. @@ -616,41 +335,11 @@ The following code filters for request URLs with no extensions and treats them a A single `app.use()` treats all other URLs as requests for static assets such as JavaScript, image, and style files. -To ensure that clients can only download the files that they are permitted to see, put all client-facing asset files in the `/dist` folder and only honor requests for files from the `/dist` folder. +To ensure that clients can only download the files that they are permitted to see, put all client-facing asset files in +the `/dist` folder and only honor requests for files from the `/dist` folder. -The following Node Express code routes all remaining requests to `/dist`, and returns a `404 - NOT FOUND` error if the file isn't found. +The following Node Express code routes all remaining requests to `/dist`, and returns a `404 - NOT FOUND` error if the +file isn't found. - - -### Universal in action - -Open a browser to http://localhost:4000/. -You should see the familiar Tour of Heroes dashboard page. - -Navigation via `routerLinks` works correctly. -You can go from the Dashboard to the Heroes page and back. -You can click a hero on the Dashboard page to display its Details page. - -Notice, however, that clicks, mouse-moves, and keyboard entries are inert. - -* Clicking a hero on the Heroes page does nothing. -* You can't add or delete a hero. -* The search box on the Dashboard page is ignored. -* The *Back* and *Save* buttons on the Details page don't work. - -User events other than `routerLink` clicks aren't supported. -You must wait for the full client app to arrive. -It won't arrive until you compile the client app -and move the output into the `dist/` folder. - -The transition from the server-rendered app to the client app happens quickly on a development machine. -You can simulate a slower network to see the transition more clearly and -better appreciate the launch-speed advantage of a Universal app running on a low-powered, poorly connected device. - -Open the Chrome Dev Tools and go to the Network tab. -Find the [Network Throttling](https://developers.google.com/web/tools/chrome-devtools/network-performance/reference#throttling) dropdown on the far right of the menu bar. - -Try one of the "3G" speeds. -The server-rendered app still launches quickly but the full client app may take seconds to load. From 869e1cdcec61e519de56889c4736e857ac62b7dc Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Tue, 12 Mar 2019 09:23:54 +0000 Subject: [PATCH 0298/1073] build(docs-infra): upgrade cli command docs sources to c883c3d0b (#29242) Updating [angular#master](https://github.com/angular/angular/tree/master) from [cli-builds#master](https://github.com/angular/cli-builds/tree/master). Relevant changes in [commit range](https://github.com/angular/cli-builds/compare/3b1fe6437...c883c3d0b): **Modified** - help/generate.json PR Close #29242 --- aio/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/package.json b/aio/package.json index 17f21f148e..097c14f6db 100644 --- a/aio/package.json +++ b/aio/package.json @@ -19,7 +19,7 @@ "build-local": "yarn ~~build", "prebuild-with-ivy": "yarn setup-local && yarn ivy-ngcc --formats fesm2015 fesm5", "build-with-ivy": "node scripts/build-with-ivy", - "extract-cli-command-docs": "node tools/transforms/cli-docs-package/extract-cli-commands.js 3b1fe6437", + "extract-cli-command-docs": "node tools/transforms/cli-docs-package/extract-cli-commands.js c883c3d0b", "lint": "yarn check-env && yarn docs-lint && ng lint && yarn example-lint && yarn tools-lint", "test": "yarn check-env && ng test", "pree2e": "yarn check-env && yarn update-webdriver", From defc30c7abe8caa332d58526aeb0cab33df6ad40 Mon Sep 17 00:00:00 2001 From: Sam Julien Date: Fri, 8 Mar 2019 11:20:01 -0800 Subject: [PATCH 0299/1073] docs: add Sam Julien to GDE group (#29190) PR Close #29190 --- aio/content/images/bios/samjulien.jpg | Bin 0 -> 22523 bytes aio/content/marketing/contributors.json | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 aio/content/images/bios/samjulien.jpg diff --git a/aio/content/images/bios/samjulien.jpg b/aio/content/images/bios/samjulien.jpg new file mode 100644 index 0000000000000000000000000000000000000000..274e4514ae61d63e1c5b38c7f5bb1892553a11bf GIT binary patch literal 22523 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 literal 0 HcmV?d00001 diff --git a/aio/content/marketing/contributors.json b/aio/content/marketing/contributors.json index a5cf7db09c..fedf0f5e5c 100644 --- a/aio/content/marketing/contributors.json +++ b/aio/content/marketing/contributors.json @@ -651,5 +651,13 @@ "website": "https://medium.com/@tomastrajan", "bio": "Tomas is a Senior Software Engineer with passion for frontend and especially Angular. He always strives to provide lots of value and to empower teams he is working with by sharing know-how, introducing best practices and automating mundane task to enable full focus on creating value for the users! He likes to share his Angular know-how by blogging, speaking and recording video content. He is a co-organizer of Angular Meetup Zurich.", "group": "GDE" + }, + "samjulien": { + "name": "Sam Julien", + "picture": "samjulien.jpg", + "twitter": "samjulien", + "website": "http://www.samjulien.com/", + "bio": "Sam Julien builds software, articles, video courses, and campfires. A developer, speaker, writer, and GDE in the Pacific Northwest, Sam's favorite thing in the world is changing someone's life by teaching them to code.", + "group": "GDE" } } From 76119b84dca16eb169932a005212ded217aa4dba Mon Sep 17 00:00:00 2001 From: Ivan Tham Date: Tue, 12 Mar 2019 00:44:15 +0000 Subject: [PATCH 0300/1073] docs: update enableIvy link (#29238) PR Close #29238 --- packages/core/src/render3/STATUS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/render3/STATUS.md b/packages/core/src/render3/STATUS.md index ac8df837b0..41da5007b1 100644 --- a/packages/core/src/render3/STATUS.md +++ b/packages/core/src/render3/STATUS.md @@ -2,7 +2,7 @@ Ivy is a new backwards-compatible Angular renderer focused on further speed improvements, size reduction, and increased flexibility. -Ivy is currently not feature complete, but can be tested via [`enableIvy: true`](https://next.angular.io/guide/aot-compiler#enableivy) [`angularCompilerOptions` flag](https://next.angular.io/guide/aot-compiler#angular-compiler-options). +Ivy is currently not feature complete, but can be tested via [`enableIvy: true`](https://next.angular.io/guide/ivy#updating-an-existing-project-to-use-ivy) [`angularCompilerOptions` flag](https://next.angular.io/guide/aot-compiler#angular-compiler-options). We currently expect Ivy to remain behind the flag until it's feature complete and battle tested at Google. In the meantime you can check out this [Hello World demo](https://ng-ivy-demo.firebaseapp.com/). From e20a29a153222041b1aaf1621e103528c321c2f0 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 4 Mar 2019 20:33:25 +0100 Subject: [PATCH 0301/1073] build(docs-infra): support running cli docs examples concurrently (#29103) PR Close #29103 --- .../component-interaction/example-config.json | 3 +- .../dependency-injection/example-config.json | 3 +- aio/content/examples/i18n/example-config.json | 3 +- .../example-config.json | 2 +- aio/package.json | 1 + aio/tools/examples/run-example-e2e.js | 109 ++++++++++++------ aio/yarn.lock | 5 + 7 files changed, 86 insertions(+), 40 deletions(-) diff --git a/aio/content/examples/component-interaction/example-config.json b/aio/content/examples/component-interaction/example-config.json index b93fc9e8da..054f3cca48 100644 --- a/aio/content/examples/component-interaction/example-config.json +++ b/aio/content/examples/component-interaction/example-config.json @@ -4,7 +4,8 @@ "cmd": "yarn", "args": [ "e2e", - "--no-webdriver-update" + "--no-webdriver-update", + "--port={PORT}" ] } ] diff --git a/aio/content/examples/dependency-injection/example-config.json b/aio/content/examples/dependency-injection/example-config.json index b93fc9e8da..054f3cca48 100644 --- a/aio/content/examples/dependency-injection/example-config.json +++ b/aio/content/examples/dependency-injection/example-config.json @@ -4,7 +4,8 @@ "cmd": "yarn", "args": [ "e2e", - "--no-webdriver-update" + "--no-webdriver-update", + "--port={PORT}" ] } ] diff --git a/aio/content/examples/i18n/example-config.json b/aio/content/examples/i18n/example-config.json index 99b45f2c49..4b2197f432 100644 --- a/aio/content/examples/i18n/example-config.json +++ b/aio/content/examples/i18n/example-config.json @@ -5,7 +5,8 @@ "cmd": "yarn", "args": [ "e2e", - "--no-webdriver-update" + "--no-webdriver-update", + "--port={PORT}" ] } ] diff --git a/aio/content/examples/service-worker-getting-started/example-config.json b/aio/content/examples/service-worker-getting-started/example-config.json index b0e7e5672e..0ebe5bd24e 100644 --- a/aio/content/examples/service-worker-getting-started/example-config.json +++ b/aio/content/examples/service-worker-getting-started/example-config.json @@ -1,7 +1,7 @@ { "projectType": "service-worker", "e2e": [ - {"cmd": "yarn", "args": ["e2e", "--no-webdriver-update"]}, + {"cmd": "yarn", "args": ["e2e", "--no-webdriver-update", "--port={PORT}"]}, {"cmd": "yarn", "args": ["build", "--prod"]}, {"cmd": "node", "args": ["--eval", "assert(fs.existsSync('./dist/ngsw.json'), 'ngsw.json is missing')"]}, {"cmd": "node", "args": ["--eval", "assert(fs.existsSync('./dist/ngsw-worker.js'), 'ngsw-worker.js is missing')"]}, diff --git a/aio/package.json b/aio/package.json index 097c14f6db..1804e341d6 100644 --- a/aio/package.json +++ b/aio/package.json @@ -118,6 +118,7 @@ "entities": "^1.1.1", "eslint": "^3.19.0", "eslint-plugin-jasmine": "^2.2.0", + "find-free-port": "^2.0.0", "firebase-tools": "^5.1.1", "fs-extra": "^2.1.2", "globby": "^6.1.0", diff --git a/aio/tools/examples/run-example-e2e.js b/aio/tools/examples/run-example-e2e.js index 9245168b2f..db89b0084d 100644 --- a/aio/tools/examples/run-example-e2e.js +++ b/aio/tools/examples/run-example-e2e.js @@ -5,6 +5,7 @@ const globby = require('globby'); const xSpawn = require('cross-spawn'); const treeKill = require('tree-kill'); const shelljs = require('shelljs'); +const findFreePort = require('find-free-port'); shelljs.set('-e'); @@ -15,6 +16,8 @@ const PROTRACTOR_CONFIG_FILENAME = path.join(__dirname, './shared/protractor.con const SJS_SPEC_FILENAME = 'e2e-spec.ts'; const CLI_SPEC_FILENAME = 'e2e/src/app.e2e-spec.ts'; const EXAMPLE_CONFIG_FILENAME = 'example-config.json'; +const DEFAULT_CLI_EXAMPLE_PORT = 4200; +const DEFAULT_CLI_SPECS_CONCURRENCY = 1; const IGNORED_EXAMPLES = [ // temporary ignores @@ -51,6 +54,9 @@ if (argv.ivy) { * e.g. --shard=0/2 // the even specs: 0, 2, 4, etc * e.g. --shard=1/2 // the odd specs: 1, 3, 5, etc * e.g. --shard=1/3 // the second of every three specs: 1, 4, 7, etc + * + * --cliSpecsConcurrency Amount of CLI example specs that should be executed concurrently. + * By default runs specs sequentially. */ function runE2e() { if (argv.setup) { @@ -65,7 +71,8 @@ function runE2e() { const outputFile = path.join(AIO_PATH, './protractor-results.txt'); return Promise.resolve() - .then(() => findAndRunE2eTests(argv.filter, outputFile, argv.shard)) + .then(() => findAndRunE2eTests(argv.filter, outputFile, argv.shard, + argv.cliSpecsConcurrency || DEFAULT_CLI_SPECS_CONCURRENCY)) .then((status) => { reportStatus(status, outputFile); if (status.failed.length > 0) { @@ -80,7 +87,7 @@ function runE2e() { // Finds all of the *e2e-spec.tests under the examples folder along with the corresponding apps // that they should run under. Then run each app/spec collection sequentially. -function findAndRunE2eTests(filter, outputFile, shard) { +function findAndRunE2eTests(filter, outputFile, shard, cliSpecsConcurrency) { const shardParts = shard ? shard.split('/') : [0, 1]; const shardModulo = parseInt(shardParts[0], 10); const shardDivider = parseInt(shardParts[1], 10); @@ -91,8 +98,12 @@ function findAndRunE2eTests(filter, outputFile, shard) { header += ` Filter: ${filter ? filter : 'All tests'}\n\n`; fs.writeFileSync(outputFile, header); - // Run the tests sequentially. const status = {passed: [], failed: []}; + const updateStatus = (specPath, passed) => { + const arr = passed ? status.passed : status.failed; + arr.push(specPath); + }; + return getE2eSpecs(EXAMPLES_PATH, filter) .then(e2eSpecPaths => { console.log('All e2e specs:'); @@ -111,22 +122,29 @@ function findAndRunE2eTests(filter, outputFile, shard) { (promise, specPath) => { return promise.then(() => { const examplePath = path.dirname(specPath); - return runE2eTestsSystemJS(examplePath, outputFile).then(ok => { - const arr = ok ? status.passed : status.failed; - arr.push(examplePath); - }); + return runE2eTestsSystemJS(examplePath, outputFile) + .then(passed => updateStatus(examplePath, passed)); }); }, Promise.resolve()) - .then(() => { - return e2eSpecPaths.cli.reduce((promise, specPath) => { - return promise.then(() => { - return runE2eTestsCLI(specPath, outputFile).then(ok => { - const arr = ok ? status.passed : status.failed; - arr.push(specPath); - }); - }); - }, Promise.resolve()); + .then(async () => { + const specQueue = [...e2eSpecPaths.cli]; + // Determine free ports for the amount of pending CLI specs before starting + // any tests. This is necessary because ports can stuck in the "TIME_WAIT" + // state after others specs which used that port exited. This works around + // this potential race condition which surfaces on Windows. + const ports = await findFreePort(4000, 6000, '127.0.0.1', specQueue.length); + // Enable buffering of the process output in case multiple CLI specs will + // be executed concurrently. This means that we can can print out the full + // output at once without interfering with other CLI specs printing as well. + const bufferOutput = cliSpecsConcurrency > 1; + while (specQueue.length) { + const chunk = specQueue.splice(0, cliSpecsConcurrency); + await Promise.all(chunk.map((testDir, index) => { + return runE2eTestsCLI(testDir, outputFile, bufferOutput, ports.pop()) + .then(passed => updateStatus(testDir, passed)); + })); + } }); }) .then(() => { @@ -218,30 +236,46 @@ function runProtractorAoT(appDir, outputFile) { // fileName; then shut down the example. // All protractor output is appended to the outputFile. // CLI version -function runE2eTestsCLI(appDir, outputFile) { - console.log(`\n\n=========== Running aio example tests for: ${appDir}`); +function runE2eTestsCLI(appDir, outputFile, bufferOutput, port) { + if (!bufferOutput) { + console.log(`\n\n=========== Running aio example tests for: ${appDir}`); + } + // `--no-webdriver-update` is needed to preserve the ChromeDriver version already installed. const config = loadExampleConfig(appDir); - const commands = config.e2e || [{cmd: 'yarn', args: ['e2e', '--prod', '--no-webdriver-update']}]; + const commands = config.e2e || [{ + cmd: 'yarn', + args: ['e2e', '--prod', '--no-webdriver-update', `--port=${port || DEFAULT_CLI_EXAMPLE_PORT}`] + }]; + let bufferedOutput = `\n\n============== AIO example output for: ${appDir}\n\n`; const e2eSpawnPromise = commands.reduce((prevSpawnPromise, {cmd, args}) => { + // Replace the port placeholder with the specified port if present. Specs that + // define their e2e test commands in the example config are able to use the + // given available port. This ensures that the CLI tests can be run concurrently. + args = args.map(a => a.replace('{PORT}', port || DEFAULT_CLI_EXAMPLE_PORT)); + return prevSpawnPromise.then(() => { - const currSpawn = spawnExt(cmd, args, {cwd: appDir}); + const currSpawn = spawnExt(cmd, args, {cwd: appDir}, false, + bufferOutput ? msg => bufferedOutput += msg : undefined); return currSpawn.promise.then( () => Promise.resolve(finish(currSpawn.proc.pid, true)), () => Promise.reject(finish(currSpawn.proc.pid, false))); }); }, Promise.resolve()); - return e2eSpawnPromise.then( - () => { - fs.appendFileSync(outputFile, `Passed: ${appDir}\n\n`); - return true; - }, - () => { - fs.appendFileSync(outputFile, `Failed: ${appDir}\n\n`); - return false; - }); + return e2eSpawnPromise.then(() => { + fs.appendFileSync(outputFile, `Passed: ${appDir}\n\n`); + return true; + }, () => { + fs.appendFileSync(outputFile, `Failed: ${appDir}\n\n`); + return false; + }).then(passed => { + if (bufferOutput) { + process.stdout.write(bufferedOutput); + } + return passed; + }); } // Report final status. @@ -275,11 +309,13 @@ function reportStatus(status, outputFile) { } // Returns both a promise and the spawned process so that it can be killed if needed. -function spawnExt(command, args, options, ignoreClose = false) { +function spawnExt(command, args, options, ignoreClose = false, + printMessage = msg => process.stdout.write(msg)) { let proc; const promise = new Promise((resolve, reject) => { let descr = command + ' ' + args.join(' '); - console.log('running: ' + descr); + let processOutput = ''; + printMessage(`running: ${descr}\n`); try { proc = xSpawn.spawn(command, args, options); } catch (e) { @@ -287,17 +323,18 @@ function spawnExt(command, args, options, ignoreClose = false) { reject(e); return {proc: null, promise}; } - proc.stdout.on('data', function(data) { process.stdout.write(data.toString()); }); - proc.stderr.on('data', function(data) { process.stdout.write(data.toString()); }); + proc.stdout.on('data', printMessage); + proc.stderr.on('data', printMessage); + proc.on('close', function(returnCode) { - console.log(`completed: ${descr} \n`); + printMessage(`completed: ${descr}\n\n`); // Many tasks (e.g., tsc) complete but are actually errors; // Confirm return code is zero. returnCode === 0 || ignoreClose ? resolve(0) : reject(returnCode); }); proc.on('error', function(data) { - console.log(`completed with error: ${descr} \n`); - console.log(data.toString()); + printMessage(`completed with error: ${descr}\n\n`); + printMessage(`${data.toString()}\n`); reject(data); }); }); diff --git a/aio/yarn.lock b/aio/yarn.lock index a12daf8c75..36ac4fa113 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -3760,6 +3760,11 @@ find-cache-dir@^2.0.0: make-dir "^1.0.0" pkg-dir "^3.0.0" +find-free-port@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-free-port/-/find-free-port-2.0.0.tgz#4b22e5f6579eb1a38c41ac6bcb3efed1b6da9b1b" + integrity sha1-SyLl9leesaOMQaxryz7+0bbamxs= + find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" From 42271263052909e359eceb44673529d333efbc68 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 5 Mar 2019 00:33:06 +0100 Subject: [PATCH 0302/1073] ci(docs-infra): run cli docs examples concurrently (#29103) PR Close #29103 --- .circleci/config.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f1c36b43d2..55077e6394 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -332,6 +332,7 @@ jobs: # Needed because the example e2e tests depend on Chrome. - image: *browsers_docker_image parallelism: 4 + resource_class: xlarge steps: - *attach_workspace - *init_environment @@ -340,13 +341,14 @@ jobs: # Run examples tests. The "CIRCLE_NODE_INDEX" will be set if "parallelism" is enabled. # Since the parallelism is set to "3", there will be three parallel CircleCI containers # with either "0", "1" or "2" as node index. This can be passed to the "--shard" argument. - - run: yarn --cwd aio example-e2e --setup --local --shard=${CIRCLE_NODE_INDEX}/${CIRCLE_NODE_TOTAL} + - run: yarn --cwd aio example-e2e --setup --local --cliSpecsConcurrency=5 --shard=${CIRCLE_NODE_INDEX}/${CIRCLE_NODE_TOTAL} test_docs_examples_ivy: <<: *job_defaults docker: # Needed because the example e2e tests depend on Chrome. - image: *browsers_docker_image + resource_class: xlarge # We increase the parallelism here to five while the "test_docs_examples" job runs with # a parallelism of four. This is necessary because this job also need to run NGCC which # takes up more time and we don't want these jobs to impact the overall CI turnaround. @@ -365,7 +367,7 @@ jobs: # Run examples tests with ivy. The "CIRCLE_NODE_INDEX" will be set if "parallelism" is enabled. # Since the parallelism is set to "3", there will be three parallel CircleCI containers # with either "0", "1" or "2" as node index. This can be passed to the "--shard" argument. - - run: yarn --cwd aio example-e2e --setup --local --ivy --shard=${CIRCLE_NODE_INDEX}/${CIRCLE_NODE_TOTAL} + - run: yarn --cwd aio example-e2e --setup --local --ivy --cliSpecsConcurrency=5 --shard=${CIRCLE_NODE_INDEX}/${CIRCLE_NODE_TOTAL} # This job should only be run on PR builds, where `CI_PULL_REQUEST` is not `false`. aio_preview: From df354d1b34c5b61f5a3f939434ebf7b62b7f4728 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Sat, 9 Mar 2019 13:24:20 +0100 Subject: [PATCH 0303/1073] fix(bazel): add missing binary path for api-extractor (#29202) `api-extractor` binary is required for external consumers of `ng_module` that want to use the `bundle_dts` flag. This also sets a different api-exttractor binary to use for ng_module, based if it's internal or external. PR Close #29202 --- packages/bazel/package.json | 1 + packages/bazel/src/external.bzl | 1 + packages/bazel/src/ng_module.bzl | 7 ++++--- .../integrationtest/bazel/ng_module/BUILD.bazel | 1 + tools/defaults.bzl | 2 ++ 5 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/bazel/package.json b/packages/bazel/package.json index 038687cc18..1888153321 100644 --- a/packages/bazel/package.json +++ b/packages/bazel/package.json @@ -5,6 +5,7 @@ "author": "angular", "license": "MIT", "bin": { + "api-extractor": "./src/api-extractor/index.js", "ngc-wrapped": "./src/ngc-wrapped/index.js", "packager": "./src/ng_package/packager.js", "xi18n": "./src/ngc-wrapped/extract_i18n.js", diff --git a/packages/bazel/src/external.bzl b/packages/bazel/src/external.bzl index f9bbc98140..c082bc487d 100644 --- a/packages/bazel/src/external.bzl +++ b/packages/bazel/src/external.bzl @@ -33,6 +33,7 @@ compile_ts = _compile_ts DEPS_ASPECTS = _DEPS_ASPECTS ts_providers_dict_to_struct = _ts_providers_dict_to_struct +DEFAULT_API_EXTRACTOR = "@npm//@angular/bazel/bin:api-extractor" DEFAULT_NG_COMPILER = "@npm//@angular/bazel/bin:ngc-wrapped" DEFAULT_NG_XI18N = "@npm//@angular/bazel/bin:xi18n" FLAT_DTS_FILE_SUFFIX = ".bundle.d.ts" diff --git a/packages/bazel/src/ng_module.bzl b/packages/bazel/src/ng_module.bzl index 07685f90fe..75bb8b10fc 100644 --- a/packages/bazel/src/ng_module.bzl +++ b/packages/bazel/src/ng_module.bzl @@ -9,6 +9,7 @@ load( ":external.bzl", "COMMON_ATTRIBUTES", "COMMON_OUTPUTS", + "DEFAULT_API_EXTRACTOR", "DEFAULT_NG_COMPILER", "DEFAULT_NG_XI18N", "DEPS_ASPECTS", @@ -450,7 +451,7 @@ def ngc_compile_action( ctx.actions.run( progress_message = "Bundling DTS %s" % str(ctx.label), mnemonic = "APIExtractor", - executable = ctx.executable._api_extractor, + executable = ctx.executable.api_extractor, inputs = filter_inputs, outputs = dts_bundles_out, arguments = [ @@ -716,8 +717,8 @@ NG_MODULE_RULE_ATTRS = dict(dict(COMMON_ATTRIBUTES, **NG_MODULE_ATTRIBUTES), **{ # https://github.com/angular/angular/blob/master/packages/compiler-cli/src/transformers/api.ts "flat_module_out_file": attr.string(), "bundle_dts": attr.bool(default = False), - "_api_extractor": attr.label( - default = Label("//packages/bazel/src/api-extractor:api_extractor"), + "api_extractor": attr.label( + default = Label(DEFAULT_API_EXTRACTOR), executable = True, cfg = "host", ), diff --git a/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel b/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel index f3db21e7c8..10d4f052be 100644 --- a/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel +++ b/packages/compiler-cli/integrationtest/bazel/ng_module/BUILD.bazel @@ -6,6 +6,7 @@ ng_module( name = "test_module", testonly = True, srcs = glob(["*.ts"]), + api_extractor = "//packages/bazel/src/api-extractor:api_extractor", compiler = "//packages/bazel/src/ngc-wrapped", entry_point = "index.ts", flat_module_out_file = "flat_module_filename", diff --git a/tools/defaults.bzl b/tools/defaults.bzl index 21e4d57cfa..dbaa2738b4 100644 --- a/tools/defaults.bzl +++ b/tools/defaults.bzl @@ -9,6 +9,7 @@ load("//packages/bazel/src:ng_rollup_bundle.bzl", _ng_rollup_bundle = "ng_rollup _DEFAULT_TSCONFIG_BUILD = "//packages:tsconfig-build.json" _DEFAULT_TSCONFIG_TEST = "//packages:tsconfig-test" +_INTERNAL_NG_MODULE_API_EXTRACTOR = "//packages/bazel/src/api-extractor:api_extractor" _INTERNAL_NG_MODULE_COMPILER = "//packages/bazel/src/ngc-wrapped" _INTERNAL_NG_MODULE_XI18N = "//packages/bazel/src/ngc-wrapped:xi18n" _INTERNAL_NG_PACKAGER_PACKAGER = "//packages/bazel/src/ng_package:packager" @@ -124,6 +125,7 @@ def ng_module(name, tsconfig = None, entry_point = None, testonly = False, deps bundle_dts = bundle_dts, deps = deps, compiler = _INTERNAL_NG_MODULE_COMPILER, + api_extractor = _INTERNAL_NG_MODULE_API_EXTRACTOR, ng_xi18n = _INTERNAL_NG_MODULE_XI18N, module_name = module_name, **kwargs From 9d1423df7ec746a592f3ef03361ea0b28446394d Mon Sep 17 00:00:00 2001 From: Riley Littlefield Date: Sat, 9 Mar 2019 21:02:47 -0500 Subject: [PATCH 0304/1073] docs: fix typo in directive decorator description (#29207) PR Close #29207 --- packages/core/src/metadata/directives.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/metadata/directives.ts b/packages/core/src/metadata/directives.ts index f25f627622..601fb2fb65 100644 --- a/packages/core/src/metadata/directives.ts +++ b/packages/core/src/metadata/directives.ts @@ -274,7 +274,7 @@ export interface Directive { * To listen to global events, add the target to the event name. * The target can be `window`, `document` or `body`. * - The value is the statement to execute when the event occurs. If the - * statement evalueates to `false`, then `preventDefault` is applied on the DOM + * statement evaluates to `false`, then `preventDefault` is applied on the DOM * event. A handler method can refer to the `$event` local variable. * */ From 37b9f06f1e3255e958e99d047ca7648e5beebd0e Mon Sep 17 00:00:00 2001 From: WilliamKoza Date: Sat, 9 Mar 2019 12:19:53 +0100 Subject: [PATCH 0305/1073] docs: change the file name of the public API according with Angular CLI (#29200) PR Close #29200 --- aio/content/guide/creating-libraries.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/content/guide/creating-libraries.md b/aio/content/guide/creating-libraries.md index 5b54d3e8a8..9716a4b92e 100644 --- a/aio/content/guide/creating-libraries.md +++ b/aio/content/guide/creating-libraries.md @@ -42,7 +42,7 @@ This builder, among other things, ensures that the library is always built with To make library code reusable you must define a public API for it. This "user layer" defines what is available to consumers of your library. A user of your library should be able to access public functionality (such as NgModules, service providers and general utility functions) through a single import path. -The public API for your library is maintained in the `index.ts` file of your library folder. +The public API for your library is maintained in the `public-api.ts` file in your library folder. Anything exported from this file is made public when your library is imported into an application. Use an NgModule to expose services and components. From a8b432d55ddd11f546c80aa5647b072cb7f31d9f Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 11 Mar 2019 11:11:53 +0000 Subject: [PATCH 0306/1073] ci: add descriptive message for merge conflicts (#29215) Fix #29199 PR Close #29215 --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 55077e6394..91ccdda8e4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -73,7 +73,7 @@ var_7: &post_checkout if [[ -n "${CIRCLE_PR_NUMBER}" ]]; then # Fetch the head and merge commits for this PR. git fetch origin +refs/pull/$CIRCLE_PR_NUMBER/head:pr/$CIRCLE_PR_NUMBER/head - git fetch origin +refs/pull/$CIRCLE_PR_NUMBER/merge:pr/$CIRCLE_PR_NUMBER/merge + git fetch origin +refs/pull/$CIRCLE_PR_NUMBER/merge:pr/$CIRCLE_PR_NUMBER/merge || (echo "Could not fetch merge result with master for this PR. Please check and fix any merge conflicts." ; exit 1) # Checkout the merged PR for testing as CircleCI will just use the PR head otherwise. git checkout -qf pr/$CIRCLE_PR_NUMBER/merge # Reset the merge commit into its PR head. From e6117a3a49a10cda599f9e86f01986c917210648 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 11 Mar 2019 16:00:49 +0000 Subject: [PATCH 0307/1073] ci: rebase PRs on target branch (#29215) PR Close #29215 --- .circleci/config.yml | 21 +++----- tools/rebase-pr.js | 113 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 14 deletions(-) create mode 100644 tools/rebase-pr.js diff --git a/.circleci/config.yml b/.circleci/config.yml index 91ccdda8e4..e17e7dc4c2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -63,26 +63,19 @@ var_6: &job_defaults docker: - image: *default_docker_image -# After checkout, rebase on top of master. -# Similar to travis behavior, but not quite the same. -# See https://discuss.circleci.com/t/1662 +# After checkout, rebase on top of target branch. var_7: &post_checkout run: - name: Post checkout step + name: Rebase PR on target branch command: > if [[ -n "${CIRCLE_PR_NUMBER}" ]]; then - # Fetch the head and merge commits for this PR. - git fetch origin +refs/pull/$CIRCLE_PR_NUMBER/head:pr/$CIRCLE_PR_NUMBER/head - git fetch origin +refs/pull/$CIRCLE_PR_NUMBER/merge:pr/$CIRCLE_PR_NUMBER/merge || (echo "Could not fetch merge result with master for this PR. Please check and fix any merge conflicts." ; exit 1) - # Checkout the merged PR for testing as CircleCI will just use the PR head otherwise. - git checkout -qf pr/$CIRCLE_PR_NUMBER/merge - # Reset the merge commit into its PR head. - git reset pr/$CIRCLE_PR_NUMBER/head - # Commit the merge changes into the head of the PR. - # This way we keep the last commit message. + # User is required for rebase. git config user.name "angular-ci" git config user.email "angular-ci" - git commit . --amend --no-edit + # Rebase PR on top of target branch. + node tools/rebase-pr.js angular/angular ${CIRCLE_PR_NUMBER} + else + echo "This build is not over a PR, nothing to do." fi var_8: &yarn_install diff --git a/tools/rebase-pr.js b/tools/rebase-pr.js new file mode 100644 index 0000000000..eee42e4611 --- /dev/null +++ b/tools/rebase-pr.js @@ -0,0 +1,113 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +/** + * **Usage:** + * ``` + * node rebase-pr + * ``` + * **Example:** + * ``` + * node rebase-pr angular/angular 123 + * ``` + * + * Rebases the current branch on top of the GitHub PR target branch. + * + * **Context:** + * Since a GitHub PR is not necessarily up to date with its target branch, it is useful to rebase + * prior to testing it on CI to ensure more up to date test results. + * + * **Implementation details:** + * This script obtains the base for a GitHub PR via the + * [GitHub PR API](https://developer.github.com/v3/pulls/#get-a-single-pull-request), then + * fetches that branch, and rebases the current branch on top of it. + * + * **NOTE:** + * This script cannot use external dependencies or be compiled because it needs to run before the + * environment is setup. + * Use only features supported by the NodeJS versions used in the environment. + */ + +// This script uses `console` to print messages to the user. +// tslint:disable:no-console + +// Imports +const util = require('util'); +const https = require('https'); +const child_process = require('child_process'); +const exec = util.promisify(child_process.exec); + +// CLI validation +if (process.argv.length != 4) { + console.error(`This script requires the GitHub repository and PR number as arguments.`); + console.error(`Example: node tools/rebase-pr.js angular/angular 123`); + process.exitCode = 1; + return; +} + +// Run +_main(...process.argv.slice(2)).catch(err => { + console.log('Failed to rebase on top of target branch.\n'); + console.error(err); + process.exitCode = 1; +}); + +// Helpers +async function _main(repository, prNumber) { + console.log(`Determining target branch for PR ${prNumber} on ${repository}.`); + const targetBranch = await determineTargetBranch(repository, prNumber); + console.log(`Target branch is ${targetBranch}.`); + await exec(`git fetch origin ${targetBranch}`); + console.log(`Rebasing current branch on ${targetBranch}.`); + await exec(`git rebase origin/${targetBranch}`); + console.log('Rebase successful.'); +} + +function determineTargetBranch(repository, prNumber) { + const pullsUrl = `https://api.github.com/repos/${repository}/pulls/${prNumber}`; + // GitHub requires a user agent: https://developer.github.com/v3/#user-agent-required + const options = {headers: {'User-Agent': repository}}; + + return new Promise((resolve, reject) => { + https + .get( + pullsUrl, options, + (res) => { + const {statusCode} = res; + const contentType = res.headers['content-type']; + let rawData = ''; + + res.on('data', (chunk) => { rawData += chunk; }); + res.on('end', () => { + + let error; + if (statusCode !== 200) { + error = new Error( + `Request Failed.\nStatus Code: ${statusCode}.\nResponse: ${rawData}`); + } else if (!/^application\/json/.test(contentType)) { + error = new Error( + 'Invalid content-type.\n' + + `Expected application/json but received ${contentType}`); + } + + if (error) { + reject(error); + return; + } + + try { + const parsedData = JSON.parse(rawData); + resolve(parsedData['base']['ref']); + } catch (e) { + reject(e); + } + }); + }) + .on('error', (e) => { reject(e); }); + }); +} From 7315a68ac667b776ee28a702ae846c25111f922c Mon Sep 17 00:00:00 2001 From: Olivier Combe Date: Tue, 12 Mar 2019 16:33:14 +0100 Subject: [PATCH 0308/1073] fix(ivy): only remove missing placeholders with runtime i18n (#29252) Dynamic nodes are created at the end of the view stack, but we were removing all the placeholders between `i18nStart` and the last created node index, instead of removing everything between `i18nStart` and `i18nEnd`. This caused errors when dynamic nodes where created in multiple i18n blocks because we would remove all of the dynamic nodes created in the previous i18n blocks. PR Close #29252 --- packages/core/src/render3/i18n.ts | 9 ++-- packages/core/test/i18n_integration_spec.ts | 11 +++++ packages/core/test/render3/i18n_spec.ts | 49 +++++++++++++++++++++ 3 files changed, 63 insertions(+), 6 deletions(-) diff --git a/packages/core/src/render3/i18n.ts b/packages/core/src/render3/i18n.ts index 3349450dce..60ec580fe2 100644 --- a/packages/core/src/render3/i18n.ts +++ b/packages/core/src/render3/i18n.ts @@ -649,16 +649,14 @@ function i18nEndFirstPass(tView: TView) { const tI18n = tView.data[rootIndex + HEADER_OFFSET] as TI18n; ngDevMode && assertDefined(tI18n, `You should call i18nStart before i18nEnd`); - // The last placeholder that was added before `i18nEnd` - const previousOrParentTNode = getPreviousOrParentTNode(); - const visitedNodes = readCreateOpCodes(rootIndex, tI18n.create, tI18n.icus, viewData); - // Find the last node that was added before `i18nEnd` - let lastCreatedNode = previousOrParentTNode; + let lastCreatedNode = getPreviousOrParentTNode(); if (lastCreatedNode.child) { lastCreatedNode = findLastNode(lastCreatedNode.child); } + const visitedNodes = readCreateOpCodes(rootIndex, tI18n.create, tI18n.icus, viewData); + // Remove deleted nodes for (let i = rootIndex + 1; i <= lastCreatedNode.index - HEADER_OFFSET; i++) { if (visitedNodes.indexOf(i) === -1) { @@ -719,7 +717,6 @@ function readCreateOpCodes( currentTNode !, `You need to create or select a node before you can insert it into the DOM`); previousTNode = appendI18nNode(currentTNode !, destinationTNode, previousTNode); - destinationTNode.next = null; break; case I18nMutateOpCode.Select: const nodeIndex = opCode >>> I18nMutateOpCode.SHIFT_REF; diff --git a/packages/core/test/i18n_integration_spec.ts b/packages/core/test/i18n_integration_spec.ts index e04bc596e0..e89b15139c 100644 --- a/packages/core/test/i18n_integration_spec.ts +++ b/packages/core/test/i18n_integration_spec.ts @@ -610,4 +610,15 @@ onlyInIvy('Ivy i18n logic').describe('i18n', function() { .toEqual(`Contenu`); }); }); + + it('should handle multiple i18n sections', () => { + const template = ` +
Section 1
+
Section 2
+
Section 3
+ `; + const fixture = getFixtureWithOverrides({template}); + expect(fixture.nativeElement.innerHTML) + .toBe('
Section 1
Section 2
Section 3
'); + }); }); diff --git a/packages/core/test/render3/i18n_spec.ts b/packages/core/test/render3/i18n_spec.ts index a23584352e..1bd175fd6a 100644 --- a/packages/core/test/render3/i18n_spec.ts +++ b/packages/core/test/render3/i18n_spec.ts @@ -1285,6 +1285,55 @@ describe('Runtime i18n', () => { `
trad 1hellotrad
`); }); + it('should support multiple sibling i18n blocks', () => { + // Translated template: + //
+ //
Section 1
+ //
Section 2
+ //
Section 3
+ //
+ + const MSG_DIV_1 = `Section 1`; + const MSG_DIV_2 = `Section 2`; + const MSG_DIV_3 = `Section 3`; + + class MyApp { + static ngComponentDef = defineComponent({ + type: MyApp, + selectors: [['my-app']], + factory: () => new MyApp(), + consts: 7, + vars: 0, + template: (rf: RenderFlags, ctx: MyApp) => { + if (rf & RenderFlags.Create) { + elementStart(0, 'div'); + { + elementStart(1, 'div'); + { i18n(2, MSG_DIV_1); } + elementEnd(); + elementStart(3, 'div'); + { i18n(4, MSG_DIV_2); } + elementEnd(); + elementStart(5, 'div'); + { i18n(6, MSG_DIV_3); } + elementEnd(); + } + elementEnd(); + } + if (rf & RenderFlags.Update) { + i18nApply(2); + i18nApply(4); + i18nApply(6); + } + } + }); + } + + const fixture = new ComponentFixture(MyApp); + expect(fixture.html) + .toEqual(`
Section 1
Section 2
Section 3
`); + }); + it('should support attribute translations on removed elements', () => { // Translated template: //
From 6085f335e8137ad560223687c2cba80575569905 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Sun, 3 Mar 2019 18:19:27 +0100 Subject: [PATCH 0309/1073] fix(ivy): platform module bootstrap does not resolve resources (#29083) Currently with ViewEngine, if someone runs the platform's `bootstrapModule` method in order to boostrap a module in JIT mode, external component resources are properly resolved *automatically*. Currently with Ivy, the developer would need to manually call `resolveComponentResources` in order to asynchronously fetch the determined external component resources. In order to make this backwards compatible with ViewEngine, and also since platforms can already specify a `ResourceLoader` compiler provider, we need to automatically resolve all external component resources on module bootstrap. -- Since the `ResourceLoader` is part of the `@angular/compiler`, because ViewEngine performed the factory creation in the compiler, we can't access the `ResourceLoader` token from within core. In order to workaround this without introducing a breaking change, we just proxy the `ResourceLoader` token to `core` through the compiler facade. In the future, we should be able to move the `ResourceLoader` to core when ViewEngine code no longer exists in the `@angular/compiler`. PR Close #29083 --- .../compiler/src/compiler_facade_interface.ts | 5 +++ packages/compiler/src/jit_compiler_facade.ts | 2 ++ .../test/compiler_facade_interface_spec.ts | 3 ++ packages/core/src/application_ref.ts | 35 +++++++++++++++++-- .../src/compiler/compiler_facade_interface.ts | 5 +++ .../core/src/metadata/resource_loading.ts | 4 +++ packages/core/test/application_ref_spec.ts | 29 +++++++++++++-- .../test/metadata/resource_loading_spec.ts | 15 ++++++-- 8 files changed, 91 insertions(+), 7 deletions(-) diff --git a/packages/compiler/src/compiler_facade_interface.ts b/packages/compiler/src/compiler_facade_interface.ts index 10315fc72c..f069c587cb 100644 --- a/packages/compiler/src/compiler_facade_interface.ts +++ b/packages/compiler/src/compiler_facade_interface.ts @@ -41,10 +41,15 @@ export interface CompilerFacade { createParseSourceSpan(kind: string, typeName: string, sourceUrl: string): ParseSourceSpan; R3ResolvedDependencyType: typeof R3ResolvedDependencyType; + ResourceLoader: {new (): ResourceLoader}; } export interface CoreEnvironment { [name: string]: Function; } +export type ResourceLoader = { + get(url: string): Promise| string; +}; + export type StringMap = { [key: string]: string; }; diff --git a/packages/compiler/src/jit_compiler_facade.ts b/packages/compiler/src/jit_compiler_facade.ts index 15483a5f65..c805b5d2c4 100644 --- a/packages/compiler/src/jit_compiler_facade.ts +++ b/packages/compiler/src/jit_compiler_facade.ts @@ -23,10 +23,12 @@ import {R3Reference} from './render3/util'; import {R3DirectiveMetadata, R3QueryMetadata} from './render3/view/api'; import {ParsedHostBindings, compileComponentFromMetadata, compileDirectiveFromMetadata, parseHostBindings, verifyHostBindings} from './render3/view/compiler'; import {makeBindingParser, parseTemplate} from './render3/view/template'; +import {ResourceLoader} from './resource_loader'; import {DomElementSchemaRegistry} from './schema/dom_element_schema_registry'; export class CompilerFacadeImpl implements CompilerFacade { R3ResolvedDependencyType = R3ResolvedDependencyType as any; + ResourceLoader = ResourceLoader; private elementSchemaRegistry = new DomElementSchemaRegistry(); constructor(private jitEvaluator = new JitEvaluator()) {} diff --git a/packages/compiler/test/compiler_facade_interface_spec.ts b/packages/compiler/test/compiler_facade_interface_spec.ts index cb40b6711c..4f8b319e8e 100644 --- a/packages/compiler/test/compiler_facade_interface_spec.ts +++ b/packages/compiler/test/compiler_facade_interface_spec.ts @@ -36,6 +36,9 @@ const compilerCompilerFacade: compiler.CompilerFacade = null !as core.CompilerFa const coreCoreEnvironment: core.CoreEnvironment = null !as compiler.CoreEnvironment; const compilerCoreEnvironment: compiler.CoreEnvironment = null !as core.CoreEnvironment; +const coreResourceLoader: core.ResourceLoader = null !as compiler.ResourceLoader; +const compilerResourceLoader: compiler.ResourceLoader = null !as core.ResourceLoader; + const coreStringMap: core.StringMap = null !as compiler.StringMap; const compilerStringMap: compiler.StringMap = null !as core.StringMap; diff --git a/packages/core/src/application_ref.ts b/packages/core/src/application_ref.ts index 8669e889fc..0efd77d2af 100644 --- a/packages/core/src/application_ref.ts +++ b/packages/core/src/application_ref.ts @@ -11,15 +11,17 @@ import {share} from 'rxjs/operators'; import {ApplicationInitStatus} from './application_init'; import {APP_BOOTSTRAP_LISTENER, PLATFORM_INITIALIZER} from './application_tokens'; +import {getCompilerFacade} from './compiler/compiler_facade'; import {Console} from './console'; import {Injectable, InjectionToken, Injector, StaticProvider} from './di'; import {ErrorHandler} from './error_handler'; import {Type} from './interface/type'; -import {CompilerFactory, CompilerOptions} from './linker/compiler'; +import {COMPILER_OPTIONS, CompilerFactory, CompilerOptions} from './linker/compiler'; import {ComponentFactory, ComponentRef} from './linker/component_factory'; import {ComponentFactoryBoundToModule, ComponentFactoryResolver} from './linker/component_factory_resolver'; import {InternalNgModuleRef, NgModuleFactory, NgModuleRef} from './linker/ng_module_factory'; import {InternalViewRef, ViewRef} from './linker/view_ref'; +import {isComponentResourceResolutionQueueEmpty, resolveComponentResources} from './metadata/resource_loading'; import {WtfScopeFn, wtfCreateScope, wtfLeave} from './profile/profile'; import {assertNgModuleType} from './render3/assert'; import {ComponentFactory as R3ComponentFactory} from './render3/component_ref'; @@ -49,7 +51,30 @@ export function compileNgModuleFactory__POST_R3__( injector: Injector, options: CompilerOptions, moduleType: Type): Promise> { ngDevMode && assertNgModuleType(moduleType); - return Promise.resolve(new R3NgModuleFactory(moduleType)); + const moduleFactory = new R3NgModuleFactory(moduleType); + + if (isComponentResourceResolutionQueueEmpty()) { + return Promise.resolve(moduleFactory); + } + + const compilerOptions = injector.get(COMPILER_OPTIONS, []).concat(options); + const compilerProviders = _mergeArrays(compilerOptions.map(o => o.providers !)); + + // In case there are no compiler providers, we just return the module factory as + // there won't be any resource loader. This can happen with Ivy, because AOT compiled + // modules can be still passed through "bootstrapModule". In that case we shouldn't + // unnecessarily require the JIT compiler. + if (compilerProviders.length === 0) { + return Promise.resolve(moduleFactory); + } + + const compiler = getCompilerFacade(); + const compilerInjector = Injector.create({providers: compilerProviders}); + const resourceLoader = compilerInjector.get(compiler.ResourceLoader); + // The resource loader can also return a string while the "resolveComponentResources" + // always expects a promise. Therefore we need to wrap the returned value in a promise. + return resolveComponentResources(url => Promise.resolve(resourceLoader.get(url))) + .then(() => moduleFactory); } let isBoundToModule: (cf: ComponentFactory) => boolean = isBoundToModule__PRE_R3__; @@ -671,3 +696,9 @@ function remove(list: T[], el: T): void { list.splice(index, 1); } } + +function _mergeArrays(parts: any[][]): any[] { + const result: any[] = []; + parts.forEach((part) => part && result.push(...part)); + return result; +} diff --git a/packages/core/src/compiler/compiler_facade_interface.ts b/packages/core/src/compiler/compiler_facade_interface.ts index a5a209845b..954cc0ad89 100644 --- a/packages/core/src/compiler/compiler_facade_interface.ts +++ b/packages/core/src/compiler/compiler_facade_interface.ts @@ -41,10 +41,15 @@ export interface CompilerFacade { createParseSourceSpan(kind: string, typeName: string, sourceUrl: string): ParseSourceSpan; R3ResolvedDependencyType: typeof R3ResolvedDependencyType; + ResourceLoader: {new (): ResourceLoader}; } export interface CoreEnvironment { [name: string]: Function; } +export type ResourceLoader = { + get(url: string): Promise| string; +}; + export type StringMap = { [key: string]: string; }; diff --git a/packages/core/src/metadata/resource_loading.ts b/packages/core/src/metadata/resource_loading.ts index 633e0ac871..fa7657752c 100644 --- a/packages/core/src/metadata/resource_loading.ts +++ b/packages/core/src/metadata/resource_loading.ts @@ -99,6 +99,10 @@ export function clearResolutionOfComponentResourcesQueue() { componentResourceResolutionQueue.clear(); } +export function isComponentResourceResolutionQueueEmpty() { + return componentResourceResolutionQueue.size === 0; +} + function unwrapResponse(response: string | {text(): Promise}): string|Promise { return typeof response == 'string' ? response : response.text(); } diff --git a/packages/core/test/application_ref_spec.ts b/packages/core/test/application_ref_spec.ts index 48f5544863..39034d1789 100644 --- a/packages/core/test/application_ref_spec.ts +++ b/packages/core/test/application_ref_spec.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {ResourceLoader} from '@angular/compiler'; import {APP_BOOTSTRAP_LISTENER, APP_INITIALIZER, Compiler, CompilerFactory, Component, InjectionToken, NgModule, NgZone, PlatformRef, TemplateRef, Type, ViewChild, ViewContainerRef} from '@angular/core'; import {ApplicationRef} from '@angular/core/src/application_ref'; import {ErrorHandler} from '@angular/core/src/error_handler'; @@ -41,7 +42,8 @@ class SomeComponent { getDOM().appendChild(doc.body, rootEl); } - type CreateModuleOptions = {providers?: any[], ngDoBootstrap?: any, bootstrap?: any[]}; + type CreateModuleOptions = + {providers?: any[], ngDoBootstrap?: any, bootstrap?: any[], component?: Type}; function createModule(providers?: any[]): Type; function createModule(options: CreateModuleOptions): Type; @@ -62,8 +64,8 @@ class SomeComponent { @NgModule({ providers: [{provide: ErrorHandler, useValue: errorHandler}, options.providers || []], imports: [platformModule], - declarations: [SomeComponent], - entryComponents: [SomeComponent], + declarations: [options.component || SomeComponent], + entryComponents: [options.component || SomeComponent], bootstrap: options.bootstrap || [] }) class MyModule { @@ -303,6 +305,27 @@ class SomeComponent { expect(ngZone instanceof NoopNgZone).toBe(true); }); })); + + it('should resolve component resources when creating module factory', async() => { + @Component({ + selector: 'with-templates-app', + templateUrl: '/test-template.html', + }) + class WithTemplateUrlComponent { + } + + const loadResourceSpy = jasmine.createSpy('load resource').and.returnValue('fakeContent'); + const testModule = createModule({component: WithTemplateUrlComponent}); + + await defaultPlatform.bootstrapModule(testModule, { + providers: [ + {provide: ResourceLoader, useValue: {get: loadResourceSpy}}, + ] + }); + + expect(loadResourceSpy).toHaveBeenCalledTimes(1); + expect(loadResourceSpy).toHaveBeenCalledWith('/test-template.html'); + }); }); describe('bootstrapModuleFactory', () => { diff --git a/packages/core/test/metadata/resource_loading_spec.ts b/packages/core/test/metadata/resource_loading_spec.ts index 49d6ff5b6d..f6202e6e1b 100644 --- a/packages/core/test/metadata/resource_loading_spec.ts +++ b/packages/core/test/metadata/resource_loading_spec.ts @@ -7,13 +7,14 @@ */ import {Component} from '../../src/core'; -import {clearResolutionOfComponentResourcesQueue, resolveComponentResources} from '../../src/metadata/resource_loading'; +import {clearResolutionOfComponentResourcesQueue, isComponentResourceResolutionQueueEmpty, resolveComponentResources} from '../../src/metadata/resource_loading'; import {ComponentType} from '../../src/render3/interfaces/definition'; import {compileComponent} from '../../src/render3/jit/directive'; describe('resource_loading', () => { + afterEach(clearResolutionOfComponentResourcesQueue); + describe('error handling', () => { - afterEach(clearResolutionOfComponentResourcesQueue); it('should throw an error when compiling component that has unresolved templateUrl', () => { const MyComponent: ComponentType = (class MyComponent{}) as any; compileComponent(MyComponent, {templateUrl: 'someUrl'}); @@ -111,6 +112,16 @@ Did you run and wait for 'resolveComponentResources()'?`.trim()); expect(metadata.styles).toEqual(['existing', 'first', 'second']); }); + it('should not add components without external resources to resolution queue', () => { + const MyComponent: ComponentType = (class MyComponent{}) as any; + const MyComponent2: ComponentType = (class MyComponent{}) as any; + + compileComponent(MyComponent, {template: ''}); + expect(isComponentResourceResolutionQueueEmpty()).toBe(true); + + compileComponent(MyComponent2, {templateUrl: 'test://template'}); + expect(isComponentResourceResolutionQueueEmpty()).toBe(false); + }); }); describe('fetch', () => { From ec8b74da56667bdafecde20fb47c8070813adbed Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Sun, 3 Mar 2019 18:25:43 +0100 Subject: [PATCH 0310/1073] ci(docs-infra): re-enable systemjs JIT docs examples (#29083) With 63fb6c08cf1d69f912a0a4e9a28846d6e6985d04, the bug that required us to temporarily disable these two SystemJS JIT tests has been fixed. Therefore we can re-enable these tests. PR Close #29083 --- aio/tools/examples/run-example-e2e.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/aio/tools/examples/run-example-e2e.js b/aio/tools/examples/run-example-e2e.js index db89b0084d..f0c1f6770d 100644 --- a/aio/tools/examples/run-example-e2e.js +++ b/aio/tools/examples/run-example-e2e.js @@ -26,10 +26,6 @@ const IGNORED_EXAMPLES = [ const fixmeIvyExamples = [ // fixmeIvy('unknown') app fails at runtime due to missing external service (goog is undefined) 'i18n', - // fixmeIvy('unknown') JIT app fails with external resources not loaded. - 'upgrade-phonecat-2-hybrid', - // fixmeIvy('unknown') JIT app fails with external resources not loaded. - 'upgrade-phonecat-3-final', ]; if (argv.ivy) { From 1c251e59d7b1985c9442c7a9847b2e69bed8c04e Mon Sep 17 00:00:00 2001 From: Brandon Date: Tue, 12 Mar 2019 17:53:47 +0000 Subject: [PATCH 0311/1073] docs: fix failing specs in testing example (#29256) The tests that need the actuallyDone flag are grouped together PR Close #29256 --- .../testing/src/app/demo/async-helper.spec.ts | 165 +++++++++--------- 1 file changed, 85 insertions(+), 80 deletions(-) diff --git a/aio/content/examples/testing/src/app/demo/async-helper.spec.ts b/aio/content/examples/testing/src/app/demo/async-helper.spec.ts index 9c9c3cb7d8..ca0239408d 100644 --- a/aio/content/examples/testing/src/app/demo/async-helper.spec.ts +++ b/aio/content/examples/testing/src/app/demo/async-helper.spec.ts @@ -4,86 +4,103 @@ import { interval, of } from 'rxjs'; import { delay, take } from 'rxjs/operators'; describe('Angular async helper', () => { - let actuallyDone = false; - beforeEach(() => { actuallyDone = false; }); + describe('async', () => { + let actuallyDone = false; - afterEach(() => { expect(actuallyDone).toBe(true, 'actuallyDone should be true'); }); + beforeEach(() => { actuallyDone = false; }); - it('should run normal test', () => { actuallyDone = true; }); + afterEach(() => { expect(actuallyDone).toBe(true, 'actuallyDone should be true'); }); - it('should run normal async test', (done: DoneFn) => { - setTimeout(() => { - actuallyDone = true; - done(); - }, 0); + it('should run normal test', () => { actuallyDone = true; }); + + it('should run normal async test', (done: DoneFn) => { + setTimeout(() => { + actuallyDone = true; + done(); + }, 0); + }); + + it('should run async test with task', + async(() => { setTimeout(() => { actuallyDone = true; }, 0); })); + + it('should run async test with task', async(() => { + const id = setInterval(() => { + actuallyDone = true; + clearInterval(id); + }, 100); + })); + + it('should run async test with successful promise', async(() => { + const p = new Promise(resolve => { setTimeout(resolve, 10); }); + p.then(() => { actuallyDone = true; }); + })); + + it('should run async test with failed promise', async(() => { + const p = new Promise((resolve, reject) => { setTimeout(reject, 10); }); + p.catch(() => { actuallyDone = true; }); + })); + + // Use done. Can also use async or fakeAsync. + it('should run async test with successful delayed Observable', (done: DoneFn) => { + const source = of (true).pipe(delay(10)); + source.subscribe(val => actuallyDone = true, err => fail(err), done); + }); + + it('should run async test with successful delayed Observable', async(() => { + const source = of (true).pipe(delay(10)); + source.subscribe(val => actuallyDone = true, err => fail(err)); + })); + + it('should run async test with successful delayed Observable', fakeAsync(() => { + const source = of (true).pipe(delay(10)); + source.subscribe(val => actuallyDone = true, err => fail(err)); + + tick(10); + })); }); - it('should run async test with task', - async(() => { setTimeout(() => { actuallyDone = true; }, 0); })); + describe('fakeAsync', () => { + // #docregion fake-async-test-tick + it('should run timeout callback with delay after call tick with millis', fakeAsync(() => { + let called = false; + setTimeout(() => { called = true; }, 100); + tick(100); + expect(called).toBe(true); + })); + // #enddocregion fake-async-test-tick - it('should run async test with task', async(() => { - const id = setInterval(() => { - actuallyDone = true; - clearInterval(id); - }, 100); - })); + // #docregion fake-async-test-date + it('should get Date diff correctly in fakeAsync', fakeAsync(() => { + const start = Date.now(); + tick(100); + const end = Date.now(); + expect(end - start).toBe(100); + })); + // #enddocregion fake-async-test-date - it('should run async test with successful promise', async(() => { - const p = new Promise(resolve => { setTimeout(resolve, 10); }); - p.then(() => { actuallyDone = true; }); - })); + // #docregion fake-async-test-rxjs + it('should get Date diff correctly in fakeAsync with rxjs scheduler', fakeAsync(() => { + // need to add `import 'zone.js/dist/zone-patch-rxjs-fake-async' + // to patch rxjs scheduler + let result = null; + of ('hello').pipe(delay(1000)).subscribe(v => { result = v; }); + expect(result).toBeNull(); + tick(1000); + expect(result).toBe('hello'); - it('should run async test with failed promise', async(() => { - const p = new Promise((resolve, reject) => { setTimeout(reject, 10); }); - p.catch(() => { actuallyDone = true; }); - })); + const start = new Date().getTime(); + let dateDiff = 0; + interval(1000).pipe(take(2)).subscribe(() => dateDiff = (new Date().getTime() - start)); - // Use done. Can also use async or fakeAsync. - it('should run async test with successful delayed Observable', (done: DoneFn) => { - const source = of (true).pipe(delay(10)); - source.subscribe(val => actuallyDone = true, err => fail(err), done); + tick(1000); + expect(dateDiff).toBe(1000); + tick(1000); + expect(dateDiff).toBe(2000); + })); + // #enddocregion fake-async-test-rxjs }); - // #docregion fake-async-test-tick - it('should run timeout callback with delay after call tick with millis', fakeAsync(() => { - let called = false; - setTimeout(() => { called = true; }, 100); - tick(100); - expect(called).toBe(true); - })); - // #enddocregion fake-async-test-tick - - // #docregion fake-async-test-date - it('should get Date diff correctly in fakeAsync', fakeAsync(() => { - const start = Date.now(); - tick(100); - const end = Date.now(); - expect(end - start).toBe(100); - })); - // #enddocregion fake-async-test-date - - // #docregion fake-async-test-rxjs - it('should get Date diff correctly in fakeAsync with rxjs scheduler', fakeAsync(() => { - // need to add `import 'zone.js/dist/zone-patch-rxjs-fake-async' - // to patch rxjs scheduler - let result = null; - of ('hello').pipe(delay(1000)).subscribe(v => { result = v; }); - expect(result).toBeNull(); - tick(1000); - expect(result).toBe('hello'); - - const start = new Date().getTime(); - let dateDiff = 0; - interval(1000).pipe(take(2)).subscribe(() => dateDiff = (new Date().getTime() - start)); - - tick(1000); - expect(dateDiff).toBe(1000); - tick(1000); - expect(dateDiff).toBe(2000); - })); - // #enddocregion fake-async-test-rxjs - // #docregion fake-async-test-clock describe('use jasmine.clock()', () => { // need to config __zone_symbol__fakeAsyncPatchLock flag @@ -124,16 +141,4 @@ describe('Angular async helper', () => { }); // #enddocregion async-test-promise-then - it('should run async test with successful delayed Observable', async(() => { - const source = of (true).pipe(delay(10)); - source.subscribe(val => actuallyDone = true, err => fail(err)); - })); - - it('should run async test with successful delayed Observable', fakeAsync(() => { - const source = of (true).pipe(delay(10)); - source.subscribe(val => actuallyDone = true, err => fail(err)); - - tick(10); - })); - }); From af525364195d5531c9f663809400bea64eb1dd6b Mon Sep 17 00:00:00 2001 From: Marc Laval Date: Tue, 12 Mar 2019 17:25:30 +0100 Subject: [PATCH 0312/1073] test(ivy): update root cause of failures in MatSnackBar (#29254) PR Close #29254 --- tools/material-ci/angular_material_test_blocklist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index 9c750dbdce..d73947c1ed 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -235,7 +235,7 @@ window.testBlocklist = { }, "MatSnackBar with TemplateRef should be able to open a snack bar using a TemplateRef": { "error": "Error: Expected ' Fries Pizza ' to contain 'Pasta'.", - "notes": "FW-842: View engine dirty-checks projected views when the declaration place is checked" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (MatSnackBarContainer is OnPush)" }, "MatTooltip special cases should clear the `user-select` when a tooltip is set on a text field": { "error": "Error: Expected 'none' to be falsy.", From c09d0ed627b76cd419f53c579bf5011c0b4012b1 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Tue, 12 Mar 2019 12:13:19 -0700 Subject: [PATCH 0313/1073] ci: fix size regression to unblock master (#29263) PR Close #29263 --- integration/_payload-limits.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integration/_payload-limits.json b/integration/_payload-limits.json index 61f989f000..8954698249 100644 --- a/integration/_payload-limits.json +++ b/integration/_payload-limits.json @@ -21,7 +21,7 @@ "master": { "uncompressed": { "runtime": 1440, - "main": 209904, + "main": 212976, "polyfills": 38390 } } @@ -34,4 +34,4 @@ } } } -} \ No newline at end of file +} From 3c53713616b476822cafca80177042424ff1ad0d Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Wed, 6 Mar 2019 14:45:32 +0100 Subject: [PATCH 0314/1073] refactor(core): static query schematic should handle asynchronous query usages properly (#29133) With 62157990554306fb76e1e254b31855f966ff65f2, we introduced a schematic for the Angular core package that automatically migrates unexplicit query definitions to the explicit query timing (static <-> dynamic). As the initial foundation was already big enough, it was planned to come up with a follow-up that handles asynchronous query usages properly. e.g. queries could be used in Promises, `setTimeout`, `setInterval`, `requestAnimationFrame` and more, but the schematic would incorrectly declare these queries as static. This commit ensures that we properly handle these micro/macro tasks and don't incorrectly consider queries as static. The declaration usage visitor should only check the synchronous control flow and completely ignore any statements within function like expressions which aren't explicitly executed in a synchronous way. e.g. IIFE's still work as the function expression is synchronously invoked. PR Close #29133 --- .../angular/analyze_query_usage.ts | 29 +-- .../angular/declaration_usage_visitor.ts | 44 ++-- .../static-queries/typescript/functions.ts | 29 +++ .../test/static_queries_migration_spec.ts | 192 +++++++++++++++++- 4 files changed, 268 insertions(+), 26 deletions(-) create mode 100644 packages/core/schematics/migrations/static-queries/typescript/functions.ts diff --git a/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts b/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts index a6debd1c53..0635db7073 100644 --- a/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts +++ b/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts @@ -53,22 +53,25 @@ function isQueryUsedStatically( // access it statically. e.g. // (1) queries used in the "ngOnInit" lifecycle hook are static. // (2) inputs with setters can access queries statically. - const possibleStaticQueryNodes: ts.Node[] = classDecl.members.filter(m => { - if (ts.isMethodDeclaration(m) && hasPropertyNameText(m.name) && - STATIC_QUERY_LIFECYCLE_HOOKS[query.type].indexOf(m.name.text) !== -1) { - return true; - } else if ( - knownInputNames && ts.isSetAccessor(m) && hasPropertyNameText(m.name) && - knownInputNames.indexOf(m.name.text) !== -1) { - return true; - } - return false; - }); + const possibleStaticQueryNodes: ts.Node[] = + classDecl.members + .filter(m => { + if (ts.isMethodDeclaration(m) && m.body && hasPropertyNameText(m.name) && + STATIC_QUERY_LIFECYCLE_HOOKS[query.type].indexOf(m.name.text) !== -1) { + return true; + } else if ( + knownInputNames && ts.isSetAccessor(m) && m.body && hasPropertyNameText(m.name) && + knownInputNames.indexOf(m.name.text) !== -1) { + return true; + } + return false; + }) + .map((member: ts.SetAccessorDeclaration | ts.MethodDeclaration) => member.body !); // In case nodes that can possibly access a query statically have been found, check - // if the query declaration is used within any of these nodes. + // if the query declaration is synchronously used within any of these nodes. if (possibleStaticQueryNodes.length && - possibleStaticQueryNodes.some(hookNode => usageVisitor.isUsedInNode(hookNode))) { + possibleStaticQueryNodes.some(n => usageVisitor.isSynchronouslyUsedInNode(n))) { return true; } diff --git a/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts b/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts index db6a7c7ac5..1a5a3732a6 100644 --- a/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts +++ b/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts @@ -7,6 +7,7 @@ */ import * as ts from 'typescript'; +import {isFunctionLikeDeclaration, unwrapExpression} from '../typescript/functions'; /** * Class that can be used to determine if a given TypeScript node is used within @@ -26,19 +27,33 @@ export class DeclarationUsageVisitor { } private addJumpExpressionToQueue(node: ts.Expression, nodeQueue: ts.Node[]) { + // In case the given expression is already referring to a function-like declaration, + // we don't need to resolve the symbol of the expression as the jump expression is + // defined inline and we can just add the given node to the queue. + if (isFunctionLikeDeclaration(node) && node.body) { + nodeQueue.push(node.body); + return; + } + const callExprSymbol = this.typeChecker.getSymbolAtLocation(node); - // Note that we should not add previously visited symbols to the queue as this - // could cause cycles. - if (callExprSymbol && callExprSymbol.valueDeclaration && - !this.visitedJumpExprSymbols.has(callExprSymbol)) { + if (!callExprSymbol || !callExprSymbol.valueDeclaration || + !isFunctionLikeDeclaration(callExprSymbol.valueDeclaration)) { + return; + } + + const expressionDecl = callExprSymbol.valueDeclaration; + + // Note that we should not add previously visited symbols to the queue as + // this could cause cycles. + if (expressionDecl.body && !this.visitedJumpExprSymbols.has(callExprSymbol)) { this.visitedJumpExprSymbols.add(callExprSymbol); - nodeQueue.push(callExprSymbol.valueDeclaration); + nodeQueue.push(expressionDecl.body); } } private addNewExpressionToQueue(node: ts.NewExpression, nodeQueue: ts.Node[]) { - const newExprSymbol = this.typeChecker.getSymbolAtLocation(node.expression); + const newExprSymbol = this.typeChecker.getSymbolAtLocation(unwrapExpression(node.expression)); // Only handle new expressions which resolve to classes. Technically "new" could // also call void functions or objects with a constructor signature. Also note that @@ -50,15 +65,15 @@ export class DeclarationUsageVisitor { } const targetConstructor = - newExprSymbol.valueDeclaration.members.find(d => ts.isConstructorDeclaration(d)); + newExprSymbol.valueDeclaration.members.find(ts.isConstructorDeclaration); - if (targetConstructor) { + if (targetConstructor && targetConstructor.body) { this.visitedJumpExprSymbols.add(newExprSymbol); - nodeQueue.push(targetConstructor); + nodeQueue.push(targetConstructor.body); } } - isUsedInNode(searchNode: ts.Node): boolean { + isSynchronouslyUsedInNode(searchNode: ts.Node): boolean { const nodeQueue: ts.Node[] = [searchNode]; this.visitedJumpExprSymbols.clear(); @@ -72,7 +87,7 @@ export class DeclarationUsageVisitor { // Handle call expressions within TypeScript nodes that cause a jump in control // flow. We resolve the call expression value declaration and add it to the node queue. if (ts.isCallExpression(node)) { - this.addJumpExpressionToQueue(node.expression, nodeQueue); + this.addJumpExpressionToQueue(unwrapExpression(node.expression), nodeQueue); } // Handle new expressions that cause a jump in control flow. We resolve the @@ -81,7 +96,12 @@ export class DeclarationUsageVisitor { this.addNewExpressionToQueue(node, nodeQueue); } - nodeQueue.push(...node.getChildren()); + // Do not visit nodes that declare a block of statements but are not executed + // synchronously (e.g. function declarations). We only want to check TypeScript + // nodes which are synchronously executed in the control flow. + if (!isFunctionLikeDeclaration(node)) { + nodeQueue.push(...node.getChildren()); + } } return false; } diff --git a/packages/core/schematics/migrations/static-queries/typescript/functions.ts b/packages/core/schematics/migrations/static-queries/typescript/functions.ts new file mode 100644 index 0000000000..3e32af4132 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/typescript/functions.ts @@ -0,0 +1,29 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +/** Checks whether a given node is a function like declaration. */ +export function isFunctionLikeDeclaration(node: ts.Node): node is ts.FunctionLikeDeclaration { + return ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node) || + ts.isArrowFunction(node) || ts.isFunctionExpression(node) || + ts.isGetAccessorDeclaration(node) || ts.isSetAccessorDeclaration(node); +} + +/** + * Unwraps a given expression TypeScript node. Expressions can be wrapped within multiple + * parentheses. e.g. "(((({exp}))))()". The function should return the TypeScript node + * referring to the inner expression. e.g "exp". + */ +export function unwrapExpression(node: ts.Expression | ts.ParenthesizedExpression): ts.Expression { + if (ts.isParenthesizedExpression(node)) { + return unwrapExpression(node.expression); + } else { + return node; + } +} diff --git a/packages/core/schematics/test/static_queries_migration_spec.ts b/packages/core/schematics/test/static_queries_migration_spec.ts index 6ed28cbf39..8bd207ceed 100644 --- a/packages/core/schematics/test/static_queries_migration_spec.ts +++ b/packages/core/schematics/test/static_queries_migration_spec.ts @@ -287,6 +287,16 @@ describe('static-queries migration', () => { ngOnInit() { new A(this); + + new class Inline { + constructor(private ctx: MyComp) { + this.a(); + } + + a() { + this.ctx.query2.useStatically(); + } + }(this); } } @@ -302,7 +312,33 @@ describe('static-queries migration', () => { expect(tree.readContent('/index.ts')) .toContain(`@${queryType}('test', { static: true }) query: any;`); expect(tree.readContent('/index.ts')) - .toContain(`@${queryType}('test', { static: false }) query2: any;`); + .toContain(`@${queryType}('test', { static: true }) query2: any;`); + }); + + it('should detect queries used in parenthesized new expressions', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + @${queryType}('test') query: any; + + ngOnInit() { + new ((A))(this); + } + } + + export class A { + constructor(ctx: MyComp) { + ctx.query.test(); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); }); it('should detect queries in lifecycle hook with string literal name', () => { @@ -520,5 +556,159 @@ describe('static-queries migration', () => { expect(tree.readContent('/src/index.ts')) .toContain(`@${queryType}('test', { static: true }) query: any;`); }); + + it('should not mark queries used in promises as static', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + private @${queryType}('test') query: any; + private @${queryType}('test') query2: any; + + ngOnInit() { + const a = Promise.resolve(); + + Promise.resolve().then(() => { + this.query.doSomething(); + }); + + Promise.reject().catch(() => { + this.query.doSomething(); + }); + + a.then(() => {}).then(() => { + this.query.doSomething(); + }); + + Promise.resolve().then(this.createPromiseCb()); + } + + createPromiseCb() { + this.query2.doSomething(); + return () => { /* empty callback */} + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: false }) query: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query2: any;`); + }); + + it('should not mark queries used in setTimeout as static', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + private @${queryType}('test') query: any; + private @${queryType}('test') query2: any; + private @${queryType}('test') query3: any; + + ngOnInit() { + setTimeout(function() { + this.query.doSomething(); + }); + + setTimeout(createCallback(this)); + } + } + + function createCallback(instance: MyComp) { + instance.query2.doSomething(); + return () => instance.query3.doSomething(); + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: false }) query: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query2: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: false }) query3: any;`); + }); + + it('should not mark queries used in "addEventListener" as static', () => { + writeFile('/index.ts', ` + import {Component, ElementRef, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + private @${queryType}('test') query: any; + + constructor(private elementRef: ElementRef) {} + + ngOnInit() { + this.elementRef.addEventListener(() => { + this.query.classList.add('test'); + }); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: false }) query: any;`); + }); + + it('should not mark queries used in "requestAnimationFrame" as static', () => { + writeFile('/index.ts', ` + import {Component, ElementRef, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + private @${queryType}('test') query: any; + + constructor(private elementRef: ElementRef) {} + + ngOnInit() { + requestAnimationFrame(() => { + this.query.classList.add('test'); + }); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: false }) query: any;`); + }); + + it('should mark queries used in immediately-invoked function expression as static', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + private @${queryType}('test') query: any; + private @${queryType}('test') query2: any; + + ngOnInit() { + (() => { + this.query.usedStatically(); + })(); + + (function(ctx) { + ctx.query2.useStatically(); + })(this); + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query2: any;`); + }); } }); From fca1724ebf3d159b1ff6f733ed9583c7ff886e01 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Sat, 9 Mar 2019 15:51:33 +0100 Subject: [PATCH 0315/1073] refactor(core): static-query schematic incorrectly handles multiple tsconfigs (#29133) Currently when the static-query runs for a project with multiple TypeScript configuration files (e.g. a usual CLI project), the migration incorrectly applies the code transformation multiple times. This is because the migration is currently based on the source file contents in the file system, while the actual source file contents could have already changed in the devkit schematic tree. PR Close #29133 --- .../migrations/static-queries/migration.ts | 10 ++++++++ .../test/static_queries_migration_spec.ts | 25 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/packages/core/schematics/migrations/static-queries/migration.ts b/packages/core/schematics/migrations/static-queries/migration.ts index d54a08b784..57b7822119 100644 --- a/packages/core/schematics/migrations/static-queries/migration.ts +++ b/packages/core/schematics/migrations/static-queries/migration.ts @@ -25,6 +25,16 @@ import {parseTsconfigFile} from './typescript/tsconfig'; export function runStaticQueryMigration(tree: Tree, tsconfigPath: string, basePath: string) { const parsed = parseTsconfigFile(tsconfigPath, dirname(tsconfigPath)); const host = ts.createCompilerHost(parsed.options, true); + + // We need to overwrite the host "readFile" method, as we want the TypeScript + // program to be based on the file contents in the virtual file tree. Otherwise + // if we run the migration for multiple tsconfig files which have intersecting + // source files, it can end up updating query definitions multiple times. + host.readFile = fileName => { + const buffer = tree.read(relative(basePath, fileName)); + return buffer ? buffer.toString() : undefined; + }; + const program = ts.createProgram(parsed.fileNames, parsed.options, host); const typeChecker = program.getTypeChecker(); const queryVisitor = new NgQueryResolveVisitor(typeChecker); diff --git a/packages/core/schematics/test/static_queries_migration_spec.ts b/packages/core/schematics/test/static_queries_migration_spec.ts index 8bd207ceed..dc23eae3b0 100644 --- a/packages/core/schematics/test/static_queries_migration_spec.ts +++ b/packages/core/schematics/test/static_queries_migration_spec.ts @@ -710,5 +710,30 @@ describe('static-queries migration', () => { expect(tree.readContent('/index.ts')) .toContain(`@${queryType}('test', { static: true }) query2: any;`); }); + + it('should properly handle multiple tsconfig files', () => { + writeFile('/src/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + @Component({template: ''}) + export class MyComp { + private @${queryType}('test') query: any; + } + `); + + writeFile('/src/tsconfig.json', JSON.stringify({ + compilerOptions: { + lib: ['es2015'], + } + })); + + // The migration runs for "/tsconfig.json" and "/src/tsconfig.json" which both + // contain the "src/index.ts" file. This test ensures that we don't incorrectly + // apply the code transformation multiple times with outdated offsets. + runMigration(); + + expect(tree.readContent('/src/index.ts')) + .toContain(`@${queryType}('test', { static: false }) query: any;`); + }); } }); From 360730ce594bb840618e3047a97922dee3faa042 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Sat, 9 Mar 2019 16:10:50 +0100 Subject: [PATCH 0316/1073] refactor(core): static-query migration does not detect external call expressions. (#29133) Currently the static-query migration does not properly handle functions which are declared externally. This is because we don't resolve the symbol of the call-expression through its type. Currently we just determine the symbol of the call-expression through the given call expression node, which doesn't necessarily refer to the *value declaration* of the call expression. e.g. the symbol refers to the import declaration which imports the external function. This means that we currently can't check the external function as we couldn't find the actual value declaration. We can fix this by resolving the type of the call expression and using the type in order to retrieve the symbol containing the *value declaration* PR Close #29133 --- .../angular/declaration_usage_visitor.ts | 3 +- .../test/static_queries_migration_spec.ts | 29 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts b/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts index 1a5a3732a6..62972e61fa 100644 --- a/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts +++ b/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts @@ -35,7 +35,8 @@ export class DeclarationUsageVisitor { return; } - const callExprSymbol = this.typeChecker.getSymbolAtLocation(node); + const callExprType = this.typeChecker.getTypeAtLocation(node); + const callExprSymbol = callExprType.getSymbol(); if (!callExprSymbol || !callExprSymbol.valueDeclaration || !isFunctionLikeDeclaration(callExprSymbol.valueDeclaration)) { diff --git a/packages/core/schematics/test/static_queries_migration_spec.ts b/packages/core/schematics/test/static_queries_migration_spec.ts index dc23eae3b0..849ebae5fe 100644 --- a/packages/core/schematics/test/static_queries_migration_spec.ts +++ b/packages/core/schematics/test/static_queries_migration_spec.ts @@ -711,6 +711,35 @@ describe('static-queries migration', () => { .toContain(`@${queryType}('test', { static: true }) query2: any;`); }); + it('should detect static queries used in external function-like declaration', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + import {externalFn} from './external'; + + @Component({template: ''}) + export class MyComp { + private @${queryType}('test') query: any; + + ngOnInit() { + externalFn(this); + } + } + `); + + writeFile('/external.ts', ` + import {MyComp} from './index'; + + export function externalFn(ctx: MyComp) { + ctx.query.usedStatically(); + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + it('should properly handle multiple tsconfig files', () => { writeFile('/src/index.ts', ` import {Component, ${queryType}} from '@angular/core'; From c5daaa91cf470879fcf90c71aab7cd4a30e882f0 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Sat, 9 Mar 2019 16:58:26 +0100 Subject: [PATCH 0317/1073] refactor(core): static-query schematic should not run multiple times (#29133) With 6215799, we introduced a schematic for the new static-query timing. Currently when someone runs the update schematic manually within his CLI project (the schematic does not run automatically yet), he might have noticed that the migration is executed for the same `tsconfig` file multiple times. This can happen because the `getProjectTsConfigPaths` function can incorrectly return the same tsconfig multiple times. The paths are not properly deduped as we don't normalize the determined project tsconfig paths PR Close #29133 --- .../test/project_tsconfig_paths_spec.ts | 15 ++++++++++++--- packages/core/schematics/utils/BUILD.bazel | 5 ++++- .../schematics/utils/project_tsconfig_paths.ts | 11 ++++++----- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/packages/core/schematics/test/project_tsconfig_paths_spec.ts b/packages/core/schematics/test/project_tsconfig_paths_spec.ts index b26137eb37..31cc793ae7 100644 --- a/packages/core/schematics/test/project_tsconfig_paths_spec.ts +++ b/packages/core/schematics/test/project_tsconfig_paths_spec.ts @@ -22,7 +22,7 @@ describe('project tsconfig paths', () => { {my_name: {architect: {build: {options: {tsConfig: './my-custom-config.json'}}}}} })); - expect(getProjectTsConfigPaths(testTree)).toEqual(['./my-custom-config.json']); + expect(getProjectTsConfigPaths(testTree)).toEqual(['my-custom-config.json']); }); it('should detect test tsconfig path inside of .angular.json file', () => { @@ -32,7 +32,7 @@ describe('project tsconfig paths', () => { {with_tests: {architect: {test: {options: {tsConfig: './my-test-config.json'}}}}} })); - expect(getProjectTsConfigPaths(testTree)).toEqual(['./my-test-config.json']); + expect(getProjectTsConfigPaths(testTree)).toEqual(['my-test-config.json']); }); it('should detect common tsconfigs if no workspace config could be found', () => { @@ -41,7 +41,16 @@ describe('project tsconfig paths', () => { testTree.create('/src/tsconfig.app.json', ''); expect(getProjectTsConfigPaths(testTree)).toEqual([ - './tsconfig.json', './src/tsconfig.json', './src/tsconfig.app.json' + 'tsconfig.json', 'src/tsconfig.json', 'src/tsconfig.app.json' ]); }); + + it('should not return duplicate tsconfig files', () => { + testTree.create('/tsconfig.json', ''); + testTree.create('/.angular.json', JSON.stringify({ + projects: {app: {architect: {test: {options: {tsConfig: 'tsconfig.json'}}}}} + })); + + expect(getProjectTsConfigPaths(testTree)).toEqual(['tsconfig.json']); + }); }); diff --git a/packages/core/schematics/utils/BUILD.bazel b/packages/core/schematics/utils/BUILD.bazel index cffc353f4d..df0004600e 100644 --- a/packages/core/schematics/utils/BUILD.bazel +++ b/packages/core/schematics/utils/BUILD.bazel @@ -8,5 +8,8 @@ ts_library( ), tsconfig = "//packages/core/schematics:tsconfig.json", visibility = ["//packages/core/schematics:__subpackages__"], - deps = ["@npm//@angular-devkit/schematics"], + deps = [ + "@npm//@angular-devkit/core", + "@npm//@angular-devkit/schematics", + ], ) diff --git a/packages/core/schematics/utils/project_tsconfig_paths.ts b/packages/core/schematics/utils/project_tsconfig_paths.ts index 4623f012af..a6ef3219c7 100644 --- a/packages/core/schematics/utils/project_tsconfig_paths.ts +++ b/packages/core/schematics/utils/project_tsconfig_paths.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {normalize} from '@angular-devkit/core'; import {Tree} from '@angular-devkit/schematics'; /** Name of the default Angular CLI workspace configuration files. */ @@ -18,9 +19,9 @@ const defaultWorkspaceConfigPaths = ['/angular.json', '/.angular.json']; export function getProjectTsConfigPaths(tree: Tree): string[] { // Start with some tsconfig paths that are generally used within CLI projects. const tsconfigPaths = new Set([ - './tsconfig.json', - './src/tsconfig.json', - './src/tsconfig.app.json', + 'tsconfig.json', + 'src/tsconfig.json', + 'src/tsconfig.app.json', ]); // Add any tsconfig directly referenced in a build or test task of the angular.json workspace. @@ -32,13 +33,13 @@ export function getProjectTsConfigPaths(tree: Tree): string[] { ['build', 'test'].forEach(targetName => { if (project.targets && project.targets[targetName] && project.targets[targetName].options && project.targets[targetName].options.tsConfig) { - tsconfigPaths.add(project.targets[targetName].options.tsConfig); + tsconfigPaths.add(normalize(project.targets[targetName].options.tsConfig)); } if (project.architect && project.architect[targetName] && project.architect[targetName].options && project.architect[targetName].options.tsConfig) { - tsconfigPaths.add(project.architect[targetName].options.tsConfig); + tsconfigPaths.add(normalize(project.architect[targetName].options.tsConfig)); } }); } From b7c17ff207d2c7aa2db21dd6c1a6ee8de4571580 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 12 Mar 2019 19:44:03 +0100 Subject: [PATCH 0318/1073] ci: run legacy saucelabs for every build (#29255) Recently we moved the Saucelabs job into a cronjob in order to avoid heavy flakiness that we experienced due to a Saucelabs connect bug that has been supposedly fixed by the Saucelabs team (no new version is released yet though). Our initial assumption was that we very rarely hit specific browser failures and can therefore move the Saucelabs tests into a cronjob, but after some days of having the cronjob, we realized that we actually hit browser-specific failures quite often and that we should run the tests for every PR (like before) PR Close #29255 --- .circleci/config.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index e17e7dc4c2..804806ca3a 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -209,7 +209,7 @@ jobs: path: dist/bin/packages/core/test/bundling/todo/bundle.min.js.br destination: core/todo/bundle.br - test_saucelabs: + test_saucelabs_bazel: <<: *job_defaults # 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 @@ -587,6 +587,9 @@ workflows: - test_aio: requires: - setup + - legacy-unit-tests-saucelabs: + requires: + - setup - deploy_aio: requires: - test_aio @@ -640,6 +643,7 @@ workflows: # since the publishing script expects the legacy outputs layout. - build-npm-packages - build-ivy-npm-packages + - legacy-unit-tests-saucelabs - legacy-misc-tests - material-unit-tests: requires: @@ -648,14 +652,9 @@ workflows: saucelabs_tests: jobs: - setup - - test_saucelabs: + - test_saucelabs_bazel: requires: - setup - - legacy-unit-tests-saucelabs: - # Don't open up multiple saucelabs tunnels at the same - # time to minimize flakes - requires: - - test_saucelabs triggers: - schedule: # Runs the Saucelabs legacy tests every hour. We still want to run Saucelabs From 3f32c0e6747cf69434d8b60122e250e4aed2b672 Mon Sep 17 00:00:00 2001 From: Marc Laval Date: Tue, 12 Mar 2019 17:05:46 +0100 Subject: [PATCH 0319/1073] test(ivy): diagnose root causes of failures in CdkTable and MatTable (#29253) PR Close #29253 --- .../angular_material_test_blocklist.js | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index d73947c1ed..c7b99f6483 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -19,7 +19,7 @@ window.testBlocklist = { "CdkTable should be able to render multiple header and footer rows": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", - "notes": "Attempting to access content children before view is initialized" + "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, "CdkTable should render correctly when using native HTML tags": { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", @@ -51,15 +51,15 @@ window.testBlocklist = { }, "CdkTable with trackBy should change row implicit data even when trackBy finds no changes": { "error": "Error: Expected 'a_1 b_1' to be 'a_2 b_2'.", - "notes": "FW-842: View engine dirty-checks projected views when the declaration place is checked" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (CdkTable, CdkHeaderRow, CdkFooterRow and CdkRow are OnPush)" }, "CdkTable should be able to apply classes to rows based on their context": { "error": "Error: Expected false to be true.", - "notes": "FW-842: View engine dirty-checks projected views when the declaration place is checked" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (CdkTable, CdkHeaderRow, CdkFooterRow and CdkRow are OnPush)" }, "CdkTable should be able to apply classes to cells based on their row context": { "error": "Error: Expected false to be true.", - "notes": "FW-842: View engine dirty-checks projected views when the declaration place is checked" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (CdkTable, CdkHeaderRow, CdkFooterRow and CdkRow are OnPush)" }, "CdkDrag in a drop container should be able to customize the preview element": { "error": "Error: Expected cdk-drag cdk-drag-preview to contain 'custom-preview'.", @@ -253,33 +253,21 @@ window.testBlocklist = { "error": "Error: Missing definitions for header, footer, and row; cannot determine which columns should be rendered.", "notes": "FW-1141: Direct ContentChildren not found for tags without a " }, - "MatTable with MatTableDataSource and sort/pagination/filter should be able to filter the table contents": { - "error": "TypeError: Cannot read property 'length' of undefined", - "notes": "Unknown" - }, - "MatTable with MatTableDataSource and sort/pagination/filter should be able to sort the table contents": { - "error": "Error: Failed: Expected cell contents to be a_3 but was a_1", - "notes": "Unknown" - }, "MatTable with MatTableDataSource and sort/pagination/filter should by default correctly sort an empty string": { "error": "Error: Failed: Expected cell contents to be but was a_1", - "notes": "Unknown" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (MatTable, MatHeaderRow, MatFooterRow and MatRow are OnPush)" }, "MatTable with MatTableDataSource and sort/pagination/filter should by default correctly sort undefined values": { "error": "Error: Failed: Expected cell contents to be but was a_1", - "notes": "Unknown" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (MatTable, MatHeaderRow, MatFooterRow and MatRow are OnPush)" }, "MatTable with MatTableDataSource and sort/pagination/filter should sort zero correctly": { "error": "Error: Failed: Expected cell contents to be -1 but was a_1", - "notes": "Unknown" - }, - "MatTable with MatTableDataSource and sort/pagination/filter should be able to page the table contents": { - "error": "Error: Failed: Expected 7 total rows but got 105", - "notes": "Unknown" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (MatTable, MatHeaderRow, MatFooterRow and MatRow are OnPush)" }, "MatTable with MatTableDataSource and sort/pagination/filter should sort strings with numbers larger than MAX_SAFE_INTEGER correctly": { "error": "Error: Failed: Expected cell contents to be 9563256840123535 but was a_1", - "notes": "Unknown" + "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (MatTable, MatHeaderRow, MatFooterRow and MatRow are OnPush)" } }; // clang-format on From fa8669ac0072b180dd18775e8f4963456292336a Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 12 Mar 2019 16:28:19 +0100 Subject: [PATCH 0320/1073] fix(ivy): properly match directives on ng-template with * syntax (#29251) PR Close #29251 --- .../core/src/render3/node_selector_matcher.ts | 19 ++++---- .../core/test/acceptance/directive_spec.ts | 47 +++++++++++++++++++ 2 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 packages/core/test/acceptance/directive_spec.ts diff --git a/packages/core/src/render3/node_selector_matcher.ts b/packages/core/src/render3/node_selector_matcher.ts index d4af2755cf..3806ce0418 100644 --- a/packages/core/src/render3/node_selector_matcher.ts +++ b/packages/core/src/render3/node_selector_matcher.ts @@ -37,18 +37,19 @@ function isCssClassMatching(nodeClassAttrVal: string, cssClassToMatch: string): * Function that checks whether a given tNode matches tag-based selector and has a valid type. * * Matching can be performed in 2 modes: projection mode (when we project nodes) and regular - * directive matching mode. In "projection" mode, we do not need to check types, so if tag name - * matches selector, we declare a match. In "directive matching" mode, we also check whether tNode - * is of expected type: - * - whether tNode has either Element or ElementContainer type - * - or if we want to match "ng-template" tag, we check for Container type + * directive matching mode: + * - in the "directive matching" mode we do _not_ take TContainer's tagName into account if it is + * different from NG_TEMPLATE_SELECTOR (value different from NG_TEMPLATE_SELECTOR indicates that a + * tag name was extracted from * syntax so we would match the same directive twice); + * - in the "projection" mode, we use a tag name potentially extracted from the * syntax processing + * (applicable to TNodeType.Container only). */ function hasTagAndTypeMatch( tNode: TNode, currentSelector: string, isProjectionMode: boolean): boolean { - return currentSelector === tNode.tagName && - (isProjectionMode || - (tNode.type === TNodeType.Element || tNode.type === TNodeType.ElementContainer) || - (tNode.type === TNodeType.Container && currentSelector === NG_TEMPLATE_SELECTOR)); + const tagNameToCompare = tNode.type === TNodeType.Container && !isProjectionMode ? + NG_TEMPLATE_SELECTOR : + tNode.tagName; + return currentSelector === tagNameToCompare; } /** diff --git a/packages/core/test/acceptance/directive_spec.ts b/packages/core/test/acceptance/directive_spec.ts new file mode 100644 index 0000000000..65defd2b80 --- /dev/null +++ b/packages/core/test/acceptance/directive_spec.ts @@ -0,0 +1,47 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Component, Directive} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; +import {By} from '@angular/platform-browser'; + +describe('directives', () => { + + describe('matching', () => { + + @Directive({selector: 'ng-template[test]'}) + class TestDirective { + } + + @Component({selector: 'test-cmpt', template: ''}) + class TestComponent { + } + + it('should match directives on ng-template', () => { + TestBed.configureTestingModule({declarations: [TestComponent, TestDirective]}); + TestBed.overrideTemplate(TestComponent, ``); + + const fixture = TestBed.createComponent(TestComponent); + const nodesWithDirective = fixture.debugElement.queryAllNodes(By.directive(TestDirective)); + + expect(nodesWithDirective.length).toBe(1); + }); + + it('should match directives on ng-template created by * syntax', () => { + TestBed.configureTestingModule({declarations: [TestComponent, TestDirective]}); + TestBed.overrideTemplate(TestComponent, `
`); + + const fixture = TestBed.createComponent(TestComponent); + const nodesWithDirective = fixture.debugElement.queryAllNodes(By.directive(TestDirective)); + + expect(nodesWithDirective.length).toBe(1); + }); + + }); + +}); \ No newline at end of file From 9d4b7d7d4170a122564a78a4b1dbf1f07c39cf10 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Tue, 12 Mar 2019 16:49:36 +0100 Subject: [PATCH 0321/1073] test(ivy): enable passing Material tests (#29251) PR Close #29251 --- .../angular_material_test_blocklist.js | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/tools/material-ci/angular_material_test_blocklist.js b/tools/material-ci/angular_material_test_blocklist.js index c7b99f6483..02be449192 100644 --- a/tools/material-ci/angular_material_test_blocklist.js +++ b/tools/material-ci/angular_material_test_blocklist.js @@ -61,30 +61,6 @@ window.testBlocklist = { "error": "Error: Expected false to be true.", "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (CdkTable, CdkHeaderRow, CdkFooterRow and CdkRow are OnPush)" }, - "CdkDrag in a drop container should be able to customize the preview element": { - "error": "Error: Expected cdk-drag cdk-drag-preview to contain 'custom-preview'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should position custom previews next to the pointer": { - "error": "Error: Expected 'translate3d(8px, 33px, 0px)' to be 'translate3d(50px, 50px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should lock position inside a drop container along the x axis": { - "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should lock position inside a drop container along the y axis": { - "error": "Error: Expected 'translate3d(8px, 83px, 0px)' to be 'translate3d(50px, 100px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should inherit the position locking from the drop container": { - "error": "Error: Expected 'translate3d(58px, 33px, 0px)' to be 'translate3d(100px, 50px, 0px)'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, - "CdkDrag in a drop container should be able to customize the placeholder": { - "error": "Error: Expected cdk-drag cdk-drag-placeholder to contain 'custom-placeholder'.", - "notes": "FW-1134: Queries don't match structural directives with ng-template in selector" - }, "CdkTree flat tree should initialize should be able to use units different from px for the indentation": { "error": "Error: Failed: Expected node level to be 15rem but was 28px", "notes": "Breaking change: Change detection follows insertion tree only, not declaration tree (CdkTree is OnPush)" From fe76494759aa7bdad9d5bd6ccc7ac1d351f7da52 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Mon, 11 Mar 2019 17:58:37 -0700 Subject: [PATCH 0322/1073] fix(ivy): use default selector for Components if selector is empty (#29239) Prior to this change default selector for Components was not applied in case selector is missing or defined as an empty string. This update aligns this behavior between Ivy and VE: now default selector is used for Components when it's needed. Directives with empty selector are not allowed and trigger a compile-time error in both Ivy and VE. PR Close #29239 --- .../src/ngtsc/annotations/src/directive.ts | 3 +- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 69 +++++++++++++++++++ packages/core/test/linker/integration_spec.ts | 14 ++++ 3 files changed, 85 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts b/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts index 71099dfba7..c53a39e492 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts @@ -172,7 +172,8 @@ export function extractDirectiveMetadata( throw new FatalDiagnosticError( ErrorCode.VALUE_HAS_WRONG_TYPE, expr, `selector must be a string`); } - selector = resolved; + // use default selector in case selector is an empty string + selector = resolved === '' ? defaultSelector : resolved; } if (!selector) { throw new Error(`Directive ${clazz.name !.text} has no selector, please add it!`); diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 9e8be5578e..35924de0ab 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -738,6 +738,75 @@ describe('ngtsc behavioral tests', () => { 'i0.ɵNgModuleDefWithMeta'); }); + describe('empty and missing selectors', () => { + it('should use default selector for Components when no selector present', () => { + env.tsconfig({}); + env.write('test.ts', ` + import {Component} from '@angular/core'; + + @Component({ + template: '...', + }) + export class TestCmp {} + `); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + expect(jsContents).toContain('selectors: [["ng-component"]]'); + }); + + it('should use default selector for Components with empty string selector', () => { + env.tsconfig({}); + env.write('test.ts', ` + import {Component} from '@angular/core'; + + @Component({ + selector: '', + template: '...', + }) + export class TestCmp {} + `); + + env.driveMain(); + + const jsContents = env.getContents('test.js'); + expect(jsContents).toContain('selectors: [["ng-component"]]'); + }); + + it('should throw if selector is missing in Directive decorator params', () => { + env.tsconfig({}); + env.write('test.ts', ` + import {Directive} from '@angular/core'; + + @Directive({ + inputs: ['a', 'b'] + }) + export class TestDir {} + `); + + const errors = env.driveDiagnostics(); + expect(trim(errors[0].messageText as string)) + .toContain('Directive TestDir has no selector, please add it!'); + }); + + it('should throw if Directive selector is an empty string', () => { + env.tsconfig({}); + env.write('test.ts', ` + import {Directive} from '@angular/core'; + + @Directive({ + selector: '' + }) + export class TestDir {} + `); + + const errors = env.driveDiagnostics(); + expect(trim(errors[0].messageText as string)) + .toContain('Directive TestDir has no selector, please add it!'); + }); + }); + describe('multiple decorators on classes', () => { it('should compile @Injectable on Components, Directives, Pipes, and Modules', () => { env.tsconfig(); diff --git a/packages/core/test/linker/integration_spec.ts b/packages/core/test/linker/integration_spec.ts index b705cd2af8..992a013568 100644 --- a/packages/core/test/linker/integration_spec.ts +++ b/packages/core/test/linker/integration_spec.ts @@ -1426,6 +1426,20 @@ function declareTests(config?: {useJit: boolean}) { .toThrowError(`Directive ${stringify(SomeDirective)} has no selector, please add it!`); }); + it('should throw when using directives with empty string selector', () => { + @Directive({selector: ''}) + class SomeDirective { + } + + @Component({selector: 'comp', template: ''}) + class SomeComponent { + } + + TestBed.configureTestingModule({declarations: [MyComp, SomeDirective, SomeComponent]}); + expect(() => TestBed.createComponent(MyComp)) + .toThrowError(`Directive ${stringify(SomeDirective)} has no selector, please add it!`); + }); + it('should use a default element name for components without selectors', () => { let noSelectorComponentFactory: ComponentFactory = undefined !; From ac0553e802cae9464d9e37f06021538c65d39f67 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Tue, 12 Mar 2019 16:54:32 -0700 Subject: [PATCH 0323/1073] docs: release notes for the v7.2.9 release --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a390d5860f..b6db1e38b3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,9 @@ + +## [7.2.9](https://github.com/angular/angular/compare/7.2.8...7.2.9) (2019-03-12) + +This release contains various API docs improvements. + + # [8.0.0-beta.7](https://github.com/angular/angular/compare/8.0.0-beta.6...8.0.0-beta.7) (2019-03-06) From ec01594e975c2d05409afa65dd77e2696d671271 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Tue, 12 Mar 2019 17:00:13 -0700 Subject: [PATCH 0324/1073] release: cut the v8.0.0-beta.8 release --- CHANGELOG.md | 20 ++++++++++++++++++++ package.json | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6db1e38b3..14ec650bcb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,23 @@ + +# [8.0.0-beta.8](https://github.com/angular/angular/compare/8.0.0-beta.7...8.0.0-beta.8) (2019-03-12) + + +### Bug Fixes + +* **bazel:** add missing binary path for api-extractor ([#29202](https://github.com/angular/angular/issues/29202)) ([df354d1](https://github.com/angular/angular/commit/df354d1)) +* **bazel:** ng build should produce prod bundle ([#29136](https://github.com/angular/angular/issues/29136)) ([14ce8a9](https://github.com/angular/angular/commit/14ce8a9)) +* **compiler:** ensure template is updated if an output is transformed ([#29041](https://github.com/angular/angular/issues/29041)) ([c7e4931](https://github.com/angular/angular/commit/c7e4931)) + + +### Features + +* **bazel:** Eject Bazel ([#29167](https://github.com/angular/angular/issues/29167)) ([36a1550](https://github.com/angular/angular/commit/36a1550)) +* **bazel:** Hide Bazel files in Bazel builder ([#29110](https://github.com/angular/angular/issues/29110)) ([7060d90](https://github.com/angular/angular/commit/7060d90)) +* **forms:** clear (remove all) components from a FormArray ([#28918](https://github.com/angular/angular/issues/28918)) ([a68b1a1](https://github.com/angular/angular/commit/a68b1a1)), closes [#18531](https://github.com/angular/angular/issues/18531) +* **platform-server:** wait on returned BEFORE_APP_SERIALIZED promises ([#29120](https://github.com/angular/angular/issues/29120)) ([7102ea8](https://github.com/angular/angular/commit/7102ea8)) + + + ## [7.2.9](https://github.com/angular/angular/compare/7.2.8...7.2.9) (2019-03-12) diff --git a/package.json b/package.json index a28da5f656..2b6d15c1ca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "8.0.0-beta.7", + "version": "8.0.0-beta.8", "private": true, "branchPattern": "2.0.*", "description": "Angular - a web framework for modern web apps", From 940fbf796cd4434350fa38aa64b30184c4e74ff8 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Fri, 8 Mar 2019 22:19:36 +0100 Subject: [PATCH 0325/1073] fix(ivy): unable to inject class and style attributes (#29192) Fixes not being able to inject the `class` and `style` attributes via the `Attribute` decorator. This PR resolves FW-1139. PR Close #29192 --- packages/core/src/render3/di.ts | 39 +++++++++++++++++++----- packages/core/test/acceptance/di_spec.ts | 29 +++++++++++++++++- 2 files changed, 60 insertions(+), 8 deletions(-) diff --git a/packages/core/src/render3/di.ts b/packages/core/src/render3/di.ts index 639ebe8b20..dcfb0669cf 100644 --- a/packages/core/src/render3/di.ts +++ b/packages/core/src/render3/di.ts @@ -17,7 +17,7 @@ import {getComponentDef, getDirectiveDef, getPipeDef} from './definition'; import {NG_ELEMENT_ID} from './fields'; import {DirectiveDef} from './interfaces/definition'; import {NO_PARENT_INJECTOR, NodeInjectorFactory, PARENT_INJECTOR, RelativeInjectorLocation, RelativeInjectorLocationFlags, TNODE, isFactory} from './interfaces/injector'; -import {TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType} from './interfaces/node'; +import {AttributeMarker, TContainerNode, TElementContainerNode, TElementNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType} from './interfaces/node'; import {DECLARATION_VIEW, INJECTOR, LView, TData, TVIEW, TView, T_HOST} from './interfaces/view'; import {assertNodeOfPossibleTypes} from './node_assert'; import {getLView, getPreviousOrParentTNode, setTNodeAndViewData} from './state'; @@ -271,14 +271,39 @@ export function injectAttributeImpl(tNode: TNode, attrNameToInject: string): str ngDevMode && assertDefined(tNode, 'expecting tNode'); const attrs = tNode.attrs; if (attrs) { - for (let i = 0; i < attrs.length; i = i + 2) { - const attrName = attrs[i]; + const attrsLength = attrs.length; + let i = 0; + while (i < attrsLength) { + const value = attrs[i]; + // If we hit a `Bindings` or `Template` marker then we are done. - if (isNameOnlyAttributeMarker(attrName)) break; - // TODO(FW-1137): Skip namespaced attributes - // TODO(FW-1139): supports classes/styles in @Attribute injection - if (attrName == attrNameToInject) { + if (isNameOnlyAttributeMarker(value)) break; + + if (typeof value === 'number') { + // Skip to the first value of the marked attribute. + i++; + if (value === AttributeMarker.Classes && attrNameToInject === 'class') { + let accumulatedClasses = ''; + while (i < attrsLength && typeof attrs[i] === 'string') { + accumulatedClasses += ' ' + attrs[i++]; + } + return accumulatedClasses.trim(); + } else if (value === AttributeMarker.Styles && attrNameToInject === 'style') { + let accumulatedStyles = ''; + while (i < attrsLength && typeof attrs[i] === 'string') { + accumulatedStyles += `${attrs[i++]}: ${attrs[i++]}; `; + } + return accumulatedStyles.trim(); + } else { + while (i < attrsLength && typeof attrs[i] === 'string') { + i++; + } + } + } else if (value === attrNameToInject) { + // TODO(FW-1137): Skip namespaced attributes return attrs[i + 1] as string; + } else { + i = i + 2; } } } diff --git a/packages/core/test/acceptance/di_spec.ts b/packages/core/test/acceptance/di_spec.ts index 108e598b13..b7bd4b134e 100644 --- a/packages/core/test/acceptance/di_spec.ts +++ b/packages/core/test/acceptance/di_spec.ts @@ -7,7 +7,7 @@ */ import {CommonModule} from '@angular/common'; -import {ChangeDetectorRef, Component, Directive, Inject, LOCALE_ID, Optional, Pipe, PipeTransform, SkipSelf, ViewChild} from '@angular/core'; +import {Attribute, ChangeDetectorRef, Component, Directive, Inject, LOCALE_ID, Optional, Pipe, PipeTransform, SkipSelf, ViewChild} from '@angular/core'; import {ViewRef} from '@angular/core/src/render3/view_ref'; import {TestBed} from '@angular/core/testing'; @@ -130,4 +130,31 @@ describe('di', () => { fixture.detectChanges(); expect(fixture.componentInstance.myDir.localeId).toBe('en-GB'); }); + + it('should be able to inject different kinds of attributes', () => { + @Directive({selector: '[dir]'}) + class MyDir { + constructor( + @Attribute('class') public className: string, + @Attribute('style') public inlineStyles: string, + @Attribute('other-attr') public otherAttr: string) {} + } + @Component({ + template: + '
' + }) + class MyComp { + @ViewChild(MyDir) directiveInstance !: MyDir; + } + + TestBed.configureTestingModule({declarations: [MyDir, MyComp, MyComp]}); + const fixture = TestBed.createComponent(MyComp); + fixture.detectChanges(); + + const directive = fixture.componentInstance.directiveInstance; + + expect(directive.otherAttr).toBe('value'); + expect(directive.className).toBe('hello there'); + expect(directive.inlineStyles).toBe('margin: 1px; color: red;'); + }); }); From ccb70e1c641d38c410d0392c9071e5ee309ddc89 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Mon, 11 Mar 2019 16:54:07 -0700 Subject: [PATCH 0326/1073] fix(ivy): reuse default imports in type-to-value references (#29266) This fixes an issue with commit b6f6b117. In this commit, default imports processed in a type-to-value conversion were recorded as non-local imports with a '*' name, and the ImportManager generated a new default import for them. When transpiled to ES2015 modules, this resulted in the following correct code: import i3 from './module'; // somewhere in the file, a value reference of i3: {type: i3} However, when the AST with this synthetic import and reference was transpiled to non-ES2015 modules (for example, to commonjs) an issue appeared: var module_1 = require('./module'); {type: i3} TypeScript renames the imported identifier from i3 to module_1, but doesn't substitute later references to i3. This is because the import and reference are both synthetic, and never went through the TypeScript AST step of "binding" which associates the reference to its import. This association is important during emit when the identifiers might change. Synthetic (transformer-added) imports will never be bound properly. The only possible solution is to reuse the user's original import and the identifier from it, which will be properly downleveled. The issue with this approach (which prompted the fix in b6f6b117) is that if the import is only used in a type position, TypeScript will mark it for deletion in the generated JS, even though additional non-type usages are added in the transformer. This again would leave a dangling import. To work around this, it's necessary for the compiler to keep track of identifiers that it emits which came from default imports, and tell TS not to remove those imports during transpilation. A `DefaultImportTracker` class is implemented to perform this tracking. It implements a `DefaultImportRecorder` interface, which is used to record two significant pieces of information: * when a WrappedNodeExpr is generated which refers to a default imported value, the ts.Identifier is associated to the ts.ImportDeclaration via the recorder. * when that WrappedNodeExpr is later emitted as part of the statement / expression translators, the fact that the ts.Identifier was used is also recorded. Combined, this tracking gives the `DefaultImportTracker` enough information to implement another TS transformer, which can recognize default imports which were used in the output of the Ivy transform and can prevent them from being elided. This is done by creating a new ts.ImportDeclaration for the imports with the same ts.ImportClause. A test verifies that this works. PR Close #29266 --- .../ngcc/src/analysis/decoration_analyzer.ts | 16 +- .../src/ngcc/src/host/esm2015_host.ts | 5 +- .../src/ngcc/src/rendering/esm_renderer.ts | 13 +- .../src/ngcc/src/rendering/renderer.ts | 17 +- .../host/esm2015_host_import_helper_spec.ts | 3 +- .../src/ngcc/test/host/esm2015_host_spec.ts | 3 +- .../test/host/esm5_host_import_helper_spec.ts | 3 +- .../src/ngcc/test/host/esm5_host_spec.ts | 3 +- .../test/rendering/esm2015_renderer_spec.ts | 13 +- .../ngcc/test/rendering/esm5_renderer_spec.ts | 13 +- .../src/ngcc/test/rendering/renderer_spec.ts | 13 +- .../src/ngtsc/annotations/src/component.ts | 9 +- .../src/ngtsc/annotations/src/directive.ts | 17 +- .../src/ngtsc/annotations/src/injectable.ts | 21 +- .../src/ngtsc/annotations/src/metadata.ts | 14 +- .../src/ngtsc/annotations/src/ng_module.ts | 12 +- .../src/ngtsc/annotations/src/pipe.ts | 12 +- .../src/ngtsc/annotations/src/util.ts | 32 ++- .../ngtsc/annotations/test/component_spec.ts | 4 +- .../ngtsc/annotations/test/directive_spec.ts | 5 +- .../ngtsc/annotations/test/metadata_spec.ts | 7 +- .../ngtsc/annotations/test/ng_module_spec.ts | 5 +- .../compiler-cli/src/ngtsc/imports/index.ts | 1 + .../src/ngtsc/imports/src/default.ts | 188 ++++++++++++++++++ .../src/ngtsc/imports/test/BUILD.bazel | 26 +++ .../src/ngtsc/imports/test/default_spec.ts | 90 +++++++++ packages/compiler-cli/src/ngtsc/program.ts | 21 +- .../src/ngtsc/reflection/index.ts | 2 +- .../src/ngtsc/reflection/src/host.ts | 2 +- .../src/ngtsc/reflection/src/type_to_value.ts | 23 ++- .../src/ngtsc/reflection/test/ts_host_spec.ts | 7 +- .../src/ngtsc/testing/in_memory_typescript.ts | 4 + .../src/ngtsc/transform/src/transform.ts | 28 ++- .../src/ngtsc/transform/src/utils.ts | 13 +- .../src/ngtsc/translator/BUILD.bazel | 1 - .../src/ngtsc/translator/src/translator.ts | 65 +++--- .../src/ngtsc/typecheck/src/context.ts | 8 +- .../ngtsc/typecheck/src/type_check_block.ts | 4 +- .../compiler-cli/test/ngtsc/ngtsc_spec.ts | 18 +- 39 files changed, 535 insertions(+), 206 deletions(-) create mode 100644 packages/compiler-cli/src/ngtsc/imports/src/default.ts create mode 100644 packages/compiler-cli/src/ngtsc/imports/test/BUILD.bazel create mode 100644 packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts diff --git a/packages/compiler-cli/src/ngcc/src/analysis/decoration_analyzer.ts b/packages/compiler-cli/src/ngcc/src/analysis/decoration_analyzer.ts index 5d50f1d025..4d1c7ff90e 100644 --- a/packages/compiler-cli/src/ngcc/src/analysis/decoration_analyzer.ts +++ b/packages/compiler-cli/src/ngcc/src/analysis/decoration_analyzer.ts @@ -12,7 +12,7 @@ import * as ts from 'typescript'; import {BaseDefDecoratorHandler, ComponentDecoratorHandler, DirectiveDecoratorHandler, InjectableDecoratorHandler, NgModuleDecoratorHandler, PipeDecoratorHandler, ReferencesRegistry, ResourceLoader} from '../../../ngtsc/annotations'; import {CycleAnalyzer, ImportGraph} from '../../../ngtsc/cycles'; -import {AbsoluteModuleStrategy, LocalIdentifierStrategy, LogicalProjectStrategy, ModuleResolver, ReferenceEmitter} from '../../../ngtsc/imports'; +import {AbsoluteModuleStrategy, LocalIdentifierStrategy, LogicalProjectStrategy, ModuleResolver, NOOP_DEFAULT_IMPORT_RECORDER, ReferenceEmitter} from '../../../ngtsc/imports'; import {PartialEvaluator} from '../../../ngtsc/partial_evaluator'; import {AbsoluteFsPath, LogicalFileSystem} from '../../../ngtsc/path'; import {LocalModuleScopeRegistry, MetadataDtsModuleScopeResolver} from '../../../ngtsc/scope'; @@ -85,14 +85,18 @@ export class DecorationAnalyzer { new ComponentDecoratorHandler( this.reflectionHost, this.evaluator, this.scopeRegistry, this.isCore, this.resourceManager, this.rootDirs, /* defaultPreserveWhitespaces */ false, /* i18nUseExternalIds */ true, - this.moduleResolver, this.cycleAnalyzer, this.refEmitter), + this.moduleResolver, this.cycleAnalyzer, this.refEmitter, NOOP_DEFAULT_IMPORT_RECORDER), new DirectiveDecoratorHandler( - this.reflectionHost, this.evaluator, this.scopeRegistry, this.isCore), - new InjectableDecoratorHandler(this.reflectionHost, this.isCore, /* strictCtorDeps */ false), + this.reflectionHost, this.evaluator, this.scopeRegistry, NOOP_DEFAULT_IMPORT_RECORDER, + this.isCore), + new InjectableDecoratorHandler( + this.reflectionHost, NOOP_DEFAULT_IMPORT_RECORDER, this.isCore, /* strictCtorDeps */ false), new NgModuleDecoratorHandler( this.reflectionHost, this.evaluator, this.scopeRegistry, this.referencesRegistry, - this.isCore, /* routeAnalyzer */ null, this.refEmitter), - new PipeDecoratorHandler(this.reflectionHost, this.evaluator, this.scopeRegistry, this.isCore), + this.isCore, /* routeAnalyzer */ null, this.refEmitter, NOOP_DEFAULT_IMPORT_RECORDER), + new PipeDecoratorHandler( + this.reflectionHost, this.evaluator, this.scopeRegistry, NOOP_DEFAULT_IMPORT_RECORDER, + this.isCore), ]; constructor( diff --git a/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts b/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts index 9b387129b0..408064d9d9 100644 --- a/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts +++ b/packages/compiler-cli/src/ngcc/src/host/esm2015_host.ts @@ -901,8 +901,9 @@ export class Esm2015ReflectionHost extends TypeScriptReflectionHost implements N return { name: getNameText(nameNode), nameNode, - typeValueReference: - typeExpression !== null ? {local: true as true, expression: typeExpression} : null, + typeValueReference: typeExpression !== null ? + {local: true as true, expression: typeExpression, defaultImportStatement: null} : + null, typeNode: null, decorators }; }); diff --git a/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts b/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts index 7f8360ad93..b3736f38b6 100644 --- a/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts +++ b/packages/compiler-cli/src/ngcc/src/rendering/esm_renderer.ts @@ -25,17 +25,10 @@ export class EsmRenderer extends Renderer { /** * Add the imports at the top of the file */ - addImports(output: MagicString, imports: { - specifier: string; qualifier: string; isDefault: boolean - }[]): void { + addImports(output: MagicString, imports: {specifier: string; qualifier: string;}[]): void { // The imports get inserted at the very top of the file. - imports.forEach(i => { - if (!i.isDefault) { - output.appendLeft(0, `import * as ${i.qualifier} from '${i.specifier}';\n`); - } else { - output.appendLeft(0, `import ${i.qualifier} from '${i.specifier}';\n`); - } - }); + imports.forEach( + i => { output.appendLeft(0, `import * as ${i.qualifier} from '${i.specifier}';\n`); }); } addExports(output: MagicString, entryPointBasePath: string, exports: ExportInfo[]): void { diff --git a/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts b/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts index 70bd3fc70b..ec535adf26 100644 --- a/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts +++ b/packages/compiler-cli/src/ngcc/src/rendering/renderer.ts @@ -13,7 +13,7 @@ import {basename, dirname, relative, resolve} from 'canonical-path'; import {SourceMapConsumer, SourceMapGenerator, RawSourceMap} from 'source-map'; import * as ts from 'typescript'; -import {NoopImportRewriter, ImportRewriter, R3SymbolsImportRewriter} from '@angular/compiler-cli/src/ngtsc/imports'; +import {NoopImportRewriter, ImportRewriter, R3SymbolsImportRewriter, NOOP_DEFAULT_IMPORT_RECORDER} from '@angular/compiler-cli/src/ngtsc/imports'; import {CompileResult} from '@angular/compiler-cli/src/ngtsc/transform'; import {translateStatement, translateType, ImportManager} from '../../../ngtsc/translator'; import {NgccFlatImportRewriter} from './ngcc_import_rewriter'; @@ -245,9 +245,8 @@ export abstract class Renderer { protected abstract addConstants(output: MagicString, constants: string, file: ts.SourceFile): void; - protected abstract addImports( - output: MagicString, - imports: {specifier: string, qualifier: string, isDefault: boolean}[]): void; + protected abstract addImports(output: MagicString, imports: {specifier: string, + qualifier: string}[]): void; protected abstract addExports( output: MagicString, entryPointBasePath: string, exports: ExportInfo[]): void; protected abstract addDefinitions( @@ -464,7 +463,8 @@ export function mergeSourceMaps( export function renderConstantPool( sourceFile: ts.SourceFile, constantPool: ConstantPool, imports: ImportManager): string { const printer = ts.createPrinter(); - return constantPool.statements.map(stmt => translateStatement(stmt, imports)) + return constantPool.statements + .map(stmt => translateStatement(stmt, imports, NOOP_DEFAULT_IMPORT_RECORDER)) .map(stmt => printer.printNode(ts.EmitHint.Unspecified, stmt, sourceFile)) .join('\n'); } @@ -481,12 +481,13 @@ export function renderDefinitions( sourceFile: ts.SourceFile, compiledClass: CompiledClass, imports: ImportManager): string { const printer = ts.createPrinter(); const name = (compiledClass.declaration as ts.NamedDeclaration).name !; + const translate = (stmt: Statement) => + translateStatement(stmt, imports, NOOP_DEFAULT_IMPORT_RECORDER); const definitions = compiledClass.compilation .map( - c => c.statements.map(statement => translateStatement(statement, imports)) - .concat(translateStatement( - createAssignmentStatement(name, c.name, c.initializer), imports)) + c => c.statements.map(statement => translate(statement)) + .concat(translate(createAssignmentStatement(name, c.name, c.initializer))) .map( statement => printer.printNode(ts.EmitHint.Unspecified, statement, sourceFile)) diff --git a/packages/compiler-cli/src/ngcc/test/host/esm2015_host_import_helper_spec.ts b/packages/compiler-cli/src/ngcc/test/host/esm2015_host_import_helper_spec.ts index ee1bcba5ea..348d2d2efc 100644 --- a/packages/compiler-cli/src/ngcc/test/host/esm2015_host_import_helper_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/host/esm2015_host_import_helper_spec.ts @@ -302,7 +302,8 @@ describe('Fesm2015ReflectionHost [import helper style]', () => { const ctrDecorators = host.getConstructorParameters(classNode) !; const identifierOfViewContainerRef = (ctrDecorators[0].typeValueReference !as{ local: true, - expression: ts.Identifier + expression: ts.Identifier, + defaultImportStatement: null, }).expression; const expectedDeclarationNode = getDeclaration( diff --git a/packages/compiler-cli/src/ngcc/test/host/esm2015_host_spec.ts b/packages/compiler-cli/src/ngcc/test/host/esm2015_host_spec.ts index e595ec0582..850cde1841 100644 --- a/packages/compiler-cli/src/ngcc/test/host/esm2015_host_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/host/esm2015_host_spec.ts @@ -1295,7 +1295,8 @@ describe('Fesm2015ReflectionHost', () => { const ctrDecorators = host.getConstructorParameters(classNode) !; const identifierOfViewContainerRef = (ctrDecorators[0].typeValueReference !as{ local: true, - expression: ts.Identifier + expression: ts.Identifier, + defaultImportStatement: null, }).expression; const expectedDeclarationNode = getDeclaration( diff --git a/packages/compiler-cli/src/ngcc/test/host/esm5_host_import_helper_spec.ts b/packages/compiler-cli/src/ngcc/test/host/esm5_host_import_helper_spec.ts index 6c558b1e48..ede5edc814 100644 --- a/packages/compiler-cli/src/ngcc/test/host/esm5_host_import_helper_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/host/esm5_host_import_helper_spec.ts @@ -338,7 +338,8 @@ describe('Esm5ReflectionHost [import helper style]', () => { const ctrDecorators = host.getConstructorParameters(classNode) !; const identifierOfViewContainerRef = (ctrDecorators[0].typeValueReference !as{ local: true, - expression: ts.Identifier + expression: ts.Identifier, + defaultImportStatement: null, }).expression; const expectedDeclarationNode = getDeclaration( diff --git a/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts b/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts index 0f93aa57e8..6010821969 100644 --- a/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/host/esm5_host_spec.ts @@ -1276,7 +1276,8 @@ describe('Esm5ReflectionHost', () => { const ctrDecorators = host.getConstructorParameters(classNode) !; const identifierOfViewContainerRef = (ctrDecorators[0].typeValueReference !as{ local: true, - expression: ts.Identifier + expression: ts.Identifier, + defaultImportStatement: null, }).expression; const expectedDeclarationNode = getDeclaration( diff --git a/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts b/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts index b5154418d8..f982cd09b6 100644 --- a/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/rendering/esm2015_renderer_spec.ts @@ -116,23 +116,14 @@ describe('Esm2015Renderer', () => { const {renderer} = setup(PROGRAM); const output = new MagicString(PROGRAM.contents); renderer.addImports(output, [ - {specifier: '@angular/core', qualifier: 'i0', isDefault: false}, - {specifier: '@angular/common', qualifier: 'i1', isDefault: false} + {specifier: '@angular/core', qualifier: 'i0'}, + {specifier: '@angular/common', qualifier: 'i1'} ]); expect(output.toString()).toContain(`import * as i0 from '@angular/core'; import * as i1 from '@angular/common'; /* A copyright notice */`); }); - - it('should insert a default import at the start of the source file', () => { - const {renderer} = setup(PROGRAM); - const output = new MagicString(PROGRAM.contents); - renderer.addImports(output, [ - {specifier: 'test', qualifier: 'i0', isDefault: true}, - ]); - expect(output.toString()).toContain(`import i0 from 'test';`); - }); }); describe('addExports', () => { diff --git a/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts b/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts index 62ecd76e8a..4d6704a5d0 100644 --- a/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/rendering/esm5_renderer_spec.ts @@ -153,23 +153,14 @@ describe('Esm5Renderer', () => { const {renderer} = setup(PROGRAM); const output = new MagicString(PROGRAM.contents); renderer.addImports(output, [ - {specifier: '@angular/core', qualifier: 'i0', isDefault: false}, - {specifier: '@angular/common', qualifier: 'i1', isDefault: false} + {specifier: '@angular/core', qualifier: 'i0'}, + {specifier: '@angular/common', qualifier: 'i1'} ]); expect(output.toString()).toContain(`import * as i0 from '@angular/core'; import * as i1 from '@angular/common'; /* A copyright notice */`); }); - - it('should insert a default import at the start of the source file', () => { - const {renderer} = setup(PROGRAM); - const output = new MagicString(PROGRAM.contents); - renderer.addImports(output, [ - {specifier: 'test', qualifier: 'i0', isDefault: true}, - ]); - expect(output.toString()).toContain(`import i0 from 'test';`); - }); }); describe('addExports', () => { diff --git a/packages/compiler-cli/src/ngcc/test/rendering/renderer_spec.ts b/packages/compiler-cli/src/ngcc/test/rendering/renderer_spec.ts index dc2f48f679..dd03dee87b 100644 --- a/packages/compiler-cli/src/ngcc/test/rendering/renderer_spec.ts +++ b/packages/compiler-cli/src/ngcc/test/rendering/renderer_spec.ts @@ -23,8 +23,7 @@ class TestRenderer extends Renderer { constructor(host: Esm2015ReflectionHost, isCore: boolean, bundle: EntryPointBundle) { super(host, isCore, bundle, '/src', '/dist'); } - addImports( - output: MagicString, imports: {specifier: string, qualifier: string, isDefault: boolean}[]) { + addImports(output: MagicString, imports: {specifier: string, qualifier: string}[]) { output.prepend('\n// ADD IMPORTS\n'); } addExports(output: MagicString, baseEntryPointPath: string, exports: { @@ -172,7 +171,7 @@ A.ngComponentDef = ɵngcc0.ɵdefineComponent({ type: A, selectors: [["a"]], fact const addImportsSpy = renderer.addImports as jasmine.Spy; expect(addImportsSpy.calls.first().args[0].toString()).toEqual(RENDERED_CONTENTS); expect(addImportsSpy.calls.first().args[1]).toEqual([ - {specifier: '@angular/core', qualifier: 'ɵngcc0', isDefault: false} + {specifier: '@angular/core', qualifier: 'ɵngcc0'} ]); }); @@ -289,7 +288,7 @@ A.ngDirectiveDef = ɵngcc0.ɵdefineDirective({ type: A, selectors: [["", "a", "" .toContain(`/*@__PURE__*/ ɵngcc0.setClassMetadata(`); const addImportsSpy = renderer.addImports as jasmine.Spy; expect(addImportsSpy.calls.first().args[1]).toEqual([ - {specifier: './r3_symbols', qualifier: 'ɵngcc0', isDefault: false} + {specifier: './r3_symbols', qualifier: 'ɵngcc0'} ]); }); @@ -505,9 +504,9 @@ A.ngDirectiveDef = ɵngcc0.ɵdefineDirective({ type: A, selectors: [["", "a", "" export declare function withProviders8(): (MyModuleWithProviders)&{ngModule:SomeModule};`); expect(renderer.addImports).toHaveBeenCalledWith(jasmine.any(MagicString), [ - {specifier: './module', qualifier: 'ɵngcc0', isDefault: false}, - {specifier: '@angular/core', qualifier: 'ɵngcc1', isDefault: false}, - {specifier: 'some-library', qualifier: 'ɵngcc2', isDefault: false}, + {specifier: './module', qualifier: 'ɵngcc0'}, + {specifier: '@angular/core', qualifier: 'ɵngcc1'}, + {specifier: 'some-library', qualifier: 'ɵngcc2'}, ]); diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/component.ts b/packages/compiler-cli/src/ngtsc/annotations/src/component.ts index 9156e7890e..9197e756c5 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/component.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/component.ts @@ -12,7 +12,7 @@ import * as ts from 'typescript'; import {CycleAnalyzer} from '../../cycles'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; -import {ModuleResolver, Reference, ReferenceEmitter} from '../../imports'; +import {DefaultImportRecorder, ModuleResolver, Reference, ReferenceEmitter} from '../../imports'; import {EnumValue, PartialEvaluator} from '../../partial_evaluator'; import {Decorator, ReflectionHost, filterToMembersWithDecorator, reflectObjectLiteral} from '../../reflection'; import {LocalModuleScopeRegistry, ScopeDirective, extractDirectiveGuards} from '../../scope'; @@ -45,7 +45,7 @@ export class ComponentDecoratorHandler implements private resourceLoader: ResourceLoader, private rootDirs: string[], private defaultPreserveWhitespaces: boolean, private i18nUseExternalIds: boolean, private moduleResolver: ModuleResolver, private cycleAnalyzer: CycleAnalyzer, - private refEmitter: ReferenceEmitter) {} + private refEmitter: ReferenceEmitter, private defaultImportRecorder: DefaultImportRecorder) {} private literalCache = new Map(); private boundTemplateCache = new Map>(); @@ -135,7 +135,7 @@ export class ComponentDecoratorHandler implements // @Component inherits @Directive, so begin by extracting the @Directive metadata and building // on it. const directiveResult = extractDirectiveMetadata( - node, decorator, this.reflector, this.evaluator, this.isCore, + node, decorator, this.reflector, this.evaluator, this.defaultImportRecorder, this.isCore, this.elementSchemaRegistry.getDefaultComponentElementName()); if (directiveResult === undefined) { // `extractDirectiveMetadata` returns undefined when the @Directive has `jit: true`. In this @@ -302,7 +302,8 @@ export class ComponentDecoratorHandler implements viewProviders, i18nUseExternalIds: this.i18nUseExternalIds, relativeContextFilePath }, - metadataStmt: generateSetClassMetadataCall(node, this.reflector, this.isCore), + metadataStmt: generateSetClassMetadataCall( + node, this.reflector, this.defaultImportRecorder, this.isCore), parsedTemplate: template.nodes, }, typeCheck: true, diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts b/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts index c53a39e492..8c3c231d59 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/directive.ts @@ -10,7 +10,7 @@ import {ConstantPool, Expression, ParseError, ParsedHostBindings, R3DirectiveMet import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; -import {Reference} from '../../imports'; +import {DefaultImportRecorder, Reference} from '../../imports'; import {DynamicValue, EnumValue, PartialEvaluator} from '../../partial_evaluator'; import {ClassMember, ClassMemberKind, Decorator, ReflectionHost, filterToMembersWithDecorator, reflectObjectLiteral} from '../../reflection'; import {LocalModuleScopeRegistry} from '../../scope/src/local'; @@ -30,7 +30,8 @@ export class DirectiveDecoratorHandler implements DecoratorHandler { constructor( private reflector: ReflectionHost, private evaluator: PartialEvaluator, - private scopeRegistry: LocalModuleScopeRegistry, private isCore: boolean) {} + private scopeRegistry: LocalModuleScopeRegistry, + private defaultImportRecorder: DefaultImportRecorder, private isCore: boolean) {} readonly precedence = HandlerPrecedence.PRIMARY; @@ -50,8 +51,8 @@ export class DirectiveDecoratorHandler implements } analyze(node: ts.ClassDeclaration, decorator: Decorator): AnalysisOutput { - const directiveResult = - extractDirectiveMetadata(node, decorator, this.reflector, this.evaluator, this.isCore); + const directiveResult = extractDirectiveMetadata( + node, decorator, this.reflector, this.evaluator, this.defaultImportRecorder, this.isCore); const analysis = directiveResult && directiveResult.metadata; // If the directive has a selector, it should be registered with the `SelectorScopeRegistry` so @@ -77,7 +78,8 @@ export class DirectiveDecoratorHandler implements return { analysis: { meta: analysis, - metadataStmt: generateSetClassMetadataCall(node, this.reflector, this.isCore), + metadataStmt: generateSetClassMetadataCall( + node, this.reflector, this.defaultImportRecorder, this.isCore), } }; } @@ -103,7 +105,8 @@ export class DirectiveDecoratorHandler implements */ export function extractDirectiveMetadata( clazz: ts.ClassDeclaration, decorator: Decorator, reflector: ReflectionHost, - evaluator: PartialEvaluator, isCore: boolean, defaultSelector: string | null = null): { + evaluator: PartialEvaluator, defaultImportRecorder: DefaultImportRecorder, isCore: boolean, + defaultSelector: string | null = null): { decorator: Map, metadata: R3DirectiveMetadata, decoratedElements: ClassMember[], @@ -205,7 +208,7 @@ export function extractDirectiveMetadata( const usesInheritance = reflector.hasBaseClass(clazz); const metadata: R3DirectiveMetadata = { name: clazz.name !.text, - deps: getValidConstructorDependencies(clazz, reflector, isCore), host, + deps: getValidConstructorDependencies(clazz, reflector, defaultImportRecorder, isCore), host, lifecycle: { usesOnChanges, }, diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts b/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts index cc90389f81..b020c9316b 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/injectable.ts @@ -10,6 +10,7 @@ import {Expression, LiteralExpr, R3DependencyMetadata, R3InjectableMetadata, R3R import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; +import {DefaultImportRecorder} from '../../imports'; import {Decorator, ReflectionHost, reflectObjectLiteral} from '../../reflection'; import {AnalysisOutput, CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence} from '../../transform'; @@ -27,8 +28,8 @@ export interface InjectableHandlerData { export class InjectableDecoratorHandler implements DecoratorHandler { constructor( - private reflector: ReflectionHost, private isCore: boolean, private strictCtorDeps: boolean) { - } + private reflector: ReflectionHost, private defaultImportRecorder: DefaultImportRecorder, + private isCore: boolean, private strictCtorDeps: boolean) {} readonly precedence = HandlerPrecedence.SHARED; @@ -51,8 +52,10 @@ export class InjectableDecoratorHandler implements return { analysis: { meta: extractInjectableMetadata( - node, decorator, this.reflector, this.isCore, this.strictCtorDeps), - metadataStmt: generateSetClassMetadataCall(node, this.reflector, this.isCore), + node, decorator, this.reflector, this.defaultImportRecorder, this.isCore, + this.strictCtorDeps), + metadataStmt: generateSetClassMetadataCall( + node, this.reflector, this.defaultImportRecorder, this.isCore), }, }; } @@ -78,7 +81,8 @@ export class InjectableDecoratorHandler implements * A `null` return value indicates this is @Injectable has invalid data. */ function extractInjectableMetadata( - clazz: ts.ClassDeclaration, decorator: Decorator, reflector: ReflectionHost, isCore: boolean, + clazz: ts.ClassDeclaration, decorator: Decorator, reflector: ReflectionHost, + defaultImportRecorder: DefaultImportRecorder, isCore: boolean, strictCtorDeps: boolean): R3InjectableMetadata { if (clazz.name === undefined) { throw new FatalDiagnosticError( @@ -101,9 +105,10 @@ function extractInjectableMetadata( // signature does not work for DI then an ngInjectableDef that throws. let ctorDeps: R3DependencyMetadata[]|'invalid'|null = null; if (strictCtorDeps) { - ctorDeps = getValidConstructorDependencies(clazz, reflector, isCore); + ctorDeps = getValidConstructorDependencies(clazz, reflector, defaultImportRecorder, isCore); } else { - const possibleCtorDeps = getConstructorDependencies(clazz, reflector, isCore); + const possibleCtorDeps = + getConstructorDependencies(clazz, reflector, defaultImportRecorder, isCore); if (possibleCtorDeps !== null) { if (possibleCtorDeps.deps !== null) { // This use of @Injectable has valid constructor dependencies. @@ -124,7 +129,7 @@ function extractInjectableMetadata( providedIn: new LiteralExpr(null), ctorDeps, }; } else if (decorator.args.length === 1) { - const rawCtorDeps = getConstructorDependencies(clazz, reflector, isCore); + const rawCtorDeps = getConstructorDependencies(clazz, reflector, defaultImportRecorder, isCore); let ctorDeps: R3DependencyMetadata[]|'invalid'|null = null; // rawCtorDeps will be null if the class has no constructor. diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/metadata.ts b/packages/compiler-cli/src/ngtsc/annotations/src/metadata.ts index c807e9a14d..a976cd3848 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/metadata.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/metadata.ts @@ -9,10 +9,12 @@ import {Expression, ExternalExpr, FunctionExpr, Identifiers, InvokeFunctionExpr, LiteralArrayExpr, LiteralExpr, ReturnStatement, Statement, WrappedNodeExpr, literalMap} from '@angular/compiler'; import * as ts from 'typescript'; +import {DefaultImportRecorder} from '../../imports'; import {CtorParameter, Decorator, ReflectionHost} from '../../reflection'; import {valueReferenceToExpression} from './util'; + /** * Given a class declaration, generate a call to `setClassMetadata` with the Angular metadata * present on the class or its member fields. @@ -21,7 +23,8 @@ import {valueReferenceToExpression} from './util'; * as a `Statement` for inclusion along with the class. */ export function generateSetClassMetadataCall( - clazz: ts.Declaration, reflection: ReflectionHost, isCore: boolean): Statement|null { + clazz: ts.Declaration, reflection: ReflectionHost, defaultImportRecorder: DefaultImportRecorder, + isCore: boolean): Statement|null { if (!reflection.isClass(clazz) || clazz.name === undefined || !ts.isIdentifier(clazz.name)) { return null; } @@ -44,7 +47,8 @@ export function generateSetClassMetadataCall( let metaCtorParameters: Expression = new LiteralExpr(null); const classCtorParameters = reflection.getConstructorParameters(clazz); if (classCtorParameters !== null) { - const ctorParameters = classCtorParameters.map(param => ctorParameterToMetadata(param, isCore)); + const ctorParameters = classCtorParameters.map( + param => ctorParameterToMetadata(param, defaultImportRecorder, isCore)); metaCtorParameters = new FunctionExpr([], [ new ReturnStatement(new LiteralArrayExpr(ctorParameters)), ]); @@ -80,11 +84,13 @@ export function generateSetClassMetadataCall( /** * Convert a reflected constructor parameter to metadata. */ -function ctorParameterToMetadata(param: CtorParameter, isCore: boolean): Expression { +function ctorParameterToMetadata( + param: CtorParameter, defaultImportRecorder: DefaultImportRecorder, + isCore: boolean): Expression { // Parameters sometimes have a type that can be referenced. If so, then use it, otherwise // its type is undefined. const type = param.typeValueReference !== null ? - valueReferenceToExpression(param.typeValueReference) : + valueReferenceToExpression(param.typeValueReference, defaultImportRecorder) : new LiteralExpr(undefined); const mapEntries: {key: string, value: Expression, quoted: false}[] = [ diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts index 78e3b66118..b609707f81 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts @@ -10,7 +10,7 @@ import {Expression, ExternalExpr, InvokeFunctionExpr, LiteralArrayExpr, R3Identi import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; -import {Reference, ReferenceEmitter} from '../../imports'; +import {DefaultImportRecorder, Reference, ReferenceEmitter} from '../../imports'; import {PartialEvaluator, ResolvedValue} from '../../partial_evaluator'; import {Decorator, ReflectionHost, reflectObjectLiteral, typeNodeToValueExpr} from '../../reflection'; import {NgModuleRouteAnalyzer} from '../../routing'; @@ -39,7 +39,8 @@ export class NgModuleDecoratorHandler implements DecoratorHandler { constructor( private reflector: ReflectionHost, private evaluator: PartialEvaluator, - private scopeRegistry: LocalModuleScopeRegistry, private isCore: boolean) {} + private scopeRegistry: LocalModuleScopeRegistry, + private defaultImportRecorder: DefaultImportRecorder, private isCore: boolean) {} readonly precedence = HandlerPrecedence.PRIMARY; @@ -98,9 +99,12 @@ export class PipeDecoratorHandler implements DecoratorHandler { - let token = valueReferenceToExpression(param.typeValueReference); + let token = valueReferenceToExpression(param.typeValueReference, defaultImportRecorder); let optional = false, self = false, skipSelf = false, host = false; let resolved = R3ResolvedDependencyType.Token; (param.decorators || []).filter(dec => isCore || isAngularCore(dec)).forEach(dec => { @@ -101,13 +102,24 @@ export function getConstructorDependencies( * references are converted to an `ExternalExpr`. Note that this is only valid in the context of the * file in which the `TypeValueReference` originated. */ -export function valueReferenceToExpression(valueRef: TypeValueReference): Expression; -export function valueReferenceToExpression(valueRef: null): null; -export function valueReferenceToExpression(valueRef: TypeValueReference | null): Expression|null; -export function valueReferenceToExpression(valueRef: TypeValueReference | null): Expression|null { +export function valueReferenceToExpression( + valueRef: TypeValueReference, defaultImportRecorder: DefaultImportRecorder): Expression; +export function valueReferenceToExpression( + valueRef: null, defaultImportRecorder: DefaultImportRecorder): null; +export function valueReferenceToExpression( + valueRef: TypeValueReference | null, defaultImportRecorder: DefaultImportRecorder): Expression| + null; +export function valueReferenceToExpression( + valueRef: TypeValueReference | null, defaultImportRecorder: DefaultImportRecorder): Expression| + null { if (valueRef === null) { return null; } else if (valueRef.local) { + if (defaultImportRecorder !== null && valueRef.defaultImportStatement !== null && + ts.isIdentifier(valueRef.expression)) { + defaultImportRecorder.recordImportedIdentifier( + valueRef.expression, valueRef.defaultImportStatement); + } return new WrappedNodeExpr(valueRef.expression); } else { // TODO(alxhub): this cast is necessary because the g3 typescript version doesn't narrow here. @@ -116,10 +128,10 @@ export function valueReferenceToExpression(valueRef: TypeValueReference | null): } export function getValidConstructorDependencies( - clazz: ts.ClassDeclaration, reflector: ReflectionHost, isCore: boolean): R3DependencyMetadata[]| - null { + clazz: ts.ClassDeclaration, reflector: ReflectionHost, + defaultImportRecorder: DefaultImportRecorder, isCore: boolean): R3DependencyMetadata[]|null { return validateConstructorDependencies( - clazz, getConstructorDependencies(clazz, reflector, isCore)); + clazz, getConstructorDependencies(clazz, reflector, defaultImportRecorder, isCore)); } export function validateConstructorDependencies( diff --git a/packages/compiler-cli/src/ngtsc/annotations/test/component_spec.ts b/packages/compiler-cli/src/ngtsc/annotations/test/component_spec.ts index 03d268b612..a0cc4416be 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/test/component_spec.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/test/component_spec.ts @@ -10,7 +10,7 @@ import * as ts from 'typescript'; import {CycleAnalyzer, ImportGraph} from '../../cycles'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; -import {ModuleResolver, ReferenceEmitter} from '../../imports'; +import {ModuleResolver, NOOP_DEFAULT_IMPORT_RECORDER, ReferenceEmitter} from '../../imports'; import {PartialEvaluator} from '../../partial_evaluator'; import {TypeScriptReflectionHost} from '../../reflection'; import {LocalModuleScopeRegistry, MetadataDtsModuleScopeResolver} from '../../scope'; @@ -55,7 +55,7 @@ describe('ComponentDecoratorHandler', () => { const handler = new ComponentDecoratorHandler( reflectionHost, evaluator, scopeRegistry, false, new NoopResourceLoader(), [''], false, - true, moduleResolver, cycleAnalyzer, refEmitter); + true, moduleResolver, cycleAnalyzer, refEmitter, NOOP_DEFAULT_IMPORT_RECORDER); const TestCmp = getDeclaration(program, 'entry.ts', 'TestCmp', ts.isClassDeclaration); const detected = handler.detect(TestCmp, reflectionHost.getDecoratorsOfDeclaration(TestCmp)); if (detected === undefined) { diff --git a/packages/compiler-cli/src/ngtsc/annotations/test/directive_spec.ts b/packages/compiler-cli/src/ngtsc/annotations/test/directive_spec.ts index 8dea509ab5..a314de85b6 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/test/directive_spec.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/test/directive_spec.ts @@ -8,7 +8,7 @@ import * as ts from 'typescript'; -import {ReferenceEmitter} from '../../imports'; +import {NOOP_DEFAULT_IMPORT_RECORDER, ReferenceEmitter} from '../../imports'; import {PartialEvaluator} from '../../partial_evaluator'; import {TypeScriptReflectionHost} from '../../reflection'; import {LocalModuleScopeRegistry, MetadataDtsModuleScopeResolver} from '../../scope'; @@ -43,7 +43,8 @@ describe('DirectiveDecoratorHandler', () => { const scopeRegistry = new LocalModuleScopeRegistry( new MetadataDtsModuleScopeResolver(checker, reflectionHost, null), new ReferenceEmitter([]), null); - const handler = new DirectiveDecoratorHandler(reflectionHost, evaluator, scopeRegistry, false); + const handler = new DirectiveDecoratorHandler( + reflectionHost, evaluator, scopeRegistry, NOOP_DEFAULT_IMPORT_RECORDER, false); const analyzeDirective = (dirName: string) => { const DirNode = getDeclaration(program, 'entry.ts', dirName, ts.isClassDeclaration); diff --git a/packages/compiler-cli/src/ngtsc/annotations/test/metadata_spec.ts b/packages/compiler-cli/src/ngtsc/annotations/test/metadata_spec.ts index 837c685fcb..ec24285097 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/test/metadata_spec.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/test/metadata_spec.ts @@ -8,11 +8,10 @@ import * as ts from 'typescript'; -import {NoopImportRewriter} from '../../imports'; +import {NOOP_DEFAULT_IMPORT_RECORDER, NoopImportRewriter} from '../../imports'; import {TypeScriptReflectionHost} from '../../reflection'; import {getDeclaration, makeProgram} from '../../testing/in_memory_typescript'; import {ImportManager, translateStatement} from '../../translator'; - import {generateSetClassMetadataCall} from '../src/metadata'; const CORE = { @@ -83,13 +82,13 @@ function compileAndPrint(contents: string): string { ]); const host = new TypeScriptReflectionHost(program.getTypeChecker()); const target = getDeclaration(program, 'index.ts', 'Target', ts.isClassDeclaration); - const call = generateSetClassMetadataCall(target, host, false); + const call = generateSetClassMetadataCall(target, host, NOOP_DEFAULT_IMPORT_RECORDER, false); if (call === null) { return ''; } const sf = program.getSourceFile('index.ts') !; const im = new ImportManager(new NoopImportRewriter(), 'i'); - const tsStatement = translateStatement(call, im); + const tsStatement = translateStatement(call, im, NOOP_DEFAULT_IMPORT_RECORDER); const res = ts.createPrinter().printNode(ts.EmitHint.Unspecified, tsStatement, sf); return res.replace(/\s+/g, ' '); } diff --git a/packages/compiler-cli/src/ngtsc/annotations/test/ng_module_spec.ts b/packages/compiler-cli/src/ngtsc/annotations/test/ng_module_spec.ts index 1464e81f45..ad94014bc0 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/test/ng_module_spec.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/test/ng_module_spec.ts @@ -10,7 +10,7 @@ import {WrappedNodeExpr} from '@angular/compiler'; import {R3Reference} from '@angular/compiler/src/compiler'; import * as ts from 'typescript'; -import {LocalIdentifierStrategy, ReferenceEmitter} from '../../imports'; +import {LocalIdentifierStrategy, NOOP_DEFAULT_IMPORT_RECORDER, ReferenceEmitter} from '../../imports'; import {PartialEvaluator} from '../../partial_evaluator'; import {TypeScriptReflectionHost} from '../../reflection'; import {LocalModuleScopeRegistry, MetadataDtsModuleScopeResolver} from '../../scope'; @@ -61,7 +61,8 @@ describe('NgModuleDecoratorHandler', () => { const refEmitter = new ReferenceEmitter([new LocalIdentifierStrategy()]); const handler = new NgModuleDecoratorHandler( - reflectionHost, evaluator, scopeRegistry, referencesRegistry, false, null, refEmitter); + reflectionHost, evaluator, scopeRegistry, referencesRegistry, false, null, refEmitter, + NOOP_DEFAULT_IMPORT_RECORDER); const TestModule = getDeclaration(program, 'entry.ts', 'TestModule', ts.isClassDeclaration); const detected = handler.detect(TestModule, reflectionHost.getDecoratorsOfDeclaration(TestModule)); diff --git a/packages/compiler-cli/src/ngtsc/imports/index.ts b/packages/compiler-cli/src/ngtsc/imports/index.ts index ce541d85ae..aae8fd42c4 100644 --- a/packages/compiler-cli/src/ngtsc/imports/index.ts +++ b/packages/compiler-cli/src/ngtsc/imports/index.ts @@ -8,6 +8,7 @@ export {AliasGenerator, AliasStrategy} from './src/alias'; export {ImportRewriter, NoopImportRewriter, R3SymbolsImportRewriter, validateAndRewriteCoreSymbol} from './src/core'; +export {DefaultImportRecorder, DefaultImportTracker, NOOP_DEFAULT_IMPORT_RECORDER} from './src/default'; export {AbsoluteModuleStrategy, FileToModuleHost, FileToModuleStrategy, LocalIdentifierStrategy, LogicalProjectStrategy, ReferenceEmitStrategy, ReferenceEmitter} from './src/emitter'; export {Reexport} from './src/reexport'; export {ImportMode, OwningModule, Reference} from './src/references'; diff --git a/packages/compiler-cli/src/ngtsc/imports/src/default.ts b/packages/compiler-cli/src/ngtsc/imports/src/default.ts new file mode 100644 index 0000000000..e205052acb --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/imports/src/default.ts @@ -0,0 +1,188 @@ +/** +* @license +* Copyright Google Inc. All Rights Reserved. +* +* Use of this source code is governed by an MIT-style license that can be +* found in the LICENSE file at https://angular.io/license +*/ + +import * as ts from 'typescript'; + +import {getSourceFile} from '../../util/src/typescript'; + +/** + * Registers and records usages of `ts.Identifer`s that came from default import statements. + * + * See `DefaultImportTracker` for details. + */ +export interface DefaultImportRecorder { + /** + * Record an association between a `ts.Identifier` which might be emitted and the + * `ts.ImportDeclaration` from which it came. + * + * Alone, this method has no effect as the `ts.Identifier` might not be used in the output. + * The identifier must later be marked as used with `recordUsedIdentifier` in order for its + * import to be preserved. + */ + recordImportedIdentifier(id: ts.Identifier, decl: ts.ImportDeclaration): void; + + /** + * Record the fact that the given `ts.Identifer` will be emitted, and thus its + * `ts.ImportDeclaration`, if it was a previously registered default import, must be preserved. + * + * This method can be called safely for any `ts.Identifer`, regardless of its origin. It will only + * have an effect if the identifier came from a `ts.ImportDeclaration` default import which was + * previously registered with `recordImportedIdentifier`. + */ + recordUsedIdentifier(id: ts.Identifier): void; +} + +/** + * An implementation of `DefaultImportRecorder` which does nothing. + * + * This is useful when default import tracking isn't required, such as when emitting .d.ts code + * or for ngcc. + */ +export const NOOP_DEFAULT_IMPORT_RECORDER: DefaultImportRecorder = { + recordImportedIdentifier: (id: ts.Identifier) => void{}, + recordUsedIdentifier: (id: ts.Identifier) => void{}, +}; + +/** + * TypeScript has trouble with generating default imports inside of transformers for some module + * formats. The issue is that for the statement: + * + * import X from 'some/module'; + * console.log(X); + * + * TypeScript will not use the "X" name in generated code. For normal user code, this is fine + * because references to X will also be renamed. However, if both the import and any references are + * added in a transformer, TypeScript does not associate the two, and will leave the "X" references + * dangling while renaming the import variable. The generated code looks something like: + * + * const module_1 = require('some/module'); + * console.log(X); // now X is a dangling reference. + * + * Therefore, we cannot synthetically add default imports, and must reuse the imports that users + * include. Doing this poses a challenge for imports that are only consumed in the type position in + * the user's code. If Angular reuses the imported symbol in a value position (for example, we + * see a constructor parameter of type Foo and try to write "inject(Foo)") we will also end up with + * a dangling reference, as TS will elide the import because it was only used in the type position + * originally. + * + * To avoid this, the compiler must "touch" the imports with `ts.updateImportClause`, and should + * only do this for imports which are actually consumed. The `DefaultImportTracker` keeps track of + * these imports as they're encountered and emitted, and implements a transform which can correctly + * flag the imports as required. + * + * This problem does not exist for non-default imports as the compiler can easily insert + * "import * as X" style imports for those, and the "X" identifier survives transformation. + */ +export class DefaultImportTracker implements DefaultImportRecorder { + /** + * A `Map` which tracks the `Map` of default import `ts.Identifier`s to their + * `ts.ImportDeclaration`s. These declarations are not guaranteed to be used. + */ + private sourceFileToImportMap = + new Map>(); + + /** + * A `Map` which tracks the `Set` of `ts.ImportDeclaration`s for default imports that were used in + * a given `ts.SourceFile` and need to be preserved. + */ + private sourceFileToUsedImports = new Map>(); + recordImportedIdentifier(id: ts.Identifier, decl: ts.ImportDeclaration): void { + const sf = getSourceFile(id); + if (!this.sourceFileToImportMap.has(sf)) { + this.sourceFileToImportMap.set(sf, new Map()); + } + this.sourceFileToImportMap.get(sf) !.set(id, decl); + } + + recordUsedIdentifier(id: ts.Identifier): void { + const sf = getSourceFile(id); + if (!this.sourceFileToImportMap.has(sf)) { + // The identifier's source file has no registered default imports at all. + return; + } + const identiferToDeclaration = this.sourceFileToImportMap.get(sf) !; + if (!identiferToDeclaration.has(id)) { + // The identifier isn't from a registered default import. + return; + } + const decl = identiferToDeclaration.get(id) !; + + // Add the default import declaration to the set of used import declarations for the file. + if (!this.sourceFileToUsedImports.has(sf)) { + this.sourceFileToUsedImports.set(sf, new Set()); + } + this.sourceFileToUsedImports.get(sf) !.add(decl); + } + + /** + * Get a `ts.TransformerFactory` which will preserve default imports that were previously marked + * as used. + * + * This transformer must run after any other transformers which call `recordUsedIdentifier`. + */ + importPreservingTransformer(): ts.TransformerFactory { + return (context: ts.TransformationContext) => { + return (sf: ts.SourceFile) => { return this.transformSourceFile(sf); }; + }; + } + + /** + * Process a `ts.SourceFile` and replace any `ts.ImportDeclaration`s. + */ + private transformSourceFile(sf: ts.SourceFile): ts.SourceFile { + const originalSf = ts.getOriginalNode(sf) as ts.SourceFile; + // Take a fast path if no import declarations need to be preserved in the file. + if (!this.sourceFileToUsedImports.has(originalSf)) { + return sf; + } + + // There are declarations that need to be preserved. + const importsToPreserve = this.sourceFileToUsedImports.get(originalSf) !; + + // Generate a new statement list which preserves any imports present in `importsToPreserve`. + const statements = sf.statements.map(stmt => { + if (ts.isImportDeclaration(stmt) && importsToPreserve.has(stmt)) { + // Preserving an import that's marked as unreferenced (type-only) is tricky in TypeScript. + // + // Various approaches have been tried, with mixed success: + // + // 1. Using `ts.updateImportDeclaration` does not cause the import to be retained. + // + // 2. Using `ts.createImportDeclaration` with the same `ts.ImportClause` causes the import + // to correctly be retained, but when emitting CommonJS module format code, references + // to the imported value will not match the import variable. + // + // 3. Emitting "import * as" imports instead generates the correct import variable, but + // references are missing the ".default" access. This happens to work for tsickle code + // with goog.module transformations as tsickle strips the ".default" anyway. + // + // 4. It's possible to trick TypeScript by setting `ts.NodeFlag.Synthesized` on the import + // declaration. This causes the import to be correctly retained and generated, but can + // violate invariants elsewhere in the compiler and cause crashes. + // + // 5. Using `ts.getMutableClone` seems to correctly preserve the import and correctly + // generate references to the import variable across all module types. + // + // Therefore, option 5 is the one used here. It seems to be implemented as the correct way + // to perform option 4, which preserves all the compiler's invariants. + // + // TODO(alxhub): discuss with the TypeScript team and determine if there's a better way to + // deal with this issue. + stmt = ts.getMutableClone(stmt); + } + return stmt; + }); + + // Save memory - there's no need to keep these around once the transform has run for the given + // file. + this.sourceFileToImportMap.delete(originalSf); + this.sourceFileToUsedImports.delete(originalSf); + + return ts.updateSourceFileNode(sf, statements); + } +} diff --git a/packages/compiler-cli/src/ngtsc/imports/test/BUILD.bazel b/packages/compiler-cli/src/ngtsc/imports/test/BUILD.bazel new file mode 100644 index 0000000000..870fe78ec2 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/imports/test/BUILD.bazel @@ -0,0 +1,26 @@ +load("//tools:defaults.bzl", "jasmine_node_test", "ts_library") + +package(default_visibility = ["//visibility:public"]) + +ts_library( + name = "test_lib", + testonly = True, + srcs = glob([ + "**/*.ts", + ]), + deps = [ + "//packages:types", + "//packages/compiler-cli/src/ngtsc/imports", + "//packages/compiler-cli/src/ngtsc/testing", + "@npm//typescript", + ], +) + +jasmine_node_test( + name = "test", + bootstrap = ["angular/tools/testing/init_node_no_angular_spec.js"], + deps = [ + ":test_lib", + "//tools/testing:node_no_angular", + ], +) diff --git a/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts b/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts new file mode 100644 index 0000000000..2f9b284f09 --- /dev/null +++ b/packages/compiler-cli/src/ngtsc/imports/test/default_spec.ts @@ -0,0 +1,90 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {getDeclaration, makeProgram} from '../../testing/in_memory_typescript'; +import {DefaultImportTracker} from '../src/default'; + +describe('DefaultImportTracker', () => { + it('should prevent a default import from being elided if used', () => { + const {program, host} = makeProgram( + [ + {name: 'dep.ts', contents: `export default class Foo {}`}, + {name: 'test.ts', contents: `import Foo from './dep'; export function test(f: Foo) {}`}, + + // This control file is identical to the test file, but will not have its import marked + // for preservation. It exists to verify that it is in fact the action of + // DefaultImportTracker and not some other artifact of the test setup which causes the + // import to be preserved. It will also verify that DefaultImportTracker does not preserve + // imports which are not marked for preservation. + {name: 'ctrl.ts', contents: `import Foo from './dep'; export function test(f: Foo) {}`}, + ], + { + module: ts.ModuleKind.ES2015, + }); + const fooClause = getDeclaration(program, 'test.ts', 'Foo', ts.isImportClause); + const fooId = fooClause.name !; + const fooDecl = fooClause.parent; + + const tracker = new DefaultImportTracker(); + tracker.recordImportedIdentifier(fooId, fooDecl); + tracker.recordUsedIdentifier(fooId); + program.emit(undefined, undefined, undefined, undefined, { + before: [tracker.importPreservingTransformer()], + }); + const testContents = host.readFile('/test.js') !; + expect(testContents).toContain(`import Foo from './dep';`); + + // The control should have the import elided. + const ctrlContents = host.readFile('/ctrl.js'); + expect(ctrlContents).not.toContain(`import Foo from './dep';`); + }); + + it('should transpile imports correctly into commonjs', () => { + const {program, host} = makeProgram( + [ + {name: 'dep.ts', contents: `export default class Foo {}`}, + {name: 'test.ts', contents: `import Foo from './dep'; export function test(f: Foo) {}`}, + ], + { + module: ts.ModuleKind.CommonJS, + }); + const fooClause = getDeclaration(program, 'test.ts', 'Foo', ts.isImportClause); + const fooId = ts.updateIdentifier(fooClause.name !); + const fooDecl = fooClause.parent; + + const tracker = new DefaultImportTracker(); + tracker.recordImportedIdentifier(fooId, fooDecl); + tracker.recordUsedIdentifier(fooId); + program.emit(undefined, undefined, undefined, undefined, { + before: [ + addReferenceTransformer(fooId), + tracker.importPreservingTransformer(), + ], + }); + const testContents = host.readFile('/test.js') !; + expect(testContents).toContain(`var dep_1 = require("./dep");`); + expect(testContents).toContain(`var ref = dep_1["default"];`); + }); +}); + +function addReferenceTransformer(id: ts.Identifier): ts.TransformerFactory { + return (context: ts.TransformationContext) => { + return (sf: ts.SourceFile) => { + if (id.getSourceFile().fileName === sf.fileName) { + return ts.updateSourceFileNode(sf, [ + ...sf.statements, ts.createVariableStatement(undefined, ts.createVariableDeclarationList([ + ts.createVariableDeclaration('ref', undefined, id), + ])) + ]); + } + return sf; + }; + }; +} diff --git a/packages/compiler-cli/src/ngtsc/program.ts b/packages/compiler-cli/src/ngtsc/program.ts index 403e48f9c4..23835421e8 100644 --- a/packages/compiler-cli/src/ngtsc/program.ts +++ b/packages/compiler-cli/src/ngtsc/program.ts @@ -17,7 +17,7 @@ import {BaseDefDecoratorHandler} from './annotations/src/base_def'; import {CycleAnalyzer, ImportGraph} from './cycles'; import {ErrorCode, ngErrorCode} from './diagnostics'; import {FlatIndexGenerator, ReferenceGraph, checkForPrivateExports, findFlatIndexEntryPoint} from './entry_point'; -import {AbsoluteModuleStrategy, AliasGenerator, AliasStrategy, FileToModuleHost, FileToModuleStrategy, ImportRewriter, LocalIdentifierStrategy, LogicalProjectStrategy, ModuleResolver, NoopImportRewriter, R3SymbolsImportRewriter, Reference, ReferenceEmitter} from './imports'; +import {AbsoluteModuleStrategy, AliasGenerator, AliasStrategy, DefaultImportTracker, FileToModuleHost, FileToModuleStrategy, ImportRewriter, LocalIdentifierStrategy, LogicalProjectStrategy, ModuleResolver, NoopImportRewriter, R3SymbolsImportRewriter, Reference, ReferenceEmitter} from './imports'; import {PartialEvaluator} from './partial_evaluator'; import {AbsoluteFsPath, LogicalFileSystem} from './path'; import {TypeScriptReflectionHost} from './reflection'; @@ -56,6 +56,7 @@ export class NgtscProgram implements api.Program { private refEmitter: ReferenceEmitter|null = null; private fileToModuleHost: FileToModuleHost|null = null; + private defaultImportTracker: DefaultImportTracker; constructor( rootNames: ReadonlyArray, private options: api.CompilerOptions, @@ -132,6 +133,7 @@ export class NgtscProgram implements api.Program { this.entryPoint = entryPoint !== null ? this.tsProgram.getSourceFile(entryPoint) || null : null; this.moduleResolver = new ModuleResolver(this.tsProgram, options, this.host); this.cycleAnalyzer = new CycleAnalyzer(new ImportGraph(this.moduleResolver)); + this.defaultImportTracker = new DefaultImportTracker(); } getTsProgram(): ts.Program { return this.tsProgram; } @@ -273,11 +275,13 @@ export class NgtscProgram implements api.Program { }; const customTransforms = opts && opts.customTransformers; + const beforeTransforms = [ ivyTransformFactory( - compilation, this.reflector, this.importRewriter, this.isCore, + compilation, this.reflector, this.importRewriter, this.defaultImportTracker, this.isCore, this.closureCompilerEnabled), aliasTransformFactory(compilation.exportStatements) as ts.TransformerFactory, + this.defaultImportTracker.importPreservingTransformer(), ]; const afterDeclarationsTransforms = [ declarationTransformFactory(compilation), @@ -386,14 +390,17 @@ export class NgtscProgram implements api.Program { this.reflector, evaluator, scopeRegistry, this.isCore, this.resourceManager, this.rootDirs, this.options.preserveWhitespaces || false, this.options.i18nUseExternalIds !== false, this.moduleResolver, this.cycleAnalyzer, - this.refEmitter), - new DirectiveDecoratorHandler(this.reflector, evaluator, scopeRegistry, this.isCore), + this.refEmitter, this.defaultImportTracker), + new DirectiveDecoratorHandler( + this.reflector, evaluator, scopeRegistry, this.defaultImportTracker, this.isCore), new InjectableDecoratorHandler( - this.reflector, this.isCore, this.options.strictInjectionParameters || false), + this.reflector, this.defaultImportTracker, this.isCore, + this.options.strictInjectionParameters || false), new NgModuleDecoratorHandler( this.reflector, evaluator, scopeRegistry, referencesRegistry, this.isCore, - this.routeAnalyzer, this.refEmitter), - new PipeDecoratorHandler(this.reflector, evaluator, scopeRegistry, this.isCore), + this.routeAnalyzer, this.refEmitter, this.defaultImportTracker), + new PipeDecoratorHandler( + this.reflector, evaluator, scopeRegistry, this.defaultImportTracker, this.isCore), ]; return new IvyCompilation( diff --git a/packages/compiler-cli/src/ngtsc/reflection/index.ts b/packages/compiler-cli/src/ngtsc/reflection/index.ts index 75186f70d8..145dd3a55a 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/index.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/index.ts @@ -7,5 +7,5 @@ */ export * from './src/host'; -export {DEFAULT_EXPORT_NAME, typeNodeToValueExpr} from './src/type_to_value'; +export {typeNodeToValueExpr} from './src/type_to_value'; export {TypeScriptReflectionHost, filterToMembersWithDecorator, reflectIdentifierOfDeclaration, reflectNameOfDeclaration, reflectObjectLiteral, reflectTypeEntityToDeclaration} from './src/typescript'; \ No newline at end of file diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts index ef46b8fd0d..3a751d417f 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/host.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/host.ts @@ -167,7 +167,7 @@ export interface ClassMember { * valid within the local file where the type was referenced. */ export type TypeValueReference = { - local: true; expression: ts.Expression; + local: true; expression: ts.Expression; defaultImportStatement: ts.ImportDeclaration | null; } | { local: false; diff --git a/packages/compiler-cli/src/ngtsc/reflection/src/type_to_value.ts b/packages/compiler-cli/src/ngtsc/reflection/src/type_to_value.ts index f8ffff8aad..edcab882ab 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/src/type_to_value.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/src/type_to_value.ts @@ -10,8 +10,6 @@ import * as ts from 'typescript'; import {TypeValueReference} from './host'; -export const DEFAULT_EXPORT_NAME = '*'; - /** * Potentially convert a `ts.TypeNode` to a `TypeValueReference`, which indicates how to use the * type given in the `ts.TypeNode` in a value position. @@ -45,7 +43,16 @@ export function typeToValue( // statement. If so, extract the module specifier and the name of the imported type. const firstDecl = local.declarations && local.declarations[0]; - if (firstDecl && isImportSource(firstDecl)) { + if (firstDecl && ts.isImportClause(firstDecl) && firstDecl.name !== undefined) { + // This is a default import. + return { + local: true, + // Copying the name here ensures the generated references will be correctly transformed along + // with the import. + expression: ts.updateIdentifier(firstDecl.name), + defaultImportStatement: firstDecl.parent, + }; + } else if (firstDecl && isImportSource(firstDecl)) { const origin = extractModuleAndNameFromImport(firstDecl, symbols.importName); return {local: false, valueDeclaration: decl.valueDeclaration, ...origin}; } else { @@ -54,6 +61,7 @@ export function typeToValue( return { local: true, expression, + defaultImportStatement: null, }; } else { return null; @@ -143,9 +151,8 @@ function entityNameToValue(node: ts.EntityName): ts.Expression|null { } } -function isImportSource(node: ts.Declaration): node is( - ts.ImportSpecifier | ts.NamespaceImport | ts.ImportClause) { - return ts.isImportSpecifier(node) || ts.isNamespaceImport(node) || ts.isImportClause(node); +function isImportSource(node: ts.Declaration): node is(ts.ImportSpecifier | ts.NamespaceImport) { + return ts.isImportSpecifier(node) || ts.isNamespaceImport(node); } function extractModuleAndNameFromImport( @@ -169,10 +176,6 @@ function extractModuleAndNameFromImport( name = localName; moduleSpecifier = node.parent.parent.moduleSpecifier; break; - case ts.SyntaxKind.ImportClause: - name = DEFAULT_EXPORT_NAME; - moduleSpecifier = node.parent.moduleSpecifier; - break; default: throw new Error(`Unreachable: ${ts.SyntaxKind[(node as ts.Node).kind]}`); } diff --git a/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts b/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts index 0ad0c20598..4e2926ce25 100644 --- a/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts +++ b/packages/compiler-cli/src/ngtsc/reflection/test/ts_host_spec.ts @@ -171,7 +171,12 @@ describe('reflector', () => { const host = new TypeScriptReflectionHost(checker); const args = host.getConstructorParameters(clazz) !; expect(args.length).toBe(1); - expectParameter(args[0], 'bar', {moduleName: './bar', name: '*'}); + const param = args[0].typeValueReference; + if (param === null || !param.local) { + return fail('Expected local parameter'); + } + expect(param).not.toBeNull(); + expect(param.defaultImportStatement).not.toBeNull(); }); it('should reflect a nullable argument', () => { diff --git a/packages/compiler-cli/src/ngtsc/testing/in_memory_typescript.ts b/packages/compiler-cli/src/ngtsc/testing/in_memory_typescript.ts index 9bbdf1f2c2..51bb2be60d 100644 --- a/packages/compiler-cli/src/ngtsc/testing/in_memory_typescript.ts +++ b/packages/compiler-cli/src/ngtsc/testing/in_memory_typescript.ts @@ -133,6 +133,10 @@ export function getDeclaration( if (stmt.name !== undefined && stmt.name.text === name) { chosenDecl = stmt; } + } else if ( + ts.isImportDeclaration(stmt) && stmt.importClause !== undefined && + stmt.importClause.name !== undefined && stmt.importClause.name.text === name) { + chosenDecl = stmt.importClause; } }); diff --git a/packages/compiler-cli/src/ngtsc/transform/src/transform.ts b/packages/compiler-cli/src/ngtsc/transform/src/transform.ts index 89fb187f1c..563e3f02cf 100644 --- a/packages/compiler-cli/src/ngtsc/transform/src/transform.ts +++ b/packages/compiler-cli/src/ngtsc/transform/src/transform.ts @@ -9,12 +9,11 @@ import {ConstantPool} from '@angular/compiler'; import * as ts from 'typescript'; -import {ImportRewriter} from '../../imports'; +import {DefaultImportRecorder, ImportRewriter} from '../../imports'; import {Decorator, ReflectionHost} from '../../reflection'; import {ImportManager, translateExpression, translateStatement} from '../../translator'; import {VisitListEntryResult, Visitor, visit} from '../../util/src/visitor'; -import {CompileResult} from './api'; import {IvyCompilation} from './compilation'; import {addImports} from './utils'; @@ -33,11 +32,13 @@ interface FileOverviewMeta { export function ivyTransformFactory( compilation: IvyCompilation, reflector: ReflectionHost, importRewriter: ImportRewriter, - isCore: boolean, isClosureCompilerEnabled: boolean): ts.TransformerFactory { + defaultImportRecorder: DefaultImportRecorder, isCore: boolean, + isClosureCompilerEnabled: boolean): ts.TransformerFactory { return (context: ts.TransformationContext): ts.Transformer => { return (file: ts.SourceFile): ts.SourceFile => { return transformIvySourceFile( - compilation, context, reflector, importRewriter, file, isCore, isClosureCompilerEnabled); + compilation, context, reflector, importRewriter, file, isCore, isClosureCompilerEnabled, + defaultImportRecorder); }; }; } @@ -45,8 +46,8 @@ export function ivyTransformFactory( class IvyVisitor extends Visitor { constructor( private compilation: IvyCompilation, private reflector: ReflectionHost, - private importManager: ImportManager, private isCore: boolean, - private constantPool: ConstantPool) { + private importManager: ImportManager, private defaultImportRecorder: DefaultImportRecorder, + private isCore: boolean, private constantPool: ConstantPool) { super(); } @@ -63,14 +64,16 @@ class IvyVisitor extends Visitor { res.forEach(field => { // Translate the initializer for the field into TS nodes. - const exprNode = translateExpression(field.initializer, this.importManager); + const exprNode = + translateExpression(field.initializer, this.importManager, this.defaultImportRecorder); // Create a static property declaration for the new field. const property = ts.createProperty( undefined, [ts.createToken(ts.SyntaxKind.StaticKeyword)], field.name, undefined, undefined, exprNode); - field.statements.map(stmt => translateStatement(stmt, this.importManager)) + field.statements + .map(stmt => translateStatement(stmt, this.importManager, this.defaultImportRecorder)) .forEach(stmt => statements.push(stmt)); members.push(property); @@ -202,17 +205,20 @@ class IvyVisitor extends Visitor { function transformIvySourceFile( compilation: IvyCompilation, context: ts.TransformationContext, reflector: ReflectionHost, importRewriter: ImportRewriter, file: ts.SourceFile, isCore: boolean, - isClosureCompilerEnabled: boolean): ts.SourceFile { + isClosureCompilerEnabled: boolean, + defaultImportRecorder: DefaultImportRecorder): ts.SourceFile { const constantPool = new ConstantPool(); const importManager = new ImportManager(importRewriter); // Recursively scan through the AST and perform any updates requested by the IvyCompilation. - const visitor = new IvyVisitor(compilation, reflector, importManager, isCore, constantPool); + const visitor = new IvyVisitor( + compilation, reflector, importManager, defaultImportRecorder, isCore, constantPool); let sf = visit(file, visitor, context); // Generate the constant statements first, as they may involve adding additional imports // to the ImportManager. - const constants = constantPool.statements.map(stmt => translateStatement(stmt, importManager)); + const constants = constantPool.statements.map( + stmt => translateStatement(stmt, importManager, defaultImportRecorder)); // Preserve @fileoverview comments required by Closure, since the location might change as a // result of adding extra imports and constant pool statements. diff --git a/packages/compiler-cli/src/ngtsc/transform/src/utils.ts b/packages/compiler-cli/src/ngtsc/transform/src/utils.ts index 513d263cd6..a113506905 100644 --- a/packages/compiler-cli/src/ngtsc/transform/src/utils.ts +++ b/packages/compiler-cli/src/ngtsc/transform/src/utils.ts @@ -20,16 +20,9 @@ export function addImports( // Generate the import statements to prepend. const addedImports = importManager.getAllImports(sf.fileName).map(i => { const qualifier = ts.createIdentifier(i.qualifier); - let importClause: ts.ImportClause; - if (!i.isDefault) { - importClause = ts.createImportClause( - /* name */ undefined, - /* namedBindings */ ts.createNamespaceImport(qualifier)); - } else { - importClause = ts.createImportClause( - /* name */ qualifier, - /* namedBindings */ undefined); - } + const importClause = ts.createImportClause( + /* name */ undefined, + /* namedBindings */ ts.createNamespaceImport(qualifier)); return ts.createImportDeclaration( /* decorators */ undefined, /* modifiers */ undefined, diff --git a/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel b/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel index 966e62bcbb..351b1a7513 100644 --- a/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel +++ b/packages/compiler-cli/src/ngtsc/translator/BUILD.bazel @@ -9,7 +9,6 @@ ts_library( "//packages:types", "//packages/compiler", "//packages/compiler-cli/src/ngtsc/imports", - "//packages/compiler-cli/src/ngtsc/reflection", "//packages/compiler-cli/src/ngtsc/util", "@npm//typescript", ], diff --git a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts index 0ffd59cc20..94f630ae6b 100644 --- a/packages/compiler-cli/src/ngtsc/translator/src/translator.ts +++ b/packages/compiler-cli/src/ngtsc/translator/src/translator.ts @@ -9,8 +9,7 @@ import {ArrayType, AssertNotNull, BinaryOperator, BinaryOperatorExpr, BuiltinType, BuiltinTypeName, CastExpr, ClassStmt, CommaExpr, CommentStmt, ConditionalExpr, DeclareFunctionStmt, DeclareVarStmt, Expression, ExpressionStatement, ExpressionType, ExpressionVisitor, ExternalExpr, ExternalReference, FunctionExpr, IfStmt, InstantiateExpr, InvokeFunctionExpr, InvokeMethodExpr, JSDocCommentStmt, LiteralArrayExpr, LiteralExpr, LiteralMapExpr, MapType, NotExpr, ReadKeyExpr, ReadPropExpr, ReadVarExpr, ReturnStatement, Statement, StatementVisitor, StmtModifier, ThrowStmt, TryCatchStmt, Type, TypeVisitor, TypeofExpr, WrappedNodeExpr, WriteKeyExpr, WritePropExpr, WriteVarExpr} from '@angular/compiler'; import * as ts from 'typescript'; -import {ImportRewriter, NoopImportRewriter} from '../../imports'; -import {DEFAULT_EXPORT_NAME} from '../../reflection'; +import {DefaultImportRecorder, ImportRewriter, NOOP_DEFAULT_IMPORT_RECORDER, NoopImportRewriter} from '../../imports'; export class Context { constructor(readonly isStatement: boolean) {} @@ -40,8 +39,7 @@ const BINARY_OPERATORS = new Map([ ]); export class ImportManager { - private nonDefaultImports = new Map(); - private defaultImports = new Map(); + private specifierToIdentifier = new Map(); private nextIndex = 0; constructor(protected rewriter: ImportRewriter = new NoopImportRewriter(), private prefix = 'i') { @@ -61,47 +59,36 @@ export class ImportManager { // If not, this symbol will be imported. Allocate a prefix for the imported module if needed. - const isDefault = symbol === DEFAULT_EXPORT_NAME; - - // Use a different map for non-default vs default imports. This allows the same module to be - // imported in both ways simultaneously. - const trackingMap = !isDefault ? this.nonDefaultImports : this.defaultImports; - - if (!trackingMap.has(moduleName)) { - trackingMap.set(moduleName, `${this.prefix}${this.nextIndex++}`); + if (!this.specifierToIdentifier.has(moduleName)) { + this.specifierToIdentifier.set(moduleName, `${this.prefix}${this.nextIndex++}`); } - const moduleImport = trackingMap.get(moduleName) !; + const moduleImport = this.specifierToIdentifier.get(moduleName) !; - if (isDefault) { - // For an import of a module's default symbol, the moduleImport *is* the name to use to refer - // to the import. - return {moduleImport: null, symbol: moduleImport}; - } else { - // Non-default imports have a qualifier and the symbol name to import. - return {moduleImport, symbol}; - } + return {moduleImport, symbol}; } - getAllImports(contextPath: string): {specifier: string, qualifier: string, isDefault: boolean}[] { - const imports: {specifier: string, qualifier: string, isDefault: boolean}[] = []; - this.nonDefaultImports.forEach((qualifier, specifier) => { + getAllImports(contextPath: string): {specifier: string, qualifier: string}[] { + const imports: {specifier: string, qualifier: string}[] = []; + this.specifierToIdentifier.forEach((qualifier, specifier) => { specifier = this.rewriter.rewriteSpecifier(specifier, contextPath); - imports.push({specifier, qualifier, isDefault: false}); - }); - this.defaultImports.forEach((qualifier, specifier) => { - specifier = this.rewriter.rewriteSpecifier(specifier, contextPath); - imports.push({specifier, qualifier, isDefault: true}); + imports.push({specifier, qualifier}); }); return imports; } } -export function translateExpression(expression: Expression, imports: ImportManager): ts.Expression { - return expression.visitExpression(new ExpressionTranslatorVisitor(imports), new Context(false)); +export function translateExpression( + expression: Expression, imports: ImportManager, + defaultImportRecorder: DefaultImportRecorder): ts.Expression { + return expression.visitExpression( + new ExpressionTranslatorVisitor(imports, defaultImportRecorder), new Context(false)); } -export function translateStatement(statement: Statement, imports: ImportManager): ts.Statement { - return statement.visitStatement(new ExpressionTranslatorVisitor(imports), new Context(true)); +export function translateStatement( + statement: Statement, imports: ImportManager, + defaultImportRecorder: DefaultImportRecorder): ts.Statement { + return statement.visitStatement( + new ExpressionTranslatorVisitor(imports, defaultImportRecorder), new Context(true)); } export function translateType(type: Type, imports: ImportManager): ts.TypeNode { @@ -110,7 +97,8 @@ export function translateType(type: Type, imports: ImportManager): ts.TypeNode { class ExpressionTranslatorVisitor implements ExpressionVisitor, StatementVisitor { private externalSourceFiles = new Map(); - constructor(private imports: ImportManager) {} + constructor( + private imports: ImportManager, private defaultImportRecorder: DefaultImportRecorder) {} visitDeclareVarStmt(stmt: DeclareVarStmt, context: Context): ts.VariableStatement { const nodeFlags = stmt.hasModifier(StmtModifier.Final) ? ts.NodeFlags.Const : ts.NodeFlags.None; @@ -324,7 +312,12 @@ class ExpressionTranslatorVisitor implements ExpressionVisitor, StatementVisitor throw new Error('Method not implemented.'); } - visitWrappedNodeExpr(ast: WrappedNodeExpr, context: Context): any { return ast.node; } + visitWrappedNodeExpr(ast: WrappedNodeExpr, context: Context): any { + if (ts.isIdentifier(ast.node)) { + this.defaultImportRecorder.recordUsedIdentifier(ast.node); + } + return ast.node; + } visitTypeofExpr(ast: TypeofExpr, context: Context): ts.TypeOfExpression { return ts.createTypeOf(ast.expr.visitExpression(this, context)); @@ -496,7 +489,7 @@ export class TypeTranslatorVisitor implements ExpressionVisitor, TypeVisitor { } visitTypeofExpr(ast: TypeofExpr, context: Context): ts.TypeQueryNode { - let expr = translateExpression(ast.expr, this.imports); + let expr = translateExpression(ast.expr, this.imports, NOOP_DEFAULT_IMPORT_RECORDER); return ts.createTypeQueryNode(expr as ts.Identifier); } } diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/context.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/context.ts index 02f160e036..582b68442e 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/context.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/context.ts @@ -135,13 +135,7 @@ export class TypeCheckContext { // Write out the imports that need to be added to the beginning of the file. let imports = importManager.getAllImports(sf.fileName) - .map(i => { - if (!i.isDefault) { - return `import * as ${i.qualifier} from '${i.specifier}';`; - } else { - return `import ${i.qualifier} from '${i.specifier}';`; - } - }) + .map(i => `import * as ${i.qualifier} from '${i.specifier}';`) .join('\n'); code = imports + '\n' + code; diff --git a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts index a928f16898..270ce22dbb 100644 --- a/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts +++ b/packages/compiler-cli/src/ngtsc/typecheck/src/type_check_block.ts @@ -9,7 +9,7 @@ import {AST, BindingType, BoundTarget, ImplicitReceiver, PropertyRead, TmplAstBoundAttribute, TmplAstBoundText, TmplAstElement, TmplAstNode, TmplAstTemplate, TmplAstTextAttribute, TmplAstVariable} from '@angular/compiler'; import * as ts from 'typescript'; -import {Reference, ReferenceEmitter} from '../../imports'; +import {NOOP_DEFAULT_IMPORT_RECORDER, Reference, ReferenceEmitter} from '../../imports'; import {ImportManager, translateExpression} from '../../translator'; import {TypeCheckBlockMetadata, TypeCheckableDirectiveMeta} from './api'; @@ -83,7 +83,7 @@ class Context { } // Use `translateExpression` to convert the `Expression` into a `ts.Expression`. - return translateExpression(ngExpr, this.importManager); + return translateExpression(ngExpr, this.importManager, NOOP_DEFAULT_IMPORT_RECORDER); } } diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index 35924de0ab..cdacd28426 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -2121,9 +2121,9 @@ describe('ngtsc behavioral tests', () => { env.driveMain(); const jsContents = trim(env.getContents('test.js')); - expect(jsContents).toContain(`import * as types from './types';`); - expect(jsContents).toMatch(setClassMetadataRegExp('type: i\\d\\.MyTypeA')); - expect(jsContents).toMatch(setClassMetadataRegExp('type: i\\d\\.MyTypeB')); + expect(jsContents).toContain(`import * as i1 from "./types";`); + expect(jsContents).toMatch(setClassMetadataRegExp('type: i1.MyTypeA')); + expect(jsContents).toMatch(setClassMetadataRegExp('type: i1.MyTypeB')); }); it('should use default-imported types if they can be represented as values', () => { @@ -2146,12 +2146,12 @@ describe('ngtsc behavioral tests', () => { env.driveMain(); const jsContents = trim(env.getContents('test.js')); - expect(jsContents).toContain(`import i1 from "./types";`); - expect(jsContents).toContain(`import * as i2 from "./types";`); - expect(jsContents).toContain('i0.ɵdirectiveInject(i1)'); - expect(jsContents).toContain('i0.ɵdirectiveInject(i2.Other)'); - expect(jsContents).toMatch(setClassMetadataRegExp('type: i1')); - expect(jsContents).toMatch(setClassMetadataRegExp('type: i2.Other')); + expect(jsContents).toContain(`import Default from './types';`); + expect(jsContents).toContain(`import * as i1 from "./types";`); + expect(jsContents).toContain('i0.ɵdirectiveInject(Default)'); + expect(jsContents).toContain('i0.ɵdirectiveInject(i1.Other)'); + expect(jsContents).toMatch(setClassMetadataRegExp('type: Default')); + expect(jsContents).toMatch(setClassMetadataRegExp('type: i1.Other')); }); it('should use `undefined` in setClassMetadata if types can\'t be represented as values', () => { From 29fae6de0825d008a54836133329446d7717b19f Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Wed, 6 Mar 2019 16:02:13 -0800 Subject: [PATCH 0327/1073] docs(aio): add JiaLiPassion to Angular collaborators (#29145) PR Close #29145 --- aio/content/images/bios/JiaLiPassion.jpg | Bin 0 -> 39464 bytes aio/content/marketing/contributors.json | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 aio/content/images/bios/JiaLiPassion.jpg diff --git a/aio/content/images/bios/JiaLiPassion.jpg b/aio/content/images/bios/JiaLiPassion.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce0499909ccd26546148802a178decf7fb8d8341 GIT binary patch literal 39464 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%0A3>@JXfS`TPTbs^ga%4slD48gT9LNw?TOue& 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 literal 0 HcmV?d00001 diff --git a/aio/content/marketing/contributors.json b/aio/content/marketing/contributors.json index fedf0f5e5c..bb61f41f17 100644 --- a/aio/content/marketing/contributors.json +++ b/aio/content/marketing/contributors.json @@ -659,5 +659,12 @@ "website": "http://www.samjulien.com/", "bio": "Sam Julien builds software, articles, video courses, and campfires. A developer, speaker, writer, and GDE in the Pacific Northwest, Sam's favorite thing in the world is changing someone's life by teaching them to code.", "group": "GDE" + }, + "JiaLiPassion": { + "name": "JiaLi Passion", + "group": "Collaborator", + "mentor": "mhevery", + "picture": "JiaLiPassion.jpg", + "bio": "A programmer with passion, angular/zone.js guy! Web frontend engineer @sylabs" } } From c4c34fe60e361d8bd407146f9e19b0987f51b4e6 Mon Sep 17 00:00:00 2001 From: Judy Bogart Date: Fri, 25 Jan 2019 10:36:54 -0800 Subject: [PATCH 0328/1073] docs: clarify multi project structure (#28377) PR Close #28377 --- aio/content/guide/file-structure.md | 199 +++++++++++++++++----------- 1 file changed, 125 insertions(+), 74 deletions(-) diff --git a/aio/content/guide/file-structure.md b/aio/content/guide/file-structure.md index 7ee63c56d7..07ab21981e 100644 --- a/aio/content/guide/file-structure.md +++ b/aio/content/guide/file-structure.md @@ -1,43 +1,74 @@ # Workspace and project file structure -You develop apps in the context of an Angular [workspace](guide/glossary#workspace). A workspace contains the files for one or more [projects](guide/glossary#project). A project is the set of files that comprise a standalone app, a library, or a set of end-to-end (e2e) tests. +You develop applications in the context of an Angular [workspace](guide/glossary#workspace). A workspace contains the files for one or more [projects](guide/glossary#project). A project is the set of files that comprise a standalone application or a shareable library. -The Angular CLI command `ng new ` gets you started. -When you run this command, the CLI installs the necessary Angular npm packages and other dependencies in a new workspace, with a root folder named *project_name*. -It also creates the following workspace and starter project files: +The Angular CLI `ng new` command creates a workspace. -* An initial skeleton app project, also called *project_name* (in the `src/` subfolder). -* An end-to-end test project (in the `e2e/` subfolder). -* Related configuration files. + +ng new <project_name> + -The initial app project contains a simple Welcome app, ready to run. +When you run this command, the CLI installs the necessary Angular npm packages and other dependencies in a new workspace, with a root folder named *project_name*. +The workspace root folder contains workspace configuration files and a README file with generated descriptive text that you can customize. -## Workspace files +By default, `ng new` also creates an initial skeleton application, along with its end-to-end tests. +The skeleton is for a simple Welcome application that is ready to run and easy to modify. +This *root app* has the same name as the workspace, and the source files reside in the `src/` subfolder of the workspace. -The top level of the workspace contains a number of workspace-wide configuration files. +This default behavior is suitable for a development style where each application resides in its own workspace. +It is compatible with earlier Angular versions, which did not support workspaces with [multiple projects](#multiple-projects). + +When you add more projects (apps or libraries) to the workspace, they go into a `projects/` subfolder of the workspace. + +

+ +
Setting up for a multi-project workspace
+ +A multi-project workspace is suitable for an enterprise that uses a single repository and global configuration for all Angular projects (the "mono-repo" model). A multi-project workspace also supports library development. + +If you do intend to have multiple projects in a workspace, you can skip the initial application generation when you create the workspace, and give the workspace a unique name. +The following command creates a workspace with all of the workspace-wide configuration files, but no root application. + + +ng new my-workspace --createApplication="false" + + +You can then generate apps and libraries with names that are unique within the workspace. + + +cd my-workspace +ng generate application my-first-app + + +This first generated application will go into the `projects/` folder along with all other projects in the workspace. +When you create projects this way, the file structure of the workspace is entirely consistent with the structure of the [workspace configuration file](guide/workspace-config). + +
+ +## Workspace configuration files + +All projects within a workspace share a [CLI configuration context](guide/workspace-config). +The top level of the workspace contains workspace-wide configuration files. | WORKSPACE CONFIG FILES | PURPOSE | | :--------------------- | :------------------------------------------| +| `node_modules/` | Provides [npm packages](guide/npm-packages) to the entire workspace. Workspace-wide `node_modules` dependencies are visible to all projects. | | `.editorconfig` | Configuration for code editors. See [EditorConfig](https://editorconfig.org/). | | `.gitignore` | Specifies intentionally untracked files that [Git](https://git-scm.com/) should ignore. | | `angular.json` | CLI configuration defaults for all projects in the workspace, including configuration options for build, serve, and test tools that the CLI uses, such as [TSLint](https://palantir.github.io/tslint/), [Karma](https://karma-runner.github.io/), and [Protractor](http://www.protractortest.org/). For details, see [Angular Workspace Configuration](guide/workspace-config). | -| `node_modules` | Provides [npm packages](guide/npm-packages) to the entire workspace. | -| `package.json` | Configures [npm package dependencies](guide/npm-packages) that are available to all projects in the workspace. See [npm documentation](https://docs.npmjs.com/files/package.json) for the specific format and contents of this file. | -| `package-lock.json` | Provides version information for all packages installed into `node_modules` by the npm client. See [npm documentation](https://docs.npmjs.com/files/package-lock.json) for details. If you use the yarn client, this file will be [yarn.lock](https://yarnpkg.com/lang/en/docs/yarn-lock/) instead. | -| `tsconfig.json` | Default [TypeScript](https://www.typescriptlang.org/) configuration for apps in the workspace, including TypeScript and Angular template compiler options. See [TypeScript Configuration](guide/typescript-configuration). | -| `tslint.json` | Default [TSLint](https://palantir.github.io/tslint/) configuration for apps in the workspace. | -| `README.md` | Introductory documentation. | +| `package.json` | Configures [npm package dependencies](guide/npm-packages) that are available to all projects in the workspace. See [npm documentation](https://docs.npmjs.com/files/package.json) for the specific format and contents of this file. | +| `package-lock.json` | Provides version information for all packages installed into `node_modules` by the npm client. See [npm documentation](https://docs.npmjs.com/files/package-lock.json) for details. If you use the yarn client, this file will be [yarn.lock](https://yarnpkg.com/lang/en/docs/yarn-lock/) instead. | +| `README.md` | Introductory documentation for the root app. | +| `tsconfig.json` | Default [TypeScript](https://www.typescriptlang.org/) configuration for projects in the workspace. | +| `tslint.json` | Default [TSLint](https://palantir.github.io/tslint/) configuration for projects in the workspace. | -All projects within a workspace share a [CLI configuration context](guide/workspace-config). -Project-specific [TypeScript](https://www.typescriptlang.org/) configuration files inherit from the workspace-wide `tsconfig.*.json`, and app-specific [TSLint](https://palantir.github.io/tslint/) configuration files inherit from the workspace-wide `tslint.json`. +## Application project files -### Default app project files +By default, the CLI command `ng new my-app` creates a workspace folder named "my-app" and generates a new application skeleton for a root application at the top level of the workspace. +A newly generated application contains source files for a root module, with a root component and template. -The CLI command `ng new my-app` creates a workspace folder named "my-app" and generates a new app skeleton. -This initial app is the *default app* for CLI commands (unless you change the default after creating additional apps). - -A newly generated app contains the source files for a root module, with a root component and template. -When the workspace file structure is in place, you can use the `ng generate` command on the command line to add functionality and data to the initial app. +When the workspace file structure is in place, you can use the `ng generate` command on the command line to add functionality and data to the application. +This initial starter application is the *default app* for CLI commands (unless you change the default after creating [additional apps](#multiple-projects)).
@@ -45,69 +76,89 @@ When the workspace file structure is in place, you can use the `ng generate` com
-The `src/` subfolder contains the source files (app logic, data, and assets), along with configuration files for the initial app. -Workspace-wide `node_modules` dependencies are visible to this project. +For a single-application workspace, the `src/` subfolder of the workspace contains the source files (application logic, data, and assets) for the root application. +For a multi-project workspace, additional projects in the `projects/` folder contain a `project-name/src/` subfolder with the same structure. -| APP SOURCE & CONFIG FILES | PURPOSE | +### Application source files + +Files at the top level of `src/` support testing and running your application. Subfolders contain the application source and application-specific configuration. + +| APP SUPPORT FILES | PURPOSE | | :--------------------- | :------------------------------------------| -| `app/` | Contains the component files in which your app logic and data are defined. See details in [App source folder](#app-src) below. | -| `assets/` | Contains image files and other asset files to be copied as-is when you build your application. | +| `app/` | Contains the component files in which your application logic and data are defined. See details [below](#app-src). | +| `assets/` | Contains image and other asset files to be copied as-is when you build your application. | | `environments/` | Contains build configuration options for particular target environments. By default there is an unnamed standard development environment and a production ("prod") environment. You can define additional target environment configurations. | -| `browserslist` | Configures sharing of target browsers and Node.js versions among various front-end tools. See [Browserslist on GitHub](https://github.com/browserslist/browserslist) for more information. | -| `favicon.ico` | An icon to use for this app in the bookmark bar. | +| `favicon.ico` | An icon to use for this application in the bookmark bar. | | `index.html` | The main HTML page that is served when someone visits your site. The CLI automatically adds all JavaScript and CSS files when building your app, so you typically don't need to add any ``); expect(s.lastSanitizedValue).toEqual(outputValue); }); @@ -539,7 +541,7 @@ describe('instructions', () => { const inputValue = s.bypassSecurityTrustResourceUrl('file://all-my-secrets.pdf'); const outputValue = 'file://all-my-secrets.pdf'; - t.update(() => elementAttribute(0, 'src', inputValue, sanitizeResourceUrl)); + t.update(() => ΔelementAttribute(0, 'src', inputValue, ΔsanitizeResourceUrl)); expect(t.html).toEqual(``); expect(s.lastSanitizedValue).toBeFalsy(); }); @@ -550,7 +552,7 @@ describe('instructions', () => { const inputValue = bypassSanitizationTrustResourceUrl('file://all-my-secrets.pdf'); const outputValue = 'file://all-my-secrets.pdf-ivy'; - t.update(() => elementAttribute(0, 'src', inputValue, sanitizeResourceUrl)); + t.update(() => ΔelementAttribute(0, 'src', inputValue, ΔsanitizeResourceUrl)); expect(t.html).toEqual(``); expect(s.lastSanitizedValue).toBeFalsy(); }); @@ -561,7 +563,7 @@ describe('instructions', () => { const inputValue = 'fn();'; const outputValue = 'fn(); //sanitized'; - t.update(() => elementProperty(0, 'innerHTML', inputValue, sanitizeScript)); + t.update(() => ΔelementProperty(0, 'innerHTML', inputValue, ΔsanitizeScript)); expect(t.html).toEqual(``); expect(s.lastSanitizedValue).toEqual(outputValue); }); @@ -572,7 +574,7 @@ describe('instructions', () => { const inputValue = s.bypassSecurityTrustScript('alert("bar")'); const outputValue = 'alert("bar")'; - t.update(() => elementProperty(0, 'innerHTML', inputValue, sanitizeScript)); + t.update(() => ΔelementProperty(0, 'innerHTML', inputValue, ΔsanitizeScript)); expect(t.html).toEqual(``); expect(s.lastSanitizedValue).toBeFalsy(); }); @@ -583,7 +585,7 @@ describe('instructions', () => { const inputValue = bypassSanitizationTrustScript('alert("bar")'); const outputValue = 'alert("bar")-ivy'; - t.update(() => elementProperty(0, 'innerHTML', inputValue, sanitizeScript)); + t.update(() => ΔelementProperty(0, 'innerHTML', inputValue, ΔsanitizeScript)); expect(t.html).toEqual(``); expect(s.lastSanitizedValue).toBeFalsy(); }); @@ -594,7 +596,7 @@ describe('instructions', () => { const inputValue = '
'; const outputValue = '
'; - t.update(() => elementProperty(0, 'innerHTML', inputValue, sanitizeHtml)); + t.update(() => ΔelementProperty(0, 'innerHTML', inputValue, ΔsanitizeHtml)); expect(t.html).toEqual(`
${outputValue}
`); expect(s.lastSanitizedValue).toEqual(outputValue); }); @@ -605,7 +607,7 @@ describe('instructions', () => { const inputValue = s.bypassSecurityTrustHtml('
'); const outputValue = '
'; - t.update(() => elementProperty(0, 'innerHTML', inputValue, sanitizeHtml)); + t.update(() => ΔelementProperty(0, 'innerHTML', inputValue, ΔsanitizeHtml)); expect(t.html).toEqual(`
${outputValue}
`); expect(s.lastSanitizedValue).toBeFalsy(); }); @@ -616,7 +618,7 @@ describe('instructions', () => { const inputValue = bypassSanitizationTrustHtml('
'); const outputValue = '
-ivy'; - t.update(() => elementProperty(0, 'innerHTML', inputValue, sanitizeHtml)); + t.update(() => ΔelementProperty(0, 'innerHTML', inputValue, ΔsanitizeHtml)); expect(t.html).toEqual(`
${outputValue}
`); expect(s.lastSanitizedValue).toBeFalsy(); }); @@ -661,7 +663,7 @@ class LocalMockSanitizer implements Sanitizer { class MockSanitizerInterceptor { public lastValue: string|null = null; constructor(private _interceptorFn?: ((value: any) => any)|null) {} - getStyleSanitizer() { return defaultStyleSanitizer; } + getStyleSanitizer() { return ΔdefaultStyleSanitizer; } sanitize(context: SecurityContext, value: LocalSanitizedValue|string|null|any): string|null { if (this._interceptorFn) { this._interceptorFn(value); diff --git a/packages/core/test/render3/integration_spec.ts b/packages/core/test/render3/integration_spec.ts index 008d18e935..8e7547cb29 100644 --- a/packages/core/test/render3/integration_spec.ts +++ b/packages/core/test/render3/integration_spec.ts @@ -9,21 +9,20 @@ import {ElementRef, TemplateRef, ViewContainerRef} from '@angular/core'; import {RendererType2} from '../../src/render/api'; -import {AttributeMarker, defineComponent, defineDirective, templateRefExtractor} from '../../src/render3/index'; - -import {allocHostVars, bind, container, containerRefreshEnd, containerRefreshStart, elementStart, elementAttribute, elementClassProp, elementContainerEnd, elementContainerStart, elementEnd, elementProperty, element, elementStyling, elementStylingApply, elementStyleProp, embeddedViewEnd, embeddedViewStart, interpolation1, interpolation2, interpolation3, interpolation4, interpolation5, interpolation6, interpolation7, interpolation8, interpolationV, projection, projectionDef, reference, text, textBinding, template, elementStylingMap, directiveInject, elementHostAttrs, elementHostStyleProp, elementHostStyling, elementHostClassProp, elementHostStylingApply, elementHostStylingMap} from '../../src/render3/instructions/all'; +import {getLContext} from '../../src/render3/context_discovery'; +import {AttributeMarker, ΔdefineComponent, ΔdefineDirective, ΔtemplateRefExtractor} from '../../src/render3/index'; +import {ΔallocHostVars, Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, ΔdirectiveInject, Δelement, ΔelementAttribute, ΔelementClassProp, ΔelementContainerEnd, ΔelementContainerStart, ΔelementEnd, ΔelementHostAttrs, ΔelementHostClassProp, ΔelementHostStyleProp, ΔelementHostStyling, ΔelementHostStylingApply, ΔelementHostStylingMap, ΔelementProperty, ΔelementStart, ΔelementStyleProp, ΔelementStyling, ΔelementStylingApply, ΔelementStylingMap, ΔembeddedViewEnd, ΔembeddedViewStart, Δinterpolation1, Δinterpolation2, Δinterpolation3, Δinterpolation4, Δinterpolation5, Δinterpolation6, Δinterpolation7, Δinterpolation8, ΔinterpolationV, Δprojection, ΔprojectionDef, Δreference, Δtemplate, Δtext, ΔtextBinding} from '../../src/render3/instructions/all'; +import {MONKEY_PATCH_KEY_NAME} from '../../src/render3/interfaces/context'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {RElement, Renderer3, RendererFactory3, domRendererFactory3} from '../../src/render3/interfaces/renderer'; -import {HEADER_OFFSET, CONTEXT} from '../../src/render3/interfaces/view'; -import {enableBindings, disableBindings} from '../../src/render3/state'; -import {sanitizeUrl} from '../../src/sanitization/sanitization'; +import {StylingIndex} from '../../src/render3/interfaces/styling'; +import {CONTEXT, HEADER_OFFSET} from '../../src/render3/interfaces/view'; +import {ΔdisableBindings, ΔenableBindings} from '../../src/render3/state'; +import {ΔsanitizeUrl} from '../../src/sanitization/sanitization'; import {Sanitizer, SecurityContext} from '../../src/sanitization/security'; import {NgIf} from './common_with_def'; import {ComponentFixture, MockRendererFactory, TemplateFixture, createComponent, renderToHtml} from './render_util'; -import {getLContext} from '../../src/render3/context_discovery'; -import {StylingIndex} from '../../src/render3/interfaces/styling'; -import {MONKEY_PATCH_KEY_NAME} from '../../src/render3/interfaces/context'; describe('render3 integration test', () => { @@ -34,9 +33,9 @@ describe('render3 integration test', () => { function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'span', ['title', 'Hello']); - { text(1, 'Greetings'); } - elementEnd(); + ΔelementStart(0, 'span', ['title', 'Hello']); + { Δtext(1, 'Greetings'); } + ΔelementEnd(); } } expect(ngDevMode).toHaveProperties({ @@ -50,12 +49,12 @@ describe('render3 integration test', () => { it('should render and update basic "Hello, World" template', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'h1'); - { text(1); } - elementEnd(); + ΔelementStart(0, 'h1'); + { Δtext(1); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - textBinding(1, interpolation1('Hello, ', ctx.name, '!')); + ΔtextBinding(1, Δinterpolation1('Hello, ', ctx.name, '!')); } }, 2, 1); @@ -74,10 +73,10 @@ describe('render3 integration test', () => { it('should render "undefined" as "" when used with `bind()`', () => { function Template(rf: RenderFlags, name: string) { if (rf & RenderFlags.Create) { - text(0); + Δtext(0); } if (rf & RenderFlags.Update) { - textBinding(0, bind(name)); + ΔtextBinding(0, Δbind(name)); } } @@ -94,10 +93,10 @@ describe('render3 integration test', () => { it('should render "null" as "" when used with `bind()`', () => { function Template(rf: RenderFlags, name: string) { if (rf & RenderFlags.Create) { - text(0); + Δtext(0); } if (rf & RenderFlags.Update) { - textBinding(0, bind(name)); + ΔtextBinding(0, Δbind(name)); } } @@ -114,8 +113,8 @@ describe('render3 integration test', () => { it('should support creation-time values in text nodes', () => { function Template(rf: RenderFlags, value: string) { if (rf & RenderFlags.Create) { - text(0); - textBinding(0, value); + Δtext(0); + ΔtextBinding(0, value); } } expect(renderToHtml(Template, 'once', 1, 1)).toEqual('once'); @@ -141,18 +140,18 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'b', ['id', 'my-id'], ['myRef', '']); - disableBindings(); - elementStart(2, 'i'); - text(3, 'Hello {{ name }}!'); - elementEnd(); - enableBindings(); - elementEnd(); - text(4); + ΔelementStart(0, 'b', ['id', 'my-id'], ['myRef', '']); + ΔdisableBindings(); + ΔelementStart(2, 'i'); + Δtext(3, 'Hello {{ name }}!'); + ΔelementEnd(); + ΔenableBindings(); + ΔelementEnd(); + Δtext(4); } if (rf & RenderFlags.Update) { - const ref = reference(1) as any; - textBinding(4, interpolation1(' ', ref.id, ' ')); + const ref = Δreference(1) as any; + ΔtextBinding(4, Δinterpolation1(' ', ref.id, ' ')); } }, 5, 1); @@ -166,7 +165,7 @@ describe('render3 integration test', () => { class TestDirective { ngOnInit() { directiveInvoked = true; } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: TestDirective, selectors: [['', 'directive', '']], factory: () => new TestDirective() @@ -180,13 +179,13 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'b', ['directive', '']); - disableBindings(); - elementStart(1, 'i'); - text(2, 'Hello {{ name }}!'); - elementEnd(); - enableBindings(); - elementEnd(); + ΔelementStart(0, 'b', ['directive', '']); + ΔdisableBindings(); + ΔelementStart(1, 'i'); + Δtext(2, 'Hello {{ name }}!'); + ΔelementEnd(); + ΔenableBindings(); + ΔelementEnd(); } }, 3, 0, [TestDirective]); @@ -201,7 +200,7 @@ describe('render3 integration test', () => { class TestDirective { ngOnInit() { directiveInvoked = true; } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: TestDirective, selectors: [['', 'directive', '']], factory: () => new TestDirective() @@ -215,13 +214,13 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'b'); - disableBindings(); - elementStart(1, 'i', ['directive', '']); - text(2, 'Hello {{ name }}!'); - elementEnd(); - enableBindings(); - elementEnd(); + ΔelementStart(0, 'b'); + ΔdisableBindings(); + ΔelementStart(1, 'i', ['directive', '']); + Δtext(2, 'Hello {{ name }}!'); + ΔelementEnd(); + ΔenableBindings(); + ΔelementEnd(); } }, 3, 0, [TestDirective]); @@ -235,12 +234,12 @@ describe('render3 integration test', () => { it('should handle a flat list of static/bound text nodes', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'Hello '); - text(1); - text(2, '!'); + Δtext(0, 'Hello '); + Δtext(1); + Δtext(2, '!'); } if (rf & RenderFlags.Update) { - textBinding(1, bind(ctx.name)); + ΔtextBinding(1, Δbind(ctx.name)); } }, 3, 1); @@ -257,16 +256,16 @@ describe('render3 integration test', () => { it('should handle a list of static/bound text nodes as element children', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'b'); + ΔelementStart(0, 'b'); { - text(1, 'Hello '); - text(2); - text(3, '!'); + Δtext(1, 'Hello '); + Δtext(2); + Δtext(3, '!'); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - textBinding(2, bind(ctx.name)); + ΔtextBinding(2, Δbind(ctx.name)); } }, 4, 1); @@ -283,24 +282,24 @@ describe('render3 integration test', () => { it('should render/update text node as a child of a deep list of elements', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'b'); + ΔelementStart(0, 'b'); { - elementStart(1, 'b'); + ΔelementStart(1, 'b'); { - elementStart(2, 'b'); + ΔelementStart(2, 'b'); { - elementStart(3, 'b'); - { text(4); } - elementEnd(); + ΔelementStart(3, 'b'); + { Δtext(4); } + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - textBinding(4, interpolation1('Hello ', ctx.name, '!')); + ΔtextBinding(4, Δinterpolation1('Hello ', ctx.name, '!')); } }, 5, 1); @@ -317,17 +316,17 @@ describe('render3 integration test', () => { it('should update 2 sibling elements', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'b'); + ΔelementStart(0, 'b'); { - element(1, 'span'); - elementStart(2, 'span', ['class', 'foo']); + Δelement(1, 'span'); + ΔelementStart(2, 'span', ['class', 'foo']); {} - elementEnd(); + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementAttribute(2, 'id', bind(ctx.id)); + ΔelementAttribute(2, 'id', Δbind(ctx.id)); } }, 3, 1); @@ -344,10 +343,10 @@ describe('render3 integration test', () => { it('should handle sibling text node after element with child text node', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'p'); - { text(1, 'hello'); } - elementEnd(); - text(2, 'world'); + ΔelementStart(0, 'p'); + { Δtext(1, 'hello'); } + ΔelementEnd(); + Δtext(2, 'world'); } }, 3); @@ -361,22 +360,22 @@ describe('render3 integration test', () => { class TodoComponent { value = ' one'; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: TodoComponent, selectors: [['todo']], consts: 3, vars: 1, template: function TodoTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'p'); + ΔelementStart(0, 'p'); { - text(1, 'Todo'); - text(2); + Δtext(1, 'Todo'); + Δtext(2); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - textBinding(2, bind(ctx.value)); + ΔtextBinding(2, Δbind(ctx.value)); } }, factory: () => new TodoComponent @@ -388,7 +387,7 @@ describe('render3 integration test', () => { it('should support a basic component template', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'todo'); + Δelement(0, 'todo'); } }, 1, 0, defs); @@ -399,8 +398,8 @@ describe('render3 integration test', () => { it('should support a component template with sibling', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'todo'); - text(1, 'two'); + Δelement(0, 'todo'); + Δtext(1, 'two'); } }, 2, 0, defs); @@ -415,8 +414,8 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'todo'); - element(1, 'todo'); + Δelement(0, 'todo'); + Δelement(1, 'todo'); } }, 2, 0, defs); @@ -429,7 +428,7 @@ describe('render3 integration test', () => { class TodoComponentHostBinding { title = 'one'; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: TodoComponentHostBinding, selectors: [['todo']], consts: 1, @@ -437,20 +436,20 @@ describe('render3 integration test', () => { template: function TodoComponentHostBindingTemplate( rf: RenderFlags, ctx: TodoComponentHostBinding) { if (rf & RenderFlags.Create) { - text(0); + Δtext(0); } if (rf & RenderFlags.Update) { - textBinding(0, bind(ctx.title)); + ΔtextBinding(0, Δbind(ctx.title)); } }, factory: () => cmptInstance = new TodoComponentHostBinding, hostBindings: function(rf: RenderFlags, ctx: any, elementIndex: number): void { if (rf & RenderFlags.Create) { - allocHostVars(1); + ΔallocHostVars(1); } if (rf & RenderFlags.Update) { // host bindings - elementProperty(elementIndex, 'title', bind(ctx.title)); + ΔelementProperty(elementIndex, 'title', Δbind(ctx.title)); } } }); @@ -458,7 +457,7 @@ describe('render3 integration test', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'todo'); + Δelement(0, 'todo'); } }, 1, 0, [TodoComponentHostBinding]); @@ -472,7 +471,7 @@ describe('render3 integration test', () => { it('should support root component with host attribute', () => { class HostAttributeComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: HostAttributeComp, selectors: [['host-attr-comp']], factory: () => new HostAttributeComp(), @@ -480,7 +479,7 @@ describe('render3 integration test', () => { vars: 0, hostBindings: function(rf, ctx, elIndex) { if (rf & RenderFlags.Create) { - elementHostAttrs(['role', 'button']); + ΔelementHostAttrs(['role', 'button']); } }, template: (rf: RenderFlags, ctx: HostAttributeComp) => {}, @@ -495,19 +494,19 @@ describe('render3 integration test', () => { /**

{{ name }}

*/ class MyComp { name = 'Bess'; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyComp, selectors: [['comp']], consts: 2, vars: 1, template: function MyCompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'p'); - { text(1); } - elementEnd(); + ΔelementStart(0, 'p'); + { Δtext(1); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - textBinding(1, bind(ctx.name)); + ΔtextBinding(1, Δbind(ctx.name)); } }, factory: () => new MyComp @@ -516,7 +515,7 @@ describe('render3 integration test', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } }, 1, 0, [MyComp]); @@ -533,29 +532,29 @@ describe('render3 integration test', () => { class MyComp { // TODO(issue/24571): remove '!'. condition !: boolean; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyComp, selectors: [['comp']], consts: 1, vars: 0, template: function MyCompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 2, 0); + let rf1 = ΔembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'div'); - { text(1, 'text'); } - elementEnd(); + ΔelementStart(0, 'div'); + { Δtext(1, 'text'); } + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, factory: () => new MyComp, @@ -566,10 +565,10 @@ describe('render3 integration test', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'condition', bind(ctx.condition)); + ΔelementProperty(0, 'condition', Δbind(ctx.condition)); } }, 1, 1, [MyComp]); @@ -592,18 +591,18 @@ describe('render3 integration test', () => { *
before|Greetings|after
*/ function Template() { - elementStart(0, 'div'); + ΔelementStart(0, 'div'); { - text(1, 'before|'); - elementContainerStart(2); + Δtext(1, 'before|'); + ΔelementContainerStart(2); { - text(3, 'Greetings'); - element(4, 'span'); + Δtext(3, 'Greetings'); + Δelement(4, 'span'); } - elementContainerEnd(); - text(5, '|after'); + ΔelementContainerEnd(); + Δtext(5, '|after'); } - elementEnd(); + ΔelementEnd(); } const fixture = new TemplateFixture(Template, () => {}, 6); @@ -620,26 +619,26 @@ describe('render3 integration test', () => { */ const TestCmpt = createComponent('test-cmpt', function(rf: RenderFlags, ctx: {value: any}) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); if (ctx.value) { - let rf1 = embeddedViewStart(0, 3, 0); + let rf1 = ΔembeddedViewStart(0, 3, 0); { if (rf1 & RenderFlags.Create) { - elementStart(0, 'div'); + ΔelementStart(0, 'div'); { - elementContainerStart(1); - { text(2, 'content'); } - elementContainerEnd(); + ΔelementContainerStart(1); + { Δtext(2, 'content'); } + ΔelementContainerEnd(); } - elementEnd(); + ΔelementEnd(); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1); @@ -665,22 +664,22 @@ describe('render3 integration test', () => { const TestCmpt = createComponent('test-cmpt', function(rf: RenderFlags, ctx: {value: any}) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); if (ctx.value) { - let rf1 = embeddedViewStart(0, 2, 0); + let rf1 = ΔembeddedViewStart(0, 2, 0); { if (rf1 & RenderFlags.Create) { - elementContainerStart(0); - { text(1, 'content'); } - elementContainerEnd(); + ΔelementContainerStart(0); + { Δtext(1, 'content'); } + ΔelementContainerEnd(); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1); @@ -701,9 +700,9 @@ describe('render3 integration test', () => { function ngIfTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementContainerStart(0); - { text(1, 'content'); } - elementContainerEnd(); + ΔelementContainerStart(0); + { Δtext(1, 'content'); } + ΔelementContainerEnd(); } } @@ -721,10 +720,11 @@ describe('render3 integration test', () => { const TestCmpt = createComponent('test-cmpt', function(rf: RenderFlags, ctx: {value: any}) { if (rf & RenderFlags.Create) { - template(0, ngIfTemplate, 2, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); + Δtemplate( + 0, ngIfTemplate, 2, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'ngIf', bind(ctx.value)); + ΔelementProperty(0, 'ngIf', Δbind(ctx.value)); } }, 1, 1, [NgIf]); @@ -751,21 +751,21 @@ describe('render3 integration test', () => { clear() { this._vcRef.clear(); } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: TestDirective, selectors: [['', 'testDirective', '']], - factory: - () => testDirective = new TestDirective( - directiveInject(TemplateRef as any), directiveInject(ViewContainerRef as any)), + factory: () => testDirective = new TestDirective( + ΔdirectiveInject(TemplateRef as any), + ΔdirectiveInject(ViewContainerRef as any)), }); } function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementContainerStart(0); - { text(1, 'content'); } - elementContainerEnd(); + ΔelementContainerStart(0); + { Δtext(1, 'content'); } + ΔelementContainerEnd(); } } @@ -779,7 +779,7 @@ describe('render3 integration test', () => { `; const TestCmpt = createComponent('test-cmpt', function(rf: RenderFlags) { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, embeddedTemplate, 2, 0, 'ng-template', [AttributeMarker.Bindings, 'testDirective']); } @@ -803,13 +803,13 @@ describe('render3 integration test', () => { */ const TestCmpt = createComponent('test-cmpt', function(rf: RenderFlags) { if (rf & RenderFlags.Create) { - elementContainerStart(0); - { text(1, 'component template'); } - elementContainerEnd(); + ΔelementContainerStart(0); + { Δtext(1, 'component template'); } + ΔelementContainerEnd(); } }, 2); - function App() { element(0, 'test-cmpt'); } + function App() { Δelement(0, 'test-cmpt'); } const fixture = new TemplateFixture(App, () => {}, 1, 0, [TestCmpt]); expect(fixture.html).toEqual('component template'); @@ -827,21 +827,21 @@ describe('render3 integration test', () => { */ const TestCmpt = createComponent('test-cmpt', function(rf: RenderFlags) { if (rf & RenderFlags.Create) { - elementContainerStart(0); + ΔelementContainerStart(0); { - elementContainerStart(1); + ΔelementContainerStart(1); { - elementContainerStart(2); - { text(3, 'content'); } - elementContainerEnd(); + ΔelementContainerStart(2); + { Δtext(3, 'content'); } + ΔelementContainerEnd(); } - elementContainerEnd(); + ΔelementContainerEnd(); } - elementContainerEnd(); + ΔelementContainerEnd(); } }, 4); - function App() { element(0, 'test-cmpt'); } + function App() { Δelement(0, 'test-cmpt'); } const fixture = new TemplateFixture(App, () => {}, 1, 0, [TestCmpt]); expect(fixture.html).toEqual('content'); @@ -857,29 +857,29 @@ describe('render3 integration test', () => { clear() { this._vcRef.clear(); } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: TestDirective, selectors: [['', 'testDirective', '']], factory: () => testDirective = new TestDirective( - directiveInject(TemplateRef as any), directiveInject(ViewContainerRef as any)), + ΔdirectiveInject(TemplateRef as any), ΔdirectiveInject(ViewContainerRef as any)), }); } function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementContainerStart(0); + ΔelementContainerStart(0); { - elementContainerStart(1); + ΔelementContainerStart(1); { - elementContainerStart(2); - { text(3, 'content'); } - elementContainerEnd(); + ΔelementContainerStart(2); + { Δtext(3, 'content'); } + ΔelementContainerEnd(); } - elementContainerEnd(); + ΔelementContainerEnd(); } - elementContainerEnd(); + ΔelementContainerEnd(); } } @@ -896,13 +896,13 @@ describe('render3 integration test', () => { */ const TestCmpt = createComponent('test-cmpt', function(rf: RenderFlags) { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, embeddedTemplate, 4, 0, 'ng-template', [AttributeMarker.Bindings, 'testDirective']); } }, 1, 0, [TestDirective]); - function App() { element(0, 'test-cmpt'); } + function App() { Δelement(0, 'test-cmpt'); } const fixture = new ComponentFixture(TestCmpt); expect(fixture.html).toEqual(''); @@ -925,10 +925,10 @@ describe('render3 integration test', () => { class Directive { constructor(public elRef: ElementRef) {} - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: Directive, selectors: [['', 'dir', '']], - factory: () => directive = new Directive(directiveInject(ElementRef)), + factory: () => directive = new Directive(ΔdirectiveInject(ElementRef)), }); } @@ -938,12 +938,12 @@ describe('render3 integration test', () => { *
*/ function Template() { - elementStart(0, 'div'); + ΔelementStart(0, 'div'); { - elementContainerStart(1, [AttributeMarker.Bindings, 'dir']); - elementContainerEnd(); + ΔelementContainerStart(1, [AttributeMarker.Bindings, 'dir']); + ΔelementContainerEnd(); } - elementEnd(); + ΔelementEnd(); } const fixture = new TemplateFixture(Template, () => {}, 2, 0, [Directive]); @@ -955,7 +955,7 @@ describe('render3 integration test', () => { function ContentTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'Content'); + Δtext(0, 'Content'); } } @@ -968,10 +968,10 @@ describe('render3 integration test', () => { clear() { this._vcRef.clear(); } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: Directive, selectors: [['', 'dir', '']], - factory: () => directive = new Directive(directiveInject(ViewContainerRef as any)), + factory: () => directive = new Directive(ΔdirectiveInject(ViewContainerRef as any)), inputs: {contentTpl: 'contentTpl'}, }); } @@ -985,14 +985,15 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags) { if (rf & RenderFlags.Create) { - elementContainerStart(0, [AttributeMarker.Bindings, 'dir']); - template( - 1, ContentTemplate, 1, 0, 'ng-template', null, ['content', ''], templateRefExtractor); - elementContainerEnd(); + ΔelementContainerStart(0, [AttributeMarker.Bindings, 'dir']); + Δtemplate( + 1, ContentTemplate, 1, 0, 'ng-template', null, ['content', ''], + ΔtemplateRefExtractor); + ΔelementContainerEnd(); } if (rf & RenderFlags.Update) { - const content = reference(2) as any; - elementProperty(0, 'contentTpl', bind(content)); + const content = Δreference(2) as any; + ΔelementProperty(0, 'contentTpl', Δbind(content)); } }, 3, 1, [Directive]); @@ -1012,7 +1013,7 @@ describe('render3 integration test', () => { it('should support ViewContainerRef on inside ', () => { function ContentTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'Content'); + Δtext(0, 'Content'); } } @@ -1023,12 +1024,12 @@ describe('render3 integration test', () => { clear() { this._vcRef.clear(); } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: Directive, selectors: [['', 'dir', '']], factory: () => directive = new Directive( - directiveInject(TemplateRef as any), directiveInject(ViewContainerRef as any)), + ΔdirectiveInject(TemplateRef as any), ΔdirectiveInject(ViewContainerRef as any)), }); } @@ -1041,11 +1042,11 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags) { if (rf & RenderFlags.Create) { - elementContainerStart(0); - template( + ΔelementContainerStart(0); + Δtemplate( 1, ContentTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'dir'], [], - templateRefExtractor); - elementContainerEnd(); + ΔtemplateRefExtractor); + ΔelementContainerEnd(); } }, 2, 0, [Directive]); @@ -1067,12 +1068,12 @@ describe('render3 integration test', () => { *
*/ function Template() { - elementStart(0, 'div'); + ΔelementStart(0, 'div'); { - elementContainerStart(1, ['id', 'foo']); - elementContainerEnd(); + ΔelementContainerStart(1, ['id', 'foo']); + ΔelementContainerEnd(); } - elementEnd(); + ΔelementEnd(); } const fixture = new TemplateFixture(Template, () => {}, 2); @@ -1096,56 +1097,56 @@ describe('render3 integration test', () => { function showLabel(rf: RenderFlags, ctx: {label: string | undefined}) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.label != null) { - let rf1 = embeddedViewStart(0, 1, 1); + let rf1 = ΔembeddedViewStart(0, 1, 1); if (rf1 & RenderFlags.Create) { - text(0); + Δtext(0); } if (rf1 & RenderFlags.Update) { - textBinding(0, bind(ctx.label)); + ΔtextBinding(0, Δbind(ctx.label)); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } function showTree(rf: RenderFlags, ctx: {tree: Tree}) { if (rf & RenderFlags.Create) { - container(0); - container(1); - container(2); + Δcontainer(0); + Δcontainer(1); + Δcontainer(2); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { - const rf0 = embeddedViewStart(0, 1, 0); + const rf0 = ΔembeddedViewStart(0, 1, 0); { showLabel(rf0, {label: ctx.tree.beforeLabel}); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } - containerRefreshEnd(); - containerRefreshStart(1); + ΔcontainerRefreshEnd(); + ΔcontainerRefreshStart(1); { for (let subTree of ctx.tree.subTrees || []) { - const rf0 = embeddedViewStart(0, 3, 0); + const rf0 = ΔembeddedViewStart(0, 3, 0); { showTree(rf0, {tree: subTree}); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); - containerRefreshStart(2); + ΔcontainerRefreshEnd(); + ΔcontainerRefreshStart(2); { - const rf0 = embeddedViewStart(0, 1, 0); + const rf0 = ΔembeddedViewStart(0, 1, 0); { showLabel(rf0, {label: ctx.tree.afterLabel}); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -1154,7 +1155,7 @@ describe('render3 integration test', () => { beforeTree !: Tree; // TODO(issue/24571): remove '!'. afterTree !: Tree; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ selectors: [['child']], type: ChildComponent, consts: 3, @@ -1162,26 +1163,26 @@ describe('render3 integration test', () => { template: function ChildComponentTemplate( rf: RenderFlags, ctx: {beforeTree: Tree, afterTree: Tree}) { if (rf & RenderFlags.Create) { - projectionDef(); - container(0); - projection(1); - container(2); + ΔprojectionDef(); + Δcontainer(0); + Δprojection(1); + Δcontainer(2); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { - const rf0 = embeddedViewStart(0, 3, 0); + const rf0 = ΔembeddedViewStart(0, 3, 0); { showTree(rf0, {tree: ctx.beforeTree}); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } - containerRefreshEnd(); - containerRefreshStart(2); + ΔcontainerRefreshEnd(); + ΔcontainerRefreshStart(2); { - const rf0 = embeddedViewStart(0, 3, 0); + const rf0 = ΔembeddedViewStart(0, 3, 0); { showTree(rf0, {tree: ctx.afterTree}); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, factory: () => new ChildComponent, @@ -1191,20 +1192,20 @@ describe('render3 integration test', () => { function parentTemplate(rf: RenderFlags, ctx: ParentCtx) { if (rf & RenderFlags.Create) { - elementStart(0, 'child'); - { container(1); } - elementEnd(); + ΔelementStart(0, 'child'); + { Δcontainer(1); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'beforeTree', bind(ctx.beforeTree)); - elementProperty(0, 'afterTree', bind(ctx.afterTree)); - containerRefreshStart(1); + ΔelementProperty(0, 'beforeTree', Δbind(ctx.beforeTree)); + ΔelementProperty(0, 'afterTree', Δbind(ctx.afterTree)); + ΔcontainerRefreshStart(1); { - const rf0 = embeddedViewStart(0, 3, 0); + const rf0 = ΔembeddedViewStart(0, 3, 0); { showTree(rf0, {tree: ctx.projectedTree}); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -1237,10 +1238,10 @@ describe('render3 integration test', () => { it('should support attribute bindings', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'span'); + Δelement(0, 'span'); } if (rf & RenderFlags.Update) { - elementAttribute(0, 'title', bind(ctx.title)); + ΔelementAttribute(0, 'title', Δbind(ctx.title)); } }, 1, 1); @@ -1264,10 +1265,10 @@ describe('render3 integration test', () => { it('should stringify values used attribute bindings', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'span'); + Δelement(0, 'span'); } if (rf & RenderFlags.Update) { - elementAttribute(0, 'title', bind(ctx.title)); + ΔelementAttribute(0, 'title', Δbind(ctx.title)); } }, 1, 1); @@ -1284,29 +1285,29 @@ describe('render3 integration test', () => { it('should update bindings', () => { function Template(rf: RenderFlags, c: any) { if (rf & RenderFlags.Create) { - element(0, 'b'); + Δelement(0, 'b'); } if (rf & RenderFlags.Update) { - elementAttribute(0, 'a', interpolationV(c)); - elementAttribute(0, 'a0', bind(c[1])); - elementAttribute(0, 'a1', interpolation1(c[0], c[1], c[16])); - elementAttribute(0, 'a2', interpolation2(c[0], c[1], c[2], c[3], c[16])); - elementAttribute(0, 'a3', interpolation3(c[0], c[1], c[2], c[3], c[4], c[5], c[16])); - elementAttribute( - 0, 'a4', interpolation4(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[16])); - elementAttribute( + ΔelementAttribute(0, 'a', ΔinterpolationV(c)); + ΔelementAttribute(0, 'a0', Δbind(c[1])); + ΔelementAttribute(0, 'a1', Δinterpolation1(c[0], c[1], c[16])); + ΔelementAttribute(0, 'a2', Δinterpolation2(c[0], c[1], c[2], c[3], c[16])); + ΔelementAttribute(0, 'a3', Δinterpolation3(c[0], c[1], c[2], c[3], c[4], c[5], c[16])); + ΔelementAttribute( + 0, 'a4', Δinterpolation4(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[16])); + ΔelementAttribute( 0, 'a5', - interpolation5(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[16])); - elementAttribute( - 0, 'a6', interpolation6( + Δinterpolation5(c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[16])); + ΔelementAttribute( + 0, 'a6', Δinterpolation6( c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[10], c[11], c[16])); - elementAttribute( - 0, 'a7', interpolation7( + ΔelementAttribute( + 0, 'a7', Δinterpolation7( c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[10], c[11], c[12], c[13], c[16])); - elementAttribute( - 0, 'a8', interpolation8( + ΔelementAttribute( + 0, 'a8', Δinterpolation8( c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7], c[8], c[9], c[10], c[11], c[12], c[13], c[14], c[15], c[16])); } @@ -1330,30 +1331,30 @@ describe('render3 integration test', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'span'); - container(1); - elementEnd(); + ΔelementStart(0, 'span'); + Δcontainer(1); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementAttribute(0, 'title', bind(ctx.title)); - containerRefreshStart(1); + ΔelementAttribute(0, 'title', Δbind(ctx.title)); + ΔcontainerRefreshStart(1); { if (true) { - let rf1 = embeddedViewStart(1, 1, 1); + let rf1 = ΔembeddedViewStart(1, 1, 1); { if (rf1 & RenderFlags.Create) { - elementStart(0, 'b'); + ΔelementStart(0, 'b'); {} - elementEnd(); + ΔelementEnd(); } if (rf1 & RenderFlags.Update) { - elementAttribute(0, 'title', bind(ctx.title)); + ΔelementAttribute(0, 'title', Δbind(ctx.title)); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 2, 1); @@ -1381,7 +1382,7 @@ describe('render3 integration test', () => { /* @HostBinding('attr.aria-label') */ label = 'some label'; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: HostBindingDir, selectors: [['', 'hostBindingDir', '']], factory: function HostBindingDir_Factory() { @@ -1390,10 +1391,10 @@ describe('render3 integration test', () => { hostBindings: function HostBindingDir_HostBindings( rf: RenderFlags, ctx: any, elIndex: number) { if (rf & RenderFlags.Create) { - allocHostVars(1); + ΔallocHostVars(1); } if (rf & RenderFlags.Update) { - elementAttribute(elIndex, 'aria-label', bind(ctx.label)); + ΔelementAttribute(elIndex, 'aria-label', Δbind(ctx.label)); } } }); @@ -1401,7 +1402,7 @@ describe('render3 integration test', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['hostBindingDir', '']); + Δelement(0, 'div', ['hostBindingDir', '']); } }, 1, 0, [HostBindingDir]); @@ -1418,13 +1419,13 @@ describe('render3 integration test', () => { it('should support binding to styles', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'span'); - elementStyling(null, ['border-color']); - elementEnd(); + ΔelementStart(0, 'span'); + ΔelementStyling(null, ['border-color']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStyleProp(0, 0, ctx.color); - elementStylingApply(0); + ΔelementStyleProp(0, 0, ctx.color); + ΔelementStylingApply(0); } }, 1); @@ -1445,13 +1446,13 @@ describe('render3 integration test', () => { it('should support binding to styles with suffix', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'span'); - elementStyling(null, ['font-size']); - elementEnd(); + ΔelementStart(0, 'span'); + ΔelementStyling(null, ['font-size']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStyleProp(0, 0, ctx.time, 'px'); - elementStylingApply(0); + ΔelementStyleProp(0, 0, ctx.time, 'px'); + ΔelementStylingApply(0); } }, 1); @@ -1479,13 +1480,13 @@ describe('render3 integration test', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'span'); - elementStyling(['active']); - elementEnd(); + ΔelementStart(0, 'span'); + ΔelementStyling(['active']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementClassProp(0, 0, ctx.class); - elementStylingApply(0); + ΔelementClassProp(0, 0, ctx.class); + ΔelementStylingApply(0); } }, 1); @@ -1520,13 +1521,13 @@ describe('render3 integration test', () => { it('should work correctly with existing static classes', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'span', [AttributeMarker.Classes, 'existing']); - elementStyling(['existing', 'active']); - elementEnd(); + ΔelementStart(0, 'span', [AttributeMarker.Classes, 'existing']); + ΔelementStyling(['existing', 'active']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementClassProp(0, 1, ctx.class); - elementStylingApply(0); + ΔelementClassProp(0, 1, ctx.class); + ΔelementStylingApply(0); } }, 1); @@ -1543,7 +1544,7 @@ describe('render3 integration test', () => { it('should apply classes properly when nodes are components', () => { const MyComp = createComponent('my-comp', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - text(0, 'Comp Content'); + Δtext(0, 'Comp Content'); } }, 1, 0, []); @@ -1552,13 +1553,13 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'my-comp'); - elementStyling(['active']); - elementEnd(); + ΔelementStart(0, 'my-comp'); + ΔelementStyling(['active']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementClassProp(0, 0, ctx.class); - elementStylingApply(0); + ΔelementClassProp(0, 0, ctx.class); + ΔelementStylingApply(0); } }, 1, 0, [MyComp]); @@ -1582,17 +1583,17 @@ describe('render3 integration test', () => { create() { this.vcr.createEmbeddedView(this.tmp); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuralComp, selectors: [['structural-comp']], factory: () => structuralComp = - new StructuralComp(directiveInject(ViewContainerRef as any)), + new StructuralComp(ΔdirectiveInject(ViewContainerRef as any)), inputs: {tmp: 'tmp'}, consts: 1, vars: 0, template: (rf: RenderFlags, ctx: StructuralComp) => { if (rf & RenderFlags.Create) { - text(0, 'Comp Content'); + Δtext(0, 'Comp Content'); } } }); @@ -1600,7 +1601,7 @@ describe('render3 integration test', () => { function FooTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'Temp Content'); + Δtext(0, 'Temp Content'); } } @@ -1612,16 +1613,17 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, FooTemplate, 1, 0, 'ng-template', null, ['foo', ''], templateRefExtractor); - elementStart(2, 'structural-comp'); - elementStyling(['active']); - elementEnd(); + Δtemplate( + 0, FooTemplate, 1, 0, 'ng-template', null, ['foo', ''], ΔtemplateRefExtractor); + ΔelementStart(2, 'structural-comp'); + ΔelementStyling(['active']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - const foo = reference(1) as any; - elementClassProp(2, 0, ctx.class); - elementStylingApply(2); - elementProperty(2, 'tmp', bind(foo)); + const foo = Δreference(1) as any; + ΔelementClassProp(2, 0, ctx.class); + ΔelementStylingApply(2); + ΔelementProperty(2, 'tmp', Δbind(foo)); } }, 3, 1, [StructuralComp]); @@ -1644,7 +1646,7 @@ describe('render3 integration test', () => { let mockClassDirective: DirWithClassDirective; class DirWithClassDirective { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: DirWithClassDirective, selectors: [['', 'DirWithClass', '']], factory: () => mockClassDirective = new DirWithClassDirective(), @@ -1657,7 +1659,7 @@ describe('render3 integration test', () => { let mockStyleDirective: DirWithStyleDirective; class DirWithStyleDirective { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: DirWithStyleDirective, selectors: [['', 'DirWithStyle', '']], factory: () => mockStyleDirective = new DirWithStyleDirective(), @@ -1675,14 +1677,14 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart( + ΔelementStart( 0, 'div', ['DirWithClass', '', AttributeMarker.Classes, 'apple', 'orange', 'banana']); - elementStyling(); - elementEnd(); + ΔelementStyling(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingApply(0); + ΔelementStylingApply(0); } }, 1, 0, [DirWithClassDirective]); @@ -1697,14 +1699,14 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', [ + ΔelementStart(0, 'div', [ 'DirWithStyle', '', AttributeMarker.Styles, 'width', '100px', 'height', '200px' ]); - elementStyling(); - elementEnd(); + ΔelementStyling(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingApply(0); + ΔelementStylingApply(0); } }, 1, 0, [DirWithStyleDirective]); @@ -1719,13 +1721,13 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['DirWithClass']); - elementStyling(); - elementEnd(); + ΔelementStart(0, 'div', ['DirWithClass']); + ΔelementStyling(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingMap(0, 'cucumber grape'); - elementStylingApply(0); + ΔelementStylingMap(0, 'cucumber grape'); + ΔelementStylingApply(0); } }, 1, 0, [DirWithClassDirective]); @@ -1740,13 +1742,13 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['DirWithStyle']); - elementStyling(); - elementEnd(); + ΔelementStart(0, 'div', ['DirWithStyle']); + ΔelementStyling(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingMap(0, null, {width: '200px', height: '500px'}); - elementStylingApply(0); + ΔelementStylingMap(0, null, {width: '200px', height: '500px'}); + ΔelementStylingApply(0); } }, 1, 0, [DirWithStyleDirective]); @@ -1757,14 +1759,14 @@ describe('render3 integration test', () => { it('should apply initial styling to the element that contains the directive with host styling', () => { class DirWithInitialStyling { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: DirWithInitialStyling, selectors: [['', 'DirWithInitialStyling', '']], factory: () => new DirWithInitialStyling(), hostBindings: function( rf: RenderFlags, ctx: DirWithInitialStyling, elementIndex: number) { if (rf & RenderFlags.Create) { - elementHostAttrs([ + ΔelementHostAttrs([ 'title', 'foo', AttributeMarker.Classes, 'heavy', 'golden', AttributeMarker.Styles, 'color', 'purple', 'font-weight', 'bold' ]); @@ -1782,7 +1784,7 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', [ + Δelement(0, 'div', [ 'DirWithInitialStyling', '', AttributeMarker.Classes, 'big', AttributeMarker.Styles, 'color', 'black', 'font-size', '200px' ]); @@ -1808,22 +1810,22 @@ describe('render3 integration test', () => { * [style.height]> */ class DirWithSingleStylingBindings { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: DirWithSingleStylingBindings, selectors: [['', 'DirWithSingleStylingBindings', '']], factory: () => dirInstance = new DirWithSingleStylingBindings(), hostBindings: function( rf: RenderFlags, ctx: DirWithSingleStylingBindings, elementIndex: number) { if (rf & RenderFlags.Create) { - elementHostAttrs( + ΔelementHostAttrs( [AttributeMarker.Classes, 'def', AttributeMarker.Styles, 'width', '555px']); - elementHostStyling(['xyz'], ['width', 'height']); + ΔelementHostStyling(['xyz'], ['width', 'height']); } if (rf & RenderFlags.Update) { - elementHostStyleProp(0, ctx.width); - elementHostStyleProp(1, ctx.height); - elementHostClassProp(0, ctx.activateXYZClass); - elementHostStylingApply(); + ΔelementHostStyleProp(0, ctx.width); + ΔelementHostStyleProp(1, ctx.height); + ΔelementHostClassProp(0, ctx.activateXYZClass); + ΔelementHostStylingApply(); } } }); @@ -1839,7 +1841,7 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', [ + Δelement(0, 'div', [ 'DirWithSingleStylingBindings', '', AttributeMarker.Classes, 'abc', AttributeMarker.Styles, 'width', '100px', 'height', '200px' ]); @@ -1884,17 +1886,17 @@ describe('render3 integration test', () => { * [style.width] */ class Dir1WithStyle { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: Dir1WithStyle, selectors: [['', 'Dir1WithStyle', '']], factory: () => dir1Instance = new Dir1WithStyle(), hostBindings: function(rf: RenderFlags, ctx: Dir1WithStyle, elementIndex: number) { if (rf & RenderFlags.Create) { - elementHostStyling(null, ['width']); + ΔelementHostStyling(null, ['width']); } if (rf & RenderFlags.Update) { - elementHostStyleProp(0, ctx.width); - elementHostStylingApply(); + ΔelementHostStyleProp(0, ctx.width); + ΔelementHostStylingApply(); } } }); @@ -1908,18 +1910,18 @@ describe('render3 integration test', () => { * style="width:111px" */ class Dir2WithStyle { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: Dir2WithStyle, selectors: [['', 'Dir2WithStyle', '']], factory: () => dir2Instance = new Dir2WithStyle(), hostBindings: function(rf: RenderFlags, ctx: Dir2WithStyle, elementIndex: number) { if (rf & RenderFlags.Create) { - elementHostAttrs([AttributeMarker.Styles, 'width', '111px']); - elementHostStyling(null, ['width']); + ΔelementHostAttrs([AttributeMarker.Styles, 'width', '111px']); + ΔelementHostStyling(null, ['width']); } if (rf & RenderFlags.Update) { - elementHostStyleProp(0, ctx.width); - elementHostStylingApply(); + ΔelementHostStyleProp(0, ctx.width); + ΔelementHostStylingApply(); } } }); @@ -1932,12 +1934,12 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['Dir1WithStyle', '', 'Dir2WithStyle', '']); - elementStyling(null, ['width']); + Δelement(0, 'div', ['Dir1WithStyle', '', 'Dir2WithStyle', '']); + ΔelementStyling(null, ['width']); } if (rf & RenderFlags.Update) { - elementStyleProp(0, 0, ctx.width); - elementStylingApply(0); + ΔelementStyleProp(0, 0, ctx.width); + ΔelementStylingApply(0); } }, 1, 0, [Dir1WithStyle, Dir2WithStyle]); @@ -1981,17 +1983,17 @@ describe('render3 integration test', () => { * [class] */ class Dir1WithStyling { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: Dir1WithStyling, selectors: [['', 'Dir1WithStyling', '']], factory: () => dir1Instance = new Dir1WithStyling(), hostBindings: function(rf: RenderFlags, ctx: Dir1WithStyling, elementIndex: number) { if (rf & RenderFlags.Create) { - elementHostStyling(); + ΔelementHostStyling(); } if (rf & RenderFlags.Update) { - elementHostStylingMap(ctx.classesExp, ctx.stylesExp); - elementHostStylingApply(); + ΔelementHostStylingMap(ctx.classesExp, ctx.stylesExp); + ΔelementHostStylingApply(); } } }); @@ -2007,18 +2009,18 @@ describe('render3 integration test', () => { * style="width:111px" */ class Dir2WithStyling { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: Dir2WithStyling, selectors: [['', 'Dir2WithStyling', '']], factory: () => dir2Instance = new Dir2WithStyling(), hostBindings: function(rf: RenderFlags, ctx: Dir2WithStyling, elementIndex: number) { if (rf & RenderFlags.Create) { - elementHostAttrs([AttributeMarker.Styles, 'width', '111px']); - elementHostStyling(); + ΔelementHostAttrs([AttributeMarker.Styles, 'width', '111px']); + ΔelementHostStyling(); } if (rf & RenderFlags.Update) { - elementHostStylingMap(null, ctx.stylesExp); - elementHostStylingApply(); + ΔelementHostStylingMap(null, ctx.stylesExp); + ΔelementHostStylingApply(); } } }); @@ -2032,12 +2034,12 @@ describe('render3 integration test', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['Dir1WithStyling', '', 'Dir2WithStyling', '']); - elementStyling(); + Δelement(0, 'div', ['Dir1WithStyling', '', 'Dir2WithStyling', '']); + ΔelementStyling(); } if (rf & RenderFlags.Update) { - elementStylingMap(0, ctx.classesExp, ctx.stylesExp); - elementStylingApply(0); + ΔelementStylingMap(0, ctx.classesExp, ctx.stylesExp); + ΔelementStylingApply(0); } }, 1, 0, [Dir1WithStyling, Dir2WithStyling]); @@ -2108,13 +2110,13 @@ describe('render3 integration test', () => { it('should properly handle and render interpolation for class attribute bindings', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - elementStyling(); - elementEnd(); + ΔelementStart(0, 'div'); + ΔelementStyling(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingMap(0, interpolation2('-', ctx.name, '-', ctx.age, '-')); - elementStylingApply(0); + ΔelementStylingMap(0, Δinterpolation2('-', ctx.name, '-', ctx.age, '-')); + ΔelementStylingApply(0); } }, 1, 2); @@ -2141,20 +2143,20 @@ describe('template data', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'div'); + Δelement(0, 'div'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -2184,7 +2186,7 @@ describe('template data', () => { describe('component styles', () => { it('should pass in the component styles directly into the underlying renderer', () => { class StyledComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StyledComp, styles: ['div { color: red; }'], consts: 1, @@ -2194,7 +2196,7 @@ describe('component styles', () => { factory: () => new StyledComp(), template: (rf: RenderFlags, ctx: StyledComp) => { if (rf & RenderFlags.Create) { - element(0, 'div'); + Δelement(0, 'div'); } } }); @@ -2212,7 +2214,7 @@ describe('component animations', () => { const animB = {name: 'b'}; class AnimComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AnimComp, consts: 0, vars: 0, @@ -2239,7 +2241,7 @@ describe('component animations', () => { it('should include animations in the renderType data array even if the array is empty', () => { class AnimComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AnimComp, consts: 0, vars: 0, @@ -2259,7 +2261,7 @@ describe('component animations', () => { it('should allow [@trigger] bindings to be picked up by the underlying renderer', () => { class AnimComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AnimComp, consts: 1, vars: 1, @@ -2267,10 +2269,10 @@ describe('component animations', () => { factory: () => new AnimComp(), template: (rf: RenderFlags, ctx: AnimComp) => { if (rf & RenderFlags.Create) { - element(0, 'div', [AttributeMarker.Bindings, '@fooAnimation']); + Δelement(0, 'div', [AttributeMarker.Bindings, '@fooAnimation']); } if (rf & RenderFlags.Update) { - elementAttribute(0, '@fooAnimation', bind(ctx.animationValue)); + ΔelementAttribute(0, '@fooAnimation', Δbind(ctx.animationValue)); } } }); @@ -2295,7 +2297,7 @@ describe('component animations', () => { it('should allow creation-level [@trigger] properties to be picked up by the underlying renderer', () => { class AnimComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AnimComp, consts: 1, vars: 1, @@ -2303,7 +2305,7 @@ describe('component animations', () => { factory: () => new AnimComp(), template: (rf: RenderFlags, ctx: AnimComp) => { if (rf & RenderFlags.Create) { - element(0, 'div', ['@fooAnimation', '']); + Δelement(0, 'div', ['@fooAnimation', '']); } } }); @@ -2322,13 +2324,13 @@ describe('component animations', () => { it('should allow host binding animations to be picked up and rendered', () => { class ChildCompWithAnim { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: ChildCompWithAnim, factory: () => new ChildCompWithAnim(), selectors: [['child-comp-with-anim']], hostBindings: function(rf: RenderFlags, ctx: any, elementIndex: number): void { if (rf & RenderFlags.Update) { - elementProperty(0, '@fooAnim', ctx.exp); + ΔelementProperty(0, '@fooAnim', ctx.exp); } }, }); @@ -2337,7 +2339,7 @@ describe('component animations', () => { } class ParentComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ParentComp, consts: 1, vars: 1, @@ -2345,7 +2347,7 @@ describe('component animations', () => { factory: () => new ParentComp(), template: (rf: RenderFlags, ctx: ParentComp) => { if (rf & RenderFlags.Create) { - element(0, 'child-comp-with-anim'); + Δelement(0, 'child-comp-with-anim'); } }, directives: [ChildCompWithAnim] @@ -2367,7 +2369,7 @@ describe('component animations', () => { describe('element discovery', () => { it('should only monkey-patch immediate child nodes in a component', () => { class StructuredComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuredComp, selectors: [['structured-comp']], factory: () => new StructuredComp(), @@ -2375,10 +2377,10 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: StructuredComp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - elementStart(1, 'p'); - elementEnd(); - elementEnd(); + ΔelementStart(0, 'div'); + ΔelementStart(1, 'p'); + ΔelementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { } @@ -2399,7 +2401,7 @@ describe('element discovery', () => { it('should only monkey-patch immediate child nodes in a sub component', () => { class ChildComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ChildComp, selectors: [['child-comp']], factory: () => new ChildComp(), @@ -2407,16 +2409,16 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: ChildComp) => { if (rf & RenderFlags.Create) { - element(0, 'div'); - element(1, 'div'); - element(2, 'div'); + Δelement(0, 'div'); + Δelement(1, 'div'); + Δelement(2, 'div'); } } }); } class ParentComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ParentComp, selectors: [['parent-comp']], directives: [ChildComp], @@ -2425,10 +2427,10 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: ParentComp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'section'); - elementStart(1, 'child-comp'); - elementEnd(); - elementEnd(); + ΔelementStart(0, 'section'); + ΔelementStart(1, 'child-comp'); + ΔelementEnd(); + ΔelementEnd(); } } }); @@ -2449,7 +2451,7 @@ describe('element discovery', () => { it('should only monkey-patch immediate child nodes in an embedded template container', () => { class StructuredComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuredComp, selectors: [['structured-comp']], directives: [NgIf], @@ -2458,19 +2460,19 @@ describe('element discovery', () => { vars: 1, template: (rf: RenderFlags, ctx: StructuredComp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'section'); - template(1, (rf, ctx) => { + ΔelementStart(0, 'section'); + Δtemplate(1, (rf, ctx) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - element(1, 'p'); - elementEnd(); - element(2, 'div'); + ΔelementStart(0, 'div'); + Δelement(1, 'p'); + ΔelementEnd(); + Δelement(2, 'div'); } }, 3, 0, 'ng-template', ['ngIf', '']); - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(1, 'ngIf', true); + ΔelementProperty(1, 'ngIf', true); } } }); @@ -2497,7 +2499,7 @@ describe('element discovery', () => { it('should return a context object from a given dom node', () => { class StructuredComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuredComp, selectors: [['structured-comp']], directives: [NgIf], @@ -2506,8 +2508,8 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: StructuredComp) => { if (rf & RenderFlags.Create) { - element(0, 'section'); - element(1, 'div'); + Δelement(0, 'section'); + Δelement(1, 'div'); } } }); @@ -2535,7 +2537,7 @@ describe('element discovery', () => { it('should cache the element context on a element was pre-emptively monkey-patched', () => { class StructuredComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuredComp, selectors: [['structured-comp']], factory: () => new StructuredComp(), @@ -2543,7 +2545,7 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: StructuredComp) => { if (rf & RenderFlags.Create) { - element(0, 'section'); + Δelement(0, 'section'); } } }); @@ -2567,7 +2569,7 @@ describe('element discovery', () => { it('should cache the element context on an intermediate element that isn\'t pre-emptively monkey-patched', () => { class StructuredComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuredComp, selectors: [['structured-comp']], factory: () => new StructuredComp(), @@ -2575,9 +2577,9 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: StructuredComp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'section'); - element(1, 'p'); - elementEnd(); + ΔelementStart(0, 'section'); + Δelement(1, 'p'); + ΔelementEnd(); } } }); @@ -2600,7 +2602,7 @@ describe('element discovery', () => { it('should be able to pull in element context data even if the element is decorated using styling', () => { class StructuredComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuredComp, selectors: [['structured-comp']], factory: () => new StructuredComp(), @@ -2608,12 +2610,12 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: StructuredComp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'section'); - elementStyling(['class-foo']); - elementEnd(); + ΔelementStart(0, 'section'); + ΔelementStyling(['class-foo']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingApply(0); + ΔelementStylingApply(0); } } }); @@ -2654,7 +2656,7 @@ describe('element discovery', () => { */ class ProjectorComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ProjectorComp, selectors: [['projector-comp']], factory: () => new ProjectorComp(), @@ -2662,13 +2664,13 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: ProjectorComp) => { if (rf & RenderFlags.Create) { - projectionDef(); - text(0, 'welcome'); - elementStart(1, 'header'); - elementStart(2, 'h1'); - projection(3); - elementEnd(); - elementEnd(); + ΔprojectionDef(); + Δtext(0, 'welcome'); + ΔelementStart(1, 'header'); + ΔelementStart(2, 'h1'); + Δprojection(3); + ΔelementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { } @@ -2677,7 +2679,7 @@ describe('element discovery', () => { } class ParentComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ParentComp, selectors: [['parent-comp']], directives: [ProjectorComp], @@ -2686,14 +2688,14 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: ParentComp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'section'); - elementStart(1, 'projector-comp'); - elementStart(2, 'p'); - text(3, 'this content is projected'); - elementEnd(); - text(4, 'this content is projected also'); - elementEnd(); - elementEnd(); + ΔelementStart(0, 'section'); + ΔelementStart(1, 'projector-comp'); + ΔelementStart(2, 'p'); + Δtext(3, 'this content is projected'); + ΔelementEnd(); + Δtext(4, 'this content is projected also'); + ΔelementEnd(); + ΔelementEnd(); } } }); @@ -2751,7 +2753,7 @@ describe('element discovery', () => { it('should return `null` when an element context is retrieved that is a DOM node that was not created by Angular', () => { class StructuredComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuredComp, selectors: [['structured-comp']], factory: () => new StructuredComp(), @@ -2759,7 +2761,7 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: StructuredComp) => { if (rf & RenderFlags.Create) { - element(0, 'section'); + Δelement(0, 'section'); } } }); @@ -2778,7 +2780,7 @@ describe('element discovery', () => { it('should by default monkey-patch the bootstrap component with context details', () => { class StructuredComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuredComp, selectors: [['structured-comp']], factory: () => new StructuredComp(), @@ -2817,7 +2819,7 @@ describe('element discovery', () => { let myDir3Instance: MyDir2|null = null; class MyDir1 { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDir1, selectors: [['', 'my-dir-1', '']], factory: () => myDir1Instance = new MyDir1() @@ -2825,7 +2827,7 @@ describe('element discovery', () => { } class MyDir2 { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDir2, selectors: [['', 'my-dir-2', '']], factory: () => myDir2Instance = new MyDir2() @@ -2833,7 +2835,7 @@ describe('element discovery', () => { } class MyDir3 { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDir3, selectors: [['', 'my-dir-3', '']], factory: () => myDir3Instance = new MyDir2() @@ -2841,7 +2843,7 @@ describe('element discovery', () => { } class StructuredComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: StructuredComp, selectors: [['structured-comp']], directives: [MyDir1, MyDir2, MyDir3], @@ -2850,8 +2852,8 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: StructuredComp) => { if (rf & RenderFlags.Create) { - element(0, 'div', ['my-dir-1', '', 'my-dir-2', '']); - element(1, 'div', ['my-dir-3']); + Δelement(0, 'div', ['my-dir-1', '', 'my-dir-2', '']); + Δelement(1, 'div', ['my-dir-3']); } } }); @@ -2906,7 +2908,7 @@ describe('element discovery', () => { let childComponentInstance: ChildComp|null = null; class MyDir1 { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDir1, selectors: [['', 'my-dir-1', '']], factory: () => myDir1Instance = new MyDir1() @@ -2914,7 +2916,7 @@ describe('element discovery', () => { } class MyDir2 { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDir2, selectors: [['', 'my-dir-2', '']], factory: () => myDir2Instance = new MyDir2() @@ -2922,7 +2924,7 @@ describe('element discovery', () => { } class ChildComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ChildComp, selectors: [['child-comp']], factory: () => childComponentInstance = new ChildComp(), @@ -2930,14 +2932,14 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: ChildComp) => { if (rf & RenderFlags.Create) { - element(0, 'div'); + Δelement(0, 'div'); } } }); } class ParentComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ParentComp, selectors: [['parent-comp']], directives: [ChildComp, MyDir1, MyDir2], @@ -2946,7 +2948,7 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: ParentComp) => { if (rf & RenderFlags.Create) { - element(0, 'child-comp', ['my-dir-1', '', 'my-dir-2', '']); + Δelement(0, 'child-comp', ['my-dir-1', '', 'my-dir-2', '']); } } }); @@ -2999,7 +3001,7 @@ describe('element discovery', () => { it('should monkey-patch sub components with the view data and then replace them with the context result once a lookup occurs', () => { class ChildComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ChildComp, selectors: [['child-comp']], factory: () => new ChildComp(), @@ -3007,16 +3009,16 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: ChildComp) => { if (rf & RenderFlags.Create) { - element(0, 'div'); - element(1, 'div'); - element(2, 'div'); + Δelement(0, 'div'); + Δelement(1, 'div'); + Δelement(2, 'div'); } } }); } class ParentComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ParentComp, selectors: [['parent-comp']], directives: [ChildComp], @@ -3025,10 +3027,10 @@ describe('element discovery', () => { vars: 0, template: (rf: RenderFlags, ctx: ParentComp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'section'); - elementStart(1, 'child-comp'); - elementEnd(); - elementEnd(); + ΔelementStart(0, 'section'); + ΔelementStart(1, 'child-comp'); + ΔelementEnd(); + ΔelementEnd(); } } }); @@ -3060,7 +3062,7 @@ describe('element discovery', () => { describe('sanitization', () => { it('should sanitize data using the provided sanitization interface', () => { class SanitizationComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SanitizationComp, selectors: [['sanitize-this']], factory: () => new SanitizationComp(), @@ -3068,10 +3070,10 @@ describe('sanitization', () => { vars: 1, template: (rf: RenderFlags, ctx: SanitizationComp) => { if (rf & RenderFlags.Create) { - element(0, 'a'); + Δelement(0, 'a'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'href', bind(ctx.href), sanitizeUrl); + ΔelementProperty(0, 'href', Δbind(ctx.href), ΔsanitizeUrl); } } }); @@ -3102,23 +3104,23 @@ describe('sanitization', () => { // @HostBinding() cite: any = 'http://cite-dir-value'; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: UnsafeUrlHostBindingDir, selectors: [['', 'unsafeUrlHostBindingDir', '']], factory: () => hostBindingDir = new UnsafeUrlHostBindingDir(), hostBindings: (rf: RenderFlags, ctx: any, elementIndex: number) => { if (rf & RenderFlags.Create) { - allocHostVars(1); + ΔallocHostVars(1); } if (rf & RenderFlags.Update) { - elementProperty(elementIndex, 'cite', bind(ctx.cite), sanitizeUrl, true); + ΔelementProperty(elementIndex, 'cite', Δbind(ctx.cite), ΔsanitizeUrl, true); } } }); } class SimpleComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SimpleComp, selectors: [['sanitize-this']], factory: () => new SimpleComp(), @@ -3126,7 +3128,7 @@ describe('sanitization', () => { vars: 0, template: (rf: RenderFlags, ctx: SimpleComp) => { if (rf & RenderFlags.Create) { - element(0, 'blockquote', ['unsafeUrlHostBindingDir', '']); + Δelement(0, 'blockquote', ['unsafeUrlHostBindingDir', '']); } }, directives: [UnsafeUrlHostBindingDir] diff --git a/packages/core/test/render3/ivy/jit_spec.ts b/packages/core/test/render3/ivy/jit_spec.ts index e6dae227f3..f782ef2d58 100644 --- a/packages/core/test/render3/ivy/jit_spec.ts +++ b/packages/core/test/render3/ivy/jit_spec.ts @@ -7,10 +7,10 @@ */ import 'reflect-metadata'; -import {ElementRef, QueryList, ɵsetComponentScope as setComponentScope} from '@angular/core'; +import {ElementRef, QueryList, ΔsetComponentScope as setComponentScope} from '@angular/core'; import {Injectable} from '@angular/core/src/di/injectable'; -import {inject, setCurrentInjector} from '@angular/core/src/di/injector_compatibility'; -import {InjectorDef, defineInjectable} from '@angular/core/src/di/interface/defs'; +import {setCurrentInjector, Δinject} from '@angular/core/src/di/injector_compatibility'; +import {ΔInjectorDef, ΔdefineInjectable} from '@angular/core/src/di/interface/defs'; import {ivyEnabled} from '@angular/core/src/ivy_switch'; import {ContentChild, ContentChildren, ViewChild, ViewChildren} from '@angular/core/src/metadata/di'; import {Component, Directive, HostBinding, HostListener, Input, Output, Pipe} from '@angular/core/src/metadata/directives'; @@ -45,7 +45,7 @@ ivyEnabled && describe('render3 jit', () => { expect(ServiceAny.ngInjectableDef).toBeDefined(); expect(ServiceAny.ngInjectableDef.providedIn).toBe('root'); - expect(inject(Service) instanceof Service).toBe(true); + expect(Δinject(Service) instanceof Service).toBe(true); }); it('compiles an injectable with a useValue provider', () => { @@ -53,7 +53,7 @@ ivyEnabled && describe('render3 jit', () => { class Service { } - expect(inject(Service)).toBe('test'); + expect(Δinject(Service)).toBe('test'); }); it('compiles an injectable with a useExisting provider', () => { @@ -65,7 +65,7 @@ ivyEnabled && describe('render3 jit', () => { class Service { } - expect(inject(Service)).toBe('test'); + expect(Δinject(Service)).toBe('test'); }); it('compiles an injectable with a useFactory provider, without deps', () => { @@ -74,7 +74,7 @@ ivyEnabled && describe('render3 jit', () => { class Service { } - expect(inject(Service)).toBe('test'); + expect(Δinject(Service)).toBe('test'); }); it('compiles an injectable with a useFactory provider, with deps', () => { @@ -86,7 +86,7 @@ ivyEnabled && describe('render3 jit', () => { class Service { } - expect(inject(Service)).toBe('test'); + expect(Δinject(Service)).toBe('test'); }); it('compiles an injectable with a useClass provider, with deps', () => { @@ -104,7 +104,7 @@ ivyEnabled && describe('render3 jit', () => { } const ServiceAny = Service as any; - expect(inject(Service).value).toBe('test'); + expect(Δinject(Service).value).toBe('test'); }); it('compiles an injectable with a useClass provider, without deps', () => { @@ -119,8 +119,8 @@ ivyEnabled && describe('render3 jit', () => { get value(): number { return 0; } } - expect(inject(Existing).value).toBe(1); - const injected = inject(Service); + expect(Δinject(Existing).value).toBe(1); + const injected = Δinject(Service); expect(injected instanceof Existing).toBe(true); expect(injected.value).toBe(2); }); @@ -139,7 +139,7 @@ ivyEnabled && describe('render3 jit', () => { class Child extends Base { } - expect(inject(Child).dep instanceof Dep).toBe(true); + expect(Δinject(Child).dep instanceof Dep).toBe(true); }); it('compiles a module to a definition', () => { @@ -167,7 +167,7 @@ ivyEnabled && describe('render3 jit', () => { it('compiles a module to an ngInjectorDef with the providers', () => { class Token { - static ngInjectableDef = defineInjectable({ + static ngInjectableDef = ΔdefineInjectable({ providedIn: 'root', factory: () => 'default', }); @@ -180,7 +180,7 @@ ivyEnabled && describe('render3 jit', () => { constructor(public token: Token) {} } - const injectorDef: InjectorDef = (Module as any).ngInjectorDef; + const injectorDef: ΔInjectorDef = (Module as any).ngInjectorDef; const instance = injectorDef.factory(); // Since the instance was created outside of an injector using the module, the diff --git a/packages/core/test/render3/jit_environment_spec.ts b/packages/core/test/render3/jit_environment_spec.ts index 5689b7f916..e256047c21 100644 --- a/packages/core/test/render3/jit_environment_spec.ts +++ b/packages/core/test/render3/jit_environment_spec.ts @@ -12,12 +12,12 @@ import {Identifiers} from '@angular/compiler/src/render3/r3_identifiers'; import {angularCoreEnv} from '../../src/render3/jit/environment'; const INTERFACE_EXCEPTIONS = new Set([ - 'ɵBaseDef', - 'ɵComponentDefWithMeta', - 'ɵDirectiveDefWithMeta', - 'ɵInjectorDef', - 'ɵNgModuleDefWithMeta', - 'ɵPipeDefWithMeta', + 'ΔBaseDef', + 'ΔComponentDefWithMeta', + 'ΔDirectiveDefWithMeta', + 'ΔInjectorDef', + 'ΔNgModuleDefWithMeta', + 'ΔPipeDefWithMeta', ]); describe('r3 jit environment', () => { diff --git a/packages/core/test/render3/lifecycle_spec.ts b/packages/core/test/render3/lifecycle_spec.ts index 2f03d5e32b..e543ef074b 100644 --- a/packages/core/test/render3/lifecycle_spec.ts +++ b/packages/core/test/render3/lifecycle_spec.ts @@ -7,9 +7,8 @@ */ import {ComponentFactoryResolver, OnDestroy, SimpleChange, SimpleChanges, ViewContainerRef} from '../../src/core'; -import {AttributeMarker, ComponentTemplate, LifecycleHooksFeature, NO_CHANGE, NgOnChangesFeature, defineComponent, defineDirective, injectComponentFactoryResolver} from '../../src/render3/index'; - -import {bind, container, containerRefreshEnd, containerRefreshStart, directiveInject, element, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, select, listener, markDirty, projection, projectionDef, store, template, text} from '../../src/render3/instructions/all'; +import {AttributeMarker, ComponentTemplate, LifecycleHooksFeature, NO_CHANGE, injectComponentFactoryResolver, ΔNgOnChangesFeature, ΔdefineComponent, ΔdefineDirective} from '../../src/render3/index'; +import {markDirty, store, Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, ΔdirectiveInject, Δelement, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δlistener, Δprojection, ΔprojectionDef, Δselect, Δtemplate, Δtext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {NgIf} from './common_with_def'; @@ -20,10 +19,10 @@ describe('lifecycles', () => { function getParentTemplate(name: string) { return (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - element(0, name); + Δelement(0, name); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', bind(ctx.val)); + ΔelementProperty(0, 'val', Δbind(ctx.val)); } }; } @@ -35,16 +34,16 @@ describe('lifecycles', () => { let Comp = createOnInitComponent('comp', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - projectionDef(); - elementStart(0, 'div'); - { projection(1); } - elementEnd(); + ΔprojectionDef(); + ΔelementStart(0, 'div'); + { Δprojection(1); } + ΔelementEnd(); } }, 2); let Parent = createOnInitComponent('parent', getParentTemplate('comp'), 1, 1, [Comp]); let ProjectedComp = createOnInitComponent('projected', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - text(0, 'content'); + Δtext(0, 'content'); } }, 1); @@ -58,7 +57,7 @@ describe('lifecycles', () => { events.push(`${name}${this.val}`); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Component, selectors: [[name]], consts: consts, @@ -73,7 +72,7 @@ describe('lifecycles', () => { class Directive { ngOnInit() { events.push('dir'); } - static ngDirectiveDef = defineDirective( + static ngDirectiveDef = ΔdefineDirective( {type: Directive, selectors: [['', 'dir', '']], factory: () => new Directive()}); } @@ -84,10 +83,10 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', bind(ctx.val)); + ΔelementProperty(0, 'val', Δbind(ctx.val)); } }, 1, 1, directives); @@ -116,7 +115,7 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } }, 1, 0, directives); @@ -133,13 +132,13 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); - element(1, 'parent'); + Δelement(0, 'parent'); + Δelement(1, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(1); - elementProperty(1, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(1); + ΔelementProperty(1, 'val', 2); } }, 2, 0, directives); @@ -156,20 +155,20 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (!ctx.skip) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, directives); @@ -190,17 +189,17 @@ describe('lifecycles', () => { function IfTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } } /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, IfTemplate, 1, 0, 'comp', [AttributeMarker.Template, 'ngIf']); + Δtemplate(0, IfTemplate, 1, 0, 'comp', [AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'ngIf', bind(ctx.showing)); + ΔelementProperty(0, 'ngIf', Δbind(ctx.showing)); } }, 1, 0, directives); @@ -225,11 +224,11 @@ describe('lifecycles', () => { class ViewContainerComp { constructor(public vcr: ViewContainerRef, public cfr: ComponentFactoryResolver) {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ViewContainerComp, selectors: [['view-container-comp']], factory: () => viewContainerComp = new ViewContainerComp( - directiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), + ΔdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), consts: 0, vars: 0, template: (rf: RenderFlags, ctx: ViewContainerComp) => {} @@ -238,7 +237,7 @@ describe('lifecycles', () => { const DynamicComp = createComponent('dynamic-comp', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } }, 1, 0, [Comp]); @@ -259,9 +258,9 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { elementStart(1, 'projected'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { ΔelementStart(1, 'projected'); } + ΔelementEnd(); } }, 2, 0, directives); @@ -280,21 +279,21 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { elementStart(1, 'projected'); } - elementEnd(); - elementStart(2, 'comp'); - { elementStart(3, 'projected'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { ΔelementStart(1, 'projected'); } + ΔelementEnd(); + ΔelementStart(2, 'comp'); + { ΔelementStart(3, 'projected'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(1); - elementProperty(1, 'val', 1); - select(2); - elementProperty(2, 'val', 2); - select(3); - elementProperty(3, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(1); + ΔelementProperty(1, 'val', 1); + Δselect(2); + ΔelementProperty(2, 'val', 2); + Δselect(3); + ΔelementProperty(3, 'val', 2); } }, 4, 0, directives); @@ -306,7 +305,7 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp', ['dir', '']); + Δelement(0, 'comp', ['dir', '']); } }, 1, 0, directives); @@ -321,7 +320,7 @@ describe('lifecycles', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['dir', '']); + Δelement(0, 'div', ['dir', '']); } }, 1, 0, directives); @@ -342,28 +341,28 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); - container(1); - element(2, 'comp'); + Δelement(0, 'comp'); + Δcontainer(1); + Δelement(2, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(2); - elementProperty(2, 'val', 5); - containerRefreshStart(1); + ΔelementProperty(0, 'val', 1); + Δselect(2); + ΔelementProperty(2, 'val', 5); + ΔcontainerRefreshStart(1); { for (let j = 2; j < 5; j++) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', j); + ΔelementProperty(0, 'val', j); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 3, 0, directives); @@ -383,28 +382,28 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); - container(1); - element(2, 'parent'); + Δelement(0, 'parent'); + Δcontainer(1); + Δelement(2, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(2); - elementProperty(2, 'val', 5); - containerRefreshStart(1); + ΔelementProperty(0, 'val', 1); + Δselect(2); + ΔelementProperty(2, 'val', 5); + ΔcontainerRefreshStart(1); { for (let j = 2; j < 5; j++) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', j); + ΔelementProperty(0, 'val', j); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 3, 0, directives); @@ -442,7 +441,7 @@ describe('lifecycles', () => { ngOnInit() { allEvents.push('init ' + name); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Component, selectors: [[name]], factory: () => new Component(), template, @@ -457,7 +456,7 @@ describe('lifecycles', () => { class Directive { ngDoCheck() { events.push('dir'); } - static ngDirectiveDef = defineDirective( + static ngDirectiveDef = ΔdefineDirective( {type: Directive, selectors: [['', 'dir', '']], factory: () => new Directive()}); } @@ -467,7 +466,7 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } }, 1, 0, directives); @@ -494,7 +493,7 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } }, 1, 0, directives); @@ -506,7 +505,7 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } }, 1, 0, directives); @@ -521,7 +520,7 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp', ['dir', '']); + Δelement(0, 'comp', ['dir', '']); } }, 1, 0, directives); @@ -536,7 +535,7 @@ describe('lifecycles', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['dir', '']); + Δelement(0, 'div', ['dir', '']); } }, 1, 0, directives); @@ -560,27 +559,27 @@ describe('lifecycles', () => { let Comp = createAfterContentInitComp('comp', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - projectionDef(); - projection(0); + ΔprojectionDef(); + Δprojection(0); } }, 1); let Parent = createAfterContentInitComp('parent', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - projectionDef(); - elementStart(0, 'comp'); - { projection(1); } - elementEnd(); + ΔprojectionDef(); + ΔelementStart(0, 'comp'); + { Δprojection(1); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', bind(ctx.val)); + ΔelementProperty(0, 'val', Δbind(ctx.val)); } }, 2, 1, [Comp]); let ProjectedComp = createAfterContentInitComp('projected', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - projectionDef(); - projection(0); + ΔprojectionDef(); + Δprojection(0); } }, 1); @@ -595,7 +594,7 @@ describe('lifecycles', () => { } ngAfterContentChecked() { allEvents.push(`${name}${this.val} check`); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Component, selectors: [[name]], factory: () => new Component(), @@ -612,40 +611,40 @@ describe('lifecycles', () => { ngAfterContentInit() { events.push('init'); } ngAfterContentChecked() { events.push('check'); } - static ngDirectiveDef = defineDirective( + static ngDirectiveDef = ΔdefineDirective( {type: Directive, selectors: [['', 'dir', '']], factory: () => new Directive()}); } function ForLoopWithChildrenTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'parent'); - { text(1, 'content'); } - elementEnd(); - container(2); - elementStart(3, 'parent'); - { text(4, 'content'); } - elementEnd(); + ΔelementStart(0, 'parent'); + { Δtext(1, 'content'); } + ΔelementEnd(); + Δcontainer(2); + ΔelementStart(3, 'parent'); + { Δtext(4, 'content'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(3); - elementProperty(3, 'val', 4); - containerRefreshStart(2); + ΔelementProperty(0, 'val', 1); + Δselect(3); + ΔelementProperty(3, 'val', 4); + ΔcontainerRefreshStart(2); { for (let i = 2; i < 4; i++) { - let rf1 = embeddedViewStart(0, 2, 0); + let rf1 = ΔembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'parent'); - { text(1, 'content'); } - elementEnd(); + ΔelementStart(0, 'parent'); + { Δtext(1, 'content'); } + ΔelementEnd(); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', i); + ΔelementProperty(0, 'val', i); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -655,9 +654,9 @@ describe('lifecycles', () => { /** content */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { text(1, 'content'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { Δtext(1, 'content'); } + ΔelementEnd(); } }, 2, 0, directives); @@ -685,22 +684,22 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (!ctx.skip) { - let rf1 = embeddedViewStart(0, 2, 0); + let rf1 = ΔembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'comp'); - { text(1, 'content'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { Δtext(1, 'content'); } + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, directives); @@ -724,9 +723,9 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'parent'); - { text(1, 'content'); } - elementEnd(); + ΔelementStart(0, 'parent'); + { Δtext(1, 'content'); } + ΔelementEnd(); } }, 2, 0, directives); @@ -743,17 +742,17 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'parent'); - { text(1, 'content'); } - elementEnd(); - elementStart(2, 'parent'); - { text(3, 'content'); } - elementEnd(); + ΔelementStart(0, 'parent'); + { Δtext(1, 'content'); } + ΔelementEnd(); + ΔelementStart(2, 'parent'); + { Δtext(3, 'content'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(2); - elementProperty(2, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(2); + ΔelementProperty(2, 'val', 2); } }, 4, 0, directives); @@ -774,13 +773,13 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'parent'); + ΔelementStart(0, 'parent'); { - elementStart(1, 'projected'); - { text(2, 'content'); } - elementEnd(); + ΔelementStart(1, 'projected'); + { Δtext(2, 'content'); } + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } }, 3, 0, directives); @@ -804,29 +803,29 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'parent'); + ΔelementStart(0, 'parent'); { - elementStart(1, 'projected'); - { text(2, 'content'); } - elementEnd(); + ΔelementStart(1, 'projected'); + { Δtext(2, 'content'); } + ΔelementEnd(); } - elementEnd(); - elementStart(3, 'parent'); + ΔelementEnd(); + ΔelementStart(3, 'parent'); { - elementStart(4, 'projected'); - { text(5, 'content'); } - elementEnd(); + ΔelementStart(4, 'projected'); + { Δtext(5, 'content'); } + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(1); - elementProperty(1, 'val', 1); - select(3); - elementProperty(3, 'val', 2); - select(4); - elementProperty(4, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(1); + ΔelementProperty(1, 'val', 1); + Δselect(3); + ΔelementProperty(3, 'val', 2); + Δselect(4); + ΔelementProperty(4, 'val', 2); } }, 6, 0, directives); @@ -844,34 +843,34 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { text(1, 'content'); } - elementEnd(); - container(2); - elementStart(3, 'comp'); - { text(4, 'content'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { Δtext(1, 'content'); } + ΔelementEnd(); + Δcontainer(2); + ΔelementStart(3, 'comp'); + { Δtext(4, 'content'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(3); - elementProperty(3, 'val', 4); - containerRefreshStart(2); + ΔelementProperty(0, 'val', 1); + Δselect(3); + ΔelementProperty(3, 'val', 4); + ΔcontainerRefreshStart(2); { for (let i = 2; i < 4; i++) { - let rf1 = embeddedViewStart(0, 2, 0); + let rf1 = ΔembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'comp'); - { text(1, 'content'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { Δtext(1, 'content'); } + ΔelementEnd(); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', i); + ΔelementProperty(0, 'val', i); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 5, 0, directives); @@ -899,9 +898,9 @@ describe('lifecycles', () => { /** content */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { text(1, 'content'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { Δtext(1, 'content'); } + ΔelementEnd(); } }, 2, 0, directives); @@ -928,7 +927,7 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp', ['dir', '']); + Δelement(0, 'comp', ['dir', '']); } }, 1, 0, directives); @@ -940,7 +939,7 @@ describe('lifecycles', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['dir', '']); + Δelement(0, 'div', ['dir', '']); } }, 1, 0, directives); @@ -961,17 +960,17 @@ describe('lifecycles', () => { let Comp = createAfterViewInitComponent('comp', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - projectionDef(); - elementStart(0, 'div'); - { projection(1); } - elementEnd(); + ΔprojectionDef(); + ΔelementStart(0, 'div'); + { Δprojection(1); } + ΔelementEnd(); } }, 2); let Parent = createAfterViewInitComponent('parent', getParentTemplate('comp'), 1, 1, [Comp]); let ProjectedComp = createAfterViewInitComponent('projected', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - text(0, 'content'); + Δtext(0, 'content'); } }, 1); @@ -987,7 +986,7 @@ describe('lifecycles', () => { } ngAfterViewChecked() { allEvents.push(`${name}${this.val} check`); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Component, selectors: [[name]], consts: consts, @@ -1004,7 +1003,7 @@ describe('lifecycles', () => { ngAfterViewInit() { events.push('init'); } ngAfterViewChecked() { events.push('check'); } - static ngDirectiveDef = defineDirective( + static ngDirectiveDef = ΔdefineDirective( {type: Directive, selectors: [['', 'dir', '']], factory: () => new Directive()}); } @@ -1014,7 +1013,7 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } }, 1, 0, defs); @@ -1042,20 +1041,20 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (!ctx.skip) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1080,7 +1079,7 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } }, 1, 0, defs); @@ -1097,13 +1096,13 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); - element(1, 'parent'); + Δelement(0, 'parent'); + Δelement(1, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(1); - elementProperty(1, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(1); + ΔelementProperty(1, 'val', 2); } }, 2, 0, defs); @@ -1120,9 +1119,9 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { element(1, 'projected'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { Δelement(1, 'projected'); } + ΔelementEnd(); } }, 2, 0, defs); @@ -1141,21 +1140,21 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { element(1, 'projected'); } - elementEnd(); - elementStart(2, 'comp'); - { element(3, 'projected'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { Δelement(1, 'projected'); } + ΔelementEnd(); + ΔelementStart(2, 'comp'); + { Δelement(3, 'projected'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(1); - elementProperty(1, 'val', 1); - select(2); - elementProperty(2, 'val', 2); - select(3); - elementProperty(3, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(1); + ΔelementProperty(1, 'val', 1); + Δselect(2); + ΔelementProperty(2, 'val', 2); + Δselect(3); + ΔelementProperty(3, 'val', 2); } }, 4, 0, defs); @@ -1171,14 +1170,14 @@ describe('lifecycles', () => { */ const ParentComp = createAfterViewInitComponent('parent', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { element(1, 'projected'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { Δelement(1, 'projected'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', bind(ctx.val)); - select(1); - elementProperty(1, 'val', bind(ctx.val)); + ΔelementProperty(0, 'val', Δbind(ctx.val)); + Δselect(1); + ΔelementProperty(1, 'val', Δbind(ctx.val)); } }, 2, 2, [Comp, ProjectedComp]); @@ -1188,13 +1187,13 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); - element(1, 'parent'); + Δelement(0, 'parent'); + Δelement(1, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(1); - elementProperty(1, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(1); + ΔelementProperty(1, 'val', 2); } }, 2, 0, [ParentComp]); @@ -1212,28 +1211,28 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); - container(1); - element(2, 'comp'); + Δelement(0, 'comp'); + Δcontainer(1); + Δelement(2, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(2); - elementProperty(2, 'val', 4); - containerRefreshStart(1); + ΔelementProperty(0, 'val', 1); + Δselect(2); + ΔelementProperty(2, 'val', 4); + ΔcontainerRefreshStart(1); { for (let i = 2; i < 4; i++) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', i); + ΔelementProperty(0, 'val', i); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 3, 0, defs); @@ -1252,28 +1251,28 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); - container(1); - element(2, 'parent'); + Δelement(0, 'parent'); + Δcontainer(1); + Δelement(2, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(2); - elementProperty(2, 'val', 4); - containerRefreshStart(1); + ΔelementProperty(0, 'val', 1); + Δselect(2); + ΔelementProperty(2, 'val', 4); + ΔcontainerRefreshStart(1); { for (let i = 2; i < 4; i++) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', i); + ΔelementProperty(0, 'val', i); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 3, 0, defs); @@ -1289,7 +1288,7 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } }, 1, 0, defs); @@ -1313,10 +1312,10 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', bind(ctx.myVal)); + ΔelementProperty(0, 'val', Δbind(ctx.myVal)); } }, 1, 1, defs); @@ -1338,28 +1337,28 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); - container(1); - element(2, 'parent'); + Δelement(0, 'parent'); + Δcontainer(1); + Δelement(2, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(2); - elementProperty(2, 'val', 4); - containerRefreshStart(1); + ΔelementProperty(0, 'val', 1); + Δselect(2); + ΔelementProperty(2, 'val', 4); + ΔcontainerRefreshStart(1); { for (let i = 2; i < 4; i++) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', i); + ΔelementProperty(0, 'val', i); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 3, 0, defs); @@ -1379,7 +1378,7 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp', ['dir', '']); + Δelement(0, 'comp', ['dir', '']); } }, 1, 0, defs); @@ -1391,7 +1390,7 @@ describe('lifecycles', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['dir', '']); + Δelement(0, 'div', ['dir', '']); } }, 1, 0, defs); @@ -1408,8 +1407,8 @@ describe('lifecycles', () => { let Comp = createOnDestroyComponent('comp', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - projectionDef(); - projection(0); + ΔprojectionDef(); + Δprojection(0); } }, 1); let Parent = createOnDestroyComponent('parent', getParentTemplate('comp'), 1, 1, [Comp]); @@ -1421,7 +1420,7 @@ describe('lifecycles', () => { val: string = ''; ngOnDestroy() { events.push(`${name}${this.val}`); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Component, selectors: [[name]], factory: () => new Component(), @@ -1436,7 +1435,7 @@ describe('lifecycles', () => { let Grandparent = createOnDestroyComponent('grandparent', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } }, 1, 0, [Parent]); @@ -1445,7 +1444,7 @@ describe('lifecycles', () => { class Directive { ngOnDestroy() { events.push('dir'); } - static ngDirectiveDef = defineDirective( + static ngDirectiveDef = ΔdefineDirective( {type: Directive, selectors: [['', 'dir', '']], factory: () => new Directive()}); } @@ -1460,20 +1459,20 @@ describe('lifecycles', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (!ctx.skip) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1493,26 +1492,26 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (!ctx.skip) { - let rf1 = embeddedViewStart(0, 2, 2); + let rf1 = ΔembeddedViewStart(0, 2, 2); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); - element(1, 'comp'); + Δelement(0, 'comp'); + Δelement(1, 'comp'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', bind('1')); - select(1); - elementProperty(1, 'val', bind('2')); + ΔelementProperty(0, 'val', Δbind('1')); + Δselect(1); + ΔelementProperty(1, 'val', Δbind('2')); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1534,20 +1533,20 @@ describe('lifecycles', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (!ctx.skip) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1569,20 +1568,20 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (!ctx.skip) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'grandparent'); + Δelement(0, 'grandparent'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1606,34 +1605,34 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (!ctx.skip) { - let rf1 = embeddedViewStart(0, 4, 0); + let rf1 = ΔembeddedViewStart(0, 4, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'comp'); - { element(1, 'projected'); } - elementEnd(); - elementStart(2, 'comp'); - { element(3, 'projected'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { Δelement(1, 'projected'); } + ΔelementEnd(); + ΔelementStart(2, 'comp'); + { Δelement(3, 'projected'); } + ΔelementEnd(); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(1); - elementProperty(1, 'val', 1); - select(2); - elementProperty(2, 'val', 2); - select(3); - elementProperty(3, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(1); + ΔelementProperty(1, 'val', 1); + Δselect(2); + ΔelementProperty(2, 'val', 2); + Δselect(3); + ΔelementProperty(3, 'val', 2); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1658,41 +1657,41 @@ describe('lifecycles', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 3, 2); + let rf1 = ΔembeddedViewStart(0, 3, 2); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); - container(1); - element(2, 'comp'); + Δelement(0, 'comp'); + Δcontainer(1); + Δelement(2, 'comp'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', bind('1')); - select(2); - elementProperty(2, 'val', bind('3')); - containerRefreshStart(1); + ΔelementProperty(0, 'val', Δbind('1')); + Δselect(2); + ΔelementProperty(2, 'val', Δbind('3')); + ΔcontainerRefreshStart(1); { if (ctx.condition2) { - let rf2 = embeddedViewStart(0, 1, 1); + let rf2 = ΔembeddedViewStart(0, 1, 1); if (rf2 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf2 & RenderFlags.Update) { - elementProperty(0, 'val', bind('2')); + ΔelementProperty(0, 'val', Δbind('2')); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1752,41 +1751,41 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 3, 2); + let rf1 = ΔembeddedViewStart(0, 3, 2); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); - container(1); - element(2, 'comp'); + Δelement(0, 'comp'); + Δcontainer(1); + Δelement(2, 'comp'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val', bind('1')); - select(2); - elementProperty(2, 'val', bind('5')); - containerRefreshStart(1); + ΔelementProperty(0, 'val', Δbind('1')); + Δselect(2); + ΔelementProperty(2, 'val', Δbind('5')); + ΔcontainerRefreshStart(1); { for (let j = 2; j < ctx.len; j++) { - let rf2 = embeddedViewStart(0, 1, 1); + let rf2 = ΔembeddedViewStart(0, 1, 1); if (rf2 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf2 & RenderFlags.Update) { - elementProperty(0, 'val', bind(j)); + ΔelementProperty(0, 'val', Δbind(j)); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1843,32 +1842,32 @@ describe('lifecycles', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 5, 0); + let rf1 = ΔembeddedViewStart(0, 5, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', ctx.onClick.bind(ctx)); - text(1, 'Click me'); + Δlistener('click', ctx.onClick.bind(ctx)); + Δtext(1, 'Click me'); } - elementEnd(); - element(2, 'comp'); - elementStart(3, 'button'); + ΔelementEnd(); + Δelement(2, 'comp'); + ΔelementStart(3, 'button'); { - listener('click', ctx.onClick.bind(ctx)); - text(4, 'Click me'); + Δlistener('click', ctx.onClick.bind(ctx)); + Δtext(4, 'Click me'); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -1903,20 +1902,20 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'comp', ['dir', '']); + Δelement(0, 'comp', ['dir', '']); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1939,20 +1938,20 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'div', ['dir', '']); + Δelement(0, 'div', ['dir', '']); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -1980,10 +1979,10 @@ describe('lifecycles', () => { */ const Comp = createOnChangesComponent('comp', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - projectionDef(); - elementStart(0, 'div'); - { projection(1); } - elementEnd(); + ΔprojectionDef(); + ΔelementStart(0, 'div'); + { Δprojection(1); } + ΔelementEnd(); } }, 2); @@ -1992,17 +1991,17 @@ describe('lifecycles', () => { */ const Parent = createOnChangesComponent('parent', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(ctx.a)); - elementProperty(0, 'publicVal2', bind(ctx.b)); + ΔelementProperty(0, 'val1', Δbind(ctx.a)); + ΔelementProperty(0, 'publicVal2', Δbind(ctx.b)); } }, 1, 2, [Comp]); const ProjectedComp = createOnChangesComponent('projected', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - text(0, 'content'); + Δtext(0, 'content'); } }, 1); @@ -2027,7 +2026,7 @@ describe('lifecycles', () => { events.push({type: 'onChanges', name: 'comp - ' + name, changes}); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Component, selectors: [[name]], factory: () => new Component(), @@ -2035,7 +2034,7 @@ describe('lifecycles', () => { vars: vars, inputs: {a: 'val1', b: ['publicVal2', 'val2']}, template, directives: directives, - features: [NgOnChangesFeature()], + features: [ΔNgOnChangesFeature()], }); }; } @@ -2049,12 +2048,12 @@ describe('lifecycles', () => { events.push({type: 'onChanges', name: 'dir - dir', changes}); } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: Directive, selectors: [['', 'dir', '']], factory: () => new Directive(), inputs: {a: 'val1', b: ['publicVal2', 'val2']}, - features: [NgOnChangesFeature()], + features: [ΔNgOnChangesFeature()], }); } @@ -2064,11 +2063,11 @@ describe('lifecycles', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(ctx.val1)); - elementProperty(0, 'publicVal2', bind(ctx.val2)); + ΔelementProperty(0, 'val1', Δbind(ctx.val1)); + ΔelementProperty(0, 'publicVal2', Δbind(ctx.val2)); } }, 1, 2, defs); @@ -2110,11 +2109,11 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(ctx.val1)); - elementProperty(0, 'publicVal2', bind(ctx.val2)); + ΔelementProperty(0, 'val1', Δbind(ctx.val1)); + ΔelementProperty(0, 'publicVal2', Δbind(ctx.val2)); } }, 1, 2, defs); @@ -2154,15 +2153,15 @@ describe('lifecycles', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); - element(1, 'parent'); + Δelement(0, 'parent'); + Δelement(1, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(1)); - elementProperty(0, 'publicVal2', bind(1)); - select(1); - elementProperty(1, 'val1', bind(2)); - elementProperty(1, 'publicVal2', bind(2)); + ΔelementProperty(0, 'val1', Δbind(1)); + ΔelementProperty(0, 'publicVal2', Δbind(1)); + Δselect(1); + ΔelementProperty(1, 'val1', Δbind(2)); + ΔelementProperty(1, 'publicVal2', Δbind(2)); } }, 2, 4, defs); @@ -2213,24 +2212,24 @@ describe('lifecycles', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 1, 2); + let rf1 = ΔembeddedViewStart(0, 1, 2); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val1', bind(1)); - elementProperty(0, 'publicVal2', bind(1)); + ΔelementProperty(0, 'val1', Δbind(1)); + ΔelementProperty(0, 'publicVal2', Δbind(1)); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, defs); @@ -2291,16 +2290,16 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { elementStart(1, 'projected'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { ΔelementStart(1, 'projected'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(1)); - elementProperty(0, 'publicVal2', bind(1)); - select(1); - elementProperty(1, 'val1', bind(2)); - elementProperty(1, 'publicVal2', bind(2)); + ΔelementProperty(0, 'val1', Δbind(1)); + ΔelementProperty(0, 'publicVal2', Δbind(1)); + Δselect(1); + ΔelementProperty(1, 'val1', Δbind(2)); + ΔelementProperty(1, 'publicVal2', Δbind(2)); } }, 2, 4, defs); @@ -2336,25 +2335,25 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'comp'); - { elementStart(1, 'projected'); } - elementEnd(); - elementStart(2, 'comp'); - { elementStart(3, 'projected'); } - elementEnd(); + ΔelementStart(0, 'comp'); + { ΔelementStart(1, 'projected'); } + ΔelementEnd(); + ΔelementStart(2, 'comp'); + { ΔelementStart(3, 'projected'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(1)); - elementProperty(0, 'publicVal2', bind(1)); - select(1); - elementProperty(1, 'val1', bind(2)); - elementProperty(1, 'publicVal2', bind(2)); - select(2); - elementProperty(2, 'val1', bind(3)); - elementProperty(2, 'publicVal2', bind(3)); - select(3); - elementProperty(3, 'val1', bind(4)); - elementProperty(3, 'publicVal2', bind(4)); + ΔelementProperty(0, 'val1', Δbind(1)); + ΔelementProperty(0, 'publicVal2', Δbind(1)); + Δselect(1); + ΔelementProperty(1, 'val1', Δbind(2)); + ΔelementProperty(1, 'publicVal2', Δbind(2)); + Δselect(2); + ΔelementProperty(2, 'val1', Δbind(3)); + ΔelementProperty(2, 'publicVal2', Δbind(3)); + Δselect(3); + ΔelementProperty(3, 'val1', Δbind(4)); + ΔelementProperty(3, 'publicVal2', Δbind(4)); } }, 4, 8, defs); @@ -2401,11 +2400,11 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp', ['dir', '']); + Δelement(0, 'comp', ['dir', '']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(1)); - elementProperty(0, 'publicVal2', bind(1)); + ΔelementProperty(0, 'val1', Δbind(1)); + ΔelementProperty(0, 'publicVal2', Δbind(1)); } }, 1, 2, defs); @@ -2442,11 +2441,11 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['dir', '']); + Δelement(0, 'div', ['dir', '']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(1)); - elementProperty(0, 'publicVal2', bind(1)); + ΔelementProperty(0, 'val1', Δbind(1)); + ΔelementProperty(0, 'publicVal2', Δbind(1)); } }, 1, 2, defs); @@ -2476,31 +2475,31 @@ describe('lifecycles', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); - container(1); - element(2, 'comp'); + Δelement(0, 'comp'); + Δcontainer(1); + Δelement(2, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(1)); - elementProperty(0, 'publicVal2', bind(1)); - select(2); - elementProperty(2, 'val1', bind(5)); - elementProperty(2, 'publicVal2', bind(5)); - containerRefreshStart(1); + ΔelementProperty(0, 'val1', Δbind(1)); + ΔelementProperty(0, 'publicVal2', Δbind(1)); + Δselect(2); + ΔelementProperty(2, 'val1', Δbind(5)); + ΔelementProperty(2, 'publicVal2', Δbind(5)); + ΔcontainerRefreshStart(1); { for (let j = 2; j < 5; j++) { - let rf1 = embeddedViewStart(0, 1, 2); + let rf1 = ΔembeddedViewStart(0, 1, 2); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val1', bind(j)); - elementProperty(0, 'publicVal2', bind(j)); + ΔelementProperty(0, 'val1', Δbind(j)); + ΔelementProperty(0, 'publicVal2', Δbind(j)); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 3, 4, defs); @@ -2563,31 +2562,31 @@ describe('lifecycles', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); - container(1); - element(2, 'parent'); + Δelement(0, 'parent'); + Δcontainer(1); + Δelement(2, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val1', bind(1)); - elementProperty(0, 'publicVal2', bind(1)); - select(2); - elementProperty(2, 'val1', bind(5)); - elementProperty(2, 'publicVal2', bind(5)); - containerRefreshStart(1); + ΔelementProperty(0, 'val1', Δbind(1)); + ΔelementProperty(0, 'publicVal2', Δbind(1)); + Δselect(2); + ΔelementProperty(2, 'val1', Δbind(5)); + ΔelementProperty(2, 'publicVal2', Δbind(5)); + ΔcontainerRefreshStart(1); { for (let j = 2; j < 5; j++) { - let rf1 = embeddedViewStart(0, 1, 2); + let rf1 = ΔembeddedViewStart(0, 1, 2); if (rf1 & RenderFlags.Create) { - element(0, 'parent'); + Δelement(0, 'parent'); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'val1', bind(j)); - elementProperty(0, 'publicVal2', bind(j)); + ΔelementProperty(0, 'val1', Δbind(j)); + ΔelementProperty(0, 'publicVal2', Δbind(j)); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 3, 4, defs); @@ -2687,7 +2686,7 @@ describe('lifecycles', () => { ngOnChanges(changes: SimpleChanges) { events.push(changes); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyComp, factory: () => { // Capture the instance so we can test setting the property directly @@ -2696,10 +2695,10 @@ describe('lifecycles', () => { }, template: (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - element(0, 'div'); + Δelement(0, 'div'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind(ctx.a)); + ΔelementProperty(0, 'id', Δbind(ctx.a)); } }, selectors: [['my-comp']], @@ -2717,10 +2716,10 @@ describe('lifecycles', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'my-comp'); + Δelement(0, 'my-comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'value', bind(1)); + ΔelementProperty(0, 'value', Δbind(1)); } }, 1, 1, [MyComp]); @@ -2758,7 +2757,7 @@ describe('lifecycles', () => { ngAfterViewInit() { events.push(`viewInit ${name}${this.val}`); } ngAfterViewChecked() { events.push(`viewCheck ${name}${this.val}`); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Component, selectors: [[name]], factory: () => new Component(), @@ -2766,7 +2765,7 @@ describe('lifecycles', () => { vars: vars, inputs: {val: 'val'}, template, directives: directives, - features: [NgOnChangesFeature()], + features: [ΔNgOnChangesFeature()], }); }; } @@ -2780,8 +2779,8 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); - element(1, 'comp'); + Δelement(0, 'comp'); + Δelement(1, 'comp'); } // This template function is a little weird in that the `elementProperty` calls // below are directly setting values `1` and `2`, where normally there would be @@ -2789,9 +2788,9 @@ describe('lifecycles', () => { // This means when `fixture.update()` is called below, ngOnChanges should fire, // even though the *value* itself never changed. if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(1); - elementProperty(1, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(1); + ΔelementProperty(1, 'val', 2); } }, 2, 0, [Comp]); @@ -2816,10 +2815,10 @@ describe('lifecycles', () => { /** */ const Parent = createAllHooksComponent('parent', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', bind(ctx.val)); + ΔelementProperty(0, 'val', Δbind(ctx.val)); } }, 1, 1, [Comp]); @@ -2829,13 +2828,13 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent'); - element(1, 'parent'); + Δelement(0, 'parent'); + Δelement(1, 'parent'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', 1); - select(1); - elementProperty(1, 'val', 2); + ΔelementProperty(0, 'val', 1); + Δselect(1); + ΔelementProperty(1, 'val', 2); } }, 2, 0, [Parent]); @@ -2873,13 +2872,13 @@ describe('lifecycles', () => { /** */ const Parent = createAllHooksComponent('parent', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - projectionDef(); - projection(0); - element(1, 'view'); + ΔprojectionDef(); + Δprojection(0); + Δelement(1, 'view'); } if (rf & RenderFlags.Update) { - select(1); - elementProperty(1, 'val', bind(ctx.val)); + Δselect(1); + ΔelementProperty(1, 'val', Δbind(ctx.val)); } }, 2, 1, [View]); @@ -2893,21 +2892,21 @@ describe('lifecycles', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'parent'); - { element(1, 'content'); } - elementEnd(); - elementStart(2, 'parent'); - { element(3, 'content'); } - elementEnd(); + ΔelementStart(0, 'parent'); + { Δelement(1, 'content'); } + ΔelementEnd(); + ΔelementStart(2, 'parent'); + { Δelement(3, 'content'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'val', bind(1)); - select(1); - elementProperty(1, 'val', bind(1)); - select(2); - elementProperty(2, 'val', bind(2)); - select(3); - elementProperty(3, 'val', bind(2)); + ΔelementProperty(0, 'val', Δbind(1)); + Δselect(1); + ΔelementProperty(1, 'val', Δbind(1)); + Δselect(2); + ΔelementProperty(2, 'val', Δbind(2)); + Δselect(3); + ΔelementProperty(3, 'val', Δbind(2)); } }, 4, 4, [Parent, Content]); @@ -2958,7 +2957,7 @@ describe('lifecycles', () => { class OnDestroyDirective implements OnDestroy { ngOnDestroy() { destroyed = true; } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: OnDestroyDirective, selectors: [['', 'onDestroyDirective', '']], factory: () => new OnDestroyDirective() @@ -2968,7 +2967,7 @@ describe('lifecycles', () => { function conditionTpl(rf: RenderFlags, ctx: Cmpt) { if (rf & RenderFlags.Create) { - template(0, null, 0, 1, 'ng-template', [AttributeMarker.Bindings, 'onDestroyDirective']); + Δtemplate(0, null, 0, 1, 'ng-template', [AttributeMarker.Bindings, 'onDestroyDirective']); } } @@ -2979,16 +2978,16 @@ describe('lifecycles', () => { */ function cmptTpl(rf: RenderFlags, cmpt: Cmpt) { if (rf & RenderFlags.Create) { - template(0, conditionTpl, 1, 1, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); + Δtemplate(0, conditionTpl, 1, 1, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'ngIf', bind(cmpt.showing)); + ΔelementProperty(0, 'ngIf', Δbind(cmpt.showing)); } } class Cmpt { showing = true; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Cmpt, factory: () => new Cmpt(), selectors: [['cmpt']], diff --git a/packages/core/test/render3/listeners_spec.ts b/packages/core/test/render3/listeners_spec.ts index 75468d3a5f..b37695351e 100644 --- a/packages/core/test/render3/listeners_spec.ts +++ b/packages/core/test/render3/listeners_spec.ts @@ -8,11 +8,11 @@ import {dispatchEvent} from '@angular/platform-browser/testing/src/browser_util'; -import {bind, defineComponent, defineDirective, markDirty, reference, resolveBody, resolveDocument, textBinding} from '../../src/render3/index'; -import {container, containerRefreshEnd, containerRefreshStart, element, elementEnd, elementStart, embeddedViewEnd, embeddedViewStart, getCurrentView, listener, text} from '../../src/render3/instructions/all'; +import {markDirty, Δbind, ΔdefineComponent, ΔdefineDirective, Δreference, ΔresolveBody, ΔresolveDocument, ΔtextBinding} from '../../src/render3/index'; +import {Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, ΔgetCurrentView, Δlistener, Δtext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {GlobalTargetResolver} from '../../src/render3/interfaces/renderer'; -import {restoreView} from '../../src/render3/state'; +import {ΔrestoreView} from '../../src/render3/state'; import {getRendererFactory2} from './imported_renderer2'; import {ComponentFixture, TemplateFixture, containerEl, createComponent, getDirectiveOnNode, renderToHtml, requestAnimationFrame} from './render_util'; @@ -28,7 +28,7 @@ describe('event listeners', () => { onClick() { this.counter++; } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyComp, selectors: [['comp']], consts: 2, @@ -36,12 +36,12 @@ describe('event listeners', () => { /** */ template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(); }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.onClick(); }); + Δtext(1, 'Click me'); } - elementEnd(); + ΔelementEnd(); } }, factory: () => { @@ -59,14 +59,14 @@ describe('event listeners', () => { /* @HostListener('body:click') */ onBodyClick() { events.push('component - body:click'); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyCompWithGlobalListeners, selectors: [['comp']], consts: 1, vars: 0, template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'Some text'); + Δtext(0, 'Some text'); } }, factory: () => { @@ -77,12 +77,12 @@ describe('event listeners', () => { hostBindings: function HostListenerDir_HostBindings( rf: RenderFlags, ctx: any, elIndex: number) { if (rf & RenderFlags.Create) { - listener('custom', function() { + Δlistener('custom', function() { return ctx.onDocumentCustomEvent(); - }, false, resolveDocument as GlobalTargetResolver); - listener('click', function() { + }, false, ΔresolveDocument as GlobalTargetResolver); + Δlistener('click', function() { return ctx.onBodyClick(); - }, false, resolveBody as GlobalTargetResolver); + }, false, ΔresolveBody as GlobalTargetResolver); } } }); @@ -95,19 +95,19 @@ describe('event listeners', () => { /* @HostListener('body:click') */ onBodyClick() { events.push('directive - body:click'); } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: GlobalHostListenerDir, selectors: [['', 'hostListenerDir', '']], factory: function HostListenerDir_Factory() { return new GlobalHostListenerDir(); }, hostBindings: function HostListenerDir_HostBindings( rf: RenderFlags, ctx: any, elIndex: number) { if (rf & RenderFlags.Create) { - listener('custom', function() { + Δlistener('custom', function() { return ctx.onDocumentCustomEvent(); - }, false, resolveDocument as GlobalTargetResolver); - listener('click', function() { + }, false, ΔresolveDocument as GlobalTargetResolver); + Δlistener('click', function() { return ctx.onBodyClick(); - }, false, resolveBody as GlobalTargetResolver); + }, false, ΔresolveBody as GlobalTargetResolver); } } }); @@ -129,7 +129,7 @@ describe('event listeners', () => { return this.handlerReturnValue; } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: PreventDefaultComp, selectors: [['prevent-default-comp']], factory: () => new PreventDefaultComp(), @@ -138,12 +138,12 @@ describe('event listeners', () => { /** */ template: (rf: RenderFlags, ctx: PreventDefaultComp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function($event: any) { return ctx.onClick($event); }); - text(1, 'Click'); + Δlistener('click', function($event: any) { return ctx.onClick($event); }); + Δtext(1, 'Click'); } - elementEnd(); + ΔelementEnd(); } } }); @@ -205,15 +205,15 @@ describe('event listeners', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { + Δlistener('click', function() { ctx.onClick(); return ctx.onClick2(); }); - text(1, 'Click me'); + Δtext(1, 'Click me'); } - elementEnd(); + ΔelementEnd(); } } @@ -240,12 +240,12 @@ describe('event listeners', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.showing = !ctx.showing; }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.showing = !ctx.showing; }); + Δtext(1, 'Click me'); } - elementEnd(); + ΔelementEnd(); } } @@ -269,24 +269,24 @@ describe('event listeners', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.showing) { - if (embeddedViewStart(1, 2, 0)) { - elementStart(0, 'button'); + if (ΔembeddedViewStart(1, 2, 0)) { + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(); }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.onClick(); }); + Δtext(1, 'Click me'); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -320,7 +320,7 @@ describe('event listeners', () => { onClick() { this.counter++; } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AppComp, selectors: [['app-comp']], factory: () => new AppComp(), @@ -328,24 +328,24 @@ describe('event listeners', () => { vars: 0, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.showing) { - if (embeddedViewStart(0, 2, 0)) { - elementStart(0, 'button'); + if (ΔembeddedViewStart(0, 2, 0)) { + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(); }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.onClick(); }); + Δtext(1, 'Click me'); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } }); @@ -381,7 +381,7 @@ describe('event listeners', () => { onClick(index: number) { this.counters[index]++; } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AppComp, selectors: [['app-comp']], factory: () => new AppComp(), @@ -389,24 +389,24 @@ describe('event listeners', () => { vars: 0, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { for (let i = 0; i < ctx.buttons; i++) { - if (embeddedViewStart(0, 2, 0)) { - elementStart(0, 'button'); + if (ΔembeddedViewStart(0, 2, 0)) { + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(i); }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.onClick(i); }); + Δtext(1, 'Click me'); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } }); @@ -445,7 +445,7 @@ describe('event listeners', () => { onClick(index: number) { this.counters[index]++; } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AppComp, selectors: [['app-comp']], factory: () => new AppComp(), @@ -453,31 +453,31 @@ describe('event listeners', () => { vars: 0, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { for (let i = 0; i < ctx.buttons; i++) { - const rf1 = embeddedViewStart(1, 4, 1); + const rf1 = ΔembeddedViewStart(1, 4, 1); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(i); }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.onClick(i); }); + Δtext(1, 'Click me'); } - elementEnd(); - elementStart(2, 'div'); - { text(3); } - elementEnd(); + ΔelementEnd(); + ΔelementStart(2, 'div'); + { Δtext(3); } + ΔelementEnd(); } if (rf1 & RenderFlags.Update) { - textBinding(3, bind(ctx.counters[i])); + ΔtextBinding(3, Δbind(ctx.counters[i])); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } }); @@ -523,21 +523,21 @@ describe('event listeners', () => { /* @HostListener('click') */ onClick() { events.push('click!'); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyComp, selectors: [['comp']], consts: 1, vars: 0, template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'Some text'); + Δtext(0, 'Some text'); } }, factory: () => { return new MyComp(); }, hostBindings: function HostListenerDir_HostBindings( rf: RenderFlags, ctx: any, elIndex: number) { if (rf & RenderFlags.Create) { - listener('click', function() { return ctx.onClick(); }); + Δlistener('click', function() { return ctx.onClick(); }); } } }); @@ -574,23 +574,23 @@ describe('event listeners', () => { /* @HostListener('click') */ onClick() { events.push('click!'); } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: HostListenerDir, selectors: [['', 'hostListenerDir', '']], factory: function HostListenerDir_Factory() { return new HostListenerDir(); }, hostBindings: function HostListenerDir_HostBindings( rf: RenderFlags, ctx: any, elIndex: number) { if (rf & RenderFlags.Create) { - listener('click', function() { return ctx.onClick(); }); + Δlistener('click', function() { return ctx.onClick(); }); } } }); } const fixture = new TemplateFixture(() => { - elementStart(0, 'button', ['hostListenerDir', '']); - text(1, 'Click'); - elementEnd(); + ΔelementStart(0, 'button', ['hostListenerDir', '']); + Δtext(1, 'Click'); + ΔelementEnd(); }, () => {}, 2, 0, [HostListenerDir]); const button = fixture.hostElement.querySelector('button') !; @@ -604,7 +604,7 @@ describe('event listeners', () => { it('should support global host listeners on directives', () => { const fixture = new TemplateFixture(() => { - element(0, 'div', ['hostListenerDir', '']); + Δelement(0, 'div', ['hostListenerDir', '']); }, () => {}, 1, 0, [GlobalHostListenerDir]); const doc = fixture.hostElement.ownerDocument !; @@ -626,7 +626,7 @@ describe('event listeners', () => { onClick(a: any, b: any) { this.counter += a + b; } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyComp, selectors: [['comp']], consts: 2, @@ -634,12 +634,12 @@ describe('event listeners', () => { /** */ template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(ctx.data.a, ctx.data.b); }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.onClick(ctx.data.a, ctx.data.b); }); + Δtext(1, 'Click me'); } - elementEnd(); + ΔelementEnd(); } }, factory: () => new MyComp() @@ -669,39 +669,39 @@ describe('event listeners', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.showing) { - let rf1 = embeddedViewStart(0, 2, 0); + let rf1 = ΔembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - text(0, 'Hello'); - container(1); + Δtext(0, 'Hello'); + Δcontainer(1); } if (rf1 & RenderFlags.Update) { - containerRefreshStart(1); + ΔcontainerRefreshStart(1); { if (ctx.button) { - let rf1 = embeddedViewStart(0, 2, 0); + let rf1 = ΔembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(); }); - text(1, 'Click'); + Δlistener('click', function() { return ctx.onClick(); }); + Δtext(1, 'Click'); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -733,22 +733,22 @@ describe('event listeners', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.showing) { - let rf1 = embeddedViewStart(0, 3, 0); + let rf1 = ΔembeddedViewStart(0, 3, 0); if (rf1 & RenderFlags.Create) { - text(0, 'Hello'); - element(1, 'comp'); - element(2, 'comp'); + Δtext(0, 'Hello'); + Δelement(1, 'comp'); + Δelement(2, 'comp'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -775,19 +775,19 @@ describe('event listeners', () => { const ctx = {showing: true}; const fixture = new TemplateFixture( - () => { container(0); }, + () => { Δcontainer(0); }, () => { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.showing) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); }, 1, 0, [MyCompWithGlobalListeners]); @@ -820,56 +820,56 @@ describe('event listeners', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 3, 0); + let rf1 = ΔembeddedViewStart(0, 3, 0); if (rf1 & RenderFlags.Create) { - text(0, 'Hello'); - container(1); - container(2); + Δtext(0, 'Hello'); + Δcontainer(1); + Δcontainer(2); } if (rf1 & RenderFlags.Update) { - containerRefreshStart(1); + ΔcontainerRefreshStart(1); { if (ctx.sub1) { - let rf1 = embeddedViewStart(0, 2, 0); + let rf1 = ΔembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.counter1++; }); - text(1, 'Click'); + Δlistener('click', function() { return ctx.counter1++; }); + Δtext(1, 'Click'); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); - containerRefreshStart(2); + ΔcontainerRefreshEnd(); + ΔcontainerRefreshStart(2); { if (ctx.sub2) { - let rf1 = embeddedViewStart(0, 2, 0); + let rf1 = ΔembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.counter2++; }); - text(1, 'Click'); + Δlistener('click', function() { return ctx.counter2++; }); + Δtext(1, 'Click'); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -907,7 +907,7 @@ describe('event listeners', () => { onClick(comp: any) { this.comp = comp; } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: App, selectors: [['app']], factory: () => new App(), @@ -915,17 +915,17 @@ describe('event listeners', () => { vars: 0, template: (rf: RenderFlags, ctx: App) => { if (rf & RenderFlags.Create) { - const state = getCurrentView(); - element(0, 'comp', null, ['comp', '']); - elementStart(2, 'button'); + const state = ΔgetCurrentView(); + Δelement(0, 'comp', null, ['comp', '']); + ΔelementStart(2, 'button'); { - listener('click', function() { - restoreView(state); - const comp = reference(1); + Δlistener('click', function() { + ΔrestoreView(state); + const comp = Δreference(1); return ctx.onClick(comp); }); } - elementEnd(); + ΔelementEnd(); } // testing only diff --git a/packages/core/test/render3/outputs_spec.ts b/packages/core/test/render3/outputs_spec.ts index af3754ff97..17ec22575d 100644 --- a/packages/core/test/render3/outputs_spec.ts +++ b/packages/core/test/render3/outputs_spec.ts @@ -8,8 +8,8 @@ import {EventEmitter} from '@angular/core'; -import {defineComponent, defineDirective} from '../../src/render3/index'; -import {bind, container, containerRefreshEnd, containerRefreshStart, element, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, listener, text} from '../../src/render3/instructions/all'; +import {ΔdefineComponent, ΔdefineDirective} from '../../src/render3/index'; +import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δlistener, Δtext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {containerEl, renderToHtml} from './render_util'; @@ -23,7 +23,7 @@ describe('outputs', () => { change = new EventEmitter(); resetStream = new EventEmitter(); - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ButtonToggle, selectors: [['button-toggle']], template: function(rf: RenderFlags, ctx: any) {}, @@ -39,7 +39,7 @@ describe('outputs', () => { class OtherDir { changeStream = new EventEmitter(); - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: OtherDir, selectors: [['', 'otherDir', '']], factory: () => otherDir = new OtherDir, @@ -51,7 +51,7 @@ describe('outputs', () => { events: string[] = []; ngOnDestroy() { this.events.push('destroy'); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: DestroyComp, selectors: [['destroy-comp']], consts: 0, @@ -65,7 +65,7 @@ describe('outputs', () => { class MyButton { click = new EventEmitter(); - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyButton, selectors: [['', 'myButton', '']], factory: () => buttonDir = new MyButton, @@ -80,11 +80,11 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button-toggle'); + ΔelementStart(0, 'button-toggle'); { - listener('change', function() { return ctx.onChange(); }); + Δlistener('change', function() { return ctx.onChange(); }); } - elementEnd(); + ΔelementEnd(); } } @@ -103,12 +103,12 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button-toggle'); + ΔelementStart(0, 'button-toggle'); { - listener('change', function() { return ctx.onChange(); }); - listener('reset', function() { return ctx.onReset(); }); + Δlistener('change', function() { return ctx.onChange(); }); + Δlistener('reset', function() { return ctx.onReset(); }); } - elementEnd(); + ΔelementEnd(); } } @@ -128,11 +128,11 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button-toggle'); + ΔelementStart(0, 'button-toggle'); { - listener('change', function() { return ctx.counter++; }); + Δlistener('change', function() { return ctx.counter++; }); } - elementEnd(); + ΔelementEnd(); } } @@ -155,24 +155,24 @@ describe('outputs', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button-toggle'); + ΔelementStart(0, 'button-toggle'); { - listener('change', function() { return ctx.onChange(); }); + Δlistener('change', function() { return ctx.onChange(); }); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -201,35 +201,35 @@ describe('outputs', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - container(0); + Δcontainer(0); } - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition2) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button-toggle'); + ΔelementStart(0, 'button-toggle'); { - listener('change', function() { return ctx.onChange(); }); + Δlistener('change', function() { return ctx.onChange(); }); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); - embeddedViewEnd(); + ΔcontainerRefreshEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -257,31 +257,31 @@ describe('outputs', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 4, 0); + let rf1 = ΔembeddedViewStart(0, 4, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(); }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.onClick(); }); + Δtext(1, 'Click me'); } - elementEnd(); - elementStart(2, 'button-toggle'); + ΔelementEnd(); + ΔelementStart(2, 'button-toggle'); { - listener('change', function() { return ctx.onChange(); }); + Δlistener('change', function() { return ctx.onChange(); }); } - elementEnd(); - element(3, 'destroy-comp'); + ΔelementEnd(); + Δelement(3, 'destroy-comp'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -313,11 +313,11 @@ describe('outputs', () => { it('should fire event listeners along with outputs if they match', () => { function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button', ['myButton', '']); + ΔelementStart(0, 'button', ['myButton', '']); { - listener('click', function() { return ctx.onClick(); }); + Δlistener('click', function() { return ctx.onClick(); }); } - elementEnd(); + ΔelementEnd(); } } @@ -338,11 +338,11 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button-toggle', ['otherDir', '']); + ΔelementStart(0, 'button-toggle', ['otherDir', '']); { - listener('change', function() { return ctx.onChange(); }); + Δlistener('change', function() { return ctx.onChange(); }); } - elementEnd(); + ΔelementEnd(); } } @@ -363,7 +363,7 @@ describe('outputs', () => { // TODO(issue/24571): remove '!'. change !: boolean; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: OtherChangeDir, selectors: [['', 'otherChangeDir', '']], factory: () => otherDir = new OtherChangeDir, @@ -374,14 +374,14 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button-toggle', ['otherChangeDir', '']); + ΔelementStart(0, 'button-toggle', ['otherChangeDir', '']); { - listener('change', function() { return ctx.onChange(); }); + Δlistener('change', function() { return ctx.onChange(); }); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'change', bind(ctx.change)); + ΔelementProperty(0, 'change', Δbind(ctx.change)); } } @@ -409,39 +409,39 @@ describe('outputs', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(); }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.onClick(); }); + Δtext(1, 'Click me'); } - elementEnd(); - container(2); + ΔelementEnd(); + Δcontainer(2); } if (rf & RenderFlags.Update) { - containerRefreshStart(2); + ΔcontainerRefreshStart(2); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button-toggle'); + ΔelementStart(0, 'button-toggle'); { - listener('change', function() { return ctx.onChange(); }); + Δlistener('change', function() { return ctx.onChange(); }); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } else { - if (embeddedViewStart(1, 1, 0)) { - elementStart(0, 'div', ['otherDir', '']); + if (ΔembeddedViewStart(1, 1, 0)) { + ΔelementStart(0, 'div', ['otherDir', '']); { - listener('change', function() { return ctx.onChange(); }); + Δlistener('change', function() { return ctx.onChange(); }); } - elementEnd(); + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } diff --git a/packages/core/test/render3/pipe_spec.ts b/packages/core/test/render3/pipe_spec.ts index 06da5ce61d..5f1ff5ae63 100644 --- a/packages/core/test/render3/pipe_spec.ts +++ b/packages/core/test/render3/pipe_spec.ts @@ -6,14 +6,14 @@ * found in the LICENSE file at https://angular.io/license */ -import {Directive as _Directive, InjectionToken, OnChanges, OnDestroy, Pipe as _Pipe, PipeTransform, WrappedValue, defineInjectable, defineInjector, ɵNgModuleDef as NgModuleDef, ɵdefineComponent as defineComponent, ɵdirectiveInject as directiveInject} from '@angular/core'; +import {Directive as _Directive, InjectionToken, OnChanges, OnDestroy, Pipe as _Pipe, PipeTransform, WrappedValue, ɵNgModuleDef as NgModuleDef, ΔdefineComponent as defineComponent, ΔdefineInjectable, ΔdefineInjector, ΔdirectiveInject as directiveInject} from '@angular/core'; import {expect} from '@angular/platform-browser/testing/src/matchers'; import {createInjector} from '../../src/di/r3_injector'; -import {defineDirective, definePipe} from '../../src/render3/definition'; -import {bind, container, containerRefreshEnd, containerRefreshStart, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, interpolation1, load, text, textBinding} from '../../src/render3/instructions/all'; +import {ΔdefineDirective, ΔdefinePipe} from '../../src/render3/definition'; +import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δinterpolation1, Δload, Δtext, ΔtextBinding} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; -import {pipe, pipeBind1, pipeBind3, pipeBind4, pipeBindV} from '../../src/render3/pipe'; +import {Δpipe, ΔpipeBind1, ΔpipeBind3, ΔpipeBind4, ΔpipeBindV} from '../../src/render3/pipe'; import {RenderLog, getRendererFactory2, patchLoggingRenderer2} from './imported_renderer2'; import {ComponentFixture, TemplateFixture, createComponent, getDirectiveOnNode, renderToHtml} from './render_util'; @@ -46,11 +46,11 @@ describe('pipe', () => { it('should support interpolation', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - text(0); - pipe(1, 'countingPipe'); + Δtext(0); + Δpipe(1, 'countingPipe'); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('', pipeBind1(1, 1, person.name), '')); + ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.name), '')); } } @@ -61,11 +61,11 @@ describe('pipe', () => { it('should throw if pipe is not found', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0); - pipe(1, 'randomPipeName'); + Δtext(0); + Δpipe(1, 'randomPipeName'); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('', pipeBind1(1, 1, ctx.value), '')); + ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, ctx.value), '')); } }, 2, 3, [], pipes); @@ -83,7 +83,7 @@ describe('pipe', () => { constructor() { this.dirProp = ''; } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDir, selectors: [['', 'myDir', '']], factory: () => new MyDir(), @@ -95,7 +95,7 @@ describe('pipe', () => { class DoublePipe implements PipeTransform { transform(value: any) { return `${value}${value}`; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'double', type: DoublePipe, factory: function DoublePipe_Factory() { return new DoublePipe(); }, @@ -104,12 +104,12 @@ describe('pipe', () => { function Template(rf: RenderFlags, ctx: string) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['myDir', '']); - pipe(1, 'double'); - elementEnd(); + ΔelementStart(0, 'div', ['myDir', '']); + Δpipe(1, 'double'); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'elprop', bind(pipeBind1(1, 1, ctx))); + ΔelementProperty(0, 'elprop', Δbind(ΔpipeBind1(1, 1, ctx))); directive = getDirectiveOnNode(0); } } @@ -120,12 +120,13 @@ describe('pipe', () => { it('should support arguments in pipes', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - text(0); - pipe(1, 'multiArgPipe'); + Δtext(0); + Δpipe(1, 'multiArgPipe'); } if (rf & RenderFlags.Update) { - textBinding( - 0, interpolation1('', pipeBind3(1, 1, person.name, 'one', person.address !.city), '')); + ΔtextBinding( + 0, + Δinterpolation1('', ΔpipeBind3(1, 1, person.name, 'one', person.address !.city), '')); } } @@ -136,14 +137,14 @@ describe('pipe', () => { it('should support calling pipes with different number of arguments', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - text(0); - pipe(1, 'multiArgPipe'); - pipe(2, 'multiArgPipe'); + Δtext(0); + Δpipe(1, 'multiArgPipe'); + Δpipe(2, 'multiArgPipe'); } if (rf & RenderFlags.Update) { - textBinding( - 0, interpolation1( - '', pipeBind4(2, 5, pipeBindV(1, 1, [person.name, 'a', 'b']), 0, 1, 2), '')); + ΔtextBinding( + 0, Δinterpolation1( + '', ΔpipeBind4(2, 5, ΔpipeBindV(1, 1, [person.name, 'a', 'b']), 0, 1, 2), '')); } } @@ -156,7 +157,7 @@ describe('pipe', () => { class IdentityPipe implements PipeTransform { transform(value: any) { return value; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'identityPipe', type: IdentityPipe, factory: function IdentityPipe_Factory() { return new IdentityPipe(); }, @@ -165,12 +166,12 @@ describe('pipe', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - pipe(1, 'identityPipe'); - elementEnd(); + ΔelementStart(0, 'div'); + Δpipe(1, 'identityPipe'); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind(pipeBind1(1, 1, 'Megatron'))); + ΔelementProperty(0, 'id', Δbind(ΔpipeBind1(1, 1, 'Megatron'))); } } @@ -185,11 +186,11 @@ describe('pipe', () => { it('should support duplicates by using the later entry', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - text(0); - pipe(1, 'duplicatePipe'); + Δtext(0); + Δpipe(1, 'duplicatePipe'); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('', pipeBind1(1, 1, person.name), '')); + ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.name), '')); } } @@ -201,11 +202,11 @@ describe('pipe', () => { it('should call pure pipes only if the arguments change', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - text(0); - pipe(1, 'countingPipe'); + Δtext(0); + Δpipe(1, 'countingPipe'); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('', pipeBind1(1, 1, person.name), '')); + ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.name), '')); } } @@ -230,11 +231,11 @@ describe('pipe', () => { it('should call impure pipes on each change detection run', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - text(0); - pipe(1, 'countingImpurePipe'); + Δtext(0); + Δpipe(1, 'countingImpurePipe'); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('', pipeBind1(1, 1, person.name), '')); + ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.name), '')); } } @@ -246,37 +247,37 @@ describe('pipe', () => { it('should not cache impure pipes', () => { function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - pipe(1, 'countingImpurePipe'); - elementEnd(); - elementStart(2, 'div'); - pipe(3, 'countingImpurePipe'); - elementEnd(); - container(4); + ΔelementStart(0, 'div'); + Δpipe(1, 'countingImpurePipe'); + ΔelementEnd(); + ΔelementStart(2, 'div'); + Δpipe(3, 'countingImpurePipe'); + ΔelementEnd(); + Δcontainer(4); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind(pipeBind1(1, 2, true))); - elementProperty(2, 'id', bind(pipeBind1(3, 4, true))); - pipeInstances.push(load(1), load(3)); - containerRefreshStart(4); + ΔelementProperty(0, 'id', Δbind(ΔpipeBind1(1, 2, true))); + ΔelementProperty(2, 'id', Δbind(ΔpipeBind1(3, 4, true))); + pipeInstances.push(Δload(1), Δload(3)); + ΔcontainerRefreshStart(4); { for (let i of [1, 2]) { - let rf1 = embeddedViewStart(1, 2, 3); + let rf1 = ΔembeddedViewStart(1, 2, 3); { if (rf1 & RenderFlags.Create) { - elementStart(0, 'div'); - pipe(1, 'countingImpurePipe'); - elementEnd(); + ΔelementStart(0, 'div'); + Δpipe(1, 'countingImpurePipe'); + ΔelementEnd(); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'id', bind(pipeBind1(1, 1, true))); - pipeInstances.push(load(1)); + ΔelementProperty(0, 'id', Δbind(ΔpipeBind1(1, 1, true))); + pipeInstances.push(Δload(1)); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } @@ -300,7 +301,7 @@ describe('pipe', () => { transform(value: any): any { return null; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'pipeWithOnDestroy', type: PipeWithOnDestroy, factory: function PipeWithOnDestroy_Factory() { return new PipeWithOnDestroy(); }, @@ -310,26 +311,26 @@ describe('pipe', () => { it('should call ngOnDestroy on pipes', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (person.age > 20) { - let rf1 = embeddedViewStart(1, 2, 3); + let rf1 = ΔembeddedViewStart(1, 2, 3); { if (rf1 & RenderFlags.Create) { - text(0); - pipe(1, 'pipeWithOnDestroy'); + Δtext(0); + Δpipe(1, 'pipeWithOnDestroy'); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('', pipeBind1(1, 1, person.age), '')); + ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.age), '')); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } const pipes = [PipeWithOnDestroy]; @@ -362,11 +363,11 @@ describe('pipe', () => { title = 'ServiceB Title'; static ngInjectableDef = - defineInjectable({providedIn: 'root', factory: () => new ServiceB()}); + ΔdefineInjectable({providedIn: 'root', factory: () => new ServiceB()}); } class ModuleA { - static ngInjectorDef = defineInjector({factory: () => new ModuleA(), providers: [ServiceA]}); + static ngInjectorDef = ΔdefineInjector({factory: () => new ModuleA(), providers: [ServiceA]}); static ngModuleDef: NgModuleDef = { bootstrap: [] } as any; } @@ -376,7 +377,7 @@ describe('pipe', () => { transform(value: string): string { return `${value} - ${this.obj.title}`; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'myConcatPipe', type: MyConcatPipe, factory: () => new MyConcatPipe(directiveInject(InjectionType)), @@ -398,11 +399,11 @@ describe('pipe', () => { // '{{ title | myConcatPipe }}' template: (rf: RenderFlags, ctx: MyComponent) => { if (rf & 1) { - text(0); - pipe(1, 'myConcatPipe'); + Δtext(0); + Δpipe(1, 'myConcatPipe'); } if (rf & 2) { - textBinding(0, interpolation1('', pipeBind1(1, 1, ctx.title), '')); + ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, ctx.title), '')); } }, ...overrides @@ -438,7 +439,7 @@ describe('pipe', () => { class WrappingPipe implements PipeTransform { transform(value: any) { return new WrappedValue('Bar'); } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'wrappingPipe', type: WrappingPipe, factory: function WrappingPipe_Factory() { return new WrappingPipe(); }, @@ -447,11 +448,11 @@ describe('pipe', () => { } function createTemplate() { - text(0); - pipe(1, 'wrappingPipe'); + Δtext(0); + Δpipe(1, 'wrappingPipe'); } - function updateTemplate() { textBinding(0, interpolation1('', pipeBind1(1, 1, null), '')); } + function updateTemplate() { ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, null), '')); } it('should unwrap', () => { const fixture = @@ -480,7 +481,7 @@ class CountingPipe implements PipeTransform { transform(value: any) { return `${value} state:${this.state++}`; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'countingPipe', type: CountingPipe, factory: function CountingPipe_Factory() { return new CountingPipe(); }, @@ -493,7 +494,7 @@ class CountingImpurePipe implements PipeTransform { transform(value: any) { return `${value} state:${this.state++}`; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'countingImpurePipe', type: CountingImpurePipe, factory: function CountingImpurePipe_Factory() { return new CountingImpurePipe(); }, @@ -507,7 +508,7 @@ class MultiArgPipe implements PipeTransform { return `${value} ${arg1} ${arg2} ${arg3}`; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'multiArgPipe', type: MultiArgPipe, factory: function MultiArgPipe_Factory() { return new MultiArgPipe(); }, @@ -518,7 +519,7 @@ class MultiArgPipe implements PipeTransform { class DuplicatePipe1 implements PipeTransform { transform(value: any) { return `${value} from duplicate 1`; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'duplicatePipe', type: DuplicatePipe1, factory: function DuplicatePipe1_Factory() { return new DuplicatePipe1(); }, @@ -529,7 +530,7 @@ class DuplicatePipe1 implements PipeTransform { class DuplicatePipe2 implements PipeTransform { transform(value: any) { return `${value} from duplicate 2`; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'duplicatePipe', type: DuplicatePipe2, factory: function DuplicatePipe2_Factory() { return new DuplicatePipe2(); }, diff --git a/packages/core/test/render3/properties_spec.ts b/packages/core/test/render3/properties_spec.ts index bc37727ecc..fc28b0d203 100644 --- a/packages/core/test/render3/properties_spec.ts +++ b/packages/core/test/render3/properties_spec.ts @@ -8,8 +8,8 @@ import {EventEmitter} from '@angular/core'; -import {defineComponent, defineDirective} from '../../src/render3/index'; -import {bind, container, containerRefreshEnd, containerRefreshStart, element, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, interpolation1, listener, load, reference, text, textBinding} from '../../src/render3/instructions/all'; +import {ΔdefineComponent, ΔdefineDirective} from '../../src/render3/index'; +import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δinterpolation1, Δlistener, Δload, Δreference, Δtext, ΔtextBinding} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {ComponentFixture, createComponent, renderToHtml} from './render_util'; @@ -19,10 +19,10 @@ describe('elementProperty', () => { it('should support bindings to properties', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'span'); + Δelement(0, 'span'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind(ctx.id)); + ΔelementProperty(0, 'id', Δbind(ctx.id)); } }, 1, 1); @@ -47,8 +47,8 @@ describe('elementProperty', () => { function Template(rf: RenderFlags, ctx: string) { if (rf & RenderFlags.Create) { - element(0, 'span'); - elementProperty(0, 'id', expensive(ctx)); + Δelement(0, 'span'); + ΔelementProperty(0, 'id', expensive(ctx)); } } @@ -59,10 +59,10 @@ describe('elementProperty', () => { it('should support interpolation for properties', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'span'); + Δelement(0, 'span'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', interpolation1('_', ctx.id, '_')); + ΔelementProperty(0, 'id', Δinterpolation1('_', ctx.id, '_')); } }, 1, 1); @@ -86,7 +86,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. disabled !: boolean; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyButton, selectors: [['', 'myButton', '']], factory: () => button = new MyButton(), @@ -99,7 +99,7 @@ describe('elementProperty', () => { id !: number; clickStream = new EventEmitter(); - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: OtherDir, selectors: [['', 'otherDir', '']], factory: () => otherDir = new OtherDir(), @@ -112,7 +112,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. disabled !: boolean; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: OtherDisabledDir, selectors: [['', 'otherDisabledDir', '']], factory: () => otherDisabledDir = new OtherDisabledDir(), @@ -124,7 +124,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. idNumber !: string; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: IdDir, selectors: [['', 'idDir', '']], factory: () => idDir = new IdDir(), @@ -140,13 +140,13 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button', ['otherDir', '', 'myButton', '']); - { text(1, 'Click me'); } - elementEnd(); + ΔelementStart(0, 'button', ['otherDir', '', 'myButton', '']); + { Δtext(1, 'Click me'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'disabled', bind(ctx.isDisabled)); - elementProperty(0, 'id', bind(ctx.id)); + ΔelementProperty(0, 'disabled', Δbind(ctx.isDisabled)); + ΔelementProperty(0, 'id', Δbind(ctx.id)); } }, 2, 2, deps); @@ -171,13 +171,13 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button', ['myButton', '']); - { text(1, 'Click me'); } - elementEnd(); + ΔelementStart(0, 'button', ['myButton', '']); + { Δtext(1, 'Click me'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'disabled', bind(ctx.isDisabled)); - elementProperty(0, 'id', bind(ctx.id)); + ΔelementProperty(0, 'disabled', Δbind(ctx.isDisabled)); + ΔelementProperty(0, 'id', Δbind(ctx.id)); } }, 2, 2, deps); @@ -203,7 +203,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. id !: number; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Comp, selectors: [['comp']], consts: 0, @@ -217,10 +217,10 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind(ctx.id)); + ΔelementProperty(0, 'id', Δbind(ctx.id)); } }, 1, 1, [Comp]); @@ -241,12 +241,12 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button', ['myButton', '', 'otherDisabledDir', '']); - { text(1, 'Click me'); } - elementEnd(); + ΔelementStart(0, 'button', ['myButton', '', 'otherDisabledDir', '']); + { Δtext(1, 'Click me'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'disabled', bind(ctx.isDisabled)); + ΔelementProperty(0, 'disabled', Δbind(ctx.isDisabled)); } }, 2, 1, deps); @@ -268,15 +268,15 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button', ['otherDir', '']); + ΔelementStart(0, 'button', ['otherDir', '']); { - listener('click', () => ctx.onClick()); - text(1, 'Click me'); + Δlistener('click', () => ctx.onClick()); + Δtext(1, 'Click me'); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind(ctx.id)); + ΔelementProperty(0, 'id', Δbind(ctx.id)); } }, 2, 1, deps); @@ -308,40 +308,40 @@ describe('elementProperty', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button', ['idDir', '']); - { text(1, 'Click me'); } - elementEnd(); - container(2); + ΔelementStart(0, 'button', ['idDir', '']); + { Δtext(1, 'Click me'); } + ΔelementEnd(); + Δcontainer(2); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind(ctx.id1)); - containerRefreshStart(2); + ΔelementProperty(0, 'id', Δbind(ctx.id1)); + ΔcontainerRefreshStart(2); { if (ctx.condition) { - let rf0 = embeddedViewStart(0, 2, 1); + let rf0 = ΔembeddedViewStart(0, 2, 1); if (rf0 & RenderFlags.Create) { - elementStart(0, 'button'); - { text(1, 'Click me too'); } - elementEnd(); + ΔelementStart(0, 'button'); + { Δtext(1, 'Click me too'); } + ΔelementEnd(); } if (rf0 & RenderFlags.Update) { - elementProperty(0, 'id', bind(ctx.id2)); + ΔelementProperty(0, 'id', Δbind(ctx.id2)); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } else { - let rf1 = embeddedViewStart(1, 2, 1); + let rf1 = ΔembeddedViewStart(1, 2, 1); if (rf1 & RenderFlags.Create) { - elementStart(0, 'button', ['otherDir', '']); - { text(1, 'Click me too'); } - elementEnd(); + ΔelementStart(0, 'button', ['otherDir', '']); + { Δtext(1, 'Click me too'); } + ΔelementEnd(); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'id', bind(ctx.id3)); + ΔelementProperty(0, 'id', Δbind(ctx.id3)); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 3, 1, deps); @@ -375,7 +375,7 @@ describe('elementProperty', () => { direction !: string; changeStream = new EventEmitter(); - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDir, selectors: [['', 'myDir', '']], factory: () => myDir = new MyDir(), @@ -390,7 +390,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. roleB !: string; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDirB, selectors: [['', 'myDirB', '']], factory: () => dirB = new MyDirB(), @@ -405,7 +405,7 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['role', 'button', 'myDir', '']); + Δelement(0, 'div', ['role', 'button', 'myDir', '']); } }, 1, 0, deps); @@ -419,10 +419,10 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['role', 'button', 'myDir', '']); + Δelement(0, 'div', ['role', 'button', 'myDir', '']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'role', bind(ctx.role)); + ΔelementProperty(0, 'role', Δbind(ctx.role)); } }, 1, 1, deps); @@ -442,7 +442,7 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['role', 'button', 'myDir', '', 'myDirB', '']); + Δelement(0, 'div', ['role', 'button', 'myDir', '', 'myDirB', '']); } }, 1, 0, deps); @@ -457,7 +457,7 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['role', 'button', 'dir', 'rtl', 'myDir', '']); + Δelement(0, 'div', ['role', 'button', 'dir', 'rtl', 'myDir', '']); } }, 1, 0, deps); @@ -472,9 +472,9 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['role', 'button', 'myDir', '']); - { listener('change', () => ctx.onChange()); } - elementEnd(); + ΔelementStart(0, 'div', ['role', 'button', 'myDir', '']); + { Δlistener('change', () => ctx.onChange()); } + ΔelementEnd(); } }, 1, 0, deps); @@ -497,8 +497,8 @@ describe('elementProperty', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['role', 'button', 'dir', 'rtl', 'myDir', '']); - element(1, 'div', ['role', 'listbox', 'myDirB', '']); + Δelement(0, 'div', ['role', 'button', 'dir', 'rtl', 'myDir', '']); + Δelement(1, 'div', ['role', 'listbox', 'myDirB', '']); } }, 2, 0, deps); @@ -523,27 +523,27 @@ describe('elementProperty', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['role', 'listbox', 'myDir', '']); - container(1); + Δelement(0, 'div', ['role', 'listbox', 'myDir', '']); + Δcontainer(1); } if (rf & RenderFlags.Update) { - containerRefreshStart(1); + ΔcontainerRefreshStart(1); { if (ctx.condition) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'div', ['role', 'button', 'myDirB', '']); + Δelement(0, 'div', ['role', 'button', 'myDirB', '']); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } else { - let rf2 = embeddedViewStart(1, 1, 0); + let rf2 = ΔembeddedViewStart(1, 1, 0); if (rf2 & RenderFlags.Create) { - element(0, 'div', ['role', 'menu']); + Δelement(0, 'div', ['role', 'menu']); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 2, 0, deps); @@ -565,7 +565,7 @@ describe('elementProperty', () => { it('should process attributes properly inside a for loop', () => { class Comp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Comp, selectors: [['comp']], consts: 3, @@ -573,12 +573,12 @@ describe('elementProperty', () => { /**
{{ dir.role }} */ template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['role', 'button', 'myDir', ''], ['dir', 'myDir']); - text(2); + Δelement(0, 'div', ['role', 'button', 'myDir', ''], ['dir', 'myDir']); + Δtext(2); } if (rf & RenderFlags.Update) { - const tmp = reference(1) as any; - textBinding(2, bind(tmp.role)); + const tmp = Δreference(1) as any; + ΔtextBinding(2, Δbind(tmp.role)); } }, factory: () => new Comp(), @@ -593,20 +593,20 @@ describe('elementProperty', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { for (let i = 0; i < 2; i++) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - element(0, 'comp'); + Δelement(0, 'comp'); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, [Comp]); diff --git a/packages/core/test/render3/providers_spec.ts b/packages/core/test/render3/providers_spec.ts index a3e8637a70..3dbd6372d5 100644 --- a/packages/core/test/render3/providers_spec.ts +++ b/packages/core/test/render3/providers_spec.ts @@ -6,11 +6,11 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component as _Component, ComponentFactoryResolver, ElementRef, InjectFlags, Injectable as _Injectable, InjectionToken, InjectorType, Provider, RendererFactory2, ViewContainerRef, defineInjectable, defineInjector, inject, ɵNgModuleDef as NgModuleDef} from '../../src/core'; +import {Component as _Component, ComponentFactoryResolver, ElementRef, InjectFlags, Injectable as _Injectable, InjectionToken, InjectorType, Provider, RendererFactory2, ViewContainerRef, ɵNgModuleDef as NgModuleDef, ΔdefineInjectable, ΔdefineInjector, Δinject} from '../../src/core'; import {forwardRef} from '../../src/di/forward_ref'; import {createInjector} from '../../src/di/r3_injector'; -import {ProvidersFeature, defineComponent, defineDirective, directiveInject, injectComponentFactoryResolver} from '../../src/render3/index'; -import {bind, container, containerRefreshEnd, containerRefreshStart, element, elementEnd, elementStart, embeddedViewEnd, embeddedViewStart, interpolation1, text, textBinding} from '../../src/render3/instructions/all'; +import {injectComponentFactoryResolver, ΔProvidersFeature, ΔdefineComponent, ΔdefineDirective, ΔdirectiveInject} from '../../src/render3/index'; +import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δinterpolation1, Δtext, ΔtextBinding} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {NgModuleFactory} from '../../src/render3/ng_module_ref'; import {getInjector} from '../../src/render3/util/discovery_utils'; @@ -59,7 +59,7 @@ describe('providers', () => { constructor(private provider: GreeterProvider) { this.greet = this.provider.provide(); } static ngInjectableDef = - defineInjectable({factory: () => new GreeterInj(inject(GreeterProvider as any))}); + ΔdefineInjectable({factory: () => new GreeterInj(Δinject(GreeterProvider as any))}); } it('TypeProvider', () => { @@ -67,7 +67,7 @@ describe('providers', () => { parent: { providers: [GreeterClass], componentAssertion: - () => { expect(directiveInject(GreeterClass).greet).toEqual('Class'); } + () => { expect(ΔdirectiveInject(GreeterClass).greet).toEqual('Class'); } } }); }); @@ -76,7 +76,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [{provide: GREETER, useValue: {greet: 'Value'}}], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Value'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Value'); } } }); }); @@ -85,7 +85,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [{provide: GREETER, useClass: GreeterClass}], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -94,7 +94,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [GreeterClass, {provide: GREETER, useExisting: GreeterClass}], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -103,7 +103,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [GreeterClass, {provide: GREETER, useFactory: () => new GreeterClass()}], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -117,7 +117,7 @@ describe('providers', () => { {provide: MESSAGE, useValue: 'Message'}, {provide: GREETER, useClass: GreeterDeps, deps: [MESSAGE]} ], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Message'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Message'); } } }); }); @@ -130,7 +130,7 @@ describe('providers', () => { {provide: GREETER, useClass: GreeterBuiltInDeps, deps: [MESSAGE, ElementRef]} ], componentAssertion: - () => { expect(directiveInject(GREETER).greet).toEqual('Message from PARENT'); } + () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Message from PARENT'); } } }); }); @@ -142,7 +142,7 @@ describe('providers', () => { {provide: MESSAGE, useValue: 'Message'}, {provide: GREETER, useFactory: (msg: string) => new GreeterDeps(msg), deps: [MESSAGE]} ], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Message'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Message'); } } }); }); @@ -159,7 +159,7 @@ describe('providers', () => { } ], componentAssertion: - () => { expect(directiveInject(GREETER).greet).toEqual('Message from PARENT'); } + () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Message from PARENT'); } } }); }); @@ -168,7 +168,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [GreeterProvider, {provide: GREETER, useClass: GreeterInj}], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Provided'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Provided'); } } }); }); @@ -180,7 +180,7 @@ describe('providers', () => { parent: { providers: [forwardRef(() => ForLater)], componentAssertion: - () => { expect(directiveInject(ForLater) instanceof ForLater).toBeTruthy(); } + () => { expect(ΔdirectiveInject(ForLater) instanceof ForLater).toBeTruthy(); } } }); done(); @@ -195,7 +195,7 @@ describe('providers', () => { parent: { providers: [{provide: GREETER, useValue: forwardRef(() => { return {greet: 'Value'}; })}], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Value'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Value'); } } }); }); @@ -204,7 +204,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [{provide: GREETER, useClass: forwardRef(() => GreeterClass)}], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -214,7 +214,7 @@ describe('providers', () => { parent: { providers: [GreeterClass, {provide: GREETER, useExisting: forwardRef(() => GreeterClass)}], - componentAssertion: () => { expect(directiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -224,8 +224,9 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [{provide: GREETER, useValue: {greet: 'Value'}}], - componentAssertion: - () => { expect(directiveInject(forwardRef(() => GREETER)).greet).toEqual('Value'); } + componentAssertion: () => { + expect(ΔdirectiveInject(forwardRef(() => GREETER)).greet).toEqual('Value'); + } } }); }); @@ -254,7 +255,7 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'Message 1'}], directiveProviders: [{provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(directiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -264,7 +265,7 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'Message 1'}], viewProviders: [{provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(directiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -274,7 +275,7 @@ describe('providers', () => { parent: { directiveProviders: [{provide: String, useValue: 'Message 1'}], viewProviders: [{provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(directiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -284,7 +285,7 @@ describe('providers', () => { parent: { directive2Providers: [{provide: String, useValue: 'Message 1'}], directiveProviders: [{provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(directiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -294,7 +295,7 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'Message 1'}, {provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(directiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -304,7 +305,7 @@ describe('providers', () => { parent: { viewProviders: [{provide: String, useValue: 'Message 1'}, {provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(directiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -314,7 +315,7 @@ describe('providers', () => { parent: { directiveProviders: [{provide: String, useValue: 'Message 1'}, {provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(directiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -322,7 +323,7 @@ describe('providers', () => { describe('single', () => { class MyModule { - static ngInjectorDef = defineInjector( + static ngInjectorDef = ΔdefineInjector( {factory: () => new MyModule(), providers: [{provide: String, useValue: 'From module'}]}); } @@ -330,16 +331,16 @@ describe('providers', () => { it('should work without providers nor viewProviders in component', () => { expectProvidersScenario({ parent: { - componentAssertion: () => { expect(directiveInject(String)).toEqual('From module'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From module'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } }, viewChild: { - componentAssertion: () => { expect(directiveInject(String)).toEqual('From module'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From module'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } }, contentChild: { - componentAssertion: () => { expect(directiveInject(String)).toEqual('From module'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From module'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } }, ngModule: MyModule }); @@ -350,18 +351,21 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'From providers'}], componentAssertion: - () => { expect(directiveInject(String)).toEqual('From providers'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From providers'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } }, viewChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From providers'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From providers'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } }, contentChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From providers'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From providers'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } }, ngModule: MyModule }); @@ -372,18 +376,18 @@ describe('providers', () => { parent: { viewProviders: [{provide: String, useValue: 'From viewProviders'}], componentAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From module'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } }, viewChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); } }, contentChild: { - componentAssertion: () => { expect(directiveInject(String)).toEqual('From module'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From module'); } + componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } }, ngModule: MyModule }); @@ -395,19 +399,21 @@ describe('providers', () => { providers: [{provide: String, useValue: 'From providers'}], viewProviders: [{provide: String, useValue: 'From viewProviders'}], componentAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From providers'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } }, viewChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); } }, contentChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From providers'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From providers'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } }, ngModule: MyModule }); @@ -421,18 +427,21 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive'}], directive2Providers: [{provide: String, useValue: 'Never'}], componentAssertion: - () => { expect(directiveInject(String)).toEqual('From directive'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, viewChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From directive'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, contentChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From directive'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, ngModule: MyModule }); @@ -445,18 +454,21 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive'}], directive2Providers: [{provide: String, useValue: 'Never'}], componentAssertion: - () => { expect(directiveInject(String)).toEqual('From directive'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, viewChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From directive'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, contentChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From directive'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, ngModule: MyModule }); @@ -469,19 +481,21 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive'}], directive2Providers: [{provide: String, useValue: 'Never'}], componentAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, viewChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); } }, contentChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From directive'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, ngModule: MyModule }); @@ -495,19 +509,21 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive'}], directive2Providers: [{provide: String, useValue: 'Never'}], componentAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, viewChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual('From viewProviders'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); } }, contentChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual('From directive'); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual('From directive'); } + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + directiveAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } }, ngModule: MyModule }); @@ -517,7 +533,7 @@ describe('providers', () => { describe('multi', () => { class MyModule { - static ngInjectorDef = defineInjector({ + static ngInjectorDef = ΔdefineInjector({ factory: () => new MyModule(), providers: [{provide: String, useValue: 'From module', multi: true}] }); @@ -527,16 +543,19 @@ describe('providers', () => { it('should work without providers nor viewProviders in component', () => { expectProvidersScenario({ parent: { - componentAssertion: () => { expect(directiveInject(String)).toEqual(['From module']); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual(['From module']); } + componentAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } }, viewChild: { - componentAssertion: () => { expect(directiveInject(String)).toEqual(['From module']); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual(['From module']); } + componentAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } }, contentChild: { - componentAssertion: () => { expect(directiveInject(String)).toEqual(['From module']); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual(['From module']); } + componentAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } }, ngModule: MyModule }); @@ -547,21 +566,21 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'From providers', multi: true}], componentAssertion: - () => { expect(directiveInject(String)).toEqual(['From providers']); }, + () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual(['From providers']); } + () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } }, viewChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual(['From providers']); }, + () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual(['From providers']); } + () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } }, contentChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual(['From providers']); }, + () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual(['From providers']); } + () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } }, ngModule: MyModule }); @@ -572,18 +591,19 @@ describe('providers', () => { parent: { viewProviders: [{provide: String, useValue: 'From viewProviders', multi: true}], componentAssertion: - () => { expect(directiveInject(String)).toEqual(['From viewProviders']); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual(['From module']); } + () => { expect(ΔdirectiveInject(String)).toEqual(['From viewProviders']); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } }, viewChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual(['From viewProviders']); }, + () => { expect(ΔdirectiveInject(String)).toEqual(['From viewProviders']); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual(['From viewProviders']); } + () => { expect(ΔdirectiveInject(String)).toEqual(['From viewProviders']); } }, contentChild: { - componentAssertion: () => { expect(directiveInject(String)).toEqual(['From module']); }, - directiveAssertion: () => { expect(directiveInject(String)).toEqual(['From module']); } + componentAssertion: + () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); }, + directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } }, ngModule: MyModule }); @@ -595,24 +615,24 @@ describe('providers', () => { providers: [{provide: String, useValue: 'From providers', multi: true}], viewProviders: [{provide: String, useValue: 'From viewProviders', multi: true}], componentAssertion: () => { - expect(directiveInject(String)).toEqual(['From providers', 'From viewProviders']); + expect(ΔdirectiveInject(String)).toEqual(['From providers', 'From viewProviders']); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual(['From providers']); } + () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } }, viewChild: { componentAssertion: () => { - expect(directiveInject(String)).toEqual(['From providers', 'From viewProviders']); + expect(ΔdirectiveInject(String)).toEqual(['From providers', 'From viewProviders']); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual(['From providers', 'From viewProviders']); + expect(ΔdirectiveInject(String)).toEqual(['From providers', 'From viewProviders']); } }, contentChild: { componentAssertion: - () => { expect(directiveInject(String)).toEqual(['From providers']); }, + () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); }, directiveAssertion: - () => { expect(directiveInject(String)).toEqual(['From providers']); } + () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } }, ngModule: MyModule }); @@ -626,26 +646,26 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive 1', multi: true}], directive2Providers: [{provide: String, useValue: 'From directive 2', multi: true}], componentAssertion: () => { - expect(directiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, viewChild: { componentAssertion: () => { - expect(directiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, contentChild: { componentAssertion: () => { - expect(directiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, ngModule: MyModule @@ -659,36 +679,36 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive 1', multi: true}], directive2Providers: [{provide: String, useValue: 'From directive 2', multi: true}], componentAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } }, viewChild: { componentAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } }, contentChild: { componentAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } @@ -704,32 +724,32 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive 1', multi: true}], directive2Providers: [{provide: String, useValue: 'From directive 2', multi: true}], componentAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From viewProviders', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, viewChild: { componentAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From viewProviders', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From viewProviders', 'From directive 2', 'From directive 1' ]); } }, contentChild: { componentAssertion: () => { - expect(directiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, ngModule: MyModule @@ -744,36 +764,36 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive 1', multi: true}], directive2Providers: [{provide: String, useValue: 'From directive 2', multi: true}], componentAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From viewProviders', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } }, viewChild: { componentAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From viewProviders', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From viewProviders', 'From directive 2', 'From directive 1' ]); } }, contentChild: { componentAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(directiveInject(String)).toEqual([ + expect(ΔdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } @@ -789,20 +809,20 @@ describe('providers', () => { @Injectable({providedIn: 'root'}) class FooForRoot { static ngInjectableDef = - defineInjectable({factory: () => new FooForRoot(), providedIn: 'root'}); + ΔdefineInjectable({factory: () => new FooForRoot(), providedIn: 'root'}); } expectProvidersScenario({ parent: { componentAssertion: - () => { expect(directiveInject(FooForRoot) instanceof FooForRoot).toBeTruthy(); } + () => { expect(ΔdirectiveInject(FooForRoot) instanceof FooForRoot).toBeTruthy(); } } }); }); it('should work with a module', () => { class MyModule { - static ngInjectorDef = defineInjector({ + static ngInjectorDef = ΔdefineInjector({ factory: () => new MyModule(), providers: [{provide: String, useValue: 'From module'}] }); @@ -811,13 +831,13 @@ describe('providers', () => { @Injectable({providedIn: MyModule}) class FooForModule { static ngInjectableDef = - defineInjectable({factory: () => new FooForModule(), providedIn: MyModule}); + ΔdefineInjectable({factory: () => new FooForModule(), providedIn: MyModule}); } expectProvidersScenario({ parent: { componentAssertion: - () => { expect(directiveInject(FooForModule) instanceof FooForModule).toBeTruthy(); } + () => { expect(ΔdirectiveInject(FooForModule) instanceof FooForModule).toBeTruthy(); } }, ngModule: MyModule }); @@ -832,20 +852,20 @@ describe('providers', () => { class Repeated { constructor(private s: String, private n: Number) {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Repeated, selectors: [['repeated']], - factory: () => new Repeated(directiveInject(String), directiveInject(Number)), + factory: () => new Repeated(ΔdirectiveInject(String), ΔdirectiveInject(Number)), consts: 2, vars: 2, template: function(fs: RenderFlags, ctx: Repeated) { if (fs & RenderFlags.Create) { - text(0); - text(1); + Δtext(0); + Δtext(1); } if (fs & RenderFlags.Update) { - textBinding(0, bind(ctx.s)); - textBinding(1, bind(ctx.n)); + ΔtextBinding(0, Δbind(ctx.s)); + ΔtextBinding(1, Δbind(ctx.n)); } } }); @@ -862,7 +882,7 @@ describe('providers', () => { [{provide: String, useValue: 'foo'}, {provide: Number, useValue: 2, multi: true}], }) class ComponentWithProviders { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ComponentWithProviders, selectors: [['component-with-providers']], factory: () => new ComponentWithProviders(), @@ -870,28 +890,28 @@ describe('providers', () => { vars: 0, template: function(fs: RenderFlags, ctx: ComponentWithProviders) { if (fs & RenderFlags.Create) { - elementStart(0, 'div'); - { container(1); } - elementEnd(); + ΔelementStart(0, 'div'); + { Δcontainer(1); } + ΔelementEnd(); } if (fs & RenderFlags.Update) { - containerRefreshStart(1); + ΔcontainerRefreshStart(1); { for (let i = 0; i < 3; i++) { - let rf1 = embeddedViewStart(1, 1, 0); + let rf1 = ΔembeddedViewStart(1, 1, 0); { if (rf1 & RenderFlags.Create) { - element(0, 'repeated'); + Δelement(0, 'repeated'); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, features: [ - ProvidersFeature( + ΔProvidersFeature( [{provide: Number, useValue: 1, multi: true}], [{provide: String, useValue: 'foo'}, {provide: Number, useValue: 2, multi: true}]), ], @@ -915,24 +935,24 @@ describe('providers', () => { class Repeated { constructor(private s: String, private n: Number) {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Repeated, selectors: [['repeated']], - factory: () => new Repeated(directiveInject(String), directiveInject(Number)), + factory: () => new Repeated(ΔdirectiveInject(String), ΔdirectiveInject(Number)), consts: 2, vars: 2, template: function(fs: RenderFlags, ctx: Repeated) { if (fs & RenderFlags.Create) { - text(0); - text(1); + Δtext(0); + Δtext(1); } if (fs & RenderFlags.Update) { - textBinding(0, bind(ctx.s)); - textBinding(1, bind(ctx.n)); + ΔtextBinding(0, Δbind(ctx.s)); + ΔtextBinding(1, Δbind(ctx.n)); } }, features: [ - ProvidersFeature( + ΔProvidersFeature( [{provide: Number, useValue: 1, multi: true}], [{provide: String, useValue: 'bar'}, {provide: Number, useValue: 2, multi: true}]), ], @@ -948,7 +968,7 @@ describe('providers', () => { viewProviders: [{provide: toString, useValue: 'foo'}], }) class ComponentWithProviders { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ComponentWithProviders, selectors: [['component-with-providers']], factory: () => new ComponentWithProviders(), @@ -956,27 +976,27 @@ describe('providers', () => { vars: 0, template: function(fs: RenderFlags, ctx: ComponentWithProviders) { if (fs & RenderFlags.Create) { - elementStart(0, 'div'); - { container(1); } - elementEnd(); + ΔelementStart(0, 'div'); + { Δcontainer(1); } + ΔelementEnd(); } if (fs & RenderFlags.Update) { - containerRefreshStart(1); + ΔcontainerRefreshStart(1); { for (let i = 0; i < 3; i++) { - let rf1 = embeddedViewStart(1, 1, 0); + let rf1 = ΔembeddedViewStart(1, 1, 0); { if (rf1 & RenderFlags.Create) { - element(0, 'repeated'); + Δelement(0, 'repeated'); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, - features: [ProvidersFeature([], [{provide: String, useValue: 'foo'}])], + features: [ΔProvidersFeature([], [{provide: String, useValue: 'foo'}])], directives: [Repeated] }); } @@ -997,18 +1017,18 @@ describe('providers', () => { class EmbeddedComponent { constructor(private s: String) {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: EmbeddedComponent, selectors: [['embedded-cmp']], - factory: () => new EmbeddedComponent(directiveInject(String)), + factory: () => new EmbeddedComponent(ΔdirectiveInject(String)), consts: 1, vars: 1, template: (rf: RenderFlags, cmp: EmbeddedComponent) => { if (rf & RenderFlags.Create) { - text(0); + Δtext(0); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('', cmp.s, '')); + ΔtextBinding(0, Δinterpolation1('', cmp.s, '')); } } }); @@ -1018,20 +1038,20 @@ describe('providers', () => { class HostComponent { constructor(public vcref: ViewContainerRef, public cfr: ComponentFactoryResolver) {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: HostComponent, selectors: [['host-cmp']], factory: () => hostComponent = new HostComponent( - directiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), + ΔdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), consts: 1, vars: 0, template: (rf: RenderFlags, cmp: HostComponent) => { if (rf & RenderFlags.Create) { - text(0, 'foo'); + Δtext(0, 'foo'); } }, features: [ - ProvidersFeature([{provide: String, useValue: 'From host component'}]), + ΔProvidersFeature([{provide: String, useValue: 'From host component'}]), ], }); } @@ -1043,7 +1063,7 @@ describe('providers', () => { class AppComponent { constructor() {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AppComponent, selectors: [['app-cmp']], factory: () => new AppComponent(), @@ -1051,11 +1071,11 @@ describe('providers', () => { vars: 0, template: (rf: RenderFlags, cmp: AppComponent) => { if (rf & RenderFlags.Create) { - element(0, 'host-cmp'); + Δelement(0, 'host-cmp'); } }, features: [ - ProvidersFeature([{provide: String, useValue: 'From app component'}]), + ΔProvidersFeature([{provide: String, useValue: 'From app component'}]), ], directives: [HostComponent] }); @@ -1084,7 +1104,7 @@ describe('providers', () => { expect(fixture.html).toEqual('foo'); class MyAppModule { - static ngInjectorDef = defineInjector({ + static ngInjectorDef = ΔdefineInjector({ factory: () => new MyAppModule(), imports: [], providers: [ @@ -1127,7 +1147,7 @@ describe('providers', () => { constructor(public value: String) {} static ngInjectableDef = - defineInjectable({factory: () => new MyService(inject(String))}); + ΔdefineInjectable({factory: () => new MyService(Δinject(String))}); } expectProvidersScenario({ @@ -1135,8 +1155,8 @@ describe('providers', () => { providers: [MyService, {provide: String, useValue: 'providers'}], viewProviders: [{provide: String, useValue: 'viewProviders'}], componentAssertion: () => { - expect(directiveInject(String)).toEqual('viewProviders'); - expect(directiveInject(MyService).value).toEqual('providers'); + expect(ΔdirectiveInject(String)).toEqual('viewProviders'); + expect(ΔdirectiveInject(MyService).value).toEqual('providers'); } } }); @@ -1144,7 +1164,7 @@ describe('providers', () => { it('should make sure that parent service does not see overrides in child directives', () => { class Greeter { - static ngInjectableDef = defineInjectable({factory: () => new Greeter(inject(String))}); + static ngInjectableDef = ΔdefineInjectable({factory: () => new Greeter(Δinject(String))}); constructor(public greeting: String) {} } @@ -1155,7 +1175,7 @@ describe('providers', () => { viewChild: { providers: [{provide: String, useValue: 'view'}], componentAssertion: - () => { expect(directiveInject(Greeter).greeting).toEqual('parent'); }, + () => { expect(ΔdirectiveInject(Greeter).greeting).toEqual('parent'); }, }, }); }); @@ -1163,7 +1183,7 @@ describe('providers', () => { describe('injection flags', () => { class MyModule { - static ngInjectorDef = defineInjector( + static ngInjectorDef = ΔdefineInjector( {factory: () => new MyModule(), providers: [{provide: String, useValue: 'Module'}]}); } it('should not fall through to ModuleInjector if flags limit the scope', () => { @@ -1171,9 +1191,9 @@ describe('providers', () => { ngModule: MyModule, parent: { componentAssertion: () => { - expect(directiveInject(String)).toEqual('Module'); - expect(directiveInject(String, InjectFlags.Optional | InjectFlags.Self)).toBeNull(); - expect(directiveInject(String, InjectFlags.Optional | InjectFlags.Host)).toBeNull(); + expect(ΔdirectiveInject(String)).toEqual('Module'); + expect(ΔdirectiveInject(String, InjectFlags.Optional | InjectFlags.Self)).toBeNull(); + expect(ΔdirectiveInject(String, InjectFlags.Optional | InjectFlags.Host)).toBeNull(); } } }); @@ -1186,7 +1206,7 @@ describe('providers', () => { class SomeInj implements Some { constructor(public location: String) {} - static ngInjectableDef = defineInjectable({factory: () => new SomeInj(inject(String))}); + static ngInjectableDef = ΔdefineInjectable({factory: () => new SomeInj(Δinject(String))}); } @Component({ @@ -1197,7 +1217,7 @@ describe('providers', () => { class MyComponent { constructor() {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyComponent, selectors: [['my-cmp']], factory: () => new MyComponent(), @@ -1205,11 +1225,11 @@ describe('providers', () => { vars: 0, template: (rf: RenderFlags, cmp: MyComponent) => { if (rf & RenderFlags.Create) { - element(0, 'p'); + Δelement(0, 'p'); } }, features: [ - ProvidersFeature( + ΔProvidersFeature( [{provide: String, useValue: 'From my component'}], [{provide: Number, useValue: 123}]), ], @@ -1224,7 +1244,7 @@ describe('providers', () => { class AppComponent { constructor() {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AppComponent, selectors: [['app-cmp']], factory: () => new AppComponent(), @@ -1232,11 +1252,11 @@ describe('providers', () => { vars: 0, template: (rf: RenderFlags, cmp: AppComponent) => { if (rf & RenderFlags.Create) { - element(0, 'my-cmp'); + Δelement(0, 'my-cmp'); } }, features: [ - ProvidersFeature([ + ΔProvidersFeature([ {provide: String, useValue: 'From app component'}, {provide: Some, useClass: SomeInj} ]), ], @@ -1287,18 +1307,18 @@ describe('providers', () => { class MyComponent { constructor(foo: InjectableWithLifeCycleHooks) {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyComponent, selectors: [['my-comp']], - factory: () => new MyComponent(directiveInject(InjectableWithLifeCycleHooks)), + factory: () => new MyComponent(ΔdirectiveInject(InjectableWithLifeCycleHooks)), consts: 1, vars: 0, template: (rf: RenderFlags, ctx: MyComponent) => { if (rf & RenderFlags.Create) { - element(0, 'span'); + Δelement(0, 'span'); } }, - features: [ProvidersFeature([InjectableWithLifeCycleHooks])] + features: [ΔProvidersFeature([InjectableWithLifeCycleHooks])] }); } @@ -1314,7 +1334,7 @@ describe('providers', () => { class App { public condition = true; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: App, selectors: [['app-cmp']], factory: () => new App(), @@ -1322,24 +1342,24 @@ describe('providers', () => { vars: 0, template: (rf: RenderFlags, ctx: App) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - { container(1); } - elementEnd(); + ΔelementStart(0, 'div'); + { Δcontainer(1); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - containerRefreshStart(1); + ΔcontainerRefreshStart(1); { if (ctx.condition) { - let rf1 = embeddedViewStart(1, 2, 1); + let rf1 = ΔembeddedViewStart(1, 2, 1); { if (rf1 & RenderFlags.Create) { - element(0, 'my-comp'); + Δelement(0, 'my-comp'); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, directives: [MyComponent] @@ -1389,7 +1409,7 @@ function expectProvidersScenario(defs: { } class ViewChildComponent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ViewChildComponent, selectors: [['view-child']], consts: 1, @@ -1397,27 +1417,27 @@ function expectProvidersScenario(defs: { factory: () => testComponentInjection(defs.viewChild, new ViewChildComponent()), template: function(fs: RenderFlags, ctx: ViewChildComponent) { if (fs & RenderFlags.Create) { - text(0, 'view-child'); + Δtext(0, 'view-child'); } }, features: defs.viewChild && [ - ProvidersFeature(defs.viewChild.providers || [], defs.viewChild.viewProviders || []), + ΔProvidersFeature(defs.viewChild.providers || [], defs.viewChild.viewProviders || []), ], }); } class ViewChildDirective { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: ViewChildDirective, selectors: [['view-child']], factory: () => testDirectiveInjection(defs.viewChild, new ViewChildDirective()), - features: defs.viewChild && [ProvidersFeature(defs.viewChild.directiveProviders || [])], + features: defs.viewChild && [ΔProvidersFeature(defs.viewChild.directiveProviders || [])], }); } class ContentChildComponent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ContentChildComponent, selectors: [['content-child']], consts: 1, @@ -1425,27 +1445,28 @@ function expectProvidersScenario(defs: { factory: () => testComponentInjection(defs.contentChild, new ContentChildComponent()), template: function(fs: RenderFlags, ctx: ParentComponent) { if (fs & RenderFlags.Create) { - text(0, 'content-child'); + Δtext(0, 'content-child'); } }, features: defs.contentChild && - [ProvidersFeature( + [ΔProvidersFeature( defs.contentChild.providers || [], defs.contentChild.viewProviders || [])], }); } class ContentChildDirective { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: ContentChildDirective, selectors: [['content-child']], factory: () => testDirectiveInjection(defs.contentChild, new ContentChildDirective()), - features: defs.contentChild && [ProvidersFeature(defs.contentChild.directiveProviders || [])], + features: + defs.contentChild && [ΔProvidersFeature(defs.contentChild.directiveProviders || [])], }); } class ParentComponent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ParentComponent, selectors: [['parent']], consts: 1, @@ -1453,36 +1474,36 @@ function expectProvidersScenario(defs: { factory: () => testComponentInjection(defs.parent, new ParentComponent()), template: function(fs: RenderFlags, ctx: ParentComponent) { if (fs & RenderFlags.Create) { - element(0, 'view-child'); + Δelement(0, 'view-child'); } }, features: defs.parent && - [ProvidersFeature(defs.parent.providers || [], defs.parent.viewProviders || [])], + [ΔProvidersFeature(defs.parent.providers || [], defs.parent.viewProviders || [])], directives: [ViewChildComponent, ViewChildDirective] }); } class ParentDirective { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: ParentDirective, selectors: [['parent']], factory: () => testDirectiveInjection(defs.parent, new ParentDirective()), - features: defs.parent && [ProvidersFeature(defs.parent.directiveProviders || [])], + features: defs.parent && [ΔProvidersFeature(defs.parent.directiveProviders || [])], }); } class ParentDirective2 { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: ParentDirective2, selectors: [['parent']], factory: () => testDirectiveInjection(defs.parent, new ParentDirective2()), - features: defs.parent && [ProvidersFeature(defs.parent.directive2Providers || [])], + features: defs.parent && [ΔProvidersFeature(defs.parent.directive2Providers || [])], }); } class App { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: App, selectors: [['app']], consts: 2, @@ -1490,13 +1511,13 @@ function expectProvidersScenario(defs: { factory: () => testComponentInjection(defs.app, new App()), template: function(fs: RenderFlags, ctx: App) { if (fs & RenderFlags.Create) { - elementStart(0, 'parent'); - element(1, 'content-child'); - elementEnd(); + ΔelementStart(0, 'parent'); + Δelement(1, 'content-child'); + ΔelementEnd(); } }, features: - defs.app && [ProvidersFeature(defs.app.providers || [], defs.app.viewProviders || [])], + defs.app && [ΔProvidersFeature(defs.app.providers || [], defs.app.viewProviders || [])], directives: [ ParentComponent, ParentDirective2, ParentDirective, ContentChildComponent, ContentChildDirective diff --git a/packages/core/test/render3/pure_function_spec.ts b/packages/core/test/render3/pure_function_spec.ts index e4d1207778..a8978585a8 100644 --- a/packages/core/test/render3/pure_function_spec.ts +++ b/packages/core/test/render3/pure_function_spec.ts @@ -5,11 +5,12 @@ * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ -import {AttributeMarker, defineComponent, template} from '../../src/render3/index'; -import {bind, container, containerRefreshEnd, containerRefreshStart, element, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, nextContext} from '../../src/render3/instructions/all'; +import {AttributeMarker, ΔdefineComponent, Δtemplate} from '../../src/render3/index'; +import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, ΔnextContext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; -import {pureFunction1, pureFunction2, pureFunction3, pureFunction4, pureFunction5, pureFunction6, pureFunction7, pureFunction8, pureFunctionV} from '../../src/render3/pure_function'; +import {ΔpureFunction1, ΔpureFunction2, ΔpureFunction3, ΔpureFunction4, ΔpureFunction5, ΔpureFunction6, ΔpureFunction7, ΔpureFunction8, ΔpureFunctionV} from '../../src/render3/pure_function'; import {ComponentFixture, createComponent, getDirectiveOnNode, renderToHtml} from '../../test/render3/render_util'; + import {NgIf} from './common_with_def'; describe('array literals', () => { @@ -19,7 +20,7 @@ describe('array literals', () => { // TODO(issue/24571): remove '!'. names !: string[]; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyComp, selectors: [['my-comp']], factory: function MyComp_Factory() { return myComp = new MyComp(); }, @@ -38,10 +39,10 @@ describe('array literals', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'my-comp'); + Δelement(0, 'my-comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'names', bind(pureFunction1(1, e0_ff, ctx.customName))); + ΔelementProperty(0, 'names', Δbind(ΔpureFunction1(1, e0_ff, ctx.customName))); } }, 1, 3, directives); @@ -74,11 +75,11 @@ describe('array literals', () => { function IfTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'my-comp'); + Δelement(0, 'my-comp'); } if (rf & RenderFlags.Update) { - const comp = nextContext(); - elementProperty(0, 'names', bind(pureFunction1(1, e0_ff, comp.customName))); + const comp = ΔnextContext(); + ΔelementProperty(0, 'names', Δbind(ΔpureFunction1(1, e0_ff, comp.customName))); } } @@ -87,12 +88,12 @@ describe('array literals', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, IfTemplate, 1, 3, 'my-comp', [AttributeMarker.Bindings, 'names', AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'ngIf', bind(ctx.showing)); + ΔelementProperty(0, 'ngIf', Δbind(ctx.showing)); } }, 1, 1, [MyComp, NgIf]); @@ -113,7 +114,7 @@ describe('array literals', () => { // TODO(issue/24571): remove '!'. names2 !: string[]; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ManyPropComp, selectors: [['many-prop-comp']], factory: function ManyPropComp_Factory() { return manyPropComp = new ManyPropComp(); }, @@ -133,11 +134,11 @@ describe('array literals', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'many-prop-comp'); + Δelement(0, 'many-prop-comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'names1', bind(pureFunction1(2, e0_ff, ctx.customName))); - elementProperty(0, 'names2', bind(pureFunction1(4, e0_ff_1, ctx.customName2))); + ΔelementProperty(0, 'names1', Δbind(ΔpureFunction1(2, e0_ff, ctx.customName))); + ΔelementProperty(0, 'names2', Δbind(ΔpureFunction1(4, e0_ff_1, ctx.customName2))); } }, 1, 6, [ManyPropComp]); @@ -169,7 +170,7 @@ describe('array literals', () => { return arr; } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ParentComp, selectors: [['parent-comp']], factory: () => new ParentComp(), @@ -177,12 +178,13 @@ describe('array literals', () => { vars: 3, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'my-comp'); + ΔelementStart(0, 'my-comp'); myComps.push(getDirectiveOnNode(0)); - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'names', bind(ctx.someFn(pureFunction1(1, e0_ff, ctx.customName)))); + ΔelementProperty( + 0, 'names', Δbind(ctx.someFn(ΔpureFunction1(1, e0_ff, ctx.customName)))); } }, directives: directives @@ -191,8 +193,8 @@ describe('array literals', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'parent-comp'); - element(1, 'parent-comp'); + Δelement(0, 'parent-comp'); + Δelement(1, 'parent-comp'); } }, 2, 0, [ParentComp]); @@ -216,10 +218,11 @@ describe('array literals', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'my-comp'); + Δelement(0, 'my-comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'names', bind(pureFunction2(1, e0_ff, ctx.customName, ctx.customName2))); + ΔelementProperty( + 0, 'names', Δbind(ΔpureFunction2(1, e0_ff, ctx.customName, ctx.customName2))); } }, 1, 4, directives); @@ -276,36 +279,37 @@ describe('array literals', () => { function Template(rf: RenderFlags, c: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'my-comp'); + ΔelementStart(0, 'my-comp'); f3Comp = getDirectiveOnNode(0); - elementEnd(); - elementStart(1, 'my-comp'); + ΔelementEnd(); + ΔelementStart(1, 'my-comp'); f4Comp = getDirectiveOnNode(1); - elementEnd(); - elementStart(2, 'my-comp'); + ΔelementEnd(); + ΔelementStart(2, 'my-comp'); f5Comp = getDirectiveOnNode(2); - elementEnd(); - elementStart(3, 'my-comp'); + ΔelementEnd(); + ΔelementStart(3, 'my-comp'); f6Comp = getDirectiveOnNode(3); - elementEnd(); - elementStart(4, 'my-comp'); + ΔelementEnd(); + ΔelementStart(4, 'my-comp'); f7Comp = getDirectiveOnNode(4); - elementEnd(); - elementStart(5, 'my-comp'); + ΔelementEnd(); + ΔelementStart(5, 'my-comp'); f8Comp = getDirectiveOnNode(5); - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'names', bind(pureFunction3(6, e0_ff, c[5], c[6], c[7]))); - elementProperty(1, 'names', bind(pureFunction4(10, e2_ff, c[4], c[5], c[6], c[7]))); - elementProperty(2, 'names', bind(pureFunction5(15, e4_ff, c[3], c[4], c[5], c[6], c[7]))); - elementProperty( - 3, 'names', bind(pureFunction6(21, e6_ff, c[2], c[3], c[4], c[5], c[6], c[7]))); - elementProperty( - 4, 'names', bind(pureFunction7(28, e8_ff, c[1], c[2], c[3], c[4], c[5], c[6], c[7]))); - elementProperty( + ΔelementProperty(0, 'names', Δbind(ΔpureFunction3(6, e0_ff, c[5], c[6], c[7]))); + ΔelementProperty(1, 'names', Δbind(ΔpureFunction4(10, e2_ff, c[4], c[5], c[6], c[7]))); + ΔelementProperty( + 2, 'names', Δbind(ΔpureFunction5(15, e4_ff, c[3], c[4], c[5], c[6], c[7]))); + ΔelementProperty( + 3, 'names', Δbind(ΔpureFunction6(21, e6_ff, c[2], c[3], c[4], c[5], c[6], c[7]))); + ΔelementProperty( + 4, 'names', Δbind(ΔpureFunction7(28, e8_ff, c[1], c[2], c[3], c[4], c[5], c[6], c[7]))); + ΔelementProperty( 5, 'names', - bind(pureFunction8(36, e10_ff, c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]))); + Δbind(ΔpureFunction8(36, e10_ff, c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]))); } } @@ -348,12 +352,12 @@ describe('array literals', () => { */ function Template(rf: RenderFlags, c: any) { if (rf & RenderFlags.Create) { - element(0, 'my-comp'); + Δelement(0, 'my-comp'); } if (rf & RenderFlags.Update) { - elementProperty( - 0, 'names', bind(pureFunctionV(3, e0_ff, [ - c[0], c[1], c[2], c[3], pureFunction1(1, e0_ff_1, c[4]), c[5], c[6], c[7], c[8] + ΔelementProperty( + 0, 'names', Δbind(ΔpureFunctionV(3, e0_ff, [ + c[0], c[1], c[2], c[3], ΔpureFunction1(1, e0_ff_1, c[4]), c[5], c[6], c[7], c[8] ]))); } } @@ -382,7 +386,7 @@ describe('object literals', () => { // TODO(issue/24571): remove '!'. config !: {[key: string]: any}; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ObjectComp, selectors: [['object-comp']], factory: function ObjectComp_Factory() { return objectComp = new ObjectComp(); }, @@ -401,10 +405,10 @@ describe('object literals', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'object-comp'); + Δelement(0, 'object-comp'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'config', bind(pureFunction1(1, e0_ff, ctx.name))); + ΔelementProperty(0, 'config', Δbind(ΔpureFunction1(1, e0_ff, ctx.name))); } }, 1, 3, defs); @@ -438,13 +442,14 @@ describe('object literals', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'object-comp'); + Δelement(0, 'object-comp'); } if (rf & RenderFlags.Update) { - elementProperty( - 0, 'config', bind(pureFunction2( - 5, e0_ff, ctx.name, - pureFunction1(3, e0_ff_1, pureFunction1(1, e0_ff_2, ctx.duration))))); + ΔelementProperty( + 0, 'config', + Δbind(ΔpureFunction2( + 5, e0_ff, ctx.name, + ΔpureFunction1(3, e0_ff_1, ΔpureFunction1(1, e0_ff_2, ctx.duration))))); } }, 1, 8, defs); @@ -506,27 +511,27 @@ describe('object literals', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { for (let i = 0; i < 2; i++) { - let rf1 = embeddedViewStart(0, 1, 4); + let rf1 = ΔembeddedViewStart(0, 1, 4); if (rf1 & RenderFlags.Create) { - elementStart(0, 'object-comp'); + ΔelementStart(0, 'object-comp'); objectComps.push(getDirectiveOnNode(0)); - elementEnd(); + ΔelementEnd(); } if (rf1 & RenderFlags.Update) { - elementProperty( + ΔelementProperty( 0, 'config', - bind(pureFunction2(1, e0_ff, ctx.configs[i].opacity, ctx.configs[i].duration))); + Δbind(ΔpureFunction2(1, e0_ff, ctx.configs[i].opacity, ctx.configs[i].duration))); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } diff --git a/packages/core/test/render3/query_spec.ts b/packages/core/test/render3/query_spec.ts index 78cf528f65..033fc2ea72 100644 --- a/packages/core/test/render3/query_spec.ts +++ b/packages/core/test/render3/query_spec.ts @@ -10,17 +10,16 @@ import {NgForOfContext} from '@angular/common'; import {ElementRef, QueryList, TemplateRef, ViewContainerRef} from '@angular/core'; import {EventEmitter} from '../..'; -import {AttributeMarker, ProvidersFeature, defineComponent, defineDirective, detectChanges} from '../../src/render3/index'; -import {getNativeByIndex} from '../../src/render3/util/view_utils'; - -import {bind, container, containerRefreshEnd, containerRefreshStart, directiveInject, element, elementContainerEnd, elementContainerStart, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, load, reference, template, text} from '../../src/render3/instructions/all'; +import {AttributeMarker, detectChanges, ΔProvidersFeature, ΔdefineComponent, ΔdefineDirective} from '../../src/render3/index'; +import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, ΔdirectiveInject, Δelement, ΔelementContainerEnd, ΔelementContainerStart, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δload, Δreference, Δtemplate, Δtext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; -import {queryRefresh, viewQuery, loadViewQuery, contentQuery, loadContentQuery, query} from '../../src/render3/query'; +import {query, ΔcontentQuery, ΔloadContentQuery, ΔloadViewQuery, ΔqueryRefresh, ΔviewQuery} from '../../src/render3/query'; import {getLView} from '../../src/render3/state'; -import {templateRefExtractor} from '../../src/render3/view_engine_compatibility_prebound'; +import {getNativeByIndex} from '../../src/render3/util/view_utils'; +import {ΔtemplateRefExtractor} from '../../src/render3/view_engine_compatibility_prebound'; import {NgForOf, NgIf, NgTemplateOutlet} from './common_with_def'; -import {ComponentFixture, TemplateFixture, createComponent, createDirective, renderComponent, getDirectiveOnNode} from './render_util'; +import {ComponentFixture, TemplateFixture, createComponent, createDirective, getDirectiveOnNode, renderComponent} from './render_util'; @@ -71,9 +70,9 @@ describe('query', () => { * } */ if (rf & RenderFlags.Create) { - elementStart(0, 'child'); - { element(1, 'child'); } - elementEnd(); + ΔelementStart(0, 'child'); + { Δelement(1, 'child'); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { child1 = getDirectiveOnNode(0); @@ -83,14 +82,14 @@ describe('query', () => { 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(Child, false, null); - viewQuery(Child, true, null); + ΔviewQuery(Child, false, null); + ΔviewQuery(Child, true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query0 = tmp as QueryList); - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query1 = tmp as QueryList); } }); @@ -116,18 +115,18 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', '']); + Δelement(0, 'div', ['child', '']); elToQuery = getNativeByIndex(0, getLView()); } }, 1, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(Child, false, ElementRef); + ΔviewQuery(Child, false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -153,19 +152,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['child', '', 'otherChild', '']); + ΔelementStart(0, 'div', ['child', '', 'otherChild', '']); { otherChildInstance = getDirectiveOnNode(0, 1); } - elementEnd(); + ΔelementEnd(); } }, 1, 0, [Child, OtherChild], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(Child, false, OtherChild); + ΔviewQuery(Child, false, OtherChild); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -189,17 +188,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', '']); + Δelement(0, 'div', ['child', '']); } }, 1, 0, [Child, OtherChild], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(Child, false, OtherChild); + ΔviewQuery(Child, false, OtherChild); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -220,13 +219,13 @@ describe('query', () => { class MyDirective { constructor(public service: Service) {} - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDirective, selectors: [['', 'myDir', '']], factory: function MyDirective_Factory() { - return directive = new MyDirective(directiveInject(Service)); + return directive = new MyDirective(ΔdirectiveInject(Service)); }, - features: [ProvidersFeature([Service, {provide: Alias, useExisting: Service}])], + features: [ΔProvidersFeature([Service, {provide: Alias, useExisting: Service}])], }); } @@ -248,7 +247,7 @@ describe('query', () => { service?: Service; alias?: Alias; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: App, selectors: [['app']], consts: 1, @@ -256,20 +255,21 @@ describe('query', () => { factory: function App_Factory() { return new App(); }, template: function App_Template(rf: RenderFlags, ctx: App) { if (rf & RenderFlags.Create) { - element(0, 'div', ['myDir']); + Δelement(0, 'div', ['myDir']); } }, viewQuery: function(rf: RenderFlags, ctx: App) { if (rf & RenderFlags.Create) { - viewQuery(MyDirective, false, null); - viewQuery(Service, false, null); - viewQuery(Alias, false, null); + ΔviewQuery(MyDirective, false, null); + ΔviewQuery(Service, false, null); + ΔviewQuery(Alias, false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && (ctx.directive = tmp.first); - queryRefresh(tmp = loadViewQuery>()) && (ctx.service = tmp.first); - queryRefresh(tmp = loadViewQuery>()) && (ctx.alias = tmp.first); + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + (ctx.directive = tmp.first); + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.service = tmp.first); + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.alias = tmp.first); } }, directives: [MyDirective] @@ -293,7 +293,7 @@ describe('query', () => { class App { service?: Service; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: App, selectors: [['app']], consts: 1, @@ -301,16 +301,16 @@ describe('query', () => { factory: function App_Factory() { return new App(); }, template: function App_Template(rf: RenderFlags, ctx: App) { if (rf & RenderFlags.Create) { - element(0, 'div', ['myDir']); + Δelement(0, 'div', ['myDir']); } }, viewQuery: function(rf: RenderFlags, ctx: App) { let tmp: any; if (rf & RenderFlags.Create) { - viewQuery(MyDirective, false, Alias); + ΔviewQuery(MyDirective, false, Alias); } if (rf & RenderFlags.Update) { - queryRefresh(tmp = loadViewQuery>()) && (ctx.service = tmp.first); + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.service = tmp.first); } }, directives: [MyDirective] @@ -339,19 +339,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); elToQuery = getNativeByIndex(0, getLView()); - element(2, 'div'); + Δelement(2, 'div'); } }, 3, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, null); + ΔviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -377,22 +377,22 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '', 'bar', '']); + Δelement(0, 'div', null, ['foo', '', 'bar', '']); elToQuery = getNativeByIndex(0, getLView()); - element(3, 'div'); + Δelement(3, 'div'); } }, 4, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, null); - viewQuery(['bar'], false, null); + ΔviewQuery(['foo'], false, null); + ΔviewQuery(['bar'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.fooQuery = tmp as QueryList); - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.barQuery = tmp as QueryList); } }); @@ -424,21 +424,21 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); el1ToQuery = getNativeByIndex(0, getLView()); - element(2, 'div'); - element(3, 'div', null, ['bar', '']); + Δelement(2, 'div'); + Δelement(3, 'div', null, ['bar', '']); el2ToQuery = getNativeByIndex(3, getLView()); } }, 5, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo', 'bar'], false, null); + ΔviewQuery(['foo', 'bar'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -464,19 +464,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); elToQuery = getNativeByIndex(0, getLView()); - element(2, 'div'); + Δelement(2, 'div'); } }, 3, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, null); + ΔviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -501,19 +501,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementContainerStart(0, null, ['foo', '']); + ΔelementContainerStart(0, null, ['foo', '']); elToQuery = getNativeByIndex(0, getLView()); - elementContainerEnd(); + ΔelementContainerEnd(); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, ElementRef); + ΔviewQuery(['foo'], false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -537,19 +537,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementContainerStart(0, null, ['foo', '']); + ΔelementContainerStart(0, null, ['foo', '']); elToQuery = getNativeByIndex(0, getLView()); - elementContainerEnd(); + ΔelementContainerEnd(); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -599,25 +599,25 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementContainerStart(0); + ΔelementContainerStart(0); { - element(1, 'div', null, ['foo', '']); + Δelement(1, 'div', null, ['foo', '']); elToQuery = getNativeByIndex(3, getLView()); } - elementContainerEnd(); + ΔelementContainerEnd(); } }, 3, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, ElementRef); - viewQuery(['foo'], false, ElementRef); + ΔviewQuery(['foo'], true, ElementRef); + ΔviewQuery(['foo'], false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.deep = tmp as QueryList); - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.shallow = tmp as QueryList); } }); @@ -640,17 +640,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, ViewContainerRef); + ΔviewQuery(['foo'], false, ViewContainerRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -672,17 +672,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, null, 0, 0, 'ng-template', null, ['foo', '']); + Δtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, ViewContainerRef); + ΔviewQuery(['foo'], false, ViewContainerRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -705,18 +705,18 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, null, 0, 0, 'ng-template', null, ['foo', '']); + Δtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, ElementRef); + ΔviewQuery(['foo'], false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -740,17 +740,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, null, 0, 0, 'ng-template', null, ['foo', '']); + Δtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, null); + ΔviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -773,17 +773,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, null, 0, 0, 'ng-template', null, ['foo', '']); + Δtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, TemplateRef); + ΔviewQuery(['foo'], false, TemplateRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -808,7 +808,7 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'child', null, ['foo', '']); + Δelement(0, 'child', null, ['foo', '']); } if (rf & RenderFlags.Update) { childInstance = getDirectiveOnNode(0); @@ -817,11 +817,11 @@ describe('query', () => { 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -836,7 +836,7 @@ describe('query', () => { let childInstance: Child; class Child { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Child, selectors: [['child']], factory: () => childInstance = new Child(), @@ -857,17 +857,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'child', null, ['foo', 'child']); + Δelement(0, 'child', null, ['foo', 'child']); } }, 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -893,7 +893,7 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', ''], ['foo', 'child']); + Δelement(0, 'div', ['child', ''], ['foo', 'child']); } if (rf & RenderFlags.Update) { childInstance = getDirectiveOnNode(0); @@ -902,11 +902,11 @@ describe('query', () => { 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -932,7 +932,8 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child1', '', 'child2', ''], ['foo', 'child1', 'bar', 'child2']); + Δelement( + 0, 'div', ['child1', '', 'child2', ''], ['foo', 'child1', 'bar', 'child2']); } if (rf & RenderFlags.Update) { child1Instance = getDirectiveOnNode(0, 0); @@ -942,11 +943,11 @@ describe('query', () => { 3, 0, [Child1, Child2], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo', 'bar'], true, null); + ΔviewQuery(['foo', 'bar'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -973,7 +974,7 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', ''], ['foo', 'child', 'bar', 'child']); + Δelement(0, 'div', ['child', ''], ['foo', 'child', 'bar', 'child']); } if (rf & RenderFlags.Update) { childInstance = getDirectiveOnNode(0); @@ -982,14 +983,14 @@ describe('query', () => { 3, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); - viewQuery(['bar'], true, null); + ΔviewQuery(['foo'], true, null); + ΔviewQuery(['bar'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.fooQuery = tmp as QueryList); - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.barQuery = tmp as QueryList); } }); @@ -1019,18 +1020,18 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', ''], ['foo', 'child']); + Δelement(0, 'div', ['child', ''], ['foo', 'child']); div = getNativeByIndex(0, getLView()); } }, 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, ElementRef); + ΔviewQuery(['foo'], false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1055,7 +1056,7 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', ''], ['foo', '', 'bar', 'child']); + Δelement(0, 'div', ['child', ''], ['foo', '', 'bar', 'child']); div = getNativeByIndex(0, getLView()); } if (rf & RenderFlags.Update) { @@ -1065,11 +1066,11 @@ describe('query', () => { 3, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo', 'bar'], false, null); + ΔviewQuery(['foo', 'bar'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1094,17 +1095,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['foo', '']); + Δelement(0, 'div', ['foo', '']); } }, 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, Child); + ΔviewQuery(['foo'], false, Child); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1128,17 +1129,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', '']); + Δelement(0, 'div', ['child', '']); } }, 1, 0, [Child, OtherChild], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(Child, false, OtherChild); + ΔviewQuery(Child, false, OtherChild); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1162,17 +1163,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', '']); + Δelement(0, 'div', ['child', '']); } }, 1, 0, [Child, OtherChild], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(OtherChild, false, Child); + ΔviewQuery(OtherChild, false, Child); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1193,17 +1194,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div'); + Δelement(0, 'div'); } }, 1, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(TemplateRef as any, false, ElementRef); + ΔviewQuery(TemplateRef as any, false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1226,17 +1227,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', ''], ['foo', '']); + Δelement(0, 'div', ['child', ''], ['foo', '']); } }, 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, Child); + ΔviewQuery(['foo'], false, Child); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1260,17 +1261,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['child', '']); + Δelement(0, 'div', ['child', '']); } }, 1, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(TemplateRef as any, false, null); + ΔviewQuery(TemplateRef as any, false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1283,9 +1284,9 @@ describe('query', () => { it('should query templates if the type is TemplateRef (and respect "read" option)', () => { function Cmpt_Template_1(rf: RenderFlags, ctx1: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - text(1, 'Test'); - elementEnd(); + ΔelementStart(0, 'div'); + Δtext(1, 'Test'); + ΔelementEnd(); } } /** @@ -1301,28 +1302,28 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, Cmpt_Template_1, 2, 0, 'ng-template', null, ['foo', ''], - templateRefExtractor); - template( + ΔtemplateRefExtractor); + Δtemplate( 2, Cmpt_Template_1, 2, 0, 'ng-template', null, ['bar', ''], - templateRefExtractor); - template( + ΔtemplateRefExtractor); + Δtemplate( 4, Cmpt_Template_1, 2, 0, 'ng-template', null, ['baz', ''], - templateRefExtractor); + ΔtemplateRefExtractor); } }, 6, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(TemplateRef as any, false, null); - viewQuery(TemplateRef as any, false, ElementRef); + ΔviewQuery(TemplateRef as any, false, null); + ΔviewQuery(TemplateRef as any, false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.tmplQuery = tmp as QueryList); - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.elemQuery = tmp as QueryList); } }); @@ -1350,12 +1351,12 @@ describe('query', () => { let directiveInstances: ViewContainerManipulatorDirective[] = []; class ViewContainerManipulatorDirective { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: ViewContainerManipulatorDirective, selectors: [['', 'vc', '']], factory: () => { const directiveInstance = - new ViewContainerManipulatorDirective(directiveInject(ViewContainerRef as any)); + new ViewContainerManipulatorDirective(ΔdirectiveInject(ViewContainerRef as any)); directiveInstances.push(directiveInstance); return directiveInstance; } @@ -1376,7 +1377,7 @@ describe('query', () => { function Cmpt_Template_1(rf: RenderFlags, ctx1: any) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); } } @@ -1392,21 +1393,21 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, Cmpt_Template_1, 2, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'ngIf', bind(ctx.value)); + ΔelementProperty(0, 'ngIf', Δbind(ctx.value)); } }, 2, 1, [NgIf], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1428,10 +1429,10 @@ describe('query', () => { function Cmpt_Template_1(rf1: RenderFlags, row: NgForOfContext) { if (rf1 & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); } if (rf1 & RenderFlags.Update) { - elementProperty(0, 'id', bind(row.$implicit)); + ΔelementProperty(0, 'id', Δbind(row.$implicit)); } } @@ -1447,7 +1448,7 @@ describe('query', () => { // TODO(issue/24571): remove '!'. value !: string[]; query: any; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Cmpt, factory: () => new Cmpt(), selectors: [['my-app']], @@ -1455,19 +1456,19 @@ describe('query', () => { vars: 1, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, Cmpt_Template_1, 2, 1, 'ng-template', ['ngForOf', '']); + Δtemplate(0, Cmpt_Template_1, 2, 1, 'ng-template', ['ngForOf', '']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'ngForOf', bind(ctx.value)); + ΔelementProperty(0, 'ngForOf', Δbind(ctx.value)); } }, viewQuery: function(rf: RenderFlags, ctx: Cmpt) { let tmp: any; if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }, @@ -1501,19 +1502,19 @@ describe('query', () => { function Cmpt_Template_1(rf: RenderFlags, ctx: {idx: number}) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind('foo1_' + ctx.idx)); + ΔelementProperty(0, 'id', Δbind('foo1_' + ctx.idx)); } } function Cmpt_Template_5(rf: RenderFlags, ctx: {idx: number}) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind('foo2_' + ctx.idx)); + ΔelementProperty(0, 'id', Δbind('foo2_' + ctx.idx)); } } @@ -1534,30 +1535,30 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, Cmpt_Template_1, 2, 1, 'ng-template', null, ['tpl1', ''], - templateRefExtractor); - element(2, 'div', ['id', 'middle'], ['foo', '']); - template( + ΔtemplateRefExtractor); + Δelement(2, 'div', ['id', 'middle'], ['foo', '']); + Δtemplate( 4, Cmpt_Template_5, 2, 1, 'ng-template', null, ['tpl2', ''], - templateRefExtractor); - template(6, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); + ΔtemplateRefExtractor); + Δtemplate(6, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); } if (rf & RenderFlags.Update) { - tpl1 = reference(1); - tpl2 = reference(5); + tpl1 = Δreference(1); + tpl2 = Δreference(5); } }, 8, 0, [ViewContainerManipulatorDirective], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1610,10 +1611,10 @@ describe('query', () => { function Cmpt_Template_1(rf: RenderFlags, ctx: {idx: number, container_idx: number}) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'id', bind('foo_' + ctx.container_idx + '_' + ctx.idx)); + ΔelementProperty(0, 'id', Δbind('foo_' + ctx.container_idx + '_' + ctx.idx)); } } @@ -1627,7 +1628,7 @@ describe('query', () => { */ class Cmpt { query: any; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Cmpt, factory: () => new Cmpt(), selectors: [['my-app']], @@ -1636,25 +1637,25 @@ describe('query', () => { template: function(rf: RenderFlags, ctx: any) { let tmp: any; if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, Cmpt_Template_1, 2, 1, 'ng-template', [], ['tpl', ''], - templateRefExtractor); - template(2, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); - template(3, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); + ΔtemplateRefExtractor); + Δtemplate(2, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); + Δtemplate(3, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); } if (rf & RenderFlags.Update) { - tpl = reference(1); + tpl = Δreference(1); } }, viewQuery: (rf: RenderFlags, cmpt: Cmpt) => { let tmp: any; if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (cmpt.query = tmp as QueryList); } }, @@ -1690,14 +1691,14 @@ describe('query', () => { function MyApp_Template_1(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'span', ['id', 'from_tpl'], ['foo', '']); + Δelement(0, 'span', ['id', 'from_tpl'], ['foo', '']); } } class MyApp { show = false; query: any; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: MyApp, factory: () => new MyApp(), selectors: [['my-app']], @@ -1709,25 +1710,25 @@ describe('query', () => { */ template: (rf: RenderFlags, myApp: MyApp) => { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, MyApp_Template_1, 2, 0, 'ng-template', undefined, ['tpl', ''], - templateRefExtractor); - template( + ΔtemplateRefExtractor); + Δtemplate( 2, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'ngTemplateOutlet']); } if (rf & RenderFlags.Update) { - const tplRef = reference(1); - elementProperty(2, 'ngTemplateOutlet', bind(myApp.show ? tplRef : null)); + const tplRef = Δreference(1); + ΔelementProperty(2, 'ngTemplateOutlet', Δbind(myApp.show ? tplRef : null)); } }, directives: () => [NgTemplateOutlet], viewQuery: (rf: RenderFlags, myApp: MyApp) => { let tmp: any; if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (myApp.query = tmp as QueryList); } } @@ -1767,33 +1768,33 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.exp) { - let rf1 = embeddedViewStart(1, 2, 0); + let rf1 = ΔembeddedViewStart(1, 2, 0); { if (rf1 & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); firstEl = getNativeByIndex(0, getLView()); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1829,37 +1830,37 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'span', null, ['foo', '']); + Δelement(0, 'span', null, ['foo', '']); firstEl = getNativeByIndex(0, getLView()); - container(2); - element(3, 'span', null, ['foo', '']); + Δcontainer(2); + Δelement(3, 'span', null, ['foo', '']); lastEl = getNativeByIndex(3, getLView()); } if (rf & RenderFlags.Update) { - containerRefreshStart(2); + ΔcontainerRefreshStart(2); { if (ctx.exp) { - let rf1 = embeddedViewStart(1, 2, 0); + let rf1 = ΔembeddedViewStart(1, 2, 0); { if (rf1 & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); viewEl = getNativeByIndex(0, getLView()); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 5, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1900,43 +1901,43 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.exp1) { - let rf0 = embeddedViewStart(0, 2, 0); + let rf0 = ΔembeddedViewStart(0, 2, 0); { if (rf0 & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); firstEl = getNativeByIndex(0, getLView()); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } if (ctx.exp2) { - let rf1 = embeddedViewStart(1, 2, 0); + let rf1 = ΔembeddedViewStart(1, 2, 0); { if (rf1 & RenderFlags.Create) { - element(0, 'span', null, ['foo', '']); + Δelement(0, 'span', null, ['foo', '']); lastEl = getNativeByIndex(0, getLView()); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1974,50 +1975,50 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.exp1) { - let rf0 = embeddedViewStart(0, 3, 0); + let rf0 = ΔembeddedViewStart(0, 3, 0); { if (rf0 & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); firstEl = getNativeByIndex(0, getLView()); - container(2); + Δcontainer(2); } if (rf0 & RenderFlags.Update) { - containerRefreshStart(2); + ΔcontainerRefreshStart(2); { if (ctx.exp2) { - let rf2 = embeddedViewStart(0, 2, 0); + let rf2 = ΔembeddedViewStart(0, 2, 0); { if (rf2) { - element(0, 'span', null, ['foo', '']); + Δelement(0, 'span', null, ['foo', '']); lastEl = getNativeByIndex(0, getLView()); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -2059,38 +2060,38 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); - element(1, 'span', null, ['foo', '']); + Δcontainer(0); + Δelement(1, 'span', null, ['foo', '']); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (ctx.exp) { - let rf0 = embeddedViewStart(0, 4, 0); + let rf0 = ΔembeddedViewStart(0, 4, 0); { if (rf0 & RenderFlags.Create) { - elementStart(0, 'div', null, ['foo', '']); - { element(2, 'div', null, ['foo', '']); } - elementEnd(); + ΔelementStart(0, 'div', null, ['foo', '']); + { Δelement(2, 'div', null, ['foo', '']); } + ΔelementEnd(); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 3, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); - viewQuery(['foo'], false, null); + ΔviewQuery(['foo'], true, null); + ΔviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.deep = tmp as QueryList); - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.shallow = tmp as QueryList); } }); @@ -2129,37 +2130,37 @@ describe('query', () => { 'some-component-with-query', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], false, null); + ΔviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = queryInstance = tmp as QueryList); } }); - function createTemplate() { container(0); } + function createTemplate() { Δcontainer(0); } function updateTemplate() { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { if (condition) { - let rf1 = embeddedViewStart(1, 1, 0); + let rf1 = ΔembeddedViewStart(1, 1, 0); { if (rf1 & RenderFlags.Create) { - element(0, 'some-component-with-query'); + Δelement(0, 'some-component-with-query'); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } /** @@ -2186,17 +2187,18 @@ describe('query', () => { this.vcr.createEmbeddedView(this.temp); } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: SomeDir, selectors: [['', 'someDir', '']], - factory: () => new SomeDir( - directiveInject(ViewContainerRef as any), directiveInject(TemplateRef as any)) + factory: + () => new SomeDir( + ΔdirectiveInject(ViewContainerRef as any), ΔdirectiveInject(TemplateRef as any)) }); } function AppComponent_Template_1(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div'); + Δelement(0, 'div'); } } @@ -2208,19 +2210,19 @@ describe('query', () => { 'app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, AppComponent_Template_1, 1, 0, 'div', [AttributeMarker.Template, 'someDir']); - element(1, 'div', null, ['foo', '']); + Δelement(1, 'div', null, ['foo', '']); } }, 3, 0, [SomeDir], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -2250,17 +2252,17 @@ describe('query', () => { this.contentCheckedQuerySnapshot = this.foos ? this.foos.length : 0; } - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: WithContentDirective, selectors: [['', 'with-content', '']], factory: () => withContentInstance = new WithContentDirective(), contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { if (rf & RenderFlags.Create) { - contentQuery(dirIndex, ['foo'], true, null); + ΔcontentQuery(dirIndex, ['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadContentQuery()) && (ctx.foos = tmp); + ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.foos = tmp); } } }); @@ -2270,7 +2272,7 @@ describe('query', () => { // @ContentChildren('foo', {descendants: false}) foos !: QueryList; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ShallowComp, selectors: [['shallow-comp']], factory: () => shallowCompInstance = new ShallowComp(), @@ -2279,11 +2281,11 @@ describe('query', () => { vars: 0, contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { if (rf & RenderFlags.Create) { - contentQuery(dirIndex, ['foo'], false, null); + ΔcontentQuery(dirIndex, ['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadContentQuery()) && (ctx.foos = tmp); + ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.foos = tmp); } } }); @@ -2297,9 +2299,9 @@ describe('query', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); - { element(1, 'span', null, ['foo', '']); } - elementEnd(); + ΔelementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); + { Δelement(1, 'span', null, ['foo', '']); } + ΔelementEnd(); } }, 3, 0, [WithContentDirective]); @@ -2328,23 +2330,23 @@ describe('query', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - container(0); + Δcontainer(0); } if (rf & RenderFlags.Update) { - containerRefreshStart(0); + ΔcontainerRefreshStart(0); { for (let i = 0; i < 3; i++) { - let rf = embeddedViewStart(1, 3, 0); + let rf = ΔembeddedViewStart(1, 3, 0); if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); - { element(1, 'span', null, ['foo', '']); } - elementEnd(); + ΔelementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); + { Δelement(1, 'span', null, ['foo', '']); } + ΔelementEnd(); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, 1, 0, [WithContentDirective]); @@ -2370,7 +2372,7 @@ describe('query', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', ['with-content', ''], ['foo', '']); + Δelement(0, 'div', ['with-content', ''], ['foo', '']); } }, 2, 0, [WithContentDirective]); @@ -2382,7 +2384,7 @@ describe('query', () => { it('should match shallow content queries in views inserted / removed by ngIf', () => { function IfTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div', null, ['foo', '']); + Δelement(0, 'div', null, ['foo', '']); } } @@ -2393,12 +2395,12 @@ describe('query', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'shallow-comp'); - { template(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Template, 'ngIf', '']); } - elementEnd(); + ΔelementStart(0, 'shallow-comp'); + { Δtemplate(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Template, 'ngIf', '']); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(1, 'ngIf', bind(ctx.showing)); + ΔelementProperty(1, 'ngIf', Δbind(ctx.showing)); } }, 2, 1, [ShallowComp, NgIf]); @@ -2431,20 +2433,20 @@ describe('query', () => { 'app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['with-content', '']); - { element(1, 'div', null, ['foo', '']); } - elementEnd(); - element(3, 'div', ['id', 'after'], ['bar', '']); + ΔelementStart(0, 'div', ['with-content', '']); + { Δelement(1, 'div', null, ['foo', '']); } + ΔelementEnd(); + Δelement(3, 'div', ['id', 'after'], ['bar', '']); } }, 5, 0, [WithContentDirective], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo', 'bar'], true, null); + ΔviewQuery(['foo', 'bar'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.foos = tmp as QueryList); } }); @@ -2472,20 +2474,20 @@ describe('query', () => { 'app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['with-content', '']); - { element(1, 'div', ['id', 'yes'], ['foo', '']); } - elementEnd(); - element(3, 'div', null, ['foo', '']); + ΔelementStart(0, 'div', ['with-content', '']); + { Δelement(1, 'div', ['id', 'yes'], ['foo', '']); } + ΔelementEnd(); + Δelement(3, 'div', null, ['foo', '']); } }, 5, 0, [WithContentDirective], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['bar'], true, null); + ΔviewQuery(['bar'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.bars = tmp as QueryList); } }); @@ -2498,7 +2500,7 @@ describe('query', () => { it('should report results to appropriate queries where deep content queries are nested', () => { class QueryDirective { fooBars: any; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: QueryDirective, selectors: [['', 'query', '']], exportAs: ['query'], @@ -2507,11 +2509,11 @@ describe('query', () => { // @ContentChildren('foo, bar, baz', {descendants: true}) // fooBars: QueryList; if (rf & RenderFlags.Create) { - contentQuery(dirIndex, ['foo', 'bar', 'baz'], true, null); + ΔcontentQuery(dirIndex, ['foo', 'bar', 'baz'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadContentQuery()) && (ctx.fooBars = tmp); + ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.fooBars = tmp); } } }); @@ -2533,19 +2535,19 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.Bindings, 'query'], ['out', 'query']); + ΔelementStart(0, 'div', [AttributeMarker.Bindings, 'query'], ['out', 'query']); { - element(2, 'span', ['id', 'foo'], ['foo', '']); - elementStart(4, 'div', [AttributeMarker.Bindings, 'query'], ['in', 'query']); - { element(6, 'span', ['id', 'bar'], ['bar', '']); } - elementEnd(); - element(8, 'span', ['id', 'baz'], ['baz', '']); + Δelement(2, 'span', ['id', 'foo'], ['foo', '']); + ΔelementStart(4, 'div', [AttributeMarker.Bindings, 'query'], ['in', 'query']); + { Δelement(6, 'span', ['id', 'bar'], ['bar', '']); } + ΔelementEnd(); + Δelement(8, 'span', ['id', 'baz'], ['baz', '']); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - outInstance = load(1); - inInstance = load(5); + outInstance = Δload(1); + inInstance = Δload(5); } }, 10, 0, [QueryDirective]); @@ -2562,7 +2564,7 @@ describe('query', () => { class QueryDirective { fooBars: any; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: QueryDirective, selectors: [['', 'query', '']], exportAs: ['query'], @@ -2571,11 +2573,11 @@ describe('query', () => { // @ContentChildren('foo', {descendants: true}) // fooBars: QueryList; if (rf & RenderFlags.Create) { - contentQuery(dirIndex, ['foo'], false, null); + ΔcontentQuery(dirIndex, ['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadContentQuery()) && (ctx.fooBars = tmp); + ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.fooBars = tmp); } } }); @@ -2592,17 +2594,17 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['query', ''], ['out', 'query']); + ΔelementStart(0, 'div', ['query', ''], ['out', 'query']); { - elementStart(2, 'div', ['query', ''], ['in', 'query', 'foo', '']); - { element(5, 'span', ['id', 'bar'], ['foo', '']); } - elementEnd(); + ΔelementStart(2, 'div', ['query', ''], ['in', 'query', 'foo', '']); + { Δelement(5, 'span', ['id', 'bar'], ['foo', '']); } + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - outInstance = load(1); - inInstance = load(3); + outInstance = Δload(1); + inInstance = Δload(3); } }, 7, 0, [QueryDirective]); @@ -2618,7 +2620,7 @@ describe('query', () => { class QueryDirective { fooBars: any; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: QueryDirective, selectors: [['', 'query', '']], exportAs: ['query'], @@ -2627,11 +2629,11 @@ describe('query', () => { // @ContentChildren('foo', {descendants: true}) // fooBars: QueryList; if (rf & RenderFlags.Create) { - contentQuery(dirIndex, ['foo'], false, null); + ΔcontentQuery(dirIndex, ['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadContentQuery()) && (ctx.fooBars = tmp); + ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.fooBars = tmp); } } }); @@ -2648,17 +2650,17 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['query', ''], ['out', 'query']); + ΔelementStart(0, 'div', ['query', ''], ['out', 'query']); { - elementStart(2, 'div', ['query', ''], ['in', 'query', 'foo', '']); - { element(5, 'span', ['id', 'bar'], ['foo', '']); } - elementEnd(); + ΔelementStart(2, 'div', ['query', ''], ['in', 'query', 'foo', '']); + { Δelement(5, 'span', ['id', 'bar'], ['foo', '']); } + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - outInstance = load(1); - inInstance = load(3); + outInstance = Δload(1); + inInstance = Δload(3); } }, 7, 0, [QueryDirective]); @@ -2678,7 +2680,7 @@ describe('query', () => { () => { class ShallowQueryDirective { foos: any; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: ShallowQueryDirective, selectors: [['', 'shallow-query', '']], exportAs: ['shallow-query'], @@ -2687,11 +2689,11 @@ describe('query', () => { // @ContentChildren('foo', {descendants: false}) // foos: QueryList; if (rf & RenderFlags.Create) { - contentQuery(dirIndex, ['foo'], false, null); + ΔcontentQuery(dirIndex, ['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadContentQuery()) && (ctx.foos = tmp); + ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.foos = tmp); } } }); @@ -2699,7 +2701,7 @@ describe('query', () => { class DeepQueryDirective { foos: any; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: DeepQueryDirective, selectors: [['', 'deep-query', '']], exportAs: ['deep-query'], @@ -2708,11 +2710,11 @@ describe('query', () => { // @ContentChildren('foo', {descendants: true}) // foos: QueryList; if (rf & RenderFlags.Create) { - contentQuery(dirIndex, ['foo'], true, null); + ΔcontentQuery(dirIndex, ['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadContentQuery()) && (ctx.foos = tmp); + ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.foos = tmp); } } }); @@ -2733,20 +2735,20 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart( + ΔelementStart( 0, 'div', [AttributeMarker.Bindings, 'shallow-query', 'deep-query'], ['shallow', 'shallow-query', 'deep', 'deep-query']); { - element(3, 'span', null, ['foo', '']); - elementStart(5, 'div'); - { element(6, 'span', null, ['foo', '']); } - elementEnd(); + Δelement(3, 'span', null, ['foo', '']); + ΔelementStart(5, 'div'); + { Δelement(6, 'span', null, ['foo', '']); } + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - shallowInstance = load(1); - deepInstance = load(2); + shallowInstance = Δload(1); + deepInstance = Δload(2); } }, 8, 0, [ShallowQueryDirective, DeepQueryDirective]); @@ -2761,7 +2763,7 @@ describe('query', () => { class TextDirective { value !: string; - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: TextDirective, selectors: [['', 'text', '']], factory: () => new TextDirective(), @@ -2776,7 +2778,7 @@ describe('query', () => { // @ContentChildren(TextDirective) texts !: QueryList; - static ngComponentDef = defineDirective({ + static ngComponentDef = ΔdefineDirective({ type: ContentQueryDirective, selectors: [['', 'content-query', '']], factory: () => contentQueryDirective = new ContentQueryDirective(), @@ -2784,11 +2786,11 @@ describe('query', () => { // @ContentChildren(TextDirective, {descendants: true}) // texts: QueryList; if (rf & RenderFlags.Create) { - contentQuery(dirIndex, TextDirective, true, null); + ΔcontentQuery(dirIndex, TextDirective, true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadContentQuery()) && (ctx.texts = tmp); + ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.texts = tmp); } } }); @@ -2809,17 +2811,17 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['content-query']); + ΔelementStart(0, 'div', ['content-query']); { - element(1, 'span', ['text', 'A']); - elementStart(2, 'div', ['text', 'B']); - elementStart(3, 'span', ['text', 'C']); - { element(4, 'span', ['text', 'D']); } - elementEnd(); - elementEnd(); - element(5, 'span', ['text', 'E']); + Δelement(1, 'span', ['text', 'A']); + ΔelementStart(2, 'div', ['text', 'B']); + ΔelementStart(3, 'span', ['text', 'C']); + { Δelement(4, 'span', ['text', 'D']); } + ΔelementEnd(); + ΔelementEnd(); + Δelement(5, 'span', ['text', 'E']); } - elementEnd(); + ΔelementEnd(); } }, 6, 0, [TextDirective, ContentQueryDirective]); @@ -2844,19 +2846,19 @@ describe('query', () => { // @ViewChildren(TextDirective) texts !: QueryList; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ViewQueryComponent, selectors: [['view-query']], factory: () => new ViewQueryComponent(), template: function(rf: RenderFlags, ctx: ViewQueryComponent) { if (rf & RenderFlags.Create) { - element(0, 'span', ['text', 'A']); - elementStart(1, 'div', ['text', 'B']); - elementStart(2, 'span', ['text', 'C']); - { element(3, 'span', ['text', 'D']); } - elementEnd(); - elementEnd(); - element(4, 'span', ['text', 'E']); + Δelement(0, 'span', ['text', 'A']); + ΔelementStart(1, 'div', ['text', 'B']); + ΔelementStart(2, 'span', ['text', 'C']); + { Δelement(3, 'span', ['text', 'D']); } + ΔelementEnd(); + ΔelementEnd(); + Δelement(4, 'span', ['text', 'E']); } }, consts: 5, @@ -2864,10 +2866,10 @@ describe('query', () => { viewQuery: function(rf: RenderFlags, ctx: ViewQueryComponent) { let tmp: any; if (rf & RenderFlags.Create) { - viewQuery(TextDirective, true, null); + ΔviewQuery(TextDirective, true, null); } if (rf & RenderFlags.Update) { - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.texts = tmp as QueryList); } }, diff --git a/packages/core/test/render3/render_util.ts b/packages/core/test/render3/render_util.ts index b56876e96f..f52e1e6409 100644 --- a/packages/core/test/render3/render_util.ts +++ b/packages/core/test/render3/render_util.ts @@ -27,7 +27,7 @@ import {CreateComponentOptions} from '../../src/render3/component'; import {getDirectivesAtNodeIndex, getLContext, isComponentInstance} from '../../src/render3/context_discovery'; import {extractDirectiveDef, extractPipeDef} from '../../src/render3/definition'; import {NG_ELEMENT_ID} from '../../src/render3/fields'; -import {ComponentTemplate, ComponentType, DirectiveDef, DirectiveType, ProvidersFeature, RenderFlags, defineComponent, defineDirective, renderComponent as _renderComponent, tick} from '../../src/render3/index'; +import {ComponentTemplate, ComponentType, DirectiveDef, DirectiveType, RenderFlags, renderComponent as _renderComponent, tick, ΔProvidersFeature, ΔdefineComponent, ΔdefineDirective} from '../../src/render3/index'; import {DirectiveDefList, DirectiveTypesOrFactory, HostBindingsFunction, PipeDef, PipeDefList, PipeTypesOrFactory} from '../../src/render3/interfaces/definition'; import {PlayerHandler} from '../../src/render3/interfaces/player'; import {ProceduralRenderer3, RComment, RElement, RNode, RText, Renderer3, RendererFactory3, RendererStyleFlags3, domRendererFactory3} from '../../src/render3/interfaces/renderer'; @@ -317,7 +317,7 @@ export function createComponent( viewProviders: Provider[] = [], hostBindings?: HostBindingsFunction): ComponentType { return class Component { value: any; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Component, selectors: [[name]], consts: consts, @@ -328,7 +328,7 @@ export function createComponent( directives: directives, hostBindings, pipes: pipes, features: (providers.length > 0 || viewProviders.length > 0)? - [ProvidersFeature(providers || [], viewProviders || [])]: [] + [ΔProvidersFeature(providers || [], viewProviders || [])]: [] }); }; } @@ -336,7 +336,7 @@ export function createComponent( export function createDirective( name: string, {exportAs}: {exportAs?: string[]} = {}): DirectiveType { return class Directive { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: Directive, selectors: [['', name, '']], factory: () => new Directive(), diff --git a/packages/core/test/render3/renderer_factory_spec.ts b/packages/core/test/render3/renderer_factory_spec.ts index d046111783..82a4708aae 100644 --- a/packages/core/test/render3/renderer_factory_spec.ts +++ b/packages/core/test/render3/renderer_factory_spec.ts @@ -10,8 +10,8 @@ import {AnimationEvent} from '@angular/animations'; import {MockAnimationDriver, MockAnimationPlayer} from '@angular/animations/browser/testing'; import {RendererType2, ViewEncapsulation} from '../../src/core'; -import {defineComponent} from '../../src/render3/index'; -import {bind, container, containerRefreshEnd, containerRefreshStart, element, elementEnd, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, listener, text, tick} from '../../src/render3/instructions/all'; +import {ΔdefineComponent} from '../../src/render3/index'; +import {tick, Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δlistener, Δtext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {getAnimationRendererFactory2, getRendererFactory2} from './imported_renderer2'; @@ -29,7 +29,7 @@ describe('renderer factory lifecycle', () => { rendererFactory.end = () => logs.push('end'); class SomeComponent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SomeComponent, encapsulation: ViewEncapsulation.None, selectors: [['some-component']], @@ -38,7 +38,7 @@ describe('renderer factory lifecycle', () => { template: function(rf: RenderFlags, ctx: SomeComponent) { if (rf & RenderFlags.Create) { logs.push('component create'); - text(0, 'foo'); + Δtext(0, 'foo'); } if (rf & RenderFlags.Update) { logs.push('component update'); @@ -49,7 +49,7 @@ describe('renderer factory lifecycle', () => { } class SomeComponentWhichThrows { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SomeComponentWhichThrows, encapsulation: ViewEncapsulation.None, selectors: [['some-component-with-Error']], @@ -65,7 +65,7 @@ describe('renderer factory lifecycle', () => { function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { logs.push('function create'); - text(0, 'bar'); + Δtext(0, 'bar'); } if (rf & RenderFlags.Update) { logs.push('function update'); @@ -77,8 +77,8 @@ describe('renderer factory lifecycle', () => { function TemplateWithComponent(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { logs.push('function_with_component create'); - text(0, 'bar'); - element(1, 'some-component'); + Δtext(0, 'bar'); + Δelement(1, 'some-component'); } if (rf & RenderFlags.Update) { logs.push('function_with_component update'); @@ -139,7 +139,7 @@ describe('animation renderer factory', () => { }); class SomeComponent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SomeComponent, encapsulation: ViewEncapsulation.None, selectors: [['some-component']], @@ -147,7 +147,7 @@ describe('animation renderer factory', () => { vars: 0, template: function(rf: RenderFlags, ctx: SomeComponent) { if (rf & RenderFlags.Create) { - text(0, 'foo'); + Δtext(0, 'foo'); } }, factory: () => new SomeComponent @@ -160,23 +160,23 @@ describe('animation renderer factory', () => { callback(event: AnimationEvent) { eventLogs.push(`${event.fromState ? event.fromState : event.toState} - ${event.phaseName}`); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SomeComponentWithAnimation, selectors: [['some-component']], consts: 2, vars: 1, template: function(rf: RenderFlags, ctx: SomeComponentWithAnimation) { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); + ΔelementStart(0, 'div'); { - listener('@myAnimation.start', ctx.callback.bind(ctx)); - listener('@myAnimation.done', ctx.callback.bind(ctx)); - text(1, 'foo'); + Δlistener('@myAnimation.start', ctx.callback.bind(ctx)); + Δlistener('@myAnimation.done', ctx.callback.bind(ctx)); + Δtext(1, 'foo'); } - elementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, '@myAnimation', bind(ctx.exp)); + ΔelementProperty(0, '@myAnimation', Δbind(ctx.exp)); } }, factory: () => new SomeComponentWithAnimation, @@ -234,27 +234,27 @@ describe('Renderer2 destruction hooks', () => { let condition = true; function createTemplate() { - elementStart(0, 'div'); - { container(1); } - elementEnd(); + ΔelementStart(0, 'div'); + { Δcontainer(1); } + ΔelementEnd(); } function updateTemplate() { - containerRefreshStart(1); + ΔcontainerRefreshStart(1); { if (condition) { - let rf1 = embeddedViewStart(1, 3, 0); + let rf1 = ΔembeddedViewStart(1, 3, 0); { if (rf1 & RenderFlags.Create) { - element(0, 'span'); - element(1, 'span'); - element(2, 'span'); + Δelement(0, 'span'); + Δelement(1, 'span'); + Δelement(2, 'span'); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } const t = new TemplateFixture( @@ -270,7 +270,7 @@ describe('Renderer2 destruction hooks', () => { it('should call renderer.destroy for each component destroyed', () => { class SimpleComponent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SimpleComponent, encapsulation: ViewEncapsulation.None, selectors: [['simple']], @@ -278,7 +278,7 @@ describe('Renderer2 destruction hooks', () => { vars: 0, template: function(rf: RenderFlags, ctx: SimpleComponent) { if (rf & RenderFlags.Create) { - element(0, 'span'); + Δelement(0, 'span'); } }, factory: () => new SimpleComponent, @@ -288,27 +288,27 @@ describe('Renderer2 destruction hooks', () => { let condition = true; function createTemplate() { - elementStart(0, 'div'); - { container(1); } - elementEnd(); + ΔelementStart(0, 'div'); + { Δcontainer(1); } + ΔelementEnd(); } function updateTemplate() { - containerRefreshStart(1); + ΔcontainerRefreshStart(1); { if (condition) { - let rf1 = embeddedViewStart(1, 3, 0); + let rf1 = ΔembeddedViewStart(1, 3, 0); { if (rf1 & RenderFlags.Create) { - element(0, 'simple'); - element(1, 'span'); - element(2, 'simple'); + Δelement(0, 'simple'); + Δelement(1, 'span'); + Δelement(2, 'simple'); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } const t = new TemplateFixture( diff --git a/packages/core/test/render3/styling/class_and_style_bindings_spec.ts b/packages/core/test/render3/styling/class_and_style_bindings_spec.ts index 68e8688656..83294c6fa6 100644 --- a/packages/core/test/render3/styling/class_and_style_bindings_spec.ts +++ b/packages/core/test/render3/styling/class_and_style_bindings_spec.ts @@ -9,7 +9,7 @@ import {createLView, createTView} from '@angular/core/src/render3/instructions/s import {createRootContext} from '../../../src/render3/component'; import {getLContext} from '../../../src/render3/context_discovery'; -import {defineComponent, defineDirective, elementClassProp, elementEnd, elementHostClassProp, elementHostStyleProp, elementHostStyling, elementHostStylingApply, elementStart, elementStyleProp, elementStyling, elementStylingApply, elementStylingMap, namespaceSVG} from '../../../src/render3/index'; +import {ΔdefineComponent, ΔdefineDirective, ΔelementClassProp, ΔelementEnd, ΔelementHostClassProp, ΔelementHostStyleProp, ΔelementHostStyling, ΔelementHostStylingApply, ΔelementStart, ΔelementStyleProp, ΔelementStyling, ΔelementStylingApply, ΔelementStylingMap, ΔnamespaceSVG} from '../../../src/render3/index'; import {RenderFlags} from '../../../src/render3/interfaces/definition'; import {AttributeMarker, TAttributes} from '../../../src/render3/interfaces/node'; import {BindingStore, BindingType, PlayState, Player, PlayerContext, PlayerFactory, PlayerHandler} from '../../../src/render3/interfaces/player'; @@ -22,7 +22,7 @@ import {CorePlayerHandler} from '../../../src/render3/styling/core_player_handle import {registerHostDirective} from '../../../src/render3/styling/host_instructions_queue'; import {BoundPlayerFactory, bindPlayerFactory} from '../../../src/render3/styling/player_factory'; import {allocStylingContext, createEmptyStylingContext} from '../../../src/render3/styling/util'; -import {defaultStyleSanitizer} from '../../../src/sanitization/sanitization'; +import {ΔdefaultStyleSanitizer} from '../../../src/sanitization/sanitization'; import {StyleSanitizeFn} from '../../../src/sanitization/style_sanitizer'; import {ComponentFixture, renderToHtml} from '../render_util'; @@ -376,7 +376,7 @@ describe('style and class based bindings', () => { () => { function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'span', [ + ΔelementStart(0, 'span', [ AttributeMarker.Styles, 'width', '200px', @@ -385,13 +385,13 @@ describe('style and class based bindings', () => { 'opacity', '0.5', ]); - elementStyling(null, ['width']); - elementEnd(); + ΔelementStyling(null, ['width']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingMap(0, null, ctx.myStyles); - elementStyleProp(0, 0, ctx.myWidth); - elementStylingApply(0); + ΔelementStylingMap(0, null, ctx.myStyles); + ΔelementStyleProp(0, 0, ctx.myWidth); + ΔelementStylingApply(0); } } @@ -411,7 +411,7 @@ describe('style and class based bindings', () => { class Comp { diameter: number = 100; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Comp, selectors: [['comp']], factory: () => new Comp(), @@ -419,17 +419,17 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - namespaceSVG(); - elementStart(0, 'svg'); - elementStyling(null, ['width', 'height']); - elementStart(1, 'circle', ['stroke', 'green', 'fill', 'yellow']); - elementEnd(); - elementEnd(); + ΔnamespaceSVG(); + ΔelementStart(0, 'svg'); + ΔelementStyling(null, ['width', 'height']); + ΔelementStart(1, 'circle', ['stroke', 'green', 'fill', 'yellow']); + ΔelementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStyleProp(0, 0, ctx.diameter, 'px'); - elementStyleProp(0, 1, ctx.diameter, 'px'); - elementStylingApply(0); + ΔelementStyleProp(0, 0, ctx.diameter, 'px'); + ΔelementStyleProp(0, 1, ctx.diameter, 'px'); + ΔelementStylingApply(0); } } }); @@ -453,7 +453,7 @@ describe('style and class based bindings', () => { borderWidth: string = '3px'; borderColor: string = 'red'; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Comp, selectors: [['comp']], factory: () => new Comp(), @@ -461,14 +461,14 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - elementStyling(null, ['borderWidth', 'border-color']); - elementEnd(); + ΔelementStart(0, 'div'); + ΔelementStyling(null, ['borderWidth', 'border-color']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStyleProp(0, 0, ctx.borderWidth); - elementStyleProp(0, 1, ctx.borderColor); - elementStylingApply(0); + ΔelementStyleProp(0, 0, ctx.borderWidth); + ΔelementStyleProp(0, 1, ctx.borderColor); + ΔelementStylingApply(0); } } }); @@ -1269,7 +1269,7 @@ describe('style and class based bindings', () => { () => { const getStyles = trackStylesFactory(); const styleBindings = ['border-image', 'border-width']; - const styleSanitizer = defaultStyleSanitizer; + const styleSanitizer = ΔdefaultStyleSanitizer; const stylingContext = createStylingContext(null, styleBindings, null, null, styleSanitizer); @@ -3086,7 +3086,7 @@ describe('style and class based bindings', () => { const fooFactory = bindPlayerFactory(classBuildFn, true); class Comp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Comp, selectors: [['comp']], directives: [Comp], @@ -3095,15 +3095,15 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - elementStyling(['foo'], ['width']); - elementEnd(); + ΔelementStart(0, 'div'); + ΔelementStyling(['foo'], ['width']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingMap(0, classMapFactory, styleMapFactory); - elementStyleProp(0, 0, widthFactory); - elementClassProp(0, 0, fooFactory); - elementStylingApply(0); + ΔelementStylingMap(0, classMapFactory, styleMapFactory); + ΔelementStyleProp(0, 0, widthFactory); + ΔelementClassProp(0, 0, fooFactory); + ΔelementStylingApply(0); } } }); @@ -3159,7 +3159,7 @@ describe('style and class based bindings', () => { let fooFactory = bindPlayerFactory(buildFn, true) as BoundPlayerFactory; class Comp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Comp, selectors: [['comp']], directives: [Comp], @@ -3168,15 +3168,15 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - elementStyling(['foo'], ['width']); - elementEnd(); + ΔelementStart(0, 'div'); + ΔelementStyling(['foo'], ['width']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingMap(0, classMapFactory, styleMapFactory); - elementStyleProp(0, 0, widthFactory); - elementClassProp(0, 0, fooFactory); - elementStylingApply(0); + ΔelementStylingMap(0, classMapFactory, styleMapFactory); + ΔelementStyleProp(0, 0, widthFactory); + ΔelementClassProp(0, 0, fooFactory); + ΔelementStylingApply(0); } } }); @@ -3234,18 +3234,18 @@ describe('style and class based bindings', () => { const fooFactory2 = bindPlayerFactory(classBuildFn, true); class MyDir { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: MyDir, selectors: [['', 'my-dir', '']], factory: () => new MyDir(), hostBindings: function(rf: RenderFlags, ctx: MyDir, elementIndex: number) { if (rf & RenderFlags.Create) { - elementHostStyling(['foo'], ['width']); + ΔelementHostStyling(['foo'], ['width']); } if (rf & RenderFlags.Update) { - elementHostStyleProp(0, ctx.widthFactory); - elementHostClassProp(0, ctx.fooFactory); - elementHostStylingApply(); + ΔelementHostStyleProp(0, ctx.widthFactory); + ΔelementHostClassProp(0, ctx.fooFactory); + ΔelementHostStylingApply(); } } }); @@ -3255,7 +3255,7 @@ describe('style and class based bindings', () => { } class Comp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Comp, selectors: [['comp']], directives: [Comp, MyDir], @@ -3264,14 +3264,14 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div', ['my-dir', '']); - elementStyling(['foo'], ['width']); - elementEnd(); + ΔelementStart(0, 'div', ['my-dir', '']); + ΔelementStyling(['foo'], ['width']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStyleProp(0, 0, ctx.widthFactory); - elementClassProp(0, 0, ctx.fooFactory); - elementStylingApply(0); + ΔelementStyleProp(0, 0, ctx.widthFactory); + ΔelementClassProp(0, 0, ctx.fooFactory); + ΔelementStylingApply(0); } } }); diff --git a/packages/core/test/render3/styling/players_spec.ts b/packages/core/test/render3/styling/players_spec.ts index 768d8daebd..1cf5d8d934 100644 --- a/packages/core/test/render3/styling/players_spec.ts +++ b/packages/core/test/render3/styling/players_spec.ts @@ -8,12 +8,12 @@ import {QueryList} from '@angular/core'; import {RenderFlags} from '@angular/core/src/render3'; -import {defineComponent, getHostElement, loadViewQuery, viewQuery} from '../../../src/render3/index'; -import {element, elementEnd, elementStart, elementStyling, elementStylingApply, markDirty} from '../../../src/render3/instructions/all'; +import {getHostElement, ΔdefineComponent, ΔloadViewQuery, ΔviewQuery} from '../../../src/render3/index'; +import {markDirty, Δelement, ΔelementEnd, ΔelementStart, ΔelementStyling, ΔelementStylingApply} from '../../../src/render3/instructions/all'; import {PlayState, Player, PlayerHandler} from '../../../src/render3/interfaces/player'; import {RElement} from '../../../src/render3/interfaces/renderer'; import {addPlayer, getPlayers} from '../../../src/render3/players'; -import {queryRefresh} from '../../../src/render3/query'; +import {ΔqueryRefresh} from '../../../src/render3/query'; import {getOrCreatePlayerContext} from '../../../src/render3/styling/util'; import {ComponentFixture} from '../render_util'; @@ -228,7 +228,7 @@ function buildElementWithStyling() { } class Comp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Comp, exportAs: ['child'], selectors: [['child-comp']], @@ -237,7 +237,7 @@ class Comp { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - element(0, 'div'); + Δelement(0, 'div'); } ctx.logger(); } @@ -248,7 +248,7 @@ class Comp { } class CompWithStyling { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: CompWithStyling, exportAs: ['child-styled'], selectors: [['child-styled-comp']], @@ -257,12 +257,12 @@ class CompWithStyling { vars: 0, template: (rf: RenderFlags, ctx: CompWithStyling) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - elementStyling(['fooClass']); - elementEnd(); + ΔelementStart(0, 'div'); + ΔelementStyling(['fooClass']); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementStylingApply(0); + ΔelementStylingApply(0); } } }); @@ -271,7 +271,7 @@ class CompWithStyling { } class SuperComp { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SuperComp, selectors: [['super-comp']], factory: () => new SuperComp(), @@ -279,18 +279,19 @@ class SuperComp { vars: 0, template: (rf: RenderFlags, ctx: SuperComp) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - element(1, 'child-comp', ['child', ''], ['child', 'child']); - elementEnd(); + ΔelementStart(0, 'div'); + Δelement(1, 'child-comp', ['child', ''], ['child', 'child']); + ΔelementEnd(); } }, viewQuery: function(rf: RenderFlags, ctx: SuperComp) { if (rf & RenderFlags.Create) { - viewQuery(['child'], true, null); + ΔviewQuery(['child'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && (ctx.query = tmp as QueryList); + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + (ctx.query = tmp as QueryList); } }, directives: [Comp] diff --git a/packages/core/test/render3/template_ref_spec.ts b/packages/core/test/render3/template_ref_spec.ts index aaa4ee793b..d5059f366e 100644 --- a/packages/core/test/render3/template_ref_spec.ts +++ b/packages/core/test/render3/template_ref_spec.ts @@ -8,21 +8,21 @@ import {TemplateRef} from '@angular/core'; -import {ComponentFixture, createComponent, getDirectiveOnNode} from './render_util'; -import {bind, directiveInject, element, elementContainerStart, elementContainerEnd, elementProperty, template, text} from '../../src/render3/instructions/all'; -import {RenderFlags, defineDirective, AttributeMarker} from '../../src/render3/index'; +import {AttributeMarker, RenderFlags, ΔdefineDirective} from '../../src/render3/index'; +import {Δbind, ΔdirectiveInject, Δelement, ΔelementContainerEnd, ΔelementContainerStart, ΔelementProperty, Δtemplate, Δtext} from '../../src/render3/instructions/all'; import {NgIf} from './common_with_def'; +import {ComponentFixture, createComponent, getDirectiveOnNode} from './render_util'; describe('TemplateRef', () => { describe('rootNodes', () => { class DirectiveWithTplRef { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: DirectiveWithTplRef, selectors: [['', 'tplRef', '']], - factory: () => new DirectiveWithTplRef(directiveInject(TemplateRef as any)) + factory: () => new DirectiveWithTplRef(ΔdirectiveInject(TemplateRef as any)) }); // injecting a ViewContainerRef to create a dynamic container in which embedded views will be @@ -35,9 +35,9 @@ describe('TemplateRef', () => { function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'div'); - text(1, 'some text'); - element(2, 'span'); + Δelement(0, 'div'); + Δtext(1, 'some text'); + Δelement(2, 'span'); } } @@ -50,7 +50,7 @@ describe('TemplateRef', () => { */ const AppComponent = createComponent('app-cmp', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, embeddedTemplate, 3, 0, 'ng-template', ['tplRef', '']); + Δtemplate(0, embeddedTemplate, 3, 0, 'ng-template', ['tplRef', '']); directiveWithTplRef = getDirectiveOnNode(0, 0); } }, 1, 0, [DirectiveWithTplRef]); @@ -79,7 +79,7 @@ describe('TemplateRef', () => { */ const AppComponent = createComponent('app-cmp', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, () => {}, 0, 0, 'ng-template', ['tplRef', '']); + Δtemplate(0, () => {}, 0, 0, 'ng-template', ['tplRef', '']); directiveWithTplRef = getDirectiveOnNode(0, 0); } }, 1, 0, [DirectiveWithTplRef]); @@ -102,16 +102,16 @@ describe('TemplateRef', () => { function ngIfTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'text'); + Δtext(0, 'text'); } } function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, ngIfTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); + Δtemplate(0, ngIfTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'ngIf', bind(ctx.showing)); + ΔelementProperty(0, 'ngIf', Δbind(ctx.showing)); } } @@ -120,7 +120,7 @@ describe('TemplateRef', () => { */ const AppComponent = createComponent('app-cmp', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, embeddedTemplate, 1, 1, 'ng-template', ['tplRef', '']); + Δtemplate(0, embeddedTemplate, 1, 1, 'ng-template', ['tplRef', '']); directiveWithTplRef = getDirectiveOnNode(0, 0); } }, 1, 0, [DirectiveWithTplRef, NgIf]); @@ -147,9 +147,9 @@ describe('TemplateRef', () => { function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementContainerStart(0); - { text(1, 'text'); } - elementContainerEnd(); + ΔelementContainerStart(0); + { Δtext(1, 'text'); } + ΔelementContainerEnd(); } } @@ -158,7 +158,7 @@ describe('TemplateRef', () => { */ const AppComponent = createComponent('app-cmp', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template(0, embeddedTemplate, 2, 0, 'ng-template', ['tplRef', '']); + Δtemplate(0, embeddedTemplate, 2, 0, 'ng-template', ['tplRef', '']); directiveWithTplRef = getDirectiveOnNode(0, 0); } }, 1, 0, [DirectiveWithTplRef]); @@ -175,4 +175,4 @@ describe('TemplateRef', () => { expect(viewRef.rootNodes[1].nodeType).toBe(3); // a text node }); }); -}); \ No newline at end of file +}); diff --git a/packages/core/test/render3/view_container_ref_spec.ts b/packages/core/test/render3/view_container_ref_spec.ts index 6d5ec4a39b..4819ef35e0 100644 --- a/packages/core/test/render3/view_container_ref_spec.ts +++ b/packages/core/test/render3/view_container_ref_spec.ts @@ -6,19 +6,19 @@ * found in the LICENSE file at https://angular.io/license */ -import {ChangeDetectorRef, Component as _Component, ComponentFactoryResolver, ComponentRef, defineInjector, ElementRef, EmbeddedViewRef, NgModuleRef, Pipe, PipeTransform, QueryList, RendererFactory2, TemplateRef, ViewContainerRef, ViewRef, ɵAPP_ROOT as APP_ROOT, ɵNgModuleDef as NgModuleDef,} from '../../src/core'; +import {ChangeDetectorRef, Component as _Component, ComponentFactoryResolver, ComponentRef, ΔdefineInjector, ElementRef, EmbeddedViewRef, NgModuleRef, Pipe, PipeTransform, QueryList, RendererFactory2, TemplateRef, ViewContainerRef, ViewRef, ɵAPP_ROOT as APP_ROOT, ɵNgModuleDef as NgModuleDef,} from '../../src/core'; import {createInjector} from '../../src/di/r3_injector'; import {ViewEncapsulation} from '../../src/metadata'; -import {AttributeMarker, defineComponent, defineDirective, definePipe, injectComponentFactoryResolver, listener, loadViewQuery, NgOnChangesFeature, queryRefresh, viewQuery,} from '../../src/render3/index'; +import {AttributeMarker, ΔdefineComponent, ΔdefineDirective, ΔdefinePipe, injectComponentFactoryResolver, Δlistener, ΔloadViewQuery, ΔNgOnChangesFeature, ΔqueryRefresh, ΔviewQuery,} from '../../src/render3/index'; -import {allocHostVars, bind, container, containerRefreshEnd, containerRefreshStart, directiveInject, element, elementEnd, elementHostAttrs, elementProperty, elementStart, embeddedViewEnd, embeddedViewStart, interpolation1, interpolation3, nextContext, projection, projectionDef, reference, template, text, textBinding,} from '../../src/render3/instructions/all'; +import {ΔallocHostVars, Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, ΔdirectiveInject, Δelement, ΔelementEnd, ΔelementHostAttrs, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δinterpolation1, Δinterpolation3, ΔnextContext, Δprojection, ΔprojectionDef, Δreference, Δtemplate, Δtext, ΔtextBinding,} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {RElement} from '../../src/render3/interfaces/renderer'; import {NgModuleFactory} from '../../src/render3/ng_module_ref'; -import {pipe, pipeBind1} from '../../src/render3/pipe'; +import {Δpipe, ΔpipeBind1} from '../../src/render3/pipe'; import {getLView} from '../../src/render3/state'; import {getNativeByIndex} from '../../src/render3/util/view_utils'; -import {templateRefExtractor} from '../../src/render3/view_engine_compatibility_prebound'; +import {ΔtemplateRefExtractor} from '../../src/render3/view_engine_compatibility_prebound'; import {NgForOf} from '../../test/render3/common_with_def'; import {getRendererFactory2} from './imported_renderer2'; @@ -36,12 +36,12 @@ describe('ViewContainerRef', () => { beforeEach(() => directiveInstance = null); class DirectiveWithVCRef { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: DirectiveWithVCRef, selectors: [['', 'vcref', '']], factory: () => directiveInstance = new DirectiveWithVCRef( - directiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), + ΔdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), inputs: {tplRef: 'tplRef', name: 'name'} }); @@ -61,10 +61,10 @@ describe('ViewContainerRef', () => { */ function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0); + Δtext(0); } if (rf & RenderFlags.Update) { - textBinding(0, bind(ctx.name)); + ΔtextBinding(0, Δbind(ctx.name)); } } @@ -78,14 +78,14 @@ describe('ViewContainerRef', () => { *

*/ function createTemplate() { - template( - 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], templateRefExtractor); - element(2, 'p', ['vcref', '']); + Δtemplate( + 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], ΔtemplateRefExtractor); + Δelement(2, 'p', ['vcref', '']); } function updateTemplate() { - const tplRef = reference(1); - elementProperty(2, 'tplRef', bind(tplRef)); + const tplRef = Δreference(1); + ΔelementProperty(2, 'tplRef', Δbind(tplRef)); } describe('createEmbeddedView (incl. insert)', () => { @@ -96,10 +96,11 @@ describe('ViewContainerRef', () => { *
*/ function createTemplate() { - template( - 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], templateRefExtractor); - element(2, 'header', ['vcref', '']); - element(3, 'footer'); + Δtemplate( + 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], + ΔtemplateRefExtractor); + Δelement(2, 'header', ['vcref', '']); + Δelement(3, 'footer'); } const fixture = @@ -133,10 +134,10 @@ describe('ViewContainerRef', () => { *
*/ function createTemplate() { - template( - 0, embeddedTemplate, 1, 1, 'ng-template', [], ['tplRef', ''], templateRefExtractor); - element(2, 'header-cmp', ['vcref', '']); - element(3, 'footer'); + Δtemplate( + 0, embeddedTemplate, 1, 1, 'ng-template', [], ['tplRef', ''], ΔtemplateRefExtractor); + Δelement(2, 'header-cmp', ['vcref', '']); + Δelement(3, 'footer'); } const fixture = new TemplateFixture( @@ -170,10 +171,11 @@ describe('ViewContainerRef', () => { *
*/ function createTemplate() { - template( - 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], templateRefExtractor); - element(2, 'div', ['vcref', '']); - element(3, 'div', ['vcref', '']); + Δtemplate( + 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], + ΔtemplateRefExtractor); + Δelement(2, 'div', ['vcref', '']); + Δelement(3, 'div', ['vcref', '']); // for testing only: firstDir = getDirectiveOnNode(2); @@ -181,9 +183,9 @@ describe('ViewContainerRef', () => { } function update() { - const tplRef = reference(1); - elementProperty(2, 'tplRef', bind(tplRef)); - elementProperty(3, 'tplRef', bind(tplRef)); + const tplRef = Δreference(1); + ΔelementProperty(2, 'tplRef', Δbind(tplRef)); + ΔelementProperty(3, 'tplRef', Δbind(tplRef)); } const fixture = new TemplateFixture(createTemplate, update, 4, 2, [DirectiveWithVCRef]); @@ -201,15 +203,15 @@ describe('ViewContainerRef', () => { *
*/ function createTemplate() { - template( + Δtemplate( 0, embeddedTemplate, 1, 1, 'ng-template', ['vcref', ''], ['tplRef', ''], - templateRefExtractor); - element(2, 'footer'); + ΔtemplateRefExtractor); + Δelement(2, 'footer'); } function updateTemplate() { - const tplRef = reference(1); - elementProperty(0, 'tplRef', bind(tplRef)); + const tplRef = Δreference(1); + ΔelementProperty(0, 'tplRef', Δbind(tplRef)); } const fixture = @@ -238,12 +240,13 @@ describe('ViewContainerRef', () => { let directiveInstances: TestDirective[] = []; class TestDirective { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: TestDirective, selectors: [['', 'testdir', '']], factory: () => { const instance = new TestDirective( - directiveInject(ViewContainerRef as any), directiveInject(TemplateRef as any)); + ΔdirectiveInject(ViewContainerRef as any), + ΔdirectiveInject(TemplateRef as any)); directiveInstances.push(instance); @@ -260,13 +263,13 @@ describe('ViewContainerRef', () => { function EmbeddedTemplateA(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'A'); + Δtext(0, 'A'); } } function EmbeddedTemplateB(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'B'); + Δtext(0, 'B'); } } @@ -279,7 +282,7 @@ describe('ViewContainerRef', () => { class TestComponent { // TODO(issue/24571): remove '!'. testDir !: TestDirective; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: TestComponent, encapsulation: ViewEncapsulation.None, selectors: [['test-cmp']], @@ -288,10 +291,10 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: TestComponent) => { if (rf & RenderFlags.Create) { - text(0, 'before|'); - template(1, EmbeddedTemplateA, 1, 0, 'ng-template', ['testdir', '']); - template(2, EmbeddedTemplateB, 1, 0, 'ng-template', ['testdir', '']); - text(3, '|after'); + Δtext(0, 'before|'); + Δtemplate(1, EmbeddedTemplateA, 1, 0, 'ng-template', ['testdir', '']); + Δtemplate(2, EmbeddedTemplateB, 1, 0, 'ng-template', ['testdir', '']); + Δtext(3, '|after'); } }, directives: [TestDirective] @@ -314,12 +317,12 @@ describe('ViewContainerRef', () => { let directiveInstance: TestDirective; class TestDirective { - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: TestDirective, selectors: [['', 'testdir', '']], factory: () => directiveInstance = new TestDirective( - directiveInject(ViewContainerRef as any), - directiveInject(TemplateRef as any)) + ΔdirectiveInject(ViewContainerRef as any), + ΔdirectiveInject(TemplateRef as any)) }); constructor(private _vcRef: ViewContainerRef, private _tplRef: TemplateRef<{}>) {} @@ -336,7 +339,7 @@ describe('ViewContainerRef', () => { function EmbeddedTemplateA(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - text(0, 'A'); + Δtext(0, 'A'); } } @@ -352,7 +355,7 @@ describe('ViewContainerRef', () => { condition = false; // TODO(issue/24571): remove '!'. testDir !: TestDirective; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: TestComponent, encapsulation: ViewEncapsulation.None, selectors: [['test-cmp']], @@ -361,25 +364,25 @@ describe('ViewContainerRef', () => { factory: () => new TestComponent(), template: (rf: RenderFlags, cmp: TestComponent) => { if (rf & RenderFlags.Create) { - text(0, 'before|'); - template(1, EmbeddedTemplateA, 1, 0, 'ng-template', ['testdir', '']); - container(2); - text(3, '|after'); + Δtext(0, 'before|'); + Δtemplate(1, EmbeddedTemplateA, 1, 0, 'ng-template', ['testdir', '']); + Δcontainer(2); + Δtext(3, '|after'); } if (rf & RenderFlags.Update) { - containerRefreshStart(2); + ΔcontainerRefreshStart(2); { if (cmp.condition) { - let rf1 = embeddedViewStart(0, 1, 0); + let rf1 = ΔembeddedViewStart(0, 1, 0); { if (rf1 & RenderFlags.Create) { - text(0, 'B'); + Δtext(0, 'B'); } } - embeddedViewEnd(); + ΔembeddedViewEnd(); } } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } }, directives: [TestDirective] @@ -414,7 +417,7 @@ describe('ViewContainerRef', () => { // TODO(issue/24571): remove '!'. name !: string; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Child, encapsulation: ViewEncapsulation.None, selectors: [['child']], @@ -423,10 +426,10 @@ describe('ViewContainerRef', () => { vars: 1, template: (rf: RenderFlags, cmp: Child) => { if (rf & RenderFlags.Create) { - text(0); + Δtext(0); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('', cmp.name, '')); + ΔtextBinding(0, Δinterpolation1('', cmp.name, '')); } }, inputs: {name: 'name'} @@ -437,7 +440,7 @@ describe('ViewContainerRef', () => { class StarPipe implements PipeTransform { transform(value: any) { return `**${value}**`; } - static ngPipeDef = definePipe({ + static ngPipeDef = ΔdefinePipe({ name: 'starPipe', type: StarPipe, factory: function StarPipe_Factory() { return new StarPipe(); }, @@ -446,11 +449,11 @@ describe('ViewContainerRef', () => { function SomeComponent_Template_0(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'child'); - pipe(1, 'starPipe'); + Δelement(0, 'child'); + Δpipe(1, 'starPipe'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'name', bind(pipeBind1(1, 1, 'C'))); + ΔelementProperty(0, 'name', Δbind(ΔpipeBind1(1, 1, 'C'))); } } @@ -464,7 +467,7 @@ describe('ViewContainerRef', () => { ` }) class SomeComponent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SomeComponent, encapsulation: ViewEncapsulation.None, selectors: [['some-comp']], @@ -473,19 +476,19 @@ describe('ViewContainerRef', () => { vars: 7, template: (rf: RenderFlags, cmp: SomeComponent) => { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, SomeComponent_Template_0, 2, 3, 'ng-template', [], ['foo', ''], - templateRefExtractor); - pipe(2, 'starPipe'); - element(3, 'child', ['vcref', '']); - pipe(4, 'starPipe'); - element(5, 'child'); + ΔtemplateRefExtractor); + Δpipe(2, 'starPipe'); + Δelement(3, 'child', ['vcref', '']); + Δpipe(4, 'starPipe'); + Δelement(5, 'child'); } if (rf & RenderFlags.Update) { - const tplRef = reference(1); - elementProperty(3, 'tplRef', bind(tplRef)); - elementProperty(3, 'name', bind(pipeBind1(2, 3, 'A'))); - elementProperty(5, 'name', bind(pipeBind1(4, 5, 'B'))); + const tplRef = Δreference(1); + ΔelementProperty(3, 'tplRef', Δbind(tplRef)); + ΔelementProperty(3, 'name', Δbind(ΔpipeBind1(2, 3, 'A'))); + ΔelementProperty(5, 'name', Δbind(ΔpipeBind1(4, 5, 'B'))); } }, directives: [Child, DirectiveWithVCRef], @@ -512,10 +515,10 @@ describe('ViewContainerRef', () => { constructor(public vcr: ViewContainerRef) {} - static ngDirectiveDef = defineDirective({ + static ngDirectiveDef = ΔdefineDirective({ type: InsertionDir, selectors: [['', 'tplDir', '']], - factory: () => new InsertionDir(directiveInject(ViewContainerRef as any)), + factory: () => new InsertionDir(ΔdirectiveInject(ViewContainerRef as any)), inputs: {tplDir: 'tplDir'} }); } @@ -533,7 +536,7 @@ describe('ViewContainerRef', () => { name = 'Child'; tpl: TemplateRef|null = null; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Child, encapsulation: ViewEncapsulation.None, selectors: [['child']], @@ -542,13 +545,13 @@ describe('ViewContainerRef', () => { vars: 2, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div', [AttributeMarker.Bindings, 'tplDir']); - { text(1); } - elementEnd(); + ΔelementStart(0, 'div', [AttributeMarker.Bindings, 'tplDir']); + { Δtext(1); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - elementProperty(0, 'tplDir', bind(ctx.tpl)); - textBinding(1, bind(ctx.name)); + ΔelementProperty(0, 'tplDir', Δbind(ctx.tpl)); + ΔtextBinding(1, Δbind(ctx.name)); } }, inputs: {tpl: 'tpl'}, @@ -566,27 +569,27 @@ describe('ViewContainerRef', () => { */ const Parent = createComponent('parent', function(rf: RenderFlags, parent: any) { if (rf & RenderFlags.Create) { - template( - 0, fooTemplate, 2, 1, 'ng-template', null, ['foo', ''], templateRefExtractor); - element(2, 'child'); + Δtemplate( + 0, fooTemplate, 2, 1, 'ng-template', null, ['foo', ''], ΔtemplateRefExtractor); + Δelement(2, 'child'); } if (rf & RenderFlags.Update) { - const tplRef = reference(1); - elementProperty(2, 'tpl', bind(tplRef)); + const tplRef = Δreference(1); + ΔelementProperty(2, 'tpl', Δbind(tplRef)); } }, 3, 1, [Child]); function fooTemplate(rf1: RenderFlags, ctx: any) { if (rf1 & RenderFlags.Create) { - elementStart(0, 'div'); - { text(1); } - elementEnd(); + ΔelementStart(0, 'div'); + { Δtext(1); } + ΔelementEnd(); } if (rf1 & RenderFlags.Update) { - const parent = nextContext(); - textBinding(1, bind(parent.name)); + const parent = ΔnextContext(); + ΔtextBinding(1, Δbind(parent.name)); } } @@ -619,7 +622,7 @@ describe('ViewContainerRef', () => { // @Input() rows !: any[]; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: LoopComp, encapsulation: ViewEncapsulation.None, selectors: [['loop-comp']], @@ -628,12 +631,12 @@ describe('ViewContainerRef', () => { vars: 2, template: function(rf: RenderFlags, loop: any) { if (rf & RenderFlags.Create) { - template(0, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'ngForOf']); + Δtemplate(0, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'ngForOf']); } if (rf & RenderFlags.Update) { - elementProperty(0, 'ngForOf', bind(loop.rows)); - elementProperty(0, 'ngForTemplate', bind(loop.tpl)); + ΔelementProperty(0, 'ngForOf', Δbind(loop.rows)); + ΔelementProperty(0, 'ngForTemplate', Δbind(loop.tpl)); } }, inputs: {tpl: 'tpl', rows: 'rows'}, @@ -658,48 +661,48 @@ describe('ViewContainerRef', () => { */ const Parent = createComponent('parent', function(rf: RenderFlags, parent: any) { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, rowTemplate, 3, 2, 'ng-template', null, ['rowTemplate', ''], - templateRefExtractor); - element(2, 'loop-comp'); + ΔtemplateRefExtractor); + Δelement(2, 'loop-comp'); } if (rf & RenderFlags.Update) { - const rowTemplateRef = reference(1); - elementProperty(2, 'tpl', bind(rowTemplateRef)); - elementProperty(2, 'rows', bind(parent.rows)); + const rowTemplateRef = Δreference(1); + ΔelementProperty(2, 'tpl', Δbind(rowTemplateRef)); + ΔelementProperty(2, 'rows', Δbind(parent.rows)); } }, 3, 2, [LoopComp]); function rowTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, cellTemplate, 2, 3, 'ng-template', null, ['cellTemplate', ''], - templateRefExtractor); - element(2, 'loop-comp'); + ΔtemplateRefExtractor); + Δelement(2, 'loop-comp'); } if (rf & RenderFlags.Update) { const row = ctx.$implicit as any; - const cellTemplateRef = reference(1); - elementProperty(2, 'tpl', bind(cellTemplateRef)); - elementProperty(2, 'rows', bind(row.data)); + const cellTemplateRef = Δreference(1); + ΔelementProperty(2, 'tpl', Δbind(cellTemplateRef)); + ΔelementProperty(2, 'rows', Δbind(row.data)); } } function cellTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - { text(1); } - elementEnd(); + ΔelementStart(0, 'div'); + { Δtext(1); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { const cell = ctx.$implicit as any; - const row = nextContext().$implicit as any; - const parent = nextContext(); - textBinding(1, interpolation3('', cell, ' - ', row.value, ' - ', parent.name, '')); + const row = ΔnextContext().$implicit as any; + const parent = ΔnextContext(); + ΔtextBinding(1, Δinterpolation3('', cell, ' - ', row.value, ' - ', parent.name, '')); } } @@ -940,7 +943,7 @@ describe('ViewContainerRef', () => { class EmbeddedComponent { constructor() {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: EmbeddedComponent, encapsulation: ViewEncapsulation.None, selectors: [['embedded-cmp']], @@ -950,7 +953,7 @@ describe('ViewContainerRef', () => { template: (rf: RenderFlags, cmp: EmbeddedComponent) => { templateExecutionCounter++; if (rf & RenderFlags.Create) { - text(0, 'foo'); + Δtext(0, 'foo'); } } }); @@ -983,24 +986,24 @@ describe('ViewContainerRef', () => { class EmbeddedComponent { constructor(public s: String) {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: EmbeddedComponent, encapsulation: ViewEncapsulation.None, selectors: [['embedded-cmp']], - factory: () => new EmbeddedComponent(directiveInject(String)), + factory: () => new EmbeddedComponent(ΔdirectiveInject(String)), consts: 1, vars: 0, template: (rf: RenderFlags, cmp: EmbeddedComponent) => { templateExecutionCounter++; if (rf & RenderFlags.Create) { - text(0, 'foo'); + Δtext(0, 'foo'); } } }); } class MyAppModule { - static ngInjectorDef = defineInjector({ + static ngInjectorDef = ΔdefineInjector({ factory: () => new MyAppModule(), imports: [], providers: [ @@ -1015,7 +1018,7 @@ describe('ViewContainerRef', () => { const ngModuleRef = myAppModuleFactory.create(null); class SomeModule { - static ngInjectorDef = defineInjector({ + static ngInjectorDef = ΔdefineInjector({ factory: () => new SomeModule(), providers: [ {provide: NgModuleRef, useValue: ngModuleRef}, @@ -1054,12 +1057,12 @@ describe('ViewContainerRef', () => { class AppComp { constructor(public vcr: ViewContainerRef, public cfr: ComponentFactoryResolver) {} - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AppComp, selectors: [['app-comp']], factory: () => new AppComp( - directiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), + ΔdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), consts: 0, vars: 0, template: (rf: RenderFlags, cmp: AppComp) => {} @@ -1071,7 +1074,7 @@ describe('ViewContainerRef', () => { ngDoCheck() { this.doCheckCount++; } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: DynamicComp, selectors: [['dynamic-comp']], factory: () => dynamicComp = new DynamicComp(), @@ -1128,7 +1131,7 @@ describe('ViewContainerRef', () => { }); class EmbeddedComponentWithNgContent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: EmbeddedComponentWithNgContent, encapsulation: ViewEncapsulation.None, selectors: [['embedded-cmp-with-ngcontent']], @@ -1137,10 +1140,10 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: EmbeddedComponentWithNgContent) => { if (rf & RenderFlags.Create) { - projectionDef(); - projection(0, 0); - element(1, 'hr'); - projection(2, 1); + ΔprojectionDef(); + Δprojection(0, 0); + Δelement(1, 'hr'); + Δprojection(2, 1); } } }); @@ -1168,7 +1171,7 @@ describe('ViewContainerRef', () => { it('should support reprojection of projectable nodes', () => { class Reprojector { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Reprojector, encapsulation: ViewEncapsulation.None, selectors: [['reprojector']], @@ -1177,10 +1180,10 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: Reprojector) => { if (rf & RenderFlags.Create) { - projectionDef(); - elementStart(0, 'embedded-cmp-with-ngcontent'); - { projection(1, 0); } - elementEnd(); + ΔprojectionDef(); + ΔelementStart(0, 'embedded-cmp-with-ngcontent'); + { Δprojection(1, 0); } + ΔelementEnd(); } }, directives: [EmbeddedComponentWithNgContent] @@ -1226,8 +1229,8 @@ describe('ViewContainerRef', () => { describe('getters', () => { it('should work on elements', () => { function createTemplate() { - element(0, 'header', ['vcref', '']); - element(1, 'footer'); + Δelement(0, 'header', ['vcref', '']); + Δelement(1, 'footer'); } new TemplateFixture(createTemplate, undefined, 2, 0, [DirectiveWithVCRef]); @@ -1245,8 +1248,8 @@ describe('ViewContainerRef', () => { createComponent('header-cmp', function(rf: RenderFlags, ctx: any) {}); function createTemplate() { - element(0, 'header-cmp', ['vcref', '']); - element(1, 'footer'); + Δelement(0, 'header-cmp', ['vcref', '']); + Δelement(1, 'footer'); } new TemplateFixture(createTemplate, undefined, 2, 0, [HeaderComponent, DirectiveWithVCRef]); @@ -1261,8 +1264,8 @@ describe('ViewContainerRef', () => { it('should work on templates', () => { function createTemplate() { - template(0, embeddedTemplate, 1, 1, 'ng-template', ['vcref', '']); - element(1, 'footer'); + Δtemplate(0, embeddedTemplate, 1, 1, 'ng-template', ['vcref', '']); + Δelement(1, 'footer'); } new TemplateFixture(createTemplate, () => {}, 2, 0, [DirectiveWithVCRef]); @@ -1277,19 +1280,19 @@ describe('ViewContainerRef', () => { describe('projection', () => { function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'span'); - text(1); - elementEnd(); + ΔelementStart(0, 'span'); + Δtext(1); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - textBinding(1, ctx.name); + ΔtextBinding(1, ctx.name); } } it('should project the ViewContainerRef content along its host, in an element', () => { @Component({selector: 'child', template: '
'}) class Child { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Child, encapsulation: ViewEncapsulation.None, selectors: [['child']], @@ -1298,10 +1301,10 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: Child) => { if (rf & RenderFlags.Create) { - projectionDef(); - elementStart(0, 'div'); - { projection(1); } - elementEnd(); + ΔprojectionDef(); + ΔelementStart(0, 'div'); + { Δprojection(1); } + ΔelementEnd(); } } }); @@ -1317,7 +1320,7 @@ describe('ViewContainerRef', () => { }) class Parent { name: string = 'bar'; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Parent, encapsulation: ViewEncapsulation.None, selectors: [['parent']], @@ -1326,22 +1329,22 @@ describe('ViewContainerRef', () => { vars: 2, template: (rf: RenderFlags, cmp: Parent) => { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, embeddedTemplate, 2, 1, 'ng-template', null, ['foo', ''], - templateRefExtractor); - elementStart(2, 'child'); + ΔtemplateRefExtractor); + ΔelementStart(2, 'child'); { - elementStart(3, 'header', ['vcref', '']); - { text(4, 'blah'); } - elementEnd(); + ΔelementStart(3, 'header', ['vcref', '']); + { Δtext(4, 'blah'); } + ΔelementEnd(); } - elementEnd(); + ΔelementEnd(); } let tplRef: any; if (rf & RenderFlags.Update) { - tplRef = reference(1); - elementProperty(3, 'tplRef', bind(tplRef)); - elementProperty(3, 'name', bind(cmp.name)); + tplRef = Δreference(1); + ΔelementProperty(3, 'tplRef', Δbind(tplRef)); + ΔelementProperty(3, 'name', Δbind(cmp.name)); } }, directives: [Child, DirectiveWithVCRef] @@ -1370,7 +1373,7 @@ describe('ViewContainerRef', () => { }) class ChildWithView { show: boolean = true; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ChildWithView, encapsulation: ViewEncapsulation.None, selectors: [['child-with-view']], @@ -1379,21 +1382,21 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: ChildWithView) => { if (rf & RenderFlags.Create) { - projectionDef(); - text(0, 'Before (inside)-'); - container(1); - text(2, 'After (inside)'); + ΔprojectionDef(); + Δtext(0, 'Before (inside)-'); + Δcontainer(1); + Δtext(2, 'After (inside)'); } if (rf & RenderFlags.Update) { - containerRefreshStart(1); + ΔcontainerRefreshStart(1); if (cmp.show) { - let rf0 = embeddedViewStart(0, 1, 0); + let rf0 = ΔembeddedViewStart(0, 1, 0); if (rf0 & RenderFlags.Create) { - projection(0); + Δprojection(0); } - embeddedViewEnd(); + ΔembeddedViewEnd(); } - containerRefreshEnd(); + ΔcontainerRefreshEnd(); } } }); @@ -1413,7 +1416,7 @@ describe('ViewContainerRef', () => { }) class Parent { name: string = 'bar'; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Parent, encapsulation: ViewEncapsulation.None, selectors: [['parent']], @@ -1422,21 +1425,21 @@ describe('ViewContainerRef', () => { vars: 2, template: (rf: RenderFlags, cmp: Parent) => { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, embeddedTemplate, 2, 1, 'ng-template', undefined, ['foo', ''], - templateRefExtractor); - elementStart(2, 'child-with-view'); - text(3, 'Before projected'); - elementStart(4, 'header', ['vcref', '']); - text(5, 'blah'); - elementEnd(); - text(6, 'After projected-'); - elementEnd(); + ΔtemplateRefExtractor); + ΔelementStart(2, 'child-with-view'); + Δtext(3, 'Before projected'); + ΔelementStart(4, 'header', ['vcref', '']); + Δtext(5, 'blah'); + ΔelementEnd(); + Δtext(6, 'After projected-'); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - const tplRef = reference(1); - elementProperty(4, 'tplRef', bind(tplRef)); - elementProperty(4, 'name', bind(cmp.name)); + const tplRef = Δreference(1); + ΔelementProperty(4, 'tplRef', Δbind(tplRef)); + ΔelementProperty(4, 'name', Δbind(cmp.name)); } }, directives: [ChildWithView, DirectiveWithVCRef] @@ -1463,7 +1466,7 @@ describe('ViewContainerRef', () => { ` }) class ChildWithSelector { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ChildWithSelector, encapsulation: ViewEncapsulation.None, selectors: [['child-with-selector']], @@ -1472,13 +1475,13 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: ChildWithSelector) => { if (rf & RenderFlags.Create) { - projectionDef([[['header']]], ['header']); - elementStart(0, 'first'); - { projection(1, 1); } - elementEnd(); - elementStart(2, 'second'); - { projection(3); } - elementEnd(); + ΔprojectionDef([[['header']]], ['header']); + ΔelementStart(0, 'first'); + { Δprojection(1, 1); } + ΔelementEnd(); + ΔelementStart(2, 'second'); + { Δprojection(3); } + ΔelementEnd(); } }, directives: [ChildWithSelector, DirectiveWithVCRef] @@ -1497,7 +1500,7 @@ describe('ViewContainerRef', () => { }) class Parent { name: string = 'bar'; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Parent, encapsulation: ViewEncapsulation.None, selectors: [['parent']], @@ -1507,19 +1510,19 @@ describe('ViewContainerRef', () => { template: (rf: RenderFlags, cmp: Parent) => { let tplRef: any; if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, embeddedTemplate, 2, 1, 'ng-template', null, ['foo', ''], - templateRefExtractor); - elementStart(2, 'child-with-selector'); - elementStart(3, 'header', ['vcref', '']); - text(4, 'blah'); - elementEnd(); - elementEnd(); + ΔtemplateRefExtractor); + ΔelementStart(2, 'child-with-selector'); + ΔelementStart(3, 'header', ['vcref', '']); + Δtext(4, 'blah'); + ΔelementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - tplRef = reference(1); - elementProperty(3, 'tplRef', bind(tplRef)); - elementProperty(3, 'name', bind(cmp.name)); + tplRef = Δreference(1); + ΔelementProperty(3, 'tplRef', Δbind(tplRef)); + ΔelementProperty(3, 'name', Δbind(cmp.name)); } }, directives: [ChildWithSelector, DirectiveWithVCRef] @@ -1551,7 +1554,7 @@ describe('ViewContainerRef', () => { }) class Parent { name: string = 'bar'; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: Parent, encapsulation: ViewEncapsulation.None, selectors: [['parent']], @@ -1561,19 +1564,19 @@ describe('ViewContainerRef', () => { template: (rf: RenderFlags, cmp: Parent) => { let tplRef: any; if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, embeddedTemplate, 2, 1, 'ng-template', null, ['foo', ''], - templateRefExtractor); - elementStart(2, 'child-with-selector'); - elementStart(3, 'footer', ['vcref', '']); - text(4, 'blah'); - elementEnd(); - elementEnd(); + ΔtemplateRefExtractor); + ΔelementStart(2, 'child-with-selector'); + ΔelementStart(3, 'footer', ['vcref', '']); + Δtext(4, 'blah'); + ΔelementEnd(); + ΔelementEnd(); } if (rf & RenderFlags.Update) { - tplRef = reference(1); - elementProperty(3, 'tplRef', bind(tplRef)); - elementProperty(3, 'name', bind(cmp.name)); + tplRef = Δreference(1); + ΔelementProperty(3, 'tplRef', Δbind(tplRef)); + ΔelementProperty(3, 'name', Δbind(cmp.name)); } }, directives: [ChildWithSelector, DirectiveWithVCRef] @@ -1619,7 +1622,7 @@ describe('ViewContainerRef', () => { ngOnDestroy() { this.log('onDestroy-' + this.name); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: ComponentWithHooks, encapsulation: ViewEncapsulation.None, selectors: [['hooks']], @@ -1628,13 +1631,13 @@ describe('ViewContainerRef', () => { vars: 1, template: (rf: RenderFlags, cmp: ComponentWithHooks) => { if (rf & RenderFlags.Create) { - text(0); + Δtext(0); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('', cmp.name, '')); + ΔtextBinding(0, Δinterpolation1('', cmp.name, '')); } }, - features: [NgOnChangesFeature()], + features: [ΔNgOnChangesFeature()], inputs: {name: 'name'} }); } @@ -1642,10 +1645,10 @@ describe('ViewContainerRef', () => { it('should call all hooks in correct order when creating with createEmbeddedView', () => { function SomeComponent_Template_0(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - element(0, 'hooks'); + Δelement(0, 'hooks'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'name', bind('C')); + ΔelementProperty(0, 'name', Δbind('C')); } } @@ -1659,7 +1662,7 @@ describe('ViewContainerRef', () => { ` }) class SomeComponent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SomeComponent, selectors: [['some-comp']], factory: () => new SomeComponent(), @@ -1667,21 +1670,21 @@ describe('ViewContainerRef', () => { vars: 3, template: (rf: RenderFlags, cmp: SomeComponent) => { if (rf & RenderFlags.Create) { - template( + Δtemplate( 0, SomeComponent_Template_0, 1, 1, 'ng-template', [], ['foo', ''], - templateRefExtractor); - element(2, 'hooks', ['vcref', '']); - element(3, 'hooks'); + ΔtemplateRefExtractor); + Δelement(2, 'hooks', ['vcref', '']); + Δelement(3, 'hooks'); } if (rf & RenderFlags.Update) { - const tplRef = reference(1); - elementProperty(2, 'tplRef', bind(tplRef)); - elementProperty(2, 'name', bind('A')); - elementProperty(3, 'name', bind('B')); + const tplRef = Δreference(1); + ΔelementProperty(2, 'tplRef', Δbind(tplRef)); + ΔelementProperty(2, 'name', Δbind('A')); + ΔelementProperty(3, 'name', Δbind('B')); } }, directives: [ComponentWithHooks, DirectiveWithVCRef], - features: [NgOnChangesFeature()], + features: [ΔNgOnChangesFeature()], }); } @@ -1756,7 +1759,7 @@ describe('ViewContainerRef', () => { ` }) class SomeComponent { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: SomeComponent, encapsulation: ViewEncapsulation.None, selectors: [['some-comp']], @@ -1765,16 +1768,16 @@ describe('ViewContainerRef', () => { vars: 2, template: (rf: RenderFlags, cmp: SomeComponent) => { if (rf & RenderFlags.Create) { - element(0, 'hooks', ['vcref', '']); - element(1, 'hooks'); + Δelement(0, 'hooks', ['vcref', '']); + Δelement(1, 'hooks'); } if (rf & RenderFlags.Update) { - elementProperty(0, 'name', bind('A')); - elementProperty(1, 'name', bind('B')); + ΔelementProperty(0, 'name', Δbind('A')); + ΔelementProperty(1, 'name', Δbind('B')); } }, directives: [ComponentWithHooks, DirectiveWithVCRef], - features: [NgOnChangesFeature()], + features: [ΔNgOnChangesFeature()], }); } @@ -1853,7 +1856,7 @@ describe('ViewContainerRef', () => { class HostBindingCmpt { title = 'initial'; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: HostBindingCmpt, selectors: [['host-bindings']], factory: () => new HostBindingCmpt(), @@ -1862,11 +1865,11 @@ describe('ViewContainerRef', () => { template: (rf: RenderFlags, cmp: HostBindingCmpt) => {}, hostBindings: function(rf: RenderFlags, ctx: HostBindingCmpt, elIndex: number) { if (rf & RenderFlags.Create) { - elementHostAttrs(['id', 'attribute']); - allocHostVars(1); + ΔelementHostAttrs(['id', 'attribute']); + ΔallocHostVars(1); } if (rf & RenderFlags.Update) { - elementProperty(elIndex, 'title', bind(ctx.title)); + ΔelementProperty(elIndex, 'title', Δbind(ctx.title)); } }, }); @@ -1878,7 +1881,7 @@ describe('ViewContainerRef', () => { ` }) class AppCmpt { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AppCmpt, selectors: [['app']], factory: () => new AppCmpt(), @@ -1886,7 +1889,7 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: AppCmpt) => { if (rf & RenderFlags.Create) { - template(0, null, 0, 0, 'ng-template', ['vcref', '']); + Δtemplate(0, null, 0, 0, 'ng-template', ['vcref', '']); } }, directives: [HostBindingCmpt, DirectiveWithVCRef] @@ -1913,11 +1916,11 @@ describe('ViewContainerRef', () => { @Component({selector: 'app', template: ''}) class AppCmpt { - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: AppCmpt, selectors: [['app']], factory: () => new AppCmpt( - directiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), + ΔdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), consts: 0, vars: 0, template: (rf: RenderFlags, cmp: AppCmpt) => {} @@ -1941,7 +1944,7 @@ describe('ViewContainerRef', () => { const DynamicComponent = createComponent('dynamic-cmpt', function(rf: RenderFlags, parent: any) { if (rf & RenderFlags.Create) { - text(0, 'inserted dynamically'); + Δtext(0, 'inserted dynamically'); } }, 1, 0); @@ -1981,7 +1984,7 @@ describe('ViewContainerRef', () => { ngDoCheck() { this.checkCount++; } /** check count: {{ checkCount }} */ - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: DynamicCompWithBindings, selectors: [['dynamic-cmpt-with-bindings']], factory: () => new DynamicCompWithBindings(), @@ -1989,10 +1992,10 @@ describe('ViewContainerRef', () => { vars: 1, template: (rf: RenderFlags, ctx: DynamicCompWithBindings) => { if (rf & RenderFlags.Create) { - text(0); + Δtext(0); } if (rf & RenderFlags.Update) { - textBinding(0, interpolation1('check count: ', ctx.checkCount, '')); + ΔtextBinding(0, Δinterpolation1('check count: ', ctx.checkCount, '')); } } }); @@ -2017,19 +2020,19 @@ describe('ViewContainerRef', () => { let name = 'text'; const Child = createComponent('child', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - elementStart(0, 'div'); - { text(1); } - elementEnd(); + ΔelementStart(0, 'div'); + { Δtext(1); } + ΔelementEnd(); } if (rf & RenderFlags.Update) { - textBinding(1, bind(name)); + ΔtextBinding(1, Δbind(name)); } }, 2, 1); const DynamicCompWithChildren = createComponent('dynamic-cmpt-with-children', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - element(0, 'child'); + Δelement(0, 'child'); } }, 1, 0, [Child]); @@ -2055,7 +2058,7 @@ describe('ViewContainerRef', () => { // @ViewChildren('foo') foo !: QueryList; - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: DynamicCompWithViewQueries, selectors: [['dynamic-cmpt-with-view-queries']], factory: () => dynamicComp = new DynamicCompWithViewQueries(), @@ -2063,18 +2066,18 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, ctx: DynamicCompWithViewQueries) => { if (rf & RenderFlags.Create) { - element(0, 'div', ['bar', ''], ['foo', '']); + Δelement(0, 'div', ['bar', ''], ['foo', '']); } // testing only fooEl = getNativeByIndex(0, getLView()) as RElement; }, viewQuery: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - viewQuery(['foo'], true, null); + ΔviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - queryRefresh(tmp = loadViewQuery>()) && + ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.foo = tmp as QueryList); } } @@ -2099,7 +2102,7 @@ describe('ViewContainerRef', () => { ngOnDestroy() { this.viewRef.destroy(); } - static ngComponentDef = defineComponent({ + static ngComponentDef = ΔdefineComponent({ type: CompWithListenerThatDestroysItself, selectors: [['comp-with-listener-and-on-destroy']], consts: 2, @@ -2107,18 +2110,18 @@ describe('ViewContainerRef', () => { /** */ template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - elementStart(0, 'button'); + ΔelementStart(0, 'button'); { - listener('click', function() { return ctx.onClick(); }); - text(1, 'Click me'); + Δlistener('click', function() { return ctx.onClick(); }); + Δtext(1, 'Click me'); } - elementEnd(); + ΔelementEnd(); } }, // We want the ViewRef, so we rely on the knowledge that `ViewRef` is actually given // when injecting `ChangeDetectorRef`. - factory: - () => new CompWithListenerThatDestroysItself(directiveInject(ChangeDetectorRef as any)), + factory: () => new CompWithListenerThatDestroysItself( + ΔdirectiveInject(ChangeDetectorRef as any)), }); } @@ -2126,7 +2129,7 @@ describe('ViewContainerRef', () => { it('should not error when destroying a view with listeners twice', () => { const CompWithChildListener = createComponent('test-app', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - element(0, 'comp-with-listener-and-on-destroy'); + Δelement(0, 'comp-with-listener-and-on-destroy'); } }, 1, 0, [CompWithListenerThatDestroysItself]); diff --git a/packages/core/test/sanitization/sanatization_spec.ts b/packages/core/test/sanitization/sanatization_spec.ts index e774521033..2b5b2eee51 100644 --- a/packages/core/test/sanitization/sanatization_spec.ts +++ b/packages/core/test/sanitization/sanatization_spec.ts @@ -12,7 +12,7 @@ import {HEADER_OFFSET, LView} from '@angular/core/src/render3/interfaces/view'; import {setTNodeAndViewData} from '@angular/core/src/render3/state'; import {bypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript, bypassSanitizationTrustStyle, bypassSanitizationTrustUrl} from '../../src/sanitization/bypass'; -import {getUrlSanitizer, sanitizeHtml, sanitizeResourceUrl, sanitizeScript, sanitizeStyle, sanitizeUrl, sanitizeUrlOrResourceUrl} from '../../src/sanitization/sanitization'; +import {getUrlSanitizer, ΔsanitizeHtml, ΔsanitizeResourceUrl, ΔsanitizeScript, ΔsanitizeStyle, ΔsanitizeUrl, ΔsanitizeUrlOrResourceUrl} from '../../src/sanitization/sanitization'; import {SecurityContext} from '../../src/sanitization/security'; function fakeLView(): LView { @@ -27,54 +27,54 @@ describe('sanitization', () => { toString() { return this.value; } } it('should sanitize html', () => { - expect(sanitizeHtml('
')).toEqual('
'); - expect(sanitizeHtml(new Wrap('
'))).toEqual('
'); - expect(sanitizeHtml('')) + expect(ΔsanitizeHtml('
')).toEqual('
'); + expect(ΔsanitizeHtml(new Wrap('
'))).toEqual('
'); + expect(ΔsanitizeHtml('')) .toEqual(''); - expect(sanitizeHtml(new Wrap(''))) + expect(ΔsanitizeHtml(new Wrap(''))) .toEqual(''); - expect(sanitizeHtml(bypassSanitizationTrustUrl(''))) + expect(ΔsanitizeHtml(bypassSanitizationTrustUrl(''))) .toEqual(''); - expect(sanitizeHtml(bypassSanitizationTrustHtml(''))) + expect(ΔsanitizeHtml(bypassSanitizationTrustHtml(''))) .toEqual(''); }); it('should sanitize url', () => { - expect(sanitizeUrl('http://server')).toEqual('http://server'); - expect(sanitizeUrl(new Wrap('http://server'))).toEqual('http://server'); - expect(sanitizeUrl('javascript:true')).toEqual('unsafe:javascript:true'); - expect(sanitizeUrl(new Wrap('javascript:true'))).toEqual('unsafe:javascript:true'); - expect(sanitizeUrl(bypassSanitizationTrustHtml('javascript:true'))) + expect(ΔsanitizeUrl('http://server')).toEqual('http://server'); + expect(ΔsanitizeUrl(new Wrap('http://server'))).toEqual('http://server'); + expect(ΔsanitizeUrl('javascript:true')).toEqual('unsafe:javascript:true'); + expect(ΔsanitizeUrl(new Wrap('javascript:true'))).toEqual('unsafe:javascript:true'); + expect(ΔsanitizeUrl(bypassSanitizationTrustHtml('javascript:true'))) .toEqual('unsafe:javascript:true'); - expect(sanitizeUrl(bypassSanitizationTrustUrl('javascript:true'))).toEqual('javascript:true'); + expect(ΔsanitizeUrl(bypassSanitizationTrustUrl('javascript:true'))).toEqual('javascript:true'); }); it('should sanitize resourceUrl', () => { const ERROR = 'unsafe value used in a resource URL context (see http://g.co/ng/security#xss)'; - expect(() => sanitizeResourceUrl('http://server')).toThrowError(ERROR); - expect(() => sanitizeResourceUrl('javascript:true')).toThrowError(ERROR); - expect(() => sanitizeResourceUrl(bypassSanitizationTrustHtml('javascript:true'))) + expect(() => ΔsanitizeResourceUrl('http://server')).toThrowError(ERROR); + expect(() => ΔsanitizeResourceUrl('javascript:true')).toThrowError(ERROR); + expect(() => ΔsanitizeResourceUrl(bypassSanitizationTrustHtml('javascript:true'))) .toThrowError(ERROR); - expect(sanitizeResourceUrl(bypassSanitizationTrustResourceUrl('javascript:true'))) + expect(ΔsanitizeResourceUrl(bypassSanitizationTrustResourceUrl('javascript:true'))) .toEqual('javascript:true'); }); it('should sanitize style', () => { - expect(sanitizeStyle('red')).toEqual('red'); - expect(sanitizeStyle(new Wrap('red'))).toEqual('red'); - expect(sanitizeStyle('url("http://server")')).toEqual('unsafe'); - expect(sanitizeStyle(new Wrap('url("http://server")'))).toEqual('unsafe'); - expect(sanitizeStyle(bypassSanitizationTrustHtml('url("http://server")'))).toEqual('unsafe'); - expect(sanitizeStyle(bypassSanitizationTrustStyle('url("http://server")'))) + expect(ΔsanitizeStyle('red')).toEqual('red'); + expect(ΔsanitizeStyle(new Wrap('red'))).toEqual('red'); + expect(ΔsanitizeStyle('url("http://server")')).toEqual('unsafe'); + expect(ΔsanitizeStyle(new Wrap('url("http://server")'))).toEqual('unsafe'); + expect(ΔsanitizeStyle(bypassSanitizationTrustHtml('url("http://server")'))).toEqual('unsafe'); + expect(ΔsanitizeStyle(bypassSanitizationTrustStyle('url("http://server")'))) .toEqual('url("http://server")'); }); it('should sanitize script', () => { const ERROR = 'unsafe value used in a script context'; - expect(() => sanitizeScript('true')).toThrowError(ERROR); - expect(() => sanitizeScript('true')).toThrowError(ERROR); - expect(() => sanitizeScript(bypassSanitizationTrustHtml('true'))).toThrowError(ERROR); - expect(sanitizeScript(bypassSanitizationTrustScript('true'))).toEqual('true'); + expect(() => ΔsanitizeScript('true')).toThrowError(ERROR); + expect(() => ΔsanitizeScript('true')).toThrowError(ERROR); + expect(() => ΔsanitizeScript(bypassSanitizationTrustHtml('true'))).toThrowError(ERROR); + expect(ΔsanitizeScript(bypassSanitizationTrustScript('true'))).toEqual('true'); }); it('should select correct sanitizer for URL props', () => { @@ -82,8 +82,8 @@ describe('sanitization', () => { // runtime function definition const schema = SECURITY_SCHEMA(); const contextsByProp: Map> = new Map(); - const sanitizerNameByContext: Map = new Map([ - [SecurityContext.URL, 'sanitizeUrl'], [SecurityContext.RESOURCE_URL, 'sanitizeResourceUrl'] + const sanitizerNameByContext: Map = new Map([ + [SecurityContext.URL, ΔsanitizeUrl], [SecurityContext.RESOURCE_URL, ΔsanitizeResourceUrl] ]); Object.keys(schema).forEach(key => { const context = schema[key]; @@ -94,7 +94,7 @@ describe('sanitization', () => { contextsByProp.set(prop, contexts); // check only in case a prop can be a part of both URL contexts if (contexts.size === 2) { - expect(getUrlSanitizer(tag, prop).name).toEqual(sanitizerNameByContext.get(context) !); + expect(getUrlSanitizer(tag, prop)).toEqual(sanitizerNameByContext.get(context) !); } } }); @@ -102,28 +102,28 @@ describe('sanitization', () => { it('should sanitize resourceUrls via sanitizeUrlOrResourceUrl', () => { const ERROR = 'unsafe value used in a resource URL context (see http://g.co/ng/security#xss)'; - expect(() => sanitizeUrlOrResourceUrl('http://server', 'iframe', 'src')).toThrowError(ERROR); - expect(() => sanitizeUrlOrResourceUrl('javascript:true', 'iframe', 'src')).toThrowError(ERROR); + expect(() => ΔsanitizeUrlOrResourceUrl('http://server', 'iframe', 'src')).toThrowError(ERROR); + expect(() => ΔsanitizeUrlOrResourceUrl('javascript:true', 'iframe', 'src')).toThrowError(ERROR); expect( - () => sanitizeUrlOrResourceUrl( + () => ΔsanitizeUrlOrResourceUrl( bypassSanitizationTrustHtml('javascript:true'), 'iframe', 'src')) .toThrowError(ERROR); - expect(sanitizeUrlOrResourceUrl( + expect(ΔsanitizeUrlOrResourceUrl( bypassSanitizationTrustResourceUrl('javascript:true'), 'iframe', 'src')) .toEqual('javascript:true'); }); it('should sanitize urls via sanitizeUrlOrResourceUrl', () => { - expect(sanitizeUrlOrResourceUrl('http://server', 'a', 'href')).toEqual('http://server'); - expect(sanitizeUrlOrResourceUrl(new Wrap('http://server'), 'a', 'href')) + expect(ΔsanitizeUrlOrResourceUrl('http://server', 'a', 'href')).toEqual('http://server'); + expect(ΔsanitizeUrlOrResourceUrl(new Wrap('http://server'), 'a', 'href')) .toEqual('http://server'); - expect(sanitizeUrlOrResourceUrl('javascript:true', 'a', 'href')) + expect(ΔsanitizeUrlOrResourceUrl('javascript:true', 'a', 'href')) .toEqual('unsafe:javascript:true'); - expect(sanitizeUrlOrResourceUrl(new Wrap('javascript:true'), 'a', 'href')) + expect(ΔsanitizeUrlOrResourceUrl(new Wrap('javascript:true'), 'a', 'href')) .toEqual('unsafe:javascript:true'); - expect(sanitizeUrlOrResourceUrl(bypassSanitizationTrustHtml('javascript:true'), 'a', 'href')) + expect(ΔsanitizeUrlOrResourceUrl(bypassSanitizationTrustHtml('javascript:true'), 'a', 'href')) .toEqual('unsafe:javascript:true'); - expect(sanitizeUrlOrResourceUrl(bypassSanitizationTrustUrl('javascript:true'), 'a', 'href')) + expect(ΔsanitizeUrlOrResourceUrl(bypassSanitizationTrustUrl('javascript:true'), 'a', 'href')) .toEqual('javascript:true'); }); }); diff --git a/packages/core/test/strict_types/inheritance_spec.ts b/packages/core/test/strict_types/inheritance_spec.ts index 4600737d38..39693adc84 100644 --- a/packages/core/test/strict_types/inheritance_spec.ts +++ b/packages/core/test/strict_types/inheritance_spec.ts @@ -6,10 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {ɵComponentDefWithMeta as ComponentDefWithMeta, ɵPipeDefWithMeta as PipeDefWithMeta} from '@angular/core'; +import {ΔComponentDefWithMeta, ΔPipeDefWithMeta as PipeDefWithMeta} from '@angular/core'; declare class SuperComponent { - static ngComponentDef: ComponentDefWithMeta; + static ngComponentDef: ΔComponentDefWithMeta; } declare class SubComponent extends SuperComponent { @@ -18,7 +18,7 @@ declare class SubComponent extends SuperComponent { // would produce type errors when the "strictFunctionTypes" option is enabled. onlyInSubtype: string; - static ngComponentDef: ComponentDefWithMeta; + static ngComponentDef: ΔComponentDefWithMeta; } declare class SuperPipe { static ngPipeDef: PipeDefWithMeta; } diff --git a/packages/core/test/test_bed_spec.ts b/packages/core/test/test_bed_spec.ts index ac989deb5b..ecae7a035d 100644 --- a/packages/core/test/test_bed_spec.ts +++ b/packages/core/test/test_bed_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, Directive, ErrorHandler, Inject, Injectable, InjectionToken, NgModule, Optional, Pipe, ɵdefineComponent as defineComponent, ɵsetClassMetadata as setClassMetadata, ɵtext as text} from '@angular/core'; +import {Component, Directive, ErrorHandler, Inject, Injectable, InjectionToken, NgModule, Optional, Pipe, ɵsetClassMetadata as setClassMetadata, ΔdefineComponent as defineComponent, Δtext as text} from '@angular/core'; import {TestBed, getTestBed} from '@angular/core/testing/src/test_bed'; import {By} from '@angular/platform-browser'; import {expect} from '@angular/platform-browser/testing/src/matchers'; diff --git a/packages/core/test/view/ng_module_spec.ts b/packages/core/test/view/ng_module_spec.ts index ce8d13ce9e..fe8e7bae96 100644 --- a/packages/core/test/view/ng_module_spec.ts +++ b/packages/core/test/view/ng_module_spec.ts @@ -9,7 +9,7 @@ import {NgModuleRef} from '@angular/core'; import {InjectFlags, inject} from '@angular/core/src/di'; import {INJECTOR, Injector} from '@angular/core/src/di/injector'; -import {InjectableDef, defineInjectable} from '@angular/core/src/di/interface/defs'; +import {ΔInjectableDef, ΔdefineInjectable} from '@angular/core/src/di/interface/defs'; import {NgModuleDefinition, NgModuleProviderDef, NodeFlags} from '@angular/core/src/view'; import {moduleDef} from '@angular/core/src/view/ng_module'; import {createNgModuleRef} from '@angular/core/src/view/refs'; @@ -26,14 +26,14 @@ class MyChildModule {} class NotMyModule {} class Bar { - static ngInjectableDef: InjectableDef = defineInjectable({ + static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ factory: () => new Bar(), providedIn: MyModule, }); } class Baz { - static ngInjectableDef: InjectableDef = defineInjectable({ + static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ factory: () => new Baz(), providedIn: NotMyModule, }); @@ -42,7 +42,7 @@ class Baz { class HasNormalDep { constructor(public foo: Foo) {} - static ngInjectableDef: InjectableDef = defineInjectable({ + static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ factory: () => new HasNormalDep(inject(Foo)), providedIn: MyModule, }); @@ -51,7 +51,7 @@ class HasNormalDep { class HasDefinedDep { constructor(public bar: Bar) {} - static ngInjectableDef: InjectableDef = defineInjectable({ + static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ factory: () => new HasDefinedDep(inject(Bar)), providedIn: MyModule, }); @@ -60,14 +60,14 @@ class HasDefinedDep { class HasOptionalDep { constructor(public baz: Baz|null) {} - static ngInjectableDef: InjectableDef = defineInjectable({ + static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ factory: () => new HasOptionalDep(inject(Baz, InjectFlags.Optional)), providedIn: MyModule, }); } class ChildDep { - static ngInjectableDef: InjectableDef = defineInjectable({ + static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ factory: () => new ChildDep(), providedIn: MyChildModule, }); @@ -75,7 +75,7 @@ class ChildDep { class FromChildWithOptionalDep { constructor(public baz: Baz|null) {} - static ngInjectableDef: InjectableDef = defineInjectable({ + static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ factory: () => new FromChildWithOptionalDep(inject(Baz, InjectFlags.Default)), providedIn: MyChildModule, }); @@ -85,7 +85,7 @@ class FromChildWithSkipSelfDep { constructor( public skipSelfChildDep: ChildDep|null, public selfChildDep: ChildDep|null, public optionalSelfBar: Bar|null) {} - static ngInjectableDef: InjectableDef = defineInjectable({ + static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ factory: () => new FromChildWithSkipSelfDep( inject(ChildDep, InjectFlags.SkipSelf|InjectFlags.Optional), inject(ChildDep, InjectFlags.Self), @@ -208,7 +208,7 @@ describe('NgModuleRef_ injector', () => { ngOnDestroy(): void { Service.destroyed++; } - static ngInjectableDef: InjectableDef = defineInjectable({ + static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ factory: () => new Service(), providedIn: 'root', }); diff --git a/packages/core/testing/src/r3_test_bed_compiler.ts b/packages/core/testing/src/r3_test_bed_compiler.ts index 3a607f5851..8fdb0b4873 100644 --- a/packages/core/testing/src/r3_test_bed_compiler.ts +++ b/packages/core/testing/src/r3_test_bed_compiler.ts @@ -6,44 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -// clang-format off -import { - ApplicationInitStatus, - COMPILER_OPTIONS, - Compiler, - Component, - Directive, - ErrorHandler, - ModuleWithComponentFactories, - NgModule, - NgModuleFactory, - NgZone, - Injector, - Pipe, - PlatformRef, - Provider, - Type, - ɵcompileComponent as compileComponent, - ɵcompileDirective as compileDirective, - ɵcompileNgModuleDefs as compileNgModuleDefs, - ɵcompilePipe as compilePipe, - ɵgetInjectableDef as getInjectableDef, - ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, - ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, - ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, - ɵNG_MODULE_DEF as NG_MODULE_DEF, - ɵNG_PIPE_DEF as NG_PIPE_DEF, - ɵRender3ComponentFactory as ComponentFactory, - ɵRender3NgModuleRef as NgModuleRef, - ɵInjectableDef as InjectableDef, - ɵNgModuleFactory as R3NgModuleFactory, - ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, - ɵNgModuleType as NgModuleType, - ɵDirectiveDef as DirectiveDef, - ɵpatchComponentDefWithScope as patchComponentDefWithScope, - ɵtransitiveScopesFor as transitiveScopesFor, -} from '@angular/core'; -// clang-format on +import {ApplicationInitStatus, COMPILER_OPTIONS, Compiler, Component, Directive, ErrorHandler, ModuleWithComponentFactories, NgModule, NgModuleFactory, NgZone, Injector, Pipe, PlatformRef, Provider, Type, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, ɵNG_MODULE_DEF as NG_MODULE_DEF, ɵNG_PIPE_DEF as NG_PIPE_DEF, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ΔInjectableDef as InjectableDef, ɵNgModuleFactory as R3NgModuleFactory, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵDirectiveDef as DirectiveDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵtransitiveScopesFor as transitiveScopesFor,} from '@angular/core'; import {ResourceLoader} from '@angular/compiler'; import {clearResolutionOfComponentResourcesQueue, restoreComponentResolutionQueue, resolveComponentResources, isComponentDefPendingResolution} from '../../src/metadata/resource_loading'; @@ -709,4 +672,4 @@ class R3TestCompiler implements Compiler { const meta = this.testBed._getModuleResolver().resolve(moduleType); return meta && meta.id || undefined; } -} \ No newline at end of file +} diff --git a/packages/core/testing/src/test_bed.ts b/packages/core/testing/src/test_bed.ts index 44e7c21355..880e1ae3da 100644 --- a/packages/core/testing/src/test_bed.ts +++ b/packages/core/testing/src/test_bed.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ApplicationInitStatus, CompilerOptions, Component, Directive, InjectFlags, InjectionToken, Injector, NgModule, NgModuleFactory, NgModuleRef, NgZone, Optional, Pipe, PlatformRef, Provider, SchemaMetadata, SkipSelf, StaticProvider, Type, ɵAPP_ROOT as APP_ROOT, ɵDepFlags as DepFlags, ɵInjectableDef as InjectableDef, ɵNodeFlags as NodeFlags, ɵclearOverrides as clearOverrides, ɵgetInjectableDef as getInjectableDef, ɵivyEnabled as ivyEnabled, ɵoverrideComponentView as overrideComponentView, ɵoverrideProvider as overrideProvider, ɵstringify as stringify} from '@angular/core'; +import {ApplicationInitStatus, CompilerOptions, Component, Directive, InjectFlags, InjectionToken, Injector, NgModule, NgModuleFactory, NgModuleRef, NgZone, Optional, Pipe, PlatformRef, Provider, SchemaMetadata, SkipSelf, StaticProvider, Type, ɵAPP_ROOT as APP_ROOT, ɵDepFlags as DepFlags, ɵNodeFlags as NodeFlags, ɵclearOverrides as clearOverrides, ɵgetInjectableDef as getInjectableDef, ɵivyEnabled as ivyEnabled, ɵoverrideComponentView as overrideComponentView, ɵoverrideProvider as overrideProvider, ɵstringify as stringify, ΔInjectableDef} from '@angular/core'; import {AsyncTestCompleter} from './async_test_completer'; import {ComponentFixture} from './component_fixture'; @@ -559,7 +559,7 @@ export class TestBedViewEngine implements Injector, TestBed { deps?: any[], }, deprecated = false): void { - let def: InjectableDef|null = null; + let def: ΔInjectableDef|null = null; if (typeof token !== 'string' && (def = getInjectableDef(token)) && def.providedIn === 'root') { if (provider.useFactory) { this._rootProviderOverrides.push( diff --git a/packages/language-service/test/definitions_spec.ts b/packages/language-service/test/definitions_spec.ts index 0d027618c6..03395b40b4 100644 --- a/packages/language-service/test/definitions_spec.ts +++ b/packages/language-service/test/definitions_spec.ts @@ -26,22 +26,22 @@ describe('definitions', () => { it('should be able to find field in an interpolation', () => { localReference( - ` @Component({template: '{{«name»}}'}) export class MyComponent { «∆name∆: string;» }`); + ` @Component({template: '{{«name»}}'}) export class MyComponent { «ΔnameΔ: string;» }`); }); it('should be able to find a field in a attribute reference', () => { localReference( - ` @Component({template: ''}) export class MyComponent { «∆name∆: string;» }`); + ` @Component({template: ''}) export class MyComponent { «ΔnameΔ: string;» }`); }); it('should be able to find a method from a call', () => { localReference( - ` @Component({template: '
'}) export class MyComponent { «∆myClick∆() { }»}`); + ` @Component({template: '
'}) export class MyComponent { «ΔmyClickΔ() { }»}`); }); it('should be able to find a field reference in an *ngIf', () => { localReference( - ` @Component({template: '
'}) export class MyComponent { «∆include∆ = true;»}`); + ` @Component({template: '
'}) export class MyComponent { «ΔincludeΔ = true;»}`); }); it('should be able to find a reference to a component', () => { diff --git a/packages/language-service/test/hover_spec.ts b/packages/language-service/test/hover_spec.ts index b07ecb79c5..41bf242dd1 100644 --- a/packages/language-service/test/hover_spec.ts +++ b/packages/language-service/test/hover_spec.ts @@ -40,7 +40,7 @@ describe('hover', () => { it('should be able to find a method from a call', () => { hover( - ` @Component({template: '
'}) export class MyComponent { myClick() { }}`, + ` @Component({template: '
'}) export class MyComponent { myClick() { }}`, 'method myClick of MyComponent'); }); @@ -52,19 +52,19 @@ describe('hover', () => { it('should be able to find a reference to a component', () => { hover( - ` @Component({template: '«<∆test∆-comp>»'}) export class MyComponent { }`, + ` @Component({template: '«<ΔtestΔ-comp>»'}) export class MyComponent { }`, 'component TestComponent'); }); it('should be able to find an event provider', () => { hover( - ` @Component({template: '
'}) export class MyComponent { myHandler() {} }`, + ` @Component({template: '
'}) export class MyComponent { myHandler() {} }`, 'event testEvent of TestComponent'); }); it('should be able to find an input provider', () => { hover( - ` @Component({template: '
'}) export class MyComponent { name = 'my name'; }`, + ` @Component({template: '
'}) export class MyComponent { name = 'my name'; }`, 'property name of TestComponent'); }); diff --git a/packages/language-service/test/test_data.ts b/packages/language-service/test/test_data.ts index 55c6255298..10b4c7843e 100644 --- a/packages/language-service/test/test_data.ts +++ b/packages/language-service/test/test_data.ts @@ -143,8 +143,8 @@ export class References {} @Component({selector: 'test-comp', template: '
Testing: {{name}}
'}) export class TestComponent { - «@Input('∆tcName∆') name = 'test';» - «@Output('∆test∆') testEvent = new EventEmitter();» + «@Input('ΔtcNameΔ') name = 'test';» + «@Output('ΔtestΔ') testEvent = new EventEmitter();» } @Component({templateUrl: 'test.ng'}) diff --git a/packages/language-service/test/test_utils.ts b/packages/language-service/test/test_utils.ts index 17ff5acbbf..38bf0c1754 100644 --- a/packages/language-service/test/test_utils.ts +++ b/packages/language-service/test/test_utils.ts @@ -278,7 +278,7 @@ function getLocationMarkers(value: string): {[name: string]: number} { return result; } -const referenceMarker = /«(((\w|\-)+)|([^∆]*∆(\w+)∆.[^»]*))»/g; +const referenceMarker = /«(((\w|\-)+)|([^Δ]*Δ(\w+)Δ.[^»]*))»/g; const definitionMarkerGroup = 1; const nameMarkerGroup = 2; @@ -300,7 +300,7 @@ function getReferenceMarkers(value: string): ReferenceResult { const text = value.replace( referenceMarker, (match: string, text: string, reference: string, _: string, definition: string, definitionName: string, index: number): string => { - const result = reference ? text : text.replace(/∆/g, ''); + const result = reference ? text : text.replace(/Δ/g, ''); const span: Span = {start: index - adjustment, end: index - adjustment + result.length}; const markers = reference ? references : definitions; const name = reference || definitionName; @@ -313,7 +313,7 @@ function getReferenceMarkers(value: string): ReferenceResult { } function removeReferenceMarkers(value: string): string { - return value.replace(referenceMarker, (match, text) => text.replace(/∆/g, '')); + return value.replace(referenceMarker, (match, text) => text.replace(/Δ/g, '')); } export function noDiagnostics(diagnostics: Diagnostics) { diff --git a/packages/platform-browser-dynamic/src/compiler_reflector.ts b/packages/platform-browser-dynamic/src/compiler_reflector.ts index 857a85e528..da2ec859d2 100644 --- a/packages/platform-browser-dynamic/src/compiler_reflector.ts +++ b/packages/platform-browser-dynamic/src/compiler_reflector.ts @@ -99,4 +99,4 @@ function createBuiltinExternalReferencesMap() { map.set(Identifiers.createRendererType2, ɵcrt); map.set(Identifiers.createComponentFactory, ɵccf); return map; -} \ No newline at end of file +} diff --git a/packages/platform-browser/src/browser/meta.ts b/packages/platform-browser/src/browser/meta.ts index 2b8b30d041..e32b984a46 100644 --- a/packages/platform-browser/src/browser/meta.ts +++ b/packages/platform-browser/src/browser/meta.ts @@ -7,7 +7,7 @@ */ import {DOCUMENT} from '@angular/common'; -import {Inject, Injectable, inject} from '@angular/core'; +import {Inject, Injectable, Δinject} from '@angular/core'; import {DomAdapter, getDOM} from '../dom/dom_adapter'; @@ -34,7 +34,7 @@ export type MetaDefinition = { * Factory to create Meta service. */ export function createMeta() { - return new Meta(inject(DOCUMENT)); + return new Meta(Δinject(DOCUMENT)); } /** diff --git a/packages/platform-browser/src/browser/title.ts b/packages/platform-browser/src/browser/title.ts index 83a2bb2c2f..a5f7b807fa 100644 --- a/packages/platform-browser/src/browser/title.ts +++ b/packages/platform-browser/src/browser/title.ts @@ -7,7 +7,7 @@ */ import {DOCUMENT} from '@angular/common'; -import {Inject, Injectable, inject} from '@angular/core'; +import {Inject, Injectable, Δinject} from '@angular/core'; import {getDOM} from '../dom/dom_adapter'; @@ -15,7 +15,7 @@ import {getDOM} from '../dom/dom_adapter'; * Factory to create Title service. */ export function createTitle() { - return new Title(inject(DOCUMENT)); + return new Title(Δinject(DOCUMENT)); } /** diff --git a/tools/public_api_guard/core/core.d.ts b/tools/public_api_guard/core/core.d.ts index 8e4d861e77..9142125b0b 100644 --- a/tools/public_api_guard/core/core.d.ts +++ b/tools/public_api_guard/core/core.d.ts @@ -259,16 +259,8 @@ export declare class DefaultIterableDiffer implements IterableDiffer, Iter onDestroy(): void; } -export declare function defineInjectable(opts: { - providedIn?: Type | 'root' | 'any' | null; - factory: () => T; -}): never; - -export declare function defineInjector(options: { - factory: () => any; - providers?: any[]; - imports?: any[]; -}): never; +/** @deprecated */ +export declare const defineInjectable: typeof ΔdefineInjectable; export declare function destroyPlatform(): void; @@ -385,8 +377,8 @@ export interface HostListenerDecorator { new (eventName: string, args?: string[]): any; } -export declare function inject(token: Type | InjectionToken): T; -export declare function inject(token: Type | InjectionToken, flags?: InjectFlags): T | null; +/** @deprecated */ +export declare const inject: typeof Δinject; export interface Inject { token: any; @@ -1051,3 +1043,361 @@ export interface WtfScopeFn { } export declare const wtfStartTimeRange: (rangeType: string, action: string) => any; + +export declare function ΔallocHostVars(count: number): void; + +export interface ΔBaseDef { + /** @deprecated */ readonly declaredInputs: { + [P in keyof T]: string; + }; + readonly inputs: { + [P in keyof T]: string; + }; + readonly outputs: { + [P in keyof T]: string; + }; +} + +export declare function Δbind(value: T): T | NO_CHANGE; + +export declare type ΔComponentDefWithMeta = ComponentDef; + +export declare function ΔcomponentHostSyntheticListener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void; + +export declare function ΔcomponentHostSyntheticProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void; + +export declare function Δcontainer(index: number): void; + +export declare function ΔcontainerRefreshEnd(): void; + +export declare function ΔcontainerRefreshStart(index: number): void; + +export declare function ΔcontentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): QueryList; + +export declare const ΔdefaultStyleSanitizer: StyleSanitizeFn; + +export declare function ΔdefineBase(baseDefinition: { + inputs?: { + [P in keyof T]?: string | [string, string]; + }; + outputs?: { + [P in keyof T]?: string; + }; +}): ΔBaseDef; + +export declare function ΔdefineComponent(componentDefinition: { + type: Type; + selectors: CssSelectorList; + factory: FactoryFn; + consts: number; + vars: number; + inputs?: { + [P in keyof T]?: string | [string, string]; + }; + outputs?: { + [P in keyof T]?: string; + }; + hostBindings?: HostBindingsFunction; + contentQueries?: ContentQueriesFunction; + exportAs?: string[]; + template: ComponentTemplate; + ngContentSelectors?: string[]; + viewQuery?: ViewQueriesFunction | null; + features?: ComponentDefFeature[]; + encapsulation?: ViewEncapsulation; + data?: { + [kind: string]: any; + }; + styles?: string[]; + changeDetection?: ChangeDetectionStrategy; + directives?: DirectiveTypesOrFactory | null; + pipes?: PipeTypesOrFactory | null; + schemas?: SchemaMetadata[] | null; +}): never; + +export declare const ΔdefineDirective: (directiveDefinition: { + type: Type; + selectors: (string | SelectorFlags)[][]; + factory: FactoryFn; + inputs?: { [P in keyof T]?: string | [string, string] | undefined; } | undefined; + outputs?: { [P in keyof T]?: string | undefined; } | undefined; + features?: DirectiveDefFeature[] | undefined; + hostBindings?: HostBindingsFunction | undefined; + contentQueries?: ContentQueriesFunction | undefined; + viewQuery?: ViewQueriesFunction | null | undefined; + exportAs?: string[] | undefined; +}) => never; + +export declare function ΔdefineInjectable(opts: { + providedIn?: Type | 'root' | 'any' | null; + factory: () => T; +}): never; + +export declare function ΔdefineInjector(options: { + factory: () => any; + providers?: any[]; + imports?: any[]; +}): never; + +export declare function ΔdefineNgModule(def: { + type: T; + bootstrap?: Type[] | (() => Type[]); + declarations?: Type[] | (() => Type[]); + imports?: Type[] | (() => Type[]); + exports?: Type[] | (() => Type[]); + schemas?: SchemaMetadata[] | null; +}): never; + +export declare function ΔdefinePipe(pipeDef: { + name: string; + type: Type; + factory: FactoryFn; + pure?: boolean; +}): never; + +export declare type ΔDirectiveDefWithMeta = DirectiveDef; + +export declare function ΔdirectiveInject(token: Type | InjectionToken): T; +export declare function ΔdirectiveInject(token: Type | InjectionToken, flags: InjectFlags): T; + +export declare function ΔdisableBindings(): void; + +export declare function Δelement(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void; + +export declare function ΔelementAttribute(index: number, name: string, value: any, sanitizer?: SanitizerFn | null, namespace?: string): void; + +export declare function ΔelementClassProp(index: number, classIndex: number, value: boolean | PlayerFactory, forceOverride?: boolean): void; + +export declare function ΔelementContainerEnd(): void; + +export declare function ΔelementContainerStart(index: number, attrs?: TAttributes | null, localRefs?: string[] | null): void; + +export declare function ΔelementEnd(): void; + +export declare function ΔelementHostAttrs(attrs: TAttributes): void; + +export declare function ΔelementHostClassProp(classIndex: number, value: boolean | PlayerFactory, forceOverride?: boolean): void; + +export declare function ΔelementHostStyleProp(styleIndex: number, value: string | number | String | PlayerFactory | null, suffix?: string | null, forceOverride?: boolean): void; + +export declare function ΔelementHostStyling(classBindingNames?: string[] | null, styleBindingNames?: string[] | null, styleSanitizer?: StyleSanitizeFn | null): void; + +export declare function ΔelementHostStylingApply(): void; + +export declare function ΔelementHostStylingMap(classes: { + [key: string]: any; +} | string | NO_CHANGE | null, styles?: { + [styleName: string]: any; +} | NO_CHANGE | null): void; + +export declare function ΔelementProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void; + +export declare function ΔelementStart(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void; + +export declare function ΔelementStyleProp(index: number, styleIndex: number, value: string | number | String | PlayerFactory | null, suffix?: string | null, forceOverride?: boolean): void; + +export declare function ΔelementStyling(classBindingNames?: string[] | null, styleBindingNames?: string[] | null, styleSanitizer?: StyleSanitizeFn | null): void; + +export declare function ΔelementStylingApply(index: number): void; + +export declare function ΔelementStylingMap(index: number, classes: { + [key: string]: any; +} | string | NO_CHANGE | null, styles?: { + [styleName: string]: any; +} | NO_CHANGE | null): void; + +export declare function ΔembeddedViewEnd(): void; + +export declare function ΔembeddedViewStart(viewBlockId: number, consts: number, vars: number): RenderFlags; + +export declare function ΔenableBindings(): void; + +export declare function ΔgetCurrentView(): OpaqueViewState; + +export declare function ΔgetFactoryOf(type: Type): ((type: Type | null) => T) | null; + +export declare function ΔgetInheritedFactory(type: Type): (type: Type) => T; + +export declare function Δi18n(index: number, message: string, subTemplateIndex?: number): void; + +export declare function Δi18nApply(index: number): void; + +export declare function Δi18nAttributes(index: number, values: string[]): void; + +export declare function Δi18nEnd(): void; + +export declare function Δi18nExp(expression: T | NO_CHANGE): void; + +export declare function Δi18nPostprocess(message: string, replacements?: { + [key: string]: (string | string[]); +}): string; + +export declare function Δi18nStart(index: number, message: string, subTemplateIndex?: number): void; + +export declare function ΔInheritDefinitionFeature(definition: DirectiveDef | ComponentDef): void; + +export declare function Δinject(token: Type | InjectionToken): T; +export declare function Δinject(token: Type | InjectionToken, flags?: InjectFlags): T | null; + +export interface ΔInjectableDef { + factory: () => T; + providedIn: InjectorType | 'root' | 'any' | null; + value: T | undefined; +} + +export declare function ΔinjectAttribute(attrNameToInject: string): string | null; + +export interface ΔInjectorDef { + factory: () => T; + imports: (InjectorType | InjectorTypeWithProviders)[]; + providers: (Type | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | any[])[]; +} + +export declare function Δinterpolation1(prefix: string, v0: any, suffix: string): string | NO_CHANGE; + +export declare function Δinterpolation2(prefix: string, v0: any, i0: string, v1: any, suffix: string): string | NO_CHANGE; + +export declare function Δinterpolation3(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): string | NO_CHANGE; + +export declare function Δinterpolation4(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string): string | NO_CHANGE; + +export declare function Δinterpolation5(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string): string | NO_CHANGE; + +export declare function Δinterpolation6(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string): string | NO_CHANGE; + +export declare function Δinterpolation7(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): string | NO_CHANGE; + +export declare function Δinterpolation8(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string): string | NO_CHANGE; + +export declare function ΔinterpolationV(values: any[]): string | NO_CHANGE; + +export declare function Δlistener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void; + +export declare function Δload(index: number): T; + +export declare function ΔloadContentQuery(): QueryList; + +export declare function ΔloadViewQuery(): T; + +export declare function ΔnamespaceHTML(): void; + +export declare function ΔnamespaceMathML(): void; + +export declare function ΔnamespaceSVG(): void; + +export declare function ΔnextContext(level?: number): T; + +export declare type ΔNgModuleDefWithMeta = NgModuleDef; + +export declare function ΔNgOnChangesFeature(): DirectiveDefFeature; + +export declare function Δpipe(index: number, pipeName: string): any; + +export declare function ΔpipeBind1(index: number, slotOffset: number, v1: any): any; + +export declare function ΔpipeBind2(index: number, slotOffset: number, v1: any, v2: any): any; + +export declare function ΔpipeBind3(index: number, slotOffset: number, v1: any, v2: any, v3: any): any; + +export declare function ΔpipeBind4(index: number, slotOffset: number, v1: any, v2: any, v3: any, v4: any): any; + +export declare function ΔpipeBindV(index: number, slotOffset: number, values: any[]): any; + +export declare type ΔPipeDefWithMeta = PipeDef; + +export declare function Δprojection(nodeIndex: number, selectorIndex?: number, attrs?: string[]): void; + +export declare function ΔprojectionDef(selectors?: CssSelectorList[], textSelectors?: string[]): void; + +export declare function ΔProvidersFeature(providers: Provider[], viewProviders?: Provider[]): (definition: DirectiveDef) => void; + +export declare function ΔpureFunction0(slotOffset: number, pureFn: () => T, thisArg?: any): T; + +export declare function ΔpureFunction1(slotOffset: number, pureFn: (v: any) => any, exp: any, thisArg?: any): any; + +export declare function ΔpureFunction2(slotOffset: number, pureFn: (v1: any, v2: any) => any, exp1: any, exp2: any, thisArg?: any): any; + +export declare function ΔpureFunction3(slotOffset: number, pureFn: (v1: any, v2: any, v3: any) => any, exp1: any, exp2: any, exp3: any, thisArg?: any): any; + +export declare function ΔpureFunction4(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, thisArg?: any): any; + +export declare function ΔpureFunction5(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, thisArg?: any): any; + +export declare function ΔpureFunction6(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, thisArg?: any): any; + +export declare function ΔpureFunction7(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, thisArg?: any): any; + +export declare function ΔpureFunction8(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any, v8: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, exp8: any, thisArg?: any): any; + +export declare function ΔpureFunctionV(slotOffset: number, pureFn: (...v: any[]) => any, exps: any[], thisArg?: any): any; + +export declare function ΔqueryRefresh(queryList: QueryList): boolean; + +export declare function Δreference(index: number): T; + +export declare function ΔresolveBody(element: RElement & { + ownerDocument: Document; +}): { + name: string; + target: HTMLElement; +}; + +export declare function ΔresolveDocument(element: RElement & { + ownerDocument: Document; +}): { + name: string; + target: Document; +}; + +export declare function ΔresolveWindow(element: RElement & { + ownerDocument: Document; +}): { + name: string; + target: Window | null; +}; + +export declare function ΔrestoreView(viewToRestore: OpaqueViewState): void; + +export declare function ΔsanitizeHtml(unsafeHtml: any): string; + +export declare function ΔsanitizeResourceUrl(unsafeResourceUrl: any): string; + +export declare function ΔsanitizeScript(unsafeScript: any): string; + +export declare function ΔsanitizeStyle(unsafeStyle: any): string; + +export declare function ΔsanitizeUrl(unsafeUrl: any): string; + +export declare function ΔsanitizeUrlOrResourceUrl(unsafeUrl: any, tag: string, prop: string): any; + +export declare function Δselect(index: number): void; + +export declare function ΔsetComponentScope(type: ComponentType, directives: Type[], pipes: Type[]): void; + +export declare function ΔsetNgModuleScope(type: any, scope: { + declarations?: Type[] | (() => Type[]); + imports?: Type[] | (() => Type[]); + exports?: Type[] | (() => Type[]); +}): void; + +export declare function ΔstaticContentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): void; + +export declare function ΔstaticViewQuery(predicate: Type | string[], descend: boolean, read: any): void; + +export declare function Δtemplate(index: number, templateFn: ComponentTemplate | null, consts: number, vars: number, tagName?: string | null, attrs?: TAttributes | null, localRefs?: string[] | null, localRefExtractor?: LocalRefExtractor): void; + +export declare function ΔtemplateRefExtractor(tNode: TNode, currentView: LView): ViewEngine_TemplateRef<{}> | null; + +export declare function Δtext(index: number, value?: any): void; + +export declare function ΔtextBinding(index: number, value: T | NO_CHANGE): void; + +export declare function ΔviewQuery(predicate: Type | string[], descend: boolean, read: any): QueryList; From ef853367194c77f505a0705e45f5670725873da1 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 18 Mar 2019 14:44:56 +0000 Subject: [PATCH 0696/1073] build: update to TypeScript 3.4 (#29372) PR Close #29372 --- aio/package.json | 2 +- aio/src/app/shared/reporting-error-handler.ts | 10 ++++++---- aio/tests/e2e/onerror.e2e-spec.ts | 4 +++- aio/yarn.lock | 8 ++++---- integration/bazel-schematics/test.sh | 2 +- integration/bazel/src/package.json | 2 +- integration/dynamic-compiler/package.json | 3 ++- .../include-all.ts | 0 .../package.json | 4 ++-- .../tsconfig.json | 0 package.json | 2 +- packages/bazel/package.json | 2 +- packages/compiler-cli/ngcc/src/rendering/renderer.ts | 2 +- packages/compiler-cli/package.json | 4 ++-- packages/compiler-cli/src/transformers/program.ts | 4 ++-- tools/ts-api-guardian/package.json | 6 +++--- yarn.lock | 8 ++++---- 17 files changed, 34 insertions(+), 29 deletions(-) rename integration/{typings_test_ts33 => typings_test_ts34}/include-all.ts (100%) rename integration/{typings_test_ts33 => typings_test_ts34}/package.json (98%) rename integration/{typings_test_ts33 => typings_test_ts34}/tsconfig.json (100%) diff --git a/aio/package.json b/aio/package.json index accf88126f..8caae64dee 100644 --- a/aio/package.json +++ b/aio/package.json @@ -157,7 +157,7 @@ "ts-node": "^3.3.0", "tslib": "^1.9.0", "tslint": "~5.9.1", - "typescript": "~3.3.3333", + "typescript": "~3.4.2", "uglify-js": "^3.0.15", "unist-util-filter": "^0.2.1", "unist-util-source": "^1.0.1", diff --git a/aio/src/app/shared/reporting-error-handler.ts b/aio/src/app/shared/reporting-error-handler.ts index 6289d6e057..126580f157 100644 --- a/aio/src/app/shared/reporting-error-handler.ts +++ b/aio/src/app/shared/reporting-error-handler.ts @@ -28,10 +28,12 @@ export class ReportingErrorHandler extends ErrorHandler { } private reportError(error: string | Error) { - if (typeof error === 'string') { - this.window.onerror(error); - } else { - this.window.onerror(error.message, undefined, undefined, undefined, error); + if (this.window.onerror) { + if (typeof error === 'string') { + this.window.onerror(error); + } else { + this.window.onerror(error.message, undefined, undefined, undefined, error); + } } } } diff --git a/aio/tests/e2e/onerror.e2e-spec.ts b/aio/tests/e2e/onerror.e2e-spec.ts index 70549b4cd0..733681bea6 100644 --- a/aio/tests/e2e/onerror.e2e-spec.ts +++ b/aio/tests/e2e/onerror.e2e-spec.ts @@ -190,7 +190,9 @@ createViewNodes@???`); // reset the ga queue (window as any).ga.q.length = 0; // post the error to the handler - window.onerror(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); + if (window.onerror) { + window.onerror(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4]); + } }, message, url, line, column, error); const gaCalls = await page.ga(); const exceptionCall = gaCalls.find(call => call[0] === 'send' && call[1] === 'exception'); diff --git a/aio/yarn.lock b/aio/yarn.lock index 3d8116aae8..5911119058 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -10576,10 +10576,10 @@ typescript@^2.4.1: version "2.6.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" -typescript@^3.2.2, typescript@~3.3.3333: - version "3.3.3333" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6" - integrity sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw== +typescript@^3.2.2, typescript@~3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.2.tgz#9ed4e6475d906f589200193be056f5913caed481" + integrity sha512-Og2Vn6Mk7JAuWA1hQdDQN/Ekm/SchX80VzLhjKN9ETYrIepBFAd8PkOdOTK2nKt0FCkmMZKBJvQ1dV1gIxPu/A== uglify-js@^3.0.15, uglify-js@^3.1.4: version "3.4.9" diff --git a/integration/bazel-schematics/test.sh b/integration/bazel-schematics/test.sh index 4d1c577f59..0b55efbe34 100755 --- a/integration/bazel-schematics/test.sh +++ b/integration/bazel-schematics/test.sh @@ -30,7 +30,7 @@ function testBazel() { yarn # Force more recent TS version until new Angular CLI projects also use it. # --ignore-scripts is necessary because there is a postinstall script that uses ngc. - yarn add typescript@3.3.3333 --dev --ignore-scripts + yarn add typescript@3.4.2 --dev --ignore-scripts installLocalPackages yarn webdriver-manager update --gecko=false --standalone=false ${CI_CHROMEDRIVER_VERSION_ARG:---versions.chrome 2.45} ng generate component widget --style=css diff --git a/integration/bazel/src/package.json b/integration/bazel/src/package.json index 617fe7cac5..4877883502 100644 --- a/integration/bazel/src/package.json +++ b/integration/bazel/src/package.json @@ -24,7 +24,7 @@ "@types/jasmine": "2.8.8", "@types/source-map": "0.5.1", "protractor": "5.1.2", - "typescript": "3.3.3333" + "typescript": "3.4.2" }, "scripts": { "postinstall": "ngc -p ./angular-metadata.tsconfig.json", diff --git a/integration/dynamic-compiler/package.json b/integration/dynamic-compiler/package.json index 3031bf2f21..bfb1c8c756 100644 --- a/integration/dynamic-compiler/package.json +++ b/integration/dynamic-compiler/package.json @@ -5,7 +5,8 @@ "scripts": { "build": "npm run clean && npm run ngc && npm run rollup && npm run rollup:lazy && npm run es5 && npm run es5:lazy", "clean": "rm -rf dist", - "es5": "tsc --target es5 --skipLibCheck --allowJs dist/bundle.es2015.js --out dist/bundle.js", + "//es5-note": "`--typeRoots ./dummy_folder_name/@types` is a workaround for https://github.com/Microsoft/TypeScript/issues/30845", + "es5": "tsc --target es5 --skipLibCheck --allowJs dist/bundle.es2015.js --out dist/bundle.js --typeRoots ./dummy_folder_name/@types", "es5:lazy": "tsc --target es5 --skipLibCheck --allowJs dist/lazy.bundle.es2015.js --out dist/lazy.bundle.js", "ngc": "ngc -p tsconfig.json", "rollup": "rollup -f iife -c rollup.config.js -o dist/bundle.es2015.js", diff --git a/integration/typings_test_ts33/include-all.ts b/integration/typings_test_ts34/include-all.ts similarity index 100% rename from integration/typings_test_ts33/include-all.ts rename to integration/typings_test_ts34/include-all.ts diff --git a/integration/typings_test_ts33/package.json b/integration/typings_test_ts34/package.json similarity index 98% rename from integration/typings_test_ts33/package.json rename to integration/typings_test_ts34/package.json index bb7c2b41e3..5086dacdcf 100644 --- a/integration/typings_test_ts33/package.json +++ b/integration/typings_test_ts34/package.json @@ -21,10 +21,10 @@ "@angular/upgrade": "file:../../dist/packages-dist/upgrade", "@types/jasmine": "2.5.41", "rxjs": "file:../../node_modules/rxjs", - "typescript": "3.3.x", + "typescript": "3.4.2", "zone.js": "file:../../node_modules/zone.js" }, "scripts": { "test": "tsc" } -} \ No newline at end of file +} diff --git a/integration/typings_test_ts33/tsconfig.json b/integration/typings_test_ts34/tsconfig.json similarity index 100% rename from integration/typings_test_ts33/tsconfig.json rename to integration/typings_test_ts34/tsconfig.json diff --git a/package.json b/package.json index 2e7997edd6..399183a107 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "tsickle": "0.34.3", "tslib": "^1.9.0", "tslint": "5.7.0", - "typescript": "~3.3.3333", + "typescript": "~3.4.2", "xhr2": "0.1.4", "yargs": "9.0.1", "zone.js": "^0.9.0" diff --git a/packages/bazel/package.json b/packages/bazel/package.json index dc59975e72..b6a2280205 100644 --- a/packages/bazel/package.json +++ b/packages/bazel/package.json @@ -39,7 +39,7 @@ "peerDependencies": { "@angular/compiler-cli": "0.0.0-PLACEHOLDER", "@bazel/typescript": "0.27.10", - "typescript": ">=3.3.3333 <3.4" + "typescript": ">=3.4 <3.5" }, "repository": { "type": "git", diff --git a/packages/compiler-cli/ngcc/src/rendering/renderer.ts b/packages/compiler-cli/ngcc/src/rendering/renderer.ts index 639606bfb7..172a2abe55 100644 --- a/packages/compiler-cli/ngcc/src/rendering/renderer.ts +++ b/packages/compiler-cli/ngcc/src/rendering/renderer.ts @@ -91,7 +91,7 @@ export abstract class Renderer { const renderedFiles: FileInfo[] = []; // Transform the source files. - this.bundle.src.program.getSourceFiles().map(sourceFile => { + this.bundle.src.program.getSourceFiles().forEach(sourceFile => { const compiledFile = decorationAnalyses.get(sourceFile); const switchMarkerAnalysis = switchMarkerAnalyses.get(sourceFile); diff --git a/packages/compiler-cli/package.json b/packages/compiler-cli/package.json index c1fcaaa607..075288a1d8 100644 --- a/packages/compiler-cli/package.json +++ b/packages/compiler-cli/package.json @@ -24,7 +24,7 @@ }, "peerDependencies": { "@angular/compiler": "0.0.0-PLACEHOLDER", - "typescript": ">=3.3.3333 <3.4" + "typescript": ">=3.4 <3.5" }, "engines": { "node": ">=8.0" @@ -45,4 +45,4 @@ "ng-update": { "packageGroup": "NG_UPDATE_PACKAGE_GROUP" } -} \ No newline at end of file +} diff --git a/packages/compiler-cli/src/transformers/program.ts b/packages/compiler-cli/src/transformers/program.ts index 9165af65a8..f14c259466 100644 --- a/packages/compiler-cli/src/transformers/program.ts +++ b/packages/compiler-cli/src/transformers/program.ts @@ -72,14 +72,14 @@ const defaultEmitCallback: TsEmitCallback = * Minimum supported TypeScript version * ∀ supported typescript version v, v >= MIN_TS_VERSION */ -const MIN_TS_VERSION = '3.3.3333'; +const MIN_TS_VERSION = '3.4.0'; /** * Supremum of supported TypeScript versions * ∀ supported typescript version v, v < MAX_TS_VERSION * MAX_TS_VERSION is not considered as a supported TypeScript version */ -const MAX_TS_VERSION = '3.4.0'; +const MAX_TS_VERSION = '3.5.0'; class AngularCompilerProgram implements Program { private rootNames: string[]; diff --git a/tools/ts-api-guardian/package.json b/tools/ts-api-guardian/package.json index 13944f2b1b..2ebf6cab82 100644 --- a/tools/ts-api-guardian/package.json +++ b/tools/ts-api-guardian/package.json @@ -11,7 +11,7 @@ "test": "test" }, "peerDependencies": { - "typescript": "~3.2.2" + "typescript": "~3.4.0" }, "dependencies": { "chalk": "^2.3.1", @@ -27,7 +27,7 @@ "chai": "^4.1.2", "jasmine": "^3.1.0", "source-map-support": "^0.5.9", - "typescript": "~3.3.3333" + "typescript": "~3.4.2" }, "repository": {}, "keywords": [ @@ -45,4 +45,4 @@ "url": "https://github.com/angular/angular/issues" }, "homepage": "https://github.com/angular/angular/tools/ts-api-guardian" -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index cb215d81c1..fd5ce07e44 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10640,10 +10640,10 @@ typescript@~3.1.6: resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== -typescript@~3.3.3333: - version "3.3.3333" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6" - integrity sha512-JjSKsAfuHBE/fB2oZ8NxtRTk5iGcg6hkYXMnZ3Wc+b2RSqejEqTaem11mHASMnFilHrax3sLK0GDzcJrekZYLw== +typescript@~3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.4.2.tgz#9ed4e6475d906f589200193be056f5913caed481" + integrity sha512-Og2Vn6Mk7JAuWA1hQdDQN/Ekm/SchX80VzLhjKN9ETYrIepBFAd8PkOdOTK2nKt0FCkmMZKBJvQ1dV1gIxPu/A== uglify-js@1.2.6, uglify-js@~1.2.5: version "1.2.6" From 4e8c2c3422b75b3171830057e4bc0359ca185e3d Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 8 Apr 2019 16:01:25 +0200 Subject: [PATCH 0697/1073] refactor(core): static-query schematic should handle abstract classes (#29688) Queries can not only be accessed within derived classes, but also in the super class through abstract methods. e.g. ``` abstract class BaseClass { abstract getEmbeddedForm(): NgForm {} ngOnInit() { this.getEmbeddedForm().doSomething(); } } class Subclass extends BaseClass { @ViewChild(NgForm) form: NgForm; getEmbeddedForm() { return this.form; } } ``` Same applies for abstract properties which are implemented in the base class through accessors. This case is also now handled by the schematic. Resolves FW-1213 PR Close #29688 --- .../angular/analyze_query_usage.ts | 100 +++++++---- .../angular/declaration_usage_visitor.ts | 52 ++++-- .../angular/ng_query_visitor.ts | 39 +++-- .../static-queries/angular/super_class.ts | 62 +++++++ .../test/static_queries_migration_spec.ts | 157 ++++++++++++++++++ .../core/schematics/utils/typescript/nodes.ts | 14 ++ 6 files changed, 368 insertions(+), 56 deletions(-) create mode 100644 packages/core/schematics/migrations/static-queries/angular/super_class.ts create mode 100644 packages/core/schematics/utils/typescript/nodes.ts diff --git a/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts b/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts index f38a0ccf6e..a75f9ef5b1 100644 --- a/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts +++ b/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts @@ -8,9 +8,11 @@ import * as ts from 'typescript'; import {hasPropertyNameText} from '../../../utils/typescript/property_name'; -import {DeclarationUsageVisitor} from './declaration_usage_visitor'; + +import {DeclarationUsageVisitor, FunctionContext} from './declaration_usage_visitor'; import {ClassMetadataMap} from './ng_query_visitor'; import {NgQueryDefinition, QueryTiming, QueryType} from './query-definition'; +import {updateSuperClassAbstractMembersContext} from './super_class'; /** * Object that maps a given type of query to a list of lifecycle hooks that @@ -34,11 +36,15 @@ export function analyzeNgQueryUsage( QueryTiming.DYNAMIC; } -/** Checks whether a given class or it's derived classes use the specified query statically. */ +/** + * Checks whether a given query is used statically within the given class, its super + * class or derived classes. + */ function isQueryUsedStatically( classDecl: ts.ClassDeclaration, query: NgQueryDefinition, classMetadataMap: ClassMetadataMap, - typeChecker: ts.TypeChecker, knownInputNames: string[]): boolean { - const usageVisitor = new DeclarationUsageVisitor(query.property, typeChecker); + typeChecker: ts.TypeChecker, knownInputNames: string[], + functionCtx: FunctionContext = new Map(), visitInheritedClasses = true): boolean { + const usageVisitor = new DeclarationUsageVisitor(query.property, typeChecker, functionCtx); const classMetadata = classMetadataMap.get(classDecl); // In case there is metadata for the current class, we collect all resolved Angular input @@ -48,24 +54,9 @@ function isQueryUsedStatically( knownInputNames.push(...classMetadata.ngInputNames); } - // List of TypeScript nodes which can contain usages of the given query in order to - // access it statically. e.g. - // (1) queries used in the "ngOnInit" lifecycle hook are static. - // (2) inputs with setters can access queries statically. - const possibleStaticQueryNodes: ts.Node[] = - classDecl.members - .filter(m => { - if (ts.isMethodDeclaration(m) && m.body && hasPropertyNameText(m.name) && - STATIC_QUERY_LIFECYCLE_HOOKS[query.type].indexOf(m.name.text) !== -1) { - return true; - } else if ( - knownInputNames && ts.isSetAccessor(m) && m.body && hasPropertyNameText(m.name) && - knownInputNames.indexOf(m.name.text) !== -1) { - return true; - } - return false; - }) - .map((member: ts.SetAccessorDeclaration | ts.MethodDeclaration) => member.body !); + // Array of TypeScript nodes which can contain usages of the given query in + // order to access it statically. + const possibleStaticQueryNodes = filterQueryClassMemberNodes(classDecl, query, knownInputNames); // In case nodes that can possibly access a query statically have been found, check // if the query declaration is synchronously used within any of these nodes. @@ -74,13 +65,66 @@ function isQueryUsedStatically( return true; } - // In case there are classes that derive from the current class, visit each - // derived class as inherited queries could be used statically. - if (classMetadata) { - return classMetadata.derivedClasses.some( - derivedClass => isQueryUsedStatically( - derivedClass, query, classMetadataMap, typeChecker, knownInputNames)); + if (!classMetadata) { + return false; + } + + // In case derived classes should also be analyzed, we determine the classes that derive + // from the current class and check if these have input setters or lifecycle hooks that + // use the query statically. + if (visitInheritedClasses) { + if (classMetadata.derivedClasses.some( + derivedClass => isQueryUsedStatically( + derivedClass, query, classMetadataMap, typeChecker, knownInputNames))) { + return true; + } + } + + // In case the current class has a super class, we determine declared abstract function-like + // declarations in the super-class that are implemented in the current class. The super class + // will then be analyzed with the abstract declarations mapped to the implemented TypeScript + // nodes. This allows us to handle queries which are used in super classes through derived + // abstract method declarations. + if (classMetadata.superClass) { + const superClassDecl = classMetadata.superClass; + + // Update the function context to map abstract declaration nodes to their implementation + // node in the base class. This ensures that the declaration usage visitor can analyze + // abstract class member declarations. + updateSuperClassAbstractMembersContext(classDecl, functionCtx, classMetadataMap); + + if (isQueryUsedStatically( + superClassDecl, query, classMetadataMap, typeChecker, [], functionCtx, false)) { + return true; + } } return false; } + + +/** + * Filters all class members from the class declaration that can access the + * given query statically (e.g. ngOnInit lifecycle hook or @Input setters) + */ +function filterQueryClassMemberNodes( + classDecl: ts.ClassDeclaration, query: NgQueryDefinition, + knownInputNames: string[]): ts.Block[] { + // Returns an array of TypeScript nodes which can contain usages of the given query + // in order to access it statically. e.g. + // (1) queries used in the "ngOnInit" lifecycle hook are static. + // (2) inputs with setters can access queries statically. + return classDecl.members + .filter(m => { + if (ts.isMethodDeclaration(m) && m.body && hasPropertyNameText(m.name) && + STATIC_QUERY_LIFECYCLE_HOOKS[query.type].indexOf(m.name.text) !== -1) { + return true; + } else if ( + knownInputNames && ts.isSetAccessor(m) && m.body && hasPropertyNameText(m.name) && + knownInputNames.indexOf(m.name.text) !== -1) { + return true; + } + return false; + }) + .map((member: ts.SetAccessorDeclaration | ts.MethodDeclaration) => member.body !); +} diff --git a/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts b/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts index e028c322e9..cdbcddd0db 100644 --- a/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts +++ b/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts @@ -9,7 +9,7 @@ import * as ts from 'typescript'; import {isFunctionLikeDeclaration, unwrapExpression} from '../../../utils/typescript/functions'; -type FunctionContext = Map; +export type FunctionContext = Map; /** * List of TypeScript syntax tokens that can be used within a binary expression as @@ -45,7 +45,9 @@ export class DeclarationUsageVisitor { */ private context: FunctionContext = new Map(); - constructor(private declaration: ts.Node, private typeChecker: ts.TypeChecker) {} + constructor( + private declaration: ts.Node, private typeChecker: ts.TypeChecker, + private baseContext: FunctionContext = new Map()) {} private isReferringToSymbol(node: ts.Node): boolean { const symbol = this.typeChecker.getSymbolAtLocation(node); @@ -114,7 +116,7 @@ export class DeclarationUsageVisitor { private visitPropertyAccessors( node: ts.PropertyAccessExpression, checkSetter: boolean, checkGetter: boolean) { - const propertySymbol = this.typeChecker.getSymbolAtLocation(node.name); + const propertySymbol = this._getPropertyAccessSymbol(node); if (!propertySymbol || !propertySymbol.declarations.length || (propertySymbol.getFlags() & ts.SymbolFlags.Accessor) === 0) { @@ -142,13 +144,6 @@ export class DeclarationUsageVisitor { return false; } - const symbol = this.typeChecker.getSymbolAtLocation(leftExpr.name); - - if (!symbol || !symbol.declarations.length || - (symbol.getFlags() & ts.SymbolFlags.Accessor) === 0) { - return false; - } - if (BINARY_COMPOUND_TOKENS.indexOf(node.operatorToken.kind) !== -1) { // Compound assignments always cause the getter and setter to be called. // Therefore we need to check the setter and getter of the property access. @@ -166,9 +161,15 @@ export class DeclarationUsageVisitor { } isSynchronouslyUsedInNode(searchNode: ts.Node): boolean { + this.nodeQueue = [searchNode]; this.visitedJumpExprNodes.clear(); this.context.clear(); - this.nodeQueue = [searchNode]; + + // Copy base context values into the current function block context. The + // base context is useful if nodes need to be mapped to other nodes. e.g. + // abstract super class methods are mapped to their implementation node of + // the derived class. + this.baseContext.forEach((value, key) => this.context.set(key, value)); while (this.nodeQueue.length) { const node = this.nodeQueue.shift() !; @@ -225,7 +226,7 @@ export class DeclarationUsageVisitor { * the context, the original node is returned. */ private _resolveNodeFromContext(node: ts.Node): ts.Node { - if (ts.isParameter(node) && this.context.has(node)) { + if (this.context.has(node)) { return this.context.get(node) !; } return node; @@ -279,4 +280,31 @@ export class DeclarationUsageVisitor { return symbol; } + + /** Gets the symbol of the given property access expression. */ + private _getPropertyAccessSymbol(node: ts.PropertyAccessExpression): ts.Symbol|null { + let propertySymbol = this._getDeclarationSymbolOfNode(node.name); + + if (!propertySymbol) { + return null; + } + + if (!this.context.has(propertySymbol.valueDeclaration)) { + return propertySymbol; + } + + // In case the context has the value declaration of the given property access + // name identifier, we need to replace the "propertySymbol" with the symbol + // referring to the resolved symbol based on the context. e.g. abstract properties + // can ultimately resolve into an accessor declaration based on the implementation. + const contextNode = this._resolveNodeFromContext(propertySymbol.valueDeclaration); + + if (!ts.isAccessor(contextNode)) { + return null; + } + + // Resolve the symbol referring to the "accessor" using the name identifier + // of the accessor declaration. + return this._getDeclarationSymbolOfNode(contextNode.name); + } } diff --git a/packages/core/schematics/migrations/static-queries/angular/ng_query_visitor.ts b/packages/core/schematics/migrations/static-queries/angular/ng_query_visitor.ts index 7cb2dded82..f6d4130762 100644 --- a/packages/core/schematics/migrations/static-queries/angular/ng_query_visitor.ts +++ b/packages/core/schematics/migrations/static-queries/angular/ng_query_visitor.ts @@ -16,6 +16,8 @@ import {NgQueryDefinition, QueryType} from './query-definition'; export interface ClassMetadata { /** List of class declarations that derive from the given class. */ derivedClasses: ts.ClassDeclaration[]; + /** Super class of the given class. */ + superClass: ts.ClassDeclaration|null; /** List of property names that declare an Angular input within the given class. */ ngInputNames: string[]; } @@ -101,29 +103,34 @@ export class NgQueryResolveVisitor { private _recordClassInheritances(node: ts.ClassDeclaration) { const baseTypes = getBaseTypeIdentifiers(node); - if (!baseTypes || !baseTypes.length) { + if (!baseTypes || baseTypes.length !== 1) { return; } - baseTypes.forEach(baseTypeIdentifier => { - // We need to resolve the value declaration through the resolved type as the base - // class could be declared in different source files and the local symbol won't - // contain a value declaration as the value is not declared locally. - const symbol = this.typeChecker.getTypeAtLocation(baseTypeIdentifier).getSymbol(); + const superClass = baseTypes[0]; + const baseClassMetadata = this._getClassMetadata(node); - if (symbol && symbol.valueDeclaration && ts.isClassDeclaration(symbol.valueDeclaration)) { - const extendedClass = symbol.valueDeclaration; - const classMetadata = this._getClassMetadata(extendedClass); + // We need to resolve the value declaration through the resolved type as the base + // class could be declared in different source files and the local symbol won't + // contain a value declaration as the value is not declared locally. + const symbol = this.typeChecker.getTypeAtLocation(superClass).getSymbol(); - // Record all classes that derive from the given class. This makes it easy to - // determine all classes that could potentially use inherited queries statically. - classMetadata.derivedClasses.push(node); - this.classMetadata.set(extendedClass, classMetadata); - } - }); + if (symbol && symbol.valueDeclaration && ts.isClassDeclaration(symbol.valueDeclaration)) { + const extendedClass = symbol.valueDeclaration; + const classMetadataExtended = this._getClassMetadata(extendedClass); + + // Record all classes that derive from the given class. This makes it easy to + // determine all classes that could potentially use inherited queries statically. + classMetadataExtended.derivedClasses.push(node); + this.classMetadata.set(extendedClass, classMetadataExtended); + + // Record the super class of the current class. + baseClassMetadata.superClass = extendedClass; + this.classMetadata.set(node, baseClassMetadata); + } } private _getClassMetadata(node: ts.ClassDeclaration): ClassMetadata { - return this.classMetadata.get(node) || {derivedClasses: [], ngInputNames: []}; + return this.classMetadata.get(node) || {derivedClasses: [], superClass: null, ngInputNames: []}; } } diff --git a/packages/core/schematics/migrations/static-queries/angular/super_class.ts b/packages/core/schematics/migrations/static-queries/angular/super_class.ts new file mode 100644 index 0000000000..b86860a731 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/angular/super_class.ts @@ -0,0 +1,62 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {isFunctionLikeDeclaration} from '../../../utils/typescript/functions'; +import {hasModifier} from '../../../utils/typescript/nodes'; +import {getPropertyNameText} from '../../../utils/typescript/property_name'; + +import {FunctionContext} from './declaration_usage_visitor'; +import {ClassMetadataMap} from './ng_query_visitor'; + + +/** + * Updates the specified function context to map abstract super-class class members + * to their implementation TypeScript nodes. This allows us to run the declaration visitor + * for the super class with the context of the "baseClass" (e.g. with implemented abstract + * class members) + */ +export function updateSuperClassAbstractMembersContext( + baseClass: ts.ClassDeclaration, context: FunctionContext, classMetadataMap: ClassMetadataMap) { + getSuperClassDeclarations(baseClass, classMetadataMap).forEach(superClassDecl => { + superClassDecl.members.forEach(superClassMember => { + if (!superClassMember.name || !hasModifier(superClassMember, ts.SyntaxKind.AbstractKeyword)) { + return; + } + + // Find the matching implementation of the abstract declaration from the super class. + const baseClassImpl = baseClass.members.find( + baseClassMethod => !!baseClassMethod.name && + getPropertyNameText(baseClassMethod.name) === + getPropertyNameText(superClassMember.name !)); + + if (!baseClassImpl || !isFunctionLikeDeclaration(baseClassImpl) || !baseClassImpl.body) { + return; + } + + if (!context.has(superClassMember)) { + context.set(superClassMember, baseClassImpl); + } + }); + }); +} + +/** Gets all super-class TypeScript declarations for the given class. */ +function getSuperClassDeclarations( + classDecl: ts.ClassDeclaration, classMetadataMap: ClassMetadataMap) { + const declarations: ts.ClassDeclaration[] = []; + + let current = classMetadataMap.get(classDecl); + while (current && current.superClass) { + declarations.push(current.superClass); + current = classMetadataMap.get(current.superClass); + } + + return declarations; +} diff --git a/packages/core/schematics/test/static_queries_migration_spec.ts b/packages/core/schematics/test/static_queries_migration_spec.ts index 3a6a0a3a4c..ca54b88864 100644 --- a/packages/core/schematics/test/static_queries_migration_spec.ts +++ b/packages/core/schematics/test/static_queries_migration_spec.ts @@ -1032,6 +1032,163 @@ describe('static-queries migration', () => { .toContain(`@${queryType}('test', { static: true }) query: any;`); }); + it('should check derived abstract class methods', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + export abstract class RootBaseClass { + abstract getQuery(): any; + + ngOnInit() { + this.getQuery().doSomething(); + } + } + + export abstract class BaseClass extends RootBaseClass { + abstract getQuery2(): any; + + getQuery() { + this.getQuery2(); + } + } + + @Component({template: ''}) + export class Subclass extends BaseClass { + @${queryType}('test') query: any; + + getQuery2(): any { + return this.query; + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should detect queries accessed through deep abstract class method', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + export abstract class RootBaseClass { + abstract getQuery(): any; + + ngOnInit() { + this.getQuery().doSomething(); + } + } + + export abstract class BaseClass extends RootBaseClass { + /* additional layer of indirection */ + } + + @Component({template: ''}) + export class Subclass extends BaseClass { + @${queryType}('test') query: any; + + getQuery(): any { + return this.query; + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should detect queries accessed through abstract property getter', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + export abstract class BaseClass { + abstract myQuery: any; + + ngOnInit() { + this.myQuery.doSomething(); + } + } + + @Component({template: ''}) + export class Subclass extends BaseClass { + @${queryType}('test') query: any; + + get myQuery() { return this.query; } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should detect queries accessed through abstract property setter', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + export abstract class BaseClass { + abstract myQuery: any; + + ngOnInit() { + this.myQuery = "trigger"; + } + } + + @Component({template: ''}) + export class Subclass extends BaseClass { + @${queryType}('test') query: any; + + set myQuery(val: any) { this.query.doSomething() } + get myQuery() { /* noop */ } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + + it('should detect query usage in abstract class methods accessing inherited query', () => { + writeFile('/index.ts', ` + import {Component, ${queryType}} from '@angular/core'; + + export abstract class RootBaseClass { + abstract getQuery(): any; + + ngOnInit() { + this.getQuery().doSomething(); + } + } + + export abstract class BaseClass extends RootBaseClass { + @${queryType}('test') query: any; + abstract getQuery2(): any; + + getQuery() { + this.getQuery2(); + } + } + + @Component({template: ''}) + export class Subclass extends BaseClass { + + getQuery2(): any { + return this.query; + } + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@${queryType}('test', { static: true }) query: any;`); + }); + it('should properly handle multiple tsconfig files', () => { writeFile('/src/index.ts', ` import {Component, ${queryType}} from '@angular/core'; diff --git a/packages/core/schematics/utils/typescript/nodes.ts b/packages/core/schematics/utils/typescript/nodes.ts new file mode 100644 index 0000000000..48ac25d3b4 --- /dev/null +++ b/packages/core/schematics/utils/typescript/nodes.ts @@ -0,0 +1,14 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +/** Checks whether the given TypeScript node has the specified modifier set. */ +export function hasModifier(node: ts.Node, modifierKind: ts.SyntaxKind) { + return !!node.modifiers && node.modifiers.some(m => m.kind === modifierKind); +} From 39bfd1a11fa1dd0fcbb5062fdd5f98e6ca985ca8 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Fri, 5 Apr 2019 18:58:56 +0200 Subject: [PATCH 0698/1073] refactor(core): run migration schematics for v8 beta and rc releases (#29735) Currently the `static-query` and `template-var-assignment` schematic only runs for `8.0.0` which does not include any betas or release candidates. We want to run the schematic in the beta's and RC in order to get early feedback about the schematics. Enabling it promptly with V8 stable release can result in accidental breakages that we would like to fix/identify before. PR Close #29735 --- packages/core/schematics/migrations.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/schematics/migrations.json b/packages/core/schematics/migrations.json index f4fe65f4b6..7f83b87884 100644 --- a/packages/core/schematics/migrations.json +++ b/packages/core/schematics/migrations.json @@ -1,12 +1,12 @@ { "schematics": { "migration-v8-static-queries": { - "version": "8", + "version": "8-beta", "description": "Migrates ViewChild and ContentChild to explicit query timing", "factory": "./migrations/static-queries/index" }, "migration-v8-template-local-variables": { - "version": "8", + "version": "8-beta", "description": "Warns developers if values are assigned to template variables", "factory": "./migrations/template-var-assignment/index" } From 09975120fdaf7ea45661ff07812db3e894f8a62d Mon Sep 17 00:00:00 2001 From: Trevor Karjanis <2351292+TrevorKarjanis@users.noreply.github.com> Date: Mon, 8 Apr 2019 10:03:49 -0500 Subject: [PATCH 0699/1073] docs: fix a grammatical error in the building and serving documentation (#29768) Fix a grammatical error in the building and serving documentation. There is no associated issue. PR Close #29768 --- aio/content/guide/build.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/content/guide/build.md b/aio/content/guide/build.md index a1a03051e7..4b7eea4955 100644 --- a/aio/content/guide/build.md +++ b/aio/content/guide/build.md @@ -202,7 +202,7 @@ Specify size values in the following formats: * 12%: Percentage of size relative to baseline. (Not valid for baseline values.) -When you configure a budget, the build system warns or reports and error when a given part of the app reaches or exceeds a boundary size that you set. +When you configure a budget, the build system warns or reports an error when a given part of the app reaches or exceeds a boundary size that you set. Each budget entry is a JSON object with the following properties: From ad642e31cd9907265af3777f7b385021ec26832b Mon Sep 17 00:00:00 2001 From: Trevor Karjanis <2351292+TrevorKarjanis@users.noreply.github.com> Date: Mon, 8 Apr 2019 10:04:19 -0500 Subject: [PATCH 0700/1073] docs: fix grammatical errors in the style guide (#29769) Fix grammatical errors in the Style Guide. There is no associated issue. PR Close #29769 --- aio/content/guide/styleguide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aio/content/guide/styleguide.md b/aio/content/guide/styleguide.md index 9b18dbeec9..da70b2cc20 100644 --- a/aio/content/guide/styleguide.md +++ b/aio/content/guide/styleguide.md @@ -3156,7 +3156,7 @@ A typical *lazy loaded folder* contains a *routing component*, its child compone
-**Why?** components have templates containing HTML and optional Angular template syntax. +**Why?** Components have templates containing HTML and optional Angular template syntax. They display content. Developers place components on the page as they would native HTML elements and web components. @@ -4229,7 +4229,7 @@ Use Lifecycle hooks to tap into important events exposed by Angular. **Why?** Lifecycle interfaces prescribe typed method -signatures. use those signatures to flag spelling and syntax mistakes. +signatures. Use those signatures to flag spelling and syntax mistakes.
From 8c37cdc38a443d1f70dc5fce1a1303dd7e3b9cf8 Mon Sep 17 00:00:00 2001 From: Santosh Yadav Date: Wed, 10 Apr 2019 22:49:54 +0530 Subject: [PATCH 0701/1073] docs: redirect to schematics-for-libraries (#29780) Fixes #29778 PR Close #29780 --- aio/content/guide/creating-libraries.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/content/guide/creating-libraries.md b/aio/content/guide/creating-libraries.md index 76be9a9ffc..c4af439265 100644 --- a/aio/content/guide/creating-libraries.md +++ b/aio/content/guide/creating-libraries.md @@ -97,7 +97,7 @@ A library can include [schematics](guide/glossary#schematic) that allow it to in * Include an update schematic so that `ng update` can update your library’s dependencies and provide migrations for breaking changes in new releases. -To learn more, see [Schematics — An Introduction](https://blog.angular.io/schematics-an-introduction-dc1dfbc2a2b2). +To learn more, see [Schematics Overview](guide/schematics) and [Schematics for Libraries](guide/schematics-for-libraries). ## Publishing your library From 3e4698564af89ff1e3432d718a54673e8be96673 Mon Sep 17 00:00:00 2001 From: Surya Malladi Date: Wed, 10 Apr 2019 00:48:53 +0530 Subject: [PATCH 0702/1073] docs: showing hamburger menu for getting started pages on desktop (#29791) Added a css rule to show hamburger for desktops when the user is in any of the getting started pages. PR Close #29791 --- aio/src/styles/1-layouts/_top-menu.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/aio/src/styles/1-layouts/_top-menu.scss b/aio/src/styles/1-layouts/_top-menu.scss index 4bb8820192..642085dff9 100644 --- a/aio/src/styles/1-layouts/_top-menu.scss +++ b/aio/src/styles/1-layouts/_top-menu.scss @@ -49,6 +49,7 @@ aio-shell.page-resources mat-toolbar.mat-toolbar { aio-shell.folder-api mat-toolbar.mat-toolbar, aio-shell.folder-cli mat-toolbar.mat-toolbar, aio-shell.folder-docs mat-toolbar.mat-toolbar, +aio-shell.folder-getting-started mat-toolbar.mat-toolbar, aio-shell.folder-guide mat-toolbar.mat-toolbar, aio-shell.folder-tutorial mat-toolbar.mat-toolbar { @media (min-width: 992px) { From 675f3909d75efda68c529d62f2faac99af166760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Tue, 9 Apr 2019 14:08:05 -0700 Subject: [PATCH 0703/1073] perf(ivy): do not use spread operations in styling (#29795) While investigating styling performance regressions, it was discovered that a single `fn(...args)` operation was causing a performance hit because the generated es5 `__spread` operation uses `[].concat` and reads from the `arguments` values (which are not very efficient). This patch changes that around to use `fn.apply` instead. PR Close #29795 --- packages/core/src/render3/styling/host_instructions_queue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/render3/styling/host_instructions_queue.ts b/packages/core/src/render3/styling/host_instructions_queue.ts index 07d01cd94a..a691397fb4 100644 --- a/packages/core/src/render3/styling/host_instructions_queue.ts +++ b/packages/core/src/render3/styling/host_instructions_queue.ts @@ -65,7 +65,7 @@ export function flushQueue(context: StylingContext): void { i += HostInstructionsQueueIndex.Size) { const fn = buffer[i + HostInstructionsQueueIndex.InstructionFnOffset] as Function; const args = buffer[i + HostInstructionsQueueIndex.ParamsOffset] as any[]; - fn(...args); + fn.apply(this, args); } buffer.length = HostInstructionsQueueIndex.ValuesStartPosition; } From 17c4ed9d0f1ee05628f5c6a361535a4adc5fe1e6 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Wed, 10 Apr 2019 14:41:51 +0200 Subject: [PATCH 0704/1073] docs: update path mappings and exports (#29810) 1) Path mappings are to be added in the workspace tsconfig files, hence the path needs to be `./` and not `../` 2) Fix export symbol as it cannot contain `-` Fixes #29807 PR Close #29810 --- aio/content/guide/creating-libraries.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aio/content/guide/creating-libraries.md b/aio/content/guide/creating-libraries.md index c4af439265..c74a2c2092 100644 --- a/aio/content/guide/creating-libraries.md +++ b/aio/content/guide/creating-libraries.md @@ -131,7 +131,7 @@ A linked library will then have its own set of Angular libraries that it uses fo However, this can cause problems while building or running your application. To get around this problem you can use TypeScript path mapping to tell TypeScript that it should load some modules from a specific location. -List all the peer dependencies that your library uses in the TypeScript configuration file `./tsconfig.json`, and point them at the local copy in the app's `node_modules` folder. +List all the peer dependencies that your library uses in the workspace TypeScript configuration file `./tsconfig.json`, and point them at the local copy in the app's `node_modules` folder. ``` { @@ -140,7 +140,7 @@ List all the peer dependencies that your library uses in the TypeScript configur // paths are relative to `baseUrl` path. "paths": { "@angular/*": [ - "../node_modules/@angular/*" + "./node_modules/@angular/*" ] } } @@ -162,7 +162,7 @@ To use your own library in an app: * In your apps, import from the library by name: ``` - import { my-export } from 'my-lib'; + import { myExport } from 'my-lib'; ``` ### Building and rebuilding your library From 1eb7e9b80479ac405c4d218111cf03bf317d14db Mon Sep 17 00:00:00 2001 From: Igor Minar Date: Wed, 10 Apr 2019 13:04:40 -0700 Subject: [PATCH 0705/1073] docs: correct the name of the latin delta to greek delta It was previously misattributed by accident. --- docs/PUBLIC_API.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/PUBLIC_API.md b/docs/PUBLIC_API.md index 6fc7b7e68b..cb1e2e94a2 100644 --- a/docs/PUBLIC_API.md +++ b/docs/PUBLIC_API.md @@ -37,7 +37,7 @@ We explicitly don't consider the following to be our public API surface: - any file/import paths within our package except for the `/`, `/testing` and `/bundles/*` and other documented package entry-points. - constructors of injectable classes (services and directives) - please use DI to obtain instances of these classes -- any class members or symbols marked as `private`, or prefixed with underscore (`_`), [barred latin o](https://en.wikipedia.org/wiki/%C6%9F) (`ɵ`), and [latin delta](https://en.wikipedia.org/wiki/Delta_(letter)) (`Δ`). +- any class members or symbols marked as `private`, or prefixed with underscore (`_`), [barred latin o](https://en.wikipedia.org/wiki/%C6%9F) (`ɵ`), and [greek delta](https://en.wikipedia.org/wiki/Delta_(letter)) (`Δ`). - extending any of our classes unless the support for this is specifically documented in the API docs - the contents and API surface of the code generated by Angular's compiler (with one notable exception: the existence and name of `NgModuleFactory` instances exported from generated code is guaranteed) From 147a15a41969044e50aa8d0bf7bce01b13fc34fa Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Thu, 28 Mar 2019 10:39:12 -0700 Subject: [PATCH 0706/1073] refactor(ivy): move property instruction (#29576) - moves the property instruction to its own file - moves shared functions that should not be public to the existing `shared.ts` file. - adds the export of `property.ts` to `all.ts` PR Close #29576 --- .../src/render3/instructions/instructions.ts | 2940 +++++++++++++++++ 1 file changed, 2940 insertions(+) create mode 100644 packages/core/src/render3/instructions/instructions.ts diff --git a/packages/core/src/render3/instructions/instructions.ts b/packages/core/src/render3/instructions/instructions.ts new file mode 100644 index 0000000000..387413623c --- /dev/null +++ b/packages/core/src/render3/instructions/instructions.ts @@ -0,0 +1,2940 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {InjectFlags, InjectionToken, Injector} from '../../di'; +import {resolveForwardRef} from '../../di/forward_ref'; +import {ErrorHandler} from '../../error_handler'; +import {Type} from '../../interface/type'; +import {SchemaMetadata} from '../../metadata/schema'; +import {validateAgainstEventAttributes} from '../../sanitization/sanitization'; +import {Sanitizer} from '../../sanitization/security'; +import {assertDataInRange, assertDefined, assertDomNode, assertEqual, assertGreaterThan, assertLessThan, assertNotEqual} from '../../util/assert'; +import {isObservable} from '../../util/lang'; +import {assertHasParent, assertLContainerOrUndefined, assertLView, assertPreviousIsParent} from '../assert'; +import {bindingUpdated, bindingUpdated2, bindingUpdated3, bindingUpdated4} from '../bindings'; +import {attachPatchData, getComponentViewByInstance} from '../context_discovery'; +import {attachLContainerDebug, attachLViewDebug} from '../debug'; +import {diPublicInInjector, getNodeInjectable, getOrCreateInjectable, getOrCreateNodeInjectorForNode, injectAttributeImpl} from '../di'; +import {throwMultipleComponentError} from '../errors'; +import {executeHooks, executePreOrderHooks, registerPostOrderHooks, registerPreOrderHooks} from '../hooks'; +import {ACTIVE_INDEX, LContainer, VIEWS} from '../interfaces/container'; +import {ComponentDef, ComponentTemplate, DirectiveDef, DirectiveDefListOrFactory, PipeDefListOrFactory, RenderFlags, ViewQueriesFunction} from '../interfaces/definition'; +import {INJECTOR_BLOOM_PARENT_SIZE, NodeInjectorFactory} from '../interfaces/injector'; +import {AttributeMarker, InitialInputData, InitialInputs, LocalRefExtractor, PropertyAliasValue, PropertyAliases, TAttributes, TContainerNode, TElementContainerNode, TElementNode, TIcuContainerNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType, TProjectionNode, TViewNode} from '../interfaces/node'; +import {CssSelectorList} from '../interfaces/projection'; +import {LQueries} from '../interfaces/query'; +import {GlobalTargetResolver, RComment, RElement, RText, Renderer3, RendererFactory3, isProceduralRenderer} from '../interfaces/renderer'; +import {SanitizerFn} from '../interfaces/sanitization'; +import {StylingContext} from '../interfaces/styling'; +import {BINDING_INDEX, CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_VIEW, ExpandoInstructions, FLAGS, HEADER_OFFSET, HOST, INJECTOR, InitPhaseState, LView, LViewFlags, NEXT, OpaqueViewState, PARENT, QUERIES, RENDERER, RENDERER_FACTORY, RootContext, RootContextFlags, SANITIZER, TVIEW, TView, T_HOST} from '../interfaces/view'; +import {assertNodeOfPossibleTypes, assertNodeType} from '../node_assert'; +import {appendChild, appendProjectedNodes, createTextNode, insertView, removeView} from '../node_manipulation'; +import {isNodeMatchingSelectorList, matchingProjectionSelectorIndex} from '../node_selector_matcher'; +import {applyOnCreateInstructions} from '../node_util'; +import {decreaseElementDepthCount, enterView, getActiveHostContext, getBindingsEnabled, getCheckNoChangesMode, getContextLView, getCurrentDirectiveDef, getElementDepthCount, getIsParent, getLView, getPreviousOrParentTNode, getSelectedIndex, increaseElementDepthCount, isCreationMode, leaveView, nextContextImpl, resetComponentState, setActiveHost, setBindingRoot, setCheckNoChangesMode, setCurrentDirectiveDef, setCurrentQueryIndex, setIsParent, setPreviousOrParentTNode, setSelectedIndex} from '../state'; +import {getInitialClassNameValue, getInitialStyleStringValue, initializeStaticContext as initializeStaticStylingContext, patchContextWithStaticAttrs, renderInitialClasses, renderInitialStyles} from '../styling/class_and_style_bindings'; +import {getStylingContext, hasClassInput, hasStyleInput} from '../styling/util'; +import {NO_CHANGE} from '../tokens'; +import {attrsStylingIndexOf, setUpAttributes} from '../util/attrs_utils'; +import {INTERPOLATION_DELIMITER, renderStringify} from '../util/misc_utils'; +import {findComponentView, getLViewParent, getRootContext, getRootView} from '../util/view_traversal_utils'; +import {getComponentViewByIndex, getNativeByIndex, getNativeByTNode, getTNode, isComponentDef, isContentQueryHost, isRootView, loadInternal, readPatchedLView, resetPreOrderHookFlags, unwrapRNode, viewAttachedToChangeDetector} from '../util/view_utils'; + +import {BindingDirection, elementPropertyInternal, generatePropertyAliases, initializeTNodeInputs, setInputsForProperty} from './shared'; + + + +/** + * A permanent marker promise which signifies that the current CD tree is + * clean. + */ +const _CLEAN_PROMISE = Promise.resolve(null); + +/** + * Refreshes the view, executing the following steps in that order: + * triggers init hooks, refreshes dynamic embedded views, triggers content hooks, sets host + * bindings, refreshes child components. + * Note: view hooks are triggered later when leaving the view. + */ +export function refreshDescendantViews(lView: LView) { + const tView = lView[TVIEW]; + const creationMode = isCreationMode(lView); + + // This needs to be set before children are processed to support recursive components + tView.firstTemplatePass = false; + + // Resetting the bindingIndex of the current LView as the next steps may trigger change detection. + lView[BINDING_INDEX] = tView.bindingStartIndex; + + // If this is a creation pass, we should not call lifecycle hooks or evaluate bindings. + // This will be done in the update pass. + if (!creationMode) { + const checkNoChangesMode = getCheckNoChangesMode(); + + executePreOrderHooks(lView, tView, checkNoChangesMode, undefined); + + refreshDynamicEmbeddedViews(lView); + + // Content query results must be refreshed before content hooks are called. + refreshContentQueries(tView, lView); + + resetPreOrderHookFlags(lView); + executeHooks( + lView, tView.contentHooks, tView.contentCheckHooks, checkNoChangesMode, + InitPhaseState.AfterContentInitHooksToBeRun, undefined); + + setHostBindings(tView, lView); + } + + // We resolve content queries specifically marked as `static` in creation mode. Dynamic + // content queries are resolved during change detection (i.e. update mode), after embedded + // views are refreshed (see block above). + if (creationMode && tView.staticContentQueries) { + refreshContentQueries(tView, lView); + } + + refreshChildComponents(tView.components); +} + + +/** Sets the host bindings for the current view. */ +export function setHostBindings(tView: TView, viewData: LView): void { + if (tView.expandoInstructions) { + let bindingRootIndex = viewData[BINDING_INDEX] = tView.expandoStartIndex; + setBindingRoot(bindingRootIndex); + let currentDirectiveIndex = -1; + let currentElementIndex = -1; + for (let i = 0; i < tView.expandoInstructions.length; i++) { + const instruction = tView.expandoInstructions[i]; + if (typeof instruction === 'number') { + if (instruction <= 0) { + // Negative numbers mean that we are starting new EXPANDO block and need to update + // the current element and directive index. + currentElementIndex = -instruction; + // Injector block and providers are taken into account. + const providerCount = (tView.expandoInstructions[++i] as number); + bindingRootIndex += INJECTOR_BLOOM_PARENT_SIZE + providerCount; + + currentDirectiveIndex = bindingRootIndex; + } else { + // This is either the injector size (so the binding root can skip over directives + // and get to the first set of host bindings on this node) or the host var count + // (to get to the next set of host bindings on this node). + bindingRootIndex += instruction; + } + setBindingRoot(bindingRootIndex); + } else { + // If it's not a number, it's a host binding function that needs to be executed. + if (instruction !== null) { + viewData[BINDING_INDEX] = bindingRootIndex; + const hostCtx = unwrapRNode(viewData[currentDirectiveIndex]); + setActiveHost(hostCtx, currentElementIndex); + instruction(RenderFlags.Update, hostCtx, currentElementIndex); + setActiveHost(null); + } + currentDirectiveIndex++; + } + } + } +} + +/** Refreshes content queries for all directives in the given view. */ +function refreshContentQueries(tView: TView, lView: LView): void { + if (tView.contentQueries != null) { + setCurrentQueryIndex(0); + for (let i = 0; i < tView.contentQueries.length; i++) { + const directiveDefIdx = tView.contentQueries[i]; + const directiveDef = tView.data[directiveDefIdx] as DirectiveDef; + ngDevMode && + assertDefined(directiveDef.contentQueries, 'contentQueries function should be defined'); + directiveDef.contentQueries !(RenderFlags.Update, lView[directiveDefIdx], directiveDefIdx); + } + } +} + +/** Refreshes child components in the current view. */ +function refreshChildComponents(components: number[] | null): void { + if (components != null) { + for (let i = 0; i < components.length; i++) { + componentRefresh(components[i]); + } + } +} + +export function createLView( + parentLView: LView | null, tView: TView, context: T | null, flags: LViewFlags, + host: RElement | null, tHostNode: TViewNode | TElementNode | null, + rendererFactory?: RendererFactory3 | null, renderer?: Renderer3 | null, + sanitizer?: Sanitizer | null, injector?: Injector | null): LView { + const lView = tView.blueprint.slice() as LView; + lView[HOST] = host; + lView[FLAGS] = flags | LViewFlags.CreationMode | LViewFlags.Attached | LViewFlags.FirstLViewPass; + resetPreOrderHookFlags(lView); + lView[PARENT] = lView[DECLARATION_VIEW] = parentLView; + lView[CONTEXT] = context; + lView[RENDERER_FACTORY] = (rendererFactory || parentLView && parentLView[RENDERER_FACTORY]) !; + ngDevMode && assertDefined(lView[RENDERER_FACTORY], 'RendererFactory is required'); + lView[RENDERER] = (renderer || parentLView && parentLView[RENDERER]) !; + ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required'); + lView[SANITIZER] = sanitizer || parentLView && parentLView[SANITIZER] || null !; + lView[INJECTOR as any] = injector || parentLView && parentLView[INJECTOR] || null; + lView[T_HOST] = tHostNode; + ngDevMode && attachLViewDebug(lView); + return lView; +} + +/** + * Create and stores the TNode, and hooks it up to the tree. + * + * @param index The index at which the TNode should be saved (null if view, since they are not + * saved). + * @param type The type of TNode to create + * @param native The native element for this node, if applicable + * @param name The tag name of the associated native element, if applicable + * @param attrs Any attrs for the native element, if applicable + */ +export function createNodeAtIndex( + index: number, type: TNodeType.Element, native: RElement | RText | null, name: string | null, + attrs: TAttributes | null): TElementNode; +export function createNodeAtIndex( + index: number, type: TNodeType.Container, native: RComment, name: string | null, + attrs: TAttributes | null): TContainerNode; +export function createNodeAtIndex( + index: number, type: TNodeType.Projection, native: null, name: null, + attrs: TAttributes | null): TProjectionNode; +export function createNodeAtIndex( + index: number, type: TNodeType.ElementContainer, native: RComment, name: string | null, + attrs: TAttributes | null): TElementContainerNode; +export function createNodeAtIndex( + index: number, type: TNodeType.IcuContainer, native: RComment, name: null, + attrs: TAttributes | null): TElementContainerNode; +export function createNodeAtIndex( + index: number, type: TNodeType, native: RText | RElement | RComment | null, name: string | null, + attrs: TAttributes | null): TElementNode&TContainerNode&TElementContainerNode&TProjectionNode& + TIcuContainerNode { + const lView = getLView(); + const tView = lView[TVIEW]; + const adjustedIndex = index + HEADER_OFFSET; + ngDevMode && + assertLessThan(adjustedIndex, lView.length, `Slot should have been initialized with null`); + lView[adjustedIndex] = native; + + const previousOrParentTNode = getPreviousOrParentTNode(); + const isParent = getIsParent(); + let tNode = tView.data[adjustedIndex] as TNode; + if (tNode == null) { + const parent = + isParent ? previousOrParentTNode : previousOrParentTNode && previousOrParentTNode.parent; + + // Parents cannot cross component boundaries because components will be used in multiple places, + // so it's only set if the view is the same. + const parentInSameView = parent && parent !== lView[T_HOST]; + const tParentNode = parentInSameView ? parent as TElementNode | TContainerNode : null; + + tNode = tView.data[adjustedIndex] = createTNode(tParentNode, type, adjustedIndex, name, attrs); + } + + // Now link ourselves into the tree. + // We need this even if tNode exists, otherwise we might end up pointing to unexisting tNodes when + // we use i18n (especially with ICU expressions that update the DOM during the update phase). + if (previousOrParentTNode) { + if (isParent && previousOrParentTNode.child == null && + (tNode.parent !== null || previousOrParentTNode.type === TNodeType.View)) { + // We are in the same view, which means we are adding content node to the parent view. + previousOrParentTNode.child = tNode; + } else if (!isParent) { + previousOrParentTNode.next = tNode; + } + } + + if (tView.firstChild == null) { + tView.firstChild = tNode; + } + + setPreviousOrParentTNode(tNode); + setIsParent(true); + return tNode as TElementNode & TViewNode & TContainerNode & TElementContainerNode & + TProjectionNode & TIcuContainerNode; +} + +export function assignTViewNodeToLView( + tView: TView, tParentNode: TNode | null, index: number, lView: LView): TViewNode { + // View nodes are not stored in data because they can be added / removed at runtime (which + // would cause indices to change). Their TNodes are instead stored in tView.node. + let tNode = tView.node; + if (tNode == null) { + ngDevMode && tParentNode && + assertNodeOfPossibleTypes(tParentNode, TNodeType.Element, TNodeType.Container); + tView.node = tNode = createTNode( + tParentNode as TElementNode | TContainerNode | null, // + TNodeType.View, index, null, null) as TViewNode; + } + + return lView[T_HOST] = tNode as TViewNode; +} + + +/** + * When elements are created dynamically after a view blueprint is created (e.g. through + * i18nApply() or ComponentFactory.create), we need to adjust the blueprint for future + * template passes. + */ +export function allocExpando(view: LView, numSlotsToAlloc: number) { + const tView = view[TVIEW]; + if (tView.firstTemplatePass) { + for (let i = 0; i < numSlotsToAlloc; i++) { + tView.blueprint.push(null); + tView.data.push(null); + view.push(null); + } + + // We should only increment the expando start index if there aren't already directives + // and injectors saved in the "expando" section + if (!tView.expandoInstructions) { + tView.expandoStartIndex += numSlotsToAlloc; + } else { + // Since we're adding the dynamic nodes into the expando section, we need to let the host + // bindings know that they should skip x slots + tView.expandoInstructions.push(numSlotsToAlloc); + } + } +} + + +////////////////////////// +//// Render +////////////////////////// + +/** + * + * @param hostNode Existing node to render into. + * @param templateFn Template function with the instructions. + * @param consts The number of nodes, local refs, and pipes in this template + * @param context to pass into the template. + * @param providedRendererFactory renderer factory to use + * @param host The host element node to use + * @param directives Directive defs that should be used for matching + * @param pipes Pipe defs that should be used for matching + */ +export function renderTemplate( + hostNode: RElement, templateFn: ComponentTemplate, consts: number, vars: number, context: T, + providedRendererFactory: RendererFactory3, componentView: LView | null, + directives?: DirectiveDefListOrFactory | null, pipes?: PipeDefListOrFactory | null, + sanitizer?: Sanitizer | null): LView { + if (componentView === null) { + resetComponentState(); + const renderer = providedRendererFactory.createRenderer(null, null); + + // We need to create a root view so it's possible to look up the host element through its index + const hostLView = createLView( + null, createTView(-1, null, 1, 0, null, null, null, null), {}, + LViewFlags.CheckAlways | LViewFlags.IsRoot, null, null, providedRendererFactory, renderer); + enterView(hostLView, null); // SUSPECT! why do we need to enter the View? + + const componentTView = + getOrCreateTView(templateFn, consts, vars, directives || null, pipes || null, null, null); + const hostTNode = createNodeAtIndex(0, TNodeType.Element, hostNode, null, null); + componentView = createLView( + hostLView, componentTView, context, LViewFlags.CheckAlways, hostNode, hostTNode, + providedRendererFactory, renderer, sanitizer); + } + renderComponentOrTemplate(componentView, context, templateFn); + return componentView; +} + +/** + * Used for creating the LViewNode of a dynamic embedded view, + * either through ViewContainerRef.createEmbeddedView() or TemplateRef.createEmbeddedView(). + * Such lViewNode will then be renderer with renderEmbeddedTemplate() (see below). + */ +export function createEmbeddedViewAndNode( + tView: TView, context: T, declarationView: LView, queries: LQueries | null, + injectorIndex: number): LView { + const _isParent = getIsParent(); + const _previousOrParentTNode = getPreviousOrParentTNode(); + setIsParent(true); + setPreviousOrParentTNode(null !); + + const lView = createLView(declarationView, tView, context, LViewFlags.CheckAlways, null, null); + lView[DECLARATION_VIEW] = declarationView; + + if (queries) { + lView[QUERIES] = queries.createView(); + } + assignTViewNodeToLView(tView, null, -1, lView); + + if (tView.firstTemplatePass) { + tView.node !.injectorIndex = injectorIndex; + } + + setIsParent(_isParent); + setPreviousOrParentTNode(_previousOrParentTNode); + return lView; +} + +/** + * Used for rendering embedded views (e.g. dynamically created views) + * + * Dynamically created views must store/retrieve their TViews differently from component views + * because their template functions are nested in the template functions of their hosts, creating + * closures. If their host template happens to be an embedded template in a loop (e.g. ngFor inside + * an ngFor), the nesting would mean we'd have multiple instances of the template function, so we + * can't store TViews in the template function itself (as we do for comps). Instead, we store the + * TView for dynamically created views on their host TNode, which only has one instance. + */ +export function renderEmbeddedTemplate(viewToRender: LView, tView: TView, context: T) { + const _isParent = getIsParent(); + const _previousOrParentTNode = getPreviousOrParentTNode(); + let oldView: LView; + if (viewToRender[FLAGS] & LViewFlags.IsRoot) { + // This is a root view inside the view tree + tickRootContext(getRootContext(viewToRender)); + } else { + try { + setIsParent(true); + setPreviousOrParentTNode(null !); + + oldView = enterView(viewToRender, viewToRender[T_HOST]); + resetPreOrderHookFlags(viewToRender); + namespaceHTML(); + + // Reset the selected index so we can assert that `select` was called later + ngDevMode && setSelectedIndex(-1); + + tView.template !(getRenderFlags(viewToRender), context); + // This must be set to false immediately after the first creation run because in an + // ngFor loop, all the views will be created together before update mode runs and turns + // off firstTemplatePass. If we don't set it here, instances will perform directive + // matching, etc again and again. + viewToRender[TVIEW].firstTemplatePass = false; + + refreshDescendantViews(viewToRender); + } finally { + leaveView(oldView !); + setIsParent(_isParent); + setPreviousOrParentTNode(_previousOrParentTNode); + } + } +} + +/** + * Retrieves a context at the level specified and saves it as the global, contextViewData. + * Will get the next level up if level is not specified. + * + * This is used to save contexts of parent views so they can be bound in embedded views, or + * in conjunction with reference() to bind a ref from a parent view. + * + * @param level The relative level of the view from which to grab context compared to contextVewData + * @returns context + */ +export function nextContext(level: number = 1): T { + return nextContextImpl(level); +} + +function renderComponentOrTemplate( + hostView: LView, context: T, templateFn?: ComponentTemplate) { + const rendererFactory = hostView[RENDERER_FACTORY]; + const oldView = enterView(hostView, hostView[T_HOST]); + const normalExecutionPath = !getCheckNoChangesMode(); + const creationModeIsActive = isCreationMode(hostView); + try { + if (normalExecutionPath && !creationModeIsActive && rendererFactory.begin) { + rendererFactory.begin(); + } + + if (creationModeIsActive) { + // creation mode pass + if (templateFn) { + namespaceHTML(); + + // Reset the selected index so we can assert that `select` was called later + ngDevMode && setSelectedIndex(-1); + + templateFn(RenderFlags.Create, context); + } + + refreshDescendantViews(hostView); + hostView[FLAGS] &= ~LViewFlags.CreationMode; + } + + // update mode pass + resetPreOrderHookFlags(hostView); + templateFn && templateFn(RenderFlags.Update, context); + refreshDescendantViews(hostView); + } finally { + if (normalExecutionPath && !creationModeIsActive && rendererFactory.end) { + rendererFactory.end(); + } + leaveView(oldView); + } +} + +/** + * This function returns the default configuration of rendering flags depending on when the + * template is in creation mode or update mode. Update block and create block are + * always run separately. + */ +function getRenderFlags(view: LView): RenderFlags { + return isCreationMode(view) ? RenderFlags.Create : RenderFlags.Update; +} + +////////////////////////// +//// Namespace +////////////////////////// + +let _currentNamespace: string|null = null; + +export function namespaceSVG() { + _currentNamespace = 'http://www.w3.org/2000/svg'; +} + +export function namespaceMathML() { + _currentNamespace = 'http://www.w3.org/1998/MathML/'; +} + +export function namespaceHTML() { + _currentNamespace = null; +} + +////////////////////////// +//// Element +////////////////////////// + +/** + * Creates an empty element using {@link elementStart} and {@link elementEnd} + * + * @param index Index of the element in the data array + * @param name Name of the DOM Node + * @param attrs Statically bound set of attributes, classes, and styles to be written into the DOM + * element on creation. Use [AttributeMarker] to denote the meaning of this array. + * @param localRefs A set of local reference bindings on the element. + */ +export function element( + index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void { + elementStart(index, name, attrs, localRefs); + elementEnd(); +} + +/** + * Creates a logical container for other nodes () backed by a comment node in the DOM. + * The instruction must later be followed by `elementContainerEnd()` call. + * + * @param index Index of the element in the LView array + * @param attrs Set of attributes to be used when matching directives. + * @param localRefs A set of local reference bindings on the element. + * + * Even if this instruction accepts a set of attributes no actual attribute values are propagated to + * the DOM (as a comment node can't have attributes). Attributes are here only for directive + * matching purposes and setting initial inputs of directives. + */ +export function elementContainerStart( + index: number, attrs?: TAttributes | null, localRefs?: string[] | null): void { + const lView = getLView(); + const tView = lView[TVIEW]; + const renderer = lView[RENDERER]; + const tagName = 'ng-container'; + ngDevMode && assertEqual( + lView[BINDING_INDEX], tView.bindingStartIndex, + 'element containers should be created before any bindings'); + + ngDevMode && ngDevMode.rendererCreateComment++; + const native = renderer.createComment(ngDevMode ? tagName : ''); + + ngDevMode && assertDataInRange(lView, index - 1); + const tNode = + createNodeAtIndex(index, TNodeType.ElementContainer, native, tagName, attrs || null); + + + if (attrs) { + // While ng-container doesn't necessarily support styling, we use the style context to identify + // and execute directives on the ng-container. + setNodeStylingTemplate(tView, tNode, attrs, 0); + } + + appendChild(native, tNode, lView); + createDirectivesAndLocals(tView, lView, localRefs); + attachPatchData(native, lView); + + const currentQueries = lView[QUERIES]; + if (currentQueries) { + currentQueries.addNode(tNode); + lView[QUERIES] = currentQueries.clone(); + } + executeContentQueries(tView, tNode, lView); +} + +/** + * Appropriately sets `stylingTemplate` on a TNode + * + * Does not apply styles to DOM nodes + * + * @param tNode The node whose `stylingTemplate` to set + * @param attrs The attribute array source to set the attributes from + * @param attrsStartIndex Optional start index to start processing the `attrs` from + */ +function setNodeStylingTemplate( + tView: TView, tNode: TNode, attrs: TAttributes, attrsStartIndex: number) { + if (tView.firstTemplatePass && !tNode.stylingTemplate) { + const stylingAttrsStartIndex = attrsStylingIndexOf(attrs, attrsStartIndex); + if (stylingAttrsStartIndex >= 0) { + tNode.stylingTemplate = initializeStaticStylingContext(attrs, stylingAttrsStartIndex); + } + } +} + +function executeContentQueries(tView: TView, tNode: TNode, lView: LView) { + if (isContentQueryHost(tNode)) { + const start = tNode.directiveStart; + const end = tNode.directiveEnd; + for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { + const def = tView.data[directiveIndex] as DirectiveDef; + if (def.contentQueries) { + def.contentQueries(RenderFlags.Create, lView[directiveIndex], directiveIndex); + } + } + } +} + +/** Mark the end of the . */ +export function elementContainerEnd(): void { + let previousOrParentTNode = getPreviousOrParentTNode(); + const lView = getLView(); + const tView = lView[TVIEW]; + if (getIsParent()) { + setIsParent(false); + } else { + ngDevMode && assertHasParent(previousOrParentTNode); + previousOrParentTNode = previousOrParentTNode.parent !; + setPreviousOrParentTNode(previousOrParentTNode); + } + + ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.ElementContainer); + const currentQueries = lView[QUERIES]; + if (currentQueries) { + lView[QUERIES] = currentQueries.parent; + } + + registerPostOrderHooks(tView, previousOrParentTNode); +} + +/** + * Create DOM element. The instruction must later be followed by `elementEnd()` call. + * + * @param index Index of the element in the LView array + * @param name Name of the DOM Node + * @param attrs Statically bound set of attributes, classes, and styles to be written into the DOM + * element on creation. Use [AttributeMarker] to denote the meaning of this array. + * @param localRefs A set of local reference bindings on the element. + * + * Attributes and localRefs are passed as an array of strings where elements with an even index + * hold an attribute name and elements with an odd index hold an attribute value, ex.: + * ['id', 'warning5', 'class', 'alert'] + */ +export function elementStart( + index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void { + const lView = getLView(); + const tView = lView[TVIEW]; + ngDevMode && assertEqual( + lView[BINDING_INDEX], tView.bindingStartIndex, + 'elements should be created before any bindings '); + + ngDevMode && ngDevMode.rendererCreateElement++; + + const native = elementCreate(name); + const renderer = lView[RENDERER]; + + ngDevMode && assertDataInRange(lView, index - 1); + + const tNode = createNodeAtIndex(index, TNodeType.Element, native !, name, attrs || null); + let initialStylesIndex = 0; + let initialClassesIndex = 0; + + if (attrs) { + const lastAttrIndex = setUpAttributes(native, attrs); + + // it's important to only prepare styling-related datastructures once for a given + // tNode and not each time an element is created. Also, the styling code is designed + // to be patched and constructed at various points, but only up until the styling + // template is first allocated (which happens when the very first style/class binding + // value is evaluated). When the template is allocated (when it turns into a context) + // then the styling template is locked and cannot be further extended (it can only be + // instantiated into a context per element) + setNodeStylingTemplate(tView, tNode, attrs, lastAttrIndex); + + if (tNode.stylingTemplate) { + // the initial style/class values are rendered immediately after having been + // initialized into the context so the element styling is ready when directives + // are initialized (since they may read style/class values in their constructor) + initialStylesIndex = renderInitialStyles(native, tNode.stylingTemplate, renderer); + initialClassesIndex = renderInitialClasses(native, tNode.stylingTemplate, renderer); + } + } + + appendChild(native, tNode, lView); + createDirectivesAndLocals(tView, lView, localRefs); + + // any immediate children of a component or template container must be pre-emptively + // monkey-patched with the component view data so that the element can be inspected + // later on using any element discovery utility methods (see `element_discovery.ts`) + if (getElementDepthCount() === 0) { + attachPatchData(native, lView); + } + increaseElementDepthCount(); + + // if a directive contains a host binding for "class" then all class-based data will + // flow through that (except for `[class.prop]` bindings). This also includes initial + // static class values as well. (Note that this will be fixed once map-based `[style]` + // and `[class]` bindings work for multiple directives.) + if (tView.firstTemplatePass) { + const inputData = initializeTNodeInputs(tNode); + if (inputData && inputData.hasOwnProperty('class')) { + tNode.flags |= TNodeFlags.hasClassInput; + } + if (inputData && inputData.hasOwnProperty('style')) { + tNode.flags |= TNodeFlags.hasStyleInput; + } + } + + // we render the styling again below in case any directives have set any `style` and/or + // `class` host attribute values... + if (tNode.stylingTemplate) { + renderInitialClasses(native, tNode.stylingTemplate, renderer, initialClassesIndex); + renderInitialStyles(native, tNode.stylingTemplate, renderer, initialStylesIndex); + } + + const currentQueries = lView[QUERIES]; + if (currentQueries) { + currentQueries.addNode(tNode); + lView[QUERIES] = currentQueries.clone(); + } + executeContentQueries(tView, tNode, lView); +} + +/** + * Creates a native element from a tag name, using a renderer. + * @param name the tag name + * @param overriddenRenderer Optional A renderer to override the default one + * @returns the element created + */ +export function elementCreate(name: string, overriddenRenderer?: Renderer3): RElement { + let native: RElement; + const rendererToUse = overriddenRenderer || getLView()[RENDERER]; + + if (isProceduralRenderer(rendererToUse)) { + native = rendererToUse.createElement(name, _currentNamespace); + } else { + if (_currentNamespace === null) { + native = rendererToUse.createElement(name); + } else { + native = rendererToUse.createElementNS(_currentNamespace, name); + } + } + return native; +} + +/** + * Creates directive instances and populates local refs. + * + * @param localRefs Local refs of the node in question + * @param localRefExtractor mapping function that extracts local ref value from TNode + */ +function createDirectivesAndLocals( + tView: TView, lView: LView, localRefs: string[] | null | undefined, + localRefExtractor: LocalRefExtractor = getNativeByTNode) { + if (!getBindingsEnabled()) return; + const previousOrParentTNode = getPreviousOrParentTNode(); + if (tView.firstTemplatePass) { + ngDevMode && ngDevMode.firstTemplatePass++; + resolveDirectives( + tView, lView, findDirectiveMatches(tView, lView, previousOrParentTNode), + previousOrParentTNode, localRefs || null); + } + instantiateAllDirectives(tView, lView, previousOrParentTNode); + invokeDirectivesHostBindings(tView, lView, previousOrParentTNode); + saveResolvedLocalsInData(lView, previousOrParentTNode, localRefExtractor); +} + +/** + * Takes a list of local names and indices and pushes the resolved local variable values + * to LView in the same order as they are loaded in the template with load(). + */ +function saveResolvedLocalsInData( + viewData: LView, tNode: TNode, localRefExtractor: LocalRefExtractor): void { + const localNames = tNode.localNames; + if (localNames) { + let localIndex = tNode.index + 1; + for (let i = 0; i < localNames.length; i += 2) { + const index = localNames[i + 1] as number; + const value = index === -1 ? + localRefExtractor( + tNode as TElementNode | TContainerNode | TElementContainerNode, viewData) : + viewData[index]; + viewData[localIndex++] = value; + } + } +} + +/** + * Gets TView from a template function or creates a new TView + * if it doesn't already exist. + * + * @param templateFn The template from which to get static data + * @param consts The number of nodes, local refs, and pipes in this view + * @param vars The number of bindings and pure function bindings in this view + * @param directives Directive defs that should be saved on TView + * @param pipes Pipe defs that should be saved on TView + * @param viewQuery View query that should be saved on TView + * @param schemas Schemas that should be saved on TView + * @returns TView + */ +export function getOrCreateTView( + templateFn: ComponentTemplate, consts: number, vars: number, + directives: DirectiveDefListOrFactory | null, pipes: PipeDefListOrFactory | null, + viewQuery: ViewQueriesFunction| null, schemas: SchemaMetadata[] | null): TView { + // TODO(misko): reading `ngPrivateData` here is problematic for two reasons + // 1. It is a megamorphic call on each invocation. + // 2. For nested embedded views (ngFor inside ngFor) the template instance is per + // outer template invocation, which means that no such property will exist + // Correct solution is to only put `ngPrivateData` on the Component template + // and not on embedded templates. + + return templateFn.ngPrivateData || + (templateFn.ngPrivateData = createTView( + -1, templateFn, consts, vars, directives, pipes, viewQuery, schemas) as never); +} + +/** + * Creates a TView instance + * + * @param viewIndex The viewBlockId for inline views, or -1 if it's a component/dynamic + * @param templateFn Template function + * @param consts The number of nodes, local refs, and pipes in this template + * @param directives Registry of directives for this view + * @param pipes Registry of pipes for this view + * @param viewQuery View queries for this view + * @param schemas Schemas for this view + */ +export function createTView( + viewIndex: number, templateFn: ComponentTemplate| null, consts: number, vars: number, + directives: DirectiveDefListOrFactory | null, pipes: PipeDefListOrFactory | null, + viewQuery: ViewQueriesFunction| null, schemas: SchemaMetadata[] | null): TView { + ngDevMode && ngDevMode.tView++; + const bindingStartIndex = HEADER_OFFSET + consts; + // This length does not yet contain host bindings from child directives because at this point, + // we don't know which directives are active on this template. As soon as a directive is matched + // that has a host binding, we will update the blueprint with that def's hostVars count. + const initialViewLength = bindingStartIndex + vars; + const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength); + return blueprint[TVIEW as any] = { + id: viewIndex, + blueprint: blueprint, + template: templateFn, + viewQuery: viewQuery, + node: null !, + data: blueprint.slice().fill(null, bindingStartIndex), + bindingStartIndex: bindingStartIndex, + viewQueryStartIndex: initialViewLength, + expandoStartIndex: initialViewLength, + expandoInstructions: null, + firstTemplatePass: true, + staticViewQueries: false, + staticContentQueries: false, + preOrderHooks: null, + preOrderCheckHooks: null, + contentHooks: null, + contentCheckHooks: null, + viewHooks: null, + viewCheckHooks: null, + destroyHooks: null, + cleanup: null, + contentQueries: null, + components: null, + directiveRegistry: typeof directives === 'function' ? directives() : directives, + pipeRegistry: typeof pipes === 'function' ? pipes() : pipes, + firstChild: null, + schemas: schemas, + }; +} + +function createViewBlueprint(bindingStartIndex: number, initialViewLength: number): LView { + const blueprint = new Array(initialViewLength) + .fill(null, 0, bindingStartIndex) + .fill(NO_CHANGE, bindingStartIndex) as LView; + blueprint[BINDING_INDEX] = bindingStartIndex; + return blueprint; +} + +export function createError(text: string, token: any) { + return new Error(`Renderer: ${text} [${renderStringify(token)}]`); +} + + +/** + * Locates the host native element, used for bootstrapping existing nodes into rendering pipeline. + * + * @param elementOrSelector Render element or CSS selector to locate the element. + */ +export function locateHostElement( + factory: RendererFactory3, elementOrSelector: RElement | string): RElement|null { + const defaultRenderer = factory.createRenderer(null, null); + const rNode = typeof elementOrSelector === 'string' ? + (isProceduralRenderer(defaultRenderer) ? + defaultRenderer.selectRootElement(elementOrSelector) : + defaultRenderer.querySelector(elementOrSelector)) : + elementOrSelector; + if (ngDevMode && !rNode) { + if (typeof elementOrSelector === 'string') { + throw createError('Host node with selector not found:', elementOrSelector); + } else { + throw createError('Host node is required:', elementOrSelector); + } + } + return rNode; +} + +/** + * Adds an event listener to the current node. + * + * If an output exists on one of the node's directives, it also subscribes to the output + * and saves the subscription for later cleanup. + * + * @param eventName Name of the event + * @param listenerFn The function to be called when event emits + * @param useCapture Whether or not to use capture in event listener + * @param eventTargetResolver Function that returns global target information in case this listener + * should be attached to a global object like window, document or body + */ +export function listener( + eventName: string, listenerFn: (e?: any) => any, useCapture = false, + eventTargetResolver?: GlobalTargetResolver): void { + listenerInternal(eventName, listenerFn, useCapture, eventTargetResolver); +} + +/** + * Registers a synthetic host listener (e.g. `(@foo.start)`) on a component. + * + * This instruction is for compatibility purposes and is designed to ensure that a + * synthetic host listener (e.g. `@HostListener('@foo.start')`) properly gets rendered + * in the component's renderer. Normally all host listeners are evaluated with the + * parent component's renderer, but, in the case of animation @triggers, they need + * to be evaluated with the sub component's renderer (because that's where the + * animation triggers are defined). + * + * Do not use this instruction as a replacement for `listener`. This instruction + * only exists to ensure compatibility with the ViewEngine's host binding behavior. + * + * @param eventName Name of the event + * @param listenerFn The function to be called when event emits + * @param useCapture Whether or not to use capture in event listener + * @param eventTargetResolver Function that returns global target information in case this listener + * should be attached to a global object like window, document or body + */ +export function componentHostSyntheticListener( + eventName: string, listenerFn: (e?: any) => any, useCapture = false, + eventTargetResolver?: GlobalTargetResolver): void { + listenerInternal(eventName, listenerFn, useCapture, eventTargetResolver, loadComponentRenderer); +} + +function listenerInternal( + eventName: string, listenerFn: (e?: any) => any, useCapture = false, + eventTargetResolver?: GlobalTargetResolver, + loadRendererFn?: ((tNode: TNode, lView: LView) => Renderer3) | null): void { + const lView = getLView(); + const tNode = getPreviousOrParentTNode(); + const tView = lView[TVIEW]; + const firstTemplatePass = tView.firstTemplatePass; + const tCleanup: false|any[] = firstTemplatePass && (tView.cleanup || (tView.cleanup = [])); + + ngDevMode && assertNodeOfPossibleTypes( + tNode, TNodeType.Element, TNodeType.Container, TNodeType.ElementContainer); + + // add native event listener - applicable to elements only + if (tNode.type === TNodeType.Element) { + const native = getNativeByTNode(tNode, lView) as RElement; + const resolved = eventTargetResolver ? eventTargetResolver(native) : {} as any; + const target = resolved.target || native; + ngDevMode && ngDevMode.rendererAddEventListener++; + const renderer = loadRendererFn ? loadRendererFn(tNode, lView) : lView[RENDERER]; + const lCleanup = getCleanup(lView); + const lCleanupIndex = lCleanup.length; + let useCaptureOrSubIdx: boolean|number = useCapture; + + // In order to match current behavior, native DOM event listeners must be added for all + // events (including outputs). + if (isProceduralRenderer(renderer)) { + // The first argument of `listen` function in Procedural Renderer is: + // - either a target name (as a string) in case of global target (window, document, body) + // - or element reference (in all other cases) + listenerFn = wrapListener(tNode, lView, listenerFn, false /** preventDefault */); + const cleanupFn = renderer.listen(resolved.name || target, eventName, listenerFn); + lCleanup.push(listenerFn, cleanupFn); + useCaptureOrSubIdx = lCleanupIndex + 1; + } else { + listenerFn = wrapListener(tNode, lView, listenerFn, true /** preventDefault */); + target.addEventListener(eventName, listenerFn, useCapture); + lCleanup.push(listenerFn); + } + + const idxOrTargetGetter = eventTargetResolver ? + (_lView: LView) => eventTargetResolver(unwrapRNode(_lView[tNode.index])).target : + tNode.index; + tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, useCaptureOrSubIdx); + } + + // subscribe to directive outputs + if (tNode.outputs === undefined) { + // if we create TNode here, inputs must be undefined so we know they still need to be + // checked + tNode.outputs = generatePropertyAliases(tNode, BindingDirection.Output); + } + + const outputs = tNode.outputs; + let props: PropertyAliasValue|undefined; + if (outputs && (props = outputs[eventName])) { + const propsLength = props.length; + if (propsLength) { + const lCleanup = getCleanup(lView); + for (let i = 0; i < propsLength; i += 3) { + const index = props[i] as number; + ngDevMode && assertDataInRange(lView, index); + const minifiedName = props[i + 2]; + const directiveInstance = lView[index]; + const output = directiveInstance[minifiedName]; + + if (ngDevMode && !isObservable(output)) { + throw new Error( + `@Output ${minifiedName} not initialized in '${directiveInstance.constructor.name}'.`); + } + + const subscription = output.subscribe(listenerFn); + const idx = lCleanup.length; + lCleanup.push(listenerFn, subscription); + tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1)); + } + } + } +} + +/** + * Saves context for this cleanup function in LView.cleanupInstances. + * + * On the first template pass, saves in TView: + * - Cleanup function + * - Index of context we just saved in LView.cleanupInstances + */ +export function storeCleanupWithContext(lView: LView, context: any, cleanupFn: Function): void { + const lCleanup = getCleanup(lView); + lCleanup.push(context); + + if (lView[TVIEW].firstTemplatePass) { + getTViewCleanup(lView).push(cleanupFn, lCleanup.length - 1); + } +} + +/** + * Saves the cleanup function itself in LView.cleanupInstances. + * + * This is necessary for functions that are wrapped with their contexts, like in renderer2 + * listeners. + * + * On the first template pass, the index of the cleanup function is saved in TView. + */ +export function storeCleanupFn(view: LView, cleanupFn: Function): void { + getCleanup(view).push(cleanupFn); + + if (view[TVIEW].firstTemplatePass) { + getTViewCleanup(view).push(view[CLEANUP] !.length - 1, null); + } +} + +/** Mark the end of the element. */ +export function elementEnd(): void { + let previousOrParentTNode = getPreviousOrParentTNode(); + if (getIsParent()) { + setIsParent(false); + } else { + ngDevMode && assertHasParent(getPreviousOrParentTNode()); + previousOrParentTNode = previousOrParentTNode.parent !; + setPreviousOrParentTNode(previousOrParentTNode); + } + + // this is required for all host-level styling-related instructions to run + // in the correct order + previousOrParentTNode.onElementCreationFns && applyOnCreateInstructions(previousOrParentTNode); + + ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.Element); + const lView = getLView(); + const currentQueries = lView[QUERIES]; + if (currentQueries) { + lView[QUERIES] = currentQueries.parent; + } + + registerPostOrderHooks(getLView()[TVIEW], previousOrParentTNode); + decreaseElementDepthCount(); + + // this is fired at the end of elementEnd because ALL of the stylingBindings code + // (for directives and the template) have now executed which means the styling + // context can be instantiated properly. + if (hasClassInput(previousOrParentTNode)) { + const stylingContext = getStylingContext(previousOrParentTNode.index, lView); + setInputsForProperty( + lView, previousOrParentTNode.inputs !['class'] !, getInitialClassNameValue(stylingContext)); + } + if (hasStyleInput(previousOrParentTNode)) { + const stylingContext = getStylingContext(previousOrParentTNode.index, lView); + setInputsForProperty( + lView, previousOrParentTNode.inputs !['style'] !, + getInitialStyleStringValue(stylingContext)); + } +} + + +/** + * Selects an index of an item to act on and flushes lifecycle hooks up to this point + * + * Used in conjunction with instructions like {@link property} to act on elements with specified + * indices, for example those created with {@link element} or {@link elementStart}. + * + * ```ts + * (rf: RenderFlags, ctx: any) => { + * if (rf & 1) { + * element(0, 'div'); + * } + * if (rf & 2) { + * select(0); // Select the
created above. + * property('title', 'test'); + * } + * } + * ``` + * @param index the index of the item to act on with the following instructions + */ +export function select(index: number): void { + ngDevMode && assertGreaterThan(index, -1, 'Invalid index'); + ngDevMode && + assertLessThan( + index, getLView().length - HEADER_OFFSET, 'Should be within range for the view data'); + setSelectedIndex(index); + const lView = getLView(); + executePreOrderHooks(lView, lView[TVIEW], getCheckNoChangesMode(), index); +} + +/** + * Updates the value of removes an attribute on an Element. + * + * @param number index The index of the element in the data array + * @param name name The name of the attribute. + * @param value value The attribute is removed when value is `null` or `undefined`. + * Otherwise the attribute value is set to the stringified value. + * @param sanitizer An optional function used to sanitize the value. + * @param namespace Optional namespace to use when setting the attribute. + */ +export function elementAttribute( + index: number, name: string, value: any, sanitizer?: SanitizerFn | null, + namespace?: string): void { + if (value !== NO_CHANGE) { + ngDevMode && validateAgainstEventAttributes(name); + const lView = getLView(); + const renderer = lView[RENDERER]; + const element = getNativeByIndex(index, lView) as RElement; + if (value == null) { + ngDevMode && ngDevMode.rendererRemoveAttribute++; + isProceduralRenderer(renderer) ? renderer.removeAttribute(element, name, namespace) : + element.removeAttribute(name); + } else { + ngDevMode && ngDevMode.rendererSetAttribute++; + const tNode = getTNode(index, lView); + const strValue = + sanitizer == null ? renderStringify(value) : sanitizer(value, tNode.tagName || '', name); + + + if (isProceduralRenderer(renderer)) { + renderer.setAttribute(element, name, strValue, namespace); + } else { + namespace ? element.setAttributeNS(namespace, name, strValue) : + element.setAttribute(name, strValue); + } + } + } +} + +/** + * **TODO: Remove this function after `property` is in use** + * Update a property on an element. + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new @Inputs don't have to be re-compiled. + * + * @param index The index of the element to update in the data array + * @param propName Name of property. Because it is going to DOM, this is not subject to + * renaming as part of minification. + * @param value New value to write. + * @param sanitizer An optional function used to sanitize the value. + * @param nativeOnly Whether or not we should only set native properties and skip input check + * (this is necessary for host property bindings) + */ +export function elementProperty( + index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, + nativeOnly?: boolean): void { + elementPropertyInternal(index, propName, value, sanitizer, nativeOnly); +} + +/** + * Updates a synthetic host binding (e.g. `[@foo]`) on a component. + * + * This instruction is for compatibility purposes and is designed to ensure that a + * synthetic host binding (e.g. `@HostBinding('@foo')`) properly gets rendered in + * the component's renderer. Normally all host bindings are evaluated with the parent + * component's renderer, but, in the case of animation @triggers, they need to be + * evaluated with the sub component's renderer (because that's where the animation + * triggers are defined). + * + * Do not use this instruction as a replacement for `elementProperty`. This instruction + * only exists to ensure compatibility with the ViewEngine's host binding behavior. + * + * @param index The index of the element to update in the data array + * @param propName Name of property. Because it is going to DOM, this is not subject to + * renaming as part of minification. + * @param value New value to write. + * @param sanitizer An optional function used to sanitize the value. + * @param nativeOnly Whether or not we should only set native properties and skip input check + * (this is necessary for host property bindings) + */ +export function componentHostSyntheticProperty( + index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, + nativeOnly?: boolean) { + elementPropertyInternal(index, propName, value, sanitizer, nativeOnly, loadComponentRenderer); +} + +/** + * Constructs a TNode object from the arguments. + * + * @param type The type of the node + * @param adjustedIndex The index of the TNode in TView.data, adjusted for HEADER_OFFSET + * @param tagName The tag name of the node + * @param attrs The attributes defined on this node + * @param tViews Any TViews attached to this node + * @returns the TNode object + */ +export function createTNode( + tParent: TElementNode | TContainerNode | null, type: TNodeType, adjustedIndex: number, + tagName: string | null, attrs: TAttributes | null): TNode { + ngDevMode && ngDevMode.tNode++; + return { + type: type, + index: adjustedIndex, + injectorIndex: tParent ? tParent.injectorIndex : -1, + directiveStart: -1, + directiveEnd: -1, + propertyMetadataStartIndex: -1, + propertyMetadataEndIndex: -1, + flags: 0, + providerIndexes: 0, + tagName: tagName, + attrs: attrs, + localNames: null, + initialInputs: undefined, + inputs: undefined, + outputs: undefined, + tViews: null, + next: null, + projectionNext: null, + child: null, + parent: tParent, + stylingTemplate: null, + projection: null, + onElementCreationFns: null, + }; +} + +/** + * Assign static attribute values to a host element. + * + * This instruction will assign static attribute values as well as class and style + * values to an element within the host bindings function. Since attribute values + * can consist of different types of values, the `attrs` array must include the values in + * the following format: + * + * attrs = [ + * // static attributes (like `title`, `name`, `id`...) + * attr1, value1, attr2, value, + * + * // a single namespace value (like `x:id`) + * NAMESPACE_MARKER, namespaceUri1, name1, value1, + * + * // another single namespace value (like `x:name`) + * NAMESPACE_MARKER, namespaceUri2, name2, value2, + * + * // a series of CSS classes that will be applied to the element (no spaces) + * CLASSES_MARKER, class1, class2, class3, + * + * // a series of CSS styles (property + value) that will be applied to the element + * STYLES_MARKER, prop1, value1, prop2, value2 + * ] + * + * All non-class and non-style attributes must be defined at the start of the list + * first before all class and style values are set. When there is a change in value + * type (like when classes and styles are introduced) a marker must be used to separate + * the entries. The marker values themselves are set via entries found in the + * [AttributeMarker] enum. + * + * NOTE: This instruction is meant to used from `hostBindings` function only. + * + * @param directive A directive instance the styling is associated with. + * @param attrs An array of static values (attributes, classes and styles) with the correct marker + * values. + * + * @publicApi + */ +export function elementHostAttrs(attrs: TAttributes) { + const tNode = getPreviousOrParentTNode(); + const lView = getLView(); + const native = getNativeByTNode(tNode, lView) as RElement; + const lastAttrIndex = setUpAttributes(native, attrs); + const stylingAttrsStartIndex = attrsStylingIndexOf(attrs, lastAttrIndex); + if (stylingAttrsStartIndex >= 0) { + const directive = getActiveHostContext(); + if (tNode.stylingTemplate) { + patchContextWithStaticAttrs(tNode.stylingTemplate, attrs, stylingAttrsStartIndex, directive); + } else { + tNode.stylingTemplate = + initializeStaticStylingContext(attrs, stylingAttrsStartIndex, directive); + } + } +} + +////////////////////////// +//// Text +////////////////////////// + +/** + * Create static text node + * + * @param index Index of the node in the data array + * @param value Value to write. This value will be stringified. + */ +export function text(index: number, value?: any): void { + const lView = getLView(); + ngDevMode && assertEqual( + lView[BINDING_INDEX], lView[TVIEW].bindingStartIndex, + 'text nodes should be created before any bindings'); + ngDevMode && ngDevMode.rendererCreateTextNode++; + const textNative = createTextNode(value, lView[RENDERER]); + const tNode = createNodeAtIndex(index, TNodeType.Element, textNative, null, null); + + // Text nodes are self closing. + setIsParent(false); + appendChild(textNative, tNode, lView); +} + +/** + * Create text node with binding + * Bindings should be handled externally with the proper interpolation(1-8) method + * + * @param index Index of the node in the data array. + * @param value Stringified value to write. + */ +export function textBinding(index: number, value: T | NO_CHANGE): void { + if (value !== NO_CHANGE) { + const lView = getLView(); + ngDevMode && assertDataInRange(lView, index + HEADER_OFFSET); + const element = getNativeByIndex(index, lView) as any as RText; + ngDevMode && assertDefined(element, 'native element should exist'); + ngDevMode && ngDevMode.rendererSetText++; + const renderer = lView[RENDERER]; + isProceduralRenderer(renderer) ? renderer.setValue(element, renderStringify(value)) : + element.textContent = renderStringify(value); + } +} + +////////////////////////// +//// Directive +////////////////////////// + +/** + * Instantiate a root component. + */ +export function instantiateRootComponent( + tView: TView, viewData: LView, def: ComponentDef): T { + const rootTNode = getPreviousOrParentTNode(); + if (tView.firstTemplatePass) { + if (def.providersResolver) def.providersResolver(def); + generateExpandoInstructionBlock(tView, rootTNode, 1); + baseResolveDirective(tView, viewData, def, def.factory); + } + const directive = + getNodeInjectable(tView.data, viewData, viewData.length - 1, rootTNode as TElementNode); + postProcessBaseDirective(viewData, rootTNode, directive); + return directive; +} + +/** + * Resolve the matched directives on a node. + */ +function resolveDirectives( + tView: TView, viewData: LView, directives: DirectiveDef[] | null, tNode: TNode, + localRefs: string[] | null): void { + // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in tsickle. + ngDevMode && assertEqual(tView.firstTemplatePass, true, 'should run on first template pass only'); + const exportsMap: ({[key: string]: number} | null) = localRefs ? {'': -1} : null; + if (directives) { + initNodeFlags(tNode, tView.data.length, directives.length); + // When the same token is provided by several directives on the same node, some rules apply in + // the viewEngine: + // - viewProviders have priority over providers + // - the last directive in NgModule.declarations has priority over the previous one + // So to match these rules, the order in which providers are added in the arrays is very + // important. + for (let i = 0; i < directives.length; i++) { + const def = directives[i] as DirectiveDef; + if (def.providersResolver) def.providersResolver(def); + } + generateExpandoInstructionBlock(tView, tNode, directives.length); + const initialPreOrderHooksLength = (tView.preOrderHooks && tView.preOrderHooks.length) || 0; + const initialPreOrderCheckHooksLength = + (tView.preOrderCheckHooks && tView.preOrderCheckHooks.length) || 0; + const nodeIndex = tNode.index - HEADER_OFFSET; + for (let i = 0; i < directives.length; i++) { + const def = directives[i] as DirectiveDef; + + const directiveDefIdx = tView.data.length; + baseResolveDirective(tView, viewData, def, def.factory); + + saveNameToExportMap(tView.data !.length - 1, def, exportsMap); + + // Init hooks are queued now so ngOnInit is called in host components before + // any projected components. + registerPreOrderHooks( + directiveDefIdx, def, tView, nodeIndex, initialPreOrderHooksLength, + initialPreOrderCheckHooksLength); + } + } + if (exportsMap) cacheMatchingLocalNames(tNode, localRefs, exportsMap); +} + +/** + * Instantiate all the directives that were previously resolved on the current node. + */ +function instantiateAllDirectives(tView: TView, lView: LView, tNode: TNode) { + const start = tNode.directiveStart; + const end = tNode.directiveEnd; + if (!tView.firstTemplatePass && start < end) { + getOrCreateNodeInjectorForNode( + tNode as TElementNode | TContainerNode | TElementContainerNode, lView); + } + for (let i = start; i < end; i++) { + const def = tView.data[i] as DirectiveDef; + if (isComponentDef(def)) { + addComponentLogic(lView, tNode, def as ComponentDef); + } + const directive = getNodeInjectable(tView.data, lView !, i, tNode as TElementNode); + postProcessDirective(lView, directive, def, i); + } +} + +function invokeDirectivesHostBindings(tView: TView, viewData: LView, tNode: TNode) { + const start = tNode.directiveStart; + const end = tNode.directiveEnd; + const expando = tView.expandoInstructions !; + const firstTemplatePass = tView.firstTemplatePass; + for (let i = start; i < end; i++) { + const def = tView.data[i] as DirectiveDef; + const directive = viewData[i]; + if (def.hostBindings) { + invokeHostBindingsInCreationMode(def, expando, directive, tNode, firstTemplatePass); + } else if (firstTemplatePass) { + expando.push(null); + } + } +} + +export function invokeHostBindingsInCreationMode( + def: DirectiveDef, expando: ExpandoInstructions, directive: any, tNode: TNode, + firstTemplatePass: boolean) { + const previousExpandoLength = expando.length; + setCurrentDirectiveDef(def); + const elementIndex = tNode.index - HEADER_OFFSET; + setActiveHost(directive, elementIndex); + def.hostBindings !(RenderFlags.Create, directive, elementIndex); + setActiveHost(null); + setCurrentDirectiveDef(null); + // `hostBindings` function may or may not contain `allocHostVars` call + // (e.g. it may not if it only contains host listeners), so we need to check whether + // `expandoInstructions` has changed and if not - we still push `hostBindings` to + // expando block, to make sure we execute it for DI cycle + if (previousExpandoLength === expando.length && firstTemplatePass) { + expando.push(def.hostBindings); + } +} + +/** +* Generates a new block in TView.expandoInstructions for this node. +* +* Each expando block starts with the element index (turned negative so we can distinguish +* it from the hostVar count) and the directive count. See more in VIEW_DATA.md. +*/ +export function generateExpandoInstructionBlock( + tView: TView, tNode: TNode, directiveCount: number): void { + ngDevMode && assertEqual( + tView.firstTemplatePass, true, + 'Expando block should only be generated on first template pass.'); + + const elementIndex = -(tNode.index - HEADER_OFFSET); + const providerStartIndex = tNode.providerIndexes & TNodeProviderIndexes.ProvidersStartIndexMask; + const providerCount = tView.data.length - providerStartIndex; + (tView.expandoInstructions || (tView.expandoInstructions = [ + ])).push(elementIndex, providerCount, directiveCount); +} + +/** +* On the first template pass, we need to reserve space for host binding values +* after directives are matched (so all directives are saved, then bindings). +* Because we are updating the blueprint, we only need to do this once. +*/ +function prefillHostVars(tView: TView, lView: LView, totalHostVars: number): void { + ngDevMode && + assertEqual(tView.firstTemplatePass, true, 'Should only be called in first template pass.'); + for (let i = 0; i < totalHostVars; i++) { + lView.push(NO_CHANGE); + tView.blueprint.push(NO_CHANGE); + tView.data.push(null); + } +} + +/** + * Process a directive on the current node after its creation. + */ +function postProcessDirective( + viewData: LView, directive: T, def: DirectiveDef, directiveDefIdx: number): void { + const previousOrParentTNode = getPreviousOrParentTNode(); + postProcessBaseDirective(viewData, previousOrParentTNode, directive); + ngDevMode && assertDefined(previousOrParentTNode, 'previousOrParentTNode'); + if (previousOrParentTNode && previousOrParentTNode.attrs) { + setInputsFromAttrs(directiveDefIdx, directive, def, previousOrParentTNode); + } + + if (viewData[TVIEW].firstTemplatePass && def.contentQueries) { + previousOrParentTNode.flags |= TNodeFlags.hasContentQuery; + } + + if (isComponentDef(def)) { + const componentView = getComponentViewByIndex(previousOrParentTNode.index, viewData); + componentView[CONTEXT] = directive; + } +} + +/** + * A lighter version of postProcessDirective() that is used for the root component. + */ +function postProcessBaseDirective( + lView: LView, previousOrParentTNode: TNode, directive: T): void { + const native = getNativeByTNode(previousOrParentTNode, lView); + + ngDevMode && assertEqual( + lView[BINDING_INDEX], lView[TVIEW].bindingStartIndex, + 'directives should be created before any bindings'); + ngDevMode && assertPreviousIsParent(getIsParent()); + + attachPatchData(directive, lView); + if (native) { + attachPatchData(native, lView); + } +} + + + +/** +* Matches the current node against all available selectors. +* If a component is matched (at most one), it is returned in first position in the array. +*/ +function findDirectiveMatches(tView: TView, viewData: LView, tNode: TNode): DirectiveDef[]| + null { + ngDevMode && assertEqual(tView.firstTemplatePass, true, 'should run on first template pass only'); + const registry = tView.directiveRegistry; + let matches: any[]|null = null; + if (registry) { + for (let i = 0; i < registry.length; i++) { + const def = registry[i] as ComponentDef| DirectiveDef; + if (isNodeMatchingSelectorList(tNode, def.selectors !, /* isProjectionMode */ false)) { + matches || (matches = []); + diPublicInInjector( + getOrCreateNodeInjectorForNode( + getPreviousOrParentTNode() as TElementNode | TContainerNode | TElementContainerNode, + viewData), + viewData, def.type); + + if (isComponentDef(def)) { + if (tNode.flags & TNodeFlags.isComponent) throwMultipleComponentError(tNode); + tNode.flags = TNodeFlags.isComponent; + + // The component is always stored first with directives after. + matches.unshift(def); + } else { + matches.push(def); + } + } + } + } + return matches; +} + +/** Stores index of component's host element so it will be queued for view refresh during CD. */ +export function queueComponentIndexForCheck(previousOrParentTNode: TNode): void { + const tView = getLView()[TVIEW]; + ngDevMode && + assertEqual(tView.firstTemplatePass, true, 'Should only be called in first template pass.'); + (tView.components || (tView.components = [])).push(previousOrParentTNode.index); +} + +/** + * Stores host binding fn and number of host vars so it will be queued for binding refresh during + * CD. +*/ +function queueHostBindingForCheck( + tView: TView, def: DirectiveDef| ComponentDef, hostVars: number): void { + ngDevMode && + assertEqual(tView.firstTemplatePass, true, 'Should only be called in first template pass.'); + const expando = tView.expandoInstructions !; + const length = expando.length; + // Check whether a given `hostBindings` function already exists in expandoInstructions, + // which can happen in case directive definition was extended from base definition (as a part of + // the `InheritDefinitionFeature` logic). If we found the same `hostBindings` function in the + // list, we just increase the number of host vars associated with that function, but do not add it + // into the list again. + if (length >= 2 && expando[length - 2] === def.hostBindings) { + expando[length - 1] = (expando[length - 1] as number) + hostVars; + } else { + expando.push(def.hostBindings !, hostVars); + } +} + +/** Caches local names and their matching directive indices for query and template lookups. */ +function cacheMatchingLocalNames( + tNode: TNode, localRefs: string[] | null, exportsMap: {[key: string]: number}): void { + if (localRefs) { + const localNames: (string | number)[] = tNode.localNames = []; + + // Local names must be stored in tNode in the same order that localRefs are defined + // in the template to ensure the data is loaded in the same slots as their refs + // in the template (for template queries). + for (let i = 0; i < localRefs.length; i += 2) { + const index = exportsMap[localRefs[i + 1]]; + if (index == null) throw new Error(`Export of name '${localRefs[i + 1]}' not found!`); + localNames.push(localRefs[i], index); + } + } +} + +/** +* Builds up an export map as directives are created, so local refs can be quickly mapped +* to their directive instances. +*/ +function saveNameToExportMap( + index: number, def: DirectiveDef| ComponentDef, + exportsMap: {[key: string]: number} | null) { + if (exportsMap) { + if (def.exportAs) { + for (let i = 0; i < def.exportAs.length; i++) { + exportsMap[def.exportAs[i]] = index; + } + } + if ((def as ComponentDef).template) exportsMap[''] = index; + } +} + +/** + * Initializes the flags on the current node, setting all indices to the initial index, + * the directive count to 0, and adding the isComponent flag. + * @param index the initial index + */ +export function initNodeFlags(tNode: TNode, index: number, numberOfDirectives: number) { + const flags = tNode.flags; + ngDevMode && assertEqual( + flags === 0 || flags === TNodeFlags.isComponent, true, + 'expected node flags to not be initialized'); + + ngDevMode && assertNotEqual( + numberOfDirectives, tNode.directiveEnd - tNode.directiveStart, + 'Reached the max number of directives'); + // When the first directive is created on a node, save the index + tNode.flags = flags & TNodeFlags.isComponent; + tNode.directiveStart = index; + tNode.directiveEnd = index + numberOfDirectives; + tNode.providerIndexes = index; +} + +function baseResolveDirective( + tView: TView, viewData: LView, def: DirectiveDef, + directiveFactory: (t: Type| null) => any) { + tView.data.push(def); + const nodeInjectorFactory = new NodeInjectorFactory(directiveFactory, isComponentDef(def), null); + tView.blueprint.push(nodeInjectorFactory); + viewData.push(nodeInjectorFactory); +} + +function addComponentLogic( + lView: LView, previousOrParentTNode: TNode, def: ComponentDef): void { + const native = getNativeByTNode(previousOrParentTNode, lView); + + const tView = getOrCreateTView( + def.template, def.consts, def.vars, def.directiveDefs, def.pipeDefs, def.viewQuery, + def.schemas); + + // Only component views should be added to the view tree directly. Embedded views are + // accessed through their containers because they may be removed / re-added later. + const rendererFactory = lView[RENDERER_FACTORY]; + const componentView = addToViewTree( + lView, createLView( + lView, tView, null, def.onPush ? LViewFlags.Dirty : LViewFlags.CheckAlways, + lView[previousOrParentTNode.index], previousOrParentTNode as TElementNode, + rendererFactory, lView[RENDERER_FACTORY].createRenderer(native as RElement, def))); + + componentView[T_HOST] = previousOrParentTNode as TElementNode; + + // Component view will always be created before any injected LContainers, + // so this is a regular element, wrap it with the component view + lView[previousOrParentTNode.index] = componentView; + + if (lView[TVIEW].firstTemplatePass) { + queueComponentIndexForCheck(previousOrParentTNode); + } +} + +/** + * Sets initial input properties on directive instances from attribute data + * + * @param directiveIndex Index of the directive in directives array + * @param instance Instance of the directive on which to set the initial inputs + * @param inputs The list of inputs from the directive def + * @param tNode The static data for this node + */ +function setInputsFromAttrs( + directiveIndex: number, instance: T, def: DirectiveDef, tNode: TNode): void { + let initialInputData = tNode.initialInputs as InitialInputData | undefined; + if (initialInputData === undefined || directiveIndex >= initialInputData.length) { + initialInputData = generateInitialInputs(directiveIndex, def.inputs, tNode); + } + + const initialInputs: InitialInputs|null = initialInputData[directiveIndex]; + if (initialInputs) { + const setInput = def.setInput; + for (let i = 0; i < initialInputs.length;) { + const publicName = initialInputs[i++]; + const privateName = initialInputs[i++]; + const value = initialInputs[i++]; + if (setInput) { + def.setInput !(instance, value, publicName, privateName); + } else { + (instance as any)[privateName] = value; + } + } + } +} + +/** + * Generates initialInputData for a node and stores it in the template's static storage + * so subsequent template invocations don't have to recalculate it. + * + * initialInputData is an array containing values that need to be set as input properties + * for directives on this node, but only once on creation. We need this array to support + * the case where you set an @Input property of a directive using attribute-like syntax. + * e.g. if you have a `name` @Input, you can set it once like this: + * + * + * + * @param directiveIndex Index to store the initial input data + * @param inputs The list of inputs from the directive def + * @param tNode The static data on this node + */ +function generateInitialInputs( + directiveIndex: number, inputs: {[key: string]: string}, tNode: TNode): InitialInputData { + const initialInputData: InitialInputData = tNode.initialInputs || (tNode.initialInputs = []); + initialInputData[directiveIndex] = null; + + const attrs = tNode.attrs !; + let i = 0; + while (i < attrs.length) { + const attrName = attrs[i]; + if (attrName === AttributeMarker.NamespaceURI) { + // We do not allow inputs on namespaced attributes. + i += 4; + continue; + } + + // If we hit any other attribute markers, we're done anyway. None of those are valid inputs. + if (typeof attrName === 'number') break; + + const minifiedInputName = inputs[attrName]; + const attrValue = attrs[i + 1]; + + if (minifiedInputName !== undefined) { + const inputsToStore: InitialInputs = + initialInputData[directiveIndex] || (initialInputData[directiveIndex] = []); + inputsToStore.push(attrName, minifiedInputName, attrValue as string); + } + + i += 2; + } + return initialInputData; +} + +////////////////////////// +//// ViewContainer & View +////////////////////////// + +/** + * Creates a LContainer, either from a container instruction, or for a ViewContainerRef. + * + * @param hostNative The host element for the LContainer + * @param hostTNode The host TNode for the LContainer + * @param currentView The parent view of the LContainer + * @param native The native comment element + * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case + * @returns LContainer + */ +export function createLContainer( + hostNative: RElement | RComment | StylingContext | LView, currentView: LView, native: RComment, + tNode: TNode, isForViewContainerRef?: boolean): LContainer { + ngDevMode && assertDomNode(native); + ngDevMode && assertLView(currentView); + const lContainer: LContainer = [ + hostNative, // host native + true, // Boolean `true` in this position signifies that this is an `LContainer` + isForViewContainerRef ? -1 : 0, // active index + currentView, // parent + null, // next + null, // queries + tNode, // t_host + native, // native + [], // views + ]; + ngDevMode && attachLContainerDebug(lContainer); + return lContainer; +} + +/** + * Creates an LContainer for an ng-template (dynamically-inserted view), e.g. + * + * + *
+ *
+ * + * @param index The index of the container in the data array + * @param templateFn Inline template + * @param consts The number of nodes, local refs, and pipes for this template + * @param vars The number of bindings for this template + * @param tagName The name of the container element, if applicable + * @param attrs The attrs attached to the container, if applicable + * @param localRefs A set of local reference bindings on the element. + * @param localRefExtractor A function which extracts local-refs values from the template. + * Defaults to the current element associated with the local-ref. + */ +export function template( + index: number, templateFn: ComponentTemplate| null, consts: number, vars: number, + tagName?: string | null, attrs?: TAttributes | null, localRefs?: string[] | null, + localRefExtractor?: LocalRefExtractor) { + const lView = getLView(); + const tView = lView[TVIEW]; + + // TODO: consider a separate node type for templates + const tContainerNode = containerInternal(index, tagName || null, attrs || null); + if (tView.firstTemplatePass) { + tContainerNode.tViews = createTView( + -1, templateFn, consts, vars, tView.directiveRegistry, tView.pipeRegistry, null, null); + } + + createDirectivesAndLocals(tView, lView, localRefs, localRefExtractor); + addTContainerToQueries(lView, tContainerNode); + attachPatchData(getNativeByTNode(tContainerNode, lView), lView); + registerPostOrderHooks(tView, tContainerNode); + setIsParent(false); +} + +/** + * Creates an LContainer for inline views, e.g. + * + * % if (showing) { + *
+ * % } + * + * @param index The index of the container in the data array + */ +export function container(index: number): void { + const tNode = containerInternal(index, null, null); + const lView = getLView(); + if (lView[TVIEW].firstTemplatePass) { + tNode.tViews = []; + } + addTContainerToQueries(lView, tNode); + setIsParent(false); +} + +function containerInternal( + index: number, tagName: string | null, attrs: TAttributes | null): TContainerNode { + const lView = getLView(); + ngDevMode && assertEqual( + lView[BINDING_INDEX], lView[TVIEW].bindingStartIndex, + 'container nodes should be created before any bindings'); + + const adjustedIndex = index + HEADER_OFFSET; + const comment = lView[RENDERER].createComment(ngDevMode ? 'container' : ''); + ngDevMode && ngDevMode.rendererCreateComment++; + const tNode = createNodeAtIndex(index, TNodeType.Container, comment, tagName, attrs); + const lContainer = lView[adjustedIndex] = + createLContainer(lView[adjustedIndex], lView, comment, tNode); + + appendChild(comment, tNode, lView); + + // Containers are added to the current view tree instead of their embedded views + // because views can be removed and re-inserted. + addToViewTree(lView, lContainer); + + ngDevMode && assertNodeType(getPreviousOrParentTNode(), TNodeType.Container); + return tNode; +} + +/** + * Reporting a TContainer node queries is a 2-step process as we need to: + * - check if the container node itself is matching (query might match a node); + * - prepare room for nodes from views that might be created based on the TemplateRef linked to this + * container. + * + * Those 2 operations need to happen in the specific order (match the container node itself, then + * prepare space for nodes from views). + */ +function addTContainerToQueries(lView: LView, tContainerNode: TContainerNode): void { + const queries = lView[QUERIES]; + if (queries) { + queries.addNode(tContainerNode); + const lContainer = lView[tContainerNode.index]; + lContainer[QUERIES] = queries.container(); + } +} + +/** + * Sets a container up to receive views. + * + * @param index The index of the container in the data array + */ +export function containerRefreshStart(index: number): void { + const lView = getLView(); + const tView = lView[TVIEW]; + let previousOrParentTNode = loadInternal(tView.data, index) as TNode; + setPreviousOrParentTNode(previousOrParentTNode); + + ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.Container); + setIsParent(true); + + lView[index + HEADER_OFFSET][ACTIVE_INDEX] = 0; + + // We need to execute init hooks here so ngOnInit hooks are called in top level views + // before they are called in embedded views (for backwards compatibility). + executePreOrderHooks(lView, tView, getCheckNoChangesMode(), undefined); +} + +/** + * Marks the end of the LContainer. + * + * Marking the end of LContainer is the time when to child views get inserted or removed. + */ +export function containerRefreshEnd(): void { + let previousOrParentTNode = getPreviousOrParentTNode(); + if (getIsParent()) { + setIsParent(false); + } else { + ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.View); + ngDevMode && assertHasParent(previousOrParentTNode); + previousOrParentTNode = previousOrParentTNode.parent !; + setPreviousOrParentTNode(previousOrParentTNode); + } + + ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.Container); + + const lContainer = getLView()[previousOrParentTNode.index]; + const nextIndex = lContainer[ACTIVE_INDEX]; + + // remove extra views at the end of the container + while (nextIndex < lContainer[VIEWS].length) { + removeView(lContainer, nextIndex); + } +} + +/** + * Goes over dynamic embedded views (ones created through ViewContainerRef APIs) and refreshes them + * by executing an associated template function. + */ +function refreshDynamicEmbeddedViews(lView: LView) { + for (let current = lView[CHILD_HEAD]; current !== null; current = current[NEXT]) { + // Note: current can be an LView or an LContainer instance, but here we are only interested + // in LContainer. We can tell it's an LContainer because its length is less than the LView + // header. + if (current.length < HEADER_OFFSET && current[ACTIVE_INDEX] === -1) { + const container = current as LContainer; + for (let i = 0; i < container[VIEWS].length; i++) { + const dynamicViewData = container[VIEWS][i]; + // The directives and pipes are not needed here as an existing view is only being refreshed. + ngDevMode && assertDefined(dynamicViewData[TVIEW], 'TView must be allocated'); + renderEmbeddedTemplate(dynamicViewData, dynamicViewData[TVIEW], dynamicViewData[CONTEXT] !); + } + } + } +} + + +/** + * Looks for a view with a given view block id inside a provided LContainer. + * Removes views that need to be deleted in the process. + * + * @param lContainer to search for views + * @param startIdx starting index in the views array to search from + * @param viewBlockId exact view block id to look for + * @returns index of a found view or -1 if not found + */ +function scanForView(lContainer: LContainer, startIdx: number, viewBlockId: number): LView|null { + const views = lContainer[VIEWS]; + for (let i = startIdx; i < views.length; i++) { + const viewAtPositionId = views[i][TVIEW].id; + if (viewAtPositionId === viewBlockId) { + return views[i]; + } else if (viewAtPositionId < viewBlockId) { + // found a view that should not be at this position - remove + removeView(lContainer, i); + } else { + // found a view with id greater than the one we are searching for + // which means that required view doesn't exist and can't be found at + // later positions in the views array - stop the searchdef.cont here + break; + } + } + return null; +} + +/** + * Marks the start of an embedded view. + * + * @param viewBlockId The ID of this view + * @return boolean Whether or not this view is in creation mode + */ +export function embeddedViewStart(viewBlockId: number, consts: number, vars: number): RenderFlags { + const lView = getLView(); + const previousOrParentTNode = getPreviousOrParentTNode(); + // The previous node can be a view node if we are processing an inline for loop + const containerTNode = previousOrParentTNode.type === TNodeType.View ? + previousOrParentTNode.parent ! : + previousOrParentTNode; + const lContainer = lView[containerTNode.index] as LContainer; + + ngDevMode && assertNodeType(containerTNode, TNodeType.Container); + let viewToRender = scanForView(lContainer, lContainer[ACTIVE_INDEX] !, viewBlockId); + + if (viewToRender) { + setIsParent(true); + enterView(viewToRender, viewToRender[TVIEW].node); + } else { + // When we create a new LView, we always reset the state of the instructions. + viewToRender = createLView( + lView, + getOrCreateEmbeddedTView(viewBlockId, consts, vars, containerTNode as TContainerNode), null, + LViewFlags.CheckAlways, null, null); + + if (lContainer[QUERIES]) { + viewToRender[QUERIES] = lContainer[QUERIES] !.createView(); + } + + const tParentNode = getIsParent() ? previousOrParentTNode : + previousOrParentTNode && previousOrParentTNode.parent; + assignTViewNodeToLView(viewToRender[TVIEW], tParentNode, viewBlockId, viewToRender); + enterView(viewToRender, viewToRender[TVIEW].node); + } + if (lContainer) { + if (isCreationMode(viewToRender)) { + // it is a new view, insert it into collection of views for a given container + insertView(viewToRender, lContainer, lContainer[ACTIVE_INDEX] !); + } + lContainer[ACTIVE_INDEX] !++; + } + return isCreationMode(viewToRender) ? RenderFlags.Create | RenderFlags.Update : + RenderFlags.Update; +} + +/** + * Initialize the TView (e.g. static data) for the active embedded view. + * + * Each embedded view block must create or retrieve its own TView. Otherwise, the embedded view's + * static data for a particular node would overwrite the static data for a node in the view above + * it with the same index (since it's in the same template). + * + * @param viewIndex The index of the TView in TNode.tViews + * @param consts The number of nodes, local refs, and pipes in this template + * @param vars The number of bindings and pure function bindings in this template + * @param container The parent container in which to look for the view's static data + * @returns TView + */ +function getOrCreateEmbeddedTView( + viewIndex: number, consts: number, vars: number, parent: TContainerNode): TView { + const tView = getLView()[TVIEW]; + ngDevMode && assertNodeType(parent, TNodeType.Container); + const containerTViews = parent.tViews as TView[]; + ngDevMode && assertDefined(containerTViews, 'TView expected'); + ngDevMode && assertEqual(Array.isArray(containerTViews), true, 'TViews should be in an array'); + if (viewIndex >= containerTViews.length || containerTViews[viewIndex] == null) { + containerTViews[viewIndex] = createTView( + viewIndex, null, consts, vars, tView.directiveRegistry, tView.pipeRegistry, null, null); + } + return containerTViews[viewIndex]; +} + +/** Marks the end of an embedded view. */ +export function embeddedViewEnd(): void { + const lView = getLView(); + const viewHost = lView[T_HOST]; + + if (isCreationMode(lView)) { + refreshDescendantViews(lView); // creation mode pass + lView[FLAGS] &= ~LViewFlags.CreationMode; + } + resetPreOrderHookFlags(lView); + refreshDescendantViews(lView); // update mode pass + const lContainer = lView[PARENT] as LContainer; + ngDevMode && assertLContainerOrUndefined(lContainer); + leaveView(lContainer[PARENT] !); + setPreviousOrParentTNode(viewHost !); + setIsParent(false); +} + +///////////// + +/** + * Refreshes components by entering the component view and processing its bindings, queries, etc. + * + * @param adjustedElementIndex Element index in LView[] (adjusted for HEADER_OFFSET) + */ +export function componentRefresh(adjustedElementIndex: number): void { + const lView = getLView(); + ngDevMode && assertDataInRange(lView, adjustedElementIndex); + const hostView = getComponentViewByIndex(adjustedElementIndex, lView); + ngDevMode && assertNodeType(lView[TVIEW].data[adjustedElementIndex] as TNode, TNodeType.Element); + + // Only attached CheckAlways components or attached, dirty OnPush components should be checked + if (viewAttachedToChangeDetector(hostView) && + hostView[FLAGS] & (LViewFlags.CheckAlways | LViewFlags.Dirty)) { + syncViewWithBlueprint(hostView); + checkView(hostView, hostView[CONTEXT]); + } +} + +/** + * Syncs an LView instance with its blueprint if they have gotten out of sync. + * + * Typically, blueprints and their view instances should always be in sync, so the loop here + * will be skipped. However, consider this case of two components side-by-side: + * + * App template: + * ``` + * + * + * ``` + * + * The following will happen: + * 1. App template begins processing. + * 2. First is matched as a component and its LView is created. + * 3. Second is matched as a component and its LView is created. + * 4. App template completes processing, so it's time to check child templates. + * 5. First template is checked. It has a directive, so its def is pushed to blueprint. + * 6. Second template is checked. Its blueprint has been updated by the first + * template, but its LView was created before this update, so it is out of sync. + * + * Note that embedded views inside ngFor loops will never be out of sync because these views + * are processed as soon as they are created. + * + * @param componentView The view to sync + */ +function syncViewWithBlueprint(componentView: LView) { + const componentTView = componentView[TVIEW]; + for (let i = componentView.length; i < componentTView.blueprint.length; i++) { + componentView[i] = componentTView.blueprint[i]; + } +} + +/** + * Instruction to distribute projectable nodes among occurrences in a given template. + * It takes all the selectors from the entire component's template and decides where + * each projected node belongs (it re-distributes nodes among "buckets" where each "bucket" is + * backed by a selector). + * + * This function requires CSS selectors to be provided in 2 forms: parsed (by a compiler) and text, + * un-parsed form. + * + * The parsed form is needed for efficient matching of a node against a given CSS selector. + * The un-parsed, textual form is needed for support of the ngProjectAs attribute. + * + * Having a CSS selector in 2 different formats is not ideal, but alternatives have even more + * drawbacks: + * - having only a textual form would require runtime parsing of CSS selectors; + * - we can't have only a parsed as we can't re-construct textual form from it (as entered by a + * template author). + * + * @param selectors A collection of parsed CSS selectors + * @param rawSelectors A collection of CSS selectors in the raw, un-parsed form + */ +export function projectionDef(selectors?: CssSelectorList[], textSelectors?: string[]): void { + const componentNode = findComponentView(getLView())[T_HOST] as TElementNode; + + if (!componentNode.projection) { + const noOfNodeBuckets = selectors ? selectors.length + 1 : 1; + const projectionHeads: (TNode | null)[] = componentNode.projection = + new Array(noOfNodeBuckets).fill(null); + const tails: (TNode | null)[] = projectionHeads.slice(); + + let componentChild: TNode|null = componentNode.child; + + while (componentChild !== null) { + const bucketIndex = selectors ? + matchingProjectionSelectorIndex(componentChild, selectors, textSelectors !) : + 0; + + if (tails[bucketIndex]) { + tails[bucketIndex] !.projectionNext = componentChild; + } else { + projectionHeads[bucketIndex] = componentChild; + } + tails[bucketIndex] = componentChild; + + componentChild = componentChild.next; + } + } +} + + +/** + * Inserts previously re-distributed projected nodes. This instruction must be preceded by a call + * to the projectionDef instruction. + * + * @param nodeIndex + * @param selectorIndex: + * - 0 when the selector is `*` (or unspecified as this is the default value), + * - 1 based index of the selector from the {@link projectionDef} + */ +export function projection(nodeIndex: number, selectorIndex: number = 0, attrs?: string[]): void { + const lView = getLView(); + const tProjectionNode = + createNodeAtIndex(nodeIndex, TNodeType.Projection, null, null, attrs || null); + + // We can't use viewData[HOST_NODE] because projection nodes can be nested in embedded views. + if (tProjectionNode.projection === null) tProjectionNode.projection = selectorIndex; + + // `` has no content + setIsParent(false); + + // re-distribution of projectable nodes is stored on a component's view level + appendProjectedNodes(lView, tProjectionNode, selectorIndex, findComponentView(lView)); +} + +/** + * Adds LView or LContainer to the end of the current view tree. + * + * This structure will be used to traverse through nested views to remove listeners + * and call onDestroy callbacks. + * + * @param lView The view where LView or LContainer should be added + * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header + * @param lViewOrLContainer The LView or LContainer to add to the view tree + * @returns The state passed in + */ +export function addToViewTree(lView: LView, lViewOrLContainer: T): T { + // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer to + // the end of the queue, which means if the developer retrieves the LContainers from RNodes out of + // order, the change detection will run out of order, as the act of retrieving the the LContainer + // from the RNode is what adds it to the queue. + if (lView[CHILD_HEAD]) { + lView[CHILD_TAIL] ![NEXT] = lViewOrLContainer; + } else { + lView[CHILD_HEAD] = lViewOrLContainer; + } + lView[CHILD_TAIL] = lViewOrLContainer; + return lViewOrLContainer; +} + +/** + * Wraps an event listener with a function that marks ancestors dirty and prevents default behavior, + * if applicable. + * + * @param tNode The TNode associated with this listener + * @param lView The LView that contains this listener + * @param listenerFn The listener function to call + * @param wrapWithPreventDefault Whether or not to prevent default behavior + * (the procedural renderer does this already, so in those cases, we should skip) + */ +function wrapListener( + tNode: TNode, lView: LView, listenerFn: (e?: any) => any, + wrapWithPreventDefault: boolean): EventListener { + // Note: we are performing most of the work in the listener function itself + // to optimize listener registration. + return function wrapListenerIn_markDirtyAndPreventDefault(e: Event) { + // In order to be backwards compatible with View Engine, events on component host nodes + // must also mark the component view itself dirty (i.e. the view that it owns). + const startView = + tNode.flags & TNodeFlags.isComponent ? getComponentViewByIndex(tNode.index, lView) : lView; + + // See interfaces/view.ts for more on LViewFlags.ManualOnPush + if ((lView[FLAGS] & LViewFlags.ManualOnPush) === 0) { + markViewDirty(startView); + } + + try { + const result = listenerFn(e); + if (wrapWithPreventDefault && result === false) { + e.preventDefault(); + // Necessary for legacy browsers that don't support preventDefault (e.g. IE) + e.returnValue = false; + } + return result; + } catch (error) { + handleError(lView, error); + } + }; +} + +/** + * Marks current view and all ancestors dirty. + * + * Returns the root view because it is found as a byproduct of marking the view tree + * dirty, and can be used by methods that consume markViewDirty() to easily schedule + * change detection. Otherwise, such methods would need to traverse up the view tree + * an additional time to get the root view and schedule a tick on it. + * + * @param lView The starting LView to mark dirty + * @returns the root LView + */ +export function markViewDirty(lView: LView): LView|null { + while (lView) { + lView[FLAGS] |= LViewFlags.Dirty; + const parent = getLViewParent(lView); + // Stop traversing up as soon as you find a root view that wasn't attached to any container + if (isRootView(lView) && !parent) { + return lView; + } + // continue otherwise + lView = parent !; + } + return null; +} + +/** + * Used to perform change detection on the whole application. + * + * This is equivalent to `detectChanges`, but invoked on root component. Additionally, `tick` + * executes lifecycle hooks and conditionally checks components based on their + * `ChangeDetectionStrategy` and dirtiness. + * + * The preferred way to trigger change detection is to call `markDirty`. `markDirty` internally + * schedules `tick` using a scheduler in order to coalesce multiple `markDirty` calls into a + * single change detection run. By default, the scheduler is `requestAnimationFrame`, but can + * be changed when calling `renderComponent` and providing the `scheduler` option. + */ +export function tick(component: T): void { + const rootView = getRootView(component); + const rootContext = rootView[CONTEXT] as RootContext; + tickRootContext(rootContext); +} + +/** + * Used to schedule change detection on the whole application. + * + * Unlike `tick`, `scheduleTick` coalesces multiple calls into one change detection run. + * It is usually called indirectly by calling `markDirty` when the view needs to be + * re-rendered. + * + * Typically `scheduleTick` uses `requestAnimationFrame` to coalesce multiple + * `scheduleTick` requests. The scheduling function can be overridden in + * `renderComponent`'s `scheduler` option. + */ +export function scheduleTick(rootContext: RootContext, flags: RootContextFlags) { + const nothingScheduled = rootContext.flags === RootContextFlags.Empty; + rootContext.flags |= flags; + + if (nothingScheduled && rootContext.clean == _CLEAN_PROMISE) { + let res: null|((val: null) => void); + rootContext.clean = new Promise((r) => res = r); + rootContext.scheduler(() => { + if (rootContext.flags & RootContextFlags.DetectChanges) { + rootContext.flags &= ~RootContextFlags.DetectChanges; + tickRootContext(rootContext); + } + + if (rootContext.flags & RootContextFlags.FlushPlayers) { + rootContext.flags &= ~RootContextFlags.FlushPlayers; + const playerHandler = rootContext.playerHandler; + if (playerHandler) { + playerHandler.flushPlayers(); + } + } + + rootContext.clean = _CLEAN_PROMISE; + res !(null); + }); + } +} + +function tickRootContext(rootContext: RootContext) { + for (let i = 0; i < rootContext.components.length; i++) { + const rootComponent = rootContext.components[i]; + renderComponentOrTemplate(readPatchedLView(rootComponent) !, rootComponent); + } +} + +/** + * Synchronously perform change detection on a component (and possibly its sub-components). + * + * This function triggers change detection in a synchronous way on a component. There should + * be very little reason to call this function directly since a preferred way to do change + * detection is to {@link markDirty} the component and wait for the scheduler to call this method + * at some future point in time. This is because a single user action often results in many + * components being invalidated and calling change detection on each component synchronously + * would be inefficient. It is better to wait until all components are marked as dirty and + * then perform single change detection across all of the components + * + * @param component The component which the change detection should be performed on. + */ +export function detectChanges(component: T): void { + const view = getComponentViewByInstance(component); + detectChangesInternal(view, component); +} + +export function detectChangesInternal(view: LView, context: T) { + const rendererFactory = view[RENDERER_FACTORY]; + + if (rendererFactory.begin) rendererFactory.begin(); + + try { + if (isCreationMode(view)) { + checkView(view, context); // creation mode pass + } + checkView(view, context); // update mode pass + } catch (error) { + handleError(view, error); + throw error; + } finally { + if (rendererFactory.end) rendererFactory.end(); + } +} + +/** + * Synchronously perform change detection on a root view and its components. + * + * @param lView The view which the change detection should be performed on. + */ +export function detectChangesInRootView(lView: LView): void { + tickRootContext(lView[CONTEXT] as RootContext); +} + + +/** + * Checks the change detector and its children, and throws if any changes are detected. + * + * This is used in development mode to verify that running change detection doesn't + * introduce other changes. + */ +export function checkNoChanges(component: T): void { + const view = getComponentViewByInstance(component); + checkNoChangesInternal(view, component); +} + +export function checkNoChangesInternal(view: LView, context: T) { + setCheckNoChangesMode(true); + try { + detectChangesInternal(view, context); + } finally { + setCheckNoChangesMode(false); + } +} + +/** + * Checks the change detector on a root view and its components, and throws if any changes are + * detected. + * + * This is used in development mode to verify that running change detection doesn't + * introduce other changes. + * + * @param lView The view which the change detection should be checked on. + */ +export function checkNoChangesInRootView(lView: LView): void { + setCheckNoChangesMode(true); + try { + detectChangesInRootView(lView); + } finally { + setCheckNoChangesMode(false); + } +} + +/** Checks the view of the component provided. Does not gate on dirty checks or execute doCheck. */ +export function checkView(hostView: LView, component: T) { + const hostTView = hostView[TVIEW]; + const oldView = enterView(hostView, hostView[T_HOST]); + const templateFn = hostTView.template !; + const creationMode = isCreationMode(hostView); + + try { + resetPreOrderHookFlags(hostView); + namespaceHTML(); + creationMode && executeViewQueryFn(RenderFlags.Create, hostTView, component); + + // Reset the selected index so we can assert that `select` was called later + ngDevMode && setSelectedIndex(-1); + + templateFn(getRenderFlags(hostView), component); + + refreshDescendantViews(hostView); + // Only check view queries again in creation mode if there are static view queries + if (!creationMode || hostTView.staticViewQueries) { + executeViewQueryFn(RenderFlags.Update, hostTView, component); + } + } finally { + leaveView(oldView); + } +} + +function executeViewQueryFn(flags: RenderFlags, tView: TView, component: T): void { + const viewQuery = tView.viewQuery; + if (viewQuery) { + setCurrentQueryIndex(tView.viewQueryStartIndex); + viewQuery(flags, component); + } +} + + +/** + * Mark the component as dirty (needing change detection). + * + * Marking a component dirty will schedule a change detection on this + * component at some point in the future. Marking an already dirty + * component as dirty is a noop. Only one outstanding change detection + * can be scheduled per component tree. (Two components bootstrapped with + * separate `renderComponent` will have separate schedulers) + * + * When the root component is bootstrapped with `renderComponent`, a scheduler + * can be provided. + * + * @param component Component to mark as dirty. + * + * @publicApi + */ +export function markDirty(component: T) { + ngDevMode && assertDefined(component, 'component'); + const rootView = markViewDirty(getComponentViewByInstance(component)) !; + + ngDevMode && assertDefined(rootView[CONTEXT], 'rootContext should be defined'); + scheduleTick(rootView[CONTEXT] as RootContext, RootContextFlags.DetectChanges); +} + +/////////////////////////////// +//// Bindings & interpolations +/////////////////////////////// + +/** + * Creates a single value binding. + * + * @param value Value to diff + */ +export function bind(value: T): T|NO_CHANGE { + const lView = getLView(); + const bindingIndex = lView[BINDING_INDEX]++; + storeBindingMetadata(lView); + return bindingUpdated(lView, bindingIndex, value) ? value : NO_CHANGE; +} + +/** + * Allocates the necessary amount of slots for host vars. + * + * @param count Amount of vars to be allocated + */ +export function allocHostVars(count: number): void { + const lView = getLView(); + const tView = lView[TVIEW]; + if (!tView.firstTemplatePass) return; + queueHostBindingForCheck(tView, getCurrentDirectiveDef() !, count); + prefillHostVars(tView, lView, count); +} + +/** + * Create interpolation bindings with a variable number of expressions. + * + * If there are 1 to 8 expressions `interpolation1()` to `interpolation8()` should be used instead. + * Those are faster because there is no need to create an array of expressions and iterate over it. + * + * `values`: + * - has static text at even indexes, + * - has evaluated expressions at odd indexes. + * + * Returns the concatenated string when any of the arguments changes, `NO_CHANGE` otherwise. + */ +export function interpolationV(values: any[]): string|NO_CHANGE { + ngDevMode && assertLessThan(2, values.length, 'should have at least 3 values'); + ngDevMode && assertEqual(values.length % 2, 1, 'should have an odd number of values'); + let different = false; + const lView = getLView(); + const tData = lView[TVIEW].data; + let bindingIndex = lView[BINDING_INDEX]; + + if (tData[bindingIndex] == null) { + // 2 is the index of the first static interstitial value (ie. not prefix) + for (let i = 2; i < values.length; i += 2) { + tData[bindingIndex++] = values[i]; + } + bindingIndex = lView[BINDING_INDEX]; + } + + for (let i = 1; i < values.length; i += 2) { + // Check if bindings (odd indexes) have changed + bindingUpdated(lView, bindingIndex++, values[i]) && (different = true); + } + lView[BINDING_INDEX] = bindingIndex; + storeBindingMetadata(lView, values[0], values[values.length - 1]); + + if (!different) { + return NO_CHANGE; + } + + // Build the updated content + let content = values[0]; + for (let i = 1; i < values.length; i += 2) { + content += renderStringify(values[i]) + values[i + 1]; + } + + return content; +} + +/** + * Creates an interpolation binding with 1 expression. + * + * @param prefix static value used for concatenation only. + * @param v0 value checked for change. + * @param suffix static value used for concatenation only. + */ +export function interpolation1(prefix: string, v0: any, suffix: string): string|NO_CHANGE { + const lView = getLView(); + const different = bindingUpdated(lView, lView[BINDING_INDEX]++, v0); + storeBindingMetadata(lView, prefix, suffix); + return different ? prefix + renderStringify(v0) + suffix : NO_CHANGE; +} + +/** Creates an interpolation binding with 2 expressions. */ +export function interpolation2( + prefix: string, v0: any, i0: string, v1: any, suffix: string): string|NO_CHANGE { + const lView = getLView(); + const bindingIndex = lView[BINDING_INDEX]; + const different = bindingUpdated2(lView, bindingIndex, v0, v1); + lView[BINDING_INDEX] += 2; + + // Only set static strings the first time (data will be null subsequent runs). + const data = storeBindingMetadata(lView, prefix, suffix); + if (data) { + lView[TVIEW].data[bindingIndex] = i0; + } + + return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + suffix : NO_CHANGE; +} + +/** Creates an interpolation binding with 3 expressions. */ +export function interpolation3( + prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): string| + NO_CHANGE { + const lView = getLView(); + const bindingIndex = lView[BINDING_INDEX]; + const different = bindingUpdated3(lView, bindingIndex, v0, v1, v2); + lView[BINDING_INDEX] += 3; + + // Only set static strings the first time (data will be null subsequent runs). + const data = storeBindingMetadata(lView, prefix, suffix); + if (data) { + const tData = lView[TVIEW].data; + tData[bindingIndex] = i0; + tData[bindingIndex + 1] = i1; + } + + return different ? + prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + suffix : + NO_CHANGE; +} + +/** Create an interpolation binding with 4 expressions. */ +export function interpolation4( + prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, + suffix: string): string|NO_CHANGE { + const lView = getLView(); + const bindingIndex = lView[BINDING_INDEX]; + const different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); + lView[BINDING_INDEX] += 4; + + // Only set static strings the first time (data will be null subsequent runs). + const data = storeBindingMetadata(lView, prefix, suffix); + if (data) { + const tData = lView[TVIEW].data; + tData[bindingIndex] = i0; + tData[bindingIndex + 1] = i1; + tData[bindingIndex + 2] = i2; + } + + return different ? + prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + + renderStringify(v3) + suffix : + NO_CHANGE; +} + +/** Creates an interpolation binding with 5 expressions. */ +export function interpolation5( + prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, + i3: string, v4: any, suffix: string): string|NO_CHANGE { + const lView = getLView(); + const bindingIndex = lView[BINDING_INDEX]; + let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); + different = bindingUpdated(lView, bindingIndex + 4, v4) || different; + lView[BINDING_INDEX] += 5; + + // Only set static strings the first time (data will be null subsequent runs). + const data = storeBindingMetadata(lView, prefix, suffix); + if (data) { + const tData = lView[TVIEW].data; + tData[bindingIndex] = i0; + tData[bindingIndex + 1] = i1; + tData[bindingIndex + 2] = i2; + tData[bindingIndex + 3] = i3; + } + + return different ? + prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + + renderStringify(v3) + i3 + renderStringify(v4) + suffix : + NO_CHANGE; +} + +/** Creates an interpolation binding with 6 expressions. */ +export function interpolation6( + prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, + i3: string, v4: any, i4: string, v5: any, suffix: string): string|NO_CHANGE { + const lView = getLView(); + const bindingIndex = lView[BINDING_INDEX]; + let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); + different = bindingUpdated2(lView, bindingIndex + 4, v4, v5) || different; + lView[BINDING_INDEX] += 6; + + // Only set static strings the first time (data will be null subsequent runs). + const data = storeBindingMetadata(lView, prefix, suffix); + if (data) { + const tData = lView[TVIEW].data; + tData[bindingIndex] = i0; + tData[bindingIndex + 1] = i1; + tData[bindingIndex + 2] = i2; + tData[bindingIndex + 3] = i3; + tData[bindingIndex + 4] = i4; + } + + return different ? + prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + + renderStringify(v3) + i3 + renderStringify(v4) + i4 + renderStringify(v5) + suffix : + NO_CHANGE; +} + +/** Creates an interpolation binding with 7 expressions. */ +export function interpolation7( + prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, + i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): string| + NO_CHANGE { + const lView = getLView(); + const bindingIndex = lView[BINDING_INDEX]; + let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); + different = bindingUpdated3(lView, bindingIndex + 4, v4, v5, v6) || different; + lView[BINDING_INDEX] += 7; + + // Only set static strings the first time (data will be null subsequent runs). + const data = storeBindingMetadata(lView, prefix, suffix); + if (data) { + const tData = lView[TVIEW].data; + tData[bindingIndex] = i0; + tData[bindingIndex + 1] = i1; + tData[bindingIndex + 2] = i2; + tData[bindingIndex + 3] = i3; + tData[bindingIndex + 4] = i4; + tData[bindingIndex + 5] = i5; + } + + return different ? + prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + + renderStringify(v3) + i3 + renderStringify(v4) + i4 + renderStringify(v5) + i5 + + renderStringify(v6) + suffix : + NO_CHANGE; +} + +/** Creates an interpolation binding with 8 expressions. */ +export function interpolation8( + prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, + i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, + suffix: string): string|NO_CHANGE { + const lView = getLView(); + const bindingIndex = lView[BINDING_INDEX]; + let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); + different = bindingUpdated4(lView, bindingIndex + 4, v4, v5, v6, v7) || different; + lView[BINDING_INDEX] += 8; + + // Only set static strings the first time (data will be null subsequent runs). + const data = storeBindingMetadata(lView, prefix, suffix); + if (data) { + const tData = lView[TVIEW].data; + tData[bindingIndex] = i0; + tData[bindingIndex + 1] = i1; + tData[bindingIndex + 2] = i2; + tData[bindingIndex + 3] = i3; + tData[bindingIndex + 4] = i4; + tData[bindingIndex + 5] = i5; + tData[bindingIndex + 6] = i6; + } + + return different ? + prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + + renderStringify(v3) + i3 + renderStringify(v4) + i4 + renderStringify(v5) + i5 + + renderStringify(v6) + i6 + renderStringify(v7) + suffix : + NO_CHANGE; +} + +/** + * Creates binding metadata for a particular binding and stores it in + * TView.data. These are generated in order to support DebugElement.properties. + * + * Each binding / interpolation will have one (including attribute bindings) + * because at the time of binding, we don't know to which instruction the binding + * belongs. It is always stored in TView.data at the index of the last binding + * value in LView (e.g. for interpolation8, it would be stored at the index of + * the 8th value). + * + * @param lView The LView that contains the current binding index. + * @param prefix The static prefix string + * @param suffix The static suffix string + * + * @returns Newly created binding metadata string for this binding or null + */ +function storeBindingMetadata(lView: LView, prefix = '', suffix = ''): string|null { + const tData = lView[TVIEW].data; + const lastBindingIndex = lView[BINDING_INDEX] - 1; + const value = INTERPOLATION_DELIMITER + prefix + INTERPOLATION_DELIMITER + suffix; + + return tData[lastBindingIndex] == null ? (tData[lastBindingIndex] = value) : null; +} + +/** Store a value in the `data` at a given `index`. */ +export function store(index: number, value: T): void { + const lView = getLView(); + const tView = lView[TVIEW]; + // We don't store any static data for local variables, so the first time + // we see the template, we should store as null to avoid a sparse array + const adjustedIndex = index + HEADER_OFFSET; + if (adjustedIndex >= tView.data.length) { + tView.data[adjustedIndex] = null; + tView.blueprint[adjustedIndex] = null; + } + lView[adjustedIndex] = value; +} + +/** + * Retrieves a local reference from the current contextViewData. + * + * If the reference to retrieve is in a parent view, this instruction is used in conjunction + * with a nextContext() call, which walks up the tree and updates the contextViewData instance. + * + * @param index The index of the local ref in contextViewData. + */ +export function reference(index: number) { + const contextLView = getContextLView(); + return loadInternal(contextLView, index); +} + +/** Retrieves a value from current `viewData`. */ +export function load(index: number): T { + return loadInternal(getLView(), index); +} + + + +/////////////////////////////// +//// DI +/////////////////////////////// + +/** + * Returns the value associated to the given token from the injectors. + * + * `directiveInject` is intended to be used for directive, component and pipe factories. + * All other injection use `inject` which does not walk the node injector tree. + * + * Usage example (in factory function): + * + * class SomeDirective { + * constructor(directive: DirectiveA) {} + * + * static ngDirectiveDef = defineDirective({ + * type: SomeDirective, + * factory: () => new SomeDirective(directiveInject(DirectiveA)) + * }); + * } + * + * @param token the type or token to inject + * @param flags Injection flags + * @returns the value from the injector or `null` when not found + */ +export function directiveInject(token: Type| InjectionToken): T; +export function directiveInject(token: Type| InjectionToken, flags: InjectFlags): T; +export function directiveInject( + token: Type| InjectionToken, flags = InjectFlags.Default): T|null { + token = resolveForwardRef(token); + return getOrCreateInjectable( + getPreviousOrParentTNode() as TElementNode | TContainerNode | TElementContainerNode, + getLView(), token, flags); +} + +/** + * Facade for the attribute injection from DI. + */ +export function injectAttribute(attrNameToInject: string): string|null { + return injectAttributeImpl(getPreviousOrParentTNode(), attrNameToInject); +} + +export const CLEAN_PROMISE = _CLEAN_PROMISE; + + +/** + * Returns the current OpaqueViewState instance. + * + * Used in conjunction with the restoreView() instruction to save a snapshot + * of the current view and restore it when listeners are invoked. This allows + * walking the declaration view tree in listeners to get vars from parent views. + */ +export function getCurrentView(): OpaqueViewState { + return getLView() as any as OpaqueViewState; +} + +function getCleanup(view: LView): any[] { + // top level variables should not be exported for performance reasons (PERF_NOTES.md) + return view[CLEANUP] || (view[CLEANUP] = []); +} + +function getTViewCleanup(view: LView): any[] { + return view[TVIEW].cleanup || (view[TVIEW].cleanup = []); +} + +/** + * There are cases where the sub component's renderer needs to be included + * instead of the current renderer (see the componentSyntheticHost* instructions). + */ +function loadComponentRenderer(tNode: TNode, lView: LView): Renderer3 { + const componentLView = lView[tNode.index] as LView; + return componentLView[RENDERER]; +} + +/** Handles an error thrown in an LView. */ +function handleError(lView: LView, error: any): void { + const injector = lView[INJECTOR]; + const errorHandler = injector ? injector.get(ErrorHandler, null) : null; + errorHandler && errorHandler.handleError(error); +} From b71cd7b4ee303441318ce9735654f8130112d0e5 Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Thu, 28 Mar 2019 10:42:10 -0700 Subject: [PATCH 0707/1073] refactor(ivy): fix formatting issue with `select` comment (#29576) PR Close #29576 --- .../src/render3/instructions/instructions.ts | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/core/src/render3/instructions/instructions.ts b/packages/core/src/render3/instructions/instructions.ts index 387413623c..ba0f6b89db 100644 --- a/packages/core/src/render3/instructions/instructions.ts +++ b/packages/core/src/render3/instructions/instructions.ts @@ -25,7 +25,7 @@ import {executeHooks, executePreOrderHooks, registerPostOrderHooks, registerPreO import {ACTIVE_INDEX, LContainer, VIEWS} from '../interfaces/container'; import {ComponentDef, ComponentTemplate, DirectiveDef, DirectiveDefListOrFactory, PipeDefListOrFactory, RenderFlags, ViewQueriesFunction} from '../interfaces/definition'; import {INJECTOR_BLOOM_PARENT_SIZE, NodeInjectorFactory} from '../interfaces/injector'; -import {AttributeMarker, InitialInputData, InitialInputs, LocalRefExtractor, PropertyAliasValue, PropertyAliases, TAttributes, TContainerNode, TElementContainerNode, TElementNode, TIcuContainerNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType, TProjectionNode, TViewNode} from '../interfaces/node'; +import {AttributeMarker, InitialInputData, InitialInputs, LocalRefExtractor, PropertyAliasValue, TAttributes, TContainerNode, TElementContainerNode, TElementNode, TIcuContainerNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType, TProjectionNode, TViewNode} from '../interfaces/node'; import {CssSelectorList} from '../interfaces/projection'; import {LQueries} from '../interfaces/query'; import {GlobalTargetResolver, RComment, RElement, RText, Renderer3, RendererFactory3, isProceduralRenderer} from '../interfaces/renderer'; @@ -1102,17 +1102,17 @@ export function elementEnd(): void { * * ```ts * (rf: RenderFlags, ctx: any) => { - * if (rf & 1) { - * element(0, 'div'); - * } - * if (rf & 2) { - * select(0); // Select the
created above. - * property('title', 'test'); - * } - * } - * ``` - * @param index the index of the item to act on with the following instructions - */ + * if (rf & 1) { + * element(0, 'div'); + * } + * if (rf & 2) { + * select(0); // Select the
created above. + * property('title', 'test'); + * } + * } + * ``` + * @param index the index of the item to act on with the following instructions + */ export function select(index: number): void { ngDevMode && assertGreaterThan(index, -1, 'Invalid index'); ngDevMode && From a80637e9a13cbbbf67f50bcc83b531359bb3e133 Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Thu, 28 Mar 2019 14:54:22 -0700 Subject: [PATCH 0708/1073] =?UTF-8?q?feat(ivy):=20add=20=CE=94propertyInte?= =?UTF-8?q?rpolate=20instructions=20(#29576)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Adds the instructions - Adds tests for all instructions - Adds TODO to remove all tests when we are able to test this with TestBed after the compiler is updated PR Close #29576 --- .../src/render3/instructions/instructions.ts | 2940 ----------------- .../core/src/render3/instructions/property.ts | 179 +- .../instructions/property_interpolation.ts | 426 ++- .../core/src/render3/instructions/select.ts | 2 +- .../core/src/render3/instructions/shared.ts | 181 +- .../core/test/render3/instructions_spec.ts | 725 +++- 6 files changed, 1320 insertions(+), 3133 deletions(-) delete mode 100644 packages/core/src/render3/instructions/instructions.ts diff --git a/packages/core/src/render3/instructions/instructions.ts b/packages/core/src/render3/instructions/instructions.ts deleted file mode 100644 index ba0f6b89db..0000000000 --- a/packages/core/src/render3/instructions/instructions.ts +++ /dev/null @@ -1,2940 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {InjectFlags, InjectionToken, Injector} from '../../di'; -import {resolveForwardRef} from '../../di/forward_ref'; -import {ErrorHandler} from '../../error_handler'; -import {Type} from '../../interface/type'; -import {SchemaMetadata} from '../../metadata/schema'; -import {validateAgainstEventAttributes} from '../../sanitization/sanitization'; -import {Sanitizer} from '../../sanitization/security'; -import {assertDataInRange, assertDefined, assertDomNode, assertEqual, assertGreaterThan, assertLessThan, assertNotEqual} from '../../util/assert'; -import {isObservable} from '../../util/lang'; -import {assertHasParent, assertLContainerOrUndefined, assertLView, assertPreviousIsParent} from '../assert'; -import {bindingUpdated, bindingUpdated2, bindingUpdated3, bindingUpdated4} from '../bindings'; -import {attachPatchData, getComponentViewByInstance} from '../context_discovery'; -import {attachLContainerDebug, attachLViewDebug} from '../debug'; -import {diPublicInInjector, getNodeInjectable, getOrCreateInjectable, getOrCreateNodeInjectorForNode, injectAttributeImpl} from '../di'; -import {throwMultipleComponentError} from '../errors'; -import {executeHooks, executePreOrderHooks, registerPostOrderHooks, registerPreOrderHooks} from '../hooks'; -import {ACTIVE_INDEX, LContainer, VIEWS} from '../interfaces/container'; -import {ComponentDef, ComponentTemplate, DirectiveDef, DirectiveDefListOrFactory, PipeDefListOrFactory, RenderFlags, ViewQueriesFunction} from '../interfaces/definition'; -import {INJECTOR_BLOOM_PARENT_SIZE, NodeInjectorFactory} from '../interfaces/injector'; -import {AttributeMarker, InitialInputData, InitialInputs, LocalRefExtractor, PropertyAliasValue, TAttributes, TContainerNode, TElementContainerNode, TElementNode, TIcuContainerNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType, TProjectionNode, TViewNode} from '../interfaces/node'; -import {CssSelectorList} from '../interfaces/projection'; -import {LQueries} from '../interfaces/query'; -import {GlobalTargetResolver, RComment, RElement, RText, Renderer3, RendererFactory3, isProceduralRenderer} from '../interfaces/renderer'; -import {SanitizerFn} from '../interfaces/sanitization'; -import {StylingContext} from '../interfaces/styling'; -import {BINDING_INDEX, CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_VIEW, ExpandoInstructions, FLAGS, HEADER_OFFSET, HOST, INJECTOR, InitPhaseState, LView, LViewFlags, NEXT, OpaqueViewState, PARENT, QUERIES, RENDERER, RENDERER_FACTORY, RootContext, RootContextFlags, SANITIZER, TVIEW, TView, T_HOST} from '../interfaces/view'; -import {assertNodeOfPossibleTypes, assertNodeType} from '../node_assert'; -import {appendChild, appendProjectedNodes, createTextNode, insertView, removeView} from '../node_manipulation'; -import {isNodeMatchingSelectorList, matchingProjectionSelectorIndex} from '../node_selector_matcher'; -import {applyOnCreateInstructions} from '../node_util'; -import {decreaseElementDepthCount, enterView, getActiveHostContext, getBindingsEnabled, getCheckNoChangesMode, getContextLView, getCurrentDirectiveDef, getElementDepthCount, getIsParent, getLView, getPreviousOrParentTNode, getSelectedIndex, increaseElementDepthCount, isCreationMode, leaveView, nextContextImpl, resetComponentState, setActiveHost, setBindingRoot, setCheckNoChangesMode, setCurrentDirectiveDef, setCurrentQueryIndex, setIsParent, setPreviousOrParentTNode, setSelectedIndex} from '../state'; -import {getInitialClassNameValue, getInitialStyleStringValue, initializeStaticContext as initializeStaticStylingContext, patchContextWithStaticAttrs, renderInitialClasses, renderInitialStyles} from '../styling/class_and_style_bindings'; -import {getStylingContext, hasClassInput, hasStyleInput} from '../styling/util'; -import {NO_CHANGE} from '../tokens'; -import {attrsStylingIndexOf, setUpAttributes} from '../util/attrs_utils'; -import {INTERPOLATION_DELIMITER, renderStringify} from '../util/misc_utils'; -import {findComponentView, getLViewParent, getRootContext, getRootView} from '../util/view_traversal_utils'; -import {getComponentViewByIndex, getNativeByIndex, getNativeByTNode, getTNode, isComponentDef, isContentQueryHost, isRootView, loadInternal, readPatchedLView, resetPreOrderHookFlags, unwrapRNode, viewAttachedToChangeDetector} from '../util/view_utils'; - -import {BindingDirection, elementPropertyInternal, generatePropertyAliases, initializeTNodeInputs, setInputsForProperty} from './shared'; - - - -/** - * A permanent marker promise which signifies that the current CD tree is - * clean. - */ -const _CLEAN_PROMISE = Promise.resolve(null); - -/** - * Refreshes the view, executing the following steps in that order: - * triggers init hooks, refreshes dynamic embedded views, triggers content hooks, sets host - * bindings, refreshes child components. - * Note: view hooks are triggered later when leaving the view. - */ -export function refreshDescendantViews(lView: LView) { - const tView = lView[TVIEW]; - const creationMode = isCreationMode(lView); - - // This needs to be set before children are processed to support recursive components - tView.firstTemplatePass = false; - - // Resetting the bindingIndex of the current LView as the next steps may trigger change detection. - lView[BINDING_INDEX] = tView.bindingStartIndex; - - // If this is a creation pass, we should not call lifecycle hooks or evaluate bindings. - // This will be done in the update pass. - if (!creationMode) { - const checkNoChangesMode = getCheckNoChangesMode(); - - executePreOrderHooks(lView, tView, checkNoChangesMode, undefined); - - refreshDynamicEmbeddedViews(lView); - - // Content query results must be refreshed before content hooks are called. - refreshContentQueries(tView, lView); - - resetPreOrderHookFlags(lView); - executeHooks( - lView, tView.contentHooks, tView.contentCheckHooks, checkNoChangesMode, - InitPhaseState.AfterContentInitHooksToBeRun, undefined); - - setHostBindings(tView, lView); - } - - // We resolve content queries specifically marked as `static` in creation mode. Dynamic - // content queries are resolved during change detection (i.e. update mode), after embedded - // views are refreshed (see block above). - if (creationMode && tView.staticContentQueries) { - refreshContentQueries(tView, lView); - } - - refreshChildComponents(tView.components); -} - - -/** Sets the host bindings for the current view. */ -export function setHostBindings(tView: TView, viewData: LView): void { - if (tView.expandoInstructions) { - let bindingRootIndex = viewData[BINDING_INDEX] = tView.expandoStartIndex; - setBindingRoot(bindingRootIndex); - let currentDirectiveIndex = -1; - let currentElementIndex = -1; - for (let i = 0; i < tView.expandoInstructions.length; i++) { - const instruction = tView.expandoInstructions[i]; - if (typeof instruction === 'number') { - if (instruction <= 0) { - // Negative numbers mean that we are starting new EXPANDO block and need to update - // the current element and directive index. - currentElementIndex = -instruction; - // Injector block and providers are taken into account. - const providerCount = (tView.expandoInstructions[++i] as number); - bindingRootIndex += INJECTOR_BLOOM_PARENT_SIZE + providerCount; - - currentDirectiveIndex = bindingRootIndex; - } else { - // This is either the injector size (so the binding root can skip over directives - // and get to the first set of host bindings on this node) or the host var count - // (to get to the next set of host bindings on this node). - bindingRootIndex += instruction; - } - setBindingRoot(bindingRootIndex); - } else { - // If it's not a number, it's a host binding function that needs to be executed. - if (instruction !== null) { - viewData[BINDING_INDEX] = bindingRootIndex; - const hostCtx = unwrapRNode(viewData[currentDirectiveIndex]); - setActiveHost(hostCtx, currentElementIndex); - instruction(RenderFlags.Update, hostCtx, currentElementIndex); - setActiveHost(null); - } - currentDirectiveIndex++; - } - } - } -} - -/** Refreshes content queries for all directives in the given view. */ -function refreshContentQueries(tView: TView, lView: LView): void { - if (tView.contentQueries != null) { - setCurrentQueryIndex(0); - for (let i = 0; i < tView.contentQueries.length; i++) { - const directiveDefIdx = tView.contentQueries[i]; - const directiveDef = tView.data[directiveDefIdx] as DirectiveDef; - ngDevMode && - assertDefined(directiveDef.contentQueries, 'contentQueries function should be defined'); - directiveDef.contentQueries !(RenderFlags.Update, lView[directiveDefIdx], directiveDefIdx); - } - } -} - -/** Refreshes child components in the current view. */ -function refreshChildComponents(components: number[] | null): void { - if (components != null) { - for (let i = 0; i < components.length; i++) { - componentRefresh(components[i]); - } - } -} - -export function createLView( - parentLView: LView | null, tView: TView, context: T | null, flags: LViewFlags, - host: RElement | null, tHostNode: TViewNode | TElementNode | null, - rendererFactory?: RendererFactory3 | null, renderer?: Renderer3 | null, - sanitizer?: Sanitizer | null, injector?: Injector | null): LView { - const lView = tView.blueprint.slice() as LView; - lView[HOST] = host; - lView[FLAGS] = flags | LViewFlags.CreationMode | LViewFlags.Attached | LViewFlags.FirstLViewPass; - resetPreOrderHookFlags(lView); - lView[PARENT] = lView[DECLARATION_VIEW] = parentLView; - lView[CONTEXT] = context; - lView[RENDERER_FACTORY] = (rendererFactory || parentLView && parentLView[RENDERER_FACTORY]) !; - ngDevMode && assertDefined(lView[RENDERER_FACTORY], 'RendererFactory is required'); - lView[RENDERER] = (renderer || parentLView && parentLView[RENDERER]) !; - ngDevMode && assertDefined(lView[RENDERER], 'Renderer is required'); - lView[SANITIZER] = sanitizer || parentLView && parentLView[SANITIZER] || null !; - lView[INJECTOR as any] = injector || parentLView && parentLView[INJECTOR] || null; - lView[T_HOST] = tHostNode; - ngDevMode && attachLViewDebug(lView); - return lView; -} - -/** - * Create and stores the TNode, and hooks it up to the tree. - * - * @param index The index at which the TNode should be saved (null if view, since they are not - * saved). - * @param type The type of TNode to create - * @param native The native element for this node, if applicable - * @param name The tag name of the associated native element, if applicable - * @param attrs Any attrs for the native element, if applicable - */ -export function createNodeAtIndex( - index: number, type: TNodeType.Element, native: RElement | RText | null, name: string | null, - attrs: TAttributes | null): TElementNode; -export function createNodeAtIndex( - index: number, type: TNodeType.Container, native: RComment, name: string | null, - attrs: TAttributes | null): TContainerNode; -export function createNodeAtIndex( - index: number, type: TNodeType.Projection, native: null, name: null, - attrs: TAttributes | null): TProjectionNode; -export function createNodeAtIndex( - index: number, type: TNodeType.ElementContainer, native: RComment, name: string | null, - attrs: TAttributes | null): TElementContainerNode; -export function createNodeAtIndex( - index: number, type: TNodeType.IcuContainer, native: RComment, name: null, - attrs: TAttributes | null): TElementContainerNode; -export function createNodeAtIndex( - index: number, type: TNodeType, native: RText | RElement | RComment | null, name: string | null, - attrs: TAttributes | null): TElementNode&TContainerNode&TElementContainerNode&TProjectionNode& - TIcuContainerNode { - const lView = getLView(); - const tView = lView[TVIEW]; - const adjustedIndex = index + HEADER_OFFSET; - ngDevMode && - assertLessThan(adjustedIndex, lView.length, `Slot should have been initialized with null`); - lView[adjustedIndex] = native; - - const previousOrParentTNode = getPreviousOrParentTNode(); - const isParent = getIsParent(); - let tNode = tView.data[adjustedIndex] as TNode; - if (tNode == null) { - const parent = - isParent ? previousOrParentTNode : previousOrParentTNode && previousOrParentTNode.parent; - - // Parents cannot cross component boundaries because components will be used in multiple places, - // so it's only set if the view is the same. - const parentInSameView = parent && parent !== lView[T_HOST]; - const tParentNode = parentInSameView ? parent as TElementNode | TContainerNode : null; - - tNode = tView.data[adjustedIndex] = createTNode(tParentNode, type, adjustedIndex, name, attrs); - } - - // Now link ourselves into the tree. - // We need this even if tNode exists, otherwise we might end up pointing to unexisting tNodes when - // we use i18n (especially with ICU expressions that update the DOM during the update phase). - if (previousOrParentTNode) { - if (isParent && previousOrParentTNode.child == null && - (tNode.parent !== null || previousOrParentTNode.type === TNodeType.View)) { - // We are in the same view, which means we are adding content node to the parent view. - previousOrParentTNode.child = tNode; - } else if (!isParent) { - previousOrParentTNode.next = tNode; - } - } - - if (tView.firstChild == null) { - tView.firstChild = tNode; - } - - setPreviousOrParentTNode(tNode); - setIsParent(true); - return tNode as TElementNode & TViewNode & TContainerNode & TElementContainerNode & - TProjectionNode & TIcuContainerNode; -} - -export function assignTViewNodeToLView( - tView: TView, tParentNode: TNode | null, index: number, lView: LView): TViewNode { - // View nodes are not stored in data because they can be added / removed at runtime (which - // would cause indices to change). Their TNodes are instead stored in tView.node. - let tNode = tView.node; - if (tNode == null) { - ngDevMode && tParentNode && - assertNodeOfPossibleTypes(tParentNode, TNodeType.Element, TNodeType.Container); - tView.node = tNode = createTNode( - tParentNode as TElementNode | TContainerNode | null, // - TNodeType.View, index, null, null) as TViewNode; - } - - return lView[T_HOST] = tNode as TViewNode; -} - - -/** - * When elements are created dynamically after a view blueprint is created (e.g. through - * i18nApply() or ComponentFactory.create), we need to adjust the blueprint for future - * template passes. - */ -export function allocExpando(view: LView, numSlotsToAlloc: number) { - const tView = view[TVIEW]; - if (tView.firstTemplatePass) { - for (let i = 0; i < numSlotsToAlloc; i++) { - tView.blueprint.push(null); - tView.data.push(null); - view.push(null); - } - - // We should only increment the expando start index if there aren't already directives - // and injectors saved in the "expando" section - if (!tView.expandoInstructions) { - tView.expandoStartIndex += numSlotsToAlloc; - } else { - // Since we're adding the dynamic nodes into the expando section, we need to let the host - // bindings know that they should skip x slots - tView.expandoInstructions.push(numSlotsToAlloc); - } - } -} - - -////////////////////////// -//// Render -////////////////////////// - -/** - * - * @param hostNode Existing node to render into. - * @param templateFn Template function with the instructions. - * @param consts The number of nodes, local refs, and pipes in this template - * @param context to pass into the template. - * @param providedRendererFactory renderer factory to use - * @param host The host element node to use - * @param directives Directive defs that should be used for matching - * @param pipes Pipe defs that should be used for matching - */ -export function renderTemplate( - hostNode: RElement, templateFn: ComponentTemplate, consts: number, vars: number, context: T, - providedRendererFactory: RendererFactory3, componentView: LView | null, - directives?: DirectiveDefListOrFactory | null, pipes?: PipeDefListOrFactory | null, - sanitizer?: Sanitizer | null): LView { - if (componentView === null) { - resetComponentState(); - const renderer = providedRendererFactory.createRenderer(null, null); - - // We need to create a root view so it's possible to look up the host element through its index - const hostLView = createLView( - null, createTView(-1, null, 1, 0, null, null, null, null), {}, - LViewFlags.CheckAlways | LViewFlags.IsRoot, null, null, providedRendererFactory, renderer); - enterView(hostLView, null); // SUSPECT! why do we need to enter the View? - - const componentTView = - getOrCreateTView(templateFn, consts, vars, directives || null, pipes || null, null, null); - const hostTNode = createNodeAtIndex(0, TNodeType.Element, hostNode, null, null); - componentView = createLView( - hostLView, componentTView, context, LViewFlags.CheckAlways, hostNode, hostTNode, - providedRendererFactory, renderer, sanitizer); - } - renderComponentOrTemplate(componentView, context, templateFn); - return componentView; -} - -/** - * Used for creating the LViewNode of a dynamic embedded view, - * either through ViewContainerRef.createEmbeddedView() or TemplateRef.createEmbeddedView(). - * Such lViewNode will then be renderer with renderEmbeddedTemplate() (see below). - */ -export function createEmbeddedViewAndNode( - tView: TView, context: T, declarationView: LView, queries: LQueries | null, - injectorIndex: number): LView { - const _isParent = getIsParent(); - const _previousOrParentTNode = getPreviousOrParentTNode(); - setIsParent(true); - setPreviousOrParentTNode(null !); - - const lView = createLView(declarationView, tView, context, LViewFlags.CheckAlways, null, null); - lView[DECLARATION_VIEW] = declarationView; - - if (queries) { - lView[QUERIES] = queries.createView(); - } - assignTViewNodeToLView(tView, null, -1, lView); - - if (tView.firstTemplatePass) { - tView.node !.injectorIndex = injectorIndex; - } - - setIsParent(_isParent); - setPreviousOrParentTNode(_previousOrParentTNode); - return lView; -} - -/** - * Used for rendering embedded views (e.g. dynamically created views) - * - * Dynamically created views must store/retrieve their TViews differently from component views - * because their template functions are nested in the template functions of their hosts, creating - * closures. If their host template happens to be an embedded template in a loop (e.g. ngFor inside - * an ngFor), the nesting would mean we'd have multiple instances of the template function, so we - * can't store TViews in the template function itself (as we do for comps). Instead, we store the - * TView for dynamically created views on their host TNode, which only has one instance. - */ -export function renderEmbeddedTemplate(viewToRender: LView, tView: TView, context: T) { - const _isParent = getIsParent(); - const _previousOrParentTNode = getPreviousOrParentTNode(); - let oldView: LView; - if (viewToRender[FLAGS] & LViewFlags.IsRoot) { - // This is a root view inside the view tree - tickRootContext(getRootContext(viewToRender)); - } else { - try { - setIsParent(true); - setPreviousOrParentTNode(null !); - - oldView = enterView(viewToRender, viewToRender[T_HOST]); - resetPreOrderHookFlags(viewToRender); - namespaceHTML(); - - // Reset the selected index so we can assert that `select` was called later - ngDevMode && setSelectedIndex(-1); - - tView.template !(getRenderFlags(viewToRender), context); - // This must be set to false immediately after the first creation run because in an - // ngFor loop, all the views will be created together before update mode runs and turns - // off firstTemplatePass. If we don't set it here, instances will perform directive - // matching, etc again and again. - viewToRender[TVIEW].firstTemplatePass = false; - - refreshDescendantViews(viewToRender); - } finally { - leaveView(oldView !); - setIsParent(_isParent); - setPreviousOrParentTNode(_previousOrParentTNode); - } - } -} - -/** - * Retrieves a context at the level specified and saves it as the global, contextViewData. - * Will get the next level up if level is not specified. - * - * This is used to save contexts of parent views so they can be bound in embedded views, or - * in conjunction with reference() to bind a ref from a parent view. - * - * @param level The relative level of the view from which to grab context compared to contextVewData - * @returns context - */ -export function nextContext(level: number = 1): T { - return nextContextImpl(level); -} - -function renderComponentOrTemplate( - hostView: LView, context: T, templateFn?: ComponentTemplate) { - const rendererFactory = hostView[RENDERER_FACTORY]; - const oldView = enterView(hostView, hostView[T_HOST]); - const normalExecutionPath = !getCheckNoChangesMode(); - const creationModeIsActive = isCreationMode(hostView); - try { - if (normalExecutionPath && !creationModeIsActive && rendererFactory.begin) { - rendererFactory.begin(); - } - - if (creationModeIsActive) { - // creation mode pass - if (templateFn) { - namespaceHTML(); - - // Reset the selected index so we can assert that `select` was called later - ngDevMode && setSelectedIndex(-1); - - templateFn(RenderFlags.Create, context); - } - - refreshDescendantViews(hostView); - hostView[FLAGS] &= ~LViewFlags.CreationMode; - } - - // update mode pass - resetPreOrderHookFlags(hostView); - templateFn && templateFn(RenderFlags.Update, context); - refreshDescendantViews(hostView); - } finally { - if (normalExecutionPath && !creationModeIsActive && rendererFactory.end) { - rendererFactory.end(); - } - leaveView(oldView); - } -} - -/** - * This function returns the default configuration of rendering flags depending on when the - * template is in creation mode or update mode. Update block and create block are - * always run separately. - */ -function getRenderFlags(view: LView): RenderFlags { - return isCreationMode(view) ? RenderFlags.Create : RenderFlags.Update; -} - -////////////////////////// -//// Namespace -////////////////////////// - -let _currentNamespace: string|null = null; - -export function namespaceSVG() { - _currentNamespace = 'http://www.w3.org/2000/svg'; -} - -export function namespaceMathML() { - _currentNamespace = 'http://www.w3.org/1998/MathML/'; -} - -export function namespaceHTML() { - _currentNamespace = null; -} - -////////////////////////// -//// Element -////////////////////////// - -/** - * Creates an empty element using {@link elementStart} and {@link elementEnd} - * - * @param index Index of the element in the data array - * @param name Name of the DOM Node - * @param attrs Statically bound set of attributes, classes, and styles to be written into the DOM - * element on creation. Use [AttributeMarker] to denote the meaning of this array. - * @param localRefs A set of local reference bindings on the element. - */ -export function element( - index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void { - elementStart(index, name, attrs, localRefs); - elementEnd(); -} - -/** - * Creates a logical container for other nodes () backed by a comment node in the DOM. - * The instruction must later be followed by `elementContainerEnd()` call. - * - * @param index Index of the element in the LView array - * @param attrs Set of attributes to be used when matching directives. - * @param localRefs A set of local reference bindings on the element. - * - * Even if this instruction accepts a set of attributes no actual attribute values are propagated to - * the DOM (as a comment node can't have attributes). Attributes are here only for directive - * matching purposes and setting initial inputs of directives. - */ -export function elementContainerStart( - index: number, attrs?: TAttributes | null, localRefs?: string[] | null): void { - const lView = getLView(); - const tView = lView[TVIEW]; - const renderer = lView[RENDERER]; - const tagName = 'ng-container'; - ngDevMode && assertEqual( - lView[BINDING_INDEX], tView.bindingStartIndex, - 'element containers should be created before any bindings'); - - ngDevMode && ngDevMode.rendererCreateComment++; - const native = renderer.createComment(ngDevMode ? tagName : ''); - - ngDevMode && assertDataInRange(lView, index - 1); - const tNode = - createNodeAtIndex(index, TNodeType.ElementContainer, native, tagName, attrs || null); - - - if (attrs) { - // While ng-container doesn't necessarily support styling, we use the style context to identify - // and execute directives on the ng-container. - setNodeStylingTemplate(tView, tNode, attrs, 0); - } - - appendChild(native, tNode, lView); - createDirectivesAndLocals(tView, lView, localRefs); - attachPatchData(native, lView); - - const currentQueries = lView[QUERIES]; - if (currentQueries) { - currentQueries.addNode(tNode); - lView[QUERIES] = currentQueries.clone(); - } - executeContentQueries(tView, tNode, lView); -} - -/** - * Appropriately sets `stylingTemplate` on a TNode - * - * Does not apply styles to DOM nodes - * - * @param tNode The node whose `stylingTemplate` to set - * @param attrs The attribute array source to set the attributes from - * @param attrsStartIndex Optional start index to start processing the `attrs` from - */ -function setNodeStylingTemplate( - tView: TView, tNode: TNode, attrs: TAttributes, attrsStartIndex: number) { - if (tView.firstTemplatePass && !tNode.stylingTemplate) { - const stylingAttrsStartIndex = attrsStylingIndexOf(attrs, attrsStartIndex); - if (stylingAttrsStartIndex >= 0) { - tNode.stylingTemplate = initializeStaticStylingContext(attrs, stylingAttrsStartIndex); - } - } -} - -function executeContentQueries(tView: TView, tNode: TNode, lView: LView) { - if (isContentQueryHost(tNode)) { - const start = tNode.directiveStart; - const end = tNode.directiveEnd; - for (let directiveIndex = start; directiveIndex < end; directiveIndex++) { - const def = tView.data[directiveIndex] as DirectiveDef; - if (def.contentQueries) { - def.contentQueries(RenderFlags.Create, lView[directiveIndex], directiveIndex); - } - } - } -} - -/** Mark the end of the . */ -export function elementContainerEnd(): void { - let previousOrParentTNode = getPreviousOrParentTNode(); - const lView = getLView(); - const tView = lView[TVIEW]; - if (getIsParent()) { - setIsParent(false); - } else { - ngDevMode && assertHasParent(previousOrParentTNode); - previousOrParentTNode = previousOrParentTNode.parent !; - setPreviousOrParentTNode(previousOrParentTNode); - } - - ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.ElementContainer); - const currentQueries = lView[QUERIES]; - if (currentQueries) { - lView[QUERIES] = currentQueries.parent; - } - - registerPostOrderHooks(tView, previousOrParentTNode); -} - -/** - * Create DOM element. The instruction must later be followed by `elementEnd()` call. - * - * @param index Index of the element in the LView array - * @param name Name of the DOM Node - * @param attrs Statically bound set of attributes, classes, and styles to be written into the DOM - * element on creation. Use [AttributeMarker] to denote the meaning of this array. - * @param localRefs A set of local reference bindings on the element. - * - * Attributes and localRefs are passed as an array of strings where elements with an even index - * hold an attribute name and elements with an odd index hold an attribute value, ex.: - * ['id', 'warning5', 'class', 'alert'] - */ -export function elementStart( - index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void { - const lView = getLView(); - const tView = lView[TVIEW]; - ngDevMode && assertEqual( - lView[BINDING_INDEX], tView.bindingStartIndex, - 'elements should be created before any bindings '); - - ngDevMode && ngDevMode.rendererCreateElement++; - - const native = elementCreate(name); - const renderer = lView[RENDERER]; - - ngDevMode && assertDataInRange(lView, index - 1); - - const tNode = createNodeAtIndex(index, TNodeType.Element, native !, name, attrs || null); - let initialStylesIndex = 0; - let initialClassesIndex = 0; - - if (attrs) { - const lastAttrIndex = setUpAttributes(native, attrs); - - // it's important to only prepare styling-related datastructures once for a given - // tNode and not each time an element is created. Also, the styling code is designed - // to be patched and constructed at various points, but only up until the styling - // template is first allocated (which happens when the very first style/class binding - // value is evaluated). When the template is allocated (when it turns into a context) - // then the styling template is locked and cannot be further extended (it can only be - // instantiated into a context per element) - setNodeStylingTemplate(tView, tNode, attrs, lastAttrIndex); - - if (tNode.stylingTemplate) { - // the initial style/class values are rendered immediately after having been - // initialized into the context so the element styling is ready when directives - // are initialized (since they may read style/class values in their constructor) - initialStylesIndex = renderInitialStyles(native, tNode.stylingTemplate, renderer); - initialClassesIndex = renderInitialClasses(native, tNode.stylingTemplate, renderer); - } - } - - appendChild(native, tNode, lView); - createDirectivesAndLocals(tView, lView, localRefs); - - // any immediate children of a component or template container must be pre-emptively - // monkey-patched with the component view data so that the element can be inspected - // later on using any element discovery utility methods (see `element_discovery.ts`) - if (getElementDepthCount() === 0) { - attachPatchData(native, lView); - } - increaseElementDepthCount(); - - // if a directive contains a host binding for "class" then all class-based data will - // flow through that (except for `[class.prop]` bindings). This also includes initial - // static class values as well. (Note that this will be fixed once map-based `[style]` - // and `[class]` bindings work for multiple directives.) - if (tView.firstTemplatePass) { - const inputData = initializeTNodeInputs(tNode); - if (inputData && inputData.hasOwnProperty('class')) { - tNode.flags |= TNodeFlags.hasClassInput; - } - if (inputData && inputData.hasOwnProperty('style')) { - tNode.flags |= TNodeFlags.hasStyleInput; - } - } - - // we render the styling again below in case any directives have set any `style` and/or - // `class` host attribute values... - if (tNode.stylingTemplate) { - renderInitialClasses(native, tNode.stylingTemplate, renderer, initialClassesIndex); - renderInitialStyles(native, tNode.stylingTemplate, renderer, initialStylesIndex); - } - - const currentQueries = lView[QUERIES]; - if (currentQueries) { - currentQueries.addNode(tNode); - lView[QUERIES] = currentQueries.clone(); - } - executeContentQueries(tView, tNode, lView); -} - -/** - * Creates a native element from a tag name, using a renderer. - * @param name the tag name - * @param overriddenRenderer Optional A renderer to override the default one - * @returns the element created - */ -export function elementCreate(name: string, overriddenRenderer?: Renderer3): RElement { - let native: RElement; - const rendererToUse = overriddenRenderer || getLView()[RENDERER]; - - if (isProceduralRenderer(rendererToUse)) { - native = rendererToUse.createElement(name, _currentNamespace); - } else { - if (_currentNamespace === null) { - native = rendererToUse.createElement(name); - } else { - native = rendererToUse.createElementNS(_currentNamespace, name); - } - } - return native; -} - -/** - * Creates directive instances and populates local refs. - * - * @param localRefs Local refs of the node in question - * @param localRefExtractor mapping function that extracts local ref value from TNode - */ -function createDirectivesAndLocals( - tView: TView, lView: LView, localRefs: string[] | null | undefined, - localRefExtractor: LocalRefExtractor = getNativeByTNode) { - if (!getBindingsEnabled()) return; - const previousOrParentTNode = getPreviousOrParentTNode(); - if (tView.firstTemplatePass) { - ngDevMode && ngDevMode.firstTemplatePass++; - resolveDirectives( - tView, lView, findDirectiveMatches(tView, lView, previousOrParentTNode), - previousOrParentTNode, localRefs || null); - } - instantiateAllDirectives(tView, lView, previousOrParentTNode); - invokeDirectivesHostBindings(tView, lView, previousOrParentTNode); - saveResolvedLocalsInData(lView, previousOrParentTNode, localRefExtractor); -} - -/** - * Takes a list of local names and indices and pushes the resolved local variable values - * to LView in the same order as they are loaded in the template with load(). - */ -function saveResolvedLocalsInData( - viewData: LView, tNode: TNode, localRefExtractor: LocalRefExtractor): void { - const localNames = tNode.localNames; - if (localNames) { - let localIndex = tNode.index + 1; - for (let i = 0; i < localNames.length; i += 2) { - const index = localNames[i + 1] as number; - const value = index === -1 ? - localRefExtractor( - tNode as TElementNode | TContainerNode | TElementContainerNode, viewData) : - viewData[index]; - viewData[localIndex++] = value; - } - } -} - -/** - * Gets TView from a template function or creates a new TView - * if it doesn't already exist. - * - * @param templateFn The template from which to get static data - * @param consts The number of nodes, local refs, and pipes in this view - * @param vars The number of bindings and pure function bindings in this view - * @param directives Directive defs that should be saved on TView - * @param pipes Pipe defs that should be saved on TView - * @param viewQuery View query that should be saved on TView - * @param schemas Schemas that should be saved on TView - * @returns TView - */ -export function getOrCreateTView( - templateFn: ComponentTemplate, consts: number, vars: number, - directives: DirectiveDefListOrFactory | null, pipes: PipeDefListOrFactory | null, - viewQuery: ViewQueriesFunction| null, schemas: SchemaMetadata[] | null): TView { - // TODO(misko): reading `ngPrivateData` here is problematic for two reasons - // 1. It is a megamorphic call on each invocation. - // 2. For nested embedded views (ngFor inside ngFor) the template instance is per - // outer template invocation, which means that no such property will exist - // Correct solution is to only put `ngPrivateData` on the Component template - // and not on embedded templates. - - return templateFn.ngPrivateData || - (templateFn.ngPrivateData = createTView( - -1, templateFn, consts, vars, directives, pipes, viewQuery, schemas) as never); -} - -/** - * Creates a TView instance - * - * @param viewIndex The viewBlockId for inline views, or -1 if it's a component/dynamic - * @param templateFn Template function - * @param consts The number of nodes, local refs, and pipes in this template - * @param directives Registry of directives for this view - * @param pipes Registry of pipes for this view - * @param viewQuery View queries for this view - * @param schemas Schemas for this view - */ -export function createTView( - viewIndex: number, templateFn: ComponentTemplate| null, consts: number, vars: number, - directives: DirectiveDefListOrFactory | null, pipes: PipeDefListOrFactory | null, - viewQuery: ViewQueriesFunction| null, schemas: SchemaMetadata[] | null): TView { - ngDevMode && ngDevMode.tView++; - const bindingStartIndex = HEADER_OFFSET + consts; - // This length does not yet contain host bindings from child directives because at this point, - // we don't know which directives are active on this template. As soon as a directive is matched - // that has a host binding, we will update the blueprint with that def's hostVars count. - const initialViewLength = bindingStartIndex + vars; - const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength); - return blueprint[TVIEW as any] = { - id: viewIndex, - blueprint: blueprint, - template: templateFn, - viewQuery: viewQuery, - node: null !, - data: blueprint.slice().fill(null, bindingStartIndex), - bindingStartIndex: bindingStartIndex, - viewQueryStartIndex: initialViewLength, - expandoStartIndex: initialViewLength, - expandoInstructions: null, - firstTemplatePass: true, - staticViewQueries: false, - staticContentQueries: false, - preOrderHooks: null, - preOrderCheckHooks: null, - contentHooks: null, - contentCheckHooks: null, - viewHooks: null, - viewCheckHooks: null, - destroyHooks: null, - cleanup: null, - contentQueries: null, - components: null, - directiveRegistry: typeof directives === 'function' ? directives() : directives, - pipeRegistry: typeof pipes === 'function' ? pipes() : pipes, - firstChild: null, - schemas: schemas, - }; -} - -function createViewBlueprint(bindingStartIndex: number, initialViewLength: number): LView { - const blueprint = new Array(initialViewLength) - .fill(null, 0, bindingStartIndex) - .fill(NO_CHANGE, bindingStartIndex) as LView; - blueprint[BINDING_INDEX] = bindingStartIndex; - return blueprint; -} - -export function createError(text: string, token: any) { - return new Error(`Renderer: ${text} [${renderStringify(token)}]`); -} - - -/** - * Locates the host native element, used for bootstrapping existing nodes into rendering pipeline. - * - * @param elementOrSelector Render element or CSS selector to locate the element. - */ -export function locateHostElement( - factory: RendererFactory3, elementOrSelector: RElement | string): RElement|null { - const defaultRenderer = factory.createRenderer(null, null); - const rNode = typeof elementOrSelector === 'string' ? - (isProceduralRenderer(defaultRenderer) ? - defaultRenderer.selectRootElement(elementOrSelector) : - defaultRenderer.querySelector(elementOrSelector)) : - elementOrSelector; - if (ngDevMode && !rNode) { - if (typeof elementOrSelector === 'string') { - throw createError('Host node with selector not found:', elementOrSelector); - } else { - throw createError('Host node is required:', elementOrSelector); - } - } - return rNode; -} - -/** - * Adds an event listener to the current node. - * - * If an output exists on one of the node's directives, it also subscribes to the output - * and saves the subscription for later cleanup. - * - * @param eventName Name of the event - * @param listenerFn The function to be called when event emits - * @param useCapture Whether or not to use capture in event listener - * @param eventTargetResolver Function that returns global target information in case this listener - * should be attached to a global object like window, document or body - */ -export function listener( - eventName: string, listenerFn: (e?: any) => any, useCapture = false, - eventTargetResolver?: GlobalTargetResolver): void { - listenerInternal(eventName, listenerFn, useCapture, eventTargetResolver); -} - -/** - * Registers a synthetic host listener (e.g. `(@foo.start)`) on a component. - * - * This instruction is for compatibility purposes and is designed to ensure that a - * synthetic host listener (e.g. `@HostListener('@foo.start')`) properly gets rendered - * in the component's renderer. Normally all host listeners are evaluated with the - * parent component's renderer, but, in the case of animation @triggers, they need - * to be evaluated with the sub component's renderer (because that's where the - * animation triggers are defined). - * - * Do not use this instruction as a replacement for `listener`. This instruction - * only exists to ensure compatibility with the ViewEngine's host binding behavior. - * - * @param eventName Name of the event - * @param listenerFn The function to be called when event emits - * @param useCapture Whether or not to use capture in event listener - * @param eventTargetResolver Function that returns global target information in case this listener - * should be attached to a global object like window, document or body - */ -export function componentHostSyntheticListener( - eventName: string, listenerFn: (e?: any) => any, useCapture = false, - eventTargetResolver?: GlobalTargetResolver): void { - listenerInternal(eventName, listenerFn, useCapture, eventTargetResolver, loadComponentRenderer); -} - -function listenerInternal( - eventName: string, listenerFn: (e?: any) => any, useCapture = false, - eventTargetResolver?: GlobalTargetResolver, - loadRendererFn?: ((tNode: TNode, lView: LView) => Renderer3) | null): void { - const lView = getLView(); - const tNode = getPreviousOrParentTNode(); - const tView = lView[TVIEW]; - const firstTemplatePass = tView.firstTemplatePass; - const tCleanup: false|any[] = firstTemplatePass && (tView.cleanup || (tView.cleanup = [])); - - ngDevMode && assertNodeOfPossibleTypes( - tNode, TNodeType.Element, TNodeType.Container, TNodeType.ElementContainer); - - // add native event listener - applicable to elements only - if (tNode.type === TNodeType.Element) { - const native = getNativeByTNode(tNode, lView) as RElement; - const resolved = eventTargetResolver ? eventTargetResolver(native) : {} as any; - const target = resolved.target || native; - ngDevMode && ngDevMode.rendererAddEventListener++; - const renderer = loadRendererFn ? loadRendererFn(tNode, lView) : lView[RENDERER]; - const lCleanup = getCleanup(lView); - const lCleanupIndex = lCleanup.length; - let useCaptureOrSubIdx: boolean|number = useCapture; - - // In order to match current behavior, native DOM event listeners must be added for all - // events (including outputs). - if (isProceduralRenderer(renderer)) { - // The first argument of `listen` function in Procedural Renderer is: - // - either a target name (as a string) in case of global target (window, document, body) - // - or element reference (in all other cases) - listenerFn = wrapListener(tNode, lView, listenerFn, false /** preventDefault */); - const cleanupFn = renderer.listen(resolved.name || target, eventName, listenerFn); - lCleanup.push(listenerFn, cleanupFn); - useCaptureOrSubIdx = lCleanupIndex + 1; - } else { - listenerFn = wrapListener(tNode, lView, listenerFn, true /** preventDefault */); - target.addEventListener(eventName, listenerFn, useCapture); - lCleanup.push(listenerFn); - } - - const idxOrTargetGetter = eventTargetResolver ? - (_lView: LView) => eventTargetResolver(unwrapRNode(_lView[tNode.index])).target : - tNode.index; - tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, useCaptureOrSubIdx); - } - - // subscribe to directive outputs - if (tNode.outputs === undefined) { - // if we create TNode here, inputs must be undefined so we know they still need to be - // checked - tNode.outputs = generatePropertyAliases(tNode, BindingDirection.Output); - } - - const outputs = tNode.outputs; - let props: PropertyAliasValue|undefined; - if (outputs && (props = outputs[eventName])) { - const propsLength = props.length; - if (propsLength) { - const lCleanup = getCleanup(lView); - for (let i = 0; i < propsLength; i += 3) { - const index = props[i] as number; - ngDevMode && assertDataInRange(lView, index); - const minifiedName = props[i + 2]; - const directiveInstance = lView[index]; - const output = directiveInstance[minifiedName]; - - if (ngDevMode && !isObservable(output)) { - throw new Error( - `@Output ${minifiedName} not initialized in '${directiveInstance.constructor.name}'.`); - } - - const subscription = output.subscribe(listenerFn); - const idx = lCleanup.length; - lCleanup.push(listenerFn, subscription); - tCleanup && tCleanup.push(eventName, tNode.index, idx, -(idx + 1)); - } - } - } -} - -/** - * Saves context for this cleanup function in LView.cleanupInstances. - * - * On the first template pass, saves in TView: - * - Cleanup function - * - Index of context we just saved in LView.cleanupInstances - */ -export function storeCleanupWithContext(lView: LView, context: any, cleanupFn: Function): void { - const lCleanup = getCleanup(lView); - lCleanup.push(context); - - if (lView[TVIEW].firstTemplatePass) { - getTViewCleanup(lView).push(cleanupFn, lCleanup.length - 1); - } -} - -/** - * Saves the cleanup function itself in LView.cleanupInstances. - * - * This is necessary for functions that are wrapped with their contexts, like in renderer2 - * listeners. - * - * On the first template pass, the index of the cleanup function is saved in TView. - */ -export function storeCleanupFn(view: LView, cleanupFn: Function): void { - getCleanup(view).push(cleanupFn); - - if (view[TVIEW].firstTemplatePass) { - getTViewCleanup(view).push(view[CLEANUP] !.length - 1, null); - } -} - -/** Mark the end of the element. */ -export function elementEnd(): void { - let previousOrParentTNode = getPreviousOrParentTNode(); - if (getIsParent()) { - setIsParent(false); - } else { - ngDevMode && assertHasParent(getPreviousOrParentTNode()); - previousOrParentTNode = previousOrParentTNode.parent !; - setPreviousOrParentTNode(previousOrParentTNode); - } - - // this is required for all host-level styling-related instructions to run - // in the correct order - previousOrParentTNode.onElementCreationFns && applyOnCreateInstructions(previousOrParentTNode); - - ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.Element); - const lView = getLView(); - const currentQueries = lView[QUERIES]; - if (currentQueries) { - lView[QUERIES] = currentQueries.parent; - } - - registerPostOrderHooks(getLView()[TVIEW], previousOrParentTNode); - decreaseElementDepthCount(); - - // this is fired at the end of elementEnd because ALL of the stylingBindings code - // (for directives and the template) have now executed which means the styling - // context can be instantiated properly. - if (hasClassInput(previousOrParentTNode)) { - const stylingContext = getStylingContext(previousOrParentTNode.index, lView); - setInputsForProperty( - lView, previousOrParentTNode.inputs !['class'] !, getInitialClassNameValue(stylingContext)); - } - if (hasStyleInput(previousOrParentTNode)) { - const stylingContext = getStylingContext(previousOrParentTNode.index, lView); - setInputsForProperty( - lView, previousOrParentTNode.inputs !['style'] !, - getInitialStyleStringValue(stylingContext)); - } -} - - -/** - * Selects an index of an item to act on and flushes lifecycle hooks up to this point - * - * Used in conjunction with instructions like {@link property} to act on elements with specified - * indices, for example those created with {@link element} or {@link elementStart}. - * - * ```ts - * (rf: RenderFlags, ctx: any) => { - * if (rf & 1) { - * element(0, 'div'); - * } - * if (rf & 2) { - * select(0); // Select the
created above. - * property('title', 'test'); - * } - * } - * ``` - * @param index the index of the item to act on with the following instructions - */ -export function select(index: number): void { - ngDevMode && assertGreaterThan(index, -1, 'Invalid index'); - ngDevMode && - assertLessThan( - index, getLView().length - HEADER_OFFSET, 'Should be within range for the view data'); - setSelectedIndex(index); - const lView = getLView(); - executePreOrderHooks(lView, lView[TVIEW], getCheckNoChangesMode(), index); -} - -/** - * Updates the value of removes an attribute on an Element. - * - * @param number index The index of the element in the data array - * @param name name The name of the attribute. - * @param value value The attribute is removed when value is `null` or `undefined`. - * Otherwise the attribute value is set to the stringified value. - * @param sanitizer An optional function used to sanitize the value. - * @param namespace Optional namespace to use when setting the attribute. - */ -export function elementAttribute( - index: number, name: string, value: any, sanitizer?: SanitizerFn | null, - namespace?: string): void { - if (value !== NO_CHANGE) { - ngDevMode && validateAgainstEventAttributes(name); - const lView = getLView(); - const renderer = lView[RENDERER]; - const element = getNativeByIndex(index, lView) as RElement; - if (value == null) { - ngDevMode && ngDevMode.rendererRemoveAttribute++; - isProceduralRenderer(renderer) ? renderer.removeAttribute(element, name, namespace) : - element.removeAttribute(name); - } else { - ngDevMode && ngDevMode.rendererSetAttribute++; - const tNode = getTNode(index, lView); - const strValue = - sanitizer == null ? renderStringify(value) : sanitizer(value, tNode.tagName || '', name); - - - if (isProceduralRenderer(renderer)) { - renderer.setAttribute(element, name, strValue, namespace); - } else { - namespace ? element.setAttributeNS(namespace, name, strValue) : - element.setAttribute(name, strValue); - } - } - } -} - -/** - * **TODO: Remove this function after `property` is in use** - * Update a property on an element. - * - * If the property name also exists as an input property on one of the element's directives, - * the component property will be set instead of the element property. This check must - * be conducted at runtime so child components that add new @Inputs don't have to be re-compiled. - * - * @param index The index of the element to update in the data array - * @param propName Name of property. Because it is going to DOM, this is not subject to - * renaming as part of minification. - * @param value New value to write. - * @param sanitizer An optional function used to sanitize the value. - * @param nativeOnly Whether or not we should only set native properties and skip input check - * (this is necessary for host property bindings) - */ -export function elementProperty( - index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, - nativeOnly?: boolean): void { - elementPropertyInternal(index, propName, value, sanitizer, nativeOnly); -} - -/** - * Updates a synthetic host binding (e.g. `[@foo]`) on a component. - * - * This instruction is for compatibility purposes and is designed to ensure that a - * synthetic host binding (e.g. `@HostBinding('@foo')`) properly gets rendered in - * the component's renderer. Normally all host bindings are evaluated with the parent - * component's renderer, but, in the case of animation @triggers, they need to be - * evaluated with the sub component's renderer (because that's where the animation - * triggers are defined). - * - * Do not use this instruction as a replacement for `elementProperty`. This instruction - * only exists to ensure compatibility with the ViewEngine's host binding behavior. - * - * @param index The index of the element to update in the data array - * @param propName Name of property. Because it is going to DOM, this is not subject to - * renaming as part of minification. - * @param value New value to write. - * @param sanitizer An optional function used to sanitize the value. - * @param nativeOnly Whether or not we should only set native properties and skip input check - * (this is necessary for host property bindings) - */ -export function componentHostSyntheticProperty( - index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, - nativeOnly?: boolean) { - elementPropertyInternal(index, propName, value, sanitizer, nativeOnly, loadComponentRenderer); -} - -/** - * Constructs a TNode object from the arguments. - * - * @param type The type of the node - * @param adjustedIndex The index of the TNode in TView.data, adjusted for HEADER_OFFSET - * @param tagName The tag name of the node - * @param attrs The attributes defined on this node - * @param tViews Any TViews attached to this node - * @returns the TNode object - */ -export function createTNode( - tParent: TElementNode | TContainerNode | null, type: TNodeType, adjustedIndex: number, - tagName: string | null, attrs: TAttributes | null): TNode { - ngDevMode && ngDevMode.tNode++; - return { - type: type, - index: adjustedIndex, - injectorIndex: tParent ? tParent.injectorIndex : -1, - directiveStart: -1, - directiveEnd: -1, - propertyMetadataStartIndex: -1, - propertyMetadataEndIndex: -1, - flags: 0, - providerIndexes: 0, - tagName: tagName, - attrs: attrs, - localNames: null, - initialInputs: undefined, - inputs: undefined, - outputs: undefined, - tViews: null, - next: null, - projectionNext: null, - child: null, - parent: tParent, - stylingTemplate: null, - projection: null, - onElementCreationFns: null, - }; -} - -/** - * Assign static attribute values to a host element. - * - * This instruction will assign static attribute values as well as class and style - * values to an element within the host bindings function. Since attribute values - * can consist of different types of values, the `attrs` array must include the values in - * the following format: - * - * attrs = [ - * // static attributes (like `title`, `name`, `id`...) - * attr1, value1, attr2, value, - * - * // a single namespace value (like `x:id`) - * NAMESPACE_MARKER, namespaceUri1, name1, value1, - * - * // another single namespace value (like `x:name`) - * NAMESPACE_MARKER, namespaceUri2, name2, value2, - * - * // a series of CSS classes that will be applied to the element (no spaces) - * CLASSES_MARKER, class1, class2, class3, - * - * // a series of CSS styles (property + value) that will be applied to the element - * STYLES_MARKER, prop1, value1, prop2, value2 - * ] - * - * All non-class and non-style attributes must be defined at the start of the list - * first before all class and style values are set. When there is a change in value - * type (like when classes and styles are introduced) a marker must be used to separate - * the entries. The marker values themselves are set via entries found in the - * [AttributeMarker] enum. - * - * NOTE: This instruction is meant to used from `hostBindings` function only. - * - * @param directive A directive instance the styling is associated with. - * @param attrs An array of static values (attributes, classes and styles) with the correct marker - * values. - * - * @publicApi - */ -export function elementHostAttrs(attrs: TAttributes) { - const tNode = getPreviousOrParentTNode(); - const lView = getLView(); - const native = getNativeByTNode(tNode, lView) as RElement; - const lastAttrIndex = setUpAttributes(native, attrs); - const stylingAttrsStartIndex = attrsStylingIndexOf(attrs, lastAttrIndex); - if (stylingAttrsStartIndex >= 0) { - const directive = getActiveHostContext(); - if (tNode.stylingTemplate) { - patchContextWithStaticAttrs(tNode.stylingTemplate, attrs, stylingAttrsStartIndex, directive); - } else { - tNode.stylingTemplate = - initializeStaticStylingContext(attrs, stylingAttrsStartIndex, directive); - } - } -} - -////////////////////////// -//// Text -////////////////////////// - -/** - * Create static text node - * - * @param index Index of the node in the data array - * @param value Value to write. This value will be stringified. - */ -export function text(index: number, value?: any): void { - const lView = getLView(); - ngDevMode && assertEqual( - lView[BINDING_INDEX], lView[TVIEW].bindingStartIndex, - 'text nodes should be created before any bindings'); - ngDevMode && ngDevMode.rendererCreateTextNode++; - const textNative = createTextNode(value, lView[RENDERER]); - const tNode = createNodeAtIndex(index, TNodeType.Element, textNative, null, null); - - // Text nodes are self closing. - setIsParent(false); - appendChild(textNative, tNode, lView); -} - -/** - * Create text node with binding - * Bindings should be handled externally with the proper interpolation(1-8) method - * - * @param index Index of the node in the data array. - * @param value Stringified value to write. - */ -export function textBinding(index: number, value: T | NO_CHANGE): void { - if (value !== NO_CHANGE) { - const lView = getLView(); - ngDevMode && assertDataInRange(lView, index + HEADER_OFFSET); - const element = getNativeByIndex(index, lView) as any as RText; - ngDevMode && assertDefined(element, 'native element should exist'); - ngDevMode && ngDevMode.rendererSetText++; - const renderer = lView[RENDERER]; - isProceduralRenderer(renderer) ? renderer.setValue(element, renderStringify(value)) : - element.textContent = renderStringify(value); - } -} - -////////////////////////// -//// Directive -////////////////////////// - -/** - * Instantiate a root component. - */ -export function instantiateRootComponent( - tView: TView, viewData: LView, def: ComponentDef): T { - const rootTNode = getPreviousOrParentTNode(); - if (tView.firstTemplatePass) { - if (def.providersResolver) def.providersResolver(def); - generateExpandoInstructionBlock(tView, rootTNode, 1); - baseResolveDirective(tView, viewData, def, def.factory); - } - const directive = - getNodeInjectable(tView.data, viewData, viewData.length - 1, rootTNode as TElementNode); - postProcessBaseDirective(viewData, rootTNode, directive); - return directive; -} - -/** - * Resolve the matched directives on a node. - */ -function resolveDirectives( - tView: TView, viewData: LView, directives: DirectiveDef[] | null, tNode: TNode, - localRefs: string[] | null): void { - // Please make sure to have explicit type for `exportsMap`. Inferred type triggers bug in tsickle. - ngDevMode && assertEqual(tView.firstTemplatePass, true, 'should run on first template pass only'); - const exportsMap: ({[key: string]: number} | null) = localRefs ? {'': -1} : null; - if (directives) { - initNodeFlags(tNode, tView.data.length, directives.length); - // When the same token is provided by several directives on the same node, some rules apply in - // the viewEngine: - // - viewProviders have priority over providers - // - the last directive in NgModule.declarations has priority over the previous one - // So to match these rules, the order in which providers are added in the arrays is very - // important. - for (let i = 0; i < directives.length; i++) { - const def = directives[i] as DirectiveDef; - if (def.providersResolver) def.providersResolver(def); - } - generateExpandoInstructionBlock(tView, tNode, directives.length); - const initialPreOrderHooksLength = (tView.preOrderHooks && tView.preOrderHooks.length) || 0; - const initialPreOrderCheckHooksLength = - (tView.preOrderCheckHooks && tView.preOrderCheckHooks.length) || 0; - const nodeIndex = tNode.index - HEADER_OFFSET; - for (let i = 0; i < directives.length; i++) { - const def = directives[i] as DirectiveDef; - - const directiveDefIdx = tView.data.length; - baseResolveDirective(tView, viewData, def, def.factory); - - saveNameToExportMap(tView.data !.length - 1, def, exportsMap); - - // Init hooks are queued now so ngOnInit is called in host components before - // any projected components. - registerPreOrderHooks( - directiveDefIdx, def, tView, nodeIndex, initialPreOrderHooksLength, - initialPreOrderCheckHooksLength); - } - } - if (exportsMap) cacheMatchingLocalNames(tNode, localRefs, exportsMap); -} - -/** - * Instantiate all the directives that were previously resolved on the current node. - */ -function instantiateAllDirectives(tView: TView, lView: LView, tNode: TNode) { - const start = tNode.directiveStart; - const end = tNode.directiveEnd; - if (!tView.firstTemplatePass && start < end) { - getOrCreateNodeInjectorForNode( - tNode as TElementNode | TContainerNode | TElementContainerNode, lView); - } - for (let i = start; i < end; i++) { - const def = tView.data[i] as DirectiveDef; - if (isComponentDef(def)) { - addComponentLogic(lView, tNode, def as ComponentDef); - } - const directive = getNodeInjectable(tView.data, lView !, i, tNode as TElementNode); - postProcessDirective(lView, directive, def, i); - } -} - -function invokeDirectivesHostBindings(tView: TView, viewData: LView, tNode: TNode) { - const start = tNode.directiveStart; - const end = tNode.directiveEnd; - const expando = tView.expandoInstructions !; - const firstTemplatePass = tView.firstTemplatePass; - for (let i = start; i < end; i++) { - const def = tView.data[i] as DirectiveDef; - const directive = viewData[i]; - if (def.hostBindings) { - invokeHostBindingsInCreationMode(def, expando, directive, tNode, firstTemplatePass); - } else if (firstTemplatePass) { - expando.push(null); - } - } -} - -export function invokeHostBindingsInCreationMode( - def: DirectiveDef, expando: ExpandoInstructions, directive: any, tNode: TNode, - firstTemplatePass: boolean) { - const previousExpandoLength = expando.length; - setCurrentDirectiveDef(def); - const elementIndex = tNode.index - HEADER_OFFSET; - setActiveHost(directive, elementIndex); - def.hostBindings !(RenderFlags.Create, directive, elementIndex); - setActiveHost(null); - setCurrentDirectiveDef(null); - // `hostBindings` function may or may not contain `allocHostVars` call - // (e.g. it may not if it only contains host listeners), so we need to check whether - // `expandoInstructions` has changed and if not - we still push `hostBindings` to - // expando block, to make sure we execute it for DI cycle - if (previousExpandoLength === expando.length && firstTemplatePass) { - expando.push(def.hostBindings); - } -} - -/** -* Generates a new block in TView.expandoInstructions for this node. -* -* Each expando block starts with the element index (turned negative so we can distinguish -* it from the hostVar count) and the directive count. See more in VIEW_DATA.md. -*/ -export function generateExpandoInstructionBlock( - tView: TView, tNode: TNode, directiveCount: number): void { - ngDevMode && assertEqual( - tView.firstTemplatePass, true, - 'Expando block should only be generated on first template pass.'); - - const elementIndex = -(tNode.index - HEADER_OFFSET); - const providerStartIndex = tNode.providerIndexes & TNodeProviderIndexes.ProvidersStartIndexMask; - const providerCount = tView.data.length - providerStartIndex; - (tView.expandoInstructions || (tView.expandoInstructions = [ - ])).push(elementIndex, providerCount, directiveCount); -} - -/** -* On the first template pass, we need to reserve space for host binding values -* after directives are matched (so all directives are saved, then bindings). -* Because we are updating the blueprint, we only need to do this once. -*/ -function prefillHostVars(tView: TView, lView: LView, totalHostVars: number): void { - ngDevMode && - assertEqual(tView.firstTemplatePass, true, 'Should only be called in first template pass.'); - for (let i = 0; i < totalHostVars; i++) { - lView.push(NO_CHANGE); - tView.blueprint.push(NO_CHANGE); - tView.data.push(null); - } -} - -/** - * Process a directive on the current node after its creation. - */ -function postProcessDirective( - viewData: LView, directive: T, def: DirectiveDef, directiveDefIdx: number): void { - const previousOrParentTNode = getPreviousOrParentTNode(); - postProcessBaseDirective(viewData, previousOrParentTNode, directive); - ngDevMode && assertDefined(previousOrParentTNode, 'previousOrParentTNode'); - if (previousOrParentTNode && previousOrParentTNode.attrs) { - setInputsFromAttrs(directiveDefIdx, directive, def, previousOrParentTNode); - } - - if (viewData[TVIEW].firstTemplatePass && def.contentQueries) { - previousOrParentTNode.flags |= TNodeFlags.hasContentQuery; - } - - if (isComponentDef(def)) { - const componentView = getComponentViewByIndex(previousOrParentTNode.index, viewData); - componentView[CONTEXT] = directive; - } -} - -/** - * A lighter version of postProcessDirective() that is used for the root component. - */ -function postProcessBaseDirective( - lView: LView, previousOrParentTNode: TNode, directive: T): void { - const native = getNativeByTNode(previousOrParentTNode, lView); - - ngDevMode && assertEqual( - lView[BINDING_INDEX], lView[TVIEW].bindingStartIndex, - 'directives should be created before any bindings'); - ngDevMode && assertPreviousIsParent(getIsParent()); - - attachPatchData(directive, lView); - if (native) { - attachPatchData(native, lView); - } -} - - - -/** -* Matches the current node against all available selectors. -* If a component is matched (at most one), it is returned in first position in the array. -*/ -function findDirectiveMatches(tView: TView, viewData: LView, tNode: TNode): DirectiveDef[]| - null { - ngDevMode && assertEqual(tView.firstTemplatePass, true, 'should run on first template pass only'); - const registry = tView.directiveRegistry; - let matches: any[]|null = null; - if (registry) { - for (let i = 0; i < registry.length; i++) { - const def = registry[i] as ComponentDef| DirectiveDef; - if (isNodeMatchingSelectorList(tNode, def.selectors !, /* isProjectionMode */ false)) { - matches || (matches = []); - diPublicInInjector( - getOrCreateNodeInjectorForNode( - getPreviousOrParentTNode() as TElementNode | TContainerNode | TElementContainerNode, - viewData), - viewData, def.type); - - if (isComponentDef(def)) { - if (tNode.flags & TNodeFlags.isComponent) throwMultipleComponentError(tNode); - tNode.flags = TNodeFlags.isComponent; - - // The component is always stored first with directives after. - matches.unshift(def); - } else { - matches.push(def); - } - } - } - } - return matches; -} - -/** Stores index of component's host element so it will be queued for view refresh during CD. */ -export function queueComponentIndexForCheck(previousOrParentTNode: TNode): void { - const tView = getLView()[TVIEW]; - ngDevMode && - assertEqual(tView.firstTemplatePass, true, 'Should only be called in first template pass.'); - (tView.components || (tView.components = [])).push(previousOrParentTNode.index); -} - -/** - * Stores host binding fn and number of host vars so it will be queued for binding refresh during - * CD. -*/ -function queueHostBindingForCheck( - tView: TView, def: DirectiveDef| ComponentDef, hostVars: number): void { - ngDevMode && - assertEqual(tView.firstTemplatePass, true, 'Should only be called in first template pass.'); - const expando = tView.expandoInstructions !; - const length = expando.length; - // Check whether a given `hostBindings` function already exists in expandoInstructions, - // which can happen in case directive definition was extended from base definition (as a part of - // the `InheritDefinitionFeature` logic). If we found the same `hostBindings` function in the - // list, we just increase the number of host vars associated with that function, but do not add it - // into the list again. - if (length >= 2 && expando[length - 2] === def.hostBindings) { - expando[length - 1] = (expando[length - 1] as number) + hostVars; - } else { - expando.push(def.hostBindings !, hostVars); - } -} - -/** Caches local names and their matching directive indices for query and template lookups. */ -function cacheMatchingLocalNames( - tNode: TNode, localRefs: string[] | null, exportsMap: {[key: string]: number}): void { - if (localRefs) { - const localNames: (string | number)[] = tNode.localNames = []; - - // Local names must be stored in tNode in the same order that localRefs are defined - // in the template to ensure the data is loaded in the same slots as their refs - // in the template (for template queries). - for (let i = 0; i < localRefs.length; i += 2) { - const index = exportsMap[localRefs[i + 1]]; - if (index == null) throw new Error(`Export of name '${localRefs[i + 1]}' not found!`); - localNames.push(localRefs[i], index); - } - } -} - -/** -* Builds up an export map as directives are created, so local refs can be quickly mapped -* to their directive instances. -*/ -function saveNameToExportMap( - index: number, def: DirectiveDef| ComponentDef, - exportsMap: {[key: string]: number} | null) { - if (exportsMap) { - if (def.exportAs) { - for (let i = 0; i < def.exportAs.length; i++) { - exportsMap[def.exportAs[i]] = index; - } - } - if ((def as ComponentDef).template) exportsMap[''] = index; - } -} - -/** - * Initializes the flags on the current node, setting all indices to the initial index, - * the directive count to 0, and adding the isComponent flag. - * @param index the initial index - */ -export function initNodeFlags(tNode: TNode, index: number, numberOfDirectives: number) { - const flags = tNode.flags; - ngDevMode && assertEqual( - flags === 0 || flags === TNodeFlags.isComponent, true, - 'expected node flags to not be initialized'); - - ngDevMode && assertNotEqual( - numberOfDirectives, tNode.directiveEnd - tNode.directiveStart, - 'Reached the max number of directives'); - // When the first directive is created on a node, save the index - tNode.flags = flags & TNodeFlags.isComponent; - tNode.directiveStart = index; - tNode.directiveEnd = index + numberOfDirectives; - tNode.providerIndexes = index; -} - -function baseResolveDirective( - tView: TView, viewData: LView, def: DirectiveDef, - directiveFactory: (t: Type| null) => any) { - tView.data.push(def); - const nodeInjectorFactory = new NodeInjectorFactory(directiveFactory, isComponentDef(def), null); - tView.blueprint.push(nodeInjectorFactory); - viewData.push(nodeInjectorFactory); -} - -function addComponentLogic( - lView: LView, previousOrParentTNode: TNode, def: ComponentDef): void { - const native = getNativeByTNode(previousOrParentTNode, lView); - - const tView = getOrCreateTView( - def.template, def.consts, def.vars, def.directiveDefs, def.pipeDefs, def.viewQuery, - def.schemas); - - // Only component views should be added to the view tree directly. Embedded views are - // accessed through their containers because they may be removed / re-added later. - const rendererFactory = lView[RENDERER_FACTORY]; - const componentView = addToViewTree( - lView, createLView( - lView, tView, null, def.onPush ? LViewFlags.Dirty : LViewFlags.CheckAlways, - lView[previousOrParentTNode.index], previousOrParentTNode as TElementNode, - rendererFactory, lView[RENDERER_FACTORY].createRenderer(native as RElement, def))); - - componentView[T_HOST] = previousOrParentTNode as TElementNode; - - // Component view will always be created before any injected LContainers, - // so this is a regular element, wrap it with the component view - lView[previousOrParentTNode.index] = componentView; - - if (lView[TVIEW].firstTemplatePass) { - queueComponentIndexForCheck(previousOrParentTNode); - } -} - -/** - * Sets initial input properties on directive instances from attribute data - * - * @param directiveIndex Index of the directive in directives array - * @param instance Instance of the directive on which to set the initial inputs - * @param inputs The list of inputs from the directive def - * @param tNode The static data for this node - */ -function setInputsFromAttrs( - directiveIndex: number, instance: T, def: DirectiveDef, tNode: TNode): void { - let initialInputData = tNode.initialInputs as InitialInputData | undefined; - if (initialInputData === undefined || directiveIndex >= initialInputData.length) { - initialInputData = generateInitialInputs(directiveIndex, def.inputs, tNode); - } - - const initialInputs: InitialInputs|null = initialInputData[directiveIndex]; - if (initialInputs) { - const setInput = def.setInput; - for (let i = 0; i < initialInputs.length;) { - const publicName = initialInputs[i++]; - const privateName = initialInputs[i++]; - const value = initialInputs[i++]; - if (setInput) { - def.setInput !(instance, value, publicName, privateName); - } else { - (instance as any)[privateName] = value; - } - } - } -} - -/** - * Generates initialInputData for a node and stores it in the template's static storage - * so subsequent template invocations don't have to recalculate it. - * - * initialInputData is an array containing values that need to be set as input properties - * for directives on this node, but only once on creation. We need this array to support - * the case where you set an @Input property of a directive using attribute-like syntax. - * e.g. if you have a `name` @Input, you can set it once like this: - * - * - * - * @param directiveIndex Index to store the initial input data - * @param inputs The list of inputs from the directive def - * @param tNode The static data on this node - */ -function generateInitialInputs( - directiveIndex: number, inputs: {[key: string]: string}, tNode: TNode): InitialInputData { - const initialInputData: InitialInputData = tNode.initialInputs || (tNode.initialInputs = []); - initialInputData[directiveIndex] = null; - - const attrs = tNode.attrs !; - let i = 0; - while (i < attrs.length) { - const attrName = attrs[i]; - if (attrName === AttributeMarker.NamespaceURI) { - // We do not allow inputs on namespaced attributes. - i += 4; - continue; - } - - // If we hit any other attribute markers, we're done anyway. None of those are valid inputs. - if (typeof attrName === 'number') break; - - const minifiedInputName = inputs[attrName]; - const attrValue = attrs[i + 1]; - - if (minifiedInputName !== undefined) { - const inputsToStore: InitialInputs = - initialInputData[directiveIndex] || (initialInputData[directiveIndex] = []); - inputsToStore.push(attrName, minifiedInputName, attrValue as string); - } - - i += 2; - } - return initialInputData; -} - -////////////////////////// -//// ViewContainer & View -////////////////////////// - -/** - * Creates a LContainer, either from a container instruction, or for a ViewContainerRef. - * - * @param hostNative The host element for the LContainer - * @param hostTNode The host TNode for the LContainer - * @param currentView The parent view of the LContainer - * @param native The native comment element - * @param isForViewContainerRef Optional a flag indicating the ViewContainerRef case - * @returns LContainer - */ -export function createLContainer( - hostNative: RElement | RComment | StylingContext | LView, currentView: LView, native: RComment, - tNode: TNode, isForViewContainerRef?: boolean): LContainer { - ngDevMode && assertDomNode(native); - ngDevMode && assertLView(currentView); - const lContainer: LContainer = [ - hostNative, // host native - true, // Boolean `true` in this position signifies that this is an `LContainer` - isForViewContainerRef ? -1 : 0, // active index - currentView, // parent - null, // next - null, // queries - tNode, // t_host - native, // native - [], // views - ]; - ngDevMode && attachLContainerDebug(lContainer); - return lContainer; -} - -/** - * Creates an LContainer for an ng-template (dynamically-inserted view), e.g. - * - * - *
- *
- * - * @param index The index of the container in the data array - * @param templateFn Inline template - * @param consts The number of nodes, local refs, and pipes for this template - * @param vars The number of bindings for this template - * @param tagName The name of the container element, if applicable - * @param attrs The attrs attached to the container, if applicable - * @param localRefs A set of local reference bindings on the element. - * @param localRefExtractor A function which extracts local-refs values from the template. - * Defaults to the current element associated with the local-ref. - */ -export function template( - index: number, templateFn: ComponentTemplate| null, consts: number, vars: number, - tagName?: string | null, attrs?: TAttributes | null, localRefs?: string[] | null, - localRefExtractor?: LocalRefExtractor) { - const lView = getLView(); - const tView = lView[TVIEW]; - - // TODO: consider a separate node type for templates - const tContainerNode = containerInternal(index, tagName || null, attrs || null); - if (tView.firstTemplatePass) { - tContainerNode.tViews = createTView( - -1, templateFn, consts, vars, tView.directiveRegistry, tView.pipeRegistry, null, null); - } - - createDirectivesAndLocals(tView, lView, localRefs, localRefExtractor); - addTContainerToQueries(lView, tContainerNode); - attachPatchData(getNativeByTNode(tContainerNode, lView), lView); - registerPostOrderHooks(tView, tContainerNode); - setIsParent(false); -} - -/** - * Creates an LContainer for inline views, e.g. - * - * % if (showing) { - *
- * % } - * - * @param index The index of the container in the data array - */ -export function container(index: number): void { - const tNode = containerInternal(index, null, null); - const lView = getLView(); - if (lView[TVIEW].firstTemplatePass) { - tNode.tViews = []; - } - addTContainerToQueries(lView, tNode); - setIsParent(false); -} - -function containerInternal( - index: number, tagName: string | null, attrs: TAttributes | null): TContainerNode { - const lView = getLView(); - ngDevMode && assertEqual( - lView[BINDING_INDEX], lView[TVIEW].bindingStartIndex, - 'container nodes should be created before any bindings'); - - const adjustedIndex = index + HEADER_OFFSET; - const comment = lView[RENDERER].createComment(ngDevMode ? 'container' : ''); - ngDevMode && ngDevMode.rendererCreateComment++; - const tNode = createNodeAtIndex(index, TNodeType.Container, comment, tagName, attrs); - const lContainer = lView[adjustedIndex] = - createLContainer(lView[adjustedIndex], lView, comment, tNode); - - appendChild(comment, tNode, lView); - - // Containers are added to the current view tree instead of their embedded views - // because views can be removed and re-inserted. - addToViewTree(lView, lContainer); - - ngDevMode && assertNodeType(getPreviousOrParentTNode(), TNodeType.Container); - return tNode; -} - -/** - * Reporting a TContainer node queries is a 2-step process as we need to: - * - check if the container node itself is matching (query might match a node); - * - prepare room for nodes from views that might be created based on the TemplateRef linked to this - * container. - * - * Those 2 operations need to happen in the specific order (match the container node itself, then - * prepare space for nodes from views). - */ -function addTContainerToQueries(lView: LView, tContainerNode: TContainerNode): void { - const queries = lView[QUERIES]; - if (queries) { - queries.addNode(tContainerNode); - const lContainer = lView[tContainerNode.index]; - lContainer[QUERIES] = queries.container(); - } -} - -/** - * Sets a container up to receive views. - * - * @param index The index of the container in the data array - */ -export function containerRefreshStart(index: number): void { - const lView = getLView(); - const tView = lView[TVIEW]; - let previousOrParentTNode = loadInternal(tView.data, index) as TNode; - setPreviousOrParentTNode(previousOrParentTNode); - - ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.Container); - setIsParent(true); - - lView[index + HEADER_OFFSET][ACTIVE_INDEX] = 0; - - // We need to execute init hooks here so ngOnInit hooks are called in top level views - // before they are called in embedded views (for backwards compatibility). - executePreOrderHooks(lView, tView, getCheckNoChangesMode(), undefined); -} - -/** - * Marks the end of the LContainer. - * - * Marking the end of LContainer is the time when to child views get inserted or removed. - */ -export function containerRefreshEnd(): void { - let previousOrParentTNode = getPreviousOrParentTNode(); - if (getIsParent()) { - setIsParent(false); - } else { - ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.View); - ngDevMode && assertHasParent(previousOrParentTNode); - previousOrParentTNode = previousOrParentTNode.parent !; - setPreviousOrParentTNode(previousOrParentTNode); - } - - ngDevMode && assertNodeType(previousOrParentTNode, TNodeType.Container); - - const lContainer = getLView()[previousOrParentTNode.index]; - const nextIndex = lContainer[ACTIVE_INDEX]; - - // remove extra views at the end of the container - while (nextIndex < lContainer[VIEWS].length) { - removeView(lContainer, nextIndex); - } -} - -/** - * Goes over dynamic embedded views (ones created through ViewContainerRef APIs) and refreshes them - * by executing an associated template function. - */ -function refreshDynamicEmbeddedViews(lView: LView) { - for (let current = lView[CHILD_HEAD]; current !== null; current = current[NEXT]) { - // Note: current can be an LView or an LContainer instance, but here we are only interested - // in LContainer. We can tell it's an LContainer because its length is less than the LView - // header. - if (current.length < HEADER_OFFSET && current[ACTIVE_INDEX] === -1) { - const container = current as LContainer; - for (let i = 0; i < container[VIEWS].length; i++) { - const dynamicViewData = container[VIEWS][i]; - // The directives and pipes are not needed here as an existing view is only being refreshed. - ngDevMode && assertDefined(dynamicViewData[TVIEW], 'TView must be allocated'); - renderEmbeddedTemplate(dynamicViewData, dynamicViewData[TVIEW], dynamicViewData[CONTEXT] !); - } - } - } -} - - -/** - * Looks for a view with a given view block id inside a provided LContainer. - * Removes views that need to be deleted in the process. - * - * @param lContainer to search for views - * @param startIdx starting index in the views array to search from - * @param viewBlockId exact view block id to look for - * @returns index of a found view or -1 if not found - */ -function scanForView(lContainer: LContainer, startIdx: number, viewBlockId: number): LView|null { - const views = lContainer[VIEWS]; - for (let i = startIdx; i < views.length; i++) { - const viewAtPositionId = views[i][TVIEW].id; - if (viewAtPositionId === viewBlockId) { - return views[i]; - } else if (viewAtPositionId < viewBlockId) { - // found a view that should not be at this position - remove - removeView(lContainer, i); - } else { - // found a view with id greater than the one we are searching for - // which means that required view doesn't exist and can't be found at - // later positions in the views array - stop the searchdef.cont here - break; - } - } - return null; -} - -/** - * Marks the start of an embedded view. - * - * @param viewBlockId The ID of this view - * @return boolean Whether or not this view is in creation mode - */ -export function embeddedViewStart(viewBlockId: number, consts: number, vars: number): RenderFlags { - const lView = getLView(); - const previousOrParentTNode = getPreviousOrParentTNode(); - // The previous node can be a view node if we are processing an inline for loop - const containerTNode = previousOrParentTNode.type === TNodeType.View ? - previousOrParentTNode.parent ! : - previousOrParentTNode; - const lContainer = lView[containerTNode.index] as LContainer; - - ngDevMode && assertNodeType(containerTNode, TNodeType.Container); - let viewToRender = scanForView(lContainer, lContainer[ACTIVE_INDEX] !, viewBlockId); - - if (viewToRender) { - setIsParent(true); - enterView(viewToRender, viewToRender[TVIEW].node); - } else { - // When we create a new LView, we always reset the state of the instructions. - viewToRender = createLView( - lView, - getOrCreateEmbeddedTView(viewBlockId, consts, vars, containerTNode as TContainerNode), null, - LViewFlags.CheckAlways, null, null); - - if (lContainer[QUERIES]) { - viewToRender[QUERIES] = lContainer[QUERIES] !.createView(); - } - - const tParentNode = getIsParent() ? previousOrParentTNode : - previousOrParentTNode && previousOrParentTNode.parent; - assignTViewNodeToLView(viewToRender[TVIEW], tParentNode, viewBlockId, viewToRender); - enterView(viewToRender, viewToRender[TVIEW].node); - } - if (lContainer) { - if (isCreationMode(viewToRender)) { - // it is a new view, insert it into collection of views for a given container - insertView(viewToRender, lContainer, lContainer[ACTIVE_INDEX] !); - } - lContainer[ACTIVE_INDEX] !++; - } - return isCreationMode(viewToRender) ? RenderFlags.Create | RenderFlags.Update : - RenderFlags.Update; -} - -/** - * Initialize the TView (e.g. static data) for the active embedded view. - * - * Each embedded view block must create or retrieve its own TView. Otherwise, the embedded view's - * static data for a particular node would overwrite the static data for a node in the view above - * it with the same index (since it's in the same template). - * - * @param viewIndex The index of the TView in TNode.tViews - * @param consts The number of nodes, local refs, and pipes in this template - * @param vars The number of bindings and pure function bindings in this template - * @param container The parent container in which to look for the view's static data - * @returns TView - */ -function getOrCreateEmbeddedTView( - viewIndex: number, consts: number, vars: number, parent: TContainerNode): TView { - const tView = getLView()[TVIEW]; - ngDevMode && assertNodeType(parent, TNodeType.Container); - const containerTViews = parent.tViews as TView[]; - ngDevMode && assertDefined(containerTViews, 'TView expected'); - ngDevMode && assertEqual(Array.isArray(containerTViews), true, 'TViews should be in an array'); - if (viewIndex >= containerTViews.length || containerTViews[viewIndex] == null) { - containerTViews[viewIndex] = createTView( - viewIndex, null, consts, vars, tView.directiveRegistry, tView.pipeRegistry, null, null); - } - return containerTViews[viewIndex]; -} - -/** Marks the end of an embedded view. */ -export function embeddedViewEnd(): void { - const lView = getLView(); - const viewHost = lView[T_HOST]; - - if (isCreationMode(lView)) { - refreshDescendantViews(lView); // creation mode pass - lView[FLAGS] &= ~LViewFlags.CreationMode; - } - resetPreOrderHookFlags(lView); - refreshDescendantViews(lView); // update mode pass - const lContainer = lView[PARENT] as LContainer; - ngDevMode && assertLContainerOrUndefined(lContainer); - leaveView(lContainer[PARENT] !); - setPreviousOrParentTNode(viewHost !); - setIsParent(false); -} - -///////////// - -/** - * Refreshes components by entering the component view and processing its bindings, queries, etc. - * - * @param adjustedElementIndex Element index in LView[] (adjusted for HEADER_OFFSET) - */ -export function componentRefresh(adjustedElementIndex: number): void { - const lView = getLView(); - ngDevMode && assertDataInRange(lView, adjustedElementIndex); - const hostView = getComponentViewByIndex(adjustedElementIndex, lView); - ngDevMode && assertNodeType(lView[TVIEW].data[adjustedElementIndex] as TNode, TNodeType.Element); - - // Only attached CheckAlways components or attached, dirty OnPush components should be checked - if (viewAttachedToChangeDetector(hostView) && - hostView[FLAGS] & (LViewFlags.CheckAlways | LViewFlags.Dirty)) { - syncViewWithBlueprint(hostView); - checkView(hostView, hostView[CONTEXT]); - } -} - -/** - * Syncs an LView instance with its blueprint if they have gotten out of sync. - * - * Typically, blueprints and their view instances should always be in sync, so the loop here - * will be skipped. However, consider this case of two components side-by-side: - * - * App template: - * ``` - * - * - * ``` - * - * The following will happen: - * 1. App template begins processing. - * 2. First is matched as a component and its LView is created. - * 3. Second is matched as a component and its LView is created. - * 4. App template completes processing, so it's time to check child templates. - * 5. First template is checked. It has a directive, so its def is pushed to blueprint. - * 6. Second template is checked. Its blueprint has been updated by the first - * template, but its LView was created before this update, so it is out of sync. - * - * Note that embedded views inside ngFor loops will never be out of sync because these views - * are processed as soon as they are created. - * - * @param componentView The view to sync - */ -function syncViewWithBlueprint(componentView: LView) { - const componentTView = componentView[TVIEW]; - for (let i = componentView.length; i < componentTView.blueprint.length; i++) { - componentView[i] = componentTView.blueprint[i]; - } -} - -/** - * Instruction to distribute projectable nodes among occurrences in a given template. - * It takes all the selectors from the entire component's template and decides where - * each projected node belongs (it re-distributes nodes among "buckets" where each "bucket" is - * backed by a selector). - * - * This function requires CSS selectors to be provided in 2 forms: parsed (by a compiler) and text, - * un-parsed form. - * - * The parsed form is needed for efficient matching of a node against a given CSS selector. - * The un-parsed, textual form is needed for support of the ngProjectAs attribute. - * - * Having a CSS selector in 2 different formats is not ideal, but alternatives have even more - * drawbacks: - * - having only a textual form would require runtime parsing of CSS selectors; - * - we can't have only a parsed as we can't re-construct textual form from it (as entered by a - * template author). - * - * @param selectors A collection of parsed CSS selectors - * @param rawSelectors A collection of CSS selectors in the raw, un-parsed form - */ -export function projectionDef(selectors?: CssSelectorList[], textSelectors?: string[]): void { - const componentNode = findComponentView(getLView())[T_HOST] as TElementNode; - - if (!componentNode.projection) { - const noOfNodeBuckets = selectors ? selectors.length + 1 : 1; - const projectionHeads: (TNode | null)[] = componentNode.projection = - new Array(noOfNodeBuckets).fill(null); - const tails: (TNode | null)[] = projectionHeads.slice(); - - let componentChild: TNode|null = componentNode.child; - - while (componentChild !== null) { - const bucketIndex = selectors ? - matchingProjectionSelectorIndex(componentChild, selectors, textSelectors !) : - 0; - - if (tails[bucketIndex]) { - tails[bucketIndex] !.projectionNext = componentChild; - } else { - projectionHeads[bucketIndex] = componentChild; - } - tails[bucketIndex] = componentChild; - - componentChild = componentChild.next; - } - } -} - - -/** - * Inserts previously re-distributed projected nodes. This instruction must be preceded by a call - * to the projectionDef instruction. - * - * @param nodeIndex - * @param selectorIndex: - * - 0 when the selector is `*` (or unspecified as this is the default value), - * - 1 based index of the selector from the {@link projectionDef} - */ -export function projection(nodeIndex: number, selectorIndex: number = 0, attrs?: string[]): void { - const lView = getLView(); - const tProjectionNode = - createNodeAtIndex(nodeIndex, TNodeType.Projection, null, null, attrs || null); - - // We can't use viewData[HOST_NODE] because projection nodes can be nested in embedded views. - if (tProjectionNode.projection === null) tProjectionNode.projection = selectorIndex; - - // `` has no content - setIsParent(false); - - // re-distribution of projectable nodes is stored on a component's view level - appendProjectedNodes(lView, tProjectionNode, selectorIndex, findComponentView(lView)); -} - -/** - * Adds LView or LContainer to the end of the current view tree. - * - * This structure will be used to traverse through nested views to remove listeners - * and call onDestroy callbacks. - * - * @param lView The view where LView or LContainer should be added - * @param adjustedHostIndex Index of the view's host node in LView[], adjusted for header - * @param lViewOrLContainer The LView or LContainer to add to the view tree - * @returns The state passed in - */ -export function addToViewTree(lView: LView, lViewOrLContainer: T): T { - // TODO(benlesh/misko): This implementation is incorrect, because it always adds the LContainer to - // the end of the queue, which means if the developer retrieves the LContainers from RNodes out of - // order, the change detection will run out of order, as the act of retrieving the the LContainer - // from the RNode is what adds it to the queue. - if (lView[CHILD_HEAD]) { - lView[CHILD_TAIL] ![NEXT] = lViewOrLContainer; - } else { - lView[CHILD_HEAD] = lViewOrLContainer; - } - lView[CHILD_TAIL] = lViewOrLContainer; - return lViewOrLContainer; -} - -/** - * Wraps an event listener with a function that marks ancestors dirty and prevents default behavior, - * if applicable. - * - * @param tNode The TNode associated with this listener - * @param lView The LView that contains this listener - * @param listenerFn The listener function to call - * @param wrapWithPreventDefault Whether or not to prevent default behavior - * (the procedural renderer does this already, so in those cases, we should skip) - */ -function wrapListener( - tNode: TNode, lView: LView, listenerFn: (e?: any) => any, - wrapWithPreventDefault: boolean): EventListener { - // Note: we are performing most of the work in the listener function itself - // to optimize listener registration. - return function wrapListenerIn_markDirtyAndPreventDefault(e: Event) { - // In order to be backwards compatible with View Engine, events on component host nodes - // must also mark the component view itself dirty (i.e. the view that it owns). - const startView = - tNode.flags & TNodeFlags.isComponent ? getComponentViewByIndex(tNode.index, lView) : lView; - - // See interfaces/view.ts for more on LViewFlags.ManualOnPush - if ((lView[FLAGS] & LViewFlags.ManualOnPush) === 0) { - markViewDirty(startView); - } - - try { - const result = listenerFn(e); - if (wrapWithPreventDefault && result === false) { - e.preventDefault(); - // Necessary for legacy browsers that don't support preventDefault (e.g. IE) - e.returnValue = false; - } - return result; - } catch (error) { - handleError(lView, error); - } - }; -} - -/** - * Marks current view and all ancestors dirty. - * - * Returns the root view because it is found as a byproduct of marking the view tree - * dirty, and can be used by methods that consume markViewDirty() to easily schedule - * change detection. Otherwise, such methods would need to traverse up the view tree - * an additional time to get the root view and schedule a tick on it. - * - * @param lView The starting LView to mark dirty - * @returns the root LView - */ -export function markViewDirty(lView: LView): LView|null { - while (lView) { - lView[FLAGS] |= LViewFlags.Dirty; - const parent = getLViewParent(lView); - // Stop traversing up as soon as you find a root view that wasn't attached to any container - if (isRootView(lView) && !parent) { - return lView; - } - // continue otherwise - lView = parent !; - } - return null; -} - -/** - * Used to perform change detection on the whole application. - * - * This is equivalent to `detectChanges`, but invoked on root component. Additionally, `tick` - * executes lifecycle hooks and conditionally checks components based on their - * `ChangeDetectionStrategy` and dirtiness. - * - * The preferred way to trigger change detection is to call `markDirty`. `markDirty` internally - * schedules `tick` using a scheduler in order to coalesce multiple `markDirty` calls into a - * single change detection run. By default, the scheduler is `requestAnimationFrame`, but can - * be changed when calling `renderComponent` and providing the `scheduler` option. - */ -export function tick(component: T): void { - const rootView = getRootView(component); - const rootContext = rootView[CONTEXT] as RootContext; - tickRootContext(rootContext); -} - -/** - * Used to schedule change detection on the whole application. - * - * Unlike `tick`, `scheduleTick` coalesces multiple calls into one change detection run. - * It is usually called indirectly by calling `markDirty` when the view needs to be - * re-rendered. - * - * Typically `scheduleTick` uses `requestAnimationFrame` to coalesce multiple - * `scheduleTick` requests. The scheduling function can be overridden in - * `renderComponent`'s `scheduler` option. - */ -export function scheduleTick(rootContext: RootContext, flags: RootContextFlags) { - const nothingScheduled = rootContext.flags === RootContextFlags.Empty; - rootContext.flags |= flags; - - if (nothingScheduled && rootContext.clean == _CLEAN_PROMISE) { - let res: null|((val: null) => void); - rootContext.clean = new Promise((r) => res = r); - rootContext.scheduler(() => { - if (rootContext.flags & RootContextFlags.DetectChanges) { - rootContext.flags &= ~RootContextFlags.DetectChanges; - tickRootContext(rootContext); - } - - if (rootContext.flags & RootContextFlags.FlushPlayers) { - rootContext.flags &= ~RootContextFlags.FlushPlayers; - const playerHandler = rootContext.playerHandler; - if (playerHandler) { - playerHandler.flushPlayers(); - } - } - - rootContext.clean = _CLEAN_PROMISE; - res !(null); - }); - } -} - -function tickRootContext(rootContext: RootContext) { - for (let i = 0; i < rootContext.components.length; i++) { - const rootComponent = rootContext.components[i]; - renderComponentOrTemplate(readPatchedLView(rootComponent) !, rootComponent); - } -} - -/** - * Synchronously perform change detection on a component (and possibly its sub-components). - * - * This function triggers change detection in a synchronous way on a component. There should - * be very little reason to call this function directly since a preferred way to do change - * detection is to {@link markDirty} the component and wait for the scheduler to call this method - * at some future point in time. This is because a single user action often results in many - * components being invalidated and calling change detection on each component synchronously - * would be inefficient. It is better to wait until all components are marked as dirty and - * then perform single change detection across all of the components - * - * @param component The component which the change detection should be performed on. - */ -export function detectChanges(component: T): void { - const view = getComponentViewByInstance(component); - detectChangesInternal(view, component); -} - -export function detectChangesInternal(view: LView, context: T) { - const rendererFactory = view[RENDERER_FACTORY]; - - if (rendererFactory.begin) rendererFactory.begin(); - - try { - if (isCreationMode(view)) { - checkView(view, context); // creation mode pass - } - checkView(view, context); // update mode pass - } catch (error) { - handleError(view, error); - throw error; - } finally { - if (rendererFactory.end) rendererFactory.end(); - } -} - -/** - * Synchronously perform change detection on a root view and its components. - * - * @param lView The view which the change detection should be performed on. - */ -export function detectChangesInRootView(lView: LView): void { - tickRootContext(lView[CONTEXT] as RootContext); -} - - -/** - * Checks the change detector and its children, and throws if any changes are detected. - * - * This is used in development mode to verify that running change detection doesn't - * introduce other changes. - */ -export function checkNoChanges(component: T): void { - const view = getComponentViewByInstance(component); - checkNoChangesInternal(view, component); -} - -export function checkNoChangesInternal(view: LView, context: T) { - setCheckNoChangesMode(true); - try { - detectChangesInternal(view, context); - } finally { - setCheckNoChangesMode(false); - } -} - -/** - * Checks the change detector on a root view and its components, and throws if any changes are - * detected. - * - * This is used in development mode to verify that running change detection doesn't - * introduce other changes. - * - * @param lView The view which the change detection should be checked on. - */ -export function checkNoChangesInRootView(lView: LView): void { - setCheckNoChangesMode(true); - try { - detectChangesInRootView(lView); - } finally { - setCheckNoChangesMode(false); - } -} - -/** Checks the view of the component provided. Does not gate on dirty checks or execute doCheck. */ -export function checkView(hostView: LView, component: T) { - const hostTView = hostView[TVIEW]; - const oldView = enterView(hostView, hostView[T_HOST]); - const templateFn = hostTView.template !; - const creationMode = isCreationMode(hostView); - - try { - resetPreOrderHookFlags(hostView); - namespaceHTML(); - creationMode && executeViewQueryFn(RenderFlags.Create, hostTView, component); - - // Reset the selected index so we can assert that `select` was called later - ngDevMode && setSelectedIndex(-1); - - templateFn(getRenderFlags(hostView), component); - - refreshDescendantViews(hostView); - // Only check view queries again in creation mode if there are static view queries - if (!creationMode || hostTView.staticViewQueries) { - executeViewQueryFn(RenderFlags.Update, hostTView, component); - } - } finally { - leaveView(oldView); - } -} - -function executeViewQueryFn(flags: RenderFlags, tView: TView, component: T): void { - const viewQuery = tView.viewQuery; - if (viewQuery) { - setCurrentQueryIndex(tView.viewQueryStartIndex); - viewQuery(flags, component); - } -} - - -/** - * Mark the component as dirty (needing change detection). - * - * Marking a component dirty will schedule a change detection on this - * component at some point in the future. Marking an already dirty - * component as dirty is a noop. Only one outstanding change detection - * can be scheduled per component tree. (Two components bootstrapped with - * separate `renderComponent` will have separate schedulers) - * - * When the root component is bootstrapped with `renderComponent`, a scheduler - * can be provided. - * - * @param component Component to mark as dirty. - * - * @publicApi - */ -export function markDirty(component: T) { - ngDevMode && assertDefined(component, 'component'); - const rootView = markViewDirty(getComponentViewByInstance(component)) !; - - ngDevMode && assertDefined(rootView[CONTEXT], 'rootContext should be defined'); - scheduleTick(rootView[CONTEXT] as RootContext, RootContextFlags.DetectChanges); -} - -/////////////////////////////// -//// Bindings & interpolations -/////////////////////////////// - -/** - * Creates a single value binding. - * - * @param value Value to diff - */ -export function bind(value: T): T|NO_CHANGE { - const lView = getLView(); - const bindingIndex = lView[BINDING_INDEX]++; - storeBindingMetadata(lView); - return bindingUpdated(lView, bindingIndex, value) ? value : NO_CHANGE; -} - -/** - * Allocates the necessary amount of slots for host vars. - * - * @param count Amount of vars to be allocated - */ -export function allocHostVars(count: number): void { - const lView = getLView(); - const tView = lView[TVIEW]; - if (!tView.firstTemplatePass) return; - queueHostBindingForCheck(tView, getCurrentDirectiveDef() !, count); - prefillHostVars(tView, lView, count); -} - -/** - * Create interpolation bindings with a variable number of expressions. - * - * If there are 1 to 8 expressions `interpolation1()` to `interpolation8()` should be used instead. - * Those are faster because there is no need to create an array of expressions and iterate over it. - * - * `values`: - * - has static text at even indexes, - * - has evaluated expressions at odd indexes. - * - * Returns the concatenated string when any of the arguments changes, `NO_CHANGE` otherwise. - */ -export function interpolationV(values: any[]): string|NO_CHANGE { - ngDevMode && assertLessThan(2, values.length, 'should have at least 3 values'); - ngDevMode && assertEqual(values.length % 2, 1, 'should have an odd number of values'); - let different = false; - const lView = getLView(); - const tData = lView[TVIEW].data; - let bindingIndex = lView[BINDING_INDEX]; - - if (tData[bindingIndex] == null) { - // 2 is the index of the first static interstitial value (ie. not prefix) - for (let i = 2; i < values.length; i += 2) { - tData[bindingIndex++] = values[i]; - } - bindingIndex = lView[BINDING_INDEX]; - } - - for (let i = 1; i < values.length; i += 2) { - // Check if bindings (odd indexes) have changed - bindingUpdated(lView, bindingIndex++, values[i]) && (different = true); - } - lView[BINDING_INDEX] = bindingIndex; - storeBindingMetadata(lView, values[0], values[values.length - 1]); - - if (!different) { - return NO_CHANGE; - } - - // Build the updated content - let content = values[0]; - for (let i = 1; i < values.length; i += 2) { - content += renderStringify(values[i]) + values[i + 1]; - } - - return content; -} - -/** - * Creates an interpolation binding with 1 expression. - * - * @param prefix static value used for concatenation only. - * @param v0 value checked for change. - * @param suffix static value used for concatenation only. - */ -export function interpolation1(prefix: string, v0: any, suffix: string): string|NO_CHANGE { - const lView = getLView(); - const different = bindingUpdated(lView, lView[BINDING_INDEX]++, v0); - storeBindingMetadata(lView, prefix, suffix); - return different ? prefix + renderStringify(v0) + suffix : NO_CHANGE; -} - -/** Creates an interpolation binding with 2 expressions. */ -export function interpolation2( - prefix: string, v0: any, i0: string, v1: any, suffix: string): string|NO_CHANGE { - const lView = getLView(); - const bindingIndex = lView[BINDING_INDEX]; - const different = bindingUpdated2(lView, bindingIndex, v0, v1); - lView[BINDING_INDEX] += 2; - - // Only set static strings the first time (data will be null subsequent runs). - const data = storeBindingMetadata(lView, prefix, suffix); - if (data) { - lView[TVIEW].data[bindingIndex] = i0; - } - - return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + suffix : NO_CHANGE; -} - -/** Creates an interpolation binding with 3 expressions. */ -export function interpolation3( - prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): string| - NO_CHANGE { - const lView = getLView(); - const bindingIndex = lView[BINDING_INDEX]; - const different = bindingUpdated3(lView, bindingIndex, v0, v1, v2); - lView[BINDING_INDEX] += 3; - - // Only set static strings the first time (data will be null subsequent runs). - const data = storeBindingMetadata(lView, prefix, suffix); - if (data) { - const tData = lView[TVIEW].data; - tData[bindingIndex] = i0; - tData[bindingIndex + 1] = i1; - } - - return different ? - prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + suffix : - NO_CHANGE; -} - -/** Create an interpolation binding with 4 expressions. */ -export function interpolation4( - prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, - suffix: string): string|NO_CHANGE { - const lView = getLView(); - const bindingIndex = lView[BINDING_INDEX]; - const different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); - lView[BINDING_INDEX] += 4; - - // Only set static strings the first time (data will be null subsequent runs). - const data = storeBindingMetadata(lView, prefix, suffix); - if (data) { - const tData = lView[TVIEW].data; - tData[bindingIndex] = i0; - tData[bindingIndex + 1] = i1; - tData[bindingIndex + 2] = i2; - } - - return different ? - prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + - renderStringify(v3) + suffix : - NO_CHANGE; -} - -/** Creates an interpolation binding with 5 expressions. */ -export function interpolation5( - prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, - i3: string, v4: any, suffix: string): string|NO_CHANGE { - const lView = getLView(); - const bindingIndex = lView[BINDING_INDEX]; - let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); - different = bindingUpdated(lView, bindingIndex + 4, v4) || different; - lView[BINDING_INDEX] += 5; - - // Only set static strings the first time (data will be null subsequent runs). - const data = storeBindingMetadata(lView, prefix, suffix); - if (data) { - const tData = lView[TVIEW].data; - tData[bindingIndex] = i0; - tData[bindingIndex + 1] = i1; - tData[bindingIndex + 2] = i2; - tData[bindingIndex + 3] = i3; - } - - return different ? - prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + - renderStringify(v3) + i3 + renderStringify(v4) + suffix : - NO_CHANGE; -} - -/** Creates an interpolation binding with 6 expressions. */ -export function interpolation6( - prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, - i3: string, v4: any, i4: string, v5: any, suffix: string): string|NO_CHANGE { - const lView = getLView(); - const bindingIndex = lView[BINDING_INDEX]; - let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); - different = bindingUpdated2(lView, bindingIndex + 4, v4, v5) || different; - lView[BINDING_INDEX] += 6; - - // Only set static strings the first time (data will be null subsequent runs). - const data = storeBindingMetadata(lView, prefix, suffix); - if (data) { - const tData = lView[TVIEW].data; - tData[bindingIndex] = i0; - tData[bindingIndex + 1] = i1; - tData[bindingIndex + 2] = i2; - tData[bindingIndex + 3] = i3; - tData[bindingIndex + 4] = i4; - } - - return different ? - prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + - renderStringify(v3) + i3 + renderStringify(v4) + i4 + renderStringify(v5) + suffix : - NO_CHANGE; -} - -/** Creates an interpolation binding with 7 expressions. */ -export function interpolation7( - prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, - i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): string| - NO_CHANGE { - const lView = getLView(); - const bindingIndex = lView[BINDING_INDEX]; - let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); - different = bindingUpdated3(lView, bindingIndex + 4, v4, v5, v6) || different; - lView[BINDING_INDEX] += 7; - - // Only set static strings the first time (data will be null subsequent runs). - const data = storeBindingMetadata(lView, prefix, suffix); - if (data) { - const tData = lView[TVIEW].data; - tData[bindingIndex] = i0; - tData[bindingIndex + 1] = i1; - tData[bindingIndex + 2] = i2; - tData[bindingIndex + 3] = i3; - tData[bindingIndex + 4] = i4; - tData[bindingIndex + 5] = i5; - } - - return different ? - prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + - renderStringify(v3) + i3 + renderStringify(v4) + i4 + renderStringify(v5) + i5 + - renderStringify(v6) + suffix : - NO_CHANGE; -} - -/** Creates an interpolation binding with 8 expressions. */ -export function interpolation8( - prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, - i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, - suffix: string): string|NO_CHANGE { - const lView = getLView(); - const bindingIndex = lView[BINDING_INDEX]; - let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3); - different = bindingUpdated4(lView, bindingIndex + 4, v4, v5, v6, v7) || different; - lView[BINDING_INDEX] += 8; - - // Only set static strings the first time (data will be null subsequent runs). - const data = storeBindingMetadata(lView, prefix, suffix); - if (data) { - const tData = lView[TVIEW].data; - tData[bindingIndex] = i0; - tData[bindingIndex + 1] = i1; - tData[bindingIndex + 2] = i2; - tData[bindingIndex + 3] = i3; - tData[bindingIndex + 4] = i4; - tData[bindingIndex + 5] = i5; - tData[bindingIndex + 6] = i6; - } - - return different ? - prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + - renderStringify(v3) + i3 + renderStringify(v4) + i4 + renderStringify(v5) + i5 + - renderStringify(v6) + i6 + renderStringify(v7) + suffix : - NO_CHANGE; -} - -/** - * Creates binding metadata for a particular binding and stores it in - * TView.data. These are generated in order to support DebugElement.properties. - * - * Each binding / interpolation will have one (including attribute bindings) - * because at the time of binding, we don't know to which instruction the binding - * belongs. It is always stored in TView.data at the index of the last binding - * value in LView (e.g. for interpolation8, it would be stored at the index of - * the 8th value). - * - * @param lView The LView that contains the current binding index. - * @param prefix The static prefix string - * @param suffix The static suffix string - * - * @returns Newly created binding metadata string for this binding or null - */ -function storeBindingMetadata(lView: LView, prefix = '', suffix = ''): string|null { - const tData = lView[TVIEW].data; - const lastBindingIndex = lView[BINDING_INDEX] - 1; - const value = INTERPOLATION_DELIMITER + prefix + INTERPOLATION_DELIMITER + suffix; - - return tData[lastBindingIndex] == null ? (tData[lastBindingIndex] = value) : null; -} - -/** Store a value in the `data` at a given `index`. */ -export function store(index: number, value: T): void { - const lView = getLView(); - const tView = lView[TVIEW]; - // We don't store any static data for local variables, so the first time - // we see the template, we should store as null to avoid a sparse array - const adjustedIndex = index + HEADER_OFFSET; - if (adjustedIndex >= tView.data.length) { - tView.data[adjustedIndex] = null; - tView.blueprint[adjustedIndex] = null; - } - lView[adjustedIndex] = value; -} - -/** - * Retrieves a local reference from the current contextViewData. - * - * If the reference to retrieve is in a parent view, this instruction is used in conjunction - * with a nextContext() call, which walks up the tree and updates the contextViewData instance. - * - * @param index The index of the local ref in contextViewData. - */ -export function reference(index: number) { - const contextLView = getContextLView(); - return loadInternal(contextLView, index); -} - -/** Retrieves a value from current `viewData`. */ -export function load(index: number): T { - return loadInternal(getLView(), index); -} - - - -/////////////////////////////// -//// DI -/////////////////////////////// - -/** - * Returns the value associated to the given token from the injectors. - * - * `directiveInject` is intended to be used for directive, component and pipe factories. - * All other injection use `inject` which does not walk the node injector tree. - * - * Usage example (in factory function): - * - * class SomeDirective { - * constructor(directive: DirectiveA) {} - * - * static ngDirectiveDef = defineDirective({ - * type: SomeDirective, - * factory: () => new SomeDirective(directiveInject(DirectiveA)) - * }); - * } - * - * @param token the type or token to inject - * @param flags Injection flags - * @returns the value from the injector or `null` when not found - */ -export function directiveInject(token: Type| InjectionToken): T; -export function directiveInject(token: Type| InjectionToken, flags: InjectFlags): T; -export function directiveInject( - token: Type| InjectionToken, flags = InjectFlags.Default): T|null { - token = resolveForwardRef(token); - return getOrCreateInjectable( - getPreviousOrParentTNode() as TElementNode | TContainerNode | TElementContainerNode, - getLView(), token, flags); -} - -/** - * Facade for the attribute injection from DI. - */ -export function injectAttribute(attrNameToInject: string): string|null { - return injectAttributeImpl(getPreviousOrParentTNode(), attrNameToInject); -} - -export const CLEAN_PROMISE = _CLEAN_PROMISE; - - -/** - * Returns the current OpaqueViewState instance. - * - * Used in conjunction with the restoreView() instruction to save a snapshot - * of the current view and restore it when listeners are invoked. This allows - * walking the declaration view tree in listeners to get vars from parent views. - */ -export function getCurrentView(): OpaqueViewState { - return getLView() as any as OpaqueViewState; -} - -function getCleanup(view: LView): any[] { - // top level variables should not be exported for performance reasons (PERF_NOTES.md) - return view[CLEANUP] || (view[CLEANUP] = []); -} - -function getTViewCleanup(view: LView): any[] { - return view[TVIEW].cleanup || (view[TVIEW].cleanup = []); -} - -/** - * There are cases where the sub component's renderer needs to be included - * instead of the current renderer (see the componentSyntheticHost* instructions). - */ -function loadComponentRenderer(tNode: TNode, lView: LView): Renderer3 { - const componentLView = lView[tNode.index] as LView; - return componentLView[RENDERER]; -} - -/** Handles an error thrown in an LView. */ -function handleError(lView: LView, error: any): void { - const injector = lView[INJECTOR]; - const errorHandler = injector ? injector.get(ErrorHandler, null) : null; - errorHandler && errorHandler.handleError(error); -} diff --git a/packages/core/src/render3/instructions/property.ts b/packages/core/src/render3/instructions/property.ts index c26b29e7f3..4e6dceff75 100644 --- a/packages/core/src/render3/instructions/property.ts +++ b/packages/core/src/render3/instructions/property.ts @@ -5,21 +5,14 @@ * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ -import {CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA} from '../../metadata/schema'; -import {validateAgainstEventProperties} from '../../sanitization/sanitization'; -import {normalizeDebugBindingName, normalizeDebugBindingValue} from '../../util/ng_reflect'; -import {assertLView} from '../assert'; import {bindingUpdated} from '../bindings'; -import {PropertyAliasValue, PropertyAliases, TNode, TNodeType} from '../interfaces/node'; -import {RComment, RElement, Renderer3, isProceduralRenderer} from '../interfaces/renderer'; import {SanitizerFn} from '../interfaces/sanitization'; -import {BINDING_INDEX, FLAGS, HEADER_OFFSET, LView, LViewFlags, RENDERER, TData, TVIEW} from '../interfaces/view'; +import {BINDING_INDEX} from '../interfaces/view'; import {getLView, getSelectedIndex} from '../state'; -import {ANIMATION_PROP_PREFIX, isAnimationProp} from '../styling/util'; import {NO_CHANGE} from '../tokens'; -import {INTERPOLATION_DELIMITER} from '../util/misc_utils'; -import {getComponentViewByIndex, getNativeByIndex, getTNode, isComponent} from '../util/view_utils'; -import {TsickleIssue1009, initializeTNodeInputs, loadComponentRenderer, setInputsForProperty, storeBindingMetadata} from './shared'; + +import {TsickleIssue1009, elementPropertyInternal, loadComponentRenderer, storeBindingMetadata} from './shared'; + /** * Update a property on a selected element. @@ -116,167 +109,3 @@ export function ΔcomponentHostSyntheticProperty( nativeOnly?: boolean) { elementPropertyInternal(index, propName, value, sanitizer, nativeOnly, loadComponentRenderer); } - -/** -* Mapping between attributes names that don't correspond to their element property names. -*/ -const ATTR_TO_PROP: {[name: string]: string} = { - 'class': 'className', - 'for': 'htmlFor', - 'formaction': 'formAction', - 'innerHtml': 'innerHTML', - 'readonly': 'readOnly', - 'tabindex': 'tabIndex', -}; - -function elementPropertyInternal( - index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, - nativeOnly?: boolean, - loadRendererFn?: ((tNode: TNode, lView: LView) => Renderer3) | null): void { - if (value === NO_CHANGE) return; - const lView = getLView(); - const element = getNativeByIndex(index, lView) as RElement | RComment; - const tNode = getTNode(index, lView); - let inputData: PropertyAliases|null|undefined; - let dataValue: PropertyAliasValue|undefined; - if (!nativeOnly && (inputData = initializeTNodeInputs(tNode)) && - (dataValue = inputData[propName])) { - setInputsForProperty(lView, dataValue, value); - if (isComponent(tNode)) markDirtyIfOnPush(lView, index + HEADER_OFFSET); - if (ngDevMode) { - if (tNode.type === TNodeType.Element || tNode.type === TNodeType.Container) { - setNgReflectProperties(lView, element, tNode.type, dataValue, value); - } - } - } else if (tNode.type === TNodeType.Element) { - propName = ATTR_TO_PROP[propName] || propName; - - if (ngDevMode) { - validateAgainstEventProperties(propName); - validateAgainstUnknownProperties(lView, element, propName, tNode); - ngDevMode.rendererSetProperty++; - } - - savePropertyDebugData(tNode, lView, propName, lView[TVIEW].data, nativeOnly); - - const renderer = loadRendererFn ? loadRendererFn(tNode, lView) : lView[RENDERER]; - // It is assumed that the sanitizer is only added when the compiler determines that the property - // is risky, so sanitization can be done without further checks. - value = sanitizer != null ? (sanitizer(value, tNode.tagName || '', propName) as any) : value; - if (isProceduralRenderer(renderer)) { - renderer.setProperty(element as RElement, propName, value); - } else if (!isAnimationProp(propName)) { - (element as RElement).setProperty ? (element as any).setProperty(propName, value) : - (element as any)[propName] = value; - } - } else if (tNode.type === TNodeType.Container) { - // If the node is a container and the property didn't - // match any of the inputs or schemas we should throw. - if (ngDevMode && !matchingSchemas(lView, tNode.tagName)) { - throw createUnknownPropertyError(propName, tNode); - } - } -} - -/** If node is an OnPush component, marks its LView dirty. */ -function markDirtyIfOnPush(lView: LView, viewIndex: number): void { - ngDevMode && assertLView(lView); - const childComponentLView = getComponentViewByIndex(viewIndex, lView); - if (!(childComponentLView[FLAGS] & LViewFlags.CheckAlways)) { - childComponentLView[FLAGS] |= LViewFlags.Dirty; - } -} - -function setNgReflectProperties( - lView: LView, element: RElement | RComment, type: TNodeType, inputs: PropertyAliasValue, - value: any) { - for (let i = 0; i < inputs.length; i += 3) { - const renderer = lView[RENDERER]; - const attrName = normalizeDebugBindingName(inputs[i + 2] as string); - const debugValue = normalizeDebugBindingValue(value); - if (type === TNodeType.Element) { - isProceduralRenderer(renderer) ? - renderer.setAttribute((element as RElement), attrName, debugValue) : - (element as RElement).setAttribute(attrName, debugValue); - } else if (value !== undefined) { - const value = `bindings=${JSON.stringify({[attrName]: debugValue}, null, 2)}`; - if (isProceduralRenderer(renderer)) { - renderer.setValue((element as RComment), value); - } else { - (element as RComment).textContent = value; - } - } - } -} - -function validateAgainstUnknownProperties( - hostView: LView, element: RElement | RComment, propName: string, tNode: TNode) { - // If the tag matches any of the schemas we shouldn't throw. - if (matchingSchemas(hostView, tNode.tagName)) { - return; - } - - // If prop is not a known property of the HTML element... - if (!(propName in element) && - // and we are in a browser context... (web worker nodes should be skipped) - typeof Node === 'function' && element instanceof Node && - // and isn't a synthetic animation property... - propName[0] !== ANIMATION_PROP_PREFIX) { - // ... it is probably a user error and we should throw. - throw createUnknownPropertyError(propName, tNode); - } -} - -function matchingSchemas(hostView: LView, tagName: string | null): boolean { - const schemas = hostView[TVIEW].schemas; - - if (schemas !== null) { - for (let i = 0; i < schemas.length; i++) { - const schema = schemas[i]; - if (schema === NO_ERRORS_SCHEMA || - schema === CUSTOM_ELEMENTS_SCHEMA && tagName && tagName.indexOf('-') > -1) { - return true; - } - } - } - - return false; -} - -/** - * Stores debugging data for this property binding on first template pass. - * This enables features like DebugElement.properties. - */ -function savePropertyDebugData( - tNode: TNode, lView: LView, propName: string, tData: TData, - nativeOnly: boolean | undefined): void { - const lastBindingIndex = lView[BINDING_INDEX] - 1; - - // Bind/interpolation functions save binding metadata in the last binding index, - // but leave the property name blank. If the interpolation delimiter is at the 0 - // index, we know that this is our first pass and the property name still needs to - // be set. - const bindingMetadata = tData[lastBindingIndex] as string; - if (bindingMetadata[0] == INTERPOLATION_DELIMITER) { - tData[lastBindingIndex] = propName + bindingMetadata; - - // We don't want to store indices for host bindings because they are stored in a - // different part of LView (the expando section). - if (!nativeOnly) { - if (tNode.propertyMetadataStartIndex == -1) { - tNode.propertyMetadataStartIndex = lastBindingIndex; - } - tNode.propertyMetadataEndIndex = lastBindingIndex + 1; - } - } -} - -/** - * Creates an error that should be thrown when encountering an unknown property on an element. - * @param propName Name of the invalid property. - * @param tNode Node on which we encountered the error. - */ -function createUnknownPropertyError(propName: string, tNode: TNode): Error { - return new Error( - `Template error: Can't bind to '${propName}' since it isn't a known property of '${tNode.tagName}'.`); -} diff --git a/packages/core/src/render3/instructions/property_interpolation.ts b/packages/core/src/render3/instructions/property_interpolation.ts index 6eb7c77476..9e6aeca356 100644 --- a/packages/core/src/render3/instructions/property_interpolation.ts +++ b/packages/core/src/render3/instructions/property_interpolation.ts @@ -8,10 +8,12 @@ import {assertEqual, assertLessThan} from '../../util/assert'; import {bindingUpdated, bindingUpdated2, bindingUpdated3, bindingUpdated4} from '../bindings'; import {BINDING_INDEX, TVIEW} from '../interfaces/view'; -import {getLView} from '../state'; +import {getLView, getSelectedIndex} from '../state'; import {NO_CHANGE} from '../tokens'; import {renderStringify} from '../util/misc_utils'; -import {storeBindingMetadata} from './shared'; + +import {TsickleIssue1009, elementPropertyInternal, storeBindingMetadata} from './shared'; + /** * Create interpolation bindings with a variable number of expressions. @@ -283,3 +285,423 @@ export function Δinterpolation8( renderStringify(v6) + i6 + renderStringify(v7) + suffix : NO_CHANGE; } + +///////////////////////////////////////////////////////////////////// +/// NEW INSTRUCTIONS +///////////////////////////////////////////////////////////////////// + + +/** + * Shared reference to a string, used in `ΔpropertyInterpolate`. + */ +const EMPTY_STRING = ''; + +/** + * + * Update an interpolated property on an element with a lone bound value + * + * Used when the value passed to a property has 1 interpolated value in it, an no additional text + * surrounds that interpolated value: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolate('title', v0); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param suffix Static value used for concatenation only. + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolate(propName: string, v0: any): TsickleIssue1009 { + ΔpropertyInterpolate1(propName, EMPTY_STRING, v0, EMPTY_STRING); + return ΔpropertyInterpolate; +} + + +/** + * + * Update an interpolated property on an element with single bound value surrounded by text. + * + * Used when the value passed to a property has 1 interpolated value in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolate1('title', 'prefix', v0, 'suffix'); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param suffix Static value used for concatenation only. + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolate1( + propName: string, prefix: string, v0: any, suffix: string): TsickleIssue1009 { + const index = getSelectedIndex(); + elementPropertyInternal(index, propName, Δinterpolation1(prefix, v0, suffix)); + return ΔpropertyInterpolate1; +} + +/** + * + * Update an interpolated property on an element with 2 bound values surrounded by text. + * + * Used when the value passed to a property has 2 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolate2('title', 'prefix', v0, '-', v1, 'suffix'); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param suffix Static value used for concatenation only. + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolate2( + propName: string, prefix: string, v0: any, i0: string, v1: any, + suffix: string): TsickleIssue1009 { + const index = getSelectedIndex(); + elementPropertyInternal(index, propName, Δinterpolation2(prefix, v0, i0, v1, suffix)); + return ΔpropertyInterpolate2; +} + +/** + * + * Update an interpolated property on an element with 3 bound values surrounded by text. + * + * Used when the value passed to a property has 3 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolate3( + * 'title', 'prefix', v0, '-', v1, '-', v2, 'suffix'); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param suffix Static value used for concatenation only. + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolate3( + propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, + suffix: string): TsickleIssue1009 { + const index = getSelectedIndex(); + elementPropertyInternal(index, propName, Δinterpolation3(prefix, v0, i0, v1, i1, v2, suffix)); + return ΔpropertyInterpolate3; +} + +/** + * + * Update an interpolated property on an element with 4 bound values surrounded by text. + * + * Used when the value passed to a property has 4 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolate4( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, 'suffix'); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param suffix Static value used for concatenation only. + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolate4( + propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, suffix: string): TsickleIssue1009 { + const index = getSelectedIndex(); + elementPropertyInternal( + index, propName, Δinterpolation4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix)); + return ΔpropertyInterpolate4; +} + +/** + * + * Update an interpolated property on an element with 5 bound values surrounded by text. + * + * Used when the value passed to a property has 5 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolate5( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, 'suffix'); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param i3 Static value used for concatenation only. + * @param v4 Value checked for change. + * @param suffix Static value used for concatenation only. + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolate5( + propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, i3: string, v4: any, suffix: string): TsickleIssue1009 { + const index = getSelectedIndex(); + elementPropertyInternal( + index, propName, Δinterpolation5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix)); + return ΔpropertyInterpolate5; +} + +/** + * + * Update an interpolated property on an element with 6 bound values surrounded by text. + * + * Used when the value passed to a property has 6 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolate6( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, 'suffix'); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param i3 Static value used for concatenation only. + * @param v4 Value checked for change. + * @param i4 Static value used for concatenation only. + * @param v5 Value checked for change. + * @param suffix Static value used for concatenation only. + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolate6( + propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string): TsickleIssue1009 { + const index = getSelectedIndex(); + elementPropertyInternal( + index, propName, Δinterpolation6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix)); + return ΔpropertyInterpolate6; +} + +/** + * + * Update an interpolated property on an element with 7 bound values surrounded by text. + * + * Used when the value passed to a property has 7 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolate7( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, 'suffix'); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param i3 Static value used for concatenation only. + * @param v4 Value checked for change. + * @param i4 Static value used for concatenation only. + * @param v5 Value checked for change. + * @param i5 Static value used for concatenation only. + * @param v6 Value checked for change. + * @param suffix Static value used for concatenation only. + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolate7( + propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, + suffix: string): TsickleIssue1009 { + const index = getSelectedIndex(); + elementPropertyInternal( + index, propName, + Δinterpolation7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix)); + return ΔpropertyInterpolate7; +} + +/** + * + * Update an interpolated property on an element with 8 bound values surrounded by text. + * + * Used when the value passed to a property has 8 interpolated values in it: + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolate8( + * 'title', 'prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, 'suffix'); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update + * @param prefix Static value used for concatenation only. + * @param v0 Value checked for change. + * @param i0 Static value used for concatenation only. + * @param v1 Value checked for change. + * @param i1 Static value used for concatenation only. + * @param v2 Value checked for change. + * @param i2 Static value used for concatenation only. + * @param v3 Value checked for change. + * @param i3 Static value used for concatenation only. + * @param v4 Value checked for change. + * @param i4 Static value used for concatenation only. + * @param v5 Value checked for change. + * @param i5 Static value used for concatenation only. + * @param v6 Value checked for change. + * @param i6 Static value used for concatenation only. + * @param v7 Value checked for change. + * @param suffix Static value used for concatenation only. + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolate8( + propName: string, prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, + v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, + suffix: string): TsickleIssue1009 { + const index = getSelectedIndex(); + elementPropertyInternal( + index, propName, + Δinterpolation8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix)); + return ΔpropertyInterpolate8; +} + +/** + * Update an interpolated property on an element with 8 or more bound values surrounded by text. + * + * Used when the number of interpolated values exceeds 7. + * + * ```html + *
+ * ``` + * + * Its compiled representation is:: + * + * ```ts + * ΔpropertyInterpolateV( + * 'title', ['prefix', v0, '-', v1, '-', v2, '-', v3, '-', v4, '-', v5, '-', v6, '-', v7, '-', v9, + * 'suffix']); + * ``` + * + * If the property name also exists as an input property on one of the element's directives, + * the component property will be set instead of the element property. This check must + * be conducted at runtime so child components that add new `@Inputs` don't have to be re-compiled. + * + * @param propName The name of the property to update. + * @param values The a collection of values and the strings inbetween those values, beginning with a + * string prefix and ending with a string suffix. + * (e.g. `['prefix', value0, '-', value1, '-', value2, ..., value99, 'suffix']`) + * @returns itself, so that it may be chained. + */ +export function ΔpropertyInterpolateV(propName: string, values: any[]): TsickleIssue1009 { + const index = getSelectedIndex(); + + elementPropertyInternal(index, propName, ΔinterpolationV(values)); + return ΔpropertyInterpolateV; +} diff --git a/packages/core/src/render3/instructions/select.ts b/packages/core/src/render3/instructions/select.ts index ad7c665c38..91fdaaba43 100644 --- a/packages/core/src/render3/instructions/select.ts +++ b/packages/core/src/render3/instructions/select.ts @@ -11,7 +11,7 @@ import {HEADER_OFFSET, TVIEW} from '../interfaces/view'; import {getCheckNoChangesMode, getLView, setSelectedIndex} from '../state'; /** - * Selects an index of an item to act on and flushes lifecycle hooks up to this point + * Selects an element for later binding instructions. * * Used in conjunction with instructions like {@link property} to act on elements with specified * indices, for example those created with {@link element} or {@link elementStart}. diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index a55c92bcab..f22ba1a9ad 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -8,9 +8,11 @@ import {Injector} from '../../di'; import {ErrorHandler} from '../../error_handler'; import {Type} from '../../interface/type'; -import {SchemaMetadata} from '../../metadata/schema'; +import {CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, SchemaMetadata} from '../../metadata/schema'; +import {validateAgainstEventProperties} from '../../sanitization/sanitization'; import {Sanitizer} from '../../sanitization/security'; import {assertDataInRange, assertDefined, assertDomNode, assertEqual, assertLessThan, assertNotEqual} from '../../util/assert'; +import {normalizeDebugBindingName, normalizeDebugBindingValue} from '../../util/ng_reflect'; import {assertLView, assertPreviousIsParent} from '../assert'; import {attachPatchData, getComponentViewByInstance} from '../context_discovery'; import {attachLContainerDebug, attachLViewDebug} from '../debug'; @@ -23,17 +25,19 @@ import {INJECTOR_BLOOM_PARENT_SIZE, NodeInjectorFactory} from '../interfaces/inj import {AttributeMarker, InitialInputData, InitialInputs, LocalRefExtractor, PropertyAliasValue, PropertyAliases, TAttributes, TContainerNode, TElementContainerNode, TElementNode, TIcuContainerNode, TNode, TNodeFlags, TNodeProviderIndexes, TNodeType, TProjectionNode, TViewNode} from '../interfaces/node'; import {LQueries} from '../interfaces/query'; import {RComment, RElement, RText, Renderer3, RendererFactory3, isProceduralRenderer} from '../interfaces/renderer'; +import {SanitizerFn} from '../interfaces/sanitization'; import {StylingContext} from '../interfaces/styling'; -import {BINDING_INDEX, CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_VIEW, ExpandoInstructions, FLAGS, HEADER_OFFSET, HOST, INJECTOR, InitPhaseState, LView, LViewFlags, NEXT, PARENT, QUERIES, RENDERER, RENDERER_FACTORY, RootContext, RootContextFlags, SANITIZER, TVIEW, TView, T_HOST} from '../interfaces/view'; +import {BINDING_INDEX, CHILD_HEAD, CHILD_TAIL, CLEANUP, CONTEXT, DECLARATION_VIEW, ExpandoInstructions, FLAGS, HEADER_OFFSET, HOST, INJECTOR, InitPhaseState, LView, LViewFlags, NEXT, PARENT, QUERIES, RENDERER, RENDERER_FACTORY, RootContext, RootContextFlags, SANITIZER, TData, TVIEW, TView, T_HOST} from '../interfaces/view'; import {assertNodeOfPossibleTypes, assertNodeType} from '../node_assert'; import {isNodeMatchingSelectorList} from '../node_selector_matcher'; import {enterView, getBindingsEnabled, getCheckNoChangesMode, getIsParent, getLView, getNamespace, getPreviousOrParentTNode, incrementActiveDirectiveId, isCreationMode, leaveView, resetComponentState, setActiveHostElement, setBindingRoot, setCheckNoChangesMode, setCurrentDirectiveDef, setCurrentQueryIndex, setIsParent, setPreviousOrParentTNode, setSelectedIndex, ΔnamespaceHTML} from '../state'; import {initializeStaticContext as initializeStaticStylingContext} from '../styling/class_and_style_bindings'; +import {ANIMATION_PROP_PREFIX, isAnimationProp} from '../styling/util'; import {NO_CHANGE} from '../tokens'; import {attrsStylingIndexOf} from '../util/attrs_utils'; import {INTERPOLATION_DELIMITER, renderStringify} from '../util/misc_utils'; import {getLViewParent, getRootContext} from '../util/view_traversal_utils'; -import {getComponentViewByIndex, getNativeByTNode, isComponentDef, isContentQueryHost, isRootView, readPatchedLView, resetPreOrderHookFlags, unwrapRNode, viewAttachedToChangeDetector} from '../util/view_utils'; +import {getComponentViewByIndex, getNativeByIndex, getNativeByTNode, getTNode, isComponent, isComponentDef, isContentQueryHost, isRootView, readPatchedLView, resetPreOrderHookFlags, unwrapRNode, viewAttachedToChangeDetector} from '../util/view_utils'; @@ -430,7 +434,7 @@ export function renderEmbeddedTemplate(viewToRender: LView, tView: TView, con ΔnamespaceHTML(); // Reset the selected index so we can assert that `select` was called later - ngDevMode && setSelectedIndex(-1); + setSelectedIndex(-1); tView.template !(getRenderFlags(viewToRender), context); // This must be set to false immediately after the first creation run because in an @@ -465,7 +469,7 @@ function renderComponentOrTemplate( ΔnamespaceHTML(); // Reset the selected index so we can assert that `select` was called later - ngDevMode && setSelectedIndex(-1); + setSelectedIndex(-1); templateFn(RenderFlags.Create, context); } @@ -810,16 +814,169 @@ export function generatePropertyAliases(tNode: TNode, direction: BindingDirectio return propStore; } +/** +* Mapping between attributes names that don't correspond to their element property names. +*/ +const ATTR_TO_PROP: {[name: string]: string} = { + 'class': 'className', + 'for': 'htmlFor', + 'formaction': 'formAction', + 'innerHtml': 'innerHTML', + 'readonly': 'readOnly', + 'tabindex': 'tabIndex', +}; -////////////////////////// -//// Text -////////////////////////// +export function elementPropertyInternal( + index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, + nativeOnly?: boolean, + loadRendererFn?: ((tNode: TNode, lView: LView) => Renderer3) | null): void { + if (value === NO_CHANGE) return; + const lView = getLView(); + const element = getNativeByIndex(index, lView) as RElement | RComment; + const tNode = getTNode(index, lView); + let inputData: PropertyAliases|null|undefined; + let dataValue: PropertyAliasValue|undefined; + if (!nativeOnly && (inputData = initializeTNodeInputs(tNode)) && + (dataValue = inputData[propName])) { + setInputsForProperty(lView, dataValue, value); + if (isComponent(tNode)) markDirtyIfOnPush(lView, index + HEADER_OFFSET); + if (ngDevMode) { + if (tNode.type === TNodeType.Element || tNode.type === TNodeType.Container) { + setNgReflectProperties(lView, element, tNode.type, dataValue, value); + } + } + } else if (tNode.type === TNodeType.Element) { + propName = ATTR_TO_PROP[propName] || propName; + if (ngDevMode) { + validateAgainstEventProperties(propName); + validateAgainstUnknownProperties(lView, element, propName, tNode); + ngDevMode.rendererSetProperty++; + } + savePropertyDebugData(tNode, lView, propName, lView[TVIEW].data, nativeOnly); -////////////////////////// -//// Directive -////////////////////////// + const renderer = loadRendererFn ? loadRendererFn(tNode, lView) : lView[RENDERER]; + // It is assumed that the sanitizer is only added when the compiler determines that the property + // is risky, so sanitization can be done without further checks. + value = sanitizer != null ? (sanitizer(value, tNode.tagName || '', propName) as any) : value; + if (isProceduralRenderer(renderer)) { + renderer.setProperty(element as RElement, propName, value); + } else if (!isAnimationProp(propName)) { + (element as RElement).setProperty ? (element as any).setProperty(propName, value) : + (element as any)[propName] = value; + } + } else if (tNode.type === TNodeType.Container) { + // If the node is a container and the property didn't + // match any of the inputs or schemas we should throw. + if (ngDevMode && !matchingSchemas(lView, tNode.tagName)) { + throw createUnknownPropertyError(propName, tNode); + } + } +} + +/** If node is an OnPush component, marks its LView dirty. */ +function markDirtyIfOnPush(lView: LView, viewIndex: number): void { + ngDevMode && assertLView(lView); + const childComponentLView = getComponentViewByIndex(viewIndex, lView); + if (!(childComponentLView[FLAGS] & LViewFlags.CheckAlways)) { + childComponentLView[FLAGS] |= LViewFlags.Dirty; + } +} + +function setNgReflectProperties( + lView: LView, element: RElement | RComment, type: TNodeType, inputs: PropertyAliasValue, + value: any) { + for (let i = 0; i < inputs.length; i += 3) { + const renderer = lView[RENDERER]; + const attrName = normalizeDebugBindingName(inputs[i + 2] as string); + const debugValue = normalizeDebugBindingValue(value); + if (type === TNodeType.Element) { + isProceduralRenderer(renderer) ? + renderer.setAttribute((element as RElement), attrName, debugValue) : + (element as RElement).setAttribute(attrName, debugValue); + } else if (value !== undefined) { + const value = `bindings=${JSON.stringify({[attrName]: debugValue}, null, 2)}`; + if (isProceduralRenderer(renderer)) { + renderer.setValue((element as RComment), value); + } else { + (element as RComment).textContent = value; + } + } + } +} + +function validateAgainstUnknownProperties( + hostView: LView, element: RElement | RComment, propName: string, tNode: TNode) { + // If the tag matches any of the schemas we shouldn't throw. + if (matchingSchemas(hostView, tNode.tagName)) { + return; + } + + // If prop is not a known property of the HTML element... + if (!(propName in element) && + // and we are in a browser context... (web worker nodes should be skipped) + typeof Node === 'function' && element instanceof Node && + // and isn't a synthetic animation property... + propName[0] !== ANIMATION_PROP_PREFIX) { + // ... it is probably a user error and we should throw. + throw createUnknownPropertyError(propName, tNode); + } +} + +function matchingSchemas(hostView: LView, tagName: string | null): boolean { + const schemas = hostView[TVIEW].schemas; + + if (schemas !== null) { + for (let i = 0; i < schemas.length; i++) { + const schema = schemas[i]; + if (schema === NO_ERRORS_SCHEMA || + schema === CUSTOM_ELEMENTS_SCHEMA && tagName && tagName.indexOf('-') > -1) { + return true; + } + } + } + + return false; +} + +/** +* Stores debugging data for this property binding on first template pass. +* This enables features like DebugElement.properties. +*/ +function savePropertyDebugData( + tNode: TNode, lView: LView, propName: string, tData: TData, + nativeOnly: boolean | undefined): void { + const lastBindingIndex = lView[BINDING_INDEX] - 1; + + // Bind/interpolation functions save binding metadata in the last binding index, + // but leave the property name blank. If the interpolation delimiter is at the 0 + // index, we know that this is our first pass and the property name still needs to + // be set. + const bindingMetadata = tData[lastBindingIndex] as string; + if (bindingMetadata[0] == INTERPOLATION_DELIMITER) { + tData[lastBindingIndex] = propName + bindingMetadata; + + // We don't want to store indices for host bindings because they are stored in a + // different part of LView (the expando section). + if (!nativeOnly) { + if (tNode.propertyMetadataStartIndex == -1) { + tNode.propertyMetadataStartIndex = lastBindingIndex; + } + tNode.propertyMetadataEndIndex = lastBindingIndex + 1; + } + } +} + +/** +* Creates an error that should be thrown when encountering an unknown property on an element. +* @param propName Name of the invalid property. +* @param tNode Node on which we encountered the error. +*/ +function createUnknownPropertyError(propName: string, tNode: TNode): Error { + return new Error( + `Template error: Can't bind to '${propName}' since it isn't a known property of '${tNode.tagName}'.`); +} /** * Instantiate a root component. @@ -1515,7 +1672,7 @@ export function checkView(hostView: LView, component: T) { creationMode && executeViewQueryFn(RenderFlags.Create, hostTView, component); // Reset the selected index so we can assert that `select` was called later - ngDevMode && setSelectedIndex(-1); + setSelectedIndex(-1); templateFn(getRenderFlags(hostView), component); diff --git a/packages/core/test/render3/instructions_spec.ts b/packages/core/test/render3/instructions_spec.ts index 6b4da10eb3..91c1b62fd7 100644 --- a/packages/core/test/render3/instructions_spec.ts +++ b/packages/core/test/render3/instructions_spec.ts @@ -7,6 +7,7 @@ */ import {NgForOfContext} from '@angular/common'; +import {ΔpropertyInterpolate, ΔpropertyInterpolate1, ΔpropertyInterpolate2, ΔpropertyInterpolate3, ΔpropertyInterpolate4, ΔpropertyInterpolate5, ΔpropertyInterpolate6, ΔpropertyInterpolate7, ΔpropertyInterpolate8, ΔpropertyInterpolateV} from '@angular/core/src/render3/instructions/all'; import {ΔdefineComponent} from '../../src/render3/definition'; import {RenderFlags, Δbind, Δelement, ΔelementAttribute, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔelementStyleProp, ΔelementStyling, ΔelementStylingApply, ΔelementStylingMap, Δinterpolation1, Δproperty, Δselect, Δtemplate, Δtext, ΔtextBinding} from '../../src/render3/index'; @@ -161,7 +162,7 @@ describe('instructions', () => { }); }); - describe('select', () => { + describe('Δselect', () => { it('should error in DevMode if index is out of range', () => { // Only one constant added, meaning only index `0` is valid. const t = new TemplateFixture(createDiv, () => {}, 1, 0); @@ -173,7 +174,7 @@ describe('instructions', () => { describe('property', () => { // TODO(benlesh): Replace with TestBed tests once the instruction is being generated. - it('should set properties of the selected element', () => { + it('should set properties of the Δselected element', () => { //
const t = new TemplateFixture(createDiv, () => {}, 1, 1); t.update(() => { @@ -241,7 +242,7 @@ describe('instructions', () => { }); }); - it('should error in dev mode if select was not called prior', () => { + it('should error in dev mode if Δselect was not called prior', () => { const t = new TemplateFixture(createDiv, () => {}, 1, 1); expect(() => { t.update(() => { Δproperty('title', 'test'); }); }).toThrow(); expect(() => { @@ -253,6 +254,724 @@ describe('instructions', () => { }); }); + /** + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * TODO: REMOVE ALL OF THESE TemplateFixture TESTS FOR TestBed TESTS AFTER COMPILER IS UPDATED + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + describe('ΔpropertyInterpolate instructions', () => { + describe('ΔpropertyInterpolate', () => { + it('should interpolate one value', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 1); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate('title', 123); + }); + expect(t.html).toEqual('
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate('title', 'abc'); + }); + expect(t.html).toEqual('
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 2); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate('title', 123)('accessKey', 'A'); + }); + expect(t.html).toEqual('
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate('title', 'abc')('accessKey', 'B'); + }); + expect(t.html).toEqual('
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 1); + expect(() => { t.update(() => { ΔpropertyInterpolate('title', 123); }); }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { ΔpropertyInterpolate('title', 123); }); + }).not.toThrow(); + }); + }); + + describe('ΔpropertyInterpolate1', () => { + it('should interpolate one value', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 1); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate1('title', 'start', 123, 'end'); + }); + expect(t.html).toEqual('
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate1('title', 'start', 'abc', 'end'); + }); + expect(t.html).toEqual('
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 2); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate1('title', 'start', 123, 'end')('accessKey', 'start', 'A', 'end'); + }); + expect(t.html).toEqual('
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate1('title', 'start', 'abc', 'end')('accessKey', 'start', 'B', 'end'); + }); + expect(t.html).toEqual('
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 1); + expect(() => { + t.update(() => { ΔpropertyInterpolate1('title', 'start', 'whatever', 'end'); }); + }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { ΔpropertyInterpolate1('title', 'start', 'whatever', 'end'); }); + }).not.toThrow(); + }); + }); + + describe('ΔpropertyInterpolate2', () => { + it('should interpolate two values', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 2); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate2('title', 'start: ', 0, ', 1: ', 1, ', end'); + }); + expect(t.html).toEqual('
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate2('title', 'start: ', 'A', ', 1: ', 'B', ', end'); + }); + expect(t.html).toEqual('
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 4); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate2('title', 'start: ', 0, ', 1: ', 1, ', end')( + 'accessKey', 'start: ', 0, ', 1: ', 1, ', end'); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate2('title', 'start: ', 'A', ', 1: ', 'B', ', end')( + 'accessKey', 'start: ', 'A', ', 1: ', 'B', ', end'); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 2); + expect(() => { + t.update(() => { ΔpropertyInterpolate2('title', '', '', '', '', ''); }); + }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { ΔpropertyInterpolate2('title', '', '', '', '', ''); }); + }).not.toThrow(); + }); + }); + + describe('ΔpropertyInterpolate3', () => { + it('should interpolate three values', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 3); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate3('title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', end'); + }); + expect(t.html).toEqual('
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate3('title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', end'); + }); + expect(t.html).toEqual('
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 6); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate3('title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', end')( + 'accessKey', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', end'); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate3('title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', end')( + 'accessKey', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', end'); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 3); + expect(() => { + t.update(() => { ΔpropertyInterpolate3('title', '', '', '', '', '', '', ''); }); + }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { ΔpropertyInterpolate3('title', '', '', '', '', '', '', ''); }); + }).not.toThrow(); + }); + }); + + + describe('ΔpropertyInterpolate4', () => { + it('should interpolate four values', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 4); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate4('title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', end'); + }); + expect(t.html).toEqual('
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate4( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', end'); + }); + expect(t.html).toEqual('
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 8); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate4('title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', end')( + 'accessKey', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', end'); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate4( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', end')( + 'accessKey', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', end'); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 4); + expect(() => { + t.update(() => { ΔpropertyInterpolate4('title', '', '', '', '', '', '', '', '', ''); }); + }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { ΔpropertyInterpolate4('title', '', '', '', '', '', '', '', '', ''); }); + }).not.toThrow(); + }); + }); + + describe('ΔpropertyInterpolate5', () => { + it('should interpolate five values', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 5); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate5( + 'title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', end'); + }); + expect(t.html).toEqual('
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate5( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', end'); + }); + expect(t.html).toEqual('
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 10); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate5( + 'title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', end')( + 'accessKey', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', end'); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate5( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', end')( + 'accessKey', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', end'); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 5); + expect(() => { + t.update(() => { + ΔpropertyInterpolate5('title', '', '', '', '', '', '', '', '', '', '', ''); + }); + }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { + ΔpropertyInterpolate5('title', '', '', '', '', '', '', '', '', '', '', ''); + }); + }).not.toThrow(); + }); + }); + + describe('ΔpropertyInterpolate6', () => { + it('should interpolate six values', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 6); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate6( + 'title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, + ', end'); + }); + expect(t.html).toEqual('
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate6( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', 5: ', 'F', ', end'); + }); + expect(t.html).toEqual('
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 12); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate6( + 'title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, + ', end')( + 'accessKey', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, + ', end'); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate6( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', 5: ', 'F', ', end')( + 'accessKey', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', 5: ', 'F', ', end'); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 6); + expect(() => { + t.update(() => { + ΔpropertyInterpolate6('title', '', '', '', '', '', '', '', '', '', '', '', '', ''); + }); + }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { + ΔpropertyInterpolate6('title', '', '', '', '', '', '', '', '', '', '', '', '', ''); + }); + }).not.toThrow(); + }); + }); + + describe('ΔpropertyInterpolate7', () => { + it('should interpolate seven values', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 7); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate7( + 'title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, + ', 6: ', 6, ', end'); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate7( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', 5: ', 'F', ', 6: ', 'G', ', end'); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 14); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate7( + 'title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, + ', 6: ', 6, ', end')( + 'accessKey', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, + ', 6: ', 6, ', end'); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate7( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', 5: ', 'F', ', 6: ', 'G', ', end')( + 'accessKey', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', 5: ', 'F', ', 6: ', 'G', ', end'); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 7); + expect(() => { + t.update(() => { + ΔpropertyInterpolate7( + 'title', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); + }); + }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { + ΔpropertyInterpolate7( + 'title', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); + }); + }).not.toThrow(); + }); + }); + + describe('ΔpropertyInterpolate8', () => { + it('should interpolate eight values', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 8); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate8( + 'title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, + ', 6: ', 6, ', 7: ', 7, ', end'); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate8( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', 5: ', 'F', ', 6: ', 'G', ', 7: ', 'H', ', end'); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 16); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate8( + 'title', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, + ', 6: ', 6, ', 7: ', 7, ', end')( + 'accessKey', 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, + ', 6: ', 6, ', 7: ', 7, ', end'); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolate8( + 'title', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', 5: ', 'F', ', 6: ', 'G', ', 7: ', 'H', ', end')( + 'accessKey', 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', + ', 5: ', 'F', ', 6: ', 'G', ', 7: ', 'H', ', end'); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 8); + expect(() => { + t.update(() => { + ΔpropertyInterpolate8( + 'title', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); + }); + }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { + ΔpropertyInterpolate8( + 'title', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); + }); + }).not.toThrow(); + }); + }); + + + describe('ΔpropertyInterpolateV', () => { + it('should interpolate eight or more values', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 9); + t.update(() => { + Δselect(0); + ΔpropertyInterpolateV('title', [ + 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, ', 6: ', 6, + ', 7: ', 7, ', 8: ', 8, ', end' + ]); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolateV('title', [ + 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', ', 5: ', 'F', + ', 6: ', 'G', ', 7: ', 'H', ', 8: ', 'I', ', end' + ]); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 2, + }); + }); + + it('should chain', () => { + //
+ const t = new TemplateFixture(createDiv, () => {}, 1, 18); + t.update(() => { + Δselect(0); + ΔpropertyInterpolateV( + 'title', + [ + 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, ', 6: ', + 6, ', 7: ', 7, ', 8: ', 8, ', end' + ])( + 'accessKey', [ + 'start: ', 0, ', 1: ', 1, ', 2: ', 2, ', 3: ', 3, ', 4: ', 4, ', 5: ', 5, ', 6: ', + 6, ', 7: ', 7, ', 8: ', 8, ', end' + ]); + }); + expect(t.html).toEqual( + '
'); + t.update(() => { + Δselect(0); + ΔpropertyInterpolateV( + 'title', + [ + 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', ', 5: ', + 'F', ', 6: ', 'G', ', 7: ', 'H', ', 8: ', 'I', ', end' + ])( + 'accessKey', [ + 'start: ', 'A', ', 1: ', 'B', ', 2: ', 'C', ', 3: ', 'D', ', 4: ', 'E', ', 5: ', + 'F', ', 6: ', 'G', ', 7: ', 'H', ', 8: ', 'I', ', end' + ]); + }); + expect(t.html).toEqual( + '
'); + expect(ngDevMode).toHaveProperties({ + firstTemplatePass: 1, + tNode: 2, // 1 for div, 1 for host element + tView: 2, // 1 for rootView + 1 for the template view + rendererCreateElement: 1, + rendererSetProperty: 4, + }); + }); + + it('should error if called without Δselect called first', () => { + const t = new TemplateFixture(createDiv, () => {}, 1, 9); + expect(() => { + t.update(() => { + ΔpropertyInterpolateV( + 'title', + ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']); + }); + }).toThrow(); + expect(() => { + Δselect(0); + t.update(() => { + ΔpropertyInterpolateV( + 'title', + ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']); + }); + }).not.toThrow(); + }); + }); + }); + describe('elementProperty', () => { it('should use sanitizer function when available', () => { const t = new TemplateFixture(createDiv, () => {}, 1); From 4191344cb4c7b8c38b444cdbb02e5921e3b83311 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Mon, 8 Apr 2019 14:29:48 +0200 Subject: [PATCH 0709/1073] perf(ivy): coalesce handlers for events with the same name on the same element (#29786) PR Close #29786 --- .../core/src/render3/instructions/listener.ts | 120 +++++++++++++---- .../core/test/acceptance/listener_spec.ts | 123 ++++++++++++++++++ .../bundling/todo/bundle.golden_symbols.json | 6 + 3 files changed, 223 insertions(+), 26 deletions(-) create mode 100644 packages/core/test/acceptance/listener_spec.ts diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index fbc15856aa..4cd9fe1a3c 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -11,7 +11,7 @@ import {assertDataInRange} from '../../util/assert'; import {isObservable} from '../../util/lang'; import {PropertyAliasValue, TNode, TNodeFlags, TNodeType} from '../interfaces/node'; import {GlobalTargetResolver, RElement, Renderer3, isProceduralRenderer} from '../interfaces/renderer'; -import {FLAGS, LView, LViewFlags, RENDERER, TVIEW} from '../interfaces/view'; +import {CLEANUP, FLAGS, LView, LViewFlags, RENDERER, TVIEW} from '../interfaces/view'; import {assertNodeOfPossibleTypes} from '../node_assert'; import {getLView, getPreviousOrParentTNode} from '../state'; import {getComponentViewByIndex, getNativeByTNode, unwrapRNode} from '../util/view_utils'; @@ -64,6 +64,36 @@ export function ΔcomponentHostSyntheticListener( listenerInternal(eventName, listenerFn, useCapture, eventTargetResolver, loadComponentRenderer); } +/** + * A utility function that checks if a given element has already an event handler registered for an + * event with a specified name. The TView.cleanup data structure is used to find out which events + * are registered for a given element. + */ +function findExistingListener( + lView: LView, eventName: string, tNodeIdx: number): ((e?: any) => any)|null { + const tView = lView[TVIEW]; + const tCleanup = tView.cleanup; + if (tCleanup != null) { + for (let i = 0; i < tCleanup.length - 1; i += 2) { + if (tCleanup[i] === eventName && tCleanup[i + 1] === tNodeIdx) { + // We have found a matching event name on the same node but it might not have been + // registered yet, so we must explicitly verify entries in the LView cleanup data + // structures. + const lCleanup = lView[CLEANUP] !; + const listenerIdxInLCleanup = tCleanup[i + 2]; + return lCleanup.length > listenerIdxInLCleanup ? lCleanup[listenerIdxInLCleanup] : null; + } + // TView.cleanup can have a mix of 4-elements entries (for event handler cleanups) or + // 2-element entries (for directive and queries destroy hooks). As such we can encounter + // blocks of 4 or 2 items in the tView.cleanup and this is why we iterate over 2 elements + // first and jump another 2 elements if we detect listeners cleanup (4 elements). Also check + // documentation of TView.cleanup for more details of this data structure layout. + i += 2; + } + } + return null; +} + function listenerInternal( eventName: string, listenerFn: (e?: any) => any, useCapture = false, eventTargetResolver?: GlobalTargetResolver, @@ -82,32 +112,56 @@ function listenerInternal( const native = getNativeByTNode(tNode, lView) as RElement; const resolved = eventTargetResolver ? eventTargetResolver(native) : {} as any; const target = resolved.target || native; - ngDevMode && ngDevMode.rendererAddEventListener++; const renderer = loadRendererFn ? loadRendererFn(tNode, lView) : lView[RENDERER]; const lCleanup = getCleanup(lView); const lCleanupIndex = lCleanup.length; - let useCaptureOrSubIdx: boolean|number = useCapture; + const idxOrTargetGetter = eventTargetResolver ? + (_lView: LView) => eventTargetResolver(unwrapRNode(_lView[tNode.index])).target : + tNode.index; // In order to match current behavior, native DOM event listeners must be added for all // events (including outputs). if (isProceduralRenderer(renderer)) { - // The first argument of `listen` function in Procedural Renderer is: - // - either a target name (as a string) in case of global target (window, document, body) - // - or element reference (in all other cases) - listenerFn = wrapListener(tNode, lView, listenerFn, false /** preventDefault */); - const cleanupFn = renderer.listen(resolved.name || target, eventName, listenerFn); - lCleanup.push(listenerFn, cleanupFn); - useCaptureOrSubIdx = lCleanupIndex + 1; + // There might be cases where multiple directives on the same element try to register an event + // handler function for the same event. In this situation we want to avoid registration of + // several native listeners as each registration would be intercepted by NgZone and + // trigger change detection. This would mean that a single user action would result in several + // change detections being invoked. To avoid this situation we want to have only one call to + // native handler registration (for the same element and same type of event). + // + // In order to have just one native event handler in presence of multiple handler functions, + // we just register a first handler function as a native event listener and then chain + // (coalesce) other handler functions on top of the first native handler function. + // + // Please note that the coalescing described here doesn't happen for events specifying an + // alternative target (ex. (document:click)) - this is to keep backward compatibility with the + // view engine. + const existingListener = + eventTargetResolver ? null : findExistingListener(lView, eventName, tNode.index); + if (existingListener !== null) { + // Attach a new listener at the head of the coalesced listeners list. + (listenerFn).__ngNextListenerFn__ = (existingListener).__ngNextListenerFn__; + (existingListener).__ngNextListenerFn__ = listenerFn; + } else { + // The first argument of `listen` function in Procedural Renderer is: + // - either a target name (as a string) in case of global target (window, document, body) + // - or element reference (in all other cases) + listenerFn = wrapListener(tNode, lView, listenerFn, false /** preventDefault */); + const cleanupFn = renderer.listen(resolved.name || target, eventName, listenerFn); + ngDevMode && ngDevMode.rendererAddEventListener++; + + lCleanup.push(listenerFn, cleanupFn); + tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, lCleanupIndex + 1); + } + } else { listenerFn = wrapListener(tNode, lView, listenerFn, true /** preventDefault */); target.addEventListener(eventName, listenerFn, useCapture); - lCleanup.push(listenerFn); - } + ngDevMode && ngDevMode.rendererAddEventListener++; - const idxOrTargetGetter = eventTargetResolver ? - (_lView: LView) => eventTargetResolver(unwrapRNode(_lView[tNode.index])).target : - tNode.index; - tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, useCaptureOrSubIdx); + lCleanup.push(listenerFn); + tCleanup && tCleanup.push(eventName, idxOrTargetGetter, lCleanupIndex, useCapture); + } } // subscribe to directive outputs @@ -144,6 +198,15 @@ function listenerInternal( } } +function executeListenerWithErrorHandling(lView: LView, listenerFn: (e?: any) => any, e: any): any { + try { + return listenerFn(e); + } catch (error) { + handleError(lView, error); + return false; + } +} + /** * Wraps an event listener with a function that marks ancestors dirty and prevents default behavior, * if applicable. @@ -170,16 +233,21 @@ function wrapListener( markViewDirty(startView); } - try { - const result = listenerFn(e); - if (wrapWithPreventDefault && result === false) { - e.preventDefault(); - // Necessary for legacy browsers that don't support preventDefault (e.g. IE) - e.returnValue = false; - } - return result; - } catch (error) { - handleError(lView, error); + let result = executeListenerWithErrorHandling(lView, listenerFn, e); + // A just-invoked listener function might have coalesced listeners so we need to check for + // their presence and invoke as needed. + let nextListenerFn = (wrapListenerIn_markDirtyAndPreventDefault).__ngNextListenerFn__; + while (nextListenerFn) { + result = executeListenerWithErrorHandling(lView, nextListenerFn, e); + nextListenerFn = (nextListenerFn).__ngNextListenerFn__; } + + if (wrapWithPreventDefault && result === false) { + e.preventDefault(); + // Necessary for legacy browsers that don't support preventDefault (e.g. IE) + e.returnValue = false; + } + + return result; }; } diff --git a/packages/core/test/acceptance/listener_spec.ts b/packages/core/test/acceptance/listener_spec.ts new file mode 100644 index 0000000000..4ba782fcb2 --- /dev/null +++ b/packages/core/test/acceptance/listener_spec.ts @@ -0,0 +1,123 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {Component, Directive, ErrorHandler, HostListener} from '@angular/core'; +import {TestBed} from '@angular/core/testing'; +import {By} from '@angular/platform-browser'; +import {onlyInIvy} from '@angular/private/testing'; + +function getNoOfNativeListeners(): number { + return ngDevMode ? ngDevMode.rendererAddEventListener : 0; +} + +describe('event listeners', () => { + + describe('coalescing', () => { + + @Component({ + selector: 'with-clicks-cmpt', + template: `` + }) + class WithClicksCmpt { + counter = 0; + count() { this.counter++; } + } + + @Directive({selector: '[md-button]'}) + class MdButton { + counter = 0; + @HostListener('click') + count() { this.counter++; } + } + + @Directive({selector: '[likes-clicks]'}) + class LikesClicks { + counter = 0; + @HostListener('click') + count() { this.counter++; } + } + + onlyInIvy('ngDevMode.rendererAddEventListener counters are only available in ivy') + .it('should coalesce multiple event listeners for the same event on the same element', + () => { + + @Component({ + selector: 'test-cmpt', + template: + `` + }) + class TestCmpt { + } + + TestBed.configureTestingModule( + {declarations: [TestCmpt, WithClicksCmpt, LikesClicks, MdButton]}); + const noOfEventListenersRegisteredSoFar = getNoOfNativeListeners(); + const fixture = TestBed.createComponent(TestCmpt); + fixture.detectChanges(); + const buttonDebugEls = fixture.debugElement.queryAll(By.css('button')); + const withClicksEls = fixture.debugElement.queryAll(By.css('with-clicks-cmpt')); + + // We want to assert that only one native event handler was registered but still all + // directives are notified when an event fires. This assertion can only be verified in + // the ngDevMode (but the coalescing always happens!). + ngDevMode && + expect(getNoOfNativeListeners()).toBe(noOfEventListenersRegisteredSoFar + 2); + + buttonDebugEls[0].nativeElement.click(); + expect(withClicksEls[0].injector.get(WithClicksCmpt).counter).toBe(1); + expect(buttonDebugEls[0].injector.get(LikesClicks).counter).toBe(1); + expect(buttonDebugEls[0].injector.get(MdButton).counter).toBe(1); + expect(withClicksEls[1].injector.get(WithClicksCmpt).counter).toBe(0); + expect(buttonDebugEls[1].injector.get(LikesClicks).counter).toBe(0); + expect(buttonDebugEls[1].injector.get(MdButton).counter).toBe(0); + + buttonDebugEls[1].nativeElement.click(); + expect(withClicksEls[0].injector.get(WithClicksCmpt).counter).toBe(1); + expect(buttonDebugEls[0].injector.get(LikesClicks).counter).toBe(1); + expect(buttonDebugEls[0].injector.get(MdButton).counter).toBe(1); + expect(withClicksEls[1].injector.get(WithClicksCmpt).counter).toBe(1); + expect(buttonDebugEls[1].injector.get(LikesClicks).counter).toBe(1); + expect(buttonDebugEls[1].injector.get(MdButton).counter).toBe(1); + }); + + + it('should try to execute remaining coalesced listeners if one of the listeners throws', () => { + + @Directive({selector: '[throws-on-clicks]'}) + class ThrowsOnClicks { + @HostListener('click') + dontCount() { throw new Error('I was clicked and I don\'t like it!'); } + } + + @Component( + {selector: 'test-cmpt', template: ` */ template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(); }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.onClick(); }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementEnd(); } }, factory: () => { @@ -59,14 +59,14 @@ describe('event listeners', () => { /* @HostListener('body:click') */ onBodyClick() { events.push('component - body:click'); } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: MyCompWithGlobalListeners, selectors: [['comp']], consts: 1, vars: 0, template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtext(0, 'Some text'); + ɵɵtext(0, 'Some text'); } }, factory: () => { @@ -77,12 +77,12 @@ describe('event listeners', () => { hostBindings: function HostListenerDir_HostBindings( rf: RenderFlags, ctx: any, elIndex: number) { if (rf & RenderFlags.Create) { - Δlistener('custom', function() { + ɵɵlistener('custom', function() { return ctx.onDocumentCustomEvent(); - }, false, ΔresolveDocument as GlobalTargetResolver); - Δlistener('click', function() { + }, false, ɵɵresolveDocument as GlobalTargetResolver); + ɵɵlistener('click', function() { return ctx.onBodyClick(); - }, false, ΔresolveBody as GlobalTargetResolver); + }, false, ɵɵresolveBody as GlobalTargetResolver); } } }); @@ -95,19 +95,19 @@ describe('event listeners', () => { /* @HostListener('body:click') */ onBodyClick() { events.push('directive - body:click'); } - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: GlobalHostListenerDir, selectors: [['', 'hostListenerDir', '']], factory: function HostListenerDir_Factory() { return new GlobalHostListenerDir(); }, hostBindings: function HostListenerDir_HostBindings( rf: RenderFlags, ctx: any, elIndex: number) { if (rf & RenderFlags.Create) { - Δlistener('custom', function() { + ɵɵlistener('custom', function() { return ctx.onDocumentCustomEvent(); - }, false, ΔresolveDocument as GlobalTargetResolver); - Δlistener('click', function() { + }, false, ɵɵresolveDocument as GlobalTargetResolver); + ɵɵlistener('click', function() { return ctx.onBodyClick(); - }, false, ΔresolveBody as GlobalTargetResolver); + }, false, ɵɵresolveBody as GlobalTargetResolver); } } }); @@ -129,7 +129,7 @@ describe('event listeners', () => { return this.handlerReturnValue; } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: PreventDefaultComp, selectors: [['prevent-default-comp']], factory: () => new PreventDefaultComp(), @@ -138,12 +138,12 @@ describe('event listeners', () => { /** */ template: (rf: RenderFlags, ctx: PreventDefaultComp) => { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function($event: any) { return ctx.onClick($event); }); - Δtext(1, 'Click'); + ɵɵlistener('click', function($event: any) { return ctx.onClick($event); }); + ɵɵtext(1, 'Click'); } - ΔelementEnd(); + ɵɵelementEnd(); } } }); @@ -205,15 +205,15 @@ describe('event listeners', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { + ɵɵlistener('click', function() { ctx.onClick(); return ctx.onClick2(); }); - Δtext(1, 'Click me'); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementEnd(); } } @@ -240,12 +240,12 @@ describe('event listeners', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.showing = !ctx.showing; }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.showing = !ctx.showing; }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementEnd(); } } @@ -269,24 +269,24 @@ describe('event listeners', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.showing) { - if (ΔembeddedViewStart(1, 2, 0)) { - ΔelementStart(0, 'button'); + if (ɵɵembeddedViewStart(1, 2, 0)) { + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(); }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.onClick(); }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } @@ -320,7 +320,7 @@ describe('event listeners', () => { onClick() { this.counter++; } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: AppComp, selectors: [['app-comp']], factory: () => new AppComp(), @@ -328,24 +328,24 @@ describe('event listeners', () => { vars: 0, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.showing) { - if (ΔembeddedViewStart(0, 2, 0)) { - ΔelementStart(0, 'button'); + if (ɵɵembeddedViewStart(0, 2, 0)) { + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(); }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.onClick(); }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } }); @@ -381,7 +381,7 @@ describe('event listeners', () => { onClick(index: number) { this.counters[index]++; } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: AppComp, selectors: [['app-comp']], factory: () => new AppComp(), @@ -389,24 +389,24 @@ describe('event listeners', () => { vars: 0, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { for (let i = 0; i < ctx.buttons; i++) { - if (ΔembeddedViewStart(0, 2, 0)) { - ΔelementStart(0, 'button'); + if (ɵɵembeddedViewStart(0, 2, 0)) { + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(i); }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.onClick(i); }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } }); @@ -445,7 +445,7 @@ describe('event listeners', () => { onClick(index: number) { this.counters[index]++; } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: AppComp, selectors: [['app-comp']], factory: () => new AppComp(), @@ -453,31 +453,31 @@ describe('event listeners', () => { vars: 0, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { for (let i = 0; i < ctx.buttons; i++) { - const rf1 = ΔembeddedViewStart(1, 4, 1); + const rf1 = ɵɵembeddedViewStart(1, 4, 1); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(i); }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.onClick(i); }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); - ΔelementStart(2, 'div'); - { Δtext(3); } - ΔelementEnd(); + ɵɵelementEnd(); + ɵɵelementStart(2, 'div'); + { ɵɵtext(3); } + ɵɵelementEnd(); } if (rf1 & RenderFlags.Update) { - ΔtextBinding(3, Δbind(ctx.counters[i])); + ɵɵtextBinding(3, ɵɵbind(ctx.counters[i])); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } }); @@ -523,21 +523,21 @@ describe('event listeners', () => { /* @HostListener('click') */ onClick() { events.push('click!'); } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: MyComp, selectors: [['comp']], consts: 1, vars: 0, template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtext(0, 'Some text'); + ɵɵtext(0, 'Some text'); } }, factory: () => { return new MyComp(); }, hostBindings: function HostListenerDir_HostBindings( rf: RenderFlags, ctx: any, elIndex: number) { if (rf & RenderFlags.Create) { - Δlistener('click', function() { return ctx.onClick(); }); + ɵɵlistener('click', function() { return ctx.onClick(); }); } } }); @@ -574,23 +574,23 @@ describe('event listeners', () => { /* @HostListener('click') */ onClick() { events.push('click!'); } - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: HostListenerDir, selectors: [['', 'hostListenerDir', '']], factory: function HostListenerDir_Factory() { return new HostListenerDir(); }, hostBindings: function HostListenerDir_HostBindings( rf: RenderFlags, ctx: any, elIndex: number) { if (rf & RenderFlags.Create) { - Δlistener('click', function() { return ctx.onClick(); }); + ɵɵlistener('click', function() { return ctx.onClick(); }); } } }); } const fixture = new TemplateFixture(() => { - ΔelementStart(0, 'button', ['hostListenerDir', '']); - Δtext(1, 'Click'); - ΔelementEnd(); + ɵɵelementStart(0, 'button', ['hostListenerDir', '']); + ɵɵtext(1, 'Click'); + ɵɵelementEnd(); }, () => {}, 2, 0, [HostListenerDir]); const button = fixture.hostElement.querySelector('button') !; @@ -604,7 +604,7 @@ describe('event listeners', () => { it('should support global host listeners on directives', () => { const fixture = new TemplateFixture(() => { - Δelement(0, 'div', ['hostListenerDir', '']); + ɵɵelement(0, 'div', ['hostListenerDir', '']); }, () => {}, 1, 0, [GlobalHostListenerDir]); const doc = fixture.hostElement.ownerDocument !; @@ -626,7 +626,7 @@ describe('event listeners', () => { onClick(a: any, b: any) { this.counter += a + b; } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: MyComp, selectors: [['comp']], consts: 2, @@ -634,12 +634,12 @@ describe('event listeners', () => { /** */ template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(ctx.data.a, ctx.data.b); }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.onClick(ctx.data.a, ctx.data.b); }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementEnd(); } }, factory: () => new MyComp() @@ -669,39 +669,39 @@ describe('event listeners', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.showing) { - let rf1 = ΔembeddedViewStart(0, 2, 0); + let rf1 = ɵɵembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - Δtext(0, 'Hello'); - Δcontainer(1); + ɵɵtext(0, 'Hello'); + ɵɵcontainer(1); } if (rf1 & RenderFlags.Update) { - ΔcontainerRefreshStart(1); + ɵɵcontainerRefreshStart(1); { if (ctx.button) { - let rf1 = ΔembeddedViewStart(0, 2, 0); + let rf1 = ɵɵembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(); }); - Δtext(1, 'Click'); + ɵɵlistener('click', function() { return ctx.onClick(); }); + ɵɵtext(1, 'Click'); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } @@ -733,22 +733,22 @@ describe('event listeners', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.showing) { - let rf1 = ΔembeddedViewStart(0, 3, 0); + let rf1 = ɵɵembeddedViewStart(0, 3, 0); if (rf1 & RenderFlags.Create) { - Δtext(0, 'Hello'); - Δelement(1, 'comp'); - Δelement(2, 'comp'); + ɵɵtext(0, 'Hello'); + ɵɵelement(1, 'comp'); + ɵɵelement(2, 'comp'); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } @@ -775,19 +775,19 @@ describe('event listeners', () => { const ctx = {showing: true}; const fixture = new TemplateFixture( - () => { Δcontainer(0); }, + () => { ɵɵcontainer(0); }, () => { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.showing) { - let rf1 = ΔembeddedViewStart(0, 1, 0); + let rf1 = ɵɵembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - Δelement(0, 'comp'); + ɵɵelement(0, 'comp'); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); }, 1, 0, [MyCompWithGlobalListeners]); @@ -820,56 +820,56 @@ describe('event listeners', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = ΔembeddedViewStart(0, 3, 0); + let rf1 = ɵɵembeddedViewStart(0, 3, 0); if (rf1 & RenderFlags.Create) { - Δtext(0, 'Hello'); - Δcontainer(1); - Δcontainer(2); + ɵɵtext(0, 'Hello'); + ɵɵcontainer(1); + ɵɵcontainer(2); } if (rf1 & RenderFlags.Update) { - ΔcontainerRefreshStart(1); + ɵɵcontainerRefreshStart(1); { if (ctx.sub1) { - let rf1 = ΔembeddedViewStart(0, 2, 0); + let rf1 = ɵɵembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.counter1++; }); - Δtext(1, 'Click'); + ɵɵlistener('click', function() { return ctx.counter1++; }); + ɵɵtext(1, 'Click'); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); - ΔcontainerRefreshStart(2); + ɵɵcontainerRefreshEnd(); + ɵɵcontainerRefreshStart(2); { if (ctx.sub2) { - let rf1 = ΔembeddedViewStart(0, 2, 0); + let rf1 = ɵɵembeddedViewStart(0, 2, 0); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.counter2++; }); - Δtext(1, 'Click'); + ɵɵlistener('click', function() { return ctx.counter2++; }); + ɵɵtext(1, 'Click'); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } @@ -907,7 +907,7 @@ describe('event listeners', () => { onClick(comp: any) { this.comp = comp; } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: App, selectors: [['app']], factory: () => new App(), @@ -915,17 +915,17 @@ describe('event listeners', () => { vars: 0, template: (rf: RenderFlags, ctx: App) => { if (rf & RenderFlags.Create) { - const state = ΔgetCurrentView(); - Δelement(0, 'comp', null, ['comp', '']); - ΔelementStart(2, 'button'); + const state = ɵɵgetCurrentView(); + ɵɵelement(0, 'comp', null, ['comp', '']); + ɵɵelementStart(2, 'button'); { - Δlistener('click', function() { - ΔrestoreView(state); - const comp = Δreference(1); + ɵɵlistener('click', function() { + ɵɵrestoreView(state); + const comp = ɵɵreference(1); return ctx.onClick(comp); }); } - ΔelementEnd(); + ɵɵelementEnd(); } // testing only diff --git a/packages/core/test/render3/outputs_spec.ts b/packages/core/test/render3/outputs_spec.ts index 17ec22575d..26970eaefe 100644 --- a/packages/core/test/render3/outputs_spec.ts +++ b/packages/core/test/render3/outputs_spec.ts @@ -8,8 +8,8 @@ import {EventEmitter} from '@angular/core'; -import {ΔdefineComponent, ΔdefineDirective} from '../../src/render3/index'; -import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δlistener, Δtext} from '../../src/render3/instructions/all'; +import {ɵɵdefineComponent, ɵɵdefineDirective} from '../../src/render3/index'; +import {ɵɵbind, ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵelement, ɵɵelementEnd, ɵɵelementProperty, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵlistener, ɵɵtext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {containerEl, renderToHtml} from './render_util'; @@ -23,7 +23,7 @@ describe('outputs', () => { change = new EventEmitter(); resetStream = new EventEmitter(); - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ButtonToggle, selectors: [['button-toggle']], template: function(rf: RenderFlags, ctx: any) {}, @@ -39,7 +39,7 @@ describe('outputs', () => { class OtherDir { changeStream = new EventEmitter(); - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: OtherDir, selectors: [['', 'otherDir', '']], factory: () => otherDir = new OtherDir, @@ -51,7 +51,7 @@ describe('outputs', () => { events: string[] = []; ngOnDestroy() { this.events.push('destroy'); } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: DestroyComp, selectors: [['destroy-comp']], consts: 0, @@ -65,7 +65,7 @@ describe('outputs', () => { class MyButton { click = new EventEmitter(); - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: MyButton, selectors: [['', 'myButton', '']], factory: () => buttonDir = new MyButton, @@ -80,11 +80,11 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button-toggle'); + ɵɵelementStart(0, 'button-toggle'); { - Δlistener('change', function() { return ctx.onChange(); }); + ɵɵlistener('change', function() { return ctx.onChange(); }); } - ΔelementEnd(); + ɵɵelementEnd(); } } @@ -103,12 +103,12 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button-toggle'); + ɵɵelementStart(0, 'button-toggle'); { - Δlistener('change', function() { return ctx.onChange(); }); - Δlistener('reset', function() { return ctx.onReset(); }); + ɵɵlistener('change', function() { return ctx.onChange(); }); + ɵɵlistener('reset', function() { return ctx.onReset(); }); } - ΔelementEnd(); + ɵɵelementEnd(); } } @@ -128,11 +128,11 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button-toggle'); + ɵɵelementStart(0, 'button-toggle'); { - Δlistener('change', function() { return ctx.counter++; }); + ɵɵlistener('change', function() { return ctx.counter++; }); } - ΔelementEnd(); + ɵɵelementEnd(); } } @@ -155,24 +155,24 @@ describe('outputs', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = ΔembeddedViewStart(0, 1, 0); + let rf1 = ɵɵembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'button-toggle'); + ɵɵelementStart(0, 'button-toggle'); { - Δlistener('change', function() { return ctx.onChange(); }); + ɵɵlistener('change', function() { return ctx.onChange(); }); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } @@ -201,35 +201,35 @@ describe('outputs', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = ΔembeddedViewStart(0, 1, 0); + let rf1 = ɵɵembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.condition2) { - let rf1 = ΔembeddedViewStart(0, 1, 0); + let rf1 = ɵɵembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'button-toggle'); + ɵɵelementStart(0, 'button-toggle'); { - Δlistener('change', function() { return ctx.onChange(); }); + ɵɵlistener('change', function() { return ctx.onChange(); }); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); - ΔembeddedViewEnd(); + ɵɵcontainerRefreshEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } @@ -257,31 +257,31 @@ describe('outputs', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.condition) { - let rf1 = ΔembeddedViewStart(0, 4, 0); + let rf1 = ɵɵembeddedViewStart(0, 4, 0); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(); }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.onClick(); }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); - ΔelementStart(2, 'button-toggle'); + ɵɵelementEnd(); + ɵɵelementStart(2, 'button-toggle'); { - Δlistener('change', function() { return ctx.onChange(); }); + ɵɵlistener('change', function() { return ctx.onChange(); }); } - ΔelementEnd(); - Δelement(3, 'destroy-comp'); + ɵɵelementEnd(); + ɵɵelement(3, 'destroy-comp'); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } @@ -313,11 +313,11 @@ describe('outputs', () => { it('should fire event listeners along with outputs if they match', () => { function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button', ['myButton', '']); + ɵɵelementStart(0, 'button', ['myButton', '']); { - Δlistener('click', function() { return ctx.onClick(); }); + ɵɵlistener('click', function() { return ctx.onClick(); }); } - ΔelementEnd(); + ɵɵelementEnd(); } } @@ -338,11 +338,11 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button-toggle', ['otherDir', '']); + ɵɵelementStart(0, 'button-toggle', ['otherDir', '']); { - Δlistener('change', function() { return ctx.onChange(); }); + ɵɵlistener('change', function() { return ctx.onChange(); }); } - ΔelementEnd(); + ɵɵelementEnd(); } } @@ -363,7 +363,7 @@ describe('outputs', () => { // TODO(issue/24571): remove '!'. change !: boolean; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: OtherChangeDir, selectors: [['', 'otherChangeDir', '']], factory: () => otherDir = new OtherChangeDir, @@ -374,14 +374,14 @@ describe('outputs', () => { /** */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button-toggle', ['otherChangeDir', '']); + ɵɵelementStart(0, 'button-toggle', ['otherChangeDir', '']); { - Δlistener('change', function() { return ctx.onChange(); }); + ɵɵlistener('change', function() { return ctx.onChange(); }); } - ΔelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'change', Δbind(ctx.change)); + ɵɵelementProperty(0, 'change', ɵɵbind(ctx.change)); } } @@ -409,39 +409,39 @@ describe('outputs', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(); }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.onClick(); }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); - Δcontainer(2); + ɵɵelementEnd(); + ɵɵcontainer(2); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(2); + ɵɵcontainerRefreshStart(2); { if (ctx.condition) { - let rf1 = ΔembeddedViewStart(0, 1, 0); + let rf1 = ɵɵembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'button-toggle'); + ɵɵelementStart(0, 'button-toggle'); { - Δlistener('change', function() { return ctx.onChange(); }); + ɵɵlistener('change', function() { return ctx.onChange(); }); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } else { - if (ΔembeddedViewStart(1, 1, 0)) { - ΔelementStart(0, 'div', ['otherDir', '']); + if (ɵɵembeddedViewStart(1, 1, 0)) { + ɵɵelementStart(0, 'div', ['otherDir', '']); { - Δlistener('change', function() { return ctx.onChange(); }); + ɵɵlistener('change', function() { return ctx.onChange(); }); } - ΔelementEnd(); + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } diff --git a/packages/core/test/render3/pipe_spec.ts b/packages/core/test/render3/pipe_spec.ts index 5f1ff5ae63..8f6acedb54 100644 --- a/packages/core/test/render3/pipe_spec.ts +++ b/packages/core/test/render3/pipe_spec.ts @@ -6,14 +6,14 @@ * found in the LICENSE file at https://angular.io/license */ -import {Directive as _Directive, InjectionToken, OnChanges, OnDestroy, Pipe as _Pipe, PipeTransform, WrappedValue, ɵNgModuleDef as NgModuleDef, ΔdefineComponent as defineComponent, ΔdefineInjectable, ΔdefineInjector, ΔdirectiveInject as directiveInject} from '@angular/core'; +import {Directive as _Directive, InjectionToken, OnChanges, OnDestroy, Pipe as _Pipe, PipeTransform, WrappedValue, ɵNgModuleDef as NgModuleDef, ɵɵdefineComponent as defineComponent, ɵɵdefineInjectable, ɵɵdefineInjector, ɵɵdirectiveInject as directiveInject} from '@angular/core'; import {expect} from '@angular/platform-browser/testing/src/matchers'; import {createInjector} from '../../src/di/r3_injector'; -import {ΔdefineDirective, ΔdefinePipe} from '../../src/render3/definition'; -import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δinterpolation1, Δload, Δtext, ΔtextBinding} from '../../src/render3/instructions/all'; +import {ɵɵdefineDirective, ɵɵdefinePipe} from '../../src/render3/definition'; +import {ɵɵbind, ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵelementEnd, ɵɵelementProperty, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵinterpolation1, ɵɵload, ɵɵtext, ɵɵtextBinding} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; -import {Δpipe, ΔpipeBind1, ΔpipeBind3, ΔpipeBind4, ΔpipeBindV} from '../../src/render3/pipe'; +import {ɵɵpipe, ɵɵpipeBind1, ɵɵpipeBind3, ɵɵpipeBind4, ɵɵpipeBindV} from '../../src/render3/pipe'; import {RenderLog, getRendererFactory2, patchLoggingRenderer2} from './imported_renderer2'; import {ComponentFixture, TemplateFixture, createComponent, getDirectiveOnNode, renderToHtml} from './render_util'; @@ -46,11 +46,11 @@ describe('pipe', () => { it('should support interpolation', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - Δtext(0); - Δpipe(1, 'countingPipe'); + ɵɵtext(0); + ɵɵpipe(1, 'countingPipe'); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.name), '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', ɵɵpipeBind1(1, 1, person.name), '')); } } @@ -61,11 +61,11 @@ describe('pipe', () => { it('should throw if pipe is not found', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtext(0); - Δpipe(1, 'randomPipeName'); + ɵɵtext(0); + ɵɵpipe(1, 'randomPipeName'); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, ctx.value), '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', ɵɵpipeBind1(1, 1, ctx.value), '')); } }, 2, 3, [], pipes); @@ -83,7 +83,7 @@ describe('pipe', () => { constructor() { this.dirProp = ''; } - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: MyDir, selectors: [['', 'myDir', '']], factory: () => new MyDir(), @@ -95,7 +95,7 @@ describe('pipe', () => { class DoublePipe implements PipeTransform { transform(value: any) { return `${value}${value}`; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'double', type: DoublePipe, factory: function DoublePipe_Factory() { return new DoublePipe(); }, @@ -104,12 +104,12 @@ describe('pipe', () => { function Template(rf: RenderFlags, ctx: string) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', ['myDir', '']); - Δpipe(1, 'double'); - ΔelementEnd(); + ɵɵelementStart(0, 'div', ['myDir', '']); + ɵɵpipe(1, 'double'); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'elprop', Δbind(ΔpipeBind1(1, 1, ctx))); + ɵɵelementProperty(0, 'elprop', ɵɵbind(ɵɵpipeBind1(1, 1, ctx))); directive = getDirectiveOnNode(0); } } @@ -120,13 +120,13 @@ describe('pipe', () => { it('should support arguments in pipes', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - Δtext(0); - Δpipe(1, 'multiArgPipe'); + ɵɵtext(0); + ɵɵpipe(1, 'multiArgPipe'); } if (rf & RenderFlags.Update) { - ΔtextBinding( + ɵɵtextBinding( 0, - Δinterpolation1('', ΔpipeBind3(1, 1, person.name, 'one', person.address !.city), '')); + ɵɵinterpolation1('', ɵɵpipeBind3(1, 1, person.name, 'one', person.address !.city), '')); } } @@ -137,14 +137,14 @@ describe('pipe', () => { it('should support calling pipes with different number of arguments', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - Δtext(0); - Δpipe(1, 'multiArgPipe'); - Δpipe(2, 'multiArgPipe'); + ɵɵtext(0); + ɵɵpipe(1, 'multiArgPipe'); + ɵɵpipe(2, 'multiArgPipe'); } if (rf & RenderFlags.Update) { - ΔtextBinding( - 0, Δinterpolation1( - '', ΔpipeBind4(2, 5, ΔpipeBindV(1, 1, [person.name, 'a', 'b']), 0, 1, 2), '')); + ɵɵtextBinding( + 0, ɵɵinterpolation1( + '', ɵɵpipeBind4(2, 5, ɵɵpipeBindV(1, 1, [person.name, 'a', 'b']), 0, 1, 2), '')); } } @@ -157,7 +157,7 @@ describe('pipe', () => { class IdentityPipe implements PipeTransform { transform(value: any) { return value; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'identityPipe', type: IdentityPipe, factory: function IdentityPipe_Factory() { return new IdentityPipe(); }, @@ -166,12 +166,12 @@ describe('pipe', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - Δpipe(1, 'identityPipe'); - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + ɵɵpipe(1, 'identityPipe'); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(ΔpipeBind1(1, 1, 'Megatron'))); + ɵɵelementProperty(0, 'id', ɵɵbind(ɵɵpipeBind1(1, 1, 'Megatron'))); } } @@ -186,11 +186,11 @@ describe('pipe', () => { it('should support duplicates by using the later entry', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - Δtext(0); - Δpipe(1, 'duplicatePipe'); + ɵɵtext(0); + ɵɵpipe(1, 'duplicatePipe'); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.name), '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', ɵɵpipeBind1(1, 1, person.name), '')); } } @@ -202,11 +202,11 @@ describe('pipe', () => { it('should call pure pipes only if the arguments change', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - Δtext(0); - Δpipe(1, 'countingPipe'); + ɵɵtext(0); + ɵɵpipe(1, 'countingPipe'); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.name), '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', ɵɵpipeBind1(1, 1, person.name), '')); } } @@ -231,11 +231,11 @@ describe('pipe', () => { it('should call impure pipes on each change detection run', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - Δtext(0); - Δpipe(1, 'countingImpurePipe'); + ɵɵtext(0); + ɵɵpipe(1, 'countingImpurePipe'); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.name), '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', ɵɵpipeBind1(1, 1, person.name), '')); } } @@ -247,37 +247,37 @@ describe('pipe', () => { it('should not cache impure pipes', () => { function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - Δpipe(1, 'countingImpurePipe'); - ΔelementEnd(); - ΔelementStart(2, 'div'); - Δpipe(3, 'countingImpurePipe'); - ΔelementEnd(); - Δcontainer(4); + ɵɵelementStart(0, 'div'); + ɵɵpipe(1, 'countingImpurePipe'); + ɵɵelementEnd(); + ɵɵelementStart(2, 'div'); + ɵɵpipe(3, 'countingImpurePipe'); + ɵɵelementEnd(); + ɵɵcontainer(4); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(ΔpipeBind1(1, 2, true))); - ΔelementProperty(2, 'id', Δbind(ΔpipeBind1(3, 4, true))); - pipeInstances.push(Δload(1), Δload(3)); - ΔcontainerRefreshStart(4); + ɵɵelementProperty(0, 'id', ɵɵbind(ɵɵpipeBind1(1, 2, true))); + ɵɵelementProperty(2, 'id', ɵɵbind(ɵɵpipeBind1(3, 4, true))); + pipeInstances.push(ɵɵload(1), ɵɵload(3)); + ɵɵcontainerRefreshStart(4); { for (let i of [1, 2]) { - let rf1 = ΔembeddedViewStart(1, 2, 3); + let rf1 = ɵɵembeddedViewStart(1, 2, 3); { if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'div'); - Δpipe(1, 'countingImpurePipe'); - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + ɵɵpipe(1, 'countingImpurePipe'); + ɵɵelementEnd(); } if (rf1 & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(ΔpipeBind1(1, 1, true))); - pipeInstances.push(Δload(1)); + ɵɵelementProperty(0, 'id', ɵɵbind(ɵɵpipeBind1(1, 1, true))); + pipeInstances.push(ɵɵload(1)); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } @@ -301,7 +301,7 @@ describe('pipe', () => { transform(value: any): any { return null; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'pipeWithOnDestroy', type: PipeWithOnDestroy, factory: function PipeWithOnDestroy_Factory() { return new PipeWithOnDestroy(); }, @@ -311,26 +311,26 @@ describe('pipe', () => { it('should call ngOnDestroy on pipes', () => { function Template(rf: RenderFlags, person: Person) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (person.age > 20) { - let rf1 = ΔembeddedViewStart(1, 2, 3); + let rf1 = ɵɵembeddedViewStart(1, 2, 3); { if (rf1 & RenderFlags.Create) { - Δtext(0); - Δpipe(1, 'pipeWithOnDestroy'); + ɵɵtext(0); + ɵɵpipe(1, 'pipeWithOnDestroy'); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, person.age), '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', ɵɵpipeBind1(1, 1, person.age), '')); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } const pipes = [PipeWithOnDestroy]; @@ -363,11 +363,12 @@ describe('pipe', () => { title = 'ServiceB Title'; static ngInjectableDef = - ΔdefineInjectable({providedIn: 'root', factory: () => new ServiceB()}); + ɵɵdefineInjectable({providedIn: 'root', factory: () => new ServiceB()}); } class ModuleA { - static ngInjectorDef = ΔdefineInjector({factory: () => new ModuleA(), providers: [ServiceA]}); + static ngInjectorDef = + ɵɵdefineInjector({factory: () => new ModuleA(), providers: [ServiceA]}); static ngModuleDef: NgModuleDef = { bootstrap: [] } as any; } @@ -377,7 +378,7 @@ describe('pipe', () => { transform(value: string): string { return `${value} - ${this.obj.title}`; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'myConcatPipe', type: MyConcatPipe, factory: () => new MyConcatPipe(directiveInject(InjectionType)), @@ -399,11 +400,11 @@ describe('pipe', () => { // '{{ title | myConcatPipe }}' template: (rf: RenderFlags, ctx: MyComponent) => { if (rf & 1) { - Δtext(0); - Δpipe(1, 'myConcatPipe'); + ɵɵtext(0); + ɵɵpipe(1, 'myConcatPipe'); } if (rf & 2) { - ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, ctx.title), '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', ɵɵpipeBind1(1, 1, ctx.title), '')); } }, ...overrides @@ -439,7 +440,7 @@ describe('pipe', () => { class WrappingPipe implements PipeTransform { transform(value: any) { return new WrappedValue('Bar'); } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'wrappingPipe', type: WrappingPipe, factory: function WrappingPipe_Factory() { return new WrappingPipe(); }, @@ -448,11 +449,13 @@ describe('pipe', () => { } function createTemplate() { - Δtext(0); - Δpipe(1, 'wrappingPipe'); + ɵɵtext(0); + ɵɵpipe(1, 'wrappingPipe'); } - function updateTemplate() { ΔtextBinding(0, Δinterpolation1('', ΔpipeBind1(1, 1, null), '')); } + function updateTemplate() { + ɵɵtextBinding(0, ɵɵinterpolation1('', ɵɵpipeBind1(1, 1, null), '')); + } it('should unwrap', () => { const fixture = @@ -481,7 +484,7 @@ class CountingPipe implements PipeTransform { transform(value: any) { return `${value} state:${this.state++}`; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'countingPipe', type: CountingPipe, factory: function CountingPipe_Factory() { return new CountingPipe(); }, @@ -494,7 +497,7 @@ class CountingImpurePipe implements PipeTransform { transform(value: any) { return `${value} state:${this.state++}`; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'countingImpurePipe', type: CountingImpurePipe, factory: function CountingImpurePipe_Factory() { return new CountingImpurePipe(); }, @@ -508,7 +511,7 @@ class MultiArgPipe implements PipeTransform { return `${value} ${arg1} ${arg2} ${arg3}`; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'multiArgPipe', type: MultiArgPipe, factory: function MultiArgPipe_Factory() { return new MultiArgPipe(); }, @@ -519,7 +522,7 @@ class MultiArgPipe implements PipeTransform { class DuplicatePipe1 implements PipeTransform { transform(value: any) { return `${value} from duplicate 1`; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'duplicatePipe', type: DuplicatePipe1, factory: function DuplicatePipe1_Factory() { return new DuplicatePipe1(); }, @@ -530,7 +533,7 @@ class DuplicatePipe1 implements PipeTransform { class DuplicatePipe2 implements PipeTransform { transform(value: any) { return `${value} from duplicate 2`; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'duplicatePipe', type: DuplicatePipe2, factory: function DuplicatePipe2_Factory() { return new DuplicatePipe2(); }, diff --git a/packages/core/test/render3/properties_spec.ts b/packages/core/test/render3/properties_spec.ts index fc28b0d203..d7efadec1a 100644 --- a/packages/core/test/render3/properties_spec.ts +++ b/packages/core/test/render3/properties_spec.ts @@ -8,8 +8,8 @@ import {EventEmitter} from '@angular/core'; -import {ΔdefineComponent, ΔdefineDirective} from '../../src/render3/index'; -import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δinterpolation1, Δlistener, Δload, Δreference, Δtext, ΔtextBinding} from '../../src/render3/instructions/all'; +import {ɵɵdefineComponent, ɵɵdefineDirective} from '../../src/render3/index'; +import {ɵɵbind, ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵelement, ɵɵelementEnd, ɵɵelementProperty, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵinterpolation1, ɵɵlistener, ɵɵload, ɵɵreference, ɵɵtext, ɵɵtextBinding} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {ComponentFixture, createComponent, renderToHtml} from './render_util'; @@ -19,10 +19,10 @@ describe('elementProperty', () => { it('should support bindings to properties', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'span'); + ɵɵelement(0, 'span'); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(ctx.id)); + ɵɵelementProperty(0, 'id', ɵɵbind(ctx.id)); } }, 1, 1); @@ -47,8 +47,8 @@ describe('elementProperty', () => { function Template(rf: RenderFlags, ctx: string) { if (rf & RenderFlags.Create) { - Δelement(0, 'span'); - ΔelementProperty(0, 'id', expensive(ctx)); + ɵɵelement(0, 'span'); + ɵɵelementProperty(0, 'id', expensive(ctx)); } } @@ -59,10 +59,10 @@ describe('elementProperty', () => { it('should support interpolation for properties', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'span'); + ɵɵelement(0, 'span'); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δinterpolation1('_', ctx.id, '_')); + ɵɵelementProperty(0, 'id', ɵɵinterpolation1('_', ctx.id, '_')); } }, 1, 1); @@ -86,7 +86,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. disabled !: boolean; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: MyButton, selectors: [['', 'myButton', '']], factory: () => button = new MyButton(), @@ -99,7 +99,7 @@ describe('elementProperty', () => { id !: number; clickStream = new EventEmitter(); - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: OtherDir, selectors: [['', 'otherDir', '']], factory: () => otherDir = new OtherDir(), @@ -112,7 +112,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. disabled !: boolean; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: OtherDisabledDir, selectors: [['', 'otherDisabledDir', '']], factory: () => otherDisabledDir = new OtherDisabledDir(), @@ -124,7 +124,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. idNumber !: string; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: IdDir, selectors: [['', 'idDir', '']], factory: () => idDir = new IdDir(), @@ -140,13 +140,13 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button', ['otherDir', '', 'myButton', '']); - { Δtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementStart(0, 'button', ['otherDir', '', 'myButton', '']); + { ɵɵtext(1, 'Click me'); } + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'disabled', Δbind(ctx.isDisabled)); - ΔelementProperty(0, 'id', Δbind(ctx.id)); + ɵɵelementProperty(0, 'disabled', ɵɵbind(ctx.isDisabled)); + ɵɵelementProperty(0, 'id', ɵɵbind(ctx.id)); } }, 2, 2, deps); @@ -171,13 +171,13 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button', ['myButton', '']); - { Δtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementStart(0, 'button', ['myButton', '']); + { ɵɵtext(1, 'Click me'); } + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'disabled', Δbind(ctx.isDisabled)); - ΔelementProperty(0, 'id', Δbind(ctx.id)); + ɵɵelementProperty(0, 'disabled', ɵɵbind(ctx.isDisabled)); + ɵɵelementProperty(0, 'id', ɵɵbind(ctx.id)); } }, 2, 2, deps); @@ -203,7 +203,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. id !: number; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Comp, selectors: [['comp']], consts: 0, @@ -217,10 +217,10 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'comp'); + ɵɵelement(0, 'comp'); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(ctx.id)); + ɵɵelementProperty(0, 'id', ɵɵbind(ctx.id)); } }, 1, 1, [Comp]); @@ -241,12 +241,12 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button', ['myButton', '', 'otherDisabledDir', '']); - { Δtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementStart(0, 'button', ['myButton', '', 'otherDisabledDir', '']); + { ɵɵtext(1, 'Click me'); } + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'disabled', Δbind(ctx.isDisabled)); + ɵɵelementProperty(0, 'disabled', ɵɵbind(ctx.isDisabled)); } }, 2, 1, deps); @@ -268,15 +268,15 @@ describe('elementProperty', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button', ['otherDir', '']); + ɵɵelementStart(0, 'button', ['otherDir', '']); { - Δlistener('click', () => ctx.onClick()); - Δtext(1, 'Click me'); + ɵɵlistener('click', () => ctx.onClick()); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(ctx.id)); + ɵɵelementProperty(0, 'id', ɵɵbind(ctx.id)); } }, 2, 1, deps); @@ -308,40 +308,40 @@ describe('elementProperty', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button', ['idDir', '']); - { Δtext(1, 'Click me'); } - ΔelementEnd(); - Δcontainer(2); + ɵɵelementStart(0, 'button', ['idDir', '']); + { ɵɵtext(1, 'Click me'); } + ɵɵelementEnd(); + ɵɵcontainer(2); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(ctx.id1)); - ΔcontainerRefreshStart(2); + ɵɵelementProperty(0, 'id', ɵɵbind(ctx.id1)); + ɵɵcontainerRefreshStart(2); { if (ctx.condition) { - let rf0 = ΔembeddedViewStart(0, 2, 1); + let rf0 = ɵɵembeddedViewStart(0, 2, 1); if (rf0 & RenderFlags.Create) { - ΔelementStart(0, 'button'); - { Δtext(1, 'Click me too'); } - ΔelementEnd(); + ɵɵelementStart(0, 'button'); + { ɵɵtext(1, 'Click me too'); } + ɵɵelementEnd(); } if (rf0 & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(ctx.id2)); + ɵɵelementProperty(0, 'id', ɵɵbind(ctx.id2)); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } else { - let rf1 = ΔembeddedViewStart(1, 2, 1); + let rf1 = ɵɵembeddedViewStart(1, 2, 1); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'button', ['otherDir', '']); - { Δtext(1, 'Click me too'); } - ΔelementEnd(); + ɵɵelementStart(0, 'button', ['otherDir', '']); + { ɵɵtext(1, 'Click me too'); } + ɵɵelementEnd(); } if (rf1 & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(ctx.id3)); + ɵɵelementProperty(0, 'id', ɵɵbind(ctx.id3)); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, 3, 1, deps); @@ -375,7 +375,7 @@ describe('elementProperty', () => { direction !: string; changeStream = new EventEmitter(); - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: MyDir, selectors: [['', 'myDir', '']], factory: () => myDir = new MyDir(), @@ -390,7 +390,7 @@ describe('elementProperty', () => { // TODO(issue/24571): remove '!'. roleB !: string; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: MyDirB, selectors: [['', 'myDirB', '']], factory: () => dirB = new MyDirB(), @@ -405,7 +405,7 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['role', 'button', 'myDir', '']); + ɵɵelement(0, 'div', ['role', 'button', 'myDir', '']); } }, 1, 0, deps); @@ -419,10 +419,10 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['role', 'button', 'myDir', '']); + ɵɵelement(0, 'div', ['role', 'button', 'myDir', '']); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'role', Δbind(ctx.role)); + ɵɵelementProperty(0, 'role', ɵɵbind(ctx.role)); } }, 1, 1, deps); @@ -442,7 +442,7 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['role', 'button', 'myDir', '', 'myDirB', '']); + ɵɵelement(0, 'div', ['role', 'button', 'myDir', '', 'myDirB', '']); } }, 1, 0, deps); @@ -457,7 +457,7 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['role', 'button', 'dir', 'rtl', 'myDir', '']); + ɵɵelement(0, 'div', ['role', 'button', 'dir', 'rtl', 'myDir', '']); } }, 1, 0, deps); @@ -472,9 +472,9 @@ describe('elementProperty', () => { /**
*/ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', ['role', 'button', 'myDir', '']); - { Δlistener('change', () => ctx.onChange()); } - ΔelementEnd(); + ɵɵelementStart(0, 'div', ['role', 'button', 'myDir', '']); + { ɵɵlistener('change', () => ctx.onChange()); } + ɵɵelementEnd(); } }, 1, 0, deps); @@ -497,8 +497,8 @@ describe('elementProperty', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['role', 'button', 'dir', 'rtl', 'myDir', '']); - Δelement(1, 'div', ['role', 'listbox', 'myDirB', '']); + ɵɵelement(0, 'div', ['role', 'button', 'dir', 'rtl', 'myDir', '']); + ɵɵelement(1, 'div', ['role', 'listbox', 'myDirB', '']); } }, 2, 0, deps); @@ -523,27 +523,27 @@ describe('elementProperty', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['role', 'listbox', 'myDir', '']); - Δcontainer(1); + ɵɵelement(0, 'div', ['role', 'listbox', 'myDir', '']); + ɵɵcontainer(1); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(1); + ɵɵcontainerRefreshStart(1); { if (ctx.condition) { - let rf1 = ΔembeddedViewStart(0, 1, 0); + let rf1 = ɵɵembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - Δelement(0, 'div', ['role', 'button', 'myDirB', '']); + ɵɵelement(0, 'div', ['role', 'button', 'myDirB', '']); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } else { - let rf2 = ΔembeddedViewStart(1, 1, 0); + let rf2 = ɵɵembeddedViewStart(1, 1, 0); if (rf2 & RenderFlags.Create) { - Δelement(0, 'div', ['role', 'menu']); + ɵɵelement(0, 'div', ['role', 'menu']); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, 2, 0, deps); @@ -565,7 +565,7 @@ describe('elementProperty', () => { it('should process attributes properly inside a for loop', () => { class Comp { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Comp, selectors: [['comp']], consts: 3, @@ -573,12 +573,12 @@ describe('elementProperty', () => { /**
{{ dir.role }} */ template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['role', 'button', 'myDir', ''], ['dir', 'myDir']); - Δtext(2); + ɵɵelement(0, 'div', ['role', 'button', 'myDir', ''], ['dir', 'myDir']); + ɵɵtext(2); } if (rf & RenderFlags.Update) { - const tmp = Δreference(1) as any; - ΔtextBinding(2, Δbind(tmp.role)); + const tmp = ɵɵreference(1) as any; + ɵɵtextBinding(2, ɵɵbind(tmp.role)); } }, factory: () => new Comp(), @@ -593,20 +593,20 @@ describe('elementProperty', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { for (let i = 0; i < 2; i++) { - let rf1 = ΔembeddedViewStart(0, 1, 0); + let rf1 = ɵɵembeddedViewStart(0, 1, 0); if (rf1 & RenderFlags.Create) { - Δelement(0, 'comp'); + ɵɵelement(0, 'comp'); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, 1, 0, [Comp]); diff --git a/packages/core/test/render3/providers_spec.ts b/packages/core/test/render3/providers_spec.ts index 021b7a18db..0e64029c90 100644 --- a/packages/core/test/render3/providers_spec.ts +++ b/packages/core/test/render3/providers_spec.ts @@ -6,11 +6,11 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component as _Component, ComponentFactoryResolver, ElementRef, InjectFlags, Injectable as _Injectable, InjectionToken, InjectorType, Provider, RendererFactory2, ViewContainerRef, ɵNgModuleDef as NgModuleDef, ΔdefineInjectable, ΔdefineInjector, Δinject} from '../../src/core'; +import {Component as _Component, ComponentFactoryResolver, ElementRef, InjectFlags, Injectable as _Injectable, InjectionToken, InjectorType, Provider, RendererFactory2, ViewContainerRef, ɵNgModuleDef as NgModuleDef, ɵɵdefineInjectable, ɵɵdefineInjector, ɵɵinject} from '../../src/core'; import {forwardRef} from '../../src/di/forward_ref'; import {createInjector} from '../../src/di/r3_injector'; -import {injectComponentFactoryResolver, ΔProvidersFeature, ΔdefineComponent, ΔdefineDirective, ΔdirectiveInject} from '../../src/render3/index'; -import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δinterpolation1, Δtext, ΔtextBinding} from '../../src/render3/instructions/all'; +import {injectComponentFactoryResolver, ɵɵProvidersFeature, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdirectiveInject} from '../../src/render3/index'; +import {ɵɵbind, ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵelement, ɵɵelementEnd, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵinterpolation1, ɵɵtext, ɵɵtextBinding} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {NgModuleFactory} from '../../src/render3/ng_module_ref'; import {getInjector} from '../../src/render3/util/discovery_utils'; @@ -59,7 +59,7 @@ describe('providers', () => { constructor(private provider: GreeterProvider) { this.greet = this.provider.provide(); } static ngInjectableDef = - ΔdefineInjectable({factory: () => new GreeterInj(Δinject(GreeterProvider as any))}); + ɵɵdefineInjectable({factory: () => new GreeterInj(ɵɵinject(GreeterProvider as any))}); } it('TypeProvider', () => { @@ -67,7 +67,7 @@ describe('providers', () => { parent: { providers: [GreeterClass], componentAssertion: - () => { expect(ΔdirectiveInject(GreeterClass).greet).toEqual('Class'); } + () => { expect(ɵɵdirectiveInject(GreeterClass).greet).toEqual('Class'); } } }); }); @@ -76,7 +76,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [{provide: GREETER, useValue: {greet: 'Value'}}], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Value'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Value'); } } }); }); @@ -85,7 +85,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [{provide: GREETER, useClass: GreeterClass}], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -94,7 +94,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [GreeterClass, {provide: GREETER, useExisting: GreeterClass}], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -103,7 +103,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [GreeterClass, {provide: GREETER, useFactory: () => new GreeterClass()}], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -117,7 +117,7 @@ describe('providers', () => { {provide: MESSAGE, useValue: 'Message'}, {provide: GREETER, useClass: GreeterDeps, deps: [MESSAGE]} ], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Message'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Message'); } } }); }); @@ -130,7 +130,7 @@ describe('providers', () => { {provide: GREETER, useClass: GreeterBuiltInDeps, deps: [MESSAGE, ElementRef]} ], componentAssertion: - () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Message from PARENT'); } + () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Message from PARENT'); } } }); }); @@ -142,7 +142,7 @@ describe('providers', () => { {provide: MESSAGE, useValue: 'Message'}, {provide: GREETER, useFactory: (msg: string) => new GreeterDeps(msg), deps: [MESSAGE]} ], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Message'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Message'); } } }); }); @@ -159,7 +159,7 @@ describe('providers', () => { } ], componentAssertion: - () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Message from PARENT'); } + () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Message from PARENT'); } } }); }); @@ -168,7 +168,8 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [GreeterProvider, {provide: GREETER, useClass: GreeterInj}], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Provided'); } + componentAssertion: + () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Provided'); } } }); }); @@ -180,7 +181,7 @@ describe('providers', () => { parent: { providers: [forwardRef(() => ForLater)], componentAssertion: - () => { expect(ΔdirectiveInject(ForLater) instanceof ForLater).toBeTruthy(); } + () => { expect(ɵɵdirectiveInject(ForLater) instanceof ForLater).toBeTruthy(); } } }); done(); @@ -195,7 +196,7 @@ describe('providers', () => { parent: { providers: [{provide: GREETER, useValue: forwardRef(() => { return {greet: 'Value'}; })}], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Value'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Value'); } } }); }); @@ -204,7 +205,7 @@ describe('providers', () => { expectProvidersScenario({ parent: { providers: [{provide: GREETER, useClass: forwardRef(() => GreeterClass)}], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -214,7 +215,7 @@ describe('providers', () => { parent: { providers: [GreeterClass, {provide: GREETER, useExisting: forwardRef(() => GreeterClass)}], - componentAssertion: () => { expect(ΔdirectiveInject(GREETER).greet).toEqual('Class'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(GREETER).greet).toEqual('Class'); } } }); }); @@ -225,7 +226,7 @@ describe('providers', () => { parent: { providers: [{provide: GREETER, useValue: {greet: 'Value'}}], componentAssertion: () => { - expect(ΔdirectiveInject(forwardRef(() => GREETER)).greet).toEqual('Value'); + expect(ɵɵdirectiveInject(forwardRef(() => GREETER)).greet).toEqual('Value'); } } }); @@ -255,7 +256,7 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'Message 1'}], directiveProviders: [{provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -265,7 +266,7 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'Message 1'}], viewProviders: [{provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -275,7 +276,7 @@ describe('providers', () => { parent: { directiveProviders: [{provide: String, useValue: 'Message 1'}], viewProviders: [{provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -285,7 +286,7 @@ describe('providers', () => { parent: { directive2Providers: [{provide: String, useValue: 'Message 1'}], directiveProviders: [{provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -295,7 +296,7 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'Message 1'}, {provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -305,7 +306,7 @@ describe('providers', () => { parent: { viewProviders: [{provide: String, useValue: 'Message 1'}, {provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -315,7 +316,7 @@ describe('providers', () => { parent: { directiveProviders: [{provide: String, useValue: 'Message 1'}, {provide: String, useValue: 'Message 2'}], - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('Message 2'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('Message 2'); } } }); }); @@ -323,7 +324,7 @@ describe('providers', () => { describe('single', () => { class MyModule { - static ngInjectorDef = ΔdefineInjector( + static ngInjectorDef = ɵɵdefineInjector( {factory: () => new MyModule(), providers: [{provide: String, useValue: 'From module'}]}); } @@ -331,16 +332,16 @@ describe('providers', () => { it('should work without providers nor viewProviders in component', () => { expectProvidersScenario({ parent: { - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('From module'); }, + directiveAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('From module'); } }, viewChild: { - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('From module'); }, + directiveAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('From module'); } }, contentChild: { - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('From module'); }, + directiveAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('From module'); } }, ngModule: MyModule }); @@ -351,21 +352,21 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'From providers'}], componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From providers'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From providers'); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From providers'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From providers'); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From providers'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From providers'); } }, ngModule: MyModule }); @@ -376,18 +377,18 @@ describe('providers', () => { parent: { viewProviders: [{provide: String, useValue: 'From viewProviders'}], componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); }, + directiveAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('From module'); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); } }, contentChild: { - componentAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual('From module'); } + componentAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('From module'); }, + directiveAssertion: () => { expect(ɵɵdirectiveInject(String)).toEqual('From module'); } }, ngModule: MyModule }); @@ -399,21 +400,21 @@ describe('providers', () => { providers: [{provide: String, useValue: 'From providers'}], viewProviders: [{provide: String, useValue: 'From viewProviders'}], componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From providers'); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From providers'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From providers'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From providers'); } }, ngModule: MyModule }); @@ -427,21 +428,21 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive'}], directive2Providers: [{provide: String, useValue: 'Never'}], componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, ngModule: MyModule }); @@ -454,21 +455,21 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive'}], directive2Providers: [{provide: String, useValue: 'Never'}], componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, ngModule: MyModule }); @@ -481,21 +482,21 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive'}], directive2Providers: [{provide: String, useValue: 'Never'}], componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, ngModule: MyModule }); @@ -509,21 +510,21 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive'}], directive2Providers: [{provide: String, useValue: 'Never'}], componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From viewProviders'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From viewProviders'); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual('From directive'); } + () => { expect(ɵɵdirectiveInject(String)).toEqual('From directive'); } }, ngModule: MyModule }); @@ -533,7 +534,7 @@ describe('providers', () => { describe('multi', () => { class MyModule { - static ngInjectorDef = ΔdefineInjector({ + static ngInjectorDef = ɵɵdefineInjector({ factory: () => new MyModule(), providers: [{provide: String, useValue: 'From module', multi: true}] }); @@ -544,18 +545,21 @@ describe('providers', () => { expectProvidersScenario({ parent: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From module']); }, + directiveAssertion: + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From module']); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From module']); }, + directiveAssertion: + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From module']); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From module']); }, + directiveAssertion: + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From module']); } }, ngModule: MyModule }); @@ -566,21 +570,21 @@ describe('providers', () => { parent: { providers: [{provide: String, useValue: 'From providers', multi: true}], componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From providers']); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From providers']); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From providers']); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From providers']); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From providers']); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From providers']); } }, ngModule: MyModule }); @@ -591,19 +595,21 @@ describe('providers', () => { parent: { viewProviders: [{provide: String, useValue: 'From viewProviders', multi: true}], componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From viewProviders']); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From viewProviders']); }, + directiveAssertion: + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From module']); } }, viewChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From viewProviders']); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From viewProviders']); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From viewProviders']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From viewProviders']); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); }, - directiveAssertion: () => { expect(ΔdirectiveInject(String)).toEqual(['From module']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From module']); }, + directiveAssertion: + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From module']); } }, ngModule: MyModule }); @@ -615,24 +621,24 @@ describe('providers', () => { providers: [{provide: String, useValue: 'From providers', multi: true}], viewProviders: [{provide: String, useValue: 'From viewProviders', multi: true}], componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From providers', 'From viewProviders']); + expect(ɵɵdirectiveInject(String)).toEqual(['From providers', 'From viewProviders']); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From providers']); } }, viewChild: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From providers', 'From viewProviders']); + expect(ɵɵdirectiveInject(String)).toEqual(['From providers', 'From viewProviders']); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From providers', 'From viewProviders']); + expect(ɵɵdirectiveInject(String)).toEqual(['From providers', 'From viewProviders']); } }, contentChild: { componentAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); }, + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From providers']); }, directiveAssertion: - () => { expect(ΔdirectiveInject(String)).toEqual(['From providers']); } + () => { expect(ɵɵdirectiveInject(String)).toEqual(['From providers']); } }, ngModule: MyModule }); @@ -646,26 +652,26 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive 1', multi: true}], directive2Providers: [{provide: String, useValue: 'From directive 2', multi: true}], componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ɵɵdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ɵɵdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, viewChild: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ɵɵdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ɵɵdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, contentChild: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ɵɵdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ɵɵdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, ngModule: MyModule @@ -679,36 +685,36 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive 1', multi: true}], directive2Providers: [{provide: String, useValue: 'From directive 2', multi: true}], componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } }, viewChild: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } }, contentChild: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } @@ -724,32 +730,32 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive 1', multi: true}], directive2Providers: [{provide: String, useValue: 'From directive 2', multi: true}], componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From viewProviders', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ɵɵdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, viewChild: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From viewProviders', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From viewProviders', 'From directive 2', 'From directive 1' ]); } }, contentChild: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ɵɵdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); + expect(ɵɵdirectiveInject(String)).toEqual(['From directive 2', 'From directive 1']); } }, ngModule: MyModule @@ -764,36 +770,36 @@ describe('providers', () => { directiveProviders: [{provide: String, useValue: 'From directive 1', multi: true}], directive2Providers: [{provide: String, useValue: 'From directive 2', multi: true}], componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From viewProviders', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } }, viewChild: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From viewProviders', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From viewProviders', 'From directive 2', 'From directive 1' ]); } }, contentChild: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); }, directiveAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual([ + expect(ɵɵdirectiveInject(String)).toEqual([ 'From providers', 'From directive 2', 'From directive 1' ]); } @@ -809,20 +815,20 @@ describe('providers', () => { @Injectable({providedIn: 'root'}) class FooForRoot { static ngInjectableDef = - ΔdefineInjectable({factory: () => new FooForRoot(), providedIn: 'root'}); + ɵɵdefineInjectable({factory: () => new FooForRoot(), providedIn: 'root'}); } expectProvidersScenario({ parent: { componentAssertion: - () => { expect(ΔdirectiveInject(FooForRoot) instanceof FooForRoot).toBeTruthy(); } + () => { expect(ɵɵdirectiveInject(FooForRoot) instanceof FooForRoot).toBeTruthy(); } } }); }); it('should work with a module', () => { class MyModule { - static ngInjectorDef = ΔdefineInjector({ + static ngInjectorDef = ɵɵdefineInjector({ factory: () => new MyModule(), providers: [{provide: String, useValue: 'From module'}] }); @@ -831,13 +837,14 @@ describe('providers', () => { @Injectable({providedIn: MyModule}) class FooForModule { static ngInjectableDef = - ΔdefineInjectable({factory: () => new FooForModule(), providedIn: MyModule}); + ɵɵdefineInjectable({factory: () => new FooForModule(), providedIn: MyModule}); } expectProvidersScenario({ parent: { - componentAssertion: - () => { expect(ΔdirectiveInject(FooForModule) instanceof FooForModule).toBeTruthy(); } + componentAssertion: () => { + expect(ɵɵdirectiveInject(FooForModule) instanceof FooForModule).toBeTruthy(); + } }, ngModule: MyModule }); @@ -852,20 +859,20 @@ describe('providers', () => { class Repeated { constructor(private s: String, private n: Number) {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Repeated, selectors: [['repeated']], - factory: () => new Repeated(ΔdirectiveInject(String), ΔdirectiveInject(Number)), + factory: () => new Repeated(ɵɵdirectiveInject(String), ɵɵdirectiveInject(Number)), consts: 2, vars: 2, template: function(fs: RenderFlags, ctx: Repeated) { if (fs & RenderFlags.Create) { - Δtext(0); - Δtext(1); + ɵɵtext(0); + ɵɵtext(1); } if (fs & RenderFlags.Update) { - ΔtextBinding(0, Δbind(ctx.s)); - ΔtextBinding(1, Δbind(ctx.n)); + ɵɵtextBinding(0, ɵɵbind(ctx.s)); + ɵɵtextBinding(1, ɵɵbind(ctx.n)); } } }); @@ -882,7 +889,7 @@ describe('providers', () => { [{provide: String, useValue: 'foo'}, {provide: Number, useValue: 2, multi: true}], }) class ComponentWithProviders { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ComponentWithProviders, selectors: [['component-with-providers']], factory: () => new ComponentWithProviders(), @@ -890,28 +897,28 @@ describe('providers', () => { vars: 0, template: function(fs: RenderFlags, ctx: ComponentWithProviders) { if (fs & RenderFlags.Create) { - ΔelementStart(0, 'div'); - { Δcontainer(1); } - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + { ɵɵcontainer(1); } + ɵɵelementEnd(); } if (fs & RenderFlags.Update) { - ΔcontainerRefreshStart(1); + ɵɵcontainerRefreshStart(1); { for (let i = 0; i < 3; i++) { - let rf1 = ΔembeddedViewStart(1, 1, 0); + let rf1 = ɵɵembeddedViewStart(1, 1, 0); { if (rf1 & RenderFlags.Create) { - Δelement(0, 'repeated'); + ɵɵelement(0, 'repeated'); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, features: [ - ΔProvidersFeature( + ɵɵProvidersFeature( [{provide: Number, useValue: 1, multi: true}], [{provide: String, useValue: 'foo'}, {provide: Number, useValue: 2, multi: true}]), ], @@ -935,24 +942,24 @@ describe('providers', () => { class Repeated { constructor(private s: String, private n: Number) {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Repeated, selectors: [['repeated']], - factory: () => new Repeated(ΔdirectiveInject(String), ΔdirectiveInject(Number)), + factory: () => new Repeated(ɵɵdirectiveInject(String), ɵɵdirectiveInject(Number)), consts: 2, vars: 2, template: function(fs: RenderFlags, ctx: Repeated) { if (fs & RenderFlags.Create) { - Δtext(0); - Δtext(1); + ɵɵtext(0); + ɵɵtext(1); } if (fs & RenderFlags.Update) { - ΔtextBinding(0, Δbind(ctx.s)); - ΔtextBinding(1, Δbind(ctx.n)); + ɵɵtextBinding(0, ɵɵbind(ctx.s)); + ɵɵtextBinding(1, ɵɵbind(ctx.n)); } }, features: [ - ΔProvidersFeature( + ɵɵProvidersFeature( [{provide: Number, useValue: 1, multi: true}], [{provide: String, useValue: 'bar'}, {provide: Number, useValue: 2, multi: true}]), ], @@ -968,7 +975,7 @@ describe('providers', () => { viewProviders: [{provide: toString, useValue: 'foo'}], }) class ComponentWithProviders { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ComponentWithProviders, selectors: [['component-with-providers']], factory: () => new ComponentWithProviders(), @@ -976,27 +983,27 @@ describe('providers', () => { vars: 0, template: function(fs: RenderFlags, ctx: ComponentWithProviders) { if (fs & RenderFlags.Create) { - ΔelementStart(0, 'div'); - { Δcontainer(1); } - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + { ɵɵcontainer(1); } + ɵɵelementEnd(); } if (fs & RenderFlags.Update) { - ΔcontainerRefreshStart(1); + ɵɵcontainerRefreshStart(1); { for (let i = 0; i < 3; i++) { - let rf1 = ΔembeddedViewStart(1, 1, 0); + let rf1 = ɵɵembeddedViewStart(1, 1, 0); { if (rf1 & RenderFlags.Create) { - Δelement(0, 'repeated'); + ɵɵelement(0, 'repeated'); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, - features: [ΔProvidersFeature([], [{provide: String, useValue: 'foo'}])], + features: [ɵɵProvidersFeature([], [{provide: String, useValue: 'foo'}])], directives: [Repeated] }); } @@ -1017,18 +1024,18 @@ describe('providers', () => { class EmbeddedComponent { constructor(private s: String) {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: EmbeddedComponent, selectors: [['embedded-cmp']], - factory: () => new EmbeddedComponent(ΔdirectiveInject(String)), + factory: () => new EmbeddedComponent(ɵɵdirectiveInject(String)), consts: 1, vars: 1, template: (rf: RenderFlags, cmp: EmbeddedComponent) => { if (rf & RenderFlags.Create) { - Δtext(0); + ɵɵtext(0); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('', cmp.s, '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', cmp.s, '')); } } }); @@ -1038,20 +1045,20 @@ describe('providers', () => { class HostComponent { constructor(public vcref: ViewContainerRef, public cfr: ComponentFactoryResolver) {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: HostComponent, selectors: [['host-cmp']], factory: () => hostComponent = new HostComponent( - ΔdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), + ɵɵdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), consts: 1, vars: 0, template: (rf: RenderFlags, cmp: HostComponent) => { if (rf & RenderFlags.Create) { - Δtext(0, 'foo'); + ɵɵtext(0, 'foo'); } }, features: [ - ΔProvidersFeature([{provide: String, useValue: 'From host component'}]), + ɵɵProvidersFeature([{provide: String, useValue: 'From host component'}]), ], }); } @@ -1063,7 +1070,7 @@ describe('providers', () => { class AppComponent { constructor() {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: AppComponent, selectors: [['app-cmp']], factory: () => new AppComponent(), @@ -1071,11 +1078,11 @@ describe('providers', () => { vars: 0, template: (rf: RenderFlags, cmp: AppComponent) => { if (rf & RenderFlags.Create) { - Δelement(0, 'host-cmp'); + ɵɵelement(0, 'host-cmp'); } }, features: [ - ΔProvidersFeature([{provide: String, useValue: 'From app component'}]), + ɵɵProvidersFeature([{provide: String, useValue: 'From app component'}]), ], directives: [HostComponent] }); @@ -1104,7 +1111,7 @@ describe('providers', () => { expect(fixture.html).toEqual('foo'); class MyAppModule { - static ngInjectorDef = ΔdefineInjector({ + static ngInjectorDef = ɵɵdefineInjector({ factory: () => new MyAppModule(), imports: [], providers: [ @@ -1147,7 +1154,7 @@ describe('providers', () => { constructor(public value: String) {} static ngInjectableDef = - ΔdefineInjectable({factory: () => new MyService(Δinject(String))}); + ɵɵdefineInjectable({factory: () => new MyService(ɵɵinject(String))}); } expectProvidersScenario({ @@ -1155,8 +1162,8 @@ describe('providers', () => { providers: [MyService, {provide: String, useValue: 'providers'}], viewProviders: [{provide: String, useValue: 'viewProviders'}], componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual('viewProviders'); - expect(ΔdirectiveInject(MyService).value).toEqual('providers'); + expect(ɵɵdirectiveInject(String)).toEqual('viewProviders'); + expect(ɵɵdirectiveInject(MyService).value).toEqual('providers'); } } }); @@ -1164,7 +1171,7 @@ describe('providers', () => { it('should make sure that parent service does not see overrides in child directives', () => { class Greeter { - static ngInjectableDef = ΔdefineInjectable({factory: () => new Greeter(Δinject(String))}); + static ngInjectableDef = ɵɵdefineInjectable({factory: () => new Greeter(ɵɵinject(String))}); constructor(public greeting: String) {} } @@ -1175,7 +1182,7 @@ describe('providers', () => { viewChild: { providers: [{provide: String, useValue: 'view'}], componentAssertion: - () => { expect(ΔdirectiveInject(Greeter).greeting).toEqual('parent'); }, + () => { expect(ɵɵdirectiveInject(Greeter).greeting).toEqual('parent'); }, }, }); }); @@ -1183,7 +1190,7 @@ describe('providers', () => { describe('injection flags', () => { class MyModule { - static ngInjectorDef = ΔdefineInjector( + static ngInjectorDef = ɵɵdefineInjector( {factory: () => new MyModule(), providers: [{provide: String, useValue: 'Module'}]}); } it('should not fall through to ModuleInjector if flags limit the scope', () => { @@ -1191,9 +1198,9 @@ describe('providers', () => { ngModule: MyModule, parent: { componentAssertion: () => { - expect(ΔdirectiveInject(String)).toEqual('Module'); - expect(ΔdirectiveInject(String, InjectFlags.Optional | InjectFlags.Self)).toBeNull(); - expect(ΔdirectiveInject(String, InjectFlags.Optional | InjectFlags.Host)).toBeNull(); + expect(ɵɵdirectiveInject(String)).toEqual('Module'); + expect(ɵɵdirectiveInject(String, InjectFlags.Optional | InjectFlags.Self)).toBeNull(); + expect(ɵɵdirectiveInject(String, InjectFlags.Optional | InjectFlags.Host)).toBeNull(); } } }); @@ -1206,7 +1213,7 @@ describe('providers', () => { class SomeInj implements Some { constructor(public location: String) {} - static ngInjectableDef = ΔdefineInjectable({factory: () => new SomeInj(Δinject(String))}); + static ngInjectableDef = ɵɵdefineInjectable({factory: () => new SomeInj(ɵɵinject(String))}); } @Component({ @@ -1217,7 +1224,7 @@ describe('providers', () => { class MyComponent { constructor() {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: MyComponent, selectors: [['my-cmp']], factory: () => new MyComponent(), @@ -1225,11 +1232,11 @@ describe('providers', () => { vars: 0, template: (rf: RenderFlags, cmp: MyComponent) => { if (rf & RenderFlags.Create) { - Δelement(0, 'p'); + ɵɵelement(0, 'p'); } }, features: [ - ΔProvidersFeature( + ɵɵProvidersFeature( [{provide: String, useValue: 'From my component'}], [{provide: Number, useValue: 123}]), ], @@ -1244,7 +1251,7 @@ describe('providers', () => { class AppComponent { constructor() {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: AppComponent, selectors: [['app-cmp']], factory: () => new AppComponent(), @@ -1252,11 +1259,11 @@ describe('providers', () => { vars: 0, template: (rf: RenderFlags, cmp: AppComponent) => { if (rf & RenderFlags.Create) { - Δelement(0, 'my-cmp'); + ɵɵelement(0, 'my-cmp'); } }, features: [ - ΔProvidersFeature([ + ɵɵProvidersFeature([ {provide: String, useValue: 'From app component'}, {provide: Some, useClass: SomeInj} ]), ], @@ -1307,18 +1314,18 @@ describe('providers', () => { class MyComponent { constructor(foo: InjectableWithLifeCycleHooks) {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: MyComponent, selectors: [['my-comp']], - factory: () => new MyComponent(ΔdirectiveInject(InjectableWithLifeCycleHooks)), + factory: () => new MyComponent(ɵɵdirectiveInject(InjectableWithLifeCycleHooks)), consts: 1, vars: 0, template: (rf: RenderFlags, ctx: MyComponent) => { if (rf & RenderFlags.Create) { - Δelement(0, 'span'); + ɵɵelement(0, 'span'); } }, - features: [ΔProvidersFeature([InjectableWithLifeCycleHooks])] + features: [ɵɵProvidersFeature([InjectableWithLifeCycleHooks])] }); } @@ -1334,7 +1341,7 @@ describe('providers', () => { class App { public condition = true; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: App, selectors: [['app-cmp']], factory: () => new App(), @@ -1342,24 +1349,24 @@ describe('providers', () => { vars: 0, template: (rf: RenderFlags, ctx: App) => { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - { Δcontainer(1); } - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + { ɵɵcontainer(1); } + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(1); + ɵɵcontainerRefreshStart(1); { if (ctx.condition) { - let rf1 = ΔembeddedViewStart(1, 2, 1); + let rf1 = ɵɵembeddedViewStart(1, 2, 1); { if (rf1 & RenderFlags.Create) { - Δelement(0, 'my-comp'); + ɵɵelement(0, 'my-comp'); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, directives: [MyComponent] @@ -1409,7 +1416,7 @@ function expectProvidersScenario(defs: { } class ViewChildComponent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ViewChildComponent, selectors: [['view-child']], consts: 1, @@ -1417,27 +1424,27 @@ function expectProvidersScenario(defs: { factory: () => testComponentInjection(defs.viewChild, new ViewChildComponent()), template: function(fs: RenderFlags, ctx: ViewChildComponent) { if (fs & RenderFlags.Create) { - Δtext(0, 'view-child'); + ɵɵtext(0, 'view-child'); } }, features: defs.viewChild && [ - ΔProvidersFeature(defs.viewChild.providers || [], defs.viewChild.viewProviders || []), + ɵɵProvidersFeature(defs.viewChild.providers || [], defs.viewChild.viewProviders || []), ], }); } class ViewChildDirective { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: ViewChildDirective, selectors: [['view-child']], factory: () => testDirectiveInjection(defs.viewChild, new ViewChildDirective()), - features: defs.viewChild && [ΔProvidersFeature(defs.viewChild.directiveProviders || [])], + features: defs.viewChild && [ɵɵProvidersFeature(defs.viewChild.directiveProviders || [])], }); } class ContentChildComponent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ContentChildComponent, selectors: [['content-child']], consts: 1, @@ -1445,28 +1452,28 @@ function expectProvidersScenario(defs: { factory: () => testComponentInjection(defs.contentChild, new ContentChildComponent()), template: function(fs: RenderFlags, ctx: ParentComponent) { if (fs & RenderFlags.Create) { - Δtext(0, 'content-child'); + ɵɵtext(0, 'content-child'); } }, features: defs.contentChild && - [ΔProvidersFeature( + [ɵɵProvidersFeature( defs.contentChild.providers || [], defs.contentChild.viewProviders || [])], }); } class ContentChildDirective { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: ContentChildDirective, selectors: [['content-child']], factory: () => testDirectiveInjection(defs.contentChild, new ContentChildDirective()), features: - defs.contentChild && [ΔProvidersFeature(defs.contentChild.directiveProviders || [])], + defs.contentChild && [ɵɵProvidersFeature(defs.contentChild.directiveProviders || [])], }); } class ParentComponent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ParentComponent, selectors: [['parent']], consts: 1, @@ -1474,36 +1481,36 @@ function expectProvidersScenario(defs: { factory: () => testComponentInjection(defs.parent, new ParentComponent()), template: function(fs: RenderFlags, ctx: ParentComponent) { if (fs & RenderFlags.Create) { - Δelement(0, 'view-child'); + ɵɵelement(0, 'view-child'); } }, features: defs.parent && - [ΔProvidersFeature(defs.parent.providers || [], defs.parent.viewProviders || [])], + [ɵɵProvidersFeature(defs.parent.providers || [], defs.parent.viewProviders || [])], directives: [ViewChildComponent, ViewChildDirective] }); } class ParentDirective { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: ParentDirective, selectors: [['parent']], factory: () => testDirectiveInjection(defs.parent, new ParentDirective()), - features: defs.parent && [ΔProvidersFeature(defs.parent.directiveProviders || [])], + features: defs.parent && [ɵɵProvidersFeature(defs.parent.directiveProviders || [])], }); } class ParentDirective2 { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: ParentDirective2, selectors: [['parent']], factory: () => testDirectiveInjection(defs.parent, new ParentDirective2()), - features: defs.parent && [ΔProvidersFeature(defs.parent.directive2Providers || [])], + features: defs.parent && [ɵɵProvidersFeature(defs.parent.directive2Providers || [])], }); } class App { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: App, selectors: [['app']], consts: 2, @@ -1511,13 +1518,13 @@ function expectProvidersScenario(defs: { factory: () => testComponentInjection(defs.app, new App()), template: function(fs: RenderFlags, ctx: App) { if (fs & RenderFlags.Create) { - ΔelementStart(0, 'parent'); - Δelement(1, 'content-child'); - ΔelementEnd(); + ɵɵelementStart(0, 'parent'); + ɵɵelement(1, 'content-child'); + ɵɵelementEnd(); } }, features: - defs.app && [ΔProvidersFeature(defs.app.providers || [], defs.app.viewProviders || [])], + defs.app && [ɵɵProvidersFeature(defs.app.providers || [], defs.app.viewProviders || [])], directives: [ ParentComponent, ParentDirective2, ParentDirective, ContentChildComponent, ContentChildDirective diff --git a/packages/core/test/render3/pure_function_spec.ts b/packages/core/test/render3/pure_function_spec.ts index a8978585a8..2824d8ee2a 100644 --- a/packages/core/test/render3/pure_function_spec.ts +++ b/packages/core/test/render3/pure_function_spec.ts @@ -5,10 +5,10 @@ * Use of this source code is governed by an MIT-style license that can be * found in the LICENSE file at https://angular.io/license */ -import {AttributeMarker, ΔdefineComponent, Δtemplate} from '../../src/render3/index'; -import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, ΔnextContext} from '../../src/render3/instructions/all'; +import {AttributeMarker, ɵɵdefineComponent, ɵɵtemplate} from '../../src/render3/index'; +import {ɵɵbind, ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵelement, ɵɵelementEnd, ɵɵelementProperty, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵnextContext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; -import {ΔpureFunction1, ΔpureFunction2, ΔpureFunction3, ΔpureFunction4, ΔpureFunction5, ΔpureFunction6, ΔpureFunction7, ΔpureFunction8, ΔpureFunctionV} from '../../src/render3/pure_function'; +import {ɵɵpureFunction1, ɵɵpureFunction2, ɵɵpureFunction3, ɵɵpureFunction4, ɵɵpureFunction5, ɵɵpureFunction6, ɵɵpureFunction7, ɵɵpureFunction8, ɵɵpureFunctionV} from '../../src/render3/pure_function'; import {ComponentFixture, createComponent, getDirectiveOnNode, renderToHtml} from '../../test/render3/render_util'; import {NgIf} from './common_with_def'; @@ -20,7 +20,7 @@ describe('array literals', () => { // TODO(issue/24571): remove '!'. names !: string[]; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: MyComp, selectors: [['my-comp']], factory: function MyComp_Factory() { return myComp = new MyComp(); }, @@ -39,10 +39,10 @@ describe('array literals', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'my-comp'); + ɵɵelement(0, 'my-comp'); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'names', Δbind(ΔpureFunction1(1, e0_ff, ctx.customName))); + ɵɵelementProperty(0, 'names', ɵɵbind(ɵɵpureFunction1(1, e0_ff, ctx.customName))); } }, 1, 3, directives); @@ -75,11 +75,11 @@ describe('array literals', () => { function IfTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'my-comp'); + ɵɵelement(0, 'my-comp'); } if (rf & RenderFlags.Update) { - const comp = ΔnextContext(); - ΔelementProperty(0, 'names', Δbind(ΔpureFunction1(1, e0_ff, comp.customName))); + const comp = ɵɵnextContext(); + ɵɵelementProperty(0, 'names', ɵɵbind(ɵɵpureFunction1(1, e0_ff, comp.customName))); } } @@ -88,12 +88,12 @@ describe('array literals', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, IfTemplate, 1, 3, 'my-comp', [AttributeMarker.Bindings, 'names', AttributeMarker.Template, 'ngIf']); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'ngIf', Δbind(ctx.showing)); + ɵɵelementProperty(0, 'ngIf', ɵɵbind(ctx.showing)); } }, 1, 1, [MyComp, NgIf]); @@ -114,7 +114,7 @@ describe('array literals', () => { // TODO(issue/24571): remove '!'. names2 !: string[]; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ManyPropComp, selectors: [['many-prop-comp']], factory: function ManyPropComp_Factory() { return manyPropComp = new ManyPropComp(); }, @@ -134,11 +134,11 @@ describe('array literals', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'many-prop-comp'); + ɵɵelement(0, 'many-prop-comp'); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'names1', Δbind(ΔpureFunction1(2, e0_ff, ctx.customName))); - ΔelementProperty(0, 'names2', Δbind(ΔpureFunction1(4, e0_ff_1, ctx.customName2))); + ɵɵelementProperty(0, 'names1', ɵɵbind(ɵɵpureFunction1(2, e0_ff, ctx.customName))); + ɵɵelementProperty(0, 'names2', ɵɵbind(ɵɵpureFunction1(4, e0_ff_1, ctx.customName2))); } }, 1, 6, [ManyPropComp]); @@ -170,7 +170,7 @@ describe('array literals', () => { return arr; } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ParentComp, selectors: [['parent-comp']], factory: () => new ParentComp(), @@ -178,13 +178,13 @@ describe('array literals', () => { vars: 3, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'my-comp'); + ɵɵelementStart(0, 'my-comp'); myComps.push(getDirectiveOnNode(0)); - ΔelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty( - 0, 'names', Δbind(ctx.someFn(ΔpureFunction1(1, e0_ff, ctx.customName)))); + ɵɵelementProperty( + 0, 'names', ɵɵbind(ctx.someFn(ɵɵpureFunction1(1, e0_ff, ctx.customName)))); } }, directives: directives @@ -193,8 +193,8 @@ describe('array literals', () => { const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'parent-comp'); - Δelement(1, 'parent-comp'); + ɵɵelement(0, 'parent-comp'); + ɵɵelement(1, 'parent-comp'); } }, 2, 0, [ParentComp]); @@ -218,11 +218,11 @@ describe('array literals', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'my-comp'); + ɵɵelement(0, 'my-comp'); } if (rf & RenderFlags.Update) { - ΔelementProperty( - 0, 'names', Δbind(ΔpureFunction2(1, e0_ff, ctx.customName, ctx.customName2))); + ɵɵelementProperty( + 0, 'names', ɵɵbind(ɵɵpureFunction2(1, e0_ff, ctx.customName, ctx.customName2))); } }, 1, 4, directives); @@ -279,37 +279,38 @@ describe('array literals', () => { function Template(rf: RenderFlags, c: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'my-comp'); + ɵɵelementStart(0, 'my-comp'); f3Comp = getDirectiveOnNode(0); - ΔelementEnd(); - ΔelementStart(1, 'my-comp'); + ɵɵelementEnd(); + ɵɵelementStart(1, 'my-comp'); f4Comp = getDirectiveOnNode(1); - ΔelementEnd(); - ΔelementStart(2, 'my-comp'); + ɵɵelementEnd(); + ɵɵelementStart(2, 'my-comp'); f5Comp = getDirectiveOnNode(2); - ΔelementEnd(); - ΔelementStart(3, 'my-comp'); + ɵɵelementEnd(); + ɵɵelementStart(3, 'my-comp'); f6Comp = getDirectiveOnNode(3); - ΔelementEnd(); - ΔelementStart(4, 'my-comp'); + ɵɵelementEnd(); + ɵɵelementStart(4, 'my-comp'); f7Comp = getDirectiveOnNode(4); - ΔelementEnd(); - ΔelementStart(5, 'my-comp'); + ɵɵelementEnd(); + ɵɵelementStart(5, 'my-comp'); f8Comp = getDirectiveOnNode(5); - ΔelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'names', Δbind(ΔpureFunction3(6, e0_ff, c[5], c[6], c[7]))); - ΔelementProperty(1, 'names', Δbind(ΔpureFunction4(10, e2_ff, c[4], c[5], c[6], c[7]))); - ΔelementProperty( - 2, 'names', Δbind(ΔpureFunction5(15, e4_ff, c[3], c[4], c[5], c[6], c[7]))); - ΔelementProperty( - 3, 'names', Δbind(ΔpureFunction6(21, e6_ff, c[2], c[3], c[4], c[5], c[6], c[7]))); - ΔelementProperty( - 4, 'names', Δbind(ΔpureFunction7(28, e8_ff, c[1], c[2], c[3], c[4], c[5], c[6], c[7]))); - ΔelementProperty( + ɵɵelementProperty(0, 'names', ɵɵbind(ɵɵpureFunction3(6, e0_ff, c[5], c[6], c[7]))); + ɵɵelementProperty(1, 'names', ɵɵbind(ɵɵpureFunction4(10, e2_ff, c[4], c[5], c[6], c[7]))); + ɵɵelementProperty( + 2, 'names', ɵɵbind(ɵɵpureFunction5(15, e4_ff, c[3], c[4], c[5], c[6], c[7]))); + ɵɵelementProperty( + 3, 'names', ɵɵbind(ɵɵpureFunction6(21, e6_ff, c[2], c[3], c[4], c[5], c[6], c[7]))); + ɵɵelementProperty( + 4, 'names', + ɵɵbind(ɵɵpureFunction7(28, e8_ff, c[1], c[2], c[3], c[4], c[5], c[6], c[7]))); + ɵɵelementProperty( 5, 'names', - Δbind(ΔpureFunction8(36, e10_ff, c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]))); + ɵɵbind(ɵɵpureFunction8(36, e10_ff, c[0], c[1], c[2], c[3], c[4], c[5], c[6], c[7]))); } } @@ -352,12 +353,12 @@ describe('array literals', () => { */ function Template(rf: RenderFlags, c: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'my-comp'); + ɵɵelement(0, 'my-comp'); } if (rf & RenderFlags.Update) { - ΔelementProperty( - 0, 'names', Δbind(ΔpureFunctionV(3, e0_ff, [ - c[0], c[1], c[2], c[3], ΔpureFunction1(1, e0_ff_1, c[4]), c[5], c[6], c[7], c[8] + ɵɵelementProperty( + 0, 'names', ɵɵbind(ɵɵpureFunctionV(3, e0_ff, [ + c[0], c[1], c[2], c[3], ɵɵpureFunction1(1, e0_ff_1, c[4]), c[5], c[6], c[7], c[8] ]))); } } @@ -386,7 +387,7 @@ describe('object literals', () => { // TODO(issue/24571): remove '!'. config !: {[key: string]: any}; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ObjectComp, selectors: [['object-comp']], factory: function ObjectComp_Factory() { return objectComp = new ObjectComp(); }, @@ -405,10 +406,10 @@ describe('object literals', () => { /** */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'object-comp'); + ɵɵelement(0, 'object-comp'); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'config', Δbind(ΔpureFunction1(1, e0_ff, ctx.name))); + ɵɵelementProperty(0, 'config', ɵɵbind(ɵɵpureFunction1(1, e0_ff, ctx.name))); } }, 1, 3, defs); @@ -442,14 +443,14 @@ describe('object literals', () => { */ const App = createComponent('app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'object-comp'); + ɵɵelement(0, 'object-comp'); } if (rf & RenderFlags.Update) { - ΔelementProperty( + ɵɵelementProperty( 0, 'config', - Δbind(ΔpureFunction2( + ɵɵbind(ɵɵpureFunction2( 5, e0_ff, ctx.name, - ΔpureFunction1(3, e0_ff_1, ΔpureFunction1(1, e0_ff_2, ctx.duration))))); + ɵɵpureFunction1(3, e0_ff_1, ɵɵpureFunction1(1, e0_ff_2, ctx.duration))))); } }, 1, 8, defs); @@ -511,27 +512,27 @@ describe('object literals', () => { */ function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { for (let i = 0; i < 2; i++) { - let rf1 = ΔembeddedViewStart(0, 1, 4); + let rf1 = ɵɵembeddedViewStart(0, 1, 4); if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'object-comp'); + ɵɵelementStart(0, 'object-comp'); objectComps.push(getDirectiveOnNode(0)); - ΔelementEnd(); + ɵɵelementEnd(); } if (rf1 & RenderFlags.Update) { - ΔelementProperty( - 0, 'config', - Δbind(ΔpureFunction2(1, e0_ff, ctx.configs[i].opacity, ctx.configs[i].duration))); + ɵɵelementProperty( + 0, 'config', ɵɵbind(ɵɵpureFunction2( + 1, e0_ff, ctx.configs[i].opacity, ctx.configs[i].duration))); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } diff --git a/packages/core/test/render3/query_spec.ts b/packages/core/test/render3/query_spec.ts index 033fc2ea72..7d730c8e3a 100644 --- a/packages/core/test/render3/query_spec.ts +++ b/packages/core/test/render3/query_spec.ts @@ -10,13 +10,13 @@ import {NgForOfContext} from '@angular/common'; import {ElementRef, QueryList, TemplateRef, ViewContainerRef} from '@angular/core'; import {EventEmitter} from '../..'; -import {AttributeMarker, detectChanges, ΔProvidersFeature, ΔdefineComponent, ΔdefineDirective} from '../../src/render3/index'; -import {Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, ΔdirectiveInject, Δelement, ΔelementContainerEnd, ΔelementContainerStart, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δload, Δreference, Δtemplate, Δtext} from '../../src/render3/instructions/all'; +import {AttributeMarker, detectChanges, ɵɵProvidersFeature, ɵɵdefineComponent, ɵɵdefineDirective} from '../../src/render3/index'; +import {ɵɵbind, ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵdirectiveInject, ɵɵelement, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementProperty, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵload, ɵɵreference, ɵɵtemplate, ɵɵtext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; -import {query, ΔcontentQuery, ΔloadContentQuery, ΔloadViewQuery, ΔqueryRefresh, ΔviewQuery} from '../../src/render3/query'; +import {query, ɵɵcontentQuery, ɵɵloadContentQuery, ɵɵloadViewQuery, ɵɵqueryRefresh, ɵɵviewQuery} from '../../src/render3/query'; import {getLView} from '../../src/render3/state'; import {getNativeByIndex} from '../../src/render3/util/view_utils'; -import {ΔtemplateRefExtractor} from '../../src/render3/view_engine_compatibility_prebound'; +import {ɵɵtemplateRefExtractor} from '../../src/render3/view_engine_compatibility_prebound'; import {NgForOf, NgIf, NgTemplateOutlet} from './common_with_def'; import {ComponentFixture, TemplateFixture, createComponent, createDirective, getDirectiveOnNode, renderComponent} from './render_util'; @@ -70,9 +70,9 @@ describe('query', () => { * } */ if (rf & RenderFlags.Create) { - ΔelementStart(0, 'child'); - { Δelement(1, 'child'); } - ΔelementEnd(); + ɵɵelementStart(0, 'child'); + { ɵɵelement(1, 'child'); } + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { child1 = getDirectiveOnNode(0); @@ -82,14 +82,14 @@ describe('query', () => { 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(Child, false, null); - ΔviewQuery(Child, true, null); + ɵɵviewQuery(Child, false, null); + ɵɵviewQuery(Child, true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query0 = tmp as QueryList); - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query1 = tmp as QueryList); } }); @@ -115,18 +115,18 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', '']); + ɵɵelement(0, 'div', ['child', '']); elToQuery = getNativeByIndex(0, getLView()); } }, 1, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(Child, false, ElementRef); + ɵɵviewQuery(Child, false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -152,19 +152,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', ['child', '', 'otherChild', '']); + ɵɵelementStart(0, 'div', ['child', '', 'otherChild', '']); { otherChildInstance = getDirectiveOnNode(0, 1); } - ΔelementEnd(); + ɵɵelementEnd(); } }, 1, 0, [Child, OtherChild], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(Child, false, OtherChild); + ɵɵviewQuery(Child, false, OtherChild); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -188,17 +188,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', '']); + ɵɵelement(0, 'div', ['child', '']); } }, 1, 0, [Child, OtherChild], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(Child, false, OtherChild); + ɵɵviewQuery(Child, false, OtherChild); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -219,13 +219,13 @@ describe('query', () => { class MyDirective { constructor(public service: Service) {} - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: MyDirective, selectors: [['', 'myDir', '']], factory: function MyDirective_Factory() { - return directive = new MyDirective(ΔdirectiveInject(Service)); + return directive = new MyDirective(ɵɵdirectiveInject(Service)); }, - features: [ΔProvidersFeature([Service, {provide: Alias, useExisting: Service}])], + features: [ɵɵProvidersFeature([Service, {provide: Alias, useExisting: Service}])], }); } @@ -247,7 +247,7 @@ describe('query', () => { service?: Service; alias?: Alias; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: App, selectors: [['app']], consts: 1, @@ -255,21 +255,22 @@ describe('query', () => { factory: function App_Factory() { return new App(); }, template: function App_Template(rf: RenderFlags, ctx: App) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['myDir']); + ɵɵelement(0, 'div', ['myDir']); } }, viewQuery: function(rf: RenderFlags, ctx: App) { if (rf & RenderFlags.Create) { - ΔviewQuery(MyDirective, false, null); - ΔviewQuery(Service, false, null); - ΔviewQuery(Alias, false, null); + ɵɵviewQuery(MyDirective, false, null); + ɵɵviewQuery(Service, false, null); + ɵɵviewQuery(Alias, false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.directive = tmp.first); - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.service = tmp.first); - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.alias = tmp.first); + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && + (ctx.service = tmp.first); + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.alias = tmp.first); } }, directives: [MyDirective] @@ -293,7 +294,7 @@ describe('query', () => { class App { service?: Service; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: App, selectors: [['app']], consts: 1, @@ -301,16 +302,17 @@ describe('query', () => { factory: function App_Factory() { return new App(); }, template: function App_Template(rf: RenderFlags, ctx: App) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['myDir']); + ɵɵelement(0, 'div', ['myDir']); } }, viewQuery: function(rf: RenderFlags, ctx: App) { let tmp: any; if (rf & RenderFlags.Create) { - ΔviewQuery(MyDirective, false, Alias); + ɵɵviewQuery(MyDirective, false, Alias); } if (rf & RenderFlags.Update) { - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && (ctx.service = tmp.first); + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && + (ctx.service = tmp.first); } }, directives: [MyDirective] @@ -339,19 +341,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); elToQuery = getNativeByIndex(0, getLView()); - Δelement(2, 'div'); + ɵɵelement(2, 'div'); } }, 3, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, null); + ɵɵviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -377,22 +379,22 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '', 'bar', '']); + ɵɵelement(0, 'div', null, ['foo', '', 'bar', '']); elToQuery = getNativeByIndex(0, getLView()); - Δelement(3, 'div'); + ɵɵelement(3, 'div'); } }, 4, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, null); - ΔviewQuery(['bar'], false, null); + ɵɵviewQuery(['foo'], false, null); + ɵɵviewQuery(['bar'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.fooQuery = tmp as QueryList); - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.barQuery = tmp as QueryList); } }); @@ -424,21 +426,21 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); el1ToQuery = getNativeByIndex(0, getLView()); - Δelement(2, 'div'); - Δelement(3, 'div', null, ['bar', '']); + ɵɵelement(2, 'div'); + ɵɵelement(3, 'div', null, ['bar', '']); el2ToQuery = getNativeByIndex(3, getLView()); } }, 5, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo', 'bar'], false, null); + ɵɵviewQuery(['foo', 'bar'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -464,19 +466,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); elToQuery = getNativeByIndex(0, getLView()); - Δelement(2, 'div'); + ɵɵelement(2, 'div'); } }, 3, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, null); + ɵɵviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -501,19 +503,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementContainerStart(0, null, ['foo', '']); + ɵɵelementContainerStart(0, null, ['foo', '']); elToQuery = getNativeByIndex(0, getLView()); - ΔelementContainerEnd(); + ɵɵelementContainerEnd(); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, ElementRef); + ɵɵviewQuery(['foo'], false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -537,19 +539,19 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementContainerStart(0, null, ['foo', '']); + ɵɵelementContainerStart(0, null, ['foo', '']); elToQuery = getNativeByIndex(0, getLView()); - ΔelementContainerEnd(); + ɵɵelementContainerEnd(); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -599,25 +601,25 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementContainerStart(0); + ɵɵelementContainerStart(0); { - Δelement(1, 'div', null, ['foo', '']); + ɵɵelement(1, 'div', null, ['foo', '']); elToQuery = getNativeByIndex(3, getLView()); } - ΔelementContainerEnd(); + ɵɵelementContainerEnd(); } }, 3, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, ElementRef); - ΔviewQuery(['foo'], false, ElementRef); + ɵɵviewQuery(['foo'], true, ElementRef); + ɵɵviewQuery(['foo'], false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.deep = tmp as QueryList); - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.shallow = tmp as QueryList); } }); @@ -640,17 +642,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, ViewContainerRef); + ɵɵviewQuery(['foo'], false, ViewContainerRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -672,17 +674,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); + ɵɵtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, ViewContainerRef); + ɵɵviewQuery(['foo'], false, ViewContainerRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -705,18 +707,18 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); + ɵɵtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, ElementRef); + ɵɵviewQuery(['foo'], false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -740,17 +742,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); + ɵɵtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, null); + ɵɵviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -773,17 +775,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); + ɵɵtemplate(0, null, 0, 0, 'ng-template', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, TemplateRef); + ɵɵviewQuery(['foo'], false, TemplateRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -808,7 +810,7 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'child', null, ['foo', '']); + ɵɵelement(0, 'child', null, ['foo', '']); } if (rf & RenderFlags.Update) { childInstance = getDirectiveOnNode(0); @@ -817,11 +819,11 @@ describe('query', () => { 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -836,7 +838,7 @@ describe('query', () => { let childInstance: Child; class Child { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Child, selectors: [['child']], factory: () => childInstance = new Child(), @@ -857,17 +859,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'child', null, ['foo', 'child']); + ɵɵelement(0, 'child', null, ['foo', 'child']); } }, 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -893,7 +895,7 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', ''], ['foo', 'child']); + ɵɵelement(0, 'div', ['child', ''], ['foo', 'child']); } if (rf & RenderFlags.Update) { childInstance = getDirectiveOnNode(0); @@ -902,11 +904,11 @@ describe('query', () => { 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -932,7 +934,7 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement( + ɵɵelement( 0, 'div', ['child1', '', 'child2', ''], ['foo', 'child1', 'bar', 'child2']); } if (rf & RenderFlags.Update) { @@ -943,11 +945,11 @@ describe('query', () => { 3, 0, [Child1, Child2], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo', 'bar'], true, null); + ɵɵviewQuery(['foo', 'bar'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -974,7 +976,7 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', ''], ['foo', 'child', 'bar', 'child']); + ɵɵelement(0, 'div', ['child', ''], ['foo', 'child', 'bar', 'child']); } if (rf & RenderFlags.Update) { childInstance = getDirectiveOnNode(0); @@ -983,14 +985,14 @@ describe('query', () => { 3, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); - ΔviewQuery(['bar'], true, null); + ɵɵviewQuery(['foo'], true, null); + ɵɵviewQuery(['bar'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.fooQuery = tmp as QueryList); - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.barQuery = tmp as QueryList); } }); @@ -1020,18 +1022,18 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', ''], ['foo', 'child']); + ɵɵelement(0, 'div', ['child', ''], ['foo', 'child']); div = getNativeByIndex(0, getLView()); } }, 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, ElementRef); + ɵɵviewQuery(['foo'], false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1056,7 +1058,7 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', ''], ['foo', '', 'bar', 'child']); + ɵɵelement(0, 'div', ['child', ''], ['foo', '', 'bar', 'child']); div = getNativeByIndex(0, getLView()); } if (rf & RenderFlags.Update) { @@ -1066,11 +1068,11 @@ describe('query', () => { 3, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo', 'bar'], false, null); + ɵɵviewQuery(['foo', 'bar'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1095,17 +1097,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['foo', '']); + ɵɵelement(0, 'div', ['foo', '']); } }, 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, Child); + ɵɵviewQuery(['foo'], false, Child); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1129,17 +1131,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', '']); + ɵɵelement(0, 'div', ['child', '']); } }, 1, 0, [Child, OtherChild], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(Child, false, OtherChild); + ɵɵviewQuery(Child, false, OtherChild); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1163,17 +1165,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', '']); + ɵɵelement(0, 'div', ['child', '']); } }, 1, 0, [Child, OtherChild], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(OtherChild, false, Child); + ɵɵviewQuery(OtherChild, false, Child); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1194,17 +1196,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div'); + ɵɵelement(0, 'div'); } }, 1, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(TemplateRef as any, false, ElementRef); + ɵɵviewQuery(TemplateRef as any, false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1227,17 +1229,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', ''], ['foo', '']); + ɵɵelement(0, 'div', ['child', ''], ['foo', '']); } }, 2, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, Child); + ɵɵviewQuery(['foo'], false, Child); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1261,17 +1263,17 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['child', '']); + ɵɵelement(0, 'div', ['child', '']); } }, 1, 0, [Child], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(TemplateRef as any, false, null); + ɵɵviewQuery(TemplateRef as any, false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1284,9 +1286,9 @@ describe('query', () => { it('should query templates if the type is TemplateRef (and respect "read" option)', () => { function Cmpt_Template_1(rf: RenderFlags, ctx1: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - Δtext(1, 'Test'); - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + ɵɵtext(1, 'Test'); + ɵɵelementEnd(); } } /** @@ -1302,28 +1304,28 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, Cmpt_Template_1, 2, 0, 'ng-template', null, ['foo', ''], - ΔtemplateRefExtractor); - Δtemplate( + ɵɵtemplateRefExtractor); + ɵɵtemplate( 2, Cmpt_Template_1, 2, 0, 'ng-template', null, ['bar', ''], - ΔtemplateRefExtractor); - Δtemplate( + ɵɵtemplateRefExtractor); + ɵɵtemplate( 4, Cmpt_Template_1, 2, 0, 'ng-template', null, ['baz', ''], - ΔtemplateRefExtractor); + ɵɵtemplateRefExtractor); } }, 6, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(TemplateRef as any, false, null); - ΔviewQuery(TemplateRef as any, false, ElementRef); + ɵɵviewQuery(TemplateRef as any, false, null); + ɵɵviewQuery(TemplateRef as any, false, ElementRef); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.tmplQuery = tmp as QueryList); - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.elemQuery = tmp as QueryList); } }); @@ -1351,12 +1353,12 @@ describe('query', () => { let directiveInstances: ViewContainerManipulatorDirective[] = []; class ViewContainerManipulatorDirective { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: ViewContainerManipulatorDirective, selectors: [['', 'vc', '']], factory: () => { const directiveInstance = - new ViewContainerManipulatorDirective(ΔdirectiveInject(ViewContainerRef as any)); + new ViewContainerManipulatorDirective(ɵɵdirectiveInject(ViewContainerRef as any)); directiveInstances.push(directiveInstance); return directiveInstance; } @@ -1377,7 +1379,7 @@ describe('query', () => { function Cmpt_Template_1(rf: RenderFlags, ctx1: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); } } @@ -1393,21 +1395,21 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, Cmpt_Template_1, 2, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'ngIf', Δbind(ctx.value)); + ɵɵelementProperty(0, 'ngIf', ɵɵbind(ctx.value)); } }, 2, 1, [NgIf], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1429,10 +1431,10 @@ describe('query', () => { function Cmpt_Template_1(rf1: RenderFlags, row: NgForOfContext) { if (rf1 & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); } if (rf1 & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind(row.$implicit)); + ɵɵelementProperty(0, 'id', ɵɵbind(row.$implicit)); } } @@ -1448,7 +1450,7 @@ describe('query', () => { // TODO(issue/24571): remove '!'. value !: string[]; query: any; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Cmpt, factory: () => new Cmpt(), selectors: [['my-app']], @@ -1456,19 +1458,19 @@ describe('query', () => { vars: 1, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, Cmpt_Template_1, 2, 1, 'ng-template', ['ngForOf', '']); + ɵɵtemplate(0, Cmpt_Template_1, 2, 1, 'ng-template', ['ngForOf', '']); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'ngForOf', Δbind(ctx.value)); + ɵɵelementProperty(0, 'ngForOf', ɵɵbind(ctx.value)); } }, viewQuery: function(rf: RenderFlags, ctx: Cmpt) { let tmp: any; if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }, @@ -1502,19 +1504,19 @@ describe('query', () => { function Cmpt_Template_1(rf: RenderFlags, ctx: {idx: number}) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind('foo1_' + ctx.idx)); + ɵɵelementProperty(0, 'id', ɵɵbind('foo1_' + ctx.idx)); } } function Cmpt_Template_5(rf: RenderFlags, ctx: {idx: number}) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind('foo2_' + ctx.idx)); + ɵɵelementProperty(0, 'id', ɵɵbind('foo2_' + ctx.idx)); } } @@ -1535,30 +1537,30 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, Cmpt_Template_1, 2, 1, 'ng-template', null, ['tpl1', ''], - ΔtemplateRefExtractor); - Δelement(2, 'div', ['id', 'middle'], ['foo', '']); - Δtemplate( + ɵɵtemplateRefExtractor); + ɵɵelement(2, 'div', ['id', 'middle'], ['foo', '']); + ɵɵtemplate( 4, Cmpt_Template_5, 2, 1, 'ng-template', null, ['tpl2', ''], - ΔtemplateRefExtractor); - Δtemplate(6, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); + ɵɵtemplateRefExtractor); + ɵɵtemplate(6, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); } if (rf & RenderFlags.Update) { - tpl1 = Δreference(1); - tpl2 = Δreference(5); + tpl1 = ɵɵreference(1); + tpl2 = ɵɵreference(5); } }, 8, 0, [ViewContainerManipulatorDirective], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1611,10 +1613,10 @@ describe('query', () => { function Cmpt_Template_1(rf: RenderFlags, ctx: {idx: number, container_idx: number}) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'id', Δbind('foo_' + ctx.container_idx + '_' + ctx.idx)); + ɵɵelementProperty(0, 'id', ɵɵbind('foo_' + ctx.container_idx + '_' + ctx.idx)); } } @@ -1628,7 +1630,7 @@ describe('query', () => { */ class Cmpt { query: any; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Cmpt, factory: () => new Cmpt(), selectors: [['my-app']], @@ -1637,25 +1639,25 @@ describe('query', () => { template: function(rf: RenderFlags, ctx: any) { let tmp: any; if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, Cmpt_Template_1, 2, 1, 'ng-template', [], ['tpl', ''], - ΔtemplateRefExtractor); - Δtemplate(2, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); - Δtemplate(3, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); + ɵɵtemplateRefExtractor); + ɵɵtemplate(2, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); + ɵɵtemplate(3, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'vc']); } if (rf & RenderFlags.Update) { - tpl = Δreference(1); + tpl = ɵɵreference(1); } }, viewQuery: (rf: RenderFlags, cmpt: Cmpt) => { let tmp: any; if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (cmpt.query = tmp as QueryList); } }, @@ -1691,14 +1693,14 @@ describe('query', () => { function MyApp_Template_1(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'span', ['id', 'from_tpl'], ['foo', '']); + ɵɵelement(0, 'span', ['id', 'from_tpl'], ['foo', '']); } } class MyApp { show = false; query: any; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: MyApp, factory: () => new MyApp(), selectors: [['my-app']], @@ -1710,25 +1712,25 @@ describe('query', () => { */ template: (rf: RenderFlags, myApp: MyApp) => { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, MyApp_Template_1, 2, 0, 'ng-template', undefined, ['tpl', ''], - ΔtemplateRefExtractor); - Δtemplate( + ɵɵtemplateRefExtractor); + ɵɵtemplate( 2, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'ngTemplateOutlet']); } if (rf & RenderFlags.Update) { - const tplRef = Δreference(1); - ΔelementProperty(2, 'ngTemplateOutlet', Δbind(myApp.show ? tplRef : null)); + const tplRef = ɵɵreference(1); + ɵɵelementProperty(2, 'ngTemplateOutlet', ɵɵbind(myApp.show ? tplRef : null)); } }, directives: () => [NgTemplateOutlet], viewQuery: (rf: RenderFlags, myApp: MyApp) => { let tmp: any; if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (myApp.query = tmp as QueryList); } } @@ -1768,33 +1770,33 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.exp) { - let rf1 = ΔembeddedViewStart(1, 2, 0); + let rf1 = ɵɵembeddedViewStart(1, 2, 0); { if (rf1 & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); firstEl = getNativeByIndex(0, getLView()); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, 1, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1830,37 +1832,37 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'span', null, ['foo', '']); + ɵɵelement(0, 'span', null, ['foo', '']); firstEl = getNativeByIndex(0, getLView()); - Δcontainer(2); - Δelement(3, 'span', null, ['foo', '']); + ɵɵcontainer(2); + ɵɵelement(3, 'span', null, ['foo', '']); lastEl = getNativeByIndex(3, getLView()); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(2); + ɵɵcontainerRefreshStart(2); { if (ctx.exp) { - let rf1 = ΔembeddedViewStart(1, 2, 0); + let rf1 = ɵɵembeddedViewStart(1, 2, 0); { if (rf1 & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); viewEl = getNativeByIndex(0, getLView()); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, 5, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1901,43 +1903,43 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.exp1) { - let rf0 = ΔembeddedViewStart(0, 2, 0); + let rf0 = ɵɵembeddedViewStart(0, 2, 0); { if (rf0 & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); firstEl = getNativeByIndex(0, getLView()); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } if (ctx.exp2) { - let rf1 = ΔembeddedViewStart(1, 2, 0); + let rf1 = ɵɵembeddedViewStart(1, 2, 0); { if (rf1 & RenderFlags.Create) { - Δelement(0, 'span', null, ['foo', '']); + ɵɵelement(0, 'span', null, ['foo', '']); lastEl = getNativeByIndex(0, getLView()); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, 1, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -1975,50 +1977,50 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.exp1) { - let rf0 = ΔembeddedViewStart(0, 3, 0); + let rf0 = ɵɵembeddedViewStart(0, 3, 0); { if (rf0 & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); firstEl = getNativeByIndex(0, getLView()); - Δcontainer(2); + ɵɵcontainer(2); } if (rf0 & RenderFlags.Update) { - ΔcontainerRefreshStart(2); + ɵɵcontainerRefreshStart(2); { if (ctx.exp2) { - let rf2 = ΔembeddedViewStart(0, 2, 0); + let rf2 = ɵɵembeddedViewStart(0, 2, 0); { if (rf2) { - Δelement(0, 'span', null, ['foo', '']); + ɵɵelement(0, 'span', null, ['foo', '']); lastEl = getNativeByIndex(0, getLView()); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, 1, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -2060,38 +2062,38 @@ describe('query', () => { 'cmpt', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); - Δelement(1, 'span', null, ['foo', '']); + ɵɵcontainer(0); + ɵɵelement(1, 'span', null, ['foo', '']); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (ctx.exp) { - let rf0 = ΔembeddedViewStart(0, 4, 0); + let rf0 = ɵɵembeddedViewStart(0, 4, 0); { if (rf0 & RenderFlags.Create) { - ΔelementStart(0, 'div', null, ['foo', '']); - { Δelement(2, 'div', null, ['foo', '']); } - ΔelementEnd(); + ɵɵelementStart(0, 'div', null, ['foo', '']); + { ɵɵelement(2, 'div', null, ['foo', '']); } + ɵɵelementEnd(); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, 3, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); - ΔviewQuery(['foo'], false, null); + ɵɵviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.deep = tmp as QueryList); - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.shallow = tmp as QueryList); } }); @@ -2130,37 +2132,37 @@ describe('query', () => { 'some-component-with-query', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); } }, 2, 0, [], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], false, null); + ɵɵviewQuery(['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = queryInstance = tmp as QueryList); } }); - function createTemplate() { Δcontainer(0); } + function createTemplate() { ɵɵcontainer(0); } function updateTemplate() { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { if (condition) { - let rf1 = ΔembeddedViewStart(1, 1, 0); + let rf1 = ɵɵembeddedViewStart(1, 1, 0); { if (rf1 & RenderFlags.Create) { - Δelement(0, 'some-component-with-query'); + ɵɵelement(0, 'some-component-with-query'); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } /** @@ -2187,18 +2189,18 @@ describe('query', () => { this.vcr.createEmbeddedView(this.temp); } - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: SomeDir, selectors: [['', 'someDir', '']], factory: () => new SomeDir( - ΔdirectiveInject(ViewContainerRef as any), ΔdirectiveInject(TemplateRef as any)) + ɵɵdirectiveInject(ViewContainerRef as any), ɵɵdirectiveInject(TemplateRef as any)) }); } function AppComponent_Template_1(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div'); + ɵɵelement(0, 'div'); } } @@ -2210,19 +2212,19 @@ describe('query', () => { 'app', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, AppComponent_Template_1, 1, 0, 'div', [AttributeMarker.Template, 'someDir']); - Δelement(1, 'div', null, ['foo', '']); + ɵɵelement(1, 'div', null, ['foo', '']); } }, 3, 0, [SomeDir], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }); @@ -2252,17 +2254,17 @@ describe('query', () => { this.contentCheckedQuerySnapshot = this.foos ? this.foos.length : 0; } - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: WithContentDirective, selectors: [['', 'with-content', '']], factory: () => withContentInstance = new WithContentDirective(), contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { if (rf & RenderFlags.Create) { - ΔcontentQuery(dirIndex, ['foo'], true, null); + ɵɵcontentQuery(dirIndex, ['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.foos = tmp); + ɵɵqueryRefresh(tmp = ɵɵloadContentQuery()) && (ctx.foos = tmp); } } }); @@ -2272,7 +2274,7 @@ describe('query', () => { // @ContentChildren('foo', {descendants: false}) foos !: QueryList; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ShallowComp, selectors: [['shallow-comp']], factory: () => shallowCompInstance = new ShallowComp(), @@ -2281,11 +2283,11 @@ describe('query', () => { vars: 0, contentQueries: (rf: RenderFlags, ctx: any, dirIndex: number) => { if (rf & RenderFlags.Create) { - ΔcontentQuery(dirIndex, ['foo'], false, null); + ɵɵcontentQuery(dirIndex, ['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.foos = tmp); + ɵɵqueryRefresh(tmp = ɵɵloadContentQuery()) && (ctx.foos = tmp); } } }); @@ -2299,9 +2301,9 @@ describe('query', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); - { Δelement(1, 'span', null, ['foo', '']); } - ΔelementEnd(); + ɵɵelementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); + { ɵɵelement(1, 'span', null, ['foo', '']); } + ɵɵelementEnd(); } }, 3, 0, [WithContentDirective]); @@ -2330,23 +2332,23 @@ describe('query', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δcontainer(0); + ɵɵcontainer(0); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(0); + ɵɵcontainerRefreshStart(0); { for (let i = 0; i < 3; i++) { - let rf = ΔembeddedViewStart(1, 3, 0); + let rf = ɵɵembeddedViewStart(1, 3, 0); if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); - { Δelement(1, 'span', null, ['foo', '']); } - ΔelementEnd(); + ɵɵelementStart(0, 'div', [AttributeMarker.Bindings, 'with-content']); + { ɵɵelement(1, 'span', null, ['foo', '']); } + ɵɵelementEnd(); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, 1, 0, [WithContentDirective]); @@ -2372,7 +2374,7 @@ describe('query', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['with-content', ''], ['foo', '']); + ɵɵelement(0, 'div', ['with-content', ''], ['foo', '']); } }, 2, 0, [WithContentDirective]); @@ -2384,7 +2386,7 @@ describe('query', () => { it('should match shallow content queries in views inserted / removed by ngIf', () => { function IfTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div', null, ['foo', '']); + ɵɵelement(0, 'div', null, ['foo', '']); } } @@ -2395,12 +2397,12 @@ describe('query', () => { */ const AppComponent = createComponent('app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'shallow-comp'); - { Δtemplate(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Template, 'ngIf', '']); } - ΔelementEnd(); + ɵɵelementStart(0, 'shallow-comp'); + { ɵɵtemplate(1, IfTemplate, 2, 0, 'div', [AttributeMarker.Template, 'ngIf', '']); } + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(1, 'ngIf', Δbind(ctx.showing)); + ɵɵelementProperty(1, 'ngIf', ɵɵbind(ctx.showing)); } }, 2, 1, [ShallowComp, NgIf]); @@ -2433,20 +2435,20 @@ describe('query', () => { 'app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', ['with-content', '']); - { Δelement(1, 'div', null, ['foo', '']); } - ΔelementEnd(); - Δelement(3, 'div', ['id', 'after'], ['bar', '']); + ɵɵelementStart(0, 'div', ['with-content', '']); + { ɵɵelement(1, 'div', null, ['foo', '']); } + ɵɵelementEnd(); + ɵɵelement(3, 'div', ['id', 'after'], ['bar', '']); } }, 5, 0, [WithContentDirective], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo', 'bar'], true, null); + ɵɵviewQuery(['foo', 'bar'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.foos = tmp as QueryList); } }); @@ -2474,20 +2476,20 @@ describe('query', () => { 'app-component', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', ['with-content', '']); - { Δelement(1, 'div', ['id', 'yes'], ['foo', '']); } - ΔelementEnd(); - Δelement(3, 'div', null, ['foo', '']); + ɵɵelementStart(0, 'div', ['with-content', '']); + { ɵɵelement(1, 'div', ['id', 'yes'], ['foo', '']); } + ɵɵelementEnd(); + ɵɵelement(3, 'div', null, ['foo', '']); } }, 5, 0, [WithContentDirective], [], function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['bar'], true, null); + ɵɵviewQuery(['bar'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.bars = tmp as QueryList); } }); @@ -2500,7 +2502,7 @@ describe('query', () => { it('should report results to appropriate queries where deep content queries are nested', () => { class QueryDirective { fooBars: any; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: QueryDirective, selectors: [['', 'query', '']], exportAs: ['query'], @@ -2509,11 +2511,11 @@ describe('query', () => { // @ContentChildren('foo, bar, baz', {descendants: true}) // fooBars: QueryList; if (rf & RenderFlags.Create) { - ΔcontentQuery(dirIndex, ['foo', 'bar', 'baz'], true, null); + ɵɵcontentQuery(dirIndex, ['foo', 'bar', 'baz'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.fooBars = tmp); + ɵɵqueryRefresh(tmp = ɵɵloadContentQuery()) && (ctx.fooBars = tmp); } } }); @@ -2535,19 +2537,19 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', [AttributeMarker.Bindings, 'query'], ['out', 'query']); + ɵɵelementStart(0, 'div', [AttributeMarker.Bindings, 'query'], ['out', 'query']); { - Δelement(2, 'span', ['id', 'foo'], ['foo', '']); - ΔelementStart(4, 'div', [AttributeMarker.Bindings, 'query'], ['in', 'query']); - { Δelement(6, 'span', ['id', 'bar'], ['bar', '']); } - ΔelementEnd(); - Δelement(8, 'span', ['id', 'baz'], ['baz', '']); + ɵɵelement(2, 'span', ['id', 'foo'], ['foo', '']); + ɵɵelementStart(4, 'div', [AttributeMarker.Bindings, 'query'], ['in', 'query']); + { ɵɵelement(6, 'span', ['id', 'bar'], ['bar', '']); } + ɵɵelementEnd(); + ɵɵelement(8, 'span', ['id', 'baz'], ['baz', '']); } - ΔelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - outInstance = Δload(1); - inInstance = Δload(5); + outInstance = ɵɵload(1); + inInstance = ɵɵload(5); } }, 10, 0, [QueryDirective]); @@ -2564,7 +2566,7 @@ describe('query', () => { class QueryDirective { fooBars: any; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: QueryDirective, selectors: [['', 'query', '']], exportAs: ['query'], @@ -2573,11 +2575,11 @@ describe('query', () => { // @ContentChildren('foo', {descendants: true}) // fooBars: QueryList; if (rf & RenderFlags.Create) { - ΔcontentQuery(dirIndex, ['foo'], false, null); + ɵɵcontentQuery(dirIndex, ['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.fooBars = tmp); + ɵɵqueryRefresh(tmp = ɵɵloadContentQuery()) && (ctx.fooBars = tmp); } } }); @@ -2594,17 +2596,17 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', ['query', ''], ['out', 'query']); + ɵɵelementStart(0, 'div', ['query', ''], ['out', 'query']); { - ΔelementStart(2, 'div', ['query', ''], ['in', 'query', 'foo', '']); - { Δelement(5, 'span', ['id', 'bar'], ['foo', '']); } - ΔelementEnd(); + ɵɵelementStart(2, 'div', ['query', ''], ['in', 'query', 'foo', '']); + { ɵɵelement(5, 'span', ['id', 'bar'], ['foo', '']); } + ɵɵelementEnd(); } - ΔelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - outInstance = Δload(1); - inInstance = Δload(3); + outInstance = ɵɵload(1); + inInstance = ɵɵload(3); } }, 7, 0, [QueryDirective]); @@ -2620,7 +2622,7 @@ describe('query', () => { class QueryDirective { fooBars: any; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: QueryDirective, selectors: [['', 'query', '']], exportAs: ['query'], @@ -2629,11 +2631,11 @@ describe('query', () => { // @ContentChildren('foo', {descendants: true}) // fooBars: QueryList; if (rf & RenderFlags.Create) { - ΔcontentQuery(dirIndex, ['foo'], false, null); + ɵɵcontentQuery(dirIndex, ['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.fooBars = tmp); + ɵɵqueryRefresh(tmp = ɵɵloadContentQuery()) && (ctx.fooBars = tmp); } } }); @@ -2650,17 +2652,17 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', ['query', ''], ['out', 'query']); + ɵɵelementStart(0, 'div', ['query', ''], ['out', 'query']); { - ΔelementStart(2, 'div', ['query', ''], ['in', 'query', 'foo', '']); - { Δelement(5, 'span', ['id', 'bar'], ['foo', '']); } - ΔelementEnd(); + ɵɵelementStart(2, 'div', ['query', ''], ['in', 'query', 'foo', '']); + { ɵɵelement(5, 'span', ['id', 'bar'], ['foo', '']); } + ɵɵelementEnd(); } - ΔelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - outInstance = Δload(1); - inInstance = Δload(3); + outInstance = ɵɵload(1); + inInstance = ɵɵload(3); } }, 7, 0, [QueryDirective]); @@ -2680,7 +2682,7 @@ describe('query', () => { () => { class ShallowQueryDirective { foos: any; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: ShallowQueryDirective, selectors: [['', 'shallow-query', '']], exportAs: ['shallow-query'], @@ -2689,11 +2691,11 @@ describe('query', () => { // @ContentChildren('foo', {descendants: false}) // foos: QueryList; if (rf & RenderFlags.Create) { - ΔcontentQuery(dirIndex, ['foo'], false, null); + ɵɵcontentQuery(dirIndex, ['foo'], false, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.foos = tmp); + ɵɵqueryRefresh(tmp = ɵɵloadContentQuery()) && (ctx.foos = tmp); } } }); @@ -2701,7 +2703,7 @@ describe('query', () => { class DeepQueryDirective { foos: any; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: DeepQueryDirective, selectors: [['', 'deep-query', '']], exportAs: ['deep-query'], @@ -2710,11 +2712,11 @@ describe('query', () => { // @ContentChildren('foo', {descendants: true}) // foos: QueryList; if (rf & RenderFlags.Create) { - ΔcontentQuery(dirIndex, ['foo'], true, null); + ɵɵcontentQuery(dirIndex, ['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.foos = tmp); + ɵɵqueryRefresh(tmp = ɵɵloadContentQuery()) && (ctx.foos = tmp); } } }); @@ -2735,20 +2737,20 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart( + ɵɵelementStart( 0, 'div', [AttributeMarker.Bindings, 'shallow-query', 'deep-query'], ['shallow', 'shallow-query', 'deep', 'deep-query']); { - Δelement(3, 'span', null, ['foo', '']); - ΔelementStart(5, 'div'); - { Δelement(6, 'span', null, ['foo', '']); } - ΔelementEnd(); + ɵɵelement(3, 'span', null, ['foo', '']); + ɵɵelementStart(5, 'div'); + { ɵɵelement(6, 'span', null, ['foo', '']); } + ɵɵelementEnd(); } - ΔelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - shallowInstance = Δload(1); - deepInstance = Δload(2); + shallowInstance = ɵɵload(1); + deepInstance = ɵɵload(2); } }, 8, 0, [ShallowQueryDirective, DeepQueryDirective]); @@ -2763,7 +2765,7 @@ describe('query', () => { class TextDirective { value !: string; - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: TextDirective, selectors: [['', 'text', '']], factory: () => new TextDirective(), @@ -2778,7 +2780,7 @@ describe('query', () => { // @ContentChildren(TextDirective) texts !: QueryList; - static ngComponentDef = ΔdefineDirective({ + static ngComponentDef = ɵɵdefineDirective({ type: ContentQueryDirective, selectors: [['', 'content-query', '']], factory: () => contentQueryDirective = new ContentQueryDirective(), @@ -2786,11 +2788,11 @@ describe('query', () => { // @ContentChildren(TextDirective, {descendants: true}) // texts: QueryList; if (rf & RenderFlags.Create) { - ΔcontentQuery(dirIndex, TextDirective, true, null); + ɵɵcontentQuery(dirIndex, TextDirective, true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadContentQuery()) && (ctx.texts = tmp); + ɵɵqueryRefresh(tmp = ɵɵloadContentQuery()) && (ctx.texts = tmp); } } }); @@ -2811,17 +2813,17 @@ describe('query', () => { */ function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', ['content-query']); + ɵɵelementStart(0, 'div', ['content-query']); { - Δelement(1, 'span', ['text', 'A']); - ΔelementStart(2, 'div', ['text', 'B']); - ΔelementStart(3, 'span', ['text', 'C']); - { Δelement(4, 'span', ['text', 'D']); } - ΔelementEnd(); - ΔelementEnd(); - Δelement(5, 'span', ['text', 'E']); + ɵɵelement(1, 'span', ['text', 'A']); + ɵɵelementStart(2, 'div', ['text', 'B']); + ɵɵelementStart(3, 'span', ['text', 'C']); + { ɵɵelement(4, 'span', ['text', 'D']); } + ɵɵelementEnd(); + ɵɵelementEnd(); + ɵɵelement(5, 'span', ['text', 'E']); } - ΔelementEnd(); + ɵɵelementEnd(); } }, 6, 0, [TextDirective, ContentQueryDirective]); @@ -2846,19 +2848,19 @@ describe('query', () => { // @ViewChildren(TextDirective) texts !: QueryList; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ViewQueryComponent, selectors: [['view-query']], factory: () => new ViewQueryComponent(), template: function(rf: RenderFlags, ctx: ViewQueryComponent) { if (rf & RenderFlags.Create) { - Δelement(0, 'span', ['text', 'A']); - ΔelementStart(1, 'div', ['text', 'B']); - ΔelementStart(2, 'span', ['text', 'C']); - { Δelement(3, 'span', ['text', 'D']); } - ΔelementEnd(); - ΔelementEnd(); - Δelement(4, 'span', ['text', 'E']); + ɵɵelement(0, 'span', ['text', 'A']); + ɵɵelementStart(1, 'div', ['text', 'B']); + ɵɵelementStart(2, 'span', ['text', 'C']); + { ɵɵelement(3, 'span', ['text', 'D']); } + ɵɵelementEnd(); + ɵɵelementEnd(); + ɵɵelement(4, 'span', ['text', 'E']); } }, consts: 5, @@ -2866,10 +2868,10 @@ describe('query', () => { viewQuery: function(rf: RenderFlags, ctx: ViewQueryComponent) { let tmp: any; if (rf & RenderFlags.Create) { - ΔviewQuery(TextDirective, true, null); + ɵɵviewQuery(TextDirective, true, null); } if (rf & RenderFlags.Update) { - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.texts = tmp as QueryList); } }, diff --git a/packages/core/test/render3/render_util.ts b/packages/core/test/render3/render_util.ts index f52e1e6409..63069703cc 100644 --- a/packages/core/test/render3/render_util.ts +++ b/packages/core/test/render3/render_util.ts @@ -27,7 +27,7 @@ import {CreateComponentOptions} from '../../src/render3/component'; import {getDirectivesAtNodeIndex, getLContext, isComponentInstance} from '../../src/render3/context_discovery'; import {extractDirectiveDef, extractPipeDef} from '../../src/render3/definition'; import {NG_ELEMENT_ID} from '../../src/render3/fields'; -import {ComponentTemplate, ComponentType, DirectiveDef, DirectiveType, RenderFlags, renderComponent as _renderComponent, tick, ΔProvidersFeature, ΔdefineComponent, ΔdefineDirective} from '../../src/render3/index'; +import {ComponentTemplate, ComponentType, DirectiveDef, DirectiveType, RenderFlags, renderComponent as _renderComponent, tick, ɵɵProvidersFeature, ɵɵdefineComponent, ɵɵdefineDirective} from '../../src/render3/index'; import {DirectiveDefList, DirectiveTypesOrFactory, HostBindingsFunction, PipeDef, PipeDefList, PipeTypesOrFactory} from '../../src/render3/interfaces/definition'; import {PlayerHandler} from '../../src/render3/interfaces/player'; import {ProceduralRenderer3, RComment, RElement, RNode, RText, Renderer3, RendererFactory3, RendererStyleFlags3, domRendererFactory3} from '../../src/render3/interfaces/renderer'; @@ -317,7 +317,7 @@ export function createComponent( viewProviders: Provider[] = [], hostBindings?: HostBindingsFunction): ComponentType { return class Component { value: any; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Component, selectors: [[name]], consts: consts, @@ -328,7 +328,7 @@ export function createComponent( directives: directives, hostBindings, pipes: pipes, features: (providers.length > 0 || viewProviders.length > 0)? - [ΔProvidersFeature(providers || [], viewProviders || [])]: [] + [ɵɵProvidersFeature(providers || [], viewProviders || [])]: [] }); }; } @@ -336,7 +336,7 @@ export function createComponent( export function createDirective( name: string, {exportAs}: {exportAs?: string[]} = {}): DirectiveType { return class Directive { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: Directive, selectors: [['', name, '']], factory: () => new Directive(), diff --git a/packages/core/test/render3/renderer_factory_spec.ts b/packages/core/test/render3/renderer_factory_spec.ts index 82a4708aae..4d3952b83c 100644 --- a/packages/core/test/render3/renderer_factory_spec.ts +++ b/packages/core/test/render3/renderer_factory_spec.ts @@ -10,8 +10,8 @@ import {AnimationEvent} from '@angular/animations'; import {MockAnimationDriver, MockAnimationPlayer} from '@angular/animations/browser/testing'; import {RendererType2, ViewEncapsulation} from '../../src/core'; -import {ΔdefineComponent} from '../../src/render3/index'; -import {tick, Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, Δelement, ΔelementEnd, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δlistener, Δtext} from '../../src/render3/instructions/all'; +import {ɵɵdefineComponent} from '../../src/render3/index'; +import {tick, ɵɵbind, ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵelement, ɵɵelementEnd, ɵɵelementProperty, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵlistener, ɵɵtext} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {getAnimationRendererFactory2, getRendererFactory2} from './imported_renderer2'; @@ -29,7 +29,7 @@ describe('renderer factory lifecycle', () => { rendererFactory.end = () => logs.push('end'); class SomeComponent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: SomeComponent, encapsulation: ViewEncapsulation.None, selectors: [['some-component']], @@ -38,7 +38,7 @@ describe('renderer factory lifecycle', () => { template: function(rf: RenderFlags, ctx: SomeComponent) { if (rf & RenderFlags.Create) { logs.push('component create'); - Δtext(0, 'foo'); + ɵɵtext(0, 'foo'); } if (rf & RenderFlags.Update) { logs.push('component update'); @@ -49,7 +49,7 @@ describe('renderer factory lifecycle', () => { } class SomeComponentWhichThrows { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: SomeComponentWhichThrows, encapsulation: ViewEncapsulation.None, selectors: [['some-component-with-Error']], @@ -65,7 +65,7 @@ describe('renderer factory lifecycle', () => { function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { logs.push('function create'); - Δtext(0, 'bar'); + ɵɵtext(0, 'bar'); } if (rf & RenderFlags.Update) { logs.push('function update'); @@ -77,8 +77,8 @@ describe('renderer factory lifecycle', () => { function TemplateWithComponent(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { logs.push('function_with_component create'); - Δtext(0, 'bar'); - Δelement(1, 'some-component'); + ɵɵtext(0, 'bar'); + ɵɵelement(1, 'some-component'); } if (rf & RenderFlags.Update) { logs.push('function_with_component update'); @@ -139,7 +139,7 @@ describe('animation renderer factory', () => { }); class SomeComponent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: SomeComponent, encapsulation: ViewEncapsulation.None, selectors: [['some-component']], @@ -147,7 +147,7 @@ describe('animation renderer factory', () => { vars: 0, template: function(rf: RenderFlags, ctx: SomeComponent) { if (rf & RenderFlags.Create) { - Δtext(0, 'foo'); + ɵɵtext(0, 'foo'); } }, factory: () => new SomeComponent @@ -160,23 +160,23 @@ describe('animation renderer factory', () => { callback(event: AnimationEvent) { eventLogs.push(`${event.fromState ? event.fromState : event.toState} - ${event.phaseName}`); } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: SomeComponentWithAnimation, selectors: [['some-component']], consts: 2, vars: 1, template: function(rf: RenderFlags, ctx: SomeComponentWithAnimation) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); + ɵɵelementStart(0, 'div'); { - Δlistener('@myAnimation.start', ctx.callback.bind(ctx)); - Δlistener('@myAnimation.done', ctx.callback.bind(ctx)); - Δtext(1, 'foo'); + ɵɵlistener('@myAnimation.start', ctx.callback.bind(ctx)); + ɵɵlistener('@myAnimation.done', ctx.callback.bind(ctx)); + ɵɵtext(1, 'foo'); } - ΔelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, '@myAnimation', Δbind(ctx.exp)); + ɵɵelementProperty(0, '@myAnimation', ɵɵbind(ctx.exp)); } }, factory: () => new SomeComponentWithAnimation, @@ -234,27 +234,27 @@ describe('Renderer2 destruction hooks', () => { let condition = true; function createTemplate() { - ΔelementStart(0, 'div'); - { Δcontainer(1); } - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + { ɵɵcontainer(1); } + ɵɵelementEnd(); } function updateTemplate() { - ΔcontainerRefreshStart(1); + ɵɵcontainerRefreshStart(1); { if (condition) { - let rf1 = ΔembeddedViewStart(1, 3, 0); + let rf1 = ɵɵembeddedViewStart(1, 3, 0); { if (rf1 & RenderFlags.Create) { - Δelement(0, 'span'); - Δelement(1, 'span'); - Δelement(2, 'span'); + ɵɵelement(0, 'span'); + ɵɵelement(1, 'span'); + ɵɵelement(2, 'span'); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } const t = new TemplateFixture( @@ -270,7 +270,7 @@ describe('Renderer2 destruction hooks', () => { it('should call renderer.destroy for each component destroyed', () => { class SimpleComponent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: SimpleComponent, encapsulation: ViewEncapsulation.None, selectors: [['simple']], @@ -278,7 +278,7 @@ describe('Renderer2 destruction hooks', () => { vars: 0, template: function(rf: RenderFlags, ctx: SimpleComponent) { if (rf & RenderFlags.Create) { - Δelement(0, 'span'); + ɵɵelement(0, 'span'); } }, factory: () => new SimpleComponent, @@ -288,27 +288,27 @@ describe('Renderer2 destruction hooks', () => { let condition = true; function createTemplate() { - ΔelementStart(0, 'div'); - { Δcontainer(1); } - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + { ɵɵcontainer(1); } + ɵɵelementEnd(); } function updateTemplate() { - ΔcontainerRefreshStart(1); + ɵɵcontainerRefreshStart(1); { if (condition) { - let rf1 = ΔembeddedViewStart(1, 3, 0); + let rf1 = ɵɵembeddedViewStart(1, 3, 0); { if (rf1 & RenderFlags.Create) { - Δelement(0, 'simple'); - Δelement(1, 'span'); - Δelement(2, 'simple'); + ɵɵelement(0, 'simple'); + ɵɵelement(1, 'span'); + ɵɵelement(2, 'simple'); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } const t = new TemplateFixture( diff --git a/packages/core/test/render3/styling/class_and_style_bindings_spec.ts b/packages/core/test/render3/styling/class_and_style_bindings_spec.ts index 83294c6fa6..6613c9d877 100644 --- a/packages/core/test/render3/styling/class_and_style_bindings_spec.ts +++ b/packages/core/test/render3/styling/class_and_style_bindings_spec.ts @@ -9,7 +9,7 @@ import {createLView, createTView} from '@angular/core/src/render3/instructions/s import {createRootContext} from '../../../src/render3/component'; import {getLContext} from '../../../src/render3/context_discovery'; -import {ΔdefineComponent, ΔdefineDirective, ΔelementClassProp, ΔelementEnd, ΔelementHostClassProp, ΔelementHostStyleProp, ΔelementHostStyling, ΔelementHostStylingApply, ΔelementStart, ΔelementStyleProp, ΔelementStyling, ΔelementStylingApply, ΔelementStylingMap, ΔnamespaceSVG} from '../../../src/render3/index'; +import {ɵɵdefineComponent, ɵɵdefineDirective, ɵɵelementClassProp, ɵɵelementEnd, ɵɵelementHostClassProp, ɵɵelementHostStyleProp, ɵɵelementHostStyling, ɵɵelementHostStylingApply, ɵɵelementStart, ɵɵelementStyleProp, ɵɵelementStyling, ɵɵelementStylingApply, ɵɵelementStylingMap, ɵɵnamespaceSVG} from '../../../src/render3/index'; import {RenderFlags} from '../../../src/render3/interfaces/definition'; import {AttributeMarker, TAttributes} from '../../../src/render3/interfaces/node'; import {BindingStore, BindingType, PlayState, Player, PlayerContext, PlayerFactory, PlayerHandler} from '../../../src/render3/interfaces/player'; @@ -22,7 +22,7 @@ import {CorePlayerHandler} from '../../../src/render3/styling/core_player_handle import {registerHostDirective} from '../../../src/render3/styling/host_instructions_queue'; import {BoundPlayerFactory, bindPlayerFactory} from '../../../src/render3/styling/player_factory'; import {allocStylingContext, createEmptyStylingContext} from '../../../src/render3/styling/util'; -import {ΔdefaultStyleSanitizer} from '../../../src/sanitization/sanitization'; +import {ɵɵdefaultStyleSanitizer} from '../../../src/sanitization/sanitization'; import {StyleSanitizeFn} from '../../../src/sanitization/style_sanitizer'; import {ComponentFixture, renderToHtml} from '../render_util'; @@ -376,7 +376,7 @@ describe('style and class based bindings', () => { () => { function Template(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'span', [ + ɵɵelementStart(0, 'span', [ AttributeMarker.Styles, 'width', '200px', @@ -385,13 +385,13 @@ describe('style and class based bindings', () => { 'opacity', '0.5', ]); - ΔelementStyling(null, ['width']); - ΔelementEnd(); + ɵɵelementStyling(null, ['width']); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementStylingMap(0, null, ctx.myStyles); - ΔelementStyleProp(0, 0, ctx.myWidth); - ΔelementStylingApply(0); + ɵɵelementStylingMap(0, null, ctx.myStyles); + ɵɵelementStyleProp(0, 0, ctx.myWidth); + ɵɵelementStylingApply(0); } } @@ -411,7 +411,7 @@ describe('style and class based bindings', () => { class Comp { diameter: number = 100; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Comp, selectors: [['comp']], factory: () => new Comp(), @@ -419,17 +419,17 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - ΔnamespaceSVG(); - ΔelementStart(0, 'svg'); - ΔelementStyling(null, ['width', 'height']); - ΔelementStart(1, 'circle', ['stroke', 'green', 'fill', 'yellow']); - ΔelementEnd(); - ΔelementEnd(); + ɵɵnamespaceSVG(); + ɵɵelementStart(0, 'svg'); + ɵɵelementStyling(null, ['width', 'height']); + ɵɵelementStart(1, 'circle', ['stroke', 'green', 'fill', 'yellow']); + ɵɵelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementStyleProp(0, 0, ctx.diameter, 'px'); - ΔelementStyleProp(0, 1, ctx.diameter, 'px'); - ΔelementStylingApply(0); + ɵɵelementStyleProp(0, 0, ctx.diameter, 'px'); + ɵɵelementStyleProp(0, 1, ctx.diameter, 'px'); + ɵɵelementStylingApply(0); } } }); @@ -453,7 +453,7 @@ describe('style and class based bindings', () => { borderWidth: string = '3px'; borderColor: string = 'red'; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Comp, selectors: [['comp']], factory: () => new Comp(), @@ -461,14 +461,14 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - ΔelementStyling(null, ['borderWidth', 'border-color']); - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + ɵɵelementStyling(null, ['borderWidth', 'border-color']); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementStyleProp(0, 0, ctx.borderWidth); - ΔelementStyleProp(0, 1, ctx.borderColor); - ΔelementStylingApply(0); + ɵɵelementStyleProp(0, 0, ctx.borderWidth); + ɵɵelementStyleProp(0, 1, ctx.borderColor); + ɵɵelementStylingApply(0); } } }); @@ -1269,7 +1269,7 @@ describe('style and class based bindings', () => { () => { const getStyles = trackStylesFactory(); const styleBindings = ['border-image', 'border-width']; - const styleSanitizer = ΔdefaultStyleSanitizer; + const styleSanitizer = ɵɵdefaultStyleSanitizer; const stylingContext = createStylingContext(null, styleBindings, null, null, styleSanitizer); @@ -3086,7 +3086,7 @@ describe('style and class based bindings', () => { const fooFactory = bindPlayerFactory(classBuildFn, true); class Comp { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Comp, selectors: [['comp']], directives: [Comp], @@ -3095,15 +3095,15 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - ΔelementStyling(['foo'], ['width']); - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + ɵɵelementStyling(['foo'], ['width']); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementStylingMap(0, classMapFactory, styleMapFactory); - ΔelementStyleProp(0, 0, widthFactory); - ΔelementClassProp(0, 0, fooFactory); - ΔelementStylingApply(0); + ɵɵelementStylingMap(0, classMapFactory, styleMapFactory); + ɵɵelementStyleProp(0, 0, widthFactory); + ɵɵelementClassProp(0, 0, fooFactory); + ɵɵelementStylingApply(0); } } }); @@ -3159,7 +3159,7 @@ describe('style and class based bindings', () => { let fooFactory = bindPlayerFactory(buildFn, true) as BoundPlayerFactory; class Comp { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Comp, selectors: [['comp']], directives: [Comp], @@ -3168,15 +3168,15 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - ΔelementStyling(['foo'], ['width']); - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + ɵɵelementStyling(['foo'], ['width']); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementStylingMap(0, classMapFactory, styleMapFactory); - ΔelementStyleProp(0, 0, widthFactory); - ΔelementClassProp(0, 0, fooFactory); - ΔelementStylingApply(0); + ɵɵelementStylingMap(0, classMapFactory, styleMapFactory); + ɵɵelementStyleProp(0, 0, widthFactory); + ɵɵelementClassProp(0, 0, fooFactory); + ɵɵelementStylingApply(0); } } }); @@ -3234,18 +3234,18 @@ describe('style and class based bindings', () => { const fooFactory2 = bindPlayerFactory(classBuildFn, true); class MyDir { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: MyDir, selectors: [['', 'my-dir', '']], factory: () => new MyDir(), hostBindings: function(rf: RenderFlags, ctx: MyDir, elementIndex: number) { if (rf & RenderFlags.Create) { - ΔelementHostStyling(['foo'], ['width']); + ɵɵelementHostStyling(['foo'], ['width']); } if (rf & RenderFlags.Update) { - ΔelementHostStyleProp(0, ctx.widthFactory); - ΔelementHostClassProp(0, ctx.fooFactory); - ΔelementHostStylingApply(); + ɵɵelementHostStyleProp(0, ctx.widthFactory); + ɵɵelementHostClassProp(0, ctx.fooFactory); + ɵɵelementHostStylingApply(); } } }); @@ -3255,7 +3255,7 @@ describe('style and class based bindings', () => { } class Comp { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Comp, selectors: [['comp']], directives: [Comp, MyDir], @@ -3264,14 +3264,14 @@ describe('style and class based bindings', () => { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', ['my-dir', '']); - ΔelementStyling(['foo'], ['width']); - ΔelementEnd(); + ɵɵelementStart(0, 'div', ['my-dir', '']); + ɵɵelementStyling(['foo'], ['width']); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementStyleProp(0, 0, ctx.widthFactory); - ΔelementClassProp(0, 0, ctx.fooFactory); - ΔelementStylingApply(0); + ɵɵelementStyleProp(0, 0, ctx.widthFactory); + ɵɵelementClassProp(0, 0, ctx.fooFactory); + ɵɵelementStylingApply(0); } } }); diff --git a/packages/core/test/render3/styling/players_spec.ts b/packages/core/test/render3/styling/players_spec.ts index 1cf5d8d934..f92b65d141 100644 --- a/packages/core/test/render3/styling/players_spec.ts +++ b/packages/core/test/render3/styling/players_spec.ts @@ -8,12 +8,12 @@ import {QueryList} from '@angular/core'; import {RenderFlags} from '@angular/core/src/render3'; -import {getHostElement, ΔdefineComponent, ΔloadViewQuery, ΔviewQuery} from '../../../src/render3/index'; -import {markDirty, Δelement, ΔelementEnd, ΔelementStart, ΔelementStyling, ΔelementStylingApply} from '../../../src/render3/instructions/all'; +import {getHostElement, ɵɵdefineComponent, ɵɵloadViewQuery, ɵɵviewQuery} from '../../../src/render3/index'; +import {markDirty, ɵɵelement, ɵɵelementEnd, ɵɵelementStart, ɵɵelementStyling, ɵɵelementStylingApply} from '../../../src/render3/instructions/all'; import {PlayState, Player, PlayerHandler} from '../../../src/render3/interfaces/player'; import {RElement} from '../../../src/render3/interfaces/renderer'; import {addPlayer, getPlayers} from '../../../src/render3/players'; -import {ΔqueryRefresh} from '../../../src/render3/query'; +import {ɵɵqueryRefresh} from '../../../src/render3/query'; import {getOrCreatePlayerContext} from '../../../src/render3/styling/util'; import {ComponentFixture} from '../render_util'; @@ -228,7 +228,7 @@ function buildElementWithStyling() { } class Comp { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Comp, exportAs: ['child'], selectors: [['child-comp']], @@ -237,7 +237,7 @@ class Comp { vars: 0, template: (rf: RenderFlags, ctx: Comp) => { if (rf & RenderFlags.Create) { - Δelement(0, 'div'); + ɵɵelement(0, 'div'); } ctx.logger(); } @@ -248,7 +248,7 @@ class Comp { } class CompWithStyling { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: CompWithStyling, exportAs: ['child-styled'], selectors: [['child-styled-comp']], @@ -257,12 +257,12 @@ class CompWithStyling { vars: 0, template: (rf: RenderFlags, ctx: CompWithStyling) => { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - ΔelementStyling(['fooClass']); - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + ɵɵelementStyling(['fooClass']); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementStylingApply(0); + ɵɵelementStylingApply(0); } } }); @@ -271,7 +271,7 @@ class CompWithStyling { } class SuperComp { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: SuperComp, selectors: [['super-comp']], factory: () => new SuperComp(), @@ -279,18 +279,18 @@ class SuperComp { vars: 0, template: (rf: RenderFlags, ctx: SuperComp) => { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - Δelement(1, 'child-comp', ['child', ''], ['child', 'child']); - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + ɵɵelement(1, 'child-comp', ['child', ''], ['child', 'child']); + ɵɵelementEnd(); } }, viewQuery: function(rf: RenderFlags, ctx: SuperComp) { if (rf & RenderFlags.Create) { - ΔviewQuery(['child'], true, null); + ɵɵviewQuery(['child'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.query = tmp as QueryList); } }, diff --git a/packages/core/test/render3/template_ref_spec.ts b/packages/core/test/render3/template_ref_spec.ts index d5059f366e..36b2b70b93 100644 --- a/packages/core/test/render3/template_ref_spec.ts +++ b/packages/core/test/render3/template_ref_spec.ts @@ -8,8 +8,8 @@ import {TemplateRef} from '@angular/core'; -import {AttributeMarker, RenderFlags, ΔdefineDirective} from '../../src/render3/index'; -import {Δbind, ΔdirectiveInject, Δelement, ΔelementContainerEnd, ΔelementContainerStart, ΔelementProperty, Δtemplate, Δtext} from '../../src/render3/instructions/all'; +import {AttributeMarker, RenderFlags, ɵɵdefineDirective} from '../../src/render3/index'; +import {ɵɵbind, ɵɵdirectiveInject, ɵɵelement, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementProperty, ɵɵtemplate, ɵɵtext} from '../../src/render3/instructions/all'; import {NgIf} from './common_with_def'; import {ComponentFixture, createComponent, getDirectiveOnNode} from './render_util'; @@ -19,10 +19,10 @@ describe('TemplateRef', () => { describe('rootNodes', () => { class DirectiveWithTplRef { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: DirectiveWithTplRef, selectors: [['', 'tplRef', '']], - factory: () => new DirectiveWithTplRef(ΔdirectiveInject(TemplateRef as any)) + factory: () => new DirectiveWithTplRef(ɵɵdirectiveInject(TemplateRef as any)) }); // injecting a ViewContainerRef to create a dynamic container in which embedded views will be @@ -35,9 +35,9 @@ describe('TemplateRef', () => { function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'div'); - Δtext(1, 'some text'); - Δelement(2, 'span'); + ɵɵelement(0, 'div'); + ɵɵtext(1, 'some text'); + ɵɵelement(2, 'span'); } } @@ -50,7 +50,7 @@ describe('TemplateRef', () => { */ const AppComponent = createComponent('app-cmp', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, embeddedTemplate, 3, 0, 'ng-template', ['tplRef', '']); + ɵɵtemplate(0, embeddedTemplate, 3, 0, 'ng-template', ['tplRef', '']); directiveWithTplRef = getDirectiveOnNode(0, 0); } }, 1, 0, [DirectiveWithTplRef]); @@ -79,7 +79,7 @@ describe('TemplateRef', () => { */ const AppComponent = createComponent('app-cmp', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, () => {}, 0, 0, 'ng-template', ['tplRef', '']); + ɵɵtemplate(0, () => {}, 0, 0, 'ng-template', ['tplRef', '']); directiveWithTplRef = getDirectiveOnNode(0, 0); } }, 1, 0, [DirectiveWithTplRef]); @@ -102,16 +102,16 @@ describe('TemplateRef', () => { function ngIfTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtext(0, 'text'); + ɵɵtext(0, 'text'); } } function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, ngIfTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); + ɵɵtemplate(0, ngIfTemplate, 1, 0, 'ng-template', [AttributeMarker.Bindings, 'ngIf']); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'ngIf', Δbind(ctx.showing)); + ɵɵelementProperty(0, 'ngIf', ɵɵbind(ctx.showing)); } } @@ -120,7 +120,7 @@ describe('TemplateRef', () => { */ const AppComponent = createComponent('app-cmp', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, embeddedTemplate, 1, 1, 'ng-template', ['tplRef', '']); + ɵɵtemplate(0, embeddedTemplate, 1, 1, 'ng-template', ['tplRef', '']); directiveWithTplRef = getDirectiveOnNode(0, 0); } }, 1, 0, [DirectiveWithTplRef, NgIf]); @@ -147,9 +147,9 @@ describe('TemplateRef', () => { function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementContainerStart(0); - { Δtext(1, 'text'); } - ΔelementContainerEnd(); + ɵɵelementContainerStart(0); + { ɵɵtext(1, 'text'); } + ɵɵelementContainerEnd(); } } @@ -158,7 +158,7 @@ describe('TemplateRef', () => { */ const AppComponent = createComponent('app-cmp', function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, embeddedTemplate, 2, 0, 'ng-template', ['tplRef', '']); + ɵɵtemplate(0, embeddedTemplate, 2, 0, 'ng-template', ['tplRef', '']); directiveWithTplRef = getDirectiveOnNode(0, 0); } }, 1, 0, [DirectiveWithTplRef]); diff --git a/packages/core/test/render3/view_container_ref_spec.ts b/packages/core/test/render3/view_container_ref_spec.ts index d0c1462cd7..0e1ab26879 100644 --- a/packages/core/test/render3/view_container_ref_spec.ts +++ b/packages/core/test/render3/view_container_ref_spec.ts @@ -6,19 +6,19 @@ * found in the LICENSE file at https://angular.io/license */ -import {ChangeDetectorRef, Component as _Component, ComponentFactoryResolver, ComponentRef, ΔdefineInjector, ElementRef, EmbeddedViewRef, NgModuleRef, Pipe, PipeTransform, QueryList, RendererFactory2, TemplateRef, ViewContainerRef, ViewRef, ɵAPP_ROOT as APP_ROOT, ɵNgModuleDef as NgModuleDef,} from '../../src/core'; +import {ChangeDetectorRef, Component as _Component, ComponentFactoryResolver, ComponentRef, ɵɵdefineInjector, ElementRef, EmbeddedViewRef, NgModuleRef, Pipe, PipeTransform, QueryList, RendererFactory2, TemplateRef, ViewContainerRef, ViewRef, ɵAPP_ROOT as APP_ROOT, ɵNgModuleDef as NgModuleDef,} from '../../src/core'; import {createInjector} from '../../src/di/r3_injector'; import {ViewEncapsulation} from '../../src/metadata'; -import {AttributeMarker, ΔdefineComponent, ΔdefineDirective, ΔdefinePipe, injectComponentFactoryResolver, Δlistener, ΔloadViewQuery, ΔNgOnChangesFeature, ΔqueryRefresh, ΔviewQuery,} from '../../src/render3/index'; +import {AttributeMarker, ɵɵdefineComponent, ɵɵdefineDirective, ɵɵdefinePipe, injectComponentFactoryResolver, ɵɵlistener, ɵɵloadViewQuery, ɵɵNgOnChangesFeature, ɵɵqueryRefresh, ɵɵviewQuery,} from '../../src/render3/index'; -import {ΔallocHostVars, Δbind, Δcontainer, ΔcontainerRefreshEnd, ΔcontainerRefreshStart, ΔdirectiveInject, Δelement, ΔelementEnd, ΔelementHostAttrs, ΔelementProperty, ΔelementStart, ΔembeddedViewEnd, ΔembeddedViewStart, Δinterpolation1, Δinterpolation3, ΔnextContext, Δprojection, ΔprojectionDef, Δreference, Δtemplate, Δtext, ΔtextBinding,} from '../../src/render3/instructions/all'; +import {ɵɵallocHostVars, ɵɵbind, ɵɵcontainer, ɵɵcontainerRefreshEnd, ɵɵcontainerRefreshStart, ɵɵdirectiveInject, ɵɵelement, ɵɵelementEnd, ɵɵelementHostAttrs, ɵɵelementProperty, ɵɵelementStart, ɵɵembeddedViewEnd, ɵɵembeddedViewStart, ɵɵinterpolation1, ɵɵinterpolation3, ɵɵnextContext, ɵɵprojection, ɵɵprojectionDef, ɵɵreference, ɵɵtemplate, ɵɵtext, ɵɵtextBinding,} from '../../src/render3/instructions/all'; import {RenderFlags} from '../../src/render3/interfaces/definition'; import {RElement} from '../../src/render3/interfaces/renderer'; import {NgModuleFactory} from '../../src/render3/ng_module_ref'; -import {Δpipe, ΔpipeBind1} from '../../src/render3/pipe'; +import {ɵɵpipe, ɵɵpipeBind1} from '../../src/render3/pipe'; import {getLView} from '../../src/render3/state'; import {getNativeByIndex} from '../../src/render3/util/view_utils'; -import {ΔtemplateRefExtractor} from '../../src/render3/view_engine_compatibility_prebound'; +import {ɵɵtemplateRefExtractor} from '../../src/render3/view_engine_compatibility_prebound'; import {NgForOf} from '../../test/render3/common_with_def'; import {getRendererFactory2} from './imported_renderer2'; @@ -36,12 +36,12 @@ describe('ViewContainerRef', () => { beforeEach(() => directiveInstance = null); class DirectiveWithVCRef { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: DirectiveWithVCRef, selectors: [['', 'vcref', '']], factory: () => directiveInstance = new DirectiveWithVCRef( - ΔdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), + ɵɵdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), inputs: {tplRef: 'tplRef', name: 'name'} }); @@ -61,10 +61,10 @@ describe('ViewContainerRef', () => { */ function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtext(0); + ɵɵtext(0); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δbind(ctx.name)); + ɵɵtextBinding(0, ɵɵbind(ctx.name)); } } @@ -78,14 +78,14 @@ describe('ViewContainerRef', () => { *

*/ function createTemplate() { - Δtemplate( - 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], ΔtemplateRefExtractor); - Δelement(2, 'p', ['vcref', '']); + ɵɵtemplate( + 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], ɵɵtemplateRefExtractor); + ɵɵelement(2, 'p', ['vcref', '']); } function updateTemplate() { - const tplRef = Δreference(1); - ΔelementProperty(2, 'tplRef', Δbind(tplRef)); + const tplRef = ɵɵreference(1); + ɵɵelementProperty(2, 'tplRef', ɵɵbind(tplRef)); } describe('createEmbeddedView (incl. insert)', () => { @@ -96,11 +96,11 @@ describe('ViewContainerRef', () => { *
*/ function createTemplate() { - Δtemplate( + ɵɵtemplate( 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], - ΔtemplateRefExtractor); - Δelement(2, 'header', ['vcref', '']); - Δelement(3, 'footer'); + ɵɵtemplateRefExtractor); + ɵɵelement(2, 'header', ['vcref', '']); + ɵɵelement(3, 'footer'); } const fixture = @@ -134,10 +134,10 @@ describe('ViewContainerRef', () => { *
*/ function createTemplate() { - Δtemplate( - 0, embeddedTemplate, 1, 1, 'ng-template', [], ['tplRef', ''], ΔtemplateRefExtractor); - Δelement(2, 'header-cmp', ['vcref', '']); - Δelement(3, 'footer'); + ɵɵtemplate( + 0, embeddedTemplate, 1, 1, 'ng-template', [], ['tplRef', ''], ɵɵtemplateRefExtractor); + ɵɵelement(2, 'header-cmp', ['vcref', '']); + ɵɵelement(3, 'footer'); } const fixture = new TemplateFixture( @@ -171,11 +171,11 @@ describe('ViewContainerRef', () => { *
*/ function createTemplate() { - Δtemplate( + ɵɵtemplate( 0, embeddedTemplate, 1, 1, 'ng-template', null, ['tplRef', ''], - ΔtemplateRefExtractor); - Δelement(2, 'div', ['vcref', '']); - Δelement(3, 'div', ['vcref', '']); + ɵɵtemplateRefExtractor); + ɵɵelement(2, 'div', ['vcref', '']); + ɵɵelement(3, 'div', ['vcref', '']); // for testing only: firstDir = getDirectiveOnNode(2); @@ -183,9 +183,9 @@ describe('ViewContainerRef', () => { } function update() { - const tplRef = Δreference(1); - ΔelementProperty(2, 'tplRef', Δbind(tplRef)); - ΔelementProperty(3, 'tplRef', Δbind(tplRef)); + const tplRef = ɵɵreference(1); + ɵɵelementProperty(2, 'tplRef', ɵɵbind(tplRef)); + ɵɵelementProperty(3, 'tplRef', ɵɵbind(tplRef)); } const fixture = new TemplateFixture(createTemplate, update, 4, 2, [DirectiveWithVCRef]); @@ -203,15 +203,15 @@ describe('ViewContainerRef', () => { *
*/ function createTemplate() { - Δtemplate( + ɵɵtemplate( 0, embeddedTemplate, 1, 1, 'ng-template', ['vcref', ''], ['tplRef', ''], - ΔtemplateRefExtractor); - Δelement(2, 'footer'); + ɵɵtemplateRefExtractor); + ɵɵelement(2, 'footer'); } function updateTemplate() { - const tplRef = Δreference(1); - ΔelementProperty(0, 'tplRef', Δbind(tplRef)); + const tplRef = ɵɵreference(1); + ɵɵelementProperty(0, 'tplRef', ɵɵbind(tplRef)); } const fixture = @@ -240,13 +240,13 @@ describe('ViewContainerRef', () => { let directiveInstances: TestDirective[] = []; class TestDirective { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: TestDirective, selectors: [['', 'testdir', '']], factory: () => { const instance = new TestDirective( - ΔdirectiveInject(ViewContainerRef as any), - ΔdirectiveInject(TemplateRef as any)); + ɵɵdirectiveInject(ViewContainerRef as any), + ɵɵdirectiveInject(TemplateRef as any)); directiveInstances.push(instance); @@ -263,13 +263,13 @@ describe('ViewContainerRef', () => { function EmbeddedTemplateA(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtext(0, 'A'); + ɵɵtext(0, 'A'); } } function EmbeddedTemplateB(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtext(0, 'B'); + ɵɵtext(0, 'B'); } } @@ -282,7 +282,7 @@ describe('ViewContainerRef', () => { class TestComponent { // TODO(issue/24571): remove '!'. testDir !: TestDirective; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: TestComponent, encapsulation: ViewEncapsulation.None, selectors: [['test-cmp']], @@ -291,10 +291,10 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: TestComponent) => { if (rf & RenderFlags.Create) { - Δtext(0, 'before|'); - Δtemplate(1, EmbeddedTemplateA, 1, 0, 'ng-template', ['testdir', '']); - Δtemplate(2, EmbeddedTemplateB, 1, 0, 'ng-template', ['testdir', '']); - Δtext(3, '|after'); + ɵɵtext(0, 'before|'); + ɵɵtemplate(1, EmbeddedTemplateA, 1, 0, 'ng-template', ['testdir', '']); + ɵɵtemplate(2, EmbeddedTemplateB, 1, 0, 'ng-template', ['testdir', '']); + ɵɵtext(3, '|after'); } }, directives: [TestDirective] @@ -317,12 +317,12 @@ describe('ViewContainerRef', () => { let directiveInstance: TestDirective; class TestDirective { - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: TestDirective, selectors: [['', 'testdir', '']], factory: () => directiveInstance = new TestDirective( - ΔdirectiveInject(ViewContainerRef as any), - ΔdirectiveInject(TemplateRef as any)) + ɵɵdirectiveInject(ViewContainerRef as any), + ɵɵdirectiveInject(TemplateRef as any)) }); constructor(private _vcRef: ViewContainerRef, private _tplRef: TemplateRef<{}>) {} @@ -339,7 +339,7 @@ describe('ViewContainerRef', () => { function EmbeddedTemplateA(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtext(0, 'A'); + ɵɵtext(0, 'A'); } } @@ -355,7 +355,7 @@ describe('ViewContainerRef', () => { condition = false; // TODO(issue/24571): remove '!'. testDir !: TestDirective; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: TestComponent, encapsulation: ViewEncapsulation.None, selectors: [['test-cmp']], @@ -364,25 +364,25 @@ describe('ViewContainerRef', () => { factory: () => new TestComponent(), template: (rf: RenderFlags, cmp: TestComponent) => { if (rf & RenderFlags.Create) { - Δtext(0, 'before|'); - Δtemplate(1, EmbeddedTemplateA, 1, 0, 'ng-template', ['testdir', '']); - Δcontainer(2); - Δtext(3, '|after'); + ɵɵtext(0, 'before|'); + ɵɵtemplate(1, EmbeddedTemplateA, 1, 0, 'ng-template', ['testdir', '']); + ɵɵcontainer(2); + ɵɵtext(3, '|after'); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(2); + ɵɵcontainerRefreshStart(2); { if (cmp.condition) { - let rf1 = ΔembeddedViewStart(0, 1, 0); + let rf1 = ɵɵembeddedViewStart(0, 1, 0); { if (rf1 & RenderFlags.Create) { - Δtext(0, 'B'); + ɵɵtext(0, 'B'); } } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } }, directives: [TestDirective] @@ -417,7 +417,7 @@ describe('ViewContainerRef', () => { // TODO(issue/24571): remove '!'. name !: string; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Child, encapsulation: ViewEncapsulation.None, selectors: [['child']], @@ -426,10 +426,10 @@ describe('ViewContainerRef', () => { vars: 1, template: (rf: RenderFlags, cmp: Child) => { if (rf & RenderFlags.Create) { - Δtext(0); + ɵɵtext(0); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('', cmp.name, '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', cmp.name, '')); } }, inputs: {name: 'name'} @@ -440,7 +440,7 @@ describe('ViewContainerRef', () => { class StarPipe implements PipeTransform { transform(value: any) { return `**${value}**`; } - static ngPipeDef = ΔdefinePipe({ + static ngPipeDef = ɵɵdefinePipe({ name: 'starPipe', type: StarPipe, factory: function StarPipe_Factory() { return new StarPipe(); }, @@ -449,11 +449,11 @@ describe('ViewContainerRef', () => { function SomeComponent_Template_0(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'child'); - Δpipe(1, 'starPipe'); + ɵɵelement(0, 'child'); + ɵɵpipe(1, 'starPipe'); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'name', Δbind(ΔpipeBind1(1, 1, 'C'))); + ɵɵelementProperty(0, 'name', ɵɵbind(ɵɵpipeBind1(1, 1, 'C'))); } } @@ -467,7 +467,7 @@ describe('ViewContainerRef', () => { ` }) class SomeComponent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: SomeComponent, encapsulation: ViewEncapsulation.None, selectors: [['some-comp']], @@ -476,19 +476,19 @@ describe('ViewContainerRef', () => { vars: 7, template: (rf: RenderFlags, cmp: SomeComponent) => { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, SomeComponent_Template_0, 2, 3, 'ng-template', [], ['foo', ''], - ΔtemplateRefExtractor); - Δpipe(2, 'starPipe'); - Δelement(3, 'child', ['vcref', '']); - Δpipe(4, 'starPipe'); - Δelement(5, 'child'); + ɵɵtemplateRefExtractor); + ɵɵpipe(2, 'starPipe'); + ɵɵelement(3, 'child', ['vcref', '']); + ɵɵpipe(4, 'starPipe'); + ɵɵelement(5, 'child'); } if (rf & RenderFlags.Update) { - const tplRef = Δreference(1); - ΔelementProperty(3, 'tplRef', Δbind(tplRef)); - ΔelementProperty(3, 'name', Δbind(ΔpipeBind1(2, 3, 'A'))); - ΔelementProperty(5, 'name', Δbind(ΔpipeBind1(4, 5, 'B'))); + const tplRef = ɵɵreference(1); + ɵɵelementProperty(3, 'tplRef', ɵɵbind(tplRef)); + ɵɵelementProperty(3, 'name', ɵɵbind(ɵɵpipeBind1(2, 3, 'A'))); + ɵɵelementProperty(5, 'name', ɵɵbind(ɵɵpipeBind1(4, 5, 'B'))); } }, directives: [Child, DirectiveWithVCRef], @@ -515,10 +515,10 @@ describe('ViewContainerRef', () => { constructor(public vcr: ViewContainerRef) {} - static ngDirectiveDef = ΔdefineDirective({ + static ngDirectiveDef = ɵɵdefineDirective({ type: InsertionDir, selectors: [['', 'tplDir', '']], - factory: () => new InsertionDir(ΔdirectiveInject(ViewContainerRef as any)), + factory: () => new InsertionDir(ɵɵdirectiveInject(ViewContainerRef as any)), inputs: {tplDir: 'tplDir'} }); } @@ -536,7 +536,7 @@ describe('ViewContainerRef', () => { name = 'Child'; tpl: TemplateRef|null = null; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Child, encapsulation: ViewEncapsulation.None, selectors: [['child']], @@ -545,13 +545,13 @@ describe('ViewContainerRef', () => { vars: 2, template: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div', [AttributeMarker.Bindings, 'tplDir']); - { Δtext(1); } - ΔelementEnd(); + ɵɵelementStart(0, 'div', [AttributeMarker.Bindings, 'tplDir']); + { ɵɵtext(1); } + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'tplDir', Δbind(ctx.tpl)); - ΔtextBinding(1, Δbind(ctx.name)); + ɵɵelementProperty(0, 'tplDir', ɵɵbind(ctx.tpl)); + ɵɵtextBinding(1, ɵɵbind(ctx.name)); } }, inputs: {tpl: 'tpl'}, @@ -569,27 +569,27 @@ describe('ViewContainerRef', () => { */ const Parent = createComponent('parent', function(rf: RenderFlags, parent: any) { if (rf & RenderFlags.Create) { - Δtemplate( - 0, fooTemplate, 2, 1, 'ng-template', null, ['foo', ''], ΔtemplateRefExtractor); - Δelement(2, 'child'); + ɵɵtemplate( + 0, fooTemplate, 2, 1, 'ng-template', null, ['foo', ''], ɵɵtemplateRefExtractor); + ɵɵelement(2, 'child'); } if (rf & RenderFlags.Update) { - const tplRef = Δreference(1); - ΔelementProperty(2, 'tpl', Δbind(tplRef)); + const tplRef = ɵɵreference(1); + ɵɵelementProperty(2, 'tpl', ɵɵbind(tplRef)); } }, 3, 1, [Child]); function fooTemplate(rf1: RenderFlags, ctx: any) { if (rf1 & RenderFlags.Create) { - ΔelementStart(0, 'div'); - { Δtext(1); } - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + { ɵɵtext(1); } + ɵɵelementEnd(); } if (rf1 & RenderFlags.Update) { - const parent = ΔnextContext(); - ΔtextBinding(1, Δbind(parent.name)); + const parent = ɵɵnextContext(); + ɵɵtextBinding(1, ɵɵbind(parent.name)); } } @@ -622,7 +622,7 @@ describe('ViewContainerRef', () => { // @Input() rows !: any[]; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: LoopComp, encapsulation: ViewEncapsulation.None, selectors: [['loop-comp']], @@ -631,12 +631,12 @@ describe('ViewContainerRef', () => { vars: 2, template: function(rf: RenderFlags, loop: any) { if (rf & RenderFlags.Create) { - Δtemplate(0, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'ngForOf']); + ɵɵtemplate(0, null, 0, 0, 'ng-template', [AttributeMarker.Bindings, 'ngForOf']); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'ngForOf', Δbind(loop.rows)); - ΔelementProperty(0, 'ngForTemplate', Δbind(loop.tpl)); + ɵɵelementProperty(0, 'ngForOf', ɵɵbind(loop.rows)); + ɵɵelementProperty(0, 'ngForTemplate', ɵɵbind(loop.tpl)); } }, inputs: {tpl: 'tpl', rows: 'rows'}, @@ -661,48 +661,48 @@ describe('ViewContainerRef', () => { */ const Parent = createComponent('parent', function(rf: RenderFlags, parent: any) { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, rowTemplate, 3, 2, 'ng-template', null, ['rowTemplate', ''], - ΔtemplateRefExtractor); - Δelement(2, 'loop-comp'); + ɵɵtemplateRefExtractor); + ɵɵelement(2, 'loop-comp'); } if (rf & RenderFlags.Update) { - const rowTemplateRef = Δreference(1); - ΔelementProperty(2, 'tpl', Δbind(rowTemplateRef)); - ΔelementProperty(2, 'rows', Δbind(parent.rows)); + const rowTemplateRef = ɵɵreference(1); + ɵɵelementProperty(2, 'tpl', ɵɵbind(rowTemplateRef)); + ɵɵelementProperty(2, 'rows', ɵɵbind(parent.rows)); } }, 3, 2, [LoopComp]); function rowTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, cellTemplate, 2, 3, 'ng-template', null, ['cellTemplate', ''], - ΔtemplateRefExtractor); - Δelement(2, 'loop-comp'); + ɵɵtemplateRefExtractor); + ɵɵelement(2, 'loop-comp'); } if (rf & RenderFlags.Update) { const row = ctx.$implicit as any; - const cellTemplateRef = Δreference(1); - ΔelementProperty(2, 'tpl', Δbind(cellTemplateRef)); - ΔelementProperty(2, 'rows', Δbind(row.data)); + const cellTemplateRef = ɵɵreference(1); + ɵɵelementProperty(2, 'tpl', ɵɵbind(cellTemplateRef)); + ɵɵelementProperty(2, 'rows', ɵɵbind(row.data)); } } function cellTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - { Δtext(1); } - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + { ɵɵtext(1); } + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { const cell = ctx.$implicit as any; - const row = ΔnextContext().$implicit as any; - const parent = ΔnextContext(); - ΔtextBinding(1, Δinterpolation3('', cell, ' - ', row.value, ' - ', parent.name, '')); + const row = ɵɵnextContext().$implicit as any; + const parent = ɵɵnextContext(); + ɵɵtextBinding(1, ɵɵinterpolation3('', cell, ' - ', row.value, ' - ', parent.name, '')); } } @@ -943,7 +943,7 @@ describe('ViewContainerRef', () => { class EmbeddedComponent { constructor() {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: EmbeddedComponent, encapsulation: ViewEncapsulation.None, selectors: [['embedded-cmp']], @@ -953,7 +953,7 @@ describe('ViewContainerRef', () => { template: (rf: RenderFlags, cmp: EmbeddedComponent) => { templateExecutionCounter++; if (rf & RenderFlags.Create) { - Δtext(0, 'foo'); + ɵɵtext(0, 'foo'); } } }); @@ -986,24 +986,24 @@ describe('ViewContainerRef', () => { class EmbeddedComponent { constructor(public s: String) {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: EmbeddedComponent, encapsulation: ViewEncapsulation.None, selectors: [['embedded-cmp']], - factory: () => new EmbeddedComponent(ΔdirectiveInject(String)), + factory: () => new EmbeddedComponent(ɵɵdirectiveInject(String)), consts: 1, vars: 0, template: (rf: RenderFlags, cmp: EmbeddedComponent) => { templateExecutionCounter++; if (rf & RenderFlags.Create) { - Δtext(0, 'foo'); + ɵɵtext(0, 'foo'); } } }); } class MyAppModule { - static ngInjectorDef = ΔdefineInjector({ + static ngInjectorDef = ɵɵdefineInjector({ factory: () => new MyAppModule(), imports: [], providers: [ @@ -1018,7 +1018,7 @@ describe('ViewContainerRef', () => { const ngModuleRef = myAppModuleFactory.create(null); class SomeModule { - static ngInjectorDef = ΔdefineInjector({ + static ngInjectorDef = ɵɵdefineInjector({ factory: () => new SomeModule(), providers: [ {provide: NgModuleRef, useValue: ngModuleRef}, @@ -1057,12 +1057,12 @@ describe('ViewContainerRef', () => { class AppComp { constructor(public vcr: ViewContainerRef, public cfr: ComponentFactoryResolver) {} - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: AppComp, selectors: [['app-comp']], factory: () => new AppComp( - ΔdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), + ɵɵdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), consts: 0, vars: 0, template: (rf: RenderFlags, cmp: AppComp) => {} @@ -1074,7 +1074,7 @@ describe('ViewContainerRef', () => { ngDoCheck() { this.doCheckCount++; } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: DynamicComp, selectors: [['dynamic-comp']], factory: () => dynamicComp = new DynamicComp(), @@ -1131,7 +1131,7 @@ describe('ViewContainerRef', () => { }); class EmbeddedComponentWithNgContent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: EmbeddedComponentWithNgContent, encapsulation: ViewEncapsulation.None, selectors: [['embedded-cmp-with-ngcontent']], @@ -1140,10 +1140,10 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: EmbeddedComponentWithNgContent) => { if (rf & RenderFlags.Create) { - ΔprojectionDef(); - Δprojection(0, 0); - Δelement(1, 'hr'); - Δprojection(2, 1); + ɵɵprojectionDef(); + ɵɵprojection(0, 0); + ɵɵelement(1, 'hr'); + ɵɵprojection(2, 1); } } }); @@ -1171,7 +1171,7 @@ describe('ViewContainerRef', () => { it('should support reprojection of projectable nodes', () => { class Reprojector { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Reprojector, encapsulation: ViewEncapsulation.None, selectors: [['reprojector']], @@ -1180,10 +1180,10 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: Reprojector) => { if (rf & RenderFlags.Create) { - ΔprojectionDef(); - ΔelementStart(0, 'embedded-cmp-with-ngcontent'); - { Δprojection(1, 0); } - ΔelementEnd(); + ɵɵprojectionDef(); + ɵɵelementStart(0, 'embedded-cmp-with-ngcontent'); + { ɵɵprojection(1, 0); } + ɵɵelementEnd(); } }, directives: [EmbeddedComponentWithNgContent] @@ -1229,8 +1229,8 @@ describe('ViewContainerRef', () => { describe('getters', () => { it('should work on elements', () => { function createTemplate() { - Δelement(0, 'header', ['vcref', '']); - Δelement(1, 'footer'); + ɵɵelement(0, 'header', ['vcref', '']); + ɵɵelement(1, 'footer'); } new TemplateFixture(createTemplate, undefined, 2, 0, [DirectiveWithVCRef]); @@ -1248,8 +1248,8 @@ describe('ViewContainerRef', () => { createComponent('header-cmp', function(rf: RenderFlags, ctx: any) {}); function createTemplate() { - Δelement(0, 'header-cmp', ['vcref', '']); - Δelement(1, 'footer'); + ɵɵelement(0, 'header-cmp', ['vcref', '']); + ɵɵelement(1, 'footer'); } new TemplateFixture(createTemplate, undefined, 2, 0, [HeaderComponent, DirectiveWithVCRef]); @@ -1264,8 +1264,8 @@ describe('ViewContainerRef', () => { it('should work on templates', () => { function createTemplate() { - Δtemplate(0, embeddedTemplate, 1, 1, 'ng-template', ['vcref', '']); - Δelement(1, 'footer'); + ɵɵtemplate(0, embeddedTemplate, 1, 1, 'ng-template', ['vcref', '']); + ɵɵelement(1, 'footer'); } new TemplateFixture(createTemplate, () => {}, 2, 0, [DirectiveWithVCRef]); @@ -1280,19 +1280,19 @@ describe('ViewContainerRef', () => { describe('projection', () => { function embeddedTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'span'); - Δtext(1); - ΔelementEnd(); + ɵɵelementStart(0, 'span'); + ɵɵtext(1); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔtextBinding(1, ctx.name); + ɵɵtextBinding(1, ctx.name); } } it('should project the ViewContainerRef content along its host, in an element', () => { @Component({selector: 'child', template: '
'}) class Child { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Child, encapsulation: ViewEncapsulation.None, selectors: [['child']], @@ -1301,10 +1301,10 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: Child) => { if (rf & RenderFlags.Create) { - ΔprojectionDef(); - ΔelementStart(0, 'div'); - { Δprojection(1); } - ΔelementEnd(); + ɵɵprojectionDef(); + ɵɵelementStart(0, 'div'); + { ɵɵprojection(1); } + ɵɵelementEnd(); } } }); @@ -1320,7 +1320,7 @@ describe('ViewContainerRef', () => { }) class Parent { name: string = 'bar'; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Parent, encapsulation: ViewEncapsulation.None, selectors: [['parent']], @@ -1329,22 +1329,22 @@ describe('ViewContainerRef', () => { vars: 2, template: (rf: RenderFlags, cmp: Parent) => { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, embeddedTemplate, 2, 1, 'ng-template', null, ['foo', ''], - ΔtemplateRefExtractor); - ΔelementStart(2, 'child'); + ɵɵtemplateRefExtractor); + ɵɵelementStart(2, 'child'); { - ΔelementStart(3, 'header', ['vcref', '']); - { Δtext(4, 'blah'); } - ΔelementEnd(); + ɵɵelementStart(3, 'header', ['vcref', '']); + { ɵɵtext(4, 'blah'); } + ɵɵelementEnd(); } - ΔelementEnd(); + ɵɵelementEnd(); } let tplRef: any; if (rf & RenderFlags.Update) { - tplRef = Δreference(1); - ΔelementProperty(3, 'tplRef', Δbind(tplRef)); - ΔelementProperty(3, 'name', Δbind(cmp.name)); + tplRef = ɵɵreference(1); + ɵɵelementProperty(3, 'tplRef', ɵɵbind(tplRef)); + ɵɵelementProperty(3, 'name', ɵɵbind(cmp.name)); } }, directives: [Child, DirectiveWithVCRef] @@ -1373,7 +1373,7 @@ describe('ViewContainerRef', () => { }) class ChildWithView { show: boolean = true; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ChildWithView, encapsulation: ViewEncapsulation.None, selectors: [['child-with-view']], @@ -1382,21 +1382,21 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: ChildWithView) => { if (rf & RenderFlags.Create) { - ΔprojectionDef(); - Δtext(0, 'Before (inside)-'); - Δcontainer(1); - Δtext(2, 'After (inside)'); + ɵɵprojectionDef(); + ɵɵtext(0, 'Before (inside)-'); + ɵɵcontainer(1); + ɵɵtext(2, 'After (inside)'); } if (rf & RenderFlags.Update) { - ΔcontainerRefreshStart(1); + ɵɵcontainerRefreshStart(1); if (cmp.show) { - let rf0 = ΔembeddedViewStart(0, 1, 0); + let rf0 = ɵɵembeddedViewStart(0, 1, 0); if (rf0 & RenderFlags.Create) { - Δprojection(0); + ɵɵprojection(0); } - ΔembeddedViewEnd(); + ɵɵembeddedViewEnd(); } - ΔcontainerRefreshEnd(); + ɵɵcontainerRefreshEnd(); } } }); @@ -1416,7 +1416,7 @@ describe('ViewContainerRef', () => { }) class Parent { name: string = 'bar'; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Parent, encapsulation: ViewEncapsulation.None, selectors: [['parent']], @@ -1425,21 +1425,21 @@ describe('ViewContainerRef', () => { vars: 2, template: (rf: RenderFlags, cmp: Parent) => { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, embeddedTemplate, 2, 1, 'ng-template', undefined, ['foo', ''], - ΔtemplateRefExtractor); - ΔelementStart(2, 'child-with-view'); - Δtext(3, 'Before projected'); - ΔelementStart(4, 'header', ['vcref', '']); - Δtext(5, 'blah'); - ΔelementEnd(); - Δtext(6, 'After projected-'); - ΔelementEnd(); + ɵɵtemplateRefExtractor); + ɵɵelementStart(2, 'child-with-view'); + ɵɵtext(3, 'Before projected'); + ɵɵelementStart(4, 'header', ['vcref', '']); + ɵɵtext(5, 'blah'); + ɵɵelementEnd(); + ɵɵtext(6, 'After projected-'); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - const tplRef = Δreference(1); - ΔelementProperty(4, 'tplRef', Δbind(tplRef)); - ΔelementProperty(4, 'name', Δbind(cmp.name)); + const tplRef = ɵɵreference(1); + ɵɵelementProperty(4, 'tplRef', ɵɵbind(tplRef)); + ɵɵelementProperty(4, 'name', ɵɵbind(cmp.name)); } }, directives: [ChildWithView, DirectiveWithVCRef] @@ -1466,7 +1466,7 @@ describe('ViewContainerRef', () => { ` }) class ChildWithSelector { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ChildWithSelector, encapsulation: ViewEncapsulation.None, selectors: [['child-with-selector']], @@ -1475,13 +1475,13 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: ChildWithSelector) => { if (rf & RenderFlags.Create) { - ΔprojectionDef([[['header']]]); - ΔelementStart(0, 'first'); - { Δprojection(1, 1); } - ΔelementEnd(); - ΔelementStart(2, 'second'); - { Δprojection(3); } - ΔelementEnd(); + ɵɵprojectionDef([[['header']]]); + ɵɵelementStart(0, 'first'); + { ɵɵprojection(1, 1); } + ɵɵelementEnd(); + ɵɵelementStart(2, 'second'); + { ɵɵprojection(3); } + ɵɵelementEnd(); } }, directives: [ChildWithSelector, DirectiveWithVCRef] @@ -1500,7 +1500,7 @@ describe('ViewContainerRef', () => { }) class Parent { name: string = 'bar'; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Parent, encapsulation: ViewEncapsulation.None, selectors: [['parent']], @@ -1510,19 +1510,19 @@ describe('ViewContainerRef', () => { template: (rf: RenderFlags, cmp: Parent) => { let tplRef: any; if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, embeddedTemplate, 2, 1, 'ng-template', null, ['foo', ''], - ΔtemplateRefExtractor); - ΔelementStart(2, 'child-with-selector'); - ΔelementStart(3, 'header', ['vcref', '']); - Δtext(4, 'blah'); - ΔelementEnd(); - ΔelementEnd(); + ɵɵtemplateRefExtractor); + ɵɵelementStart(2, 'child-with-selector'); + ɵɵelementStart(3, 'header', ['vcref', '']); + ɵɵtext(4, 'blah'); + ɵɵelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - tplRef = Δreference(1); - ΔelementProperty(3, 'tplRef', Δbind(tplRef)); - ΔelementProperty(3, 'name', Δbind(cmp.name)); + tplRef = ɵɵreference(1); + ɵɵelementProperty(3, 'tplRef', ɵɵbind(tplRef)); + ɵɵelementProperty(3, 'name', ɵɵbind(cmp.name)); } }, directives: [ChildWithSelector, DirectiveWithVCRef] @@ -1554,7 +1554,7 @@ describe('ViewContainerRef', () => { }) class Parent { name: string = 'bar'; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: Parent, encapsulation: ViewEncapsulation.None, selectors: [['parent']], @@ -1564,19 +1564,19 @@ describe('ViewContainerRef', () => { template: (rf: RenderFlags, cmp: Parent) => { let tplRef: any; if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, embeddedTemplate, 2, 1, 'ng-template', null, ['foo', ''], - ΔtemplateRefExtractor); - ΔelementStart(2, 'child-with-selector'); - ΔelementStart(3, 'footer', ['vcref', '']); - Δtext(4, 'blah'); - ΔelementEnd(); - ΔelementEnd(); + ɵɵtemplateRefExtractor); + ɵɵelementStart(2, 'child-with-selector'); + ɵɵelementStart(3, 'footer', ['vcref', '']); + ɵɵtext(4, 'blah'); + ɵɵelementEnd(); + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - tplRef = Δreference(1); - ΔelementProperty(3, 'tplRef', Δbind(tplRef)); - ΔelementProperty(3, 'name', Δbind(cmp.name)); + tplRef = ɵɵreference(1); + ɵɵelementProperty(3, 'tplRef', ɵɵbind(tplRef)); + ɵɵelementProperty(3, 'name', ɵɵbind(cmp.name)); } }, directives: [ChildWithSelector, DirectiveWithVCRef] @@ -1622,7 +1622,7 @@ describe('ViewContainerRef', () => { ngOnDestroy() { this.log('onDestroy-' + this.name); } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: ComponentWithHooks, encapsulation: ViewEncapsulation.None, selectors: [['hooks']], @@ -1631,13 +1631,13 @@ describe('ViewContainerRef', () => { vars: 1, template: (rf: RenderFlags, cmp: ComponentWithHooks) => { if (rf & RenderFlags.Create) { - Δtext(0); + ɵɵtext(0); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('', cmp.name, '')); + ɵɵtextBinding(0, ɵɵinterpolation1('', cmp.name, '')); } }, - features: [ΔNgOnChangesFeature()], + features: [ɵɵNgOnChangesFeature()], inputs: {name: 'name'} }); } @@ -1645,10 +1645,10 @@ describe('ViewContainerRef', () => { it('should call all hooks in correct order when creating with createEmbeddedView', () => { function SomeComponent_Template_0(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - Δelement(0, 'hooks'); + ɵɵelement(0, 'hooks'); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'name', Δbind('C')); + ɵɵelementProperty(0, 'name', ɵɵbind('C')); } } @@ -1662,7 +1662,7 @@ describe('ViewContainerRef', () => { ` }) class SomeComponent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: SomeComponent, selectors: [['some-comp']], factory: () => new SomeComponent(), @@ -1670,21 +1670,21 @@ describe('ViewContainerRef', () => { vars: 3, template: (rf: RenderFlags, cmp: SomeComponent) => { if (rf & RenderFlags.Create) { - Δtemplate( + ɵɵtemplate( 0, SomeComponent_Template_0, 1, 1, 'ng-template', [], ['foo', ''], - ΔtemplateRefExtractor); - Δelement(2, 'hooks', ['vcref', '']); - Δelement(3, 'hooks'); + ɵɵtemplateRefExtractor); + ɵɵelement(2, 'hooks', ['vcref', '']); + ɵɵelement(3, 'hooks'); } if (rf & RenderFlags.Update) { - const tplRef = Δreference(1); - ΔelementProperty(2, 'tplRef', Δbind(tplRef)); - ΔelementProperty(2, 'name', Δbind('A')); - ΔelementProperty(3, 'name', Δbind('B')); + const tplRef = ɵɵreference(1); + ɵɵelementProperty(2, 'tplRef', ɵɵbind(tplRef)); + ɵɵelementProperty(2, 'name', ɵɵbind('A')); + ɵɵelementProperty(3, 'name', ɵɵbind('B')); } }, directives: [ComponentWithHooks, DirectiveWithVCRef], - features: [ΔNgOnChangesFeature()], + features: [ɵɵNgOnChangesFeature()], }); } @@ -1759,7 +1759,7 @@ describe('ViewContainerRef', () => { ` }) class SomeComponent { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: SomeComponent, encapsulation: ViewEncapsulation.None, selectors: [['some-comp']], @@ -1768,16 +1768,16 @@ describe('ViewContainerRef', () => { vars: 2, template: (rf: RenderFlags, cmp: SomeComponent) => { if (rf & RenderFlags.Create) { - Δelement(0, 'hooks', ['vcref', '']); - Δelement(1, 'hooks'); + ɵɵelement(0, 'hooks', ['vcref', '']); + ɵɵelement(1, 'hooks'); } if (rf & RenderFlags.Update) { - ΔelementProperty(0, 'name', Δbind('A')); - ΔelementProperty(1, 'name', Δbind('B')); + ɵɵelementProperty(0, 'name', ɵɵbind('A')); + ɵɵelementProperty(1, 'name', ɵɵbind('B')); } }, directives: [ComponentWithHooks, DirectiveWithVCRef], - features: [ΔNgOnChangesFeature()], + features: [ɵɵNgOnChangesFeature()], }); } @@ -1856,7 +1856,7 @@ describe('ViewContainerRef', () => { class HostBindingCmpt { title = 'initial'; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: HostBindingCmpt, selectors: [['host-bindings']], factory: () => new HostBindingCmpt(), @@ -1865,11 +1865,11 @@ describe('ViewContainerRef', () => { template: (rf: RenderFlags, cmp: HostBindingCmpt) => {}, hostBindings: function(rf: RenderFlags, ctx: HostBindingCmpt, elIndex: number) { if (rf & RenderFlags.Create) { - ΔelementHostAttrs(['id', 'attribute']); - ΔallocHostVars(1); + ɵɵelementHostAttrs(['id', 'attribute']); + ɵɵallocHostVars(1); } if (rf & RenderFlags.Update) { - ΔelementProperty(elIndex, 'title', Δbind(ctx.title)); + ɵɵelementProperty(elIndex, 'title', ɵɵbind(ctx.title)); } }, }); @@ -1881,7 +1881,7 @@ describe('ViewContainerRef', () => { ` }) class AppCmpt { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: AppCmpt, selectors: [['app']], factory: () => new AppCmpt(), @@ -1889,7 +1889,7 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, cmp: AppCmpt) => { if (rf & RenderFlags.Create) { - Δtemplate(0, null, 0, 0, 'ng-template', ['vcref', '']); + ɵɵtemplate(0, null, 0, 0, 'ng-template', ['vcref', '']); } }, directives: [HostBindingCmpt, DirectiveWithVCRef] @@ -1916,11 +1916,11 @@ describe('ViewContainerRef', () => { @Component({selector: 'app', template: ''}) class AppCmpt { - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: AppCmpt, selectors: [['app']], factory: () => new AppCmpt( - ΔdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), + ɵɵdirectiveInject(ViewContainerRef as any), injectComponentFactoryResolver()), consts: 0, vars: 0, template: (rf: RenderFlags, cmp: AppCmpt) => {} @@ -1944,7 +1944,7 @@ describe('ViewContainerRef', () => { const DynamicComponent = createComponent('dynamic-cmpt', function(rf: RenderFlags, parent: any) { if (rf & RenderFlags.Create) { - Δtext(0, 'inserted dynamically'); + ɵɵtext(0, 'inserted dynamically'); } }, 1, 0); @@ -1984,7 +1984,7 @@ describe('ViewContainerRef', () => { ngDoCheck() { this.checkCount++; } /** check count: {{ checkCount }} */ - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: DynamicCompWithBindings, selectors: [['dynamic-cmpt-with-bindings']], factory: () => new DynamicCompWithBindings(), @@ -1992,10 +1992,10 @@ describe('ViewContainerRef', () => { vars: 1, template: (rf: RenderFlags, ctx: DynamicCompWithBindings) => { if (rf & RenderFlags.Create) { - Δtext(0); + ɵɵtext(0); } if (rf & RenderFlags.Update) { - ΔtextBinding(0, Δinterpolation1('check count: ', ctx.checkCount, '')); + ɵɵtextBinding(0, ɵɵinterpolation1('check count: ', ctx.checkCount, '')); } } }); @@ -2020,19 +2020,19 @@ describe('ViewContainerRef', () => { let name = 'text'; const Child = createComponent('child', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'div'); - { Δtext(1); } - ΔelementEnd(); + ɵɵelementStart(0, 'div'); + { ɵɵtext(1); } + ɵɵelementEnd(); } if (rf & RenderFlags.Update) { - ΔtextBinding(1, Δbind(name)); + ɵɵtextBinding(1, ɵɵbind(name)); } }, 2, 1); const DynamicCompWithChildren = createComponent('dynamic-cmpt-with-children', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - Δelement(0, 'child'); + ɵɵelement(0, 'child'); } }, 1, 0, [Child]); @@ -2058,7 +2058,7 @@ describe('ViewContainerRef', () => { // @ViewChildren('foo') foo !: QueryList; - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: DynamicCompWithViewQueries, selectors: [['dynamic-cmpt-with-view-queries']], factory: () => dynamicComp = new DynamicCompWithViewQueries(), @@ -2066,18 +2066,18 @@ describe('ViewContainerRef', () => { vars: 0, template: (rf: RenderFlags, ctx: DynamicCompWithViewQueries) => { if (rf & RenderFlags.Create) { - Δelement(0, 'div', ['bar', ''], ['foo', '']); + ɵɵelement(0, 'div', ['bar', ''], ['foo', '']); } // testing only fooEl = getNativeByIndex(0, getLView()) as RElement; }, viewQuery: function(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔviewQuery(['foo'], true, null); + ɵɵviewQuery(['foo'], true, null); } if (rf & RenderFlags.Update) { let tmp: any; - ΔqueryRefresh(tmp = ΔloadViewQuery>()) && + ɵɵqueryRefresh(tmp = ɵɵloadViewQuery>()) && (ctx.foo = tmp as QueryList); } } @@ -2102,7 +2102,7 @@ describe('ViewContainerRef', () => { ngOnDestroy() { this.viewRef.destroy(); } - static ngComponentDef = ΔdefineComponent({ + static ngComponentDef = ɵɵdefineComponent({ type: CompWithListenerThatDestroysItself, selectors: [['comp-with-listener-and-on-destroy']], consts: 2, @@ -2110,18 +2110,18 @@ describe('ViewContainerRef', () => { /** */ template: function CompTemplate(rf: RenderFlags, ctx: any) { if (rf & RenderFlags.Create) { - ΔelementStart(0, 'button'); + ɵɵelementStart(0, 'button'); { - Δlistener('click', function() { return ctx.onClick(); }); - Δtext(1, 'Click me'); + ɵɵlistener('click', function() { return ctx.onClick(); }); + ɵɵtext(1, 'Click me'); } - ΔelementEnd(); + ɵɵelementEnd(); } }, // We want the ViewRef, so we rely on the knowledge that `ViewRef` is actually given // when injecting `ChangeDetectorRef`. factory: () => new CompWithListenerThatDestroysItself( - ΔdirectiveInject(ChangeDetectorRef as any)), + ɵɵdirectiveInject(ChangeDetectorRef as any)), }); } @@ -2129,7 +2129,7 @@ describe('ViewContainerRef', () => { it('should not error when destroying a view with listeners twice', () => { const CompWithChildListener = createComponent('test-app', (rf: RenderFlags, ctx: any) => { if (rf & RenderFlags.Create) { - Δelement(0, 'comp-with-listener-and-on-destroy'); + ɵɵelement(0, 'comp-with-listener-and-on-destroy'); } }, 1, 0, [CompWithListenerThatDestroysItself]); diff --git a/packages/core/test/sanitization/sanatization_spec.ts b/packages/core/test/sanitization/sanatization_spec.ts index 2b5b2eee51..6c42ec2120 100644 --- a/packages/core/test/sanitization/sanatization_spec.ts +++ b/packages/core/test/sanitization/sanatization_spec.ts @@ -12,7 +12,7 @@ import {HEADER_OFFSET, LView} from '@angular/core/src/render3/interfaces/view'; import {setTNodeAndViewData} from '@angular/core/src/render3/state'; import {bypassSanitizationTrustHtml, bypassSanitizationTrustResourceUrl, bypassSanitizationTrustScript, bypassSanitizationTrustStyle, bypassSanitizationTrustUrl} from '../../src/sanitization/bypass'; -import {getUrlSanitizer, ΔsanitizeHtml, ΔsanitizeResourceUrl, ΔsanitizeScript, ΔsanitizeStyle, ΔsanitizeUrl, ΔsanitizeUrlOrResourceUrl} from '../../src/sanitization/sanitization'; +import {getUrlSanitizer, ɵɵsanitizeHtml, ɵɵsanitizeResourceUrl, ɵɵsanitizeScript, ɵɵsanitizeStyle, ɵɵsanitizeUrl, ɵɵsanitizeUrlOrResourceUrl} from '../../src/sanitization/sanitization'; import {SecurityContext} from '../../src/sanitization/security'; function fakeLView(): LView { @@ -27,54 +27,54 @@ describe('sanitization', () => { toString() { return this.value; } } it('should sanitize html', () => { - expect(ΔsanitizeHtml('
')).toEqual('
'); - expect(ΔsanitizeHtml(new Wrap('
'))).toEqual('
'); - expect(ΔsanitizeHtml('')) + expect(ɵɵsanitizeHtml('
')).toEqual('
'); + expect(ɵɵsanitizeHtml(new Wrap('
'))).toEqual('
'); + expect(ɵɵsanitizeHtml('')) .toEqual(''); - expect(ΔsanitizeHtml(new Wrap(''))) + expect(ɵɵsanitizeHtml(new Wrap(''))) .toEqual(''); - expect(ΔsanitizeHtml(bypassSanitizationTrustUrl(''))) + expect(ɵɵsanitizeHtml(bypassSanitizationTrustUrl(''))) .toEqual(''); - expect(ΔsanitizeHtml(bypassSanitizationTrustHtml(''))) + expect(ɵɵsanitizeHtml(bypassSanitizationTrustHtml(''))) .toEqual(''); }); it('should sanitize url', () => { - expect(ΔsanitizeUrl('http://server')).toEqual('http://server'); - expect(ΔsanitizeUrl(new Wrap('http://server'))).toEqual('http://server'); - expect(ΔsanitizeUrl('javascript:true')).toEqual('unsafe:javascript:true'); - expect(ΔsanitizeUrl(new Wrap('javascript:true'))).toEqual('unsafe:javascript:true'); - expect(ΔsanitizeUrl(bypassSanitizationTrustHtml('javascript:true'))) + expect(ɵɵsanitizeUrl('http://server')).toEqual('http://server'); + expect(ɵɵsanitizeUrl(new Wrap('http://server'))).toEqual('http://server'); + expect(ɵɵsanitizeUrl('javascript:true')).toEqual('unsafe:javascript:true'); + expect(ɵɵsanitizeUrl(new Wrap('javascript:true'))).toEqual('unsafe:javascript:true'); + expect(ɵɵsanitizeUrl(bypassSanitizationTrustHtml('javascript:true'))) .toEqual('unsafe:javascript:true'); - expect(ΔsanitizeUrl(bypassSanitizationTrustUrl('javascript:true'))).toEqual('javascript:true'); + expect(ɵɵsanitizeUrl(bypassSanitizationTrustUrl('javascript:true'))).toEqual('javascript:true'); }); it('should sanitize resourceUrl', () => { const ERROR = 'unsafe value used in a resource URL context (see http://g.co/ng/security#xss)'; - expect(() => ΔsanitizeResourceUrl('http://server')).toThrowError(ERROR); - expect(() => ΔsanitizeResourceUrl('javascript:true')).toThrowError(ERROR); - expect(() => ΔsanitizeResourceUrl(bypassSanitizationTrustHtml('javascript:true'))) + expect(() => ɵɵsanitizeResourceUrl('http://server')).toThrowError(ERROR); + expect(() => ɵɵsanitizeResourceUrl('javascript:true')).toThrowError(ERROR); + expect(() => ɵɵsanitizeResourceUrl(bypassSanitizationTrustHtml('javascript:true'))) .toThrowError(ERROR); - expect(ΔsanitizeResourceUrl(bypassSanitizationTrustResourceUrl('javascript:true'))) + expect(ɵɵsanitizeResourceUrl(bypassSanitizationTrustResourceUrl('javascript:true'))) .toEqual('javascript:true'); }); it('should sanitize style', () => { - expect(ΔsanitizeStyle('red')).toEqual('red'); - expect(ΔsanitizeStyle(new Wrap('red'))).toEqual('red'); - expect(ΔsanitizeStyle('url("http://server")')).toEqual('unsafe'); - expect(ΔsanitizeStyle(new Wrap('url("http://server")'))).toEqual('unsafe'); - expect(ΔsanitizeStyle(bypassSanitizationTrustHtml('url("http://server")'))).toEqual('unsafe'); - expect(ΔsanitizeStyle(bypassSanitizationTrustStyle('url("http://server")'))) + expect(ɵɵsanitizeStyle('red')).toEqual('red'); + expect(ɵɵsanitizeStyle(new Wrap('red'))).toEqual('red'); + expect(ɵɵsanitizeStyle('url("http://server")')).toEqual('unsafe'); + expect(ɵɵsanitizeStyle(new Wrap('url("http://server")'))).toEqual('unsafe'); + expect(ɵɵsanitizeStyle(bypassSanitizationTrustHtml('url("http://server")'))).toEqual('unsafe'); + expect(ɵɵsanitizeStyle(bypassSanitizationTrustStyle('url("http://server")'))) .toEqual('url("http://server")'); }); it('should sanitize script', () => { const ERROR = 'unsafe value used in a script context'; - expect(() => ΔsanitizeScript('true')).toThrowError(ERROR); - expect(() => ΔsanitizeScript('true')).toThrowError(ERROR); - expect(() => ΔsanitizeScript(bypassSanitizationTrustHtml('true'))).toThrowError(ERROR); - expect(ΔsanitizeScript(bypassSanitizationTrustScript('true'))).toEqual('true'); + expect(() => ɵɵsanitizeScript('true')).toThrowError(ERROR); + expect(() => ɵɵsanitizeScript('true')).toThrowError(ERROR); + expect(() => ɵɵsanitizeScript(bypassSanitizationTrustHtml('true'))).toThrowError(ERROR); + expect(ɵɵsanitizeScript(bypassSanitizationTrustScript('true'))).toEqual('true'); }); it('should select correct sanitizer for URL props', () => { @@ -83,7 +83,7 @@ describe('sanitization', () => { const schema = SECURITY_SCHEMA(); const contextsByProp: Map> = new Map(); const sanitizerNameByContext: Map = new Map([ - [SecurityContext.URL, ΔsanitizeUrl], [SecurityContext.RESOURCE_URL, ΔsanitizeResourceUrl] + [SecurityContext.URL, ɵɵsanitizeUrl], [SecurityContext.RESOURCE_URL, ɵɵsanitizeResourceUrl] ]); Object.keys(schema).forEach(key => { const context = schema[key]; @@ -102,28 +102,29 @@ describe('sanitization', () => { it('should sanitize resourceUrls via sanitizeUrlOrResourceUrl', () => { const ERROR = 'unsafe value used in a resource URL context (see http://g.co/ng/security#xss)'; - expect(() => ΔsanitizeUrlOrResourceUrl('http://server', 'iframe', 'src')).toThrowError(ERROR); - expect(() => ΔsanitizeUrlOrResourceUrl('javascript:true', 'iframe', 'src')).toThrowError(ERROR); + expect(() => ɵɵsanitizeUrlOrResourceUrl('http://server', 'iframe', 'src')).toThrowError(ERROR); + expect(() => ɵɵsanitizeUrlOrResourceUrl('javascript:true', 'iframe', 'src')) + .toThrowError(ERROR); expect( - () => ΔsanitizeUrlOrResourceUrl( + () => ɵɵsanitizeUrlOrResourceUrl( bypassSanitizationTrustHtml('javascript:true'), 'iframe', 'src')) .toThrowError(ERROR); - expect(ΔsanitizeUrlOrResourceUrl( + expect(ɵɵsanitizeUrlOrResourceUrl( bypassSanitizationTrustResourceUrl('javascript:true'), 'iframe', 'src')) .toEqual('javascript:true'); }); it('should sanitize urls via sanitizeUrlOrResourceUrl', () => { - expect(ΔsanitizeUrlOrResourceUrl('http://server', 'a', 'href')).toEqual('http://server'); - expect(ΔsanitizeUrlOrResourceUrl(new Wrap('http://server'), 'a', 'href')) + expect(ɵɵsanitizeUrlOrResourceUrl('http://server', 'a', 'href')).toEqual('http://server'); + expect(ɵɵsanitizeUrlOrResourceUrl(new Wrap('http://server'), 'a', 'href')) .toEqual('http://server'); - expect(ΔsanitizeUrlOrResourceUrl('javascript:true', 'a', 'href')) + expect(ɵɵsanitizeUrlOrResourceUrl('javascript:true', 'a', 'href')) .toEqual('unsafe:javascript:true'); - expect(ΔsanitizeUrlOrResourceUrl(new Wrap('javascript:true'), 'a', 'href')) + expect(ɵɵsanitizeUrlOrResourceUrl(new Wrap('javascript:true'), 'a', 'href')) .toEqual('unsafe:javascript:true'); - expect(ΔsanitizeUrlOrResourceUrl(bypassSanitizationTrustHtml('javascript:true'), 'a', 'href')) + expect(ɵɵsanitizeUrlOrResourceUrl(bypassSanitizationTrustHtml('javascript:true'), 'a', 'href')) .toEqual('unsafe:javascript:true'); - expect(ΔsanitizeUrlOrResourceUrl(bypassSanitizationTrustUrl('javascript:true'), 'a', 'href')) + expect(ɵɵsanitizeUrlOrResourceUrl(bypassSanitizationTrustUrl('javascript:true'), 'a', 'href')) .toEqual('javascript:true'); }); }); diff --git a/packages/core/test/strict_types/inheritance_spec.ts b/packages/core/test/strict_types/inheritance_spec.ts index 39693adc84..b1b5261bd5 100644 --- a/packages/core/test/strict_types/inheritance_spec.ts +++ b/packages/core/test/strict_types/inheritance_spec.ts @@ -6,10 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {ΔComponentDefWithMeta, ΔPipeDefWithMeta as PipeDefWithMeta} from '@angular/core'; +import {ɵɵComponentDefWithMeta, ɵɵPipeDefWithMeta as PipeDefWithMeta} from '@angular/core'; declare class SuperComponent { - static ngComponentDef: ΔComponentDefWithMeta; + static ngComponentDef: ɵɵComponentDefWithMeta; } declare class SubComponent extends SuperComponent { @@ -18,7 +18,7 @@ declare class SubComponent extends SuperComponent { // would produce type errors when the "strictFunctionTypes" option is enabled. onlyInSubtype: string; - static ngComponentDef: ΔComponentDefWithMeta; + static ngComponentDef: ɵɵComponentDefWithMeta; } declare class SuperPipe { static ngPipeDef: PipeDefWithMeta; } diff --git a/packages/core/test/test_bed_spec.ts b/packages/core/test/test_bed_spec.ts index ecae7a035d..0070e06797 100644 --- a/packages/core/test/test_bed_spec.ts +++ b/packages/core/test/test_bed_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, Directive, ErrorHandler, Inject, Injectable, InjectionToken, NgModule, Optional, Pipe, ɵsetClassMetadata as setClassMetadata, ΔdefineComponent as defineComponent, Δtext as text} from '@angular/core'; +import {Component, Directive, ErrorHandler, Inject, Injectable, InjectionToken, NgModule, Optional, Pipe, ɵsetClassMetadata as setClassMetadata, ɵɵdefineComponent as defineComponent, ɵɵtext as text} from '@angular/core'; import {TestBed, getTestBed} from '@angular/core/testing/src/test_bed'; import {By} from '@angular/platform-browser'; import {expect} from '@angular/platform-browser/testing/src/matchers'; diff --git a/packages/core/test/view/ng_module_spec.ts b/packages/core/test/view/ng_module_spec.ts index fe8e7bae96..88b85f4441 100644 --- a/packages/core/test/view/ng_module_spec.ts +++ b/packages/core/test/view/ng_module_spec.ts @@ -9,7 +9,7 @@ import {NgModuleRef} from '@angular/core'; import {InjectFlags, inject} from '@angular/core/src/di'; import {INJECTOR, Injector} from '@angular/core/src/di/injector'; -import {ΔInjectableDef, ΔdefineInjectable} from '@angular/core/src/di/interface/defs'; +import {ɵɵInjectableDef, ɵɵdefineInjectable} from '@angular/core/src/di/interface/defs'; import {NgModuleDefinition, NgModuleProviderDef, NodeFlags} from '@angular/core/src/view'; import {moduleDef} from '@angular/core/src/view/ng_module'; import {createNgModuleRef} from '@angular/core/src/view/refs'; @@ -26,14 +26,14 @@ class MyChildModule {} class NotMyModule {} class Bar { - static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ + static ngInjectableDef: ɵɵInjectableDef = ɵɵdefineInjectable({ factory: () => new Bar(), providedIn: MyModule, }); } class Baz { - static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ + static ngInjectableDef: ɵɵInjectableDef = ɵɵdefineInjectable({ factory: () => new Baz(), providedIn: NotMyModule, }); @@ -42,7 +42,7 @@ class Baz { class HasNormalDep { constructor(public foo: Foo) {} - static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ + static ngInjectableDef: ɵɵInjectableDef = ɵɵdefineInjectable({ factory: () => new HasNormalDep(inject(Foo)), providedIn: MyModule, }); @@ -51,7 +51,7 @@ class HasNormalDep { class HasDefinedDep { constructor(public bar: Bar) {} - static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ + static ngInjectableDef: ɵɵInjectableDef = ɵɵdefineInjectable({ factory: () => new HasDefinedDep(inject(Bar)), providedIn: MyModule, }); @@ -60,14 +60,14 @@ class HasDefinedDep { class HasOptionalDep { constructor(public baz: Baz|null) {} - static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ + static ngInjectableDef: ɵɵInjectableDef = ɵɵdefineInjectable({ factory: () => new HasOptionalDep(inject(Baz, InjectFlags.Optional)), providedIn: MyModule, }); } class ChildDep { - static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ + static ngInjectableDef: ɵɵInjectableDef = ɵɵdefineInjectable({ factory: () => new ChildDep(), providedIn: MyChildModule, }); @@ -75,7 +75,7 @@ class ChildDep { class FromChildWithOptionalDep { constructor(public baz: Baz|null) {} - static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ + static ngInjectableDef: ɵɵInjectableDef = ɵɵdefineInjectable({ factory: () => new FromChildWithOptionalDep(inject(Baz, InjectFlags.Default)), providedIn: MyChildModule, }); @@ -85,7 +85,7 @@ class FromChildWithSkipSelfDep { constructor( public skipSelfChildDep: ChildDep|null, public selfChildDep: ChildDep|null, public optionalSelfBar: Bar|null) {} - static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ + static ngInjectableDef: ɵɵInjectableDef = ɵɵdefineInjectable({ factory: () => new FromChildWithSkipSelfDep( inject(ChildDep, InjectFlags.SkipSelf|InjectFlags.Optional), inject(ChildDep, InjectFlags.Self), @@ -208,7 +208,7 @@ describe('NgModuleRef_ injector', () => { ngOnDestroy(): void { Service.destroyed++; } - static ngInjectableDef: ΔInjectableDef = ΔdefineInjectable({ + static ngInjectableDef: ɵɵInjectableDef = ɵɵdefineInjectable({ factory: () => new Service(), providedIn: 'root', }); diff --git a/packages/core/testing/src/r3_test_bed_compiler.ts b/packages/core/testing/src/r3_test_bed_compiler.ts index 8fdb0b4873..b5222215ac 100644 --- a/packages/core/testing/src/r3_test_bed_compiler.ts +++ b/packages/core/testing/src/r3_test_bed_compiler.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ApplicationInitStatus, COMPILER_OPTIONS, Compiler, Component, Directive, ErrorHandler, ModuleWithComponentFactories, NgModule, NgModuleFactory, NgZone, Injector, Pipe, PlatformRef, Provider, Type, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, ɵNG_MODULE_DEF as NG_MODULE_DEF, ɵNG_PIPE_DEF as NG_PIPE_DEF, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ΔInjectableDef as InjectableDef, ɵNgModuleFactory as R3NgModuleFactory, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵDirectiveDef as DirectiveDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵtransitiveScopesFor as transitiveScopesFor,} from '@angular/core'; +import {ApplicationInitStatus, COMPILER_OPTIONS, Compiler, Component, Directive, ErrorHandler, ModuleWithComponentFactories, NgModule, NgModuleFactory, NgZone, Injector, Pipe, PlatformRef, Provider, Type, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, ɵNG_MODULE_DEF as NG_MODULE_DEF, ɵNG_PIPE_DEF as NG_PIPE_DEF, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ɵɵInjectableDef as InjectableDef, ɵNgModuleFactory as R3NgModuleFactory, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵDirectiveDef as DirectiveDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵtransitiveScopesFor as transitiveScopesFor,} from '@angular/core'; import {ResourceLoader} from '@angular/compiler'; import {clearResolutionOfComponentResourcesQueue, restoreComponentResolutionQueue, resolveComponentResources, isComponentDefPendingResolution} from '../../src/metadata/resource_loading'; diff --git a/packages/core/testing/src/test_bed.ts b/packages/core/testing/src/test_bed.ts index 880e1ae3da..77961d62bb 100644 --- a/packages/core/testing/src/test_bed.ts +++ b/packages/core/testing/src/test_bed.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ApplicationInitStatus, CompilerOptions, Component, Directive, InjectFlags, InjectionToken, Injector, NgModule, NgModuleFactory, NgModuleRef, NgZone, Optional, Pipe, PlatformRef, Provider, SchemaMetadata, SkipSelf, StaticProvider, Type, ɵAPP_ROOT as APP_ROOT, ɵDepFlags as DepFlags, ɵNodeFlags as NodeFlags, ɵclearOverrides as clearOverrides, ɵgetInjectableDef as getInjectableDef, ɵivyEnabled as ivyEnabled, ɵoverrideComponentView as overrideComponentView, ɵoverrideProvider as overrideProvider, ɵstringify as stringify, ΔInjectableDef} from '@angular/core'; +import {ApplicationInitStatus, CompilerOptions, Component, Directive, InjectFlags, InjectionToken, Injector, NgModule, NgModuleFactory, NgModuleRef, NgZone, Optional, Pipe, PlatformRef, Provider, SchemaMetadata, SkipSelf, StaticProvider, Type, ɵAPP_ROOT as APP_ROOT, ɵDepFlags as DepFlags, ɵNodeFlags as NodeFlags, ɵclearOverrides as clearOverrides, ɵgetInjectableDef as getInjectableDef, ɵivyEnabled as ivyEnabled, ɵoverrideComponentView as overrideComponentView, ɵoverrideProvider as overrideProvider, ɵstringify as stringify, ɵɵInjectableDef} from '@angular/core'; import {AsyncTestCompleter} from './async_test_completer'; import {ComponentFixture} from './component_fixture'; @@ -559,7 +559,7 @@ export class TestBedViewEngine implements Injector, TestBed { deps?: any[], }, deprecated = false): void { - let def: ΔInjectableDef|null = null; + let def: ɵɵInjectableDef|null = null; if (typeof token !== 'string' && (def = getInjectableDef(token)) && def.providedIn === 'root') { if (provider.useFactory) { this._rootProviderOverrides.push( diff --git a/packages/platform-browser/src/browser/meta.ts b/packages/platform-browser/src/browser/meta.ts index e32b984a46..eb8ad345d3 100644 --- a/packages/platform-browser/src/browser/meta.ts +++ b/packages/platform-browser/src/browser/meta.ts @@ -7,7 +7,7 @@ */ import {DOCUMENT} from '@angular/common'; -import {Inject, Injectable, Δinject} from '@angular/core'; +import {Inject, Injectable, ɵɵinject} from '@angular/core'; import {DomAdapter, getDOM} from '../dom/dom_adapter'; @@ -34,7 +34,7 @@ export type MetaDefinition = { * Factory to create Meta service. */ export function createMeta() { - return new Meta(Δinject(DOCUMENT)); + return new Meta(ɵɵinject(DOCUMENT)); } /** diff --git a/packages/platform-browser/src/browser/title.ts b/packages/platform-browser/src/browser/title.ts index a5f7b807fa..623f2f8ea8 100644 --- a/packages/platform-browser/src/browser/title.ts +++ b/packages/platform-browser/src/browser/title.ts @@ -7,7 +7,7 @@ */ import {DOCUMENT} from '@angular/common'; -import {Inject, Injectable, Δinject} from '@angular/core'; +import {Inject, Injectable, ɵɵinject} from '@angular/core'; import {getDOM} from '../dom/dom_adapter'; @@ -15,7 +15,7 @@ import {getDOM} from '../dom/dom_adapter'; * Factory to create Title service. */ export function createTitle() { - return new Title(Δinject(DOCUMENT)); + return new Title(ɵɵinject(DOCUMENT)); } /** diff --git a/tools/public_api_guard/core/core.d.ts b/tools/public_api_guard/core/core.d.ts index a38bf4a5e3..74f2fd5e9b 100644 --- a/tools/public_api_guard/core/core.d.ts +++ b/tools/public_api_guard/core/core.d.ts @@ -260,7 +260,7 @@ export declare class DefaultIterableDiffer implements IterableDiffer, Iter } /** @deprecated */ -export declare const defineInjectable: typeof ΔdefineInjectable; +export declare const defineInjectable: typeof ɵɵdefineInjectable; export declare function destroyPlatform(): void; @@ -378,7 +378,7 @@ export interface HostListenerDecorator { } /** @deprecated */ -export declare const inject: typeof Δinject; +export declare const inject: typeof ɵɵinject; export interface Inject { token: any; @@ -653,6 +653,369 @@ export interface OutputDecorator { new (bindingPropertyName?: string): any; } +export declare function ɵɵallocHostVars(count: number): void; + +export interface ɵɵBaseDef { + /** @deprecated */ readonly declaredInputs: { + [P in keyof T]: string; + }; + readonly inputs: { + [P in keyof T]: string; + }; + readonly outputs: { + [P in keyof T]: string; + }; +} + +export declare function ɵɵbind(value: T): T | NO_CHANGE; + +export declare type ɵɵComponentDefWithMeta = ComponentDef; + +export declare function ɵɵcomponentHostSyntheticListener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void; + +export declare function ɵɵcomponentHostSyntheticProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void; + +export declare function ɵɵcontainer(index: number): void; + +export declare function ɵɵcontainerRefreshEnd(): void; + +export declare function ɵɵcontainerRefreshStart(index: number): void; + +export declare function ɵɵcontentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): QueryList; + +export declare const ɵɵdefaultStyleSanitizer: StyleSanitizeFn; + +export declare function ɵɵdefineBase(baseDefinition: { + inputs?: { + [P in keyof T]?: string | [string, string]; + }; + outputs?: { + [P in keyof T]?: string; + }; +}): ɵɵBaseDef; + +export declare function ɵɵdefineComponent(componentDefinition: { + type: Type; + selectors: CssSelectorList; + factory: FactoryFn; + consts: number; + vars: number; + inputs?: { + [P in keyof T]?: string | [string, string]; + }; + outputs?: { + [P in keyof T]?: string; + }; + hostBindings?: HostBindingsFunction; + contentQueries?: ContentQueriesFunction; + exportAs?: string[]; + template: ComponentTemplate; + ngContentSelectors?: string[]; + viewQuery?: ViewQueriesFunction | null; + features?: ComponentDefFeature[]; + encapsulation?: ViewEncapsulation; + data?: { + [kind: string]: any; + }; + styles?: string[]; + changeDetection?: ChangeDetectionStrategy; + directives?: DirectiveTypesOrFactory | null; + pipes?: PipeTypesOrFactory | null; + schemas?: SchemaMetadata[] | null; +}): never; + +export declare const ɵɵdefineDirective: (directiveDefinition: { + type: Type; + selectors: (string | SelectorFlags)[][]; + factory: FactoryFn; + inputs?: { [P in keyof T]?: string | [string, string] | undefined; } | undefined; + outputs?: { [P in keyof T]?: string | undefined; } | undefined; + features?: DirectiveDefFeature[] | undefined; + hostBindings?: HostBindingsFunction | undefined; + contentQueries?: ContentQueriesFunction | undefined; + viewQuery?: ViewQueriesFunction | null | undefined; + exportAs?: string[] | undefined; +}) => never; + +export declare function ɵɵdefineInjectable(opts: { + providedIn?: Type | 'root' | 'any' | null; + factory: () => T; +}): never; + +export declare function ɵɵdefineInjector(options: { + factory: () => any; + providers?: any[]; + imports?: any[]; +}): never; + +export declare function ɵɵdefineNgModule(def: { + type: T; + bootstrap?: Type[] | (() => Type[]); + declarations?: Type[] | (() => Type[]); + imports?: Type[] | (() => Type[]); + exports?: Type[] | (() => Type[]); + schemas?: SchemaMetadata[] | null; +}): never; + +export declare function ɵɵdefinePipe(pipeDef: { + name: string; + type: Type; + factory: FactoryFn; + pure?: boolean; +}): never; + +export declare type ɵɵDirectiveDefWithMeta = DirectiveDef; + +export declare function ɵɵdirectiveInject(token: Type | InjectionToken): T; +export declare function ɵɵdirectiveInject(token: Type | InjectionToken, flags: InjectFlags): T; + +export declare function ɵɵdisableBindings(): void; + +export declare function ɵɵelement(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void; + +export declare function ɵɵelementAttribute(index: number, name: string, value: any, sanitizer?: SanitizerFn | null, namespace?: string): void; + +export declare function ɵɵelementClassProp(index: number, classIndex: number, value: boolean | PlayerFactory, forceOverride?: boolean): void; + +export declare function ɵɵelementContainerEnd(): void; + +export declare function ɵɵelementContainerStart(index: number, attrs?: TAttributes | null, localRefs?: string[] | null): void; + +export declare function ɵɵelementEnd(): void; + +export declare function ɵɵelementHostAttrs(attrs: TAttributes): void; + +export declare function ɵɵelementHostClassProp(classIndex: number, value: boolean | PlayerFactory, forceOverride?: boolean): void; + +export declare function ɵɵelementHostStyleProp(styleIndex: number, value: string | number | String | PlayerFactory | null, suffix?: string | null, forceOverride?: boolean): void; + +export declare function ɵɵelementHostStyling(classBindingNames?: string[] | null, styleBindingNames?: string[] | null, styleSanitizer?: StyleSanitizeFn | null): void; + +export declare function ɵɵelementHostStylingApply(): void; + +export declare function ɵɵelementHostStylingMap(classes: { + [key: string]: any; +} | string | NO_CHANGE | null, styles?: { + [styleName: string]: any; +} | NO_CHANGE | null): void; + +export declare function ɵɵelementProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void; + +export declare function ɵɵelementStart(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void; + +export declare function ɵɵelementStyleProp(index: number, styleIndex: number, value: string | number | String | PlayerFactory | null, suffix?: string | null, forceOverride?: boolean): void; + +export declare function ɵɵelementStyling(classBindingNames?: string[] | null, styleBindingNames?: string[] | null, styleSanitizer?: StyleSanitizeFn | null): void; + +export declare function ɵɵelementStylingApply(index: number): void; + +export declare function ɵɵelementStylingMap(index: number, classes: { + [key: string]: any; +} | string | NO_CHANGE | null, styles?: { + [styleName: string]: any; +} | NO_CHANGE | null): void; + +export declare function ɵɵembeddedViewEnd(): void; + +export declare function ɵɵembeddedViewStart(viewBlockId: number, consts: number, vars: number): RenderFlags; + +export declare function ɵɵenableBindings(): void; + +export declare function ɵɵgetCurrentView(): OpaqueViewState; + +export declare function ɵɵgetFactoryOf(type: Type): ((type: Type | null) => T) | null; + +export declare function ɵɵgetInheritedFactory(type: Type): (type: Type) => T; + +export declare function ɵɵi18n(index: number, message: string, subTemplateIndex?: number): void; + +export declare function ɵɵi18nApply(index: number): void; + +export declare function ɵɵi18nAttributes(index: number, values: string[]): void; + +export declare function ɵɵi18nEnd(): void; + +export declare function ɵɵi18nExp(expression: T | NO_CHANGE): void; + +/** @deprecated */ +export declare function ɵɵi18nLocalize(input: string, placeholders?: { + [key: string]: string; +}): string; + +export declare function ɵɵi18nPostprocess(message: string, replacements?: { + [key: string]: (string | string[]); +}): string; + +export declare function ɵɵi18nStart(index: number, message: string, subTemplateIndex?: number): void; + +export declare function ɵɵInheritDefinitionFeature(definition: DirectiveDef | ComponentDef): void; + +export declare function ɵɵinject(token: Type | InjectionToken): T; +export declare function ɵɵinject(token: Type | InjectionToken, flags?: InjectFlags): T | null; + +export interface ɵɵInjectableDef { + factory: () => T; + providedIn: InjectorType | 'root' | 'any' | null; + value: T | undefined; +} + +export declare function ɵɵinjectAttribute(attrNameToInject: string): string | null; + +export interface ɵɵInjectorDef { + factory: () => T; + imports: (InjectorType | InjectorTypeWithProviders)[]; + providers: (Type | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | any[])[]; +} + +export declare function ɵɵinterpolation1(prefix: string, v0: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation2(prefix: string, v0: any, i0: string, v1: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation3(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation4(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation5(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation6(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation7(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolation8(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string): string | NO_CHANGE; + +export declare function ɵɵinterpolationV(values: any[]): string | NO_CHANGE; + +export declare function ɵɵlistener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void; + +export declare function ɵɵload(index: number): T; + +export declare function ɵɵloadContentQuery(): QueryList; + +export declare function ɵɵloadViewQuery(): T; + +export declare function ɵɵnamespaceHTML(): void; + +export declare function ɵɵnamespaceMathML(): void; + +export declare function ɵɵnamespaceSVG(): void; + +export declare function ɵɵnextContext(level?: number): T; + +export declare type ɵɵNgModuleDefWithMeta = NgModuleDef; + +export declare function ɵɵNgOnChangesFeature(): DirectiveDefFeature; + +export declare function ɵɵpipe(index: number, pipeName: string): any; + +export declare function ɵɵpipeBind1(index: number, slotOffset: number, v1: any): any; + +export declare function ɵɵpipeBind2(index: number, slotOffset: number, v1: any, v2: any): any; + +export declare function ɵɵpipeBind3(index: number, slotOffset: number, v1: any, v2: any, v3: any): any; + +export declare function ɵɵpipeBind4(index: number, slotOffset: number, v1: any, v2: any, v3: any, v4: any): any; + +export declare function ɵɵpipeBindV(index: number, slotOffset: number, values: any[]): any; + +export declare type ɵɵPipeDefWithMeta = PipeDef; + +export declare function ɵɵprojection(nodeIndex: number, selectorIndex?: number, attrs?: TAttributes): void; + +export declare function ɵɵprojectionDef(selectors?: CssSelectorList[]): void; + +export declare function ɵɵProvidersFeature(providers: Provider[], viewProviders?: Provider[]): (definition: DirectiveDef) => void; + +export declare function ɵɵpureFunction0(slotOffset: number, pureFn: () => T, thisArg?: any): T; + +export declare function ɵɵpureFunction1(slotOffset: number, pureFn: (v: any) => any, exp: any, thisArg?: any): any; + +export declare function ɵɵpureFunction2(slotOffset: number, pureFn: (v1: any, v2: any) => any, exp1: any, exp2: any, thisArg?: any): any; + +export declare function ɵɵpureFunction3(slotOffset: number, pureFn: (v1: any, v2: any, v3: any) => any, exp1: any, exp2: any, exp3: any, thisArg?: any): any; + +export declare function ɵɵpureFunction4(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, thisArg?: any): any; + +export declare function ɵɵpureFunction5(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, thisArg?: any): any; + +export declare function ɵɵpureFunction6(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, thisArg?: any): any; + +export declare function ɵɵpureFunction7(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, thisArg?: any): any; + +export declare function ɵɵpureFunction8(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any, v8: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, exp8: any, thisArg?: any): any; + +export declare function ɵɵpureFunctionV(slotOffset: number, pureFn: (...v: any[]) => any, exps: any[], thisArg?: any): any; + +export declare function ɵɵqueryRefresh(queryList: QueryList): boolean; + +export declare function ɵɵreference(index: number): T; + +export declare function ɵɵresolveBody(element: RElement & { + ownerDocument: Document; +}): { + name: string; + target: HTMLElement; +}; + +export declare function ɵɵresolveDocument(element: RElement & { + ownerDocument: Document; +}): { + name: string; + target: Document; +}; + +export declare function ɵɵresolveWindow(element: RElement & { + ownerDocument: Document; +}): { + name: string; + target: Window | null; +}; + +export declare function ɵɵrestoreView(viewToRestore: OpaqueViewState): void; + +export declare function ɵɵsanitizeHtml(unsafeHtml: any): string; + +export declare function ɵɵsanitizeResourceUrl(unsafeResourceUrl: any): string; + +export declare function ɵɵsanitizeScript(unsafeScript: any): string; + +export declare function ɵɵsanitizeStyle(unsafeStyle: any): string; + +export declare function ɵɵsanitizeUrl(unsafeUrl: any): string; + +export declare function ɵɵsanitizeUrlOrResourceUrl(unsafeUrl: any, tag: string, prop: string): any; + +export declare function ɵɵselect(index: number): void; + +export declare function ɵɵsetComponentScope(type: ComponentType, directives: Type[], pipes: Type[]): void; + +export declare function ɵɵsetNgModuleScope(type: any, scope: { + declarations?: Type[] | (() => Type[]); + imports?: Type[] | (() => Type[]); + exports?: Type[] | (() => Type[]); +}): void; + +export declare function ɵɵstaticContentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): void; + +export declare function ɵɵstaticViewQuery(predicate: Type | string[], descend: boolean, read: any): void; + +export declare function ɵɵtemplate(index: number, templateFn: ComponentTemplate | null, consts: number, vars: number, tagName?: string | null, attrs?: TAttributes | null, localRefs?: string[] | null, localRefExtractor?: LocalRefExtractor): void; + +export declare function ɵɵtemplateRefExtractor(tNode: TNode, currentView: LView): ViewEngine_TemplateRef<{}> | null; + +export declare function ɵɵtext(index: number, value?: any): void; + +export declare function ɵɵtextBinding(index: number, value: T | NO_CHANGE): void; + +export declare function ɵɵviewQuery(predicate: Type | string[], descend: boolean, read: any): QueryList; + export declare const PACKAGE_ROOT_URL: InjectionToken; export interface Pipe { @@ -1043,366 +1406,3 @@ export interface WtfScopeFn { } export declare const wtfStartTimeRange: (rangeType: string, action: string) => any; - -export declare function ΔallocHostVars(count: number): void; - -export interface ΔBaseDef { - /** @deprecated */ readonly declaredInputs: { - [P in keyof T]: string; - }; - readonly inputs: { - [P in keyof T]: string; - }; - readonly outputs: { - [P in keyof T]: string; - }; -} - -export declare function Δbind(value: T): T | NO_CHANGE; - -export declare type ΔComponentDefWithMeta = ComponentDef; - -export declare function ΔcomponentHostSyntheticListener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void; - -export declare function ΔcomponentHostSyntheticProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void; - -export declare function Δcontainer(index: number): void; - -export declare function ΔcontainerRefreshEnd(): void; - -export declare function ΔcontainerRefreshStart(index: number): void; - -export declare function ΔcontentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): QueryList; - -export declare const ΔdefaultStyleSanitizer: StyleSanitizeFn; - -export declare function ΔdefineBase(baseDefinition: { - inputs?: { - [P in keyof T]?: string | [string, string]; - }; - outputs?: { - [P in keyof T]?: string; - }; -}): ΔBaseDef; - -export declare function ΔdefineComponent(componentDefinition: { - type: Type; - selectors: CssSelectorList; - factory: FactoryFn; - consts: number; - vars: number; - inputs?: { - [P in keyof T]?: string | [string, string]; - }; - outputs?: { - [P in keyof T]?: string; - }; - hostBindings?: HostBindingsFunction; - contentQueries?: ContentQueriesFunction; - exportAs?: string[]; - template: ComponentTemplate; - ngContentSelectors?: string[]; - viewQuery?: ViewQueriesFunction | null; - features?: ComponentDefFeature[]; - encapsulation?: ViewEncapsulation; - data?: { - [kind: string]: any; - }; - styles?: string[]; - changeDetection?: ChangeDetectionStrategy; - directives?: DirectiveTypesOrFactory | null; - pipes?: PipeTypesOrFactory | null; - schemas?: SchemaMetadata[] | null; -}): never; - -export declare const ΔdefineDirective: (directiveDefinition: { - type: Type; - selectors: (string | SelectorFlags)[][]; - factory: FactoryFn; - inputs?: { [P in keyof T]?: string | [string, string] | undefined; } | undefined; - outputs?: { [P in keyof T]?: string | undefined; } | undefined; - features?: DirectiveDefFeature[] | undefined; - hostBindings?: HostBindingsFunction | undefined; - contentQueries?: ContentQueriesFunction | undefined; - viewQuery?: ViewQueriesFunction | null | undefined; - exportAs?: string[] | undefined; -}) => never; - -export declare function ΔdefineInjectable(opts: { - providedIn?: Type | 'root' | 'any' | null; - factory: () => T; -}): never; - -export declare function ΔdefineInjector(options: { - factory: () => any; - providers?: any[]; - imports?: any[]; -}): never; - -export declare function ΔdefineNgModule(def: { - type: T; - bootstrap?: Type[] | (() => Type[]); - declarations?: Type[] | (() => Type[]); - imports?: Type[] | (() => Type[]); - exports?: Type[] | (() => Type[]); - schemas?: SchemaMetadata[] | null; -}): never; - -export declare function ΔdefinePipe(pipeDef: { - name: string; - type: Type; - factory: FactoryFn; - pure?: boolean; -}): never; - -export declare type ΔDirectiveDefWithMeta = DirectiveDef; - -export declare function ΔdirectiveInject(token: Type | InjectionToken): T; -export declare function ΔdirectiveInject(token: Type | InjectionToken, flags: InjectFlags): T; - -export declare function ΔdisableBindings(): void; - -export declare function Δelement(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void; - -export declare function ΔelementAttribute(index: number, name: string, value: any, sanitizer?: SanitizerFn | null, namespace?: string): void; - -export declare function ΔelementClassProp(index: number, classIndex: number, value: boolean | PlayerFactory, forceOverride?: boolean): void; - -export declare function ΔelementContainerEnd(): void; - -export declare function ΔelementContainerStart(index: number, attrs?: TAttributes | null, localRefs?: string[] | null): void; - -export declare function ΔelementEnd(): void; - -export declare function ΔelementHostAttrs(attrs: TAttributes): void; - -export declare function ΔelementHostClassProp(classIndex: number, value: boolean | PlayerFactory, forceOverride?: boolean): void; - -export declare function ΔelementHostStyleProp(styleIndex: number, value: string | number | String | PlayerFactory | null, suffix?: string | null, forceOverride?: boolean): void; - -export declare function ΔelementHostStyling(classBindingNames?: string[] | null, styleBindingNames?: string[] | null, styleSanitizer?: StyleSanitizeFn | null): void; - -export declare function ΔelementHostStylingApply(): void; - -export declare function ΔelementHostStylingMap(classes: { - [key: string]: any; -} | string | NO_CHANGE | null, styles?: { - [styleName: string]: any; -} | NO_CHANGE | null): void; - -export declare function ΔelementProperty(index: number, propName: string, value: T | NO_CHANGE, sanitizer?: SanitizerFn | null, nativeOnly?: boolean): void; - -export declare function ΔelementStart(index: number, name: string, attrs?: TAttributes | null, localRefs?: string[] | null): void; - -export declare function ΔelementStyleProp(index: number, styleIndex: number, value: string | number | String | PlayerFactory | null, suffix?: string | null, forceOverride?: boolean): void; - -export declare function ΔelementStyling(classBindingNames?: string[] | null, styleBindingNames?: string[] | null, styleSanitizer?: StyleSanitizeFn | null): void; - -export declare function ΔelementStylingApply(index: number): void; - -export declare function ΔelementStylingMap(index: number, classes: { - [key: string]: any; -} | string | NO_CHANGE | null, styles?: { - [styleName: string]: any; -} | NO_CHANGE | null): void; - -export declare function ΔembeddedViewEnd(): void; - -export declare function ΔembeddedViewStart(viewBlockId: number, consts: number, vars: number): RenderFlags; - -export declare function ΔenableBindings(): void; - -export declare function ΔgetCurrentView(): OpaqueViewState; - -export declare function ΔgetFactoryOf(type: Type): ((type: Type | null) => T) | null; - -export declare function ΔgetInheritedFactory(type: Type): (type: Type) => T; - -export declare function Δi18n(index: number, message: string, subTemplateIndex?: number): void; - -export declare function Δi18nApply(index: number): void; - -export declare function Δi18nAttributes(index: number, values: string[]): void; - -export declare function Δi18nEnd(): void; - -export declare function Δi18nExp(expression: T | NO_CHANGE): void; - -/** @deprecated */ -export declare function Δi18nLocalize(input: string, placeholders?: { - [key: string]: string; -}): string; - -export declare function Δi18nPostprocess(message: string, replacements?: { - [key: string]: (string | string[]); -}): string; - -export declare function Δi18nStart(index: number, message: string, subTemplateIndex?: number): void; - -export declare function ΔInheritDefinitionFeature(definition: DirectiveDef | ComponentDef): void; - -export declare function Δinject(token: Type | InjectionToken): T; -export declare function Δinject(token: Type | InjectionToken, flags?: InjectFlags): T | null; - -export interface ΔInjectableDef { - factory: () => T; - providedIn: InjectorType | 'root' | 'any' | null; - value: T | undefined; -} - -export declare function ΔinjectAttribute(attrNameToInject: string): string | null; - -export interface ΔInjectorDef { - factory: () => T; - imports: (InjectorType | InjectorTypeWithProviders)[]; - providers: (Type | ValueProvider | ExistingProvider | FactoryProvider | ConstructorProvider | StaticClassProvider | ClassProvider | any[])[]; -} - -export declare function Δinterpolation1(prefix: string, v0: any, suffix: string): string | NO_CHANGE; - -export declare function Δinterpolation2(prefix: string, v0: any, i0: string, v1: any, suffix: string): string | NO_CHANGE; - -export declare function Δinterpolation3(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, suffix: string): string | NO_CHANGE; - -export declare function Δinterpolation4(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, suffix: string): string | NO_CHANGE; - -export declare function Δinterpolation5(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, suffix: string): string | NO_CHANGE; - -export declare function Δinterpolation6(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, suffix: string): string | NO_CHANGE; - -export declare function Δinterpolation7(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, suffix: string): string | NO_CHANGE; - -export declare function Δinterpolation8(prefix: string, v0: any, i0: string, v1: any, i1: string, v2: any, i2: string, v3: any, i3: string, v4: any, i4: string, v5: any, i5: string, v6: any, i6: string, v7: any, suffix: string): string | NO_CHANGE; - -export declare function ΔinterpolationV(values: any[]): string | NO_CHANGE; - -export declare function Δlistener(eventName: string, listenerFn: (e?: any) => any, useCapture?: boolean, eventTargetResolver?: GlobalTargetResolver): void; - -export declare function Δload(index: number): T; - -export declare function ΔloadContentQuery(): QueryList; - -export declare function ΔloadViewQuery(): T; - -export declare function ΔnamespaceHTML(): void; - -export declare function ΔnamespaceMathML(): void; - -export declare function ΔnamespaceSVG(): void; - -export declare function ΔnextContext(level?: number): T; - -export declare type ΔNgModuleDefWithMeta = NgModuleDef; - -export declare function ΔNgOnChangesFeature(): DirectiveDefFeature; - -export declare function Δpipe(index: number, pipeName: string): any; - -export declare function ΔpipeBind1(index: number, slotOffset: number, v1: any): any; - -export declare function ΔpipeBind2(index: number, slotOffset: number, v1: any, v2: any): any; - -export declare function ΔpipeBind3(index: number, slotOffset: number, v1: any, v2: any, v3: any): any; - -export declare function ΔpipeBind4(index: number, slotOffset: number, v1: any, v2: any, v3: any, v4: any): any; - -export declare function ΔpipeBindV(index: number, slotOffset: number, values: any[]): any; - -export declare type ΔPipeDefWithMeta = PipeDef; - -export declare function Δprojection(nodeIndex: number, selectorIndex?: number, attrs?: TAttributes): void; - -export declare function ΔprojectionDef(selectors?: CssSelectorList[]): void; - -export declare function ΔProvidersFeature(providers: Provider[], viewProviders?: Provider[]): (definition: DirectiveDef) => void; - -export declare function ΔpureFunction0(slotOffset: number, pureFn: () => T, thisArg?: any): T; - -export declare function ΔpureFunction1(slotOffset: number, pureFn: (v: any) => any, exp: any, thisArg?: any): any; - -export declare function ΔpureFunction2(slotOffset: number, pureFn: (v1: any, v2: any) => any, exp1: any, exp2: any, thisArg?: any): any; - -export declare function ΔpureFunction3(slotOffset: number, pureFn: (v1: any, v2: any, v3: any) => any, exp1: any, exp2: any, exp3: any, thisArg?: any): any; - -export declare function ΔpureFunction4(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, thisArg?: any): any; - -export declare function ΔpureFunction5(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, thisArg?: any): any; - -export declare function ΔpureFunction6(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, thisArg?: any): any; - -export declare function ΔpureFunction7(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, thisArg?: any): any; - -export declare function ΔpureFunction8(slotOffset: number, pureFn: (v1: any, v2: any, v3: any, v4: any, v5: any, v6: any, v7: any, v8: any) => any, exp1: any, exp2: any, exp3: any, exp4: any, exp5: any, exp6: any, exp7: any, exp8: any, thisArg?: any): any; - -export declare function ΔpureFunctionV(slotOffset: number, pureFn: (...v: any[]) => any, exps: any[], thisArg?: any): any; - -export declare function ΔqueryRefresh(queryList: QueryList): boolean; - -export declare function Δreference(index: number): T; - -export declare function ΔresolveBody(element: RElement & { - ownerDocument: Document; -}): { - name: string; - target: HTMLElement; -}; - -export declare function ΔresolveDocument(element: RElement & { - ownerDocument: Document; -}): { - name: string; - target: Document; -}; - -export declare function ΔresolveWindow(element: RElement & { - ownerDocument: Document; -}): { - name: string; - target: Window | null; -}; - -export declare function ΔrestoreView(viewToRestore: OpaqueViewState): void; - -export declare function ΔsanitizeHtml(unsafeHtml: any): string; - -export declare function ΔsanitizeResourceUrl(unsafeResourceUrl: any): string; - -export declare function ΔsanitizeScript(unsafeScript: any): string; - -export declare function ΔsanitizeStyle(unsafeStyle: any): string; - -export declare function ΔsanitizeUrl(unsafeUrl: any): string; - -export declare function ΔsanitizeUrlOrResourceUrl(unsafeUrl: any, tag: string, prop: string): any; - -export declare function Δselect(index: number): void; - -export declare function ΔsetComponentScope(type: ComponentType, directives: Type[], pipes: Type[]): void; - -export declare function ΔsetNgModuleScope(type: any, scope: { - declarations?: Type[] | (() => Type[]); - imports?: Type[] | (() => Type[]); - exports?: Type[] | (() => Type[]); -}): void; - -export declare function ΔstaticContentQuery(directiveIndex: number, predicate: Type | string[], descend: boolean, read: any): void; - -export declare function ΔstaticViewQuery(predicate: Type | string[], descend: boolean, read: any): void; - -export declare function Δtemplate(index: number, templateFn: ComponentTemplate | null, consts: number, vars: number, tagName?: string | null, attrs?: TAttributes | null, localRefs?: string[] | null, localRefExtractor?: LocalRefExtractor): void; - -export declare function ΔtemplateRefExtractor(tNode: TNode, currentView: LView): ViewEngine_TemplateRef<{}> | null; - -export declare function Δtext(index: number, value?: any): void; - -export declare function ΔtextBinding(index: number, value: T | NO_CHANGE): void; - -export declare function ΔviewQuery(predicate: Type | string[], descend: boolean, read: any): QueryList; diff --git a/tools/ts-api-guardian/index.bzl b/tools/ts-api-guardian/index.bzl index 07f7dfb99b..6cd399d249 100644 --- a/tools/ts-api-guardian/index.bzl +++ b/tools/ts-api-guardian/index.bzl @@ -24,7 +24,9 @@ def ts_api_guardian_test( golden, actual, data = [], - strip_export_pattern = ["^__", "^ɵ"], + # Match one, but not two ɵ characters. Ivy instructions are currently prefixed with ɵɵ and + # should appear in ts_api_guardian tests. + strip_export_pattern = ["^__", "^ɵ[^ɵ]"], allow_module_identifiers = COMMON_MODULE_IDENTIFIERS, use_angular_tag_rules = True, **kwargs): From bc6c671e6bced6e32b1d11242bbc1d31a3e976b9 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 18 Feb 2019 10:23:01 +0000 Subject: [PATCH 0725/1073] fix(ivy): don't load factories when using Ivy (#28685) Related to https://github.com/angular/angular/pull/26947/files#r251221208 Related to angular/angular-cli#13524 PR Close #28685 --- .../system_js_ng_module_factory_loader.ts | 5 +-- .../system_ng_module_factory_loader_spec.ts | 31 ++++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/packages/core/src/linker/system_js_ng_module_factory_loader.ts b/packages/core/src/linker/system_js_ng_module_factory_loader.ts index 5168a8ce67..db9d2455c5 100644 --- a/packages/core/src/linker/system_js_ng_module_factory_loader.ts +++ b/packages/core/src/linker/system_js_ng_module_factory_loader.ts @@ -8,6 +8,7 @@ import {Injectable, Optional} from '../di'; +import {ivyEnabled} from '../ivy_switch'; import {Compiler} from './compiler'; import {NgModuleFactory} from './ng_module_factory'; @@ -56,8 +57,8 @@ export class SystemJsNgModuleLoader implements NgModuleFactoryLoader { } load(path: string): Promise> { - const offlineMode = this._compiler instanceof Compiler; - return offlineMode ? this.loadFactory(path) : this.loadAndCompile(path); + const legacyOfflineMode = !ivyEnabled && this._compiler instanceof Compiler; + return legacyOfflineMode ? this.loadFactory(path) : this.loadAndCompile(path); } private loadAndCompile(path: string): Promise> { diff --git a/packages/core/test/linker/system_ng_module_factory_loader_spec.ts b/packages/core/test/linker/system_ng_module_factory_loader_spec.ts index ceb031c251..b4baf714f9 100644 --- a/packages/core/test/linker/system_ng_module_factory_loader_spec.ts +++ b/packages/core/test/linker/system_ng_module_factory_loader_spec.ts @@ -10,6 +10,7 @@ import {Compiler, SystemJsNgModuleLoader} from '@angular/core'; import {global} from '@angular/core/src/util/global'; import {async} from '@angular/core/testing'; import {afterEach, beforeEach, describe, expect, it} from '@angular/core/testing/src/testing_internal'; +import {modifiedInIvy, onlyInIvy} from '@angular/private/testing'; function mockSystem(modules: {[module: string]: any}) { return { @@ -20,9 +21,9 @@ function mockSystem(modules: {[module: string]: any}) { }; } -{ - describe('SystemJsNgModuleLoader', () => { - let oldSystem: any = null; +describe('SystemJsNgModuleLoader', () => { + let oldSystem: any = null; + modifiedInIvy('only loads ngfactory shims in View Engine').describe('(View Engine)', () => { beforeEach(() => { oldSystem = global['System']; global['System'] = mockSystem({ @@ -54,4 +55,26 @@ function mockSystem(modules: {[module: string]: any}) { }); })); }); -} + + onlyInIvy('loads modules directly in Ivy').describe('(Ivy)', () => { + beforeEach(() => { + oldSystem = global['System']; + global['System'] = mockSystem({ + 'test': {'default': 'test module', 'NamedModule': 'test NamedModule'}, + }); + }); + afterEach(() => { global['System'] = oldSystem; }); + + it('loads a default module', async(() => { + const loader = new SystemJsNgModuleLoader(new Compiler()); + loader.load('test').then( + contents => { expect(contents.moduleType).toBe('test module' as any); }); + })); + it('loads a named module', async(() => { + const loader = new SystemJsNgModuleLoader(new Compiler()); + loader.load('test#NamedModule').then(contents => { + expect(contents.moduleType).toBe('test NamedModule' as any); + }); + })); + }); +}); From ac3dc3cfc6925af10fffd37e026554806c04ec4f Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Tue, 9 Apr 2019 11:36:23 +0100 Subject: [PATCH 0726/1073] test(docs-infra): ignore lazy loading examples in Ivy (#28685) PR Close #28685 --- aio/tools/examples/run-example-e2e.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/aio/tools/examples/run-example-e2e.js b/aio/tools/examples/run-example-e2e.js index f0c1f6770d..e420b7752b 100644 --- a/aio/tools/examples/run-example-e2e.js +++ b/aio/tools/examples/run-example-e2e.js @@ -26,6 +26,11 @@ const IGNORED_EXAMPLES = [ const fixmeIvyExamples = [ // fixmeIvy('unknown') app fails at runtime due to missing external service (goog is undefined) 'i18n', + // Needs a Angular CLI synced with the Ivy loadChildren: string support after + // https://github.com/angular/angular/pull/28685 + 'lazy-loading-ngmodules', + 'router', + 'ngmodules', ]; if (argv.ivy) { From d6b474f2f87118f44bbfeddf13d816e1c7f2e523 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 12 Apr 2019 15:51:39 -0700 Subject: [PATCH 0727/1073] build: update @angular/cli version to 8.0.0-beta.13 (#29873) This commit updates the version of @angular/cli to the recently pushed 8.0.0-beta.13. This is necessary as the CI has started to fail with a module hoisting issue caused by a relative import in the CLI, which is fixed in the latest (emergency) release. PR Close #29873 --- package.json | 2 +- yarn.lock | 93 ++++++++++++++++++++++++++++++++++++---------------- 2 files changed, 65 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 399183a107..b72564b4af 100644 --- a/package.json +++ b/package.json @@ -110,7 +110,7 @@ "// 2": "devDependencies are not used under Bazel. Many can be removed after test.sh is deleted.", "// 3": "when updating @bazel/bazel version you also need to update the RBE settings in .bazelrc (see https://github.com/angular/angular/pull/27935)", "devDependencies": { - "@angular/cli": "^8.0.0-beta.11", + "@angular/cli": "^8.0.0-beta.13", "@bazel/bazel": "0.24.0", "@bazel/buildifier": "^0.19.2", "@bazel/ibazel": "~0.9.0", diff --git a/yarn.lock b/yarn.lock index fd5ce07e44..2478a8794a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,7 +2,15 @@ # yarn lockfile v1 -"@angular-devkit/architect@0.800.0-beta.11", "@angular-devkit/architect@^0.800.0-beta.11": +"@angular-devkit/architect@0.800.0-beta.13": + version "0.800.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.800.0-beta.13.tgz#9b1d555027c3cf0c5f46fffc0a8c00cc2263e8dd" + integrity sha512-rIwlno0B4Fk0eJli3fT9ON73vWhtR1JmXfdEOqbvnl90S2ZHx8qDISAzNNj7gvUfYStd2SEsBKtHrBOIRYIOsw== + dependencies: + "@angular-devkit/core" "8.0.0-beta.13" + rxjs "6.4.0" + +"@angular-devkit/architect@^0.800.0-beta.11": version "0.800.0-beta.11" resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.800.0-beta.11.tgz#1b011623438e28cc0fd0000aa6c5ab6fb1f67e6d" integrity sha512-ly40Tz6zJ83DQCZsjC8FLvkezIf4EULpaFCGsij8mR6DOtW3kYJ25lFwn3ISdrHDrLHNSiCqqCGzhCsm4VYJwA== @@ -30,6 +38,17 @@ rxjs "6.4.0" source-map "0.7.3" +"@angular-devkit/core@8.0.0-beta.13": + version "8.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.0.0-beta.13.tgz#5d2dd501e62ab05abc6aa24080343786af818d66" + integrity sha512-uSVzCgxdE0Ev80q3huw7o/JcPzLcSjsSDXIVndZwiZXJ2b4cWsOE/Yi4TPvi/7O9jpuUJJk4Q4z3GIxRnYL1OA== + dependencies: + ajv "6.10.0" + fast-json-stable-stringify "2.0.0" + magic-string "0.25.2" + rxjs "6.4.0" + source-map "0.7.3" + "@angular-devkit/schematics@8.0.0-beta.11", "@angular-devkit/schematics@^8.0.0-beta.11": version "8.0.0-beta.11" resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.0.0-beta.11.tgz#1ff032696b07acdcc40796ffaa1be47f2a96d005" @@ -38,25 +57,33 @@ "@angular-devkit/core" "8.0.0-beta.11" rxjs "6.4.0" +"@angular-devkit/schematics@8.0.0-beta.13": + version "8.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.0.0-beta.13.tgz#6268b8b1d3b1d13ad22f11862b03a99cc3a900e3" + integrity sha512-GmqTYKls/wWHpvwPxtEJfhFHP7w6GVD0dnKrmYKEsTEBuNJPVNMvueGfZQCOMviye3EccJp5EWkgXT/ChNi/EQ== + dependencies: + "@angular-devkit/core" "8.0.0-beta.13" + rxjs "6.4.0" + "@angular/bazel@file:./tools/npm/@angular_bazel": version "0.0.0" -"@angular/cli@^8.0.0-beta.11": - version "8.0.0-beta.11" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.0.0-beta.11.tgz#3903c8838bf8129e5f57a86034ab884c89f4ec47" - integrity sha512-rFNB/dhcpUfz1BYXCfXE3ru/k2KRy2t0M8RjfjNgvbMRlhM/kYqOL8zEkbvmKwEdYoox3bivXOtpFKawL/iNYA== +"@angular/cli@^8.0.0-beta.13": + version "8.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.0.0-beta.13.tgz#18c1b989f8273514fb80805b8455146d38eb1151" + integrity sha512-2SQEUVSg9mFJklFfZauwWDDdD5wyf8X2c1+bmOsOTPVANfY3OEB6Fd/fPAxNJOCi7bsVsXvXLAdDc9XmdQWCMA== dependencies: - "@angular-devkit/architect" "0.800.0-beta.11" - "@angular-devkit/core" "8.0.0-beta.11" - "@angular-devkit/schematics" "8.0.0-beta.11" - "@schematics/angular" "8.0.0-beta.11" - "@schematics/update" "0.800.0-beta.11" + "@angular-devkit/architect" "0.800.0-beta.13" + "@angular-devkit/core" "8.0.0-beta.13" + "@angular-devkit/schematics" "8.0.0-beta.13" + "@schematics/angular" "8.0.0-beta.13" + "@schematics/update" "0.800.0-beta.13" "@yarnpkg/lockfile" "1.1.0" debug "^4.1.1" ini "1.3.5" inquirer "6.2.2" npm-package-arg "6.1.0" - open "6.0.0" + open "6.1.0" pacote "9.5.0" semver "6.0.0" symbol-observable "1.2.0" @@ -351,7 +378,15 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@schematics/angular@8.0.0-beta.11", "@schematics/angular@^8.0.0-beta.11": +"@schematics/angular@8.0.0-beta.13": + version "8.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.0.0-beta.13.tgz#fecbb6822f01120b628eb67da04ed918224ad68b" + integrity sha512-P58ALYgi4elVCDHAS3yUNE5cMOg9Go4C+VrY2Viqe1BfWD8tXjvr80tI0hm0KdNvNmYUupsV7QEJ8j4ie2YtGA== + dependencies: + "@angular-devkit/core" "8.0.0-beta.13" + "@angular-devkit/schematics" "8.0.0-beta.13" + +"@schematics/angular@^8.0.0-beta.11": version "8.0.0-beta.11" resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.0.0-beta.11.tgz#12bea5fe299e0fe93222a69c06c6de130db2da85" integrity sha512-qmqewhwXjbMQ47IMghbaGwAzHo25jNtPyfr+DnSdLwOtKfd1nA2WQD7OGeiG1b+DZ7G+TZvXLg58xnXR3RFhmg== @@ -359,13 +394,13 @@ "@angular-devkit/core" "8.0.0-beta.11" "@angular-devkit/schematics" "8.0.0-beta.11" -"@schematics/update@0.800.0-beta.11": - version "0.800.0-beta.11" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.800.0-beta.11.tgz#ada383c998950eb94b9b69897b4b205adbd812d4" - integrity sha512-CuBP7cObxIlhKdGCxV8lbzdd9mtlmMGlzbJiAoNcublXvaOsRgq9Iw1oTVC6MbJe//vmq4kHC9x3TNa7VOvjEQ== +"@schematics/update@0.800.0-beta.13": + version "0.800.0-beta.13" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.800.0-beta.13.tgz#96b59a4e0fc4b020f9abe21f48b91d80ccd55b38" + integrity sha512-fWc3Pfiou6eBcSxJTNqVmCvzAAtR9K8q1qtHU81BsVN+/7+UEV7sqdQJcYsIH50kvPKyIwps0OstDPwaOBwtRw== dependencies: - "@angular-devkit/core" "8.0.0-beta.11" - "@angular-devkit/schematics" "8.0.0-beta.11" + "@angular-devkit/core" "8.0.0-beta.13" + "@angular-devkit/schematics" "8.0.0-beta.13" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" pacote "9.5.0" @@ -6792,6 +6827,13 @@ madge@0.5.0: uglify-js "1.2.6" walkdir "0.0.5" +magic-string@0.25.2, magic-string@^0.25.1: + version "0.25.2" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" + integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== + dependencies: + sourcemap-codec "^1.4.4" + magic-string@^0.25.0: version "0.25.0" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.0.tgz#1f3696f9931ff0a1ed4c132250529e19cad6759b" @@ -6799,13 +6841,6 @@ magic-string@^0.25.0: dependencies: sourcemap-codec "^1.4.1" -magic-string@^0.25.1: - version "0.25.2" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" - integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== - dependencies: - sourcemap-codec "^1.4.4" - make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -7785,10 +7820,10 @@ open@0.0.5: resolved "https://registry.yarnpkg.com/open/-/open-0.0.5.tgz#42c3e18ec95466b6bf0dc42f3a2945c3f0cad8fc" integrity sha1-QsPhjslUZra/DcQvOilFw/DK2Pw= -open@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/open/-/open-6.0.0.tgz#cae5e2c1a3a1bfaee0d0acc8c4b7609374750346" - integrity sha512-/yb5mVZBz7mHLySMiSj2DcLtMBbFPJk5JBKEkHVZFxZAPzeg3L026O0T+lbdz1B2nyDnkClRSwRQJdeVUIF7zw== +open@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-6.1.0.tgz#0e7e671b883976a4e5251b5d1ca905ab6f4be78f" + integrity sha512-Vqch7NFb/WsMujhqfq+B3u0xkssRjZlxh+NSsBSphpcgaFD7gfB0SUBfR91E9ygBlyNGNogXR2cUB8rRfoo2kQ== dependencies: is-wsl "^1.1.0" From f6ee1c22194fb7aa6e5662aee82f291785436b55 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 12 Apr 2019 12:39:40 -0700 Subject: [PATCH 0728/1073] fix(ivy): use existing 'goog' declaration for goog.getMsg check (#29873) Previously, this check was done with bracket property access on the global object: global['goog'] This will not be minified when Closure compiles this code, which: 1) breaks, because 'goog' will have been minified but the check won't have taken that into consideration 2) causes build failures in g3, because the actual property 'goog' is forbidden in some published JS code (to ensure obfuscation). A TODO is added to validate that this logic is correct, as it's difficult to test within the Angular repo. PR Close #29873 --- packages/core/src/util/BUILD.bazel | 1 + packages/core/src/util/ng_i18n_closure_mode.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/src/util/BUILD.bazel b/packages/core/src/util/BUILD.bazel index 982244b765..3ea2b343c1 100644 --- a/packages/core/src/util/BUILD.bazel +++ b/packages/core/src/util/BUILD.bazel @@ -13,6 +13,7 @@ ts_library( ], ), deps = [ + "//packages:types", "//packages/core/src/interface", "@npm//rxjs", ], diff --git a/packages/core/src/util/ng_i18n_closure_mode.ts b/packages/core/src/util/ng_i18n_closure_mode.ts index 8defa1ce58..7ee5abc919 100644 --- a/packages/core/src/util/ng_i18n_closure_mode.ts +++ b/packages/core/src/util/ng_i18n_closure_mode.ts @@ -15,5 +15,6 @@ declare global { if (typeof global['ngI18nClosureMode'] === 'undefined') { // Make sure to refer to ngI18nClosureMode as ['ngI18nClosureMode'] for closure. global['ngI18nClosureMode'] = - typeof global['goog'] !== 'undefined' && typeof global['goog'].getMsg === 'function'; + // TODO(FW-1250): validate that this actually, you know, works. + typeof goog !== 'undefined' && typeof goog.getMsg === 'function'; } From 0aa0f11a2bd1f480c7182efc2d3b65e40cbade03 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Thu, 11 Apr 2019 16:11:45 -0700 Subject: [PATCH 0729/1073] fix(ivy): log errors instead of re-throwing them (#29853) In order to be backwards compatible with View Engine, Ivy should log errors by default in the TestBed error handler rather than re-throwing them. Re-throwing the errors is a breaking change that causes issues with libraries like ngrx that have async behavior and custom error handling. This logging approach has issues (for both VE and Ivy) because it can allow tests to pass inappropriately if errors are thrown inside listeners. However, since re-throwing would be breaking and requires a larger redesign, we should wait until post-Ivy. PR Close #29853 --- packages/core/test/test_bed_spec.ts | 45 +++++++++++++++++++ .../core/testing/src/r3_test_bed_compiler.ts | 14 +----- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/packages/core/test/test_bed_spec.ts b/packages/core/test/test_bed_spec.ts index 0070e06797..d9da302e95 100644 --- a/packages/core/test/test_bed_spec.ts +++ b/packages/core/test/test_bed_spec.ts @@ -267,6 +267,51 @@ describe('TestBed', () => { TestBed.configureTestingModule({imports: [ProvidesErrorHandler, HelloWorldModule]}); expect(TestBed.get(ErrorHandler)).toEqual(jasmine.any(CustomErrorHandler)); + + }); + + it('should throw errors in CD', () => { + @Component({selector: 'my-comp', template: ''}) + class MyComp { + name !: {hello: string}; + + ngOnInit() { + // this should throw because this.name is undefined + this.name.hello = 'hello'; + } + } + + TestBed.configureTestingModule({declarations: [MyComp]}); + + expect(() => { + const fixture = TestBed.createComponent(MyComp); + fixture.detectChanges(); + }).toThrowError(); + }); + + // TODO(FW-1245): properly fix issue where errors in listeners aren't thrown and don't cause + // tests to fail. This is an issue in both View Engine and Ivy, and may require a breaking + // change to completely fix (since simple re-throwing breaks handlers in ngrx, etc). + xit('should throw errors in listeners', () => { + + @Component({selector: 'my-comp', template: ''}) + class MyComp { + name !: {hello: string}; + + onClick() { + // this should throw because this.name is undefined + this.name.hello = 'hello'; + } + } + + TestBed.configureTestingModule({declarations: [MyComp]}); + const fixture = TestBed.createComponent(MyComp); + fixture.detectChanges(); + + expect(() => { + const button = fixture.nativeElement.querySelector('button'); + button.click(); + }).toThrowError(); }); onlyInIvy('TestBed should handle AOT pre-compiled Components') diff --git a/packages/core/testing/src/r3_test_bed_compiler.ts b/packages/core/testing/src/r3_test_bed_compiler.ts index b5222215ac..aac9429371 100644 --- a/packages/core/testing/src/r3_test_bed_compiler.ts +++ b/packages/core/testing/src/r3_test_bed_compiler.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ApplicationInitStatus, COMPILER_OPTIONS, Compiler, Component, Directive, ErrorHandler, ModuleWithComponentFactories, NgModule, NgModuleFactory, NgZone, Injector, Pipe, PlatformRef, Provider, Type, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, ɵNG_MODULE_DEF as NG_MODULE_DEF, ɵNG_PIPE_DEF as NG_PIPE_DEF, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ɵɵInjectableDef as InjectableDef, ɵNgModuleFactory as R3NgModuleFactory, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵDirectiveDef as DirectiveDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵtransitiveScopesFor as transitiveScopesFor,} from '@angular/core'; +import {ApplicationInitStatus, COMPILER_OPTIONS, Compiler, Component, Directive, ModuleWithComponentFactories, NgModule, NgModuleFactory, NgZone, Injector, Pipe, PlatformRef, Provider, Type, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, ɵNG_MODULE_DEF as NG_MODULE_DEF, ɵNG_PIPE_DEF as NG_PIPE_DEF, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ɵɵInjectableDef as InjectableDef, ɵNgModuleFactory as R3NgModuleFactory, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵDirectiveDef as DirectiveDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵtransitiveScopesFor as transitiveScopesFor,} from '@angular/core'; import {ResourceLoader} from '@angular/compiler'; import {clearResolutionOfComponentResourcesQueue, restoreComponentResolutionQueue, resolveComponentResources, isComponentDefPendingResolution} from '../../src/metadata/resource_loading'; @@ -513,10 +513,6 @@ export class R3TestBedCompiler { class RootScopeModule { } - @NgModule({providers: [{provide: ErrorHandler, useClass: R3TestErrorHandler}]}) - class R3ErrorHandlerModule { - } - const ngZone = new NgZone({enableLongStackTrace: true}); const providers: Provider[] = [ {provide: NgZone, useValue: ngZone}, @@ -524,8 +520,7 @@ export class R3TestBedCompiler { ...this.providers, ...this.providerOverrides, ]; - const imports = - [RootScopeModule, this.additionalModuleTypes, R3ErrorHandlerModule, this.imports || []]; + const imports = [RootScopeModule, this.additionalModuleTypes, this.imports || []]; // clang-format off compileNgModuleDefs(this.testModuleType, { @@ -633,11 +628,6 @@ function flatten(values: any[], mapFn?: (value: T) => any): T[] { return out; } -/** Error handler used for tests. Rethrows errors rather than logging them out. */ -class R3TestErrorHandler extends ErrorHandler { - handleError(error: any) { throw error; } -} - class R3TestCompiler implements Compiler { constructor(private testBed: R3TestBedCompiler) {} From 6c018001d39d4ee962f46ed99b9a8ec0c36e7b97 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Thu, 11 Apr 2019 16:51:27 -0700 Subject: [PATCH 0730/1073] fix(ivy): keep i18n-annotated attributes in element attribute list (#29856) Prior to this change, element attributes annotated with i18n- prefix were removed from element attribute list and processed separately by i18n-specific logic. This behavior is causing issues with directive matching, since attributes are not present in the list of attrs for matching purposes. This commit updates i18n logic to retain attributes in the main attribute list, thus allowing directive matching logic to work correctly. PR Close #29856 --- .../compliance/r3_view_compiler_i18n_spec.ts | 195 ++++++++++-------- .../compiler/src/render3/view/template.ts | 28 ++- .../core/test/acceptance/directive_spec.ts | 16 ++ 3 files changed, 139 insertions(+), 100 deletions(-) diff --git a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts index 9653632481..dfd6bb49bb 100644 --- a/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts +++ b/packages/compiler-cli/test/compliance/r3_view_compiler_i18n_spec.ts @@ -191,111 +191,117 @@ describe('i18n support in the view compiler', () => { * @desc descA * @meaning meaningA */ - const $MSG_EXTERNAL_idA$$APP_SPEC_TS_0$ = goog.getMsg("Content A"); - $I18N_0$ = $MSG_EXTERNAL_idA$$APP_SPEC_TS_0$; + const $MSG_EXTERNAL_idA$$APP_SPEC_TS_1$ = goog.getMsg("Content A"); + $I18N_0$ = $MSG_EXTERNAL_idA$$APP_SPEC_TS_1$; } else { $I18N_0$ = $r3$.ɵɵi18nLocalize("Content A"); } - var $I18N_1$; + const $_c2$ = ["title", "Title B"]; + var $I18N_3$; if (ngI18nClosureMode) { /** * @desc descB * @meaning meaningB */ - const $MSG_EXTERNAL_idB$$APP_SPEC_TS_1$ = goog.getMsg("Title B"); - $I18N_1$ = $MSG_EXTERNAL_idB$$APP_SPEC_TS_1$; + const $MSG_EXTERNAL_idB$$APP_SPEC_TS_4$ = goog.getMsg("Title B"); + $I18N_3$ = $MSG_EXTERNAL_idB$$APP_SPEC_TS_4$; } else { - $I18N_1$ = $r3$.ɵɵi18nLocalize("Title B"); + $I18N_3$ = $r3$.ɵɵi18nLocalize("Title B"); } - const $_c2$ = ["title", $I18N_1$]; - var $I18N_3$; + const $_c5$ = ["title", $I18N_3$]; + const $_c6$ = ["title", "Title C"]; + var $I18N_7$; if (ngI18nClosureMode) { /** * @desc meaningC */ - const $MSG_EXTERNAL_4978592519614169666$$APP_SPEC_TS_3$ = goog.getMsg("Title C"); - $I18N_3$ = $MSG_EXTERNAL_4978592519614169666$$APP_SPEC_TS_3$; + const $MSG_EXTERNAL_4978592519614169666$$APP_SPEC_TS_8$ = goog.getMsg("Title C"); + $I18N_7$ = $MSG_EXTERNAL_4978592519614169666$$APP_SPEC_TS_8$; } else { - $I18N_3$ = $r3$.ɵɵi18nLocalize("Title C"); + $I18N_7$ = $r3$.ɵɵi18nLocalize("Title C"); } - const $_c4$ = ["title", $I18N_3$]; - var $I18N_5$; + const $_c9$ = ["title", $I18N_7$]; + const $_c10$ = ["title", "Title D"]; + var $I18N_11$; if (ngI18nClosureMode) { /** * @desc descD * @meaning meaningD */ - const $MSG_EXTERNAL_5200291527729162531$$APP_SPEC_TS_5$ = goog.getMsg("Title D"); - $I18N_5$ = $MSG_EXTERNAL_5200291527729162531$$APP_SPEC_TS_5$; + const $MSG_EXTERNAL_5200291527729162531$$APP_SPEC_TS_12$ = goog.getMsg("Title D"); + $I18N_11$ = $MSG_EXTERNAL_5200291527729162531$$APP_SPEC_TS_12$; } else { - $I18N_5$ = $r3$.ɵɵi18nLocalize("Title D"); + $I18N_11$ = $r3$.ɵɵi18nLocalize("Title D"); } - const $_c6$ = ["title", $I18N_5$]; - var $I18N_7$; + const $_c13$ = ["title", $I18N_11$]; + const $_c14$ = ["title", "Title E"]; + var $I18N_15$; if (ngI18nClosureMode) { /** * @desc meaningE */ - const $MSG_EXTERNAL_idE$$APP_SPEC_TS_7$ = goog.getMsg("Title E"); - $I18N_7$ = $MSG_EXTERNAL_idE$$APP_SPEC_TS_7$; + const $MSG_EXTERNAL_idE$$APP_SPEC_TS_16$ = goog.getMsg("Title E"); + $I18N_15$ = $MSG_EXTERNAL_idE$$APP_SPEC_TS_16$; } else { - $I18N_7$ = $r3$.ɵɵi18nLocalize("Title E"); + $I18N_15$ = $r3$.ɵɵi18nLocalize("Title E"); } - const $_c8$ = ["title", $I18N_7$]; - var $I18N_9$; + const $_c17$ = ["title", $I18N_15$]; + const $_c18$ = ["title", "Title F"]; + var $I18N_19$; if (ngI18nClosureMode) { - const $MSG_EXTERNAL_idF$$APP_SPEC_TS_9$ = goog.getMsg("Title F"); - $I18N_9$ = $MSG_EXTERNAL_idF$$APP_SPEC_TS_9$; + const $MSG_EXTERNAL_idF$$APP_SPEC_TS_20$ = goog.getMsg("Title F"); + $I18N_19$ = $MSG_EXTERNAL_idF$$APP_SPEC_TS_20$; } else { - $I18N_9$ = $r3$.ɵɵi18nLocalize("Title F"); + $I18N_19$ = $r3$.ɵɵi18nLocalize("Title F"); } - const $_c10$ = ["title", $I18N_9$]; - var $I18N_11$; + const $_c21$ = ["title", $I18N_19$]; + const $_c22$ = ["title", "Title G"]; + var $I18N_23$; if (ngI18nClosureMode) { /** * @desc [BACKUP_MESSAGE_ID:idH]desc */ - const $MSG_EXTERNAL_idG$$APP_SPEC_TS_11$ = goog.getMsg("Title G"); - $I18N_11$ = $MSG_EXTERNAL_idG$$APP_SPEC_TS_11$; + const $MSG_EXTERNAL_idG$$APP_SPEC_TS_24$ = goog.getMsg("Title G"); + $I18N_23$ = $MSG_EXTERNAL_idG$$APP_SPEC_TS_24$; } else { - $I18N_11$ = $r3$.ɵɵi18nLocalize("Title G"); + $I18N_23$ = $r3$.ɵɵi18nLocalize("Title G"); } - const $_c12$ = ["title", $I18N_11$]; + const $_c25$ = ["title", $I18N_23$]; … template: function MyComponent_Template(rf, ctx) { if (rf & 1) { $r3$.ɵɵelementStart(0, "div"); $r3$.ɵɵi18n(1, $I18N_0$); $r3$.ɵɵelementEnd(); - $r3$.ɵɵelementStart(2, "div"); - $r3$.ɵɵi18nAttributes(3, $_c2$); + $r3$.ɵɵelementStart(2, "div", $_c2$); + $r3$.ɵɵi18nAttributes(3, $_c5$); $r3$.ɵɵtext(4, "Content B"); $r3$.ɵɵelementEnd(); - $r3$.ɵɵelementStart(5, "div"); - $r3$.ɵɵi18nAttributes(6, $_c4$); + $r3$.ɵɵelementStart(5, "div", $_c6$); + $r3$.ɵɵi18nAttributes(6, $_c9$); $r3$.ɵɵtext(7, "Content C"); $r3$.ɵɵelementEnd(); - $r3$.ɵɵelementStart(8, "div"); - $r3$.ɵɵi18nAttributes(9, $_c6$); + $r3$.ɵɵelementStart(8, "div", $_c10$); + $r3$.ɵɵi18nAttributes(9, $_c13$); $r3$.ɵɵtext(10, "Content D"); $r3$.ɵɵelementEnd(); - $r3$.ɵɵelementStart(11, "div"); - $r3$.ɵɵi18nAttributes(12, $_c8$); + $r3$.ɵɵelementStart(11, "div", $_c14$); + $r3$.ɵɵi18nAttributes(12, $_c17$); $r3$.ɵɵtext(13, "Content E"); $r3$.ɵɵelementEnd(); - $r3$.ɵɵelementStart(14, "div"); - $r3$.ɵɵi18nAttributes(15, $_c10$); + $r3$.ɵɵelementStart(14, "div", $_c18$); + $r3$.ɵɵi18nAttributes(15, $_c21$); $r3$.ɵɵtext(16, "Content F"); $r3$.ɵɵelementEnd(); - $r3$.ɵɵelementStart(17, "div"); - $r3$.ɵɵi18nAttributes(18, $_c12$); + $r3$.ɵɵelementStart(17, "div", $_c22$); + $r3$.ɵɵi18nAttributes(18, $_c25$); $r3$.ɵɵtext(19, "Content G"); $r3$.ɵɵelementEnd(); } @@ -329,7 +335,7 @@ describe('i18n support in the view compiler', () => { `; const output = ` - const $_c0$ = ["id", "static"]; + const $_c0$ = ["id", "static", "title", "introduction"]; var $I18N_1$; if (ngI18nClosureMode) { /** @@ -370,7 +376,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = ["id", "dynamic-1"]; + const $_c0$ = ["id", "dynamic-1", "aria-roledescription", "static text", ${AttributeMarker.Bindings}, "title", "aria-label"]; var $I18N_1$; if (ngI18nClosureMode) { const $MSG_EXTERNAL_5526535577705876535$$APP_SPEC_TS_1$ = goog.getMsg("static text"); @@ -416,7 +422,7 @@ describe('i18n support in the view compiler', () => { "title", $I18N_2$, "aria-label", $I18N_3$ ]; - const $_c2$ = ["id", "dynamic-2"]; + const $_c2$ = ["id", "dynamic-2", ${AttributeMarker.Bindings}, "title", "aria-roledescription"]; var $I18N_6$; if (ngI18nClosureMode) { /** @@ -486,7 +492,8 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - var $I18N_0$; + const $_c0$ = [${AttributeMarker.Bindings}, "title"]; + var $I18N_1$; if (ngI18nClosureMode) { /** * @desc d @@ -495,20 +502,20 @@ describe('i18n support in the view compiler', () => { const $MSG_EXTERNAL_8977039798304050198$ = goog.getMsg("intro {$interpolation}", { "interpolation": "\uFFFD0\uFFFD" }); - $I18N_0$ = $MSG_EXTERNAL_8977039798304050198$; + $I18N_1$ = $MSG_EXTERNAL_8977039798304050198$; } else { - $I18N_0$ = $r3$.ɵɵi18nLocalize("intro {$interpolation}", { + $I18N_1$ = $r3$.ɵɵi18nLocalize("intro {$interpolation}", { "interpolation": "\uFFFD0\uFFFD" }); } - const $_c0$ = ["title", $I18N_0$]; + const $_c3$ = ["title", $I18N_1$]; … template: function MyComponent_Template(rf, ctx) { if (rf & 1) { - $r3$.ɵɵelementStart(0, "div"); + $r3$.ɵɵelementStart(0, "div", $_c0$); $r3$.ɵɵpipe(1, "uppercase"); - $r3$.ɵɵi18nAttributes(2, $_c0$); + $r3$.ɵɵi18nAttributes(2, $_c3$); $r3$.ɵɵelementEnd(); } if (rf & 2) { @@ -530,6 +537,7 @@ describe('i18n support in the view compiler', () => { const output = String.raw ` const $_c0$ = [${AttributeMarker.Template}, "ngFor", "ngForOf"]; + const $_c1$ = [${AttributeMarker.Bindings}, "title"]; var $I18N_1$; if (ngI18nClosureMode) { /** @@ -546,13 +554,13 @@ describe('i18n support in the view compiler', () => { "interpolation": "\uFFFD0\uFFFD" }); } - const $_c1$ = ["title", $I18N_1$]; + const $_c2$ = ["title", $I18N_1$]; function MyComponent_div_0_Template(rf, ctx) { if (rf & 1) { $r3$.ɵɵelementStart(0, "div"); - $r3$.ɵɵelementStart(1, "div"); + $r3$.ɵɵelementStart(1, "div", $_c1$); $r3$.ɵɵpipe(2, "uppercase"); - $r3$.ɵɵi18nAttributes(3, $_c1$); + $r3$.ɵɵi18nAttributes(3, $_c2$); $r3$.ɵɵelementEnd(); $r3$.ɵɵelementEnd(); } @@ -594,7 +602,10 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - const $_c0$ = ["id", "dynamic-1"]; + const $_c0$ = [ + "id", "dynamic-1", "aria-roledescription", "static text", + ${AttributeMarker.Bindings}, "title", "aria-label" + ]; var $I18N_1$; if (ngI18nClosureMode) { const $MSG_EXTERNAL_5526535577705876535$$APP_SPEC_TS_1$ = goog.getMsg("static text"); @@ -640,7 +651,7 @@ describe('i18n support in the view compiler', () => { "title", $I18N_2$, "aria-label", $I18N_3$ ]; - const $_c2$ = ["id", "dynamic-2"]; + const $_c2$ = ["id", "dynamic-2", ${AttributeMarker.Bindings}, "title", "aria-roledescription"]; var $I18N_6$; if (ngI18nClosureMode) { /** @@ -713,29 +724,30 @@ describe('i18n support in the view compiler', () => { const output = String.raw ` const $_c0$ = [${AttributeMarker.Template}, "ngFor", "ngForOf"]; - var $I18N_1$; + const $_c1$ = [${AttributeMarker.Bindings}, "title"]; + var $I18N_2$; if (ngI18nClosureMode) { /** * @desc d * @meaning m */ - const $MSG_EXTERNAL_8538466649243975456$$APP_SPEC_TS__1$ = goog.getMsg("different scope {$interpolation}", { + const $MSG_EXTERNAL_8538466649243975456$$APP_SPEC_TS__3$ = goog.getMsg("different scope {$interpolation}", { "interpolation": "\uFFFD0\uFFFD" }); - $I18N_1$ = $MSG_EXTERNAL_8538466649243975456$$APP_SPEC_TS__1$; + $I18N_2$ = $MSG_EXTERNAL_8538466649243975456$$APP_SPEC_TS__3$; } else { - $I18N_1$ = $r3$.ɵɵi18nLocalize("different scope {$interpolation}", { + $I18N_2$ = $r3$.ɵɵi18nLocalize("different scope {$interpolation}", { "interpolation": "\uFFFD0\uFFFD" }); } - const $_c1$ = ["title", $I18N_1$]; + const $_c4$ = ["title", $I18N_2$]; function MyComponent_div_0_Template(rf, ctx) { if (rf & 1) { $r3$.ɵɵelementStart(0, "div"); - $r3$.ɵɵelementStart(1, "div"); + $r3$.ɵɵelementStart(1, "div", $_c1$); $r3$.ɵɵpipe(2, "uppercase"); - $r3$.ɵɵi18nAttributes(3, $_c1$); + $r3$.ɵɵi18nAttributes(3, $_c4$); $r3$.ɵɵelementEnd(); $r3$.ɵɵelementEnd(); } @@ -769,6 +781,7 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` + const $_c0$ = ["title", "Element title"]; var $I18N_0$; if (ngI18nClosureMode) { /** @@ -793,7 +806,7 @@ describe('i18n support in the view compiler', () => { … template: function MyComponent_Template(rf, ctx) { if (rf & 1) { - $r3$.ɵɵelementStart(0, "div"); + $r3$.ɵɵelementStart(0, "div", $_c0$); $r3$.ɵɵi18nAttributes(1, $_c1$); $r3$.ɵɵi18n(2, $I18N_2$); $r3$.ɵɵelementEnd(); @@ -1248,29 +1261,30 @@ describe('i18n support in the view compiler', () => { `; const output = String.raw ` - var $I18N_1$; + const $_c1$ = [${AttributeMarker.Bindings}, "title"]; + var $I18N_2$; if (ngI18nClosureMode) { - const $MSG_EXTERNAL_4782264005467235841$$APP_SPEC_TS_1$ = goog.getMsg("Span title {$interpolation} and {$interpolation_1}", { + const $MSG_EXTERNAL_4782264005467235841$$APP_SPEC_TS_3$ = goog.getMsg("Span title {$interpolation} and {$interpolation_1}", { "interpolation": "\uFFFD0\uFFFD", "interpolation_1": "\uFFFD1\uFFFD" }); - $I18N_1$ = $MSG_EXTERNAL_4782264005467235841$$APP_SPEC_TS_1$; + $I18N_2$ = $MSG_EXTERNAL_4782264005467235841$$APP_SPEC_TS_3$; } else { - $I18N_1$ = $r3$.ɵɵi18nLocalize("Span title {$interpolation} and {$interpolation_1}", { + $I18N_2$ = $r3$.ɵɵi18nLocalize("Span title {$interpolation} and {$interpolation_1}", { "interpolation": "\uFFFD0\uFFFD", "interpolation_1": "\uFFFD1\uFFFD" }); } - const $_c2$ = ["title", $I18N_1$]; + const $_c4$ = ["title", $I18N_2$]; var $I18N_0$; if (ngI18nClosureMode) { - const $MSG_EXTERNAL_4446430594603971069$$APP_SPEC_TS_0$ = goog.getMsg(" My i18n block #1 with value: {$interpolation} {$startTagSpan} Plain text in nested element (block #1) {$closeTagSpan}", { + const $MSG_EXTERNAL_4446430594603971069$$APP_SPEC_TS_5$ = goog.getMsg(" My i18n block #1 with value: {$interpolation} {$startTagSpan} Plain text in nested element (block #1) {$closeTagSpan}", { "interpolation": "\uFFFD0\uFFFD", "startTagSpan": "\uFFFD#2\uFFFD", "closeTagSpan": "\uFFFD/#2\uFFFD" }); - $I18N_0$ = $MSG_EXTERNAL_4446430594603971069$$APP_SPEC_TS_0$; + $I18N_0$ = $MSG_EXTERNAL_4446430594603971069$$APP_SPEC_TS_5$; } else { $I18N_0$ = $r3$.ɵɵi18nLocalize(" My i18n block #1 with value: {$interpolation} {$startTagSpan} Plain text in nested element (block #1) {$closeTagSpan}", { @@ -1279,30 +1293,30 @@ describe('i18n support in the view compiler', () => { "closeTagSpan": "\uFFFD/#2\uFFFD" }); } - var $I18N_4$; + var $I18N_7$; if (ngI18nClosureMode) { - const $MSG_EXTERNAL_2719594642740200058$$APP_SPEC_TS_4$ = goog.getMsg("Span title {$interpolation}", { + const $MSG_EXTERNAL_2719594642740200058$$APP_SPEC_TS_8$ = goog.getMsg("Span title {$interpolation}", { "interpolation": "\uFFFD0\uFFFD" }); - $I18N_4$ = $MSG_EXTERNAL_2719594642740200058$$APP_SPEC_TS_4$; + $I18N_7$ = $MSG_EXTERNAL_2719594642740200058$$APP_SPEC_TS_8$; } else { - $I18N_4$ = $r3$.ɵɵi18nLocalize("Span title {$interpolation}", { + $I18N_7$ = $r3$.ɵɵi18nLocalize("Span title {$interpolation}", { "interpolation": "\uFFFD0\uFFFD" }); } - const $_c5$ = ["title", $I18N_4$]; - var $I18N_3$; + const $_c9$ = ["title", $I18N_7$]; + var $I18N_6$; if (ngI18nClosureMode) { - const $MSG_EXTERNAL_2778714953278357902$$APP_SPEC_TS_3$ = goog.getMsg(" My i18n block #2 with value {$interpolation} {$startTagSpan} Plain text in nested element (block #2) {$closeTagSpan}", { + const $MSG_EXTERNAL_2778714953278357902$$APP_SPEC_TS_10$ = goog.getMsg(" My i18n block #2 with value {$interpolation} {$startTagSpan} Plain text in nested element (block #2) {$closeTagSpan}", { "interpolation": "\uFFFD0\uFFFD", "startTagSpan": "\uFFFD#7\uFFFD", "closeTagSpan": "\uFFFD/#7\uFFFD" }); - $I18N_3$ = $MSG_EXTERNAL_2778714953278357902$$APP_SPEC_TS_3$; + $I18N_6$ = $MSG_EXTERNAL_2778714953278357902$$APP_SPEC_TS_10$; } else { - $I18N_3$ = $r3$.ɵɵi18nLocalize(" My i18n block #2 with value {$interpolation} {$startTagSpan} Plain text in nested element (block #2) {$closeTagSpan}", { + $I18N_6$ = $r3$.ɵɵi18nLocalize(" My i18n block #2 with value {$interpolation} {$startTagSpan} Plain text in nested element (block #2) {$closeTagSpan}", { "interpolation": "\uFFFD0\uFFFD", "startTagSpan": "\uFFFD#7\uFFFD", "closeTagSpan": "\uFFFD/#7\uFFFD" @@ -1315,16 +1329,16 @@ describe('i18n support in the view compiler', () => { if (rf & 1) { $r3$.ɵɵelementStart(0, "div"); $r3$.ɵɵi18nStart(1, $I18N_0$); - $r3$.ɵɵelementStart(2, "span"); - $r3$.ɵɵi18nAttributes(3, $_c2$); + $r3$.ɵɵelementStart(2, "span", $_c1$); + $r3$.ɵɵi18nAttributes(3, $_c4$); $r3$.ɵɵelementEnd(); $r3$.ɵɵi18nEnd(); $r3$.ɵɵelementEnd(); $r3$.ɵɵelementStart(4, "div"); - $r3$.ɵɵi18nStart(5, $I18N_3$); + $r3$.ɵɵi18nStart(5, $I18N_6$); $r3$.ɵɵpipe(6, "uppercase"); - $r3$.ɵɵelementStart(7, "span"); - $r3$.ɵɵi18nAttributes(8, $_c5$); + $r3$.ɵɵelementStart(7, "span", $_c1$); + $r3$.ɵɵi18nAttributes(8, $_c9$); $r3$.ɵɵelementEnd(); $r3$.ɵɵi18nEnd(); $r3$.ɵɵelementEnd(); @@ -1439,6 +1453,7 @@ describe('i18n support in the view compiler', () => { $r3$.ɵɵelement(0, "img", $_c0$); } } + const $_c3$ = ["src", "logo.png", ${AttributeMarker.Bindings}, "title"]; var $I18N_2$; if (ngI18nClosureMode) { const $MSG_EXTERNAL_2367729185105559721$$APP_SPEC_TS__2$ = goog.getMsg("App logo #{$interpolation}", { @@ -1451,11 +1466,11 @@ describe('i18n support in the view compiler', () => { "interpolation": "\uFFFD0\uFFFD" }); } - const $_c3$ = ["title", $I18N_2$]; + const $_c4$ = ["title", $I18N_2$]; function MyComponent_img_2_Template(rf, ctx) { if (rf & 1) { - $r3$.ɵɵelementStart(0, "img", $_c0$); - $r3$.ɵɵi18nAttributes(1, $_c3$); + $r3$.ɵɵelementStart(0, "img", $_c3$); + $r3$.ɵɵi18nAttributes(1, $_c4$); $r3$.ɵɵelementEnd(); } if (rf & 2) { diff --git a/packages/compiler/src/render3/view/template.ts b/packages/compiler/src/render3/view/template.ts index 3fe0584dcc..f273660b51 100644 --- a/packages/compiler/src/render3/view/template.ts +++ b/packages/compiler/src/render3/view/template.ts @@ -542,9 +542,14 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver stylingBuilder.registerStyleAttr(value); } else if (name === 'class') { stylingBuilder.registerClassAttr(value); - } else if (attr.i18n) { - i18nAttrs.push(attr); } else { + if (attr.i18n) { + // Place attributes into a separate array for i18n processing, but also keep such + // attributes in the main list to make them available for directive matching at runtime. + // TODO(FW-1248): prevent attributes duplication in `i18nAttributes` and `elementStart` + // arguments + i18nAttrs.push(attr); + } outputAttrs.push(attr); } } @@ -565,15 +570,14 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver element.inputs.forEach((input: t.BoundAttribute) => { const stylingInputWasSet = stylingBuilder.registerBoundInput(input); if (!stylingInputWasSet) { - if (input.type === BindingType.Property) { - if (input.i18n) { - i18nAttrs.push(input); - } else { - allOtherInputs.push(input); - } - } else { - allOtherInputs.push(input); + if (input.type === BindingType.Property && input.i18n) { + // Place attributes into a separate array for i18n processing, but also keep such + // attributes in the main list to make them available for directive matching at runtime. + // TODO(FW-1248): prevent attributes duplication in `i18nAttributes` and `elementStart` + // arguments + i18nAttrs.push(input); } + allOtherInputs.push(input); } }); @@ -730,6 +734,10 @@ export class TemplateDefinitionBuilder implements t.Visitor, LocalResolver ]; }); } else if (instruction) { + // we must skip attributes with associated i18n context, since these attributes are handled + // separately and corresponding `i18nExp` and `i18nApply` instructions will be generated + if (input.i18n) return; + const value = input.value.visit(this._valueConverter); if (value !== undefined) { const params: any[] = []; diff --git a/packages/core/test/acceptance/directive_spec.ts b/packages/core/test/acceptance/directive_spec.ts index 65defd2b80..92aa4230b2 100644 --- a/packages/core/test/acceptance/directive_spec.ts +++ b/packages/core/test/acceptance/directive_spec.ts @@ -18,6 +18,10 @@ describe('directives', () => { class TestDirective { } + @Directive({selector: '[title]'}) + class TitleDirective { + } + @Component({selector: 'test-cmpt', template: ''}) class TestComponent { } @@ -42,6 +46,18 @@ describe('directives', () => { expect(nodesWithDirective.length).toBe(1); }); + it('should match directives on i18n-annotated attributes', () => { + TestBed.configureTestingModule({declarations: [TestComponent, TitleDirective]}); + TestBed.overrideTemplate(TestComponent, ` +
+ `); + + const fixture = TestBed.createComponent(TestComponent); + const nodesWithDirective = fixture.debugElement.queryAllNodes(By.directive(TitleDirective)); + + expect(nodesWithDirective.length).toBe(1); + }); + }); }); \ No newline at end of file From 911e0b8820a03f1cb84b024247435607158adf4a Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 12 Apr 2019 17:34:52 -0700 Subject: [PATCH 0731/1073] docs: release notes for the v7.2.13 release --- CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b21459c03d..074b86dd83 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,14 @@ + +## [7.2.13](https://github.com/angular/angular/compare/7.2.12...7.2.13) (2019-04-12) + + +### Bug Fixes + +* **bazel:** use //:tsconfig.json as the default for ng_module ([#29670](https://github.com/angular/angular/issues/29670)) ([#29711](https://github.com/angular/angular/issues/29711)) ([9e33dc3](https://github.com/angular/angular/commit/9e33dc3)) +* **platform-browser:** insert APP_ID in styles, contentAttr and hostAttr ([#17745](https://github.com/angular/angular/issues/17745)) ([ca14509](https://github.com/angular/angular/commit/ca14509)) + + + # [8.0.0-beta.11](https://github.com/angular/angular/compare/8.0.0-beta.10...8.0.0-beta.11) (2019-04-03) From e2e637d70abb9e5369e0af5176dbecff36e326f2 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Fri, 12 Apr 2019 17:48:21 -0700 Subject: [PATCH 0732/1073] release: cut the v8.0.0-beta.12 release --- CHANGELOG.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 074b86dd83..e5cb5986f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,54 @@ + +# [8.0.0-beta.12](https://github.com/angular/angular/compare/8.0.0-beta.11...8.0.0-beta.12) (2019-04-13) + + +### Bug Fixes + +* **bazel:** add configuration_env_vars = ["compile"] to generated [@npm](https://github.com/npm)//[@angular](https://github.com/angular)/bazel/bin:ngc-wrapped nodejs_binary ([#29694](https://github.com/angular/angular/issues/29694)) ([2e66ddf](https://github.com/angular/angular/commit/2e66ddf)) +* **bazel:** docs formatting ([#29817](https://github.com/angular/angular/issues/29817)) ([cc2e4b6](https://github.com/angular/angular/commit/cc2e4b6)) +* **bazel:** remove karma-jasmine from ts_web_test_suite ([#29695](https://github.com/angular/angular/issues/29695)) ([2bd9214](https://github.com/angular/angular/commit/2bd9214)) +* **bazel:** support running ng-add on minimal applications ([#29681](https://github.com/angular/angular/issues/29681)) ([9810c6c](https://github.com/angular/angular/commit/9810c6c)), closes [#29680](https://github.com/angular/angular/issues/29680) +* **common:** add `@Injectable()` to common pipes ([#29834](https://github.com/angular/angular/issues/29834)) ([387fbb8](https://github.com/angular/angular/commit/387fbb8)) +* **compiler-cli:** ensure LogicalProjectPaths always start with a slash ([#29627](https://github.com/angular/angular/issues/29627)) ([e02684e](https://github.com/angular/angular/commit/e02684e)) +* **core:** add missing migration to npm package ([#29705](https://github.com/angular/angular/issues/29705)) ([96b76dc](https://github.com/angular/angular/commit/96b76dc)) +* **core:** call ngOnDestroy for tree-shakeable providers ([#28943](https://github.com/angular/angular/issues/28943)) ([30b0442](https://github.com/angular/angular/commit/30b0442)), closes [#28927](https://github.com/angular/angular/issues/28927) +* **core:** Deprecate TestBed.get(...):any ([#29290](https://github.com/angular/angular/issues/29290)) ([609024f](https://github.com/angular/angular/commit/609024f)), closes [#13785](https://github.com/angular/angular/issues/13785) [#26491](https://github.com/angular/angular/issues/26491) +* **core:** resolve ts compile issues due to lenient tsconfig ([#29843](https://github.com/angular/angular/issues/29843)) ([54058ba](https://github.com/angular/angular/commit/54058ba)) +* **platform-browser:** insert APP_ID in styles, contentAttr and hostAttr ([#17745](https://github.com/angular/angular/issues/17745)) ([712d60e](https://github.com/angular/angular/commit/712d60e)) + + +### Features + +* **bazel:** update the build to use the new architect api ([#29720](https://github.com/angular/angular/issues/29720)) ([902a53a](https://github.com/angular/angular/commit/902a53a)) + + +### DEPRECATIONS + +* `TestBed.get()` has two signatures, one which is typed and another which accepts and returns `any`. The signature for `any` is deprecated; all usage of `TestBed.get()` should go through the typed API. This mainly affects string tokens +(which aren't supported) and abstract class tokens. + +Before: + +```ts +TestBed.configureTestingModule({ + providers: [{provide: "stringToken", useValue: new Service()}], +}); + +let service = TestBed.get("stringToken"); // type any +``` + +After: + +```ts +const SERVICE_TOKEN = new InjectionToken("SERVICE_TOKEN"); + +TestBed.configureTestingModule({ + providers: [{provide: SERVICE_TOKEN, useValue: new Service()}], +}); + +let service = TestBed.get(SERVICE_TOKEN); // type Service +``` + ## [7.2.13](https://github.com/angular/angular/compare/7.2.12...7.2.13) (2019-04-12) diff --git a/package.json b/package.json index b72564b4af..65a22cb0ef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "8.0.0-beta.11", + "version": "8.0.0-beta.12", "private": true, "branchPattern": "2.0.*", "description": "Angular - a web framework for modern web apps", From ea70d41ac2314cdfc58688b488f85108466e5f92 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Sat, 13 Apr 2019 15:29:48 +0100 Subject: [PATCH 0733/1073] test: ensure correct TS version before running postinstall (#29885) The bazel-schematics test could suffer from a version skew where new CLI projects were not yet using a new TS version, but Angular packages already were. This caused the the `ngc` call in the added `postinstall` to run and fail: https://circleci.com/gh/angular/angular/283109 PR Close #29885 --- integration/bazel-schematics/test.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/integration/bazel-schematics/test.sh b/integration/bazel-schematics/test.sh index 0b55efbe34..8245e399c4 100755 --- a/integration/bazel-schematics/test.sh +++ b/integration/bazel-schematics/test.sh @@ -26,11 +26,8 @@ function testBazel() { # Create project ng new demo --collection=@angular/bazel --routing --skip-git --skip-install --style=scss cd demo - # Do an initial install to ensure packages like node-sass are built. - yarn # Force more recent TS version until new Angular CLI projects also use it. - # --ignore-scripts is necessary because there is a postinstall script that uses ngc. - yarn add typescript@3.4.2 --dev --ignore-scripts + yarn add typescript@3.4.2 --dev installLocalPackages yarn webdriver-manager update --gecko=false --standalone=false ${CI_CHROMEDRIVER_VERSION_ARG:---versions.chrome 2.45} ng generate component widget --style=css From 4f9c935473f17a2824df2cfb022f1ed1bb8d9f23 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Mon, 15 Apr 2019 15:41:48 +0300 Subject: [PATCH 0734/1073] build(docs-infra): upgrade lighthouse to 4.3.0 (#29904) Also, log the Lighthouse version in `test-pwa-score` to aid in debugging. PR Close #29904 --- aio/package.json | 2 +- aio/scripts/test-pwa-score.js | 2 + aio/yarn.lock | 161 ++++++++++++++++++++++++---------- 3 files changed, 116 insertions(+), 49 deletions(-) diff --git a/aio/package.json b/aio/package.json index bc8c1a7e8a..f0064d1daa 100644 --- a/aio/package.json +++ b/aio/package.json @@ -141,7 +141,7 @@ "karma-coverage-istanbul-reporter": "^1.3.0", "karma-jasmine": "^1.1.0", "karma-jasmine-html-reporter": "^0.2.2", - "lighthouse": "^3.2.1", + "lighthouse": "^4.3.0", "lodash": "^4.17.4", "lunr": "^2.1.0", "npm-run-all": "^4.1.5", diff --git a/aio/scripts/test-pwa-score.js b/aio/scripts/test-pwa-score.js index 4b57939137..abc466d888 100644 --- a/aio/scripts/test-pwa-score.js +++ b/aio/scripts/test-pwa-score.js @@ -105,6 +105,8 @@ function processResults(results, logFile) { const categoryData = Object.keys(categories).map(name => categories[name]); const maxTitleLen = Math.max(...categoryData.map(({title}) => title.length)); + console.log('\nLighthouse version:', results.lhr.lighthouseVersion); + console.log('\nAudit scores:'); categoryData.forEach(({title, score}) => { const paddedTitle = `${title}:`.padEnd(maxTitleLen + 1); diff --git a/aio/yarn.lock b/aio/yarn.lock index 5911119058..890d656db7 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -607,6 +607,11 @@ JSONStream@^1.3.4: jsonparse "^1.2.0" through ">=2.2.7 <3" +"JSV@>= 4.0.x": + version "4.0.2" + resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" + integrity sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c= + a-sync-waterfall@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz#75b6b6aa72598b497a125e7a2770f14f4c8a1fa7" @@ -828,6 +833,11 @@ ansi-styles@^3.1.0, ansi-styles@^3.2.1: dependencies: color-convert "^1.9.0" +ansi-styles@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" + integrity sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg= + anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" @@ -1141,9 +1151,10 @@ aws4@^1.6.0, aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== -axe-core@3.0.0-beta.2: - version "3.0.0-beta.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.0.0-beta.2.tgz#82a13d371268034352bba2bcb263c5625b3e4a09" +axe-core@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-3.1.2.tgz#ca0aff897ebefca7552f97859dc1217c06c4f9e6" + integrity sha512-e1WVs0SQu3tM29J9a/mISGvlo2kdCStE+yffIAJF6eb42FS+eUFEVz9j4rgDeV2TAfPJmuOZdRetWYycIbK7Vg== axios@^0.18.0: version "0.18.0" @@ -1801,6 +1812,15 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" + integrity sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8= + dependencies: + ansi-styles "~1.0.0" + has-color "~0.1.0" + strip-ansi "~0.1.0" + change-case@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.0.tgz#6c9c8e35f8790870a82b6b0745be8c3cbef9b081" @@ -1916,14 +1936,6 @@ chownr@^1.0.1, chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== -chrome-devtools-frontend@1.0.401423: - version "1.0.401423" - resolved "https://registry.yarnpkg.com/chrome-devtools-frontend/-/chrome-devtools-frontend-1.0.401423.tgz#32a89b8d04e378a494be3c8d63271703be1c04ea" - -chrome-devtools-frontend@1.0.593291: - version "1.0.593291" - resolved "https://registry.yarnpkg.com/chrome-devtools-frontend/-/chrome-devtools-frontend-1.0.593291.tgz#72ed2e488e4ab8c5df9f35a5ce6bb128eb3c5e74" - chrome-launcher@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.10.5.tgz#d0aa72c11f1653e6a60dfebea171522447470ef1" @@ -2614,9 +2626,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" -cssstyle@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.1.1.tgz#18b038a9c44d65f7a8e428a653b9f6fe42faf5fb" +cssstyle@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-1.2.1.tgz#3aceb2759eaf514ac1a21628d723d6043a819495" + integrity sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A== dependencies: cssom "0.3.x" @@ -2867,6 +2880,11 @@ detab@^2.0.0: dependencies: repeat-string "^1.5.4" +details-element-polyfill@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/details-element-polyfill/-/details-element-polyfill-2.2.0.tgz#1c0bb65372c20f622e90974b9694ae204d4c8d8c" + integrity sha512-Sjg+A4q3Mrn2JKQu58zsreuHqAb4M0qe4eK5ZQAIBuch9i8nx6MlKWCxx0z8s59MMen9I4WXavzW5z+BnkIC0A== + detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" @@ -2889,13 +2907,6 @@ detect-node@^2.0.4: resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -devtools-timeline-model@1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/devtools-timeline-model/-/devtools-timeline-model-1.1.6.tgz#7be51a73b55d727b597bb30dd1ed2e8e210639a5" - dependencies: - chrome-devtools-frontend "1.0.401423" - resolve "1.1.7" - dgeni-packages@^0.27.1: version "0.27.2" resolved "https://registry.yarnpkg.com/dgeni-packages/-/dgeni-packages-0.27.2.tgz#ca1b40147a56668db2f4a2f09a374c6355f45cfa" @@ -3465,7 +3476,7 @@ esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" -esprima@^4.0.0, esprima@^4.0.1: +esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -4617,6 +4628,11 @@ has-binary@0.1.7: dependencies: isarray "0.0.1" +has-color@~0.1.0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + integrity sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8= + has-cors@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" @@ -5976,6 +5992,24 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonld@^1.5.0: + version "1.5.4" + resolved "https://registry.yarnpkg.com/jsonld/-/jsonld-1.5.4.tgz#ac7509cc8180a3ee4235d3dbece55a204617c577" + integrity sha512-+cJ5JmXBBlf0zagJDiz1NsnMBQyd4p+LV8x8UQfjCVBhFDcL6hWduDXMUp8XOgLtt8L9LjRCbUj1NL+tU17GqA== + dependencies: + rdf-canonize "^1.0.2" + request "^2.88.0" + semver "^5.6.0" + xmldom "0.1.19" + +jsonlint-mod@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/jsonlint-mod/-/jsonlint-mod-1.7.4.tgz#310390e1a6a85cef99f45f200e662ef23b48f7a6" + integrity sha512-FYOkwHqiuBbdVCHgXYlmtL+iUOz9AxCgjotzXl+edI0Hc1km1qK6TrBEAyPpO+5R0/IX3XENRp66mfob4jwxow== + dependencies: + JSV ">= 4.0.x" + nomnom ">= 1.5.x" + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" @@ -6249,24 +6283,33 @@ lighthouse-logger@^1.0.0: dependencies: debug "^2.6.8" -lighthouse@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/lighthouse/-/lighthouse-3.2.1.tgz#90681c9eb8b5dea41a2569e3d4bafdbd4292c97f" +lighthouse-logger@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz#b76d56935e9c137e86a04741f6bb9b2776e886ca" + integrity sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw== dependencies: - axe-core "3.0.0-beta.2" - chrome-devtools-frontend "1.0.593291" + debug "^2.6.8" + marky "^1.2.0" + +lighthouse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lighthouse/-/lighthouse-4.3.0.tgz#5b6a89871ece5016103a3fb0c1c33d8976f80f80" + integrity sha512-gSekIsP+d2kT2Ly6vkjj+hpmeNbR47w+iKwlUUkp7pWA+VfLY4uihmm4scYb4Qw0g4UCoe13f1JrMCw4oXIeIw== + dependencies: + axe-core "3.1.2" chrome-launcher "^0.10.5" configstore "^3.1.1" - cssstyle "1.1.1" - devtools-timeline-model "1.1.6" - esprima "^4.0.1" + cssstyle "1.2.1" + details-element-polyfill "2.2.0" http-link-header "^0.8.0" inquirer "^3.3.0" intl-messageformat "^2.2.0" intl-messageformat-parser "^1.4.0" jpeg-js "0.1.2" js-library-detector "^5.1.0" - lighthouse-logger "^1.0.0" + jsonld "^1.5.0" + jsonlint-mod "^1.7.4" + lighthouse-logger "^1.2.0" lodash.isequal "^4.5.0" lookup-closest-locale "6.0.4" metaviewport-parser "0.2.0" @@ -6278,7 +6321,7 @@ lighthouse@^3.2.1: robots-parser "^2.0.1" semver "^5.3.0" speedline-core "1.4.2" - update-notifier "^2.1.0" + update-notifier "^2.5.0" ws "3.3.2" yargs "3.32.0" yargs-parser "7.0.0" @@ -6650,6 +6693,11 @@ marked@^0.3.2: resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== +marky@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/marky/-/marky-1.2.1.tgz#a3fcf82ffd357756b8b8affec9fdbf3a30dc1b02" + integrity sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ== + math-random@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" @@ -7169,6 +7217,11 @@ node-forge@^0.7.4: version "0.7.6" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" +node-forge@^0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.8.2.tgz#b4bcc59fb12ce77a8825fc6a783dfe3182499c5a" + integrity sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg== + node-gyp@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" @@ -7269,6 +7322,14 @@ node-sass@4.10.0: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" +"nomnom@>= 1.5.x": + version "1.8.1" + resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" + integrity sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc= + dependencies: + chalk "~0.4.0" + underscore "~1.6.0" + "nopt@2 || 3", nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -8474,6 +8535,14 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +rdf-canonize@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/rdf-canonize/-/rdf-canonize-1.0.3.tgz#71dc56bb808a39d12e3ca17674c15f881cad648a" + integrity sha512-piLMOB5Q6LJSVx2XzmdpHktYVb8TmVTy8coXJBFtdkcMC96DknZOuzpAYqCWx2ERZX7xEW+mMi8/wDuMJS/95w== + dependencies: + node-forge "^0.8.1" + semver "^5.6.0" + read-cache@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" @@ -8934,7 +9003,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.7, resolve@1.1.x: +resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" @@ -9999,6 +10068,11 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.0.0" +strip-ansi@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" + integrity sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE= + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -10605,7 +10679,7 @@ underscore-contrib@~0.3.0: dependencies: underscore "1.6.0" -underscore@1.6.0: +underscore@1.6.0, underscore@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" integrity sha1-izixDKze9jM3uLJOT/htRa6lKag= @@ -10790,20 +10864,6 @@ upath@^1.0.5, upath@^1.1.0: resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== -update-notifier@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - update-notifier@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" @@ -11485,6 +11545,11 @@ xmlbuilder@~9.0.1: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0= +xmldom@0.1.19: + version "0.1.19" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.19.tgz#631fc07776efd84118bf25171b37ed4d075a0abc" + integrity sha1-Yx/Ad3bv2EEYvyUXGzftTQdaCrw= + xmlhttprequest-ssl@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" From 70177e544bdbbfac3c2cc7521e8386d68682b76b Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Mon, 15 Apr 2019 15:46:14 +0300 Subject: [PATCH 0735/1073] build(docs-infra): add missing dependencies (chrome-launcher, lighthouse-logger) (#29904) We are using `chrome-launcher` and `lighthouse-logger` in [test-pwa-score][1], but we do not explicitly list them as `devDependencies`, so we are relying on the fact that they happen to be hoisted in `node_modules/` by yarn. This may unexpectedly break in the future. This commit fixes this, by explicitly listing them as `devDependencies`. [1]: https://github.com/angular/angular/blob/ea70d41ac/aio/scripts/test-pwa-score.js#L14-L18 PR Close #29904 --- aio/package.json | 2 ++ aio/yarn.lock | 1 + 2 files changed, 3 insertions(+) diff --git a/aio/package.json b/aio/package.json index f0064d1daa..93917d88e2 100644 --- a/aio/package.json +++ b/aio/package.json @@ -108,6 +108,7 @@ "archiver": "^1.3.0", "canonical-path": "1.0.0", "chalk": "^2.1.0", + "chrome-launcher": "^0.10.5", "cjson": "^0.5.0", "codelyzer": "~4.5.0", "cross-spawn": "^5.1.0", @@ -142,6 +143,7 @@ "karma-jasmine": "^1.1.0", "karma-jasmine-html-reporter": "^0.2.2", "lighthouse": "^4.3.0", + "lighthouse-logger": "^1.2.0", "lodash": "^4.17.4", "lunr": "^2.1.0", "npm-run-all": "^4.1.5", diff --git a/aio/yarn.lock b/aio/yarn.lock index 890d656db7..a4724b52e5 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -1939,6 +1939,7 @@ chownr@^1.0.1, chownr@^1.1.1: chrome-launcher@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-0.10.5.tgz#d0aa72c11f1653e6a60dfebea171522447470ef1" + integrity sha512-Gbzg8HlWhyuoVqflhiXwfFXhzNfNWvAkSWv2QR1Yl6mwsMo1oCLAVjp2tIySuS4lrZLEjzVx1fOy584yE76P4g== dependencies: "@types/core-js" "^0.9.41" "@types/mkdirp" "^0.3.29" From d1d0f4a1add5579ce109ebbb6abf4d99e1d8ed93 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Mon, 15 Apr 2019 12:09:38 +0300 Subject: [PATCH 0736/1073] fix(docs-infra): add missing ng-conf image (#29902) As of b9fead7f8, the image is referenced in `announcements.json`, but it was already removed (as it wasn't used at the time) in 7f905da33. PR Close #29902 --- aio/content/images/marketing/home/ng-conf.png | Bin 0 -> 9712 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 aio/content/images/marketing/home/ng-conf.png diff --git a/aio/content/images/marketing/home/ng-conf.png b/aio/content/images/marketing/home/ng-conf.png new file mode 100644 index 0000000000000000000000000000000000000000..16d8a273e3a5fff7c91c696cc9ac0ce400f1a1e4 GIT binary patch literal 9712 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 Ojk3JDT(yj4 Date: Fri, 12 Apr 2019 10:34:38 +0200 Subject: [PATCH 0737/1073] perf(ivy): attempt to coalesce listeners only in presence of directives (#29859) PR Close #29859 --- packages/core/src/render3/instructions/listener.ts | 12 ++++++++---- packages/core/src/render3/util/view_utils.ts | 7 +++++++ .../test/bundling/todo/bundle.golden_symbols.json | 3 +++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index af43545555..3cb77b92c8 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -14,7 +14,7 @@ import {GlobalTargetResolver, RElement, Renderer3, isProceduralRenderer} from '. import {CLEANUP, FLAGS, LView, LViewFlags, RENDERER, TVIEW} from '../interfaces/view'; import {assertNodeOfPossibleTypes} from '../node_assert'; import {getLView, getPreviousOrParentTNode} from '../state'; -import {getComponentViewByIndex, getNativeByTNode, unwrapRNode} from '../util/view_utils'; +import {getComponentViewByIndex, getNativeByTNode, hasDirectives, unwrapRNode} from '../util/view_utils'; import {BindingDirection, generatePropertyAliases, getCleanup, handleError, loadComponentRenderer, markViewDirty} from './shared'; /** @@ -132,12 +132,16 @@ function listenerInternal( // In order to have just one native event handler in presence of multiple handler functions, // we just register a first handler function as a native event listener and then chain // (coalesce) other handler functions on top of the first native handler function. - // + let existingListener = null; // Please note that the coalescing described here doesn't happen for events specifying an // alternative target (ex. (document:click)) - this is to keep backward compatibility with the // view engine. - const existingListener = - eventTargetResolver ? null : findExistingListener(lView, eventName, tNode.index); + // Also, we don't have to search for existing listeners is there are no directives + // matching on a given node as we can't register multiple event handlers for the same event in + // a template (this would mean having duplicate attributes). + if (!eventTargetResolver && hasDirectives(tNode)) { + existingListener = findExistingListener(lView, eventName, tNode.index); + } if (existingListener !== null) { // Attach a new listener at the head of the coalesced listeners list. (listenerFn).__ngNextListenerFn__ = (existingListener).__ngNextListenerFn__; diff --git a/packages/core/src/render3/util/view_utils.ts b/packages/core/src/render3/util/view_utils.ts index b79a179187..9b51f3f285 100644 --- a/packages/core/src/render3/util/view_utils.ts +++ b/packages/core/src/render3/util/view_utils.ts @@ -131,6 +131,13 @@ export function getNativeByTNode(tNode: TNode, hostView: LView): RNode { return unwrapRNode(hostView[tNode.index]); } +/** + * A helper function that returns `true` if a given `TNode` has any matching directives. + */ +export function hasDirectives(tNode: TNode): boolean { + return tNode.directiveEnd > tNode.directiveStart; +} + export function getTNode(index: number, view: LView): TNode { ngDevMode && assertGreaterThan(index, -1, 'wrong index for TNode'); ngDevMode && assertLessThan(index, view[TVIEW].data.length, 'wrong index for TNode'); diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 7f8e07c77b..2673be4132 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -848,6 +848,9 @@ { "name": "hasClassInput" }, + { + "name": "hasDirectives" + }, { "name": "hasParentInjector" }, From 6a8cca797536dc69e18266741d70790eccb2121d Mon Sep 17 00:00:00 2001 From: Olivier Combe Date: Thu, 11 Apr 2019 17:52:55 +0200 Subject: [PATCH 0738/1073] feat(ivy): use i18n locale data to determine the plural form of ICU expressions (#29249) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural ICU expressions depend on the locale (different languages have different plural forms). Until now the locale was hard coded as `en-US`. For compatibility reasons, if you use ivy with AOT and bootstrap your app with `bootstrapModule` then the `LOCALE_ID` token will be set automatically for ivy, which is then used to get the correct plural form. If you use JIT, you need to define the `LOCALE_ID` provider on the module that you bootstrap. For `TestBed` you can use either `configureTestingModule` or `overrideProvider` to define that provider. If you don't use the compat mode and start your app with `renderComponent` you need to call `ɵsetLocaleId` manually to define the `LOCALE_ID` before bootstrap. We expect this to change once we start adding the new i18n APIs, so don't rely on this function (there's a reason why it's a private export). PR Close #29249 --- packages/common/src/i18n/locale_data.ts | 31 +- packages/common/src/i18n/locale_data_api.ts | 51 +-- .../common/test/i18n/locale_data_api_spec.ts | 3 +- .../src/ngtsc/annotations/src/ng_module.ts | 21 +- packages/compiler-cli/src/ngtsc/program.ts | 3 +- packages/core/src/application_ref.ts | 5 + packages/core/src/core_private_export.ts | 2 + .../core/src/core_render3_private_export.ts | 2 + packages/core/src/i18n/locale_data.ts | 38 ++ packages/core/src/i18n/locale_data_api.ts | 53 +++ .../{common => core}/src/i18n/locale_en.ts | 0 packages/core/src/i18n/localization.ts | 31 ++ packages/core/src/render3/component.ts | 2 +- packages/core/src/render3/definition.ts | 6 +- packages/core/src/render3/fields.ts | 1 + packages/core/src/render3/i18n.ts | 382 ++---------------- packages/core/src/render3/index.ts | 3 + packages/core/src/render3/jit/module.ts | 1 - packages/core/src/render3/ng_module_ref.ts | 8 +- packages/core/test/BUILD.bazel | 1 + packages/core/test/application_ref_spec.ts | 21 +- packages/core/test/i18n_integration_spec.ts | 45 ++- packages/core/test/render3/BUILD.bazel | 1 + packages/core/test/render3/i18n_spec.ts | 60 ++- .../core/testing/src/r3_test_bed_compiler.ts | 9 +- tools/gulp-tasks/cldr/extract.js | 15 +- tools/public_api_guard/common/common.d.ts | 2 +- 27 files changed, 346 insertions(+), 451 deletions(-) create mode 100644 packages/core/src/i18n/locale_data.ts create mode 100644 packages/core/src/i18n/locale_data_api.ts rename packages/{common => core}/src/i18n/locale_en.ts (100%) create mode 100644 packages/core/src/i18n/localization.ts diff --git a/packages/common/src/i18n/locale_data.ts b/packages/common/src/i18n/locale_data.ts index 1d3301999a..975dcc0b69 100644 --- a/packages/common/src/i18n/locale_data.ts +++ b/packages/common/src/i18n/locale_data.ts @@ -6,10 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -/** - * @publicApi - */ -export const LOCALE_DATA: {[localeId: string]: any} = {}; +import {ɵLOCALE_DATA as LOCALE_DATA, ɵLocaleDataIndex as LocaleDataIndex} from '@angular/core'; /** * Register global data to be used internally by Angular. See the @@ -33,32 +30,6 @@ export function registerLocaleData(data: any, localeId?: string | any, extraData } } -/** - * Index of each type of locale data from the locale data array - */ -export const enum LocaleDataIndex { - LocaleId = 0, - DayPeriodsFormat, - DayPeriodsStandalone, - DaysFormat, - DaysStandalone, - MonthsFormat, - MonthsStandalone, - Eras, - FirstDayOfWeek, - WeekendRange, - DateFormat, - TimeFormat, - DateTimeFormat, - NumberSymbols, - NumberFormats, - CurrencySymbol, - CurrencyName, - Currencies, - PluralCase, - ExtraData -} - /** * Index of each type of locale data from the extra locale data array */ diff --git a/packages/common/src/i18n/locale_data_api.ts b/packages/common/src/i18n/locale_data_api.ts index 46d02421cc..072add5903 100644 --- a/packages/common/src/i18n/locale_data_api.ts +++ b/packages/common/src/i18n/locale_data_api.ts @@ -6,9 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import localeEn from './locale_en'; -import {LOCALE_DATA, LocaleDataIndex, ExtraLocaleDataIndex, CurrencyIndex} from './locale_data'; +import {ɵLocaleDataIndex as LocaleDataIndex, ɵfindLocaleData as findLocaleData, ɵgetLocalePluralCase} from '@angular/core'; import {CURRENCIES_EN, CurrenciesSymbols} from './currencies'; +import {CurrencyIndex, ExtraLocaleDataIndex} from './locale_data'; /** * Format styles that can be used to represent numbers. @@ -31,7 +31,8 @@ export enum NumberFormatStyle { * @see `NgPluralCase` * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) * - * @publicApi */ + * @publicApi + */ export enum Plural { Zero = 0, One = 1, @@ -485,19 +486,11 @@ function getLocaleCurrencies(locale: string): {[code: string]: CurrenciesSymbols } /** - * Retrieves the plural function used by ICU expressions to determine the plural case to use - * for a given locale. - * @param locale A locale code for the locale format rules to use. - * @returns The plural function for the locale. - * @see `NgPlural` - * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) - * + * @alias core/ɵgetLocalePluralCase * @publicApi */ -export function getLocalePluralCase(locale: string): (value: number) => Plural { - const data = findLocaleData(locale); - return data[LocaleDataIndex.PluralCase]; -} +export const getLocalePluralCase: (locale: string) => ((value: number) => Plural) = + ɵgetLocalePluralCase; function checkFullData(data: any) { if (!data[LocaleDataIndex.ExtraData]) { @@ -609,37 +602,7 @@ function extractTime(time: string): Time { return {hours: +h, minutes: +m}; } -/** - * Finds the locale data for a given locale. - * - * @param locale The locale code. - * @returns The locale data. - * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) - * - * @publicApi - */ -export function findLocaleData(locale: string): any { - const normalizedLocale = locale.toLowerCase().replace(/_/g, '-'); - let match = LOCALE_DATA[normalizedLocale]; - if (match) { - return match; - } - - // let's try to find a parent locale - const parentLocale = normalizedLocale.split('-')[0]; - match = LOCALE_DATA[parentLocale]; - - if (match) { - return match; - } - - if (parentLocale === 'en') { - return localeEn; - } - - throw new Error(`Missing locale data for the locale "${locale}".`); -} /** * Retrieves the currency symbol for a given currency code. diff --git a/packages/common/test/i18n/locale_data_api_spec.ts b/packages/common/test/i18n/locale_data_api_spec.ts index 9fee387070..6babf0bd20 100644 --- a/packages/common/test/i18n/locale_data_api_spec.ts +++ b/packages/common/test/i18n/locale_data_api_spec.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +import {ɵfindLocaleData as findLocaleData} from '@angular/core'; import localeCaESVALENCIA from '@angular/common/locales/ca-ES-VALENCIA'; import localeEn from '@angular/common/locales/en'; import localeFr from '@angular/common/locales/fr'; @@ -13,7 +14,7 @@ import localeZh from '@angular/common/locales/zh'; import localeFrCA from '@angular/common/locales/fr-CA'; import localeEnAU from '@angular/common/locales/en-AU'; import {registerLocaleData} from '../../src/i18n/locale_data'; -import {findLocaleData, getCurrencySymbol, getLocaleDateFormat, FormatWidth, getNumberOfCurrencyDigits} from '../../src/i18n/locale_data_api'; +import {getCurrencySymbol, getLocaleDateFormat, FormatWidth, getNumberOfCurrencyDigits} from '../../src/i18n/locale_data_api'; { describe('locale data api', () => { diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts index f82c2db834..de599637a3 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts @@ -6,7 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ -import {Expression, ExternalExpr, InvokeFunctionExpr, LiteralArrayExpr, R3Identifiers, R3InjectorMetadata, R3NgModuleMetadata, R3Reference, Statement, WrappedNodeExpr, compileInjector, compileNgModule} from '@angular/compiler'; +import {Expression, ExternalExpr, InvokeFunctionExpr, LiteralArrayExpr, LiteralExpr, R3Identifiers, R3InjectorMetadata, R3NgModuleMetadata, R3Reference, Statement, WrappedNodeExpr, compileInjector, compileNgModule} from '@angular/compiler'; +import {STRING_TYPE} from '@angular/compiler/src/output/output_ast'; import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; @@ -17,7 +18,6 @@ import {NgModuleRouteAnalyzer} from '../../routing'; import {LocalModuleScopeRegistry, ScopeData} from '../../scope'; import {AnalysisOutput, CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence, ResolveResult} from '../../transform'; import {getSourceFile} from '../../util/src/typescript'; - import {generateSetClassMetadataCall} from './metadata'; import {ReferencesRegistry} from './references_registry'; import {combineResolvers, findAngularDecorator, forwardRefResolver, getValidConstructorDependencies, isExpressionForwardReference, toR3Reference, unwrapExpression} from './util'; @@ -41,7 +41,7 @@ export class NgModuleDecoratorHandler implements DecoratorHandler remove(this._modules, moduleRef)); ngZone !.runOutsideAngular( () => ngZone !.onError.subscribe( diff --git a/packages/core/src/core_private_export.ts b/packages/core/src/core_private_export.ts index 1a446cbee5..a97e2d467e 100644 --- a/packages/core/src/core_private_export.ts +++ b/packages/core/src/core_private_export.ts @@ -34,3 +34,5 @@ export {makeDecorator as ɵmakeDecorator} from './util/decorators'; export {isObservable as ɵisObservable, isPromise as ɵisPromise} from './util/lang'; export {clearOverrides as ɵclearOverrides, initServicesIfNeeded as ɵinitServicesIfNeeded, overrideComponentView as ɵoverrideComponentView, overrideProvider as ɵoverrideProvider} from './view/index'; export {NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR} from './view/provider'; +export {getLocalePluralCase as ɵgetLocalePluralCase, findLocaleData as ɵfindLocaleData} from './i18n/locale_data_api'; +export {LOCALE_DATA as ɵLOCALE_DATA, LocaleDataIndex as ɵLocaleDataIndex} from './i18n/locale_data'; diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts index 179735a15e..ec94366dc0 100644 --- a/packages/core/src/core_render3_private_export.ts +++ b/packages/core/src/core_render3_private_export.ts @@ -136,6 +136,8 @@ export { ɵɵi18nPostprocess, i18nConfigureLocalize as ɵi18nConfigureLocalize, ɵɵi18nLocalize, + setLocaleId as ɵsetLocaleId, + DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID, setClassMetadata as ɵsetClassMetadata, ɵɵresolveWindow, ɵɵresolveDocument, diff --git a/packages/core/src/i18n/locale_data.ts b/packages/core/src/i18n/locale_data.ts new file mode 100644 index 0000000000..734cc16680 --- /dev/null +++ b/packages/core/src/i18n/locale_data.ts @@ -0,0 +1,38 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +/** + * This const is used to store the locale data registered with `registerLocaleData` + */ +export const LOCALE_DATA: {[localeId: string]: any} = {}; + +/** + * Index of each type of locale data from the locale data array + */ +export enum LocaleDataIndex { + LocaleId = 0, + DayPeriodsFormat, + DayPeriodsStandalone, + DaysFormat, + DaysStandalone, + MonthsFormat, + MonthsStandalone, + Eras, + FirstDayOfWeek, + WeekendRange, + DateFormat, + TimeFormat, + DateTimeFormat, + NumberSymbols, + NumberFormats, + CurrencySymbol, + CurrencyName, + Currencies, + PluralCase, + ExtraData +} diff --git a/packages/core/src/i18n/locale_data_api.ts b/packages/core/src/i18n/locale_data_api.ts new file mode 100644 index 0000000000..cc30c20348 --- /dev/null +++ b/packages/core/src/i18n/locale_data_api.ts @@ -0,0 +1,53 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {LOCALE_DATA, LocaleDataIndex} from './locale_data'; +import localeEn from './locale_en'; + +/** + * Retrieves the plural function used by ICU expressions to determine the plural case to use + * for a given locale. + * @param locale A locale code for the locale format rules to use. + * @returns The plural function for the locale. + * @see `NgPlural` + * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) + */ +export function getLocalePluralCase(locale: string): (value: number) => number { + const data = findLocaleData(locale); + return data[LocaleDataIndex.PluralCase]; +} + +/** + * Finds the locale data for a given locale. + * + * @param locale The locale code. + * @returns The locale data. + * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) + */ +export function findLocaleData(locale: string): any { + const normalizedLocale = locale.toLowerCase().replace(/_/g, '-'); + + let match = LOCALE_DATA[normalizedLocale]; + if (match) { + return match; + } + + // let's try to find a parent locale + const parentLocale = normalizedLocale.split('-')[0]; + match = LOCALE_DATA[parentLocale]; + + if (match) { + return match; + } + + if (parentLocale === 'en') { + return localeEn; + } + + throw new Error(`Missing locale data for the locale "${locale}".`); +} diff --git a/packages/common/src/i18n/locale_en.ts b/packages/core/src/i18n/locale_en.ts similarity index 100% rename from packages/common/src/i18n/locale_en.ts rename to packages/core/src/i18n/locale_en.ts diff --git a/packages/core/src/i18n/localization.ts b/packages/core/src/i18n/localization.ts new file mode 100644 index 0000000000..0cb492f18b --- /dev/null +++ b/packages/core/src/i18n/localization.ts @@ -0,0 +1,31 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {getLocalePluralCase} from './locale_data_api'; + +/** + * Returns the plural case based on the locale + */ +export function getPluralCase(value: any, locale: string): string { + const plural = getLocalePluralCase(locale)(value); + + switch (plural) { + case 0: + return 'zero'; + case 1: + return 'one'; + case 2: + return 'two'; + case 3: + return 'few'; + case 4: + return 'many'; + default: + return 'other'; + } +} diff --git a/packages/core/src/render3/component.ts b/packages/core/src/render3/component.ts index c93d8a10b0..f03645f88f 100644 --- a/packages/core/src/render3/component.ts +++ b/packages/core/src/render3/component.ts @@ -60,7 +60,7 @@ export interface CreateComponentOptions { * Typically, the features in this list are features that cannot be added to the * other features list in the component definition because they rely on other factors. * - * Example: `RootLifecycleHooks` is a function that adds lifecycle hook capabilities + * Example: `LifecycleHooksFeature` is a function that adds lifecycle hook capabilities * to root components in a tree-shakable way. It cannot be added to the component * features list because there's no way of knowing when the component will be used as * a root component. diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 5c1fe79af0..a9a8f97299 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -17,7 +17,7 @@ import {noSideEffects} from '../util/closure'; import {stringify} from '../util/stringify'; import {EMPTY_ARRAY, EMPTY_OBJ} from './empty'; -import {NG_COMPONENT_DEF, NG_DIRECTIVE_DEF, NG_MODULE_DEF, NG_PIPE_DEF} from './fields'; +import {NG_COMPONENT_DEF, NG_DIRECTIVE_DEF, NG_LOCALE_ID_DEF, NG_MODULE_DEF, NG_PIPE_DEF} from './fields'; import {ComponentDef, ComponentDefFeature, ComponentTemplate, ComponentType, ContentQueriesFunction, DirectiveDef, DirectiveDefFeature, DirectiveType, DirectiveTypesOrFactory, FactoryFn, HostBindingsFunction, PipeDef, PipeType, PipeTypesOrFactory, ViewQueriesFunction, ɵɵBaseDef} from './interfaces/definition'; // while SelectorFlags is unused here, it's required so that types don't get resolved lazily // see: https://github.com/Microsoft/web-build-tools/issues/1050 @@ -738,3 +738,7 @@ export function getNgModuleDef(type: any, throwNotFound?: boolean): NgModuleD } return ngModuleDef; } + +export function getNgLocaleIdDef(type: any): string|null { + return (type as any)[NG_LOCALE_ID_DEF] || null; +} diff --git a/packages/core/src/render3/fields.ts b/packages/core/src/render3/fields.ts index 26b29af9da..92642b417f 100644 --- a/packages/core/src/render3/fields.ts +++ b/packages/core/src/render3/fields.ts @@ -12,6 +12,7 @@ export const NG_COMPONENT_DEF = getClosureSafeProperty({ngComponentDef: getClosu export const NG_DIRECTIVE_DEF = getClosureSafeProperty({ngDirectiveDef: getClosureSafeProperty}); export const NG_PIPE_DEF = getClosureSafeProperty({ngPipeDef: getClosureSafeProperty}); export const NG_MODULE_DEF = getClosureSafeProperty({ngModuleDef: getClosureSafeProperty}); +export const NG_LOCALE_ID_DEF = getClosureSafeProperty({ngLocaleIdDef: getClosureSafeProperty}); export const NG_BASE_DEF = getClosureSafeProperty({ngBaseDef: getClosureSafeProperty}); /** diff --git a/packages/core/src/render3/i18n.ts b/packages/core/src/render3/i18n.ts index 26e7eae042..9924e1904f 100644 --- a/packages/core/src/render3/i18n.ts +++ b/packages/core/src/render3/i18n.ts @@ -7,13 +7,12 @@ */ import '../util/ng_i18n_closure_mode'; - +import {getPluralCase} from '../i18n/localization'; import {SRCSET_ATTRS, URI_ATTRS, VALID_ATTRS, VALID_ELEMENTS, getTemplateContent} from '../sanitization/html_sanitizer'; import {InertBodyHelper} from '../sanitization/inert_body'; import {_sanitizeUrl, sanitizeSrcset} from '../sanitization/url_sanitizer'; import {addAllToArray} from '../util/array_utils'; import {assertDefined, assertEqual, assertGreaterThan} from '../util/assert'; - import {attachPatchData} from './context_discovery'; import {attachI18nOpCodesDebug} from './debug'; import {ɵɵelementAttribute, ɵɵload, ɵɵtextBinding} from './instructions/all'; @@ -1026,351 +1025,6 @@ export function ɵɵi18nApply(index: number) { } } -enum Plural { - Zero = 0, - One = 1, - Two = 2, - Few = 3, - Many = 4, - Other = 5, -} - -/** - * Returns the plural case based on the locale. - * This is a copy of the deprecated function that we used in Angular v4. - * // TODO(ocombe): remove this once we can the real getPluralCase function - * - * @deprecated from v5 the plural case function is in locale data files common/locales/*.ts - */ -function getPluralCase(locale: string, nLike: number | string): Plural { - if (typeof nLike === 'string') { - nLike = parseInt(nLike, 10); - } - const n: number = nLike as number; - const nDecimal = n.toString().replace(/^[^.]*\.?/, ''); - const i = Math.floor(Math.abs(n)); - const v = nDecimal.length; - const f = parseInt(nDecimal, 10); - const t = parseInt(n.toString().replace(/^[^.]*\.?|0+$/g, ''), 10) || 0; - - const lang = locale.split('-')[0].toLowerCase(); - - switch (lang) { - case 'af': - case 'asa': - case 'az': - case 'bem': - case 'bez': - case 'bg': - case 'brx': - case 'ce': - case 'cgg': - case 'chr': - case 'ckb': - case 'ee': - case 'el': - case 'eo': - case 'es': - case 'eu': - case 'fo': - case 'fur': - case 'gsw': - case 'ha': - case 'haw': - case 'hu': - case 'jgo': - case 'jmc': - case 'ka': - case 'kk': - case 'kkj': - case 'kl': - case 'ks': - case 'ksb': - case 'ky': - case 'lb': - case 'lg': - case 'mas': - case 'mgo': - case 'ml': - case 'mn': - case 'nb': - case 'nd': - case 'ne': - case 'nn': - case 'nnh': - case 'nyn': - case 'om': - case 'or': - case 'os': - case 'ps': - case 'rm': - case 'rof': - case 'rwk': - case 'saq': - case 'seh': - case 'sn': - case 'so': - case 'sq': - case 'ta': - case 'te': - case 'teo': - case 'tk': - case 'tr': - case 'ug': - case 'uz': - case 'vo': - case 'vun': - case 'wae': - case 'xog': - if (n === 1) return Plural.One; - return Plural.Other; - case 'ak': - case 'ln': - case 'mg': - case 'pa': - case 'ti': - if (n === Math.floor(n) && n >= 0 && n <= 1) return Plural.One; - return Plural.Other; - case 'am': - case 'as': - case 'bn': - case 'fa': - case 'gu': - case 'hi': - case 'kn': - case 'mr': - case 'zu': - if (i === 0 || n === 1) return Plural.One; - return Plural.Other; - case 'ar': - if (n === 0) return Plural.Zero; - if (n === 1) return Plural.One; - if (n === 2) return Plural.Two; - if (n % 100 === Math.floor(n % 100) && n % 100 >= 3 && n % 100 <= 10) return Plural.Few; - if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 99) return Plural.Many; - return Plural.Other; - case 'ast': - case 'ca': - case 'de': - case 'en': - case 'et': - case 'fi': - case 'fy': - case 'gl': - case 'it': - case 'nl': - case 'sv': - case 'sw': - case 'ur': - case 'yi': - if (i === 1 && v === 0) return Plural.One; - return Plural.Other; - case 'be': - if (n % 10 === 1 && !(n % 100 === 11)) return Plural.One; - if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 4 && - !(n % 100 >= 12 && n % 100 <= 14)) - return Plural.Few; - if (n % 10 === 0 || n % 10 === Math.floor(n % 10) && n % 10 >= 5 && n % 10 <= 9 || - n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 14) - return Plural.Many; - return Plural.Other; - case 'br': - if (n % 10 === 1 && !(n % 100 === 11 || n % 100 === 71 || n % 100 === 91)) return Plural.One; - if (n % 10 === 2 && !(n % 100 === 12 || n % 100 === 72 || n % 100 === 92)) return Plural.Two; - if (n % 10 === Math.floor(n % 10) && (n % 10 >= 3 && n % 10 <= 4 || n % 10 === 9) && - !(n % 100 >= 10 && n % 100 <= 19 || n % 100 >= 70 && n % 100 <= 79 || - n % 100 >= 90 && n % 100 <= 99)) - return Plural.Few; - if (!(n === 0) && n % 1e6 === 0) return Plural.Many; - return Plural.Other; - case 'bs': - case 'hr': - case 'sr': - if (v === 0 && i % 10 === 1 && !(i % 100 === 11) || f % 10 === 1 && !(f % 100 === 11)) - return Plural.One; - if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 && - !(i % 100 >= 12 && i % 100 <= 14) || - f % 10 === Math.floor(f % 10) && f % 10 >= 2 && f % 10 <= 4 && - !(f % 100 >= 12 && f % 100 <= 14)) - return Plural.Few; - return Plural.Other; - case 'cs': - case 'sk': - if (i === 1 && v === 0) return Plural.One; - if (i === Math.floor(i) && i >= 2 && i <= 4 && v === 0) return Plural.Few; - if (!(v === 0)) return Plural.Many; - return Plural.Other; - case 'cy': - if (n === 0) return Plural.Zero; - if (n === 1) return Plural.One; - if (n === 2) return Plural.Two; - if (n === 3) return Plural.Few; - if (n === 6) return Plural.Many; - return Plural.Other; - case 'da': - if (n === 1 || !(t === 0) && (i === 0 || i === 1)) return Plural.One; - return Plural.Other; - case 'dsb': - case 'hsb': - if (v === 0 && i % 100 === 1 || f % 100 === 1) return Plural.One; - if (v === 0 && i % 100 === 2 || f % 100 === 2) return Plural.Two; - if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 || - f % 100 === Math.floor(f % 100) && f % 100 >= 3 && f % 100 <= 4) - return Plural.Few; - return Plural.Other; - case 'ff': - case 'fr': - case 'hy': - case 'kab': - if (i === 0 || i === 1) return Plural.One; - return Plural.Other; - case 'fil': - if (v === 0 && (i === 1 || i === 2 || i === 3) || - v === 0 && !(i % 10 === 4 || i % 10 === 6 || i % 10 === 9) || - !(v === 0) && !(f % 10 === 4 || f % 10 === 6 || f % 10 === 9)) - return Plural.One; - return Plural.Other; - case 'ga': - if (n === 1) return Plural.One; - if (n === 2) return Plural.Two; - if (n === Math.floor(n) && n >= 3 && n <= 6) return Plural.Few; - if (n === Math.floor(n) && n >= 7 && n <= 10) return Plural.Many; - return Plural.Other; - case 'gd': - if (n === 1 || n === 11) return Plural.One; - if (n === 2 || n === 12) return Plural.Two; - if (n === Math.floor(n) && (n >= 3 && n <= 10 || n >= 13 && n <= 19)) return Plural.Few; - return Plural.Other; - case 'gv': - if (v === 0 && i % 10 === 1) return Plural.One; - if (v === 0 && i % 10 === 2) return Plural.Two; - if (v === 0 && - (i % 100 === 0 || i % 100 === 20 || i % 100 === 40 || i % 100 === 60 || i % 100 === 80)) - return Plural.Few; - if (!(v === 0)) return Plural.Many; - return Plural.Other; - case 'he': - if (i === 1 && v === 0) return Plural.One; - if (i === 2 && v === 0) return Plural.Two; - if (v === 0 && !(n >= 0 && n <= 10) && n % 10 === 0) return Plural.Many; - return Plural.Other; - case 'is': - if (t === 0 && i % 10 === 1 && !(i % 100 === 11) || !(t === 0)) return Plural.One; - return Plural.Other; - case 'ksh': - if (n === 0) return Plural.Zero; - if (n === 1) return Plural.One; - return Plural.Other; - case 'kw': - case 'naq': - case 'se': - case 'smn': - if (n === 1) return Plural.One; - if (n === 2) return Plural.Two; - return Plural.Other; - case 'lag': - if (n === 0) return Plural.Zero; - if ((i === 0 || i === 1) && !(n === 0)) return Plural.One; - return Plural.Other; - case 'lt': - if (n % 10 === 1 && !(n % 100 >= 11 && n % 100 <= 19)) return Plural.One; - if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 9 && - !(n % 100 >= 11 && n % 100 <= 19)) - return Plural.Few; - if (!(f === 0)) return Plural.Many; - return Plural.Other; - case 'lv': - case 'prg': - if (n % 10 === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19 || - v === 2 && f % 100 === Math.floor(f % 100) && f % 100 >= 11 && f % 100 <= 19) - return Plural.Zero; - if (n % 10 === 1 && !(n % 100 === 11) || v === 2 && f % 10 === 1 && !(f % 100 === 11) || - !(v === 2) && f % 10 === 1) - return Plural.One; - return Plural.Other; - case 'mk': - if (v === 0 && i % 10 === 1 || f % 10 === 1) return Plural.One; - return Plural.Other; - case 'mt': - if (n === 1) return Plural.One; - if (n === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 2 && n % 100 <= 10) - return Plural.Few; - if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19) return Plural.Many; - return Plural.Other; - case 'pl': - if (i === 1 && v === 0) return Plural.One; - if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 && - !(i % 100 >= 12 && i % 100 <= 14)) - return Plural.Few; - if (v === 0 && !(i === 1) && i % 10 === Math.floor(i % 10) && i % 10 >= 0 && i % 10 <= 1 || - v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 || - v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 12 && i % 100 <= 14) - return Plural.Many; - return Plural.Other; - case 'pt': - if (n === Math.floor(n) && n >= 0 && n <= 2 && !(n === 2)) return Plural.One; - return Plural.Other; - case 'ro': - if (i === 1 && v === 0) return Plural.One; - if (!(v === 0) || n === 0 || - !(n === 1) && n % 100 === Math.floor(n % 100) && n % 100 >= 1 && n % 100 <= 19) - return Plural.Few; - return Plural.Other; - case 'ru': - case 'uk': - if (v === 0 && i % 10 === 1 && !(i % 100 === 11)) return Plural.One; - if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 && - !(i % 100 >= 12 && i % 100 <= 14)) - return Plural.Few; - if (v === 0 && i % 10 === 0 || - v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 || - v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 11 && i % 100 <= 14) - return Plural.Many; - return Plural.Other; - case 'shi': - if (i === 0 || n === 1) return Plural.One; - if (n === Math.floor(n) && n >= 2 && n <= 10) return Plural.Few; - return Plural.Other; - case 'si': - if (n === 0 || n === 1 || i === 0 && f === 1) return Plural.One; - return Plural.Other; - case 'sl': - if (v === 0 && i % 100 === 1) return Plural.One; - if (v === 0 && i % 100 === 2) return Plural.Two; - if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 || !(v === 0)) - return Plural.Few; - return Plural.Other; - case 'tzm': - if (n === Math.floor(n) && n >= 0 && n <= 1 || n === Math.floor(n) && n >= 11 && n <= 99) - return Plural.One; - return Plural.Other; - // When there is no specification, the default is always "other" - // Spec: http://cldr.unicode.org/index/cldr-spec/plural-rules - // > other (required—general plural form — also used if the language only has a single form) - default: - return Plural.Other; - } -} - -function getPluralCategory(value: any, locale: string): string { - const plural = getPluralCase(locale, value); - - switch (plural) { - case Plural.Zero: - return 'zero'; - case Plural.One: - return 'one'; - case Plural.Two: - return 'two'; - case Plural.Few: - return 'few'; - case Plural.Many: - return 'many'; - default: - return 'other'; - } -} - /** * Returns the index of the current case of an ICU expression depending on the main binding value * @@ -1382,9 +1036,7 @@ function getCaseIndex(icuExpression: TIcu, bindingValue: string): number { if (index === -1) { switch (icuExpression.type) { case IcuType.plural: { - // TODO(ocombe): replace this hard-coded value by the real LOCALE_ID value - const locale = 'en-US'; - const resolvedCase = getPluralCategory(bindingValue, locale); + const resolvedCase = getPluralCase(bindingValue, getLocaleId()); index = icuExpression.cases.indexOf(resolvedCase); if (index === -1 && resolvedCase !== 'other') { index = icuExpression.cases.indexOf('other'); @@ -1630,7 +1282,7 @@ const LOCALIZE_PH_REGEXP = /\{\$(.*?)\}/g; * running outside of Closure Compiler. This method will not be needed once runtime translation * service support is introduced. * - * @publicApi + * @codeGenApi * @deprecated this method is temporary & should not be used as it will be removed soon */ export function ɵɵi18nLocalize(input: string, placeholders: {[key: string]: string} = {}) { @@ -1641,3 +1293,31 @@ export function ɵɵi18nLocalize(input: string, placeholders: {[key: string]: st input.replace(LOCALIZE_PH_REGEXP, (match, key) => placeholders[key] || '') : input; } + +/** + * The locale id that the application is currently using (for translations and ICU expressions). + * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine + * but is now defined as a global value. + */ +export const DEFAULT_LOCALE_ID = 'en-US'; +let LOCALE_ID = DEFAULT_LOCALE_ID; + +/** + * Sets the locale id that will be used for translations and ICU expressions. + * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine + * but is now defined as a global value. + * + * @param localeId + */ +export function setLocaleId(localeId: string) { + LOCALE_ID = localeId.toLowerCase().replace(/_/g, '-'); +} + +/** + * Gets the locale id that will be used for translations and ICU expressions. + * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine + * but is now defined as a global value. + */ +export function getLocaleId(): string { + return LOCALE_ID; +} diff --git a/packages/core/src/render3/index.ts b/packages/core/src/render3/index.ts index 408f786824..4d81e5a017 100644 --- a/packages/core/src/render3/index.ts +++ b/packages/core/src/render3/index.ts @@ -100,6 +100,7 @@ export { } from './state'; export { + DEFAULT_LOCALE_ID, ɵɵi18n, ɵɵi18nAttributes, ɵɵi18nExp, @@ -109,6 +110,8 @@ export { ɵɵi18nPostprocess, i18nConfigureLocalize, ɵɵi18nLocalize, + getLocaleId, + setLocaleId, } from './i18n'; export {NgModuleFactory, NgModuleRef, NgModuleType} from './ng_module_ref'; diff --git a/packages/core/src/render3/jit/module.ts b/packages/core/src/render3/jit/module.ts index c7c758b489..dc9b35f406 100644 --- a/packages/core/src/render3/jit/module.ts +++ b/packages/core/src/render3/jit/module.ts @@ -99,7 +99,6 @@ export function compileNgModuleDefs(moduleType: NgModuleType, ngModule: NgModule ngDevMode && assertDefined(moduleType, 'Required value moduleType'); ngDevMode && assertDefined(ngModule, 'Required value ngModule'); const declarations: Type[] = flatten(ngModule.declarations || EMPTY_ARRAY); - let ngModuleDef: any = null; Object.defineProperty(moduleType, NG_MODULE_DEF, { configurable: true, diff --git a/packages/core/src/render3/ng_module_ref.ts b/packages/core/src/render3/ng_module_ref.ts index d445ded545..fce592b1d4 100644 --- a/packages/core/src/render3/ng_module_ref.ts +++ b/packages/core/src/render3/ng_module_ref.ts @@ -17,7 +17,8 @@ import {NgModuleDef} from '../metadata/ng_module'; import {assertDefined} from '../util/assert'; import {stringify} from '../util/stringify'; import {ComponentFactoryResolver} from './component_ref'; -import {getNgModuleDef} from './definition'; +import {getNgLocaleIdDef, getNgModuleDef} from './definition'; +import {setLocaleId} from './i18n'; import {maybeUnwrapFn} from './util/misc_utils'; export interface NgModuleType extends Type { ngModuleDef: NgModuleDef; } @@ -44,6 +45,11 @@ export class NgModuleRef extends viewEngine_NgModuleRef implements Interna ngModuleDef, `NgModule '${stringify(ngModuleType)}' is not a subtype of 'NgModuleType'.`); + const ngLocaleIdDef = getNgLocaleIdDef(ngModuleType); + if (ngLocaleIdDef) { + setLocaleId(ngLocaleIdDef); + } + this._bootstrapComponents = maybeUnwrapFn(ngModuleDef !.bootstrap); const additionalProviders: StaticProvider[] = [ { diff --git a/packages/core/test/BUILD.bazel b/packages/core/test/BUILD.bazel index 99fa8a82cc..bc1d670deb 100644 --- a/packages/core/test/BUILD.bazel +++ b/packages/core/test/BUILD.bazel @@ -18,6 +18,7 @@ ts_library( "//packages/animations/browser", "//packages/animations/browser/testing", "//packages/common", + "//packages/common/locales", "//packages/compiler", "//packages/compiler/testing", "//packages/core", diff --git a/packages/core/test/application_ref_spec.ts b/packages/core/test/application_ref_spec.ts index 8a56680ec3..454b72afad 100644 --- a/packages/core/test/application_ref_spec.ts +++ b/packages/core/test/application_ref_spec.ts @@ -8,15 +8,16 @@ import {DOCUMENT} from '@angular/common'; import {ResourceLoader} from '@angular/compiler'; -import {APP_BOOTSTRAP_LISTENER, APP_INITIALIZER, Compiler, CompilerFactory, Component, InjectionToken, NgModule, NgZone, PlatformRef, TemplateRef, Type, ViewChild, ViewContainerRef} from '@angular/core'; +import {APP_BOOTSTRAP_LISTENER, APP_INITIALIZER, Compiler, CompilerFactory, Component, InjectionToken, LOCALE_ID, NgModule, NgZone, PlatformRef, TemplateRef, Type, ViewChild, ViewContainerRef} from '@angular/core'; import {ApplicationRef} from '@angular/core/src/application_ref'; import {ErrorHandler} from '@angular/core/src/error_handler'; import {ComponentRef} from '@angular/core/src/linker/component_factory'; +import {getLocaleId} from '@angular/core/src/render3'; import {BrowserModule} from '@angular/platform-browser'; import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; import {dispatchEvent} from '@angular/platform-browser/testing/src/browser_util'; import {expect} from '@angular/platform-browser/testing/src/matchers'; -import {ivyEnabled} from '@angular/private/testing'; +import {ivyEnabled, onlyInIvy} from '@angular/private/testing'; import {NoopNgZone} from '../src/zone/ng_zone'; import {ComponentFixtureNoNgZone, TestBed, async, inject, withModule} from '../testing'; @@ -326,6 +327,22 @@ class SomeComponent { expect(loadResourceSpy).toHaveBeenCalledTimes(1); expect(loadResourceSpy).toHaveBeenCalledWith('/test-template.html'); }); + + onlyInIvy('We only need to define `LOCALE_ID` for runtime i18n') + .it('should define `LOCALE_ID`', async() => { + @Component({ + selector: 'i18n-app', + templateUrl: '', + }) + class I18nComponent { + } + + const testModule = createModule( + {component: I18nComponent, providers: [{provide: LOCALE_ID, useValue: 'ro'}]}); + await defaultPlatform.bootstrapModule(testModule); + + expect(getLocaleId()).toEqual('ro'); + }); }); describe('bootstrapModuleFactory', () => { diff --git a/packages/core/test/i18n_integration_spec.ts b/packages/core/test/i18n_integration_spec.ts index af09a356a7..baa959e024 100644 --- a/packages/core/test/i18n_integration_spec.ts +++ b/packages/core/test/i18n_integration_spec.ts @@ -6,7 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, ContentChild, ContentChildren, Directive, QueryList, TemplateRef, ViewChild, ViewContainerRef, ɵi18nConfigureLocalize} from '@angular/core'; +import {registerLocaleData} from '@angular/common'; +import {Component, ContentChild, ContentChildren, Directive, LOCALE_ID, QueryList, TemplateRef, ViewChild, ViewContainerRef, ɵi18nConfigureLocalize} from '@angular/core'; +import localeRo from '@angular/common/locales/ro'; import {TestBed} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; import {onlyInIvy} from '@angular/private/testing'; @@ -637,4 +639,45 @@ onlyInIvy('Ivy i18n logic').describe('i18n', function() { expect(child.innerHTML).toBe(`
  • Section 1
  • Section 2
  • Section 3
  • `); } }); + + it('should return the correct plural form for ICU expressions when using a specific locale', + () => { + registerLocaleData(localeRo); + TestBed.configureTestingModule({providers: [{provide: LOCALE_ID, useValue: 'ro'}]}); + // We could also use `TestBed.overrideProvider(LOCALE_ID, {useValue: 'ro'});` + const template = ` + {count, plural, + =0 {no email} + =one {one email} + =few {a few emails} + =other {lots of emails} + }`; + const fixture = getFixtureWithOverrides({template}); + + expect(fixture.nativeElement.innerHTML).toEqual('a few emails'); + + // Change detection cycle, no model changes + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML).toEqual('a few emails'); + + fixture.componentInstance.count = 0; + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML).toEqual('no email'); + + fixture.componentInstance.count = 1; + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML).toEqual('one email'); + + fixture.componentInstance.count = 10; + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML).toEqual('a few emails'); + + fixture.componentInstance.count = 20; + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML).toEqual('lots of emails'); + + fixture.componentInstance.count = 0; + fixture.detectChanges(); + expect(fixture.nativeElement.innerHTML).toEqual('no email'); + }); }); diff --git a/packages/core/test/render3/BUILD.bazel b/packages/core/test/render3/BUILD.bazel index 2d769b430e..63749d9109 100644 --- a/packages/core/test/render3/BUILD.bazel +++ b/packages/core/test/render3/BUILD.bazel @@ -20,6 +20,7 @@ ts_library( "//packages/animations/browser", "//packages/animations/browser/testing", "//packages/common", + "//packages/common/locales", "//packages/compiler", "//packages/core", "//packages/core/src/di/interface", diff --git a/packages/core/test/render3/i18n_spec.ts b/packages/core/test/render3/i18n_spec.ts index 8f47b2509a..0a687a4d86 100644 --- a/packages/core/test/render3/i18n_spec.ts +++ b/packages/core/test/render3/i18n_spec.ts @@ -6,10 +6,11 @@ * found in the LICENSE file at https://angular.io/license */ -import {NgForOfContext} from '@angular/common'; +import {NgForOfContext, registerLocaleData} from '@angular/common'; +import localeRo from '@angular/common/locales/ro'; import {noop} from '../../../compiler/src/render3/view/util'; -import {Component as _Component} from '../../src/core'; +import {Component as _Component, ɵNgModuleDef as NgModuleDef, ɵɵdefineInjector} from '../../src/core'; import {ɵɵdefineComponent, ɵɵdefineDirective} from '../../src/render3/definition'; import {getTranslationForTemplate, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart} from '../../src/render3/i18n'; import {ɵɵallocHostVars, ɵɵbind, ɵɵelement, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementProperty, ɵɵelementStart, ɵɵnextContext, ɵɵprojection, ɵɵprojectionDef, ɵɵtemplate, ɵɵtext, ɵɵtextBinding} from '../../src/render3/instructions/all'; @@ -17,8 +18,8 @@ import {RenderFlags} from '../../src/render3/interfaces/definition'; import {COMMENT_MARKER, ELEMENT_MARKER, I18nMutateOpCode, I18nUpdateOpCode, I18nUpdateOpCodes, IcuType, TI18n} from '../../src/render3/interfaces/i18n'; import {AttributeMarker} from '../../src/render3/interfaces/node'; import {HEADER_OFFSET, LView, TVIEW} from '../../src/render3/interfaces/view'; +import {NgModuleFactory} from '../../src/render3/ng_module_ref'; import {getNativeByIndex, getTNode} from '../../src/render3/util/view_utils'; - import {NgForOf, NgIf} from './common_with_def'; import {ComponentFixture, TemplateFixture} from './render_util'; @@ -2259,4 +2260,57 @@ describe('Runtime i18n', () => { }); }); }); + + it('should return the correct plural form for ICU expressions when using a specific locale', + () => { + registerLocaleData(localeRo); + const MSG_DIV = `{�0�, plural, + =0 {no email} + =one {one email} + =few {a few emails} + =other {lots of emails} + }`; + const ctx = {value: 0}; + + class MyAppModule { + static ngLocaleIdDef = 'ro'; + static ngInjectorDef = ɵɵdefineInjector({factory: () => new MyAppModule()}); + static ngModuleDef: NgModuleDef = { bootstrap: [] } as any; + } + const myAppModuleFactory = new NgModuleFactory(MyAppModule); + const ngModuleRef = myAppModuleFactory.create(null); + + const fixture = prepareFixture( + () => { + ɵɵelementStart(0, 'div'); + ɵɵi18n(1, MSG_DIV); + ɵɵelementEnd(); + }, + () => { + ɵɵi18nExp(ɵɵbind(ctx.value)); + ɵɵi18nApply(1); + }, + 2, 1); + expect(fixture.html).toEqual('
    no email
    '); + + // Change detection cycle, no model changes + fixture.update(); + expect(fixture.html).toEqual('
    no email
    '); + + ctx.value = 1; + fixture.update(); + expect(fixture.html).toEqual('
    one email
    '); + + ctx.value = 10; + fixture.update(); + expect(fixture.html).toEqual('
    a few emails
    '); + + ctx.value = 20; + fixture.update(); + expect(fixture.html).toEqual('
    lots of emails
    '); + + ctx.value = 0; + fixture.update(); + expect(fixture.html).toEqual('
    no email
    '); + }); }); diff --git a/packages/core/testing/src/r3_test_bed_compiler.ts b/packages/core/testing/src/r3_test_bed_compiler.ts index aac9429371..39aa31fb62 100644 --- a/packages/core/testing/src/r3_test_bed_compiler.ts +++ b/packages/core/testing/src/r3_test_bed_compiler.ts @@ -6,10 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {ApplicationInitStatus, COMPILER_OPTIONS, Compiler, Component, Directive, ModuleWithComponentFactories, NgModule, NgModuleFactory, NgZone, Injector, Pipe, PlatformRef, Provider, Type, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, ɵNG_MODULE_DEF as NG_MODULE_DEF, ɵNG_PIPE_DEF as NG_PIPE_DEF, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ɵɵInjectableDef as InjectableDef, ɵNgModuleFactory as R3NgModuleFactory, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵDirectiveDef as DirectiveDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵtransitiveScopesFor as transitiveScopesFor,} from '@angular/core'; import {ResourceLoader} from '@angular/compiler'; +import {ApplicationInitStatus, COMPILER_OPTIONS, Compiler, Component, Directive, Injector, LOCALE_ID, ModuleWithComponentFactories, NgModule, NgModuleFactory, NgZone, Pipe, PlatformRef, Provider, Type, ɵDEFAULT_LOCALE_ID as DEFAULT_LOCALE_ID, ɵDirectiveDef as DirectiveDef, ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, ɵNG_MODULE_DEF as NG_MODULE_DEF, ɵNG_PIPE_DEF as NG_PIPE_DEF, ɵNgModuleFactory as R3NgModuleFactory, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵsetLocaleId as setLocaleId, ɵtransitiveScopesFor as transitiveScopesFor, ɵɵInjectableDef as InjectableDef} from '@angular/core'; -import {clearResolutionOfComponentResourcesQueue, restoreComponentResolutionQueue, resolveComponentResources, isComponentDefPendingResolution} from '../../src/metadata/resource_loading'; +import {clearResolutionOfComponentResourcesQueue, isComponentDefPendingResolution, resolveComponentResources, restoreComponentResolutionQueue} from '../../src/metadata/resource_loading'; import {MetadataOverride} from './metadata_override'; import {ComponentResolver, DirectiveResolver, NgModuleResolver, PipeResolver, Resolver} from './resolvers'; @@ -227,6 +227,9 @@ export class R3TestBedCompiler { const parentInjector = this.platform.injector; this.testModuleRef = new NgModuleRef(this.testModuleType, parentInjector); + // Set the locale ID, it can be overridden for the tests + const localeId = this.testModuleRef.injector.get(LOCALE_ID, DEFAULT_LOCALE_ID); + setLocaleId(localeId); // ApplicationInitStatus.runInitializers() is marked @internal to core. // Cast it to any before accessing it. @@ -501,6 +504,8 @@ export class R3TestBedCompiler { this.initialNgDefs.clear(); this.moduleProvidersOverridden.clear(); this.restoreComponentResolutionQueue(); + // Restore the locale ID to the default value, this shouldn't be necessary but we never know + setLocaleId(DEFAULT_LOCALE_ID); } private compileTestModule(): void { diff --git a/tools/gulp-tasks/cldr/extract.js b/tools/gulp-tasks/cldr/extract.js index 3c0e0ce16c..1a92bc8fd2 100644 --- a/tools/gulp-tasks/cldr/extract.js +++ b/tools/gulp-tasks/cldr/extract.js @@ -14,11 +14,14 @@ const cldr = require('cldr'); // used to extract all other cldr data const cldrJs = require('cldrjs'); -const PACKAGE_FOLDER = 'packages/common'; -const I18N_FOLDER = `${PACKAGE_FOLDER}/src/i18n`; -const I18N_DATA_FOLDER = `${PACKAGE_FOLDER}/locales`; +const COMMON_PACKAGE = 'packages/common'; +const CORE_PACKAGE = 'packages/core'; +const I18N_FOLDER = `${COMMON_PACKAGE}/src/i18n`; +const I18N_CORE_FOLDER = `${CORE_PACKAGE}/src/i18n`; +const I18N_DATA_FOLDER = `${COMMON_PACKAGE}/locales`; const I18N_DATA_EXTRA_FOLDER = `${I18N_DATA_FOLDER}/extra`; const RELATIVE_I18N_FOLDER = path.resolve(__dirname, `../../../${I18N_FOLDER}`); +const RELATIVE_I18N_CORE_FOLDER = path.resolve(__dirname, `../../../${I18N_CORE_FOLDER}`); const RELATIVE_I18N_DATA_FOLDER = path.resolve(__dirname, `../../../${I18N_DATA_FOLDER}`); const RELATIVE_I18N_DATA_EXTRA_FOLDER = path.resolve(__dirname, `../../../${I18N_DATA_EXTRA_FOLDER}`); const DEFAULT_RULE = 'function anonymous(n\n/*``*/) {\nreturn"other"\n}'; @@ -60,9 +63,9 @@ module.exports = (gulp, done) => { const baseCurrencies = generateBaseCurrencies(new cldrJs('en')); // additional "en" file that will be included in common - console.log(`Writing file ${I18N_FOLDER}/locale_en.ts`); + console.log(`Writing file ${I18N_CORE_FOLDER}/locale_en.ts`); const localeEnFile = generateLocale('en', new cldrJs('en'), baseCurrencies); - fs.writeFileSync(`${RELATIVE_I18N_FOLDER}/locale_en.ts`, localeEnFile); + fs.writeFileSync(`${RELATIVE_I18N_CORE_FOLDER}/locale_en.ts`, localeEnFile); LOCALES.forEach((locale, index) => { const localeData = new cldrJs(locale); @@ -82,7 +85,7 @@ module.exports = (gulp, done) => { .src([ `${I18N_DATA_FOLDER}/**/*.ts`, `${I18N_FOLDER}/currencies.ts`, - `${I18N_FOLDER}/locale_en.ts` + `${I18N_CORE_FOLDER}/locale_en.ts` ], {base: '.'}) .pipe(format.format('file', clangFormat)) .pipe(gulp.dest('.')); diff --git a/tools/public_api_guard/common/common.d.ts b/tools/public_api_guard/common/common.d.ts index 6ca180685f..9ee2ea35e3 100644 --- a/tools/public_api_guard/common/common.d.ts +++ b/tools/public_api_guard/common/common.d.ts @@ -103,7 +103,7 @@ export declare function getLocaleNumberFormat(locale: string, type: NumberFormat export declare function getLocaleNumberSymbol(locale: string, symbol: NumberSymbol): string; -export declare function getLocalePluralCase(locale: string): (value: number) => Plural; +export declare const getLocalePluralCase: (locale: string) => ((value: number) => Plural); export declare function getLocaleTimeFormat(locale: string, width: FormatWidth): string; From bd2ce9cd565d11dc22db9ebbcee7d86d5ae2bc6f Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Thu, 11 Apr 2019 15:09:45 -0700 Subject: [PATCH 0739/1073] fix(bazel): Install packages after `ng add` when invoked independently (#29852) PR Closes https://github.com/angular/angular/issues/29573 PR Close #29852 --- packages/bazel/src/schematics/ng-add/index.ts | 18 +++++++++++++++++- .../bazel/src/schematics/ng-add/index_spec.ts | 13 +++++++++++++ .../bazel/src/schematics/ng-add/schema.d.ts | 8 ++++++-- .../bazel/src/schematics/ng-add/schema.json | 5 +++++ packages/bazel/src/schematics/ng-new/index.ts | 12 +++++++++--- 5 files changed, 50 insertions(+), 6 deletions(-) diff --git a/packages/bazel/src/schematics/ng-add/index.ts b/packages/bazel/src/schematics/ng-add/index.ts index 16ea3b2c7f..2cd8a38034 100755 --- a/packages/bazel/src/schematics/ng-add/index.ts +++ b/packages/bazel/src/schematics/ng-add/index.ts @@ -10,6 +10,7 @@ import {JsonAstObject, parseJsonAst} from '@angular-devkit/core'; import {Rule, SchematicContext, SchematicsException, Tree, apply, applyTemplates, chain, mergeWith, url} from '@angular-devkit/schematics'; +import {NodePackageInstallTask} from '@angular-devkit/schematics/tasks'; import {getWorkspacePath} from '@schematics/angular/utility/config'; import {findPropertyInAstObject, insertPropertyInAstObjectInOrder} from '@schematics/angular/utility/json-utils'; import {validateProjectName} from '@schematics/angular/utility/validation'; @@ -54,7 +55,10 @@ function addDevDependenciesToPackageJson(options: Schema) { }; const recorder = host.beginUpdate(packageJson); - for (const packageName of Object.keys(devDependencies)) { + const depsToInstall = Object.keys(devDependencies).filter((name) => { + return !findPropertyInAstObject(devDeps, name); + }); + for (const packageName of depsToInstall) { const version = devDependencies[packageName]; const indent = 4; insertPropertyInAstObjectInOrder(recorder, devDeps, packageName, version, indent); @@ -346,6 +350,17 @@ function addPostinstallToGenerateNgSummaries() { }; } +/** + * Schedule a task to perform npm / yarn install. + */ +function installNodeModules(options: Schema): Rule { + return (host: Tree, context: SchematicContext) => { + if (!options.skipInstall) { + context.addTask(new NodePackageInstallTask()); + } + }; +} + export default function(options: Schema): Rule { return (host: Tree) => { validateProjectName(options.name); @@ -360,6 +375,7 @@ export default function(options: Schema): Rule { updateGitignore(), updateTsconfigJson(), upgradeRxjs(), + installNodeModules(options), ]); }; } diff --git a/packages/bazel/src/schematics/ng-add/index_spec.ts b/packages/bazel/src/schematics/ng-add/index_spec.ts index d1603d6527..26db953695 100644 --- a/packages/bazel/src/schematics/ng-add/index_spec.ts +++ b/packages/bazel/src/schematics/ng-add/index_spec.ts @@ -100,6 +100,19 @@ describe('ng-add schematic', () => { expect(devDeps).toContain('@bazel/karma'); }); + it('should not add an existing dev dependency', () => { + expect(host.files).toContain('/package.json'); + const packageJson = JSON.parse(host.readContent('/package.json')); + packageJson.devDependencies['@angular/bazel'] = '4.2.42'; + host.overwrite('/package.json', JSON.stringify(packageJson)); + host = schematicRunner.runSchematic('ng-add', defaultOptions, host); + const content = host.readContent('/package.json'); + // It is possible that a dep gets added twice if the package already exists. + expect(content.match(/@angular\/bazel/g) !.length).toEqual(1); + const json = JSON.parse(content); + expect(json.devDependencies['@angular/bazel']).toBe('4.2.42'); + }); + it('should not create Bazel workspace file', () => { host = schematicRunner.runSchematic('ng-add', defaultOptions, host); const {files} = host; diff --git a/packages/bazel/src/schematics/ng-add/schema.d.ts b/packages/bazel/src/schematics/ng-add/schema.d.ts index 4e0ad890ab..b9a512607f 100644 --- a/packages/bazel/src/schematics/ng-add/schema.d.ts +++ b/packages/bazel/src/schematics/ng-add/schema.d.ts @@ -1,6 +1,6 @@ -// THIS FILE IS AUTOMATICALLY GENERATED. TO UPDATE THIS FILE YOU NEED TO CHANGE -// THE CORRESPONDING JSON SCHEMA FILE. See README.md. +// THIS FILE IS AUTOMATICALLY GENERATED. TO UPDATE THIS FILE YOU NEED TO CHANGE THE +// CORRESPONDING JSON SCHEMA FILE, THEN RUN devkit-admin build (or bazel build ...). // tslint:disable:no-global-tslint-disable // tslint:disable @@ -10,4 +10,8 @@ export interface Schema { * The name of the project. */ name: string; + /** + * When true, does not install dependency packages. + */ + skipInstall?: boolean; } diff --git a/packages/bazel/src/schematics/ng-add/schema.json b/packages/bazel/src/schematics/ng-add/schema.json index dbfb4ab203..637c946540 100755 --- a/packages/bazel/src/schematics/ng-add/schema.json +++ b/packages/bazel/src/schematics/ng-add/schema.json @@ -12,6 +12,11 @@ "$source": "argv", "index": 0 } + }, + "skipInstall": { + "description": "When true, does not install dependency packages.", + "type": "boolean", + "default": false } }, "required": [ diff --git a/packages/bazel/src/schematics/ng-new/index.ts b/packages/bazel/src/schematics/ng-new/index.ts index e132ffec6f..94a3826399 100644 --- a/packages/bazel/src/schematics/ng-new/index.ts +++ b/packages/bazel/src/schematics/ng-new/index.ts @@ -18,9 +18,15 @@ export default function(options: Schema): Rule { return chain([ externalSchematic('@schematics/angular', 'ng-new', options), - schematic('ng-add', options, { - scope: options.name, - }), + schematic( + 'ng-add', { + name: options.name, + // skip install since `ng-new` above will schedule the task + skipInstall: true, + }, + { + scope: options.name, + }), ]); }; } From b2962db4cb172bc18f813c1cb3f787dac255d047 Mon Sep 17 00:00:00 2001 From: Ben Lesh Date: Thu, 11 Apr 2019 11:01:01 -0700 Subject: [PATCH 0740/1073] test: add additional test for codeGenApi (#29844) Addresses comments made by @gkalpak in #29820 PR Close #29844 --- .../src/render3/instructions/projection.ts | 2 +- tools/ts-api-guardian/test/unit_test.ts | 39 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/packages/core/src/render3/instructions/projection.ts b/packages/core/src/render3/instructions/projection.ts index d47f28b0b0..301b43bc48 100644 --- a/packages/core/src/render3/instructions/projection.ts +++ b/packages/core/src/render3/instructions/projection.ts @@ -75,7 +75,7 @@ export function ɵɵprojectionDef(selectors?: CssSelectorList[]): void { * @param selectorIndex: * - 0 when the selector is `*` (or unspecified as this is the default value), * - 1 based index of the selector from the {@link projectionDef} - * + * * @codeGenApi */ export function ɵɵprojection( diff --git a/tools/ts-api-guardian/test/unit_test.ts b/tools/ts-api-guardian/test/unit_test.ts index 625cf5d2d4..ce5f7260e8 100644 --- a/tools/ts-api-guardian/test/unit_test.ts +++ b/tools/ts-api-guardian/test/unit_test.ts @@ -561,7 +561,7 @@ describe('unit test', () => { {paramTags: {requireAtLeastOne: ['stable']}}); }); - it('should require at least one of the requireOnOf tags', () => { + it('should require at least one of the requireAtLeastOne tags', () => { const input = ` /** @experimental */ export declare class A { @@ -573,6 +573,43 @@ describe('unit test', () => { 'file.d.ts(3,7): error: Required jsdoc tags - One of the tags: "@stable", "@foo", "@bar" - must exist on `param`.', {paramTags: {requireAtLeastOne: ['stable', 'foo', 'bar']}}); }); + + it('should allow with one of the requireAtLeastOne tags found', () => { + const input = ` + /** + * @foo + * @bar + * @stable + */ + export declare class A { + } + /** + * @foo + */ + export declare const b: string; + /** + * @bar + */ + export declare var c: number; + /** + * @stable + */ + export declare function d(): void; + `; + const expected = ` + export declare class A { + } + + export declare const b: string; + + export declare var c: number; + + export declare function d(): void; + `; + check( + {'file.d.ts': input}, expected, + {exportTags: {requireAtLeastOne: ['stable', 'foo', 'bar']}}); + }); }); function getMockHost(files: {[name: string]: string}): ts.CompilerHost { From 7a7781e925767840e524569080e67f97ea11e06d Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Tue, 9 Apr 2019 15:04:51 -0700 Subject: [PATCH 0741/1073] refactor(bazel): Remove NodeJsSyncHost (#29796) `NodeJsSyncHost` is no longer provided by BuilderContext in architect v2, and its usage caused subtle path resolution issues in Windows. This PR cleans up `@angular/bazel` builder to use all native path and fs methods. PR Close #29796 --- packages/bazel/src/builders/BUILD.bazel | 21 ------ packages/bazel/src/builders/bazel.ts | 82 +++++++++++------------ packages/bazel/src/builders/bazel_spec.ts | 42 ------------ packages/bazel/src/builders/index.ts | 18 ++--- 4 files changed, 45 insertions(+), 118 deletions(-) delete mode 100644 packages/bazel/src/builders/bazel_spec.ts diff --git a/packages/bazel/src/builders/BUILD.bazel b/packages/bazel/src/builders/BUILD.bazel index 142c80f60a..6f13b16fc9 100644 --- a/packages/bazel/src/builders/BUILD.bazel +++ b/packages/bazel/src/builders/BUILD.bazel @@ -28,24 +28,3 @@ ts_library( "@npm//rxjs", ], ) - -ts_library( - name = "test_lib", - testonly = True, - srcs = [ - "bazel_spec.ts", - ], - deps = [ - "builders", - "@npm//@angular-devkit/core", - ], -) - -jasmine_node_test( - name = "test", - bootstrap = ["angular/tools/testing/init_node_spec.js"], - deps = [ - ":test_lib", - "//tools/testing:node", - ], -) diff --git a/packages/bazel/src/builders/bazel.ts b/packages/bazel/src/builders/bazel.ts index 9c777372aa..547d882103 100644 --- a/packages/bazel/src/builders/bazel.ts +++ b/packages/bazel/src/builders/bazel.ts @@ -8,10 +8,9 @@ /// -import {Path, dirname, getSystemPath, join, normalize} from '@angular-devkit/core'; -import {Host} from '@angular-devkit/core/src/virtual-fs/host'; -import {spawn} from 'child_process'; -import * as path from 'path'; +import {fork} from 'child_process'; +import {copyFileSync, existsSync, readdirSync, statSync, unlinkSync} from 'fs'; +import {dirname, join, normalize} from 'path'; export type Executable = 'bazel' | 'ibazel'; export type Command = 'build' | 'test' | 'run' | 'coverage' | 'query'; @@ -20,12 +19,14 @@ export type Command = 'build' | 'test' | 'run' | 'coverage' | 'query'; * Spawn the Bazel process. Trap SINGINT to make sure Bazel process is killed. */ export function runBazel( - projectDir: Path, binary: string, command: Command, workspaceTarget: string, flags: string[]) { + projectDir: string, binary: string, command: Command, workspaceTarget: string, + flags: string[]) { + projectDir = normalize(projectDir); + binary = normalize(binary); return new Promise((resolve, reject) => { - const buildProcess = spawn(process.argv[0], [binary, command, workspaceTarget, ...flags], { - cwd: getSystemPath(projectDir), + const buildProcess = fork(binary, [command, workspaceTarget, ...flags], { + cwd: projectDir, stdio: 'inherit', - shell: false, }); process.on('SIGINT', (signal) => { @@ -48,14 +49,14 @@ export function runBazel( /** * Resolves the path to `@bazel/bazel` or `@bazel/ibazel`. */ -export function checkInstallation(name: Executable, projectDir: Path): string { +export function checkInstallation(name: Executable, projectDir: string): string { + projectDir = normalize(projectDir); const packageName = `@bazel/${name}/package.json`; try { const bazelPath = require.resolve(packageName, { - paths: [getSystemPath(projectDir)], + paths: [projectDir], }); - - return path.dirname(bazelPath); + return dirname(bazelPath); } catch (error) { if (error.code === 'MODULE_NOT_FOUND') { throw new Error( @@ -70,14 +71,14 @@ export function checkInstallation(name: Executable, projectDir: Path): string { /** * Returns the absolute path to the template directory in `@angular/bazel`. */ -export async function getTemplateDir(host: Host, root: Path): Promise { +export function getTemplateDir(root: string): string { + root = normalize(root); const packageJson = require.resolve('@angular/bazel/package.json', { - paths: [getSystemPath(root)], + paths: [root], }); - - const packageDir = dirname(normalize(packageJson)); + const packageDir = dirname(packageJson); const templateDir = join(packageDir, 'src', 'builders', 'files'); - if (!await host.isDirectory(templateDir).toPromise()) { + if (!statSync(templateDir).isDirectory()) { throw new Error('Could not find Bazel template directory in "@angular/bazel".'); } return templateDir; @@ -87,30 +88,22 @@ export async function getTemplateDir(host: Host, root: Path): Promise { * Recursively list the specified 'dir' using depth-first approach. Paths * returned are relative to 'dir'. */ -function listR(host: Host, dir: Path): Promise { - async function list(dir: Path, root: Path, results: Path[]) { - const paths = await host.list(dir).toPromise(); +function listR(dir: string): string[] { + function list(dir: string, root: string, results: string[]) { + const paths = readdirSync(dir); for (const path of paths) { const absPath = join(dir, path); const relPath = join(root, path); - if (await host.isFile(absPath).toPromise()) { + if (statSync(absPath).isFile()) { results.push(relPath); } else { - await list(absPath, relPath, results); + list(absPath, relPath, results); } } return results; } - return list(dir, '' as Path, []); -} - -/** - * Copy the file from 'source' to 'dest'. - */ -async function copyFile(host: Host, source: Path, dest: Path) { - const buffer = await host.read(source).toPromise(); - await host.write(dest, buffer).toPromise(); + return list(dir, '', []); } /** @@ -119,35 +112,36 @@ async function copyFile(host: Host, source: Path, dest: Path) { * copied, so that they can be deleted later. * Existing files in `root` will not be replaced. */ -export async function copyBazelFiles(host: Host, root: Path, templateDir: Path) { - const bazelFiles: Path[] = []; - const templates = await listR(host, templateDir); +export function copyBazelFiles(root: string, templateDir: string) { + root = normalize(root); + templateDir = normalize(templateDir); + const bazelFiles: string[] = []; + const templates = listR(templateDir); - await Promise.all(templates.map(async(template) => { + for (const template of templates) { const name = template.replace('__dot__', '.').replace('.template', ''); const source = join(templateDir, template); const dest = join(root, name); try { - const exists = await host.exists(dest).toPromise(); - if (!exists) { - await copyFile(host, source, dest); + if (!existsSync(dest)) { + copyFileSync(source, dest); bazelFiles.push(dest); } } catch { } - })); + } return bazelFiles; } /** - * Delete the specified 'files' and return a promise that always resolves. + * Delete the specified 'files'. This function never throws. */ -export function deleteBazelFiles(host: Host, files: Path[]) { - return Promise.all(files.map(async(file) => { +export function deleteBazelFiles(files: string[]) { + for (const file of files) { try { - await host.delete(file).toPromise(); + unlinkSync(file); } catch { } - })); + } } diff --git a/packages/bazel/src/builders/bazel_spec.ts b/packages/bazel/src/builders/bazel_spec.ts deleted file mode 100644 index 84bf86ddab..0000000000 --- a/packages/bazel/src/builders/bazel_spec.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {Path} from '@angular-devkit/core'; -import {test} from '@angular-devkit/core/src/virtual-fs/host/test'; - -import {copyBazelFiles, deleteBazelFiles} from './bazel'; - -describe('Bazel builder', () => { - it('should copy Bazel files', async() => { - const host = new test.TestHost({ - '/files/WORKSPACE.template': '', - '/files/BUILD.bazel.template': '', - '/files/__dot__bazelrc.template': '', - '/files/__dot__bazelignore.template': '', - '/files/e2e/BUILD.bazel.template': '', - '/files/src/BUILD.bazel.template': '', - }); - const root = '/' as Path; - const templateDir = '/files' as Path; - await copyBazelFiles(host, root, templateDir); - const {records} = host; - expect(records).toContain({kind: 'write', path: '/WORKSPACE' as Path}); - expect(records).toContain({kind: 'write', path: '/BUILD.bazel' as Path}); - }); - - it('should delete Bazel files', async() => { - const host = new test.TestHost({ - '/WORKSPACE': '', - '/BUILD.bazel': '', - }); - await deleteBazelFiles(host, ['/WORKSPACE', '/BUILD.bazel'] as Path[]); - const {records} = host; - expect(records).toContain({kind: 'delete', path: '/WORKSPACE' as Path}); - expect(records).toContain({kind: 'delete', path: '/BUILD.bazel' as Path}); - }); -}); diff --git a/packages/bazel/src/builders/index.ts b/packages/bazel/src/builders/index.ts index e0bc4dab96..7b34483429 100644 --- a/packages/bazel/src/builders/index.ts +++ b/packages/bazel/src/builders/index.ts @@ -9,33 +9,29 @@ */ import {BuilderContext, BuilderOutput, createBuilder,} from '@angular-devkit/architect/src/index2'; -import {JsonObject, normalize} from '@angular-devkit/core'; +import {JsonObject} from '@angular-devkit/core'; import {checkInstallation, copyBazelFiles, deleteBazelFiles, getTemplateDir, runBazel} from './bazel'; import {Schema} from './schema'; -import {NodeJsSyncHost} from '@angular-devkit/core/node'; async function _bazelBuilder(options: JsonObject & Schema, context: BuilderContext, ): Promise { - const root = normalize(context.workspaceRoot); - const {logger} = context; + const {logger, workspaceRoot} = context; const {bazelCommand, leaveBazelFilesOnDisk, targetLabel, watch} = options; const executable = watch ? 'ibazel' : 'bazel'; - const binary = checkInstallation(executable, root); - - const host = new NodeJsSyncHost(); - const templateDir = await getTemplateDir(host, root); - const bazelFiles = await copyBazelFiles(host, root, templateDir); + const binary = checkInstallation(executable, workspaceRoot); + const templateDir = getTemplateDir(workspaceRoot); + const bazelFiles = copyBazelFiles(workspaceRoot, templateDir); try { const flags: string[] = []; - await runBazel(root, binary, bazelCommand, targetLabel, flags); + await runBazel(workspaceRoot, binary, bazelCommand, targetLabel, flags); return {success: true}; } catch (err) { logger.error(err.message); return {success: false}; } finally { if (!leaveBazelFilesOnDisk) { - await deleteBazelFiles(host, bazelFiles); // this will never throw + deleteBazelFiles(bazelFiles); // this will never throw } } } From 205a45e9a8f0ccb819f583d4269c3f164a049d71 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 8 Apr 2019 19:37:31 +0200 Subject: [PATCH 0742/1073] refactor(core): move usage detection into usage strategy (#29815) In order to support multiple strategies for detecting the query timing, the query usage logic has been moved into a query usage strategy. PR Close #29815 --- .../static-queries/angular/super_class.ts | 41 ++-------------- .../google3/explicitQueryTimingRule.ts | 5 +- .../migrations/static-queries/index.ts | 6 ++- .../declaration_usage_visitor.ts | 2 +- .../usage_strategy/super_class_context.ts | 49 +++++++++++++++++++ .../usage_strategy/template_usage_visitor.ts} | 2 +- .../usage_strategy/usage_strategy.ts} | 39 +++++++++------ .../static-queries/timing-strategy.ts | 11 +++++ 8 files changed, 96 insertions(+), 59 deletions(-) rename packages/core/schematics/migrations/static-queries/{angular => strategies/usage_strategy}/declaration_usage_visitor.ts (99%) create mode 100644 packages/core/schematics/migrations/static-queries/strategies/usage_strategy/super_class_context.ts rename packages/core/schematics/migrations/static-queries/{angular/query_read_html_visitor.ts => strategies/usage_strategy/template_usage_visitor.ts} (98%) rename packages/core/schematics/migrations/static-queries/{angular/analyze_query_usage.ts => strategies/usage_strategy/usage_strategy.ts} (81%) create mode 100644 packages/core/schematics/migrations/static-queries/timing-strategy.ts diff --git a/packages/core/schematics/migrations/static-queries/angular/super_class.ts b/packages/core/schematics/migrations/static-queries/angular/super_class.ts index b86860a731..77e3cdb674 100644 --- a/packages/core/schematics/migrations/static-queries/angular/super_class.ts +++ b/packages/core/schematics/migrations/static-queries/angular/super_class.ts @@ -7,48 +7,13 @@ */ import * as ts from 'typescript'; - -import {isFunctionLikeDeclaration} from '../../../utils/typescript/functions'; -import {hasModifier} from '../../../utils/typescript/nodes'; -import {getPropertyNameText} from '../../../utils/typescript/property_name'; - -import {FunctionContext} from './declaration_usage_visitor'; import {ClassMetadataMap} from './ng_query_visitor'; - /** - * Updates the specified function context to map abstract super-class class members - * to their implementation TypeScript nodes. This allows us to run the declaration visitor - * for the super class with the context of the "baseClass" (e.g. with implemented abstract - * class members) + * Gets all chained super-class TypeScript declarations for the given class + * by using the specified class metadata map. */ -export function updateSuperClassAbstractMembersContext( - baseClass: ts.ClassDeclaration, context: FunctionContext, classMetadataMap: ClassMetadataMap) { - getSuperClassDeclarations(baseClass, classMetadataMap).forEach(superClassDecl => { - superClassDecl.members.forEach(superClassMember => { - if (!superClassMember.name || !hasModifier(superClassMember, ts.SyntaxKind.AbstractKeyword)) { - return; - } - - // Find the matching implementation of the abstract declaration from the super class. - const baseClassImpl = baseClass.members.find( - baseClassMethod => !!baseClassMethod.name && - getPropertyNameText(baseClassMethod.name) === - getPropertyNameText(superClassMember.name !)); - - if (!baseClassImpl || !isFunctionLikeDeclaration(baseClassImpl) || !baseClassImpl.body) { - return; - } - - if (!context.has(superClassMember)) { - context.set(superClassMember, baseClassImpl); - } - }); - }); -} - -/** Gets all super-class TypeScript declarations for the given class. */ -function getSuperClassDeclarations( +export function getSuperClassDeclarations( classDecl: ts.ClassDeclaration, classMetadataMap: ClassMetadataMap) { const declarations: ts.ClassDeclaration[] = []; diff --git a/packages/core/schematics/migrations/static-queries/google3/explicitQueryTimingRule.ts b/packages/core/schematics/migrations/static-queries/google3/explicitQueryTimingRule.ts index e5d26a9634..73b301089d 100644 --- a/packages/core/schematics/migrations/static-queries/google3/explicitQueryTimingRule.ts +++ b/packages/core/schematics/migrations/static-queries/google3/explicitQueryTimingRule.ts @@ -11,9 +11,9 @@ import * as ts from 'typescript'; import {NgComponentTemplateVisitor} from '../../../utils/ng_component_template'; import {visitAllNodes} from '../../../utils/typescript/visit_nodes'; -import {analyzeNgQueryUsage} from '../angular/analyze_query_usage'; import {NgQueryResolveVisitor} from '../angular/ng_query_visitor'; import {QueryTiming} from '../angular/query-definition'; +import {QueryUsageStrategy} from '../strategies/usage_strategy/usage_strategy'; import {getTransformedQueryCallExpr} from '../transform'; const FAILURE_MESSAGE = 'Query does not explicitly specify its timing. Read more here: ' + @@ -52,6 +52,7 @@ export class Rule extends Rules.TypedRule { }); const queries = resolvedQueries.get(sourceFile); + const usageStrategy = new QueryUsageStrategy(classMetadata, typeChecker); // No queries detected for the given source file. if (!queries) { @@ -62,7 +63,7 @@ export class Rule extends Rules.TypedRule { // query definitions to explicitly declare the query timing (static or dynamic) queries.forEach(q => { const queryExpr = q.decorator.node.expression; - const timing = analyzeNgQueryUsage(q, classMetadata, typeChecker); + const timing = usageStrategy.detectTiming(q); const transformedNode = getTransformedQueryCallExpr(q, timing); if (!transformedNode) { diff --git a/packages/core/schematics/migrations/static-queries/index.ts b/packages/core/schematics/migrations/static-queries/index.ts index 727820792a..b8b91ddbbc 100644 --- a/packages/core/schematics/migrations/static-queries/index.ts +++ b/packages/core/schematics/migrations/static-queries/index.ts @@ -15,8 +15,8 @@ import {getProjectTsConfigPaths} from '../../utils/project_tsconfig_paths'; import {parseTsconfigFile} from '../../utils/typescript/parse_tsconfig'; import {visitAllNodes} from '../../utils/typescript/visit_nodes'; -import {analyzeNgQueryUsage} from './angular/analyze_query_usage'; import {NgQueryResolveVisitor} from './angular/ng_query_visitor'; +import {QueryUsageStrategy} from './strategies/usage_strategy/usage_strategy'; import {getTransformedQueryCallExpr} from './transform'; @@ -83,6 +83,8 @@ function runStaticQueryMigration(tree: Tree, tsconfigPath: string, basePath: str } }); + const usageStrategy = new QueryUsageStrategy(classMetadata, typeChecker); + // Walk through all source files that contain resolved queries and update // the source files if needed. Note that we need to update multiple queries // within a source file within the same recorder in order to not throw off @@ -94,7 +96,7 @@ function runStaticQueryMigration(tree: Tree, tsconfigPath: string, basePath: str // query definitions to explicitly declare the query timing (static or dynamic) queries.forEach(q => { const queryExpr = q.decorator.node.expression; - const timing = analyzeNgQueryUsage(q, classMetadata, typeChecker); + const timing = usageStrategy.detectTiming(q); const transformedNode = getTransformedQueryCallExpr(q, timing); if (!transformedNode) { diff --git a/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/declaration_usage_visitor.ts similarity index 99% rename from packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts rename to packages/core/schematics/migrations/static-queries/strategies/usage_strategy/declaration_usage_visitor.ts index cdbcddd0db..668a71b5e5 100644 --- a/packages/core/schematics/migrations/static-queries/angular/declaration_usage_visitor.ts +++ b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/declaration_usage_visitor.ts @@ -7,7 +7,7 @@ */ import * as ts from 'typescript'; -import {isFunctionLikeDeclaration, unwrapExpression} from '../../../utils/typescript/functions'; +import {isFunctionLikeDeclaration, unwrapExpression} from '../../../../utils/typescript/functions'; export type FunctionContext = Map; diff --git a/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/super_class_context.ts b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/super_class_context.ts new file mode 100644 index 0000000000..b48589e8a1 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/super_class_context.ts @@ -0,0 +1,49 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import * as ts from 'typescript'; + +import {isFunctionLikeDeclaration} from '../../../../utils/typescript/functions'; +import {hasModifier} from '../../../../utils/typescript/nodes'; +import {getPropertyNameText} from '../../../../utils/typescript/property_name'; +import {ClassMetadataMap} from '../../angular/ng_query_visitor'; +import {getSuperClassDeclarations} from '../../angular/super_class'; + +import {FunctionContext} from './declaration_usage_visitor'; + + +/** + * Updates the specified function context to map abstract super-class class members + * to their implementation TypeScript nodes. This allows us to run the declaration visitor + * for the super class with the context of the "baseClass" (e.g. with implemented abstract + * class members) + */ +export function updateSuperClassAbstractMembersContext( + baseClass: ts.ClassDeclaration, context: FunctionContext, classMetadataMap: ClassMetadataMap) { + getSuperClassDeclarations(baseClass, classMetadataMap).forEach(superClassDecl => { + superClassDecl.members.forEach(superClassMember => { + if (!superClassMember.name || !hasModifier(superClassMember, ts.SyntaxKind.AbstractKeyword)) { + return; + } + + // Find the matching implementation of the abstract declaration from the super class. + const baseClassImpl = baseClass.members.find( + baseClassMethod => !!baseClassMethod.name && + getPropertyNameText(baseClassMethod.name) === + getPropertyNameText(superClassMember.name !)); + + if (!baseClassImpl || !isFunctionLikeDeclaration(baseClassImpl) || !baseClassImpl.body) { + return; + } + + if (!context.has(superClassMember)) { + context.set(superClassMember, baseClassImpl); + } + }); + }); +} diff --git a/packages/core/schematics/migrations/static-queries/angular/query_read_html_visitor.ts b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/template_usage_visitor.ts similarity index 98% rename from packages/core/schematics/migrations/static-queries/angular/query_read_html_visitor.ts rename to packages/core/schematics/migrations/static-queries/strategies/usage_strategy/template_usage_visitor.ts index 7ff96a436d..3cfc79c2d2 100644 --- a/packages/core/schematics/migrations/static-queries/angular/query_read_html_visitor.ts +++ b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/template_usage_visitor.ts @@ -13,7 +13,7 @@ import {BoundAttribute, BoundEvent, BoundText, Element, Node, NullVisitor, Templ * AST visitor that traverses the Render3 HTML AST in order to check if the given * query property is accessed statically in the template. */ -export class QueryReadHtmlVisitor extends NullVisitor { +export class TemplateUsageVisitor extends NullVisitor { private hasQueryTemplateReference = false; private expressionAstVisitor = new ExpressionAstVisitor(this.queryPropertyName); diff --git a/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.ts similarity index 81% rename from packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts rename to packages/core/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.ts index 64f2dbad5f..3aa4801d2a 100644 --- a/packages/core/schematics/migrations/static-queries/angular/analyze_query_usage.ts +++ b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.ts @@ -8,14 +8,15 @@ import * as ts from 'typescript'; -import {parseHtmlGracefully} from '../../../utils/parse_html'; -import {hasPropertyNameText} from '../../../utils/typescript/property_name'; +import {parseHtmlGracefully} from '../../../../utils/parse_html'; +import {hasPropertyNameText} from '../../../../utils/typescript/property_name'; +import {ClassMetadataMap} from '../../angular/ng_query_visitor'; +import {NgQueryDefinition, QueryTiming, QueryType} from '../../angular/query-definition'; +import {TimingStrategy} from '../../timing-strategy'; import {DeclarationUsageVisitor, FunctionContext} from './declaration_usage_visitor'; -import {ClassMetadataMap} from './ng_query_visitor'; -import {NgQueryDefinition, QueryTiming, QueryType} from './query-definition'; -import {QueryReadHtmlVisitor} from './query_read_html_visitor'; -import {updateSuperClassAbstractMembersContext} from './super_class'; +import {updateSuperClassAbstractMembersContext} from './super_class_context'; +import {TemplateUsageVisitor} from './template_usage_visitor'; /** @@ -29,17 +30,25 @@ const STATIC_QUERY_LIFECYCLE_HOOKS = { }; /** - * Analyzes the usage of the given query and determines the query timing based - * on the current usage of the query. + * Query timing strategy that determines the timing of a given query by inspecting how + * the query is accessed within the project's TypeScript source files. Read more about + * this strategy here: https://hackmd.io/s/Hymvc2OKE */ -export function analyzeNgQueryUsage( - query: NgQueryDefinition, classMetadata: ClassMetadataMap, - typeChecker: ts.TypeChecker): QueryTiming { - return isQueryUsedStatically(query.container, query, classMetadata, typeChecker, []) ? - QueryTiming.STATIC : - QueryTiming.DYNAMIC; +export class QueryUsageStrategy implements TimingStrategy { + constructor(private classMetadata: ClassMetadataMap, private typeChecker: ts.TypeChecker) {} + + /** + * Analyzes the usage of the given query and determines the query timing based + * on the current usage of the query. + */ + detectTiming(query: NgQueryDefinition): QueryTiming { + return isQueryUsedStatically(query.container, query, this.classMetadata, this.typeChecker, []) ? + QueryTiming.STATIC : + QueryTiming.DYNAMIC; + } } + /** * Checks whether a given query is used statically within the given class, its super * class or derived classes. @@ -79,7 +88,7 @@ function isQueryUsedStatically( if (classMetadata.template && hasPropertyNameText(query.property.name)) { const template = classMetadata.template; const parsedHtml = parseHtmlGracefully(template.content, template.filePath); - const htmlVisitor = new QueryReadHtmlVisitor(query.property.name.text); + const htmlVisitor = new TemplateUsageVisitor(query.property.name.text); if (parsedHtml && htmlVisitor.isQueryUsedStatically(parsedHtml)) { return true; diff --git a/packages/core/schematics/migrations/static-queries/timing-strategy.ts b/packages/core/schematics/migrations/static-queries/timing-strategy.ts new file mode 100644 index 0000000000..c8af666961 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/timing-strategy.ts @@ -0,0 +1,11 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {NgQueryDefinition, QueryTiming} from './angular/query-definition'; + +export interface TimingStrategy { detectTiming(query: NgQueryDefinition): QueryTiming; } From 0d6c9d36a174f7dc6eb1029e459beecc2dfb0026 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Wed, 10 Apr 2019 18:49:28 +0200 Subject: [PATCH 0743/1073] refactor(compiler): export static-query detection logic (#29815) The `@angular/compiler` package currently contains the logic for determining whether given queries are used statically or dynamically. This logic would be necessary in order to build a schematic that leverages the Angular compiler API's in order to simulate the query timing based on what ViewEngine computed at compilation-time/runtime. Exporting the logic that is necessary to detect the timing should not affect the public API as the `@angular/compiler` package is denoted as private in `PUBLIC_API.md` PR Close #29815 --- packages/compiler/src/compiler.ts | 2 +- packages/compiler/src/view_compiler/view_compiler.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/compiler/src/compiler.ts b/packages/compiler/src/compiler.ts index c400260081..7c351c3c29 100644 --- a/packages/compiler/src/compiler.ts +++ b/packages/compiler/src/compiler.ts @@ -85,7 +85,7 @@ export * from './schema/dom_element_schema_registry'; export * from './selector'; export * from './style_compiler'; export * from './template_parser/template_parser'; -export {ViewCompiler} from './view_compiler/view_compiler'; +export {ViewCompiler, findStaticQueryIds, staticViewQueryIds} from './view_compiler/view_compiler'; export {getParseErrors, isSyntaxError, syntaxError, Version} from './util'; export {SourceMap} from './output/source_map'; export * from './injectable_compiler_2'; diff --git a/packages/compiler/src/view_compiler/view_compiler.ts b/packages/compiler/src/view_compiler/view_compiler.ts index 5fe530bb04..e97e3291f6 100644 --- a/packages/compiler/src/view_compiler/view_compiler.ts +++ b/packages/compiler/src/view_compiler/view_compiler.ts @@ -1023,7 +1023,7 @@ interface StaticAndDynamicQueryIds { } -function findStaticQueryIds( +export function findStaticQueryIds( nodes: TemplateAst[], result = new Map()): Map { nodes.forEach((node) => { @@ -1056,7 +1056,7 @@ function findStaticQueryIds( return result; } -function staticViewQueryIds(nodeStaticQueryIds: Map): +export function staticViewQueryIds(nodeStaticQueryIds: Map): StaticAndDynamicQueryIds { const staticQueryIds = new Set(); const dynamicQueryIds = new Set(); From 446e3573e3d348135294fd061c5c49573e2551c0 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Fri, 12 Apr 2019 17:55:51 +0200 Subject: [PATCH 0744/1073] refactor(core): add static-query template strategy (#29815) Introduces a new strategy for the `static-query` schematic that is enabled by default. In order to provide a migration that works for the most Angular applications and makes the upgrade as easy as possible, the template strategy leverages the view engine Angular compiler logic in order to determine the query timing that is currently used within applications using view engine. PR Close #29815 --- .../migrations/static-queries/BUILD.bazel | 1 + .../angular/query-definition.ts | 5 +- .../google3/explicitQueryTimingRule.ts | 4 +- .../migrations/static-queries/index.ts | 85 ++- .../template_strategy/template_strategy.ts | 178 +++++++ .../strategies/timing-strategy.ts | 20 + .../usage_strategy/usage_strategy.ts | 19 +- .../static-queries/timing-strategy.ts | 11 - .../migrations/static-queries/transform.ts | 39 +- .../static_queries_migration_template_spec.ts | 490 ++++++++++++++++++ ...=> static_queries_migration_usage_spec.ts} | 8 +- packages/core/schematics/tsconfig.json | 4 +- 12 files changed, 812 insertions(+), 52 deletions(-) create mode 100644 packages/core/schematics/migrations/static-queries/strategies/template_strategy/template_strategy.ts create mode 100644 packages/core/schematics/migrations/static-queries/strategies/timing-strategy.ts delete mode 100644 packages/core/schematics/migrations/static-queries/timing-strategy.ts create mode 100644 packages/core/schematics/test/static_queries_migration_template_spec.ts rename packages/core/schematics/test/{static_queries_migration_spec.ts => static_queries_migration_usage_spec.ts} (98%) diff --git a/packages/core/schematics/migrations/static-queries/BUILD.bazel b/packages/core/schematics/migrations/static-queries/BUILD.bazel index aa2c77ec83..00da5b6919 100644 --- a/packages/core/schematics/migrations/static-queries/BUILD.bazel +++ b/packages/core/schematics/migrations/static-queries/BUILD.bazel @@ -11,6 +11,7 @@ ts_library( ], deps = [ "//packages/compiler", + "//packages/compiler-cli", "//packages/core/schematics/utils", "@npm//@angular-devkit/schematics", "@npm//@types/node", diff --git a/packages/core/schematics/migrations/static-queries/angular/query-definition.ts b/packages/core/schematics/migrations/static-queries/angular/query-definition.ts index 413d9334bd..929f0fd872 100644 --- a/packages/core/schematics/migrations/static-queries/angular/query-definition.ts +++ b/packages/core/schematics/migrations/static-queries/angular/query-definition.ts @@ -12,7 +12,7 @@ import {NgDecorator} from '../../../utils/ng_decorators'; /** Timing of a given query. Either static or dynamic. */ export enum QueryTiming { STATIC, - DYNAMIC + DYNAMIC, } /** Type of a given query. */ @@ -24,13 +24,10 @@ export enum QueryType { export interface NgQueryDefinition { /** Type of the query definition. */ type: QueryType; - /** Property that declares the query. */ property: ts.PropertyDeclaration; - /** Decorator that declares this as a query. */ decorator: NgDecorator; - /** Class declaration that holds this query. */ container: ts.ClassDeclaration; } diff --git a/packages/core/schematics/migrations/static-queries/google3/explicitQueryTimingRule.ts b/packages/core/schematics/migrations/static-queries/google3/explicitQueryTimingRule.ts index 73b301089d..7e4fd64c86 100644 --- a/packages/core/schematics/migrations/static-queries/google3/explicitQueryTimingRule.ts +++ b/packages/core/schematics/migrations/static-queries/google3/explicitQueryTimingRule.ts @@ -63,8 +63,8 @@ export class Rule extends Rules.TypedRule { // query definitions to explicitly declare the query timing (static or dynamic) queries.forEach(q => { const queryExpr = q.decorator.node.expression; - const timing = usageStrategy.detectTiming(q); - const transformedNode = getTransformedQueryCallExpr(q, timing); + const {timing, message} = usageStrategy.detectTiming(q); + const transformedNode = getTransformedQueryCallExpr(q, timing, !!message); if (!transformedNode) { return; diff --git a/packages/core/schematics/migrations/static-queries/index.ts b/packages/core/schematics/migrations/static-queries/index.ts index b8b91ddbbc..cabccfa242 100644 --- a/packages/core/schematics/migrations/static-queries/index.ts +++ b/packages/core/schematics/migrations/static-queries/index.ts @@ -6,24 +6,27 @@ * found in the LICENSE file at https://angular.io/license */ -import {Rule, SchematicsException, Tree} from '@angular-devkit/schematics'; +import {logging} from '@angular-devkit/core'; +import {Rule, SchematicContext, SchematicsException, Tree} from '@angular-devkit/schematics'; import {dirname, relative} from 'path'; import * as ts from 'typescript'; import {NgComponentTemplateVisitor} from '../../utils/ng_component_template'; import {getProjectTsConfigPaths} from '../../utils/project_tsconfig_paths'; import {parseTsconfigFile} from '../../utils/typescript/parse_tsconfig'; -import {visitAllNodes} from '../../utils/typescript/visit_nodes'; +import {TypeScriptVisitor, visitAllNodes} from '../../utils/typescript/visit_nodes'; import {NgQueryResolveVisitor} from './angular/ng_query_visitor'; +import {QueryTemplateStrategy} from './strategies/template_strategy/template_strategy'; +import {TimingStrategy} from './strategies/timing-strategy'; import {QueryUsageStrategy} from './strategies/usage_strategy/usage_strategy'; import {getTransformedQueryCallExpr} from './transform'; - +type Logger = logging.LoggerApi; /** Entry point for the V8 static-query migration. */ export default function(): Rule { - return (tree: Tree) => { + return (tree: Tree, context: SchematicContext) => { const projectTsConfigPaths = getProjectTsConfigPaths(tree); const basePath = process.cwd(); @@ -34,7 +37,7 @@ export default function(): Rule { } for (const tsconfigPath of projectTsConfigPaths) { - runStaticQueryMigration(tree, tsconfigPath, basePath); + runStaticQueryMigration(tree, tsconfigPath, basePath, context.logger); } }; } @@ -45,7 +48,8 @@ export default function(): Rule { * the current usage of the query property. e.g. a view query that is not used in any * lifecycle hook does not need to be static and can be set up with "static: false". */ -function runStaticQueryMigration(tree: Tree, tsconfigPath: string, basePath: string) { +function runStaticQueryMigration( + tree: Tree, tsconfigPath: string, basePath: string, logger: Logger) { const parsed = parseTsconfigFile(tsconfigPath, dirname(tsconfigPath)); const host = ts.createCompilerHost(parsed.options, true); @@ -58,46 +62,67 @@ function runStaticQueryMigration(tree: Tree, tsconfigPath: string, basePath: str return buffer ? buffer.toString() : undefined; }; + const isUsageStrategy = !!process.env['NG_STATIC_QUERY_USAGE_STRATEGY']; const program = ts.createProgram(parsed.fileNames, parsed.options, host); const typeChecker = program.getTypeChecker(); const queryVisitor = new NgQueryResolveVisitor(typeChecker); const templateVisitor = new NgComponentTemplateVisitor(typeChecker); const rootSourceFiles = program.getRootFileNames().map(f => program.getSourceFile(f) !); const printer = ts.createPrinter(); + const analysisVisitors: TypeScriptVisitor[] = [queryVisitor]; + + // If the "usage" strategy is selected, we also need to add the query visitor + // to the analysis visitors so that query usage in templates can be also checked. + if (isUsageStrategy) { + analysisVisitors.push(templateVisitor); + } - // Analyze source files by detecting queries, class relations and component templates. rootSourceFiles.forEach(sourceFile => { - // The visit utility function only traverses the source file once. We don't want to + // The visit utility function only traverses a source file once. We don't want to // traverse through all source files multiple times for each visitor as this could be // slow. - visitAllNodes(sourceFile, [queryVisitor, templateVisitor]); + visitAllNodes(sourceFile, analysisVisitors); }); const {resolvedQueries, classMetadata} = queryVisitor; + const {resolvedTemplates} = templateVisitor; - // Add all resolved templates to the class metadata so that we can also - // check component templates for static query usage. - templateVisitor.resolvedTemplates.forEach(template => { - if (classMetadata.has(template.container)) { - classMetadata.get(template.container) !.template = template; - } - }); + if (isUsageStrategy) { + // Add all resolved templates to the class metadata if the usage strategy is used. This + // is necessary in order to be able to check component templates for static query usage. + resolvedTemplates.forEach(template => { + if (classMetadata.has(template.container)) { + classMetadata.get(template.container) !.template = template; + } + }); + } - const usageStrategy = new QueryUsageStrategy(classMetadata, typeChecker); + const strategy: TimingStrategy = isUsageStrategy ? + new QueryUsageStrategy(classMetadata, typeChecker) : + new QueryTemplateStrategy(tsconfigPath, classMetadata, host); + const detectionMessages: string[] = []; + + // In case the strategy could not be set up properly, we just exit the + // migration. We don't want to throw an exception as this could mean + // that other migrations are interrupted. + if (!strategy.setup()) { + return; + } // Walk through all source files that contain resolved queries and update // the source files if needed. Note that we need to update multiple queries // within a source file within the same recorder in order to not throw off // the TypeScript node offsets. resolvedQueries.forEach((queries, sourceFile) => { - const update = tree.beginUpdate(relative(basePath, sourceFile.fileName)); + const relativePath = relative(basePath, sourceFile.fileName); + const update = tree.beginUpdate(relativePath); - // Compute the query usage for all resolved queries and update the - // query definitions to explicitly declare the query timing (static or dynamic) + // Compute the query timing for all resolved queries and update the + // query definitions to explicitly set the determined query timing. queries.forEach(q => { const queryExpr = q.decorator.node.expression; - const timing = usageStrategy.detectTiming(q); - const transformedNode = getTransformedQueryCallExpr(q, timing); + const {timing, message} = strategy.detectTiming(q); + const transformedNode = getTransformedQueryCallExpr(q, timing, !!message); if (!transformedNode) { return; @@ -109,8 +134,24 @@ function runStaticQueryMigration(tree: Tree, tsconfigPath: string, basePath: str // call expression node. update.remove(queryExpr.getStart(), queryExpr.getWidth()); update.insertRight(queryExpr.getStart(), newText); + + const {line, character} = + ts.getLineAndCharacterOfPosition(sourceFile, q.decorator.node.getStart()); + detectionMessages.push(`${relativePath}@${line + 1}:${character + 1}: ${message}`); }); tree.commitUpdate(update); }); + + if (detectionMessages.length) { + logger.info('------ Static Query migration ------'); + logger.info('In preparation for Ivy, developers can now explicitly specify the'); + logger.info('timing of their queries. Read more about this here:'); + logger.info('https://github.com/angular/angular/pull/28810'); + logger.info(''); + logger.info('Some queries cannot be migrated automatically. Please go through'); + logger.info('those manually and apply the appropriate timing:'); + detectionMessages.forEach(failure => logger.warn(`⮑ ${failure}`)); + logger.info('------------------------------------------------'); + } } diff --git a/packages/core/schematics/migrations/static-queries/strategies/template_strategy/template_strategy.ts b/packages/core/schematics/migrations/static-queries/strategies/template_strategy/template_strategy.ts new file mode 100644 index 0000000000..1c61347362 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/strategies/template_strategy/template_strategy.ts @@ -0,0 +1,178 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {AotCompiler, CompileDirectiveMetadata, CompileMetadataResolver, CompileNgModuleMetadata, NgAnalyzedModules, StaticSymbol, TemplateAst, findStaticQueryIds, staticViewQueryIds} from '@angular/compiler'; +import {Diagnostic, createProgram, readConfiguration} from '@angular/compiler-cli'; +import {resolve} from 'path'; +import * as ts from 'typescript'; + +import {hasPropertyNameText} from '../../../../utils/typescript/property_name'; +import {ClassMetadataMap} from '../../angular/ng_query_visitor'; +import {NgQueryDefinition, QueryTiming, QueryType} from '../../angular/query-definition'; +import {TimingResult, TimingStrategy} from '../timing-strategy'; + +const QUERY_NOT_DECLARED_IN_COMPONENT_MESSAGE = 'Timing could not be determined. This happens ' + + 'if the query is not declared in any component.'; + +export class QueryTemplateStrategy implements TimingStrategy { + private compiler: AotCompiler|null = null; + private metadataResolver: CompileMetadataResolver|null = null; + private analyzedQueries = new Map(); + + constructor( + private projectPath: string, private classMetadata: ClassMetadataMap, + private host: ts.CompilerHost) {} + + /** + * Sets up the template strategy by creating the AngularCompilerProgram. Returns false if + * the AOT compiler program could not be created due to failure diagnostics. + */ + setup() { + const {rootNames, options} = readConfiguration(this.projectPath); + const aotProgram = createProgram({rootNames, options, host: this.host}); + + // The "AngularCompilerProgram" does not expose the "AotCompiler" instance, nor does it + // expose the logic that is necessary to analyze the determined modules. We work around + // this by just accessing the necessary private properties using the bracket notation. + this.compiler = (aotProgram as any)['compiler']; + this.metadataResolver = this.compiler !['_metadataResolver']; + const analyzedModules = (aotProgram as any)['analyzedModules'] as NgAnalyzedModules; + + const ngDiagnostics = [ + ...aotProgram.getNgStructuralDiagnostics(), + ...aotProgram.getNgSemanticDiagnostics(), + ]; + + if (ngDiagnostics.length) { + this._printDiagnosticFailures(ngDiagnostics); + return false; + } + + analyzedModules.files.forEach(file => { + file.directives.forEach(directive => this._analyzeDirective(directive, analyzedModules)); + }); + return true; + } + + /** Analyzes a given directive by determining the timing of all matched view queries. */ + private _analyzeDirective(symbol: StaticSymbol, analyzedModules: NgAnalyzedModules) { + const metadata = this.metadataResolver !.getDirectiveMetadata(symbol); + const ngModule = analyzedModules.ngModuleByPipeOrDirective.get(symbol); + + if (!metadata.isComponent || !ngModule) { + return; + } + + const parsedTemplate = this._parseTemplate(metadata, ngModule); + const queryTimingMap = findStaticQueryIds(parsedTemplate); + const {staticQueryIds} = staticViewQueryIds(queryTimingMap); + + metadata.viewQueries.forEach((query, index) => { + // Query ids are computed by adding "one" to the index. This is done within + // the "view_compiler.ts" in order to support using a bloom filter for queries. + const queryId = index + 1; + const queryKey = + this._getViewQueryUniqueKey(symbol.filePath, symbol.name, query.propertyName); + this.analyzedQueries.set( + queryKey, staticQueryIds.has(queryId) ? QueryTiming.STATIC : QueryTiming.DYNAMIC); + }); + } + + /** Detects the timing of the query definition. */ + detectTiming(query: NgQueryDefinition): TimingResult { + if (query.type === QueryType.ContentChild) { + return {timing: null, message: 'Content queries cannot be migrated automatically.'}; + } else if (!hasPropertyNameText(query.property.name)) { + // In case the query property name is not statically analyzable, we mark this + // query as unresolved. NGC currently skips these view queries as well. + return {timing: null, message: 'Query is not statically analyzable.'}; + } + + const propertyName = query.property.name.text; + const classMetadata = this.classMetadata.get(query.container); + + // In case there is no class metadata or there are no derived classes that + // could access the current query, we just look for the query analysis of + // the class that declares the query. e.g. only the template of the class + // that declares the view query affects the query timing. + if (!classMetadata || !classMetadata.derivedClasses.length) { + const timing = this._getQueryTimingFromClass(query.container, propertyName); + + if (timing === null) { + return {timing: null, message: QUERY_NOT_DECLARED_IN_COMPONENT_MESSAGE}; + } + + return {timing}; + } + + let resolvedTiming: QueryTiming|null = null; + let timingMismatch = false; + + // In case there are multiple components that use the same query (e.g. through inheritance), + // we need to check if all components use the query with the same timing. If that is not + // the case, the query timing is ambiguous and the developer needs to fix the query manually. + [query.container, ...classMetadata.derivedClasses].forEach(classDecl => { + const classTiming = this._getQueryTimingFromClass(classDecl, propertyName); + + if (classTiming === null) { + return; + } + + // In case there is no resolved timing yet, save the new timing. Timings from other + // components that use the query with a different timing, cause the timing to be + // mismatched. In that case we can't detect a working timing for all components. + if (resolvedTiming === null) { + resolvedTiming = classTiming; + } else if (resolvedTiming !== classTiming) { + timingMismatch = true; + } + }); + + if (resolvedTiming === null) { + return {timing: QueryTiming.DYNAMIC, message: QUERY_NOT_DECLARED_IN_COMPONENT_MESSAGE}; + } else if (timingMismatch) { + return {timing: null, message: 'Multiple components use the query with different timings.'}; + } + return {timing: resolvedTiming}; + } + + /** + * Gets the timing that has been resolved for a given query when it's used within the + * specified class declaration. e.g. queries from an inherited class can be used. + */ + private _getQueryTimingFromClass(classDecl: ts.ClassDeclaration, queryName: string): QueryTiming + |null { + if (!classDecl.name) { + return null; + } + const filePath = classDecl.getSourceFile().fileName; + const queryKey = this._getViewQueryUniqueKey(filePath, classDecl.name.text, queryName); + + if (this.analyzedQueries.has(queryKey)) { + return this.analyzedQueries.get(queryKey) !; + } + return null; + } + + private _parseTemplate(component: CompileDirectiveMetadata, ngModule: CompileNgModuleMetadata): + TemplateAst[] { + return this + .compiler !['_parseTemplate'](component, ngModule, ngModule.transitiveModule.directives) + .template; + } + + private _printDiagnosticFailures(diagnostics: (ts.Diagnostic|Diagnostic)[]) { + console.error('Could not create Angular AOT compiler to determine query timing.'); + console.error('The following diagnostics were detected:\n'); + console.error(diagnostics.map(d => d.messageText).join(`\n`)); + } + + private _getViewQueryUniqueKey(filePath: string, className: string, propName: string) { + return `${resolve(filePath)}#${className}-${propName}`; + } +} diff --git a/packages/core/schematics/migrations/static-queries/strategies/timing-strategy.ts b/packages/core/schematics/migrations/static-queries/strategies/timing-strategy.ts new file mode 100644 index 0000000000..404c0aa167 --- /dev/null +++ b/packages/core/schematics/migrations/static-queries/strategies/timing-strategy.ts @@ -0,0 +1,20 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {NgQueryDefinition, QueryTiming} from '../angular/query-definition'; + +export interface TimingStrategy { + /** Sets up the given strategy. Should return false if the strategy could not be set up. */ + setup(): boolean; + /** Detects the timing result for a given query. */ + detectTiming(query: NgQueryDefinition): TimingResult; +} + +export type TimingResult = { + timing: QueryTiming | null; message?: string; +}; diff --git a/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.ts b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.ts index 3aa4801d2a..75d31337c9 100644 --- a/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.ts +++ b/packages/core/schematics/migrations/static-queries/strategies/usage_strategy/usage_strategy.ts @@ -12,7 +12,7 @@ import {parseHtmlGracefully} from '../../../../utils/parse_html'; import {hasPropertyNameText} from '../../../../utils/typescript/property_name'; import {ClassMetadataMap} from '../../angular/ng_query_visitor'; import {NgQueryDefinition, QueryTiming, QueryType} from '../../angular/query-definition'; -import {TimingStrategy} from '../../timing-strategy'; +import {TimingResult, TimingStrategy} from '../timing-strategy'; import {DeclarationUsageVisitor, FunctionContext} from './declaration_usage_visitor'; import {updateSuperClassAbstractMembersContext} from './super_class_context'; @@ -37,14 +37,23 @@ const STATIC_QUERY_LIFECYCLE_HOOKS = { export class QueryUsageStrategy implements TimingStrategy { constructor(private classMetadata: ClassMetadataMap, private typeChecker: ts.TypeChecker) {} + setup() { + // No setup is needed for this strategy and therefore we always return "true" as + // the setup is successful. + return true; + } + /** * Analyzes the usage of the given query and determines the query timing based * on the current usage of the query. */ - detectTiming(query: NgQueryDefinition): QueryTiming { - return isQueryUsedStatically(query.container, query, this.classMetadata, this.typeChecker, []) ? - QueryTiming.STATIC : - QueryTiming.DYNAMIC; + detectTiming(query: NgQueryDefinition): TimingResult { + return { + timing: + isQueryUsedStatically(query.container, query, this.classMetadata, this.typeChecker, []) ? + QueryTiming.STATIC : + QueryTiming.DYNAMIC + }; } } diff --git a/packages/core/schematics/migrations/static-queries/timing-strategy.ts b/packages/core/schematics/migrations/static-queries/timing-strategy.ts deleted file mode 100644 index c8af666961..0000000000 --- a/packages/core/schematics/migrations/static-queries/timing-strategy.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {NgQueryDefinition, QueryTiming} from './angular/query-definition'; - -export interface TimingStrategy { detectTiming(query: NgQueryDefinition): QueryTiming; } diff --git a/packages/core/schematics/migrations/static-queries/transform.ts b/packages/core/schematics/migrations/static-queries/transform.ts index 1a4b37a575..7863215946 100644 --- a/packages/core/schematics/migrations/static-queries/transform.ts +++ b/packages/core/schematics/migrations/static-queries/transform.ts @@ -15,11 +15,14 @@ import {NgQueryDefinition, QueryTiming} from './angular/query-definition'; * determined timing. The updated decorator call expression node will be returned. */ export function getTransformedQueryCallExpr( - query: NgQueryDefinition, timing: QueryTiming): ts.CallExpression|null { + query: NgQueryDefinition, timing: QueryTiming | null, createTodo: boolean): ts.CallExpression| + null { const queryExpr = query.decorator.node.expression; const queryArguments = queryExpr.arguments; - const timingPropertyAssignment = ts.createPropertyAssignment( - 'static', timing === QueryTiming.STATIC ? ts.createTrue() : ts.createFalse()); + const queryPropertyAssignments = timing === null ? + [] : + [ts.createPropertyAssignment( + 'static', timing === QueryTiming.STATIC ? ts.createTrue() : ts.createFalse())]; // If the query decorator is already called with two arguments, we need to // keep the existing options untouched and just add the new property if needed. @@ -34,13 +37,37 @@ export function getTransformedQueryCallExpr( } const updatedOptions = ts.updateObjectLiteral( - existingOptions, existingOptions.properties.concat(timingPropertyAssignment)); + existingOptions, existingOptions.properties.concat(queryPropertyAssignments)); + + if (createTodo) { + addQueryTimingTodoToNode(updatedOptions); + } + return ts.updateCall( queryExpr, queryExpr.expression, queryExpr.typeArguments, [queryArguments[0], updatedOptions]); } + const optionsNode = ts.createObjectLiteral(queryPropertyAssignments); + + if (createTodo) { + addQueryTimingTodoToNode(optionsNode); + } + return ts.updateCall( - queryExpr, queryExpr.expression, queryExpr.typeArguments, - [queryArguments[0], ts.createObjectLiteral([timingPropertyAssignment])]); + queryExpr, queryExpr.expression, queryExpr.typeArguments, [queryArguments[0], optionsNode]); +} + +/** + * Adds a to-do to the given TypeScript node which reminds developers to specify + * an explicit query timing. + */ +function addQueryTimingTodoToNode(node: ts.Node) { + ts.setSyntheticLeadingComments(node, [{ + pos: -1, + end: -1, + hasTrailingNewLine: false, + kind: ts.SyntaxKind.MultiLineCommentTrivia, + text: ' TODO: add static flag ' + }]); } diff --git a/packages/core/schematics/test/static_queries_migration_template_spec.ts b/packages/core/schematics/test/static_queries_migration_template_spec.ts new file mode 100644 index 0000000000..5345f3c1f7 --- /dev/null +++ b/packages/core/schematics/test/static_queries_migration_template_spec.ts @@ -0,0 +1,490 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +import {getSystemPath, normalize, virtualFs} from '@angular-devkit/core'; +import {TempScopedNodeJsSyncHost} from '@angular-devkit/core/node/testing'; +import {HostTree} from '@angular-devkit/schematics'; +import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; +import * as shx from 'shelljs'; + +describe('static-queries migration with template strategy', () => { + let runner: SchematicTestRunner; + let host: TempScopedNodeJsSyncHost; + let tree: UnitTestTree; + let tmpDirPath: string; + let previousWorkingDir: string; + let warnOutput: string[]; + + beforeEach(() => { + runner = new SchematicTestRunner('test', require.resolve('../migrations.json')); + host = new TempScopedNodeJsSyncHost(); + tree = new UnitTestTree(new HostTree(host)); + + writeFile('/tsconfig.json', JSON.stringify({ + compilerOptions: { + experimentalDecorators: true, + lib: ['es2015'], + } + })); + + warnOutput = []; + runner.logger.subscribe(logEntry => { + if (logEntry.level === 'warn') { + warnOutput.push(logEntry.message); + } + }); + + previousWorkingDir = shx.pwd(); + tmpDirPath = getSystemPath(host.root); + + // Switch into the temporary directory path. This allows us to run + // the schematic against our custom unit test tree. + shx.cd(tmpDirPath); + + writeFakeAngular(); + }); + + afterEach(() => { + shx.cd(previousWorkingDir); + shx.rm('-r', tmpDirPath); + }); + + function writeFakeAngular() { writeFile('/node_modules/@angular/core/index.d.ts', ``); } + + function writeFakeLibrary(selectorName = 'my-lib-selector') { + writeFile('/node_modules/my-lib/index.d.ts', `export * from './public-api';`); + writeFile('/node_modules/my-lib/public-api.d.ts', `export declare class MyLibComponent {}`); + writeFile('/node_modules/my-lib/index.metadata.json', JSON.stringify({ + __symbolic: 'module', + version: 4, + metadata: { + MyLibComponent: { + __symbolic: 'class', + decorators: [{ + __symbolic: 'call', + expression: { + __symbolic: 'reference', + module: '@angular/core', + name: 'Component', + line: 0, + character: 0 + }, + arguments: [{ + selector: selectorName, + template: `My Lib Component`, + }] + }], + members: {} + }, + }, + origins: { + MyLibComponent: './public-api', + }, + importAs: 'my-lib', + })); + } + + function writeFile(filePath: string, contents: string) { + host.sync.write(normalize(filePath), virtualFs.stringToFileBuffer(contents)); + } + + function runMigration() { runner.runSchematic('migration-v8-static-queries', {}, tree); } + + describe('ViewChild', () => { + + it('should detect queries selecting elements through template reference', () => { + writeFile('/index.ts', ` + import {Component, NgModule, ViewChild} from '@angular/core'; + + @Component({template: \` + + + +
    + +
    + \`}) + export class MyComp { + private @ViewChild('myButton') query: any; + private @ViewChild('myStaticButton') query2: any; + } + + @NgModule({declarations: [MyComp]}) + export class MyModule {} + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('myButton', { static: false }) query: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('myStaticButton', { static: true }) query2: any;`); + }); + + it('should detect queries selecting ng-template as static', () => { + writeFile('/index.ts', ` + import {Component, NgModule, ViewChild} from '@angular/core'; + + @Component({template: \` + + My template + + \`}) + export class MyComp { + private @ViewChild('myTmpl') query: any; + } + + @NgModule({declarations: [MyComp]}) + export class MyModule {} + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('myTmpl', { static: true }) query: any;`); + }); + + it('should detect queries selecting component view providers through string token', () => { + writeFile('/index.ts', ` + import {Component, Directive, NgModule, ViewChild} from '@angular/core'; + + @Directive({ + selector: '[myDirective]', + providers: [ + {provide: 'my-token', useValue: 'test'} + ] + }) + export class MyDirective {} + + @Directive({ + selector: '[myDirective2]', + providers: [ + {provide: 'my-token-2', useValue: 'test'} + ] + }) + export class MyDirective2 {} + + @Component({templateUrl: './my-tmpl.html'}) + export class MyComp { + private @ViewChild('my-token') query: any; + private @ViewChild('my-token-2') query2: any; + } + + @NgModule({declarations: [MyComp, MyDirective, MyDirective2]}) + export class MyModule {} + `); + + writeFile(`/my-tmpl.html`, ` + + + + + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('my-token', { static: true }) query: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('my-token-2', { static: false }) query2: any;`); + }); + + it('should detect queries selecting component view providers using class token', () => { + writeFile('/index.ts', ` + import {Component, Directive, NgModule, ViewChild} from '@angular/core'; + + export class MyService {} + export class MyService2 {} + + @Directive({ + selector: '[myDirective]', + providers: [MyService] + }) + export class MyDirective {} + + @Directive({ + selector: '[myDirective2]', + providers: [MyService2] + }) + export class MyDirective2 {} + + @Component({templateUrl: './my-tmpl.html'}) + export class MyComp { + private @ViewChild(MyService) query: any; + private @ViewChild(MyService2) query2: any; + } + + @NgModule({declarations: [MyComp, MyDirective, MyDirective2]}) + export class MyModule {} + `); + + writeFile(`/my-tmpl.html`, ` + + + + + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild(MyService, { static: true }) query: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild(MyService2, { static: false }) query2: any;`); + }); + + it('should detect queries selecting component', () => { + writeFile('/index.ts', ` + import {Component, NgModule, ViewChild} from '@angular/core'; + import {HomeComponent, HomeComponent2} from './home-comp'; + + @Component({ + template: \` + + + + + \` + }) + export class MyComp { + private @ViewChild(HomeComponent) query: any; + private @ViewChild(HomeComponent2) query2: any; + } + + @NgModule({declarations: [MyComp, HomeComponent, HomeComponent2]}) + export class MyModule {} + `); + + writeFile(`/home-comp.ts`, ` + import {Component} from '@angular/core'; + + @Component({ + selector: 'home-comp', + template: 'Home' + }) + export class HomeComponent {} + + @Component({ + selector: 'home-comp2', + template: 'Home 2' + }) + export class HomeComponent2 {} + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild(HomeComponent, { static: true }) query: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild(HomeComponent2, { static: false }) query2: any;`); + }); + + it('should detect queries selecting third-party component', () => { + writeFakeLibrary(); + writeFile('/index.ts', ` + import {Component, NgModule, ViewChild} from '@angular/core'; + import {MyLibComponent} from 'my-lib'; + + @Component({templateUrl: './my-tmpl.html'}) + export class MyComp { + private @ViewChild(MyLibComponent) query: any; + } + + @NgModule({declarations: [MyComp, MyLibComponent]}) + export class MyModule {} + `); + + writeFile('/my-tmpl.html', ` + My projected content + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild(MyLibComponent, { static: true }) query: any;`); + }); + + it('should detect queries selecting third-party component with multiple selectors', () => { + writeFakeLibrary('a-selector, test-selector'); + writeFile('/index.ts', ` + import {Component, NgModule, ViewChild} from '@angular/core'; + import {MyLibComponent} from 'my-lib'; + + @Component({templateUrl: './my-tmpl.html'}) + export class MyComp { + private @ViewChild(MyLibComponent) query: any; + } + + @NgModule({declarations: [MyComp, MyLibComponent]}) + export class MyModule {} + `); + + writeFile('/my-tmpl.html', ` + Match 1 + + Match 2 + + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild(MyLibComponent, { static: false }) query: any;`); + }); + + it('should detect queries within structural directive', () => { + writeFile('/index.ts', ` + import {Component, Directive, NgModule, ViewChild} from '@angular/core'; + + @Directive({selector: '[ngIf]'}) + export class FakeNgIf {} + + @Component({templateUrl: 'my-tmpl.html'}) + export class MyComp { + private @ViewChild('myRef') query: any; + private @ViewChild('myRef2') query2: any; + } + + @NgModule({declarations: [MyComp, FakeNgIf]}) + export class MyModule {} + `); + + writeFile(`/my-tmpl.html`, ` + No asterisk + With asterisk + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('myRef', { static: true }) query: any;`); + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('myRef2', { static: false }) query2: any;`); + }); + + it('should detect inherited queries', () => { + writeFile('/index.ts', ` + import {Component, NgModule, ViewChild} from '@angular/core'; + + export class BaseClass { + @ViewChild('myRef') query: any; + } + + @Component({templateUrl: 'my-tmpl.html'}) + export class MyComp extends BaseClass {} + + @NgModule({declarations: [MyComp]}) + export class MyModule {} + `); + + writeFile(`/my-tmpl.html`, ` + My Ref + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('myRef', { static: true }) query: any;`); + }); + + it('should add a todo if a query is not declared in any component', () => { + writeFile('/index.ts', ` + import {Component, NgModule, ViewChild, SomeToken} from '@angular/core'; + + export class NotAComponent { + @ViewChild('myRef', {read: SomeToken}) query: any; + } + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain( + `@ViewChild('myRef', /* TODO: add static flag */ { read: SomeToken }) query: any;`); + expect(warnOutput.length).toBe(1); + expect(warnOutput[0]) + .toMatch( + /^⮑ {3}index.ts@5:11:.+could not be determined.+not declared in any component/); + }); + + it('should add a todo if a query is used multiple times with different timing', () => { + writeFile('/index.ts', ` + import {Component, NgModule, ViewChild} from '@angular/core'; + + export class BaseClass { + @ViewChild('myRef') query: any; + } + + @Component({template: '

    '}) + export class FirstComp extends BaseClass {} + + @Component({template: ''}) + export class SecondComp extends BaseClass {} + + @NgModule({declarations: [FirstComp, SecondComp]}) + export class MyModule {} + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ViewChild('myRef', /* TODO: add static flag */ {}) query: any;`); + expect(warnOutput.length).toBe(1); + expect(warnOutput[0]) + .toMatch( + /^⮑ {3}index.ts@5:11: Multiple components use the query with different timings./); + }); + + it('should gracefully exit migration if queries could not be analyzed', () => { + writeFile('/index.ts', ` + import {Component, ViewChild} from '@angular/core'; + + @Component({template: '

    '}) + export class MyComp { + @ViewChild('myRef') query: any; + } + + // **NOTE**: Analysis will fail as there is no "NgModule" that declares the component. + `); + + spyOn(console, 'error'); + + // We don't expect an error to be thrown as this could interrupt other + // migrations which are scheduled with "ng update" in the CLI. + expect(() => runMigration()).not.toThrow(); + + expect(console.error) + .toHaveBeenCalledWith('Could not create Angular AOT compiler to determine query timing.'); + expect(console.error) + .toHaveBeenCalledWith( + jasmine.stringMatching(/Cannot determine the module for class MyComp/)); + }); + + it('should add a todo for content queries which are not detectable', () => { + writeFile('/index.ts', ` + import {Component, NgModule, ContentChild} from '@angular/core'; + + @Component({template: '

    '}) + export class MyComp { + @ContentChild('myRef') query: any; + } + + @NgModule({declarations: [MyComp]}) + export class MyModule {} + `); + + runMigration(); + + expect(tree.readContent('/index.ts')) + .toContain(`@ContentChild('myRef', /* TODO: add static flag */ {}) query: any;`); + expect(warnOutput.length).toBe(1); + expect(warnOutput[0]) + .toMatch(/^⮑ {3}index.ts@6:11: Content queries cannot be migrated automatically\./); + }); + }); +}); diff --git a/packages/core/schematics/test/static_queries_migration_spec.ts b/packages/core/schematics/test/static_queries_migration_usage_spec.ts similarity index 98% rename from packages/core/schematics/test/static_queries_migration_spec.ts rename to packages/core/schematics/test/static_queries_migration_usage_spec.ts index bbc12f92c4..025618e949 100644 --- a/packages/core/schematics/test/static_queries_migration_spec.ts +++ b/packages/core/schematics/test/static_queries_migration_usage_spec.ts @@ -12,13 +12,19 @@ import {HostTree} from '@angular-devkit/schematics'; import {SchematicTestRunner, UnitTestTree} from '@angular-devkit/schematics/testing'; import * as shx from 'shelljs'; -describe('static-queries migration', () => { +describe('static-queries migration with usage strategy', () => { let runner: SchematicTestRunner; let host: TempScopedNodeJsSyncHost; let tree: UnitTestTree; let tmpDirPath: string; let previousWorkingDir: string; + // Enables the query usage strategy when running the `static-query` migration. By + // default the schematic runs the template strategy and there is currently no easy + // way to pass options to the migration without using environment variables. + beforeAll(() => process.env['NG_STATIC_QUERY_USAGE_STRATEGY'] = 'true'); + afterAll(() => process.env['NG_STATIC_QUERY_USAGE_STRATEGY'] = ''); + beforeEach(() => { runner = new SchematicTestRunner('test', require.resolve('../migrations.json')); host = new TempScopedNodeJsSyncHost(); diff --git a/packages/core/schematics/tsconfig.json b/packages/core/schematics/tsconfig.json index 2fccbe4bea..fc07f36196 100644 --- a/packages/core/schematics/tsconfig.json +++ b/packages/core/schematics/tsconfig.json @@ -10,7 +10,9 @@ "baseUrl": ".", "paths": { "@angular/compiler": ["../../compiler"], - "@angular/compiler/*": ["../../compiler/*"] + "@angular/compiler/*": ["../../compiler/*"], + "@angular/compiler-cli": ["../../compiler-cli"], + "@angular/compiler-cli/*": ["../../compiler-cli/*"] } }, "bazelOptions": { From b0c1282fbed04771a8649f8cf9b355a4076136a2 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Thu, 11 Apr 2019 18:59:12 +0200 Subject: [PATCH 0745/1073] refactor(core): migrations do not properly handle multiple templates in source file (#29841) Currently if there are multiple source files within a given TypeScript source file, only the last template in the source file is checked as we store templates in a `Map` with the source file paths as keys. This is problematic as multiple templates can live within the same source file and we therefore accidentally overwrite existing entries in the resolved templates map. PR Close #29841 --- .../analyze_template.ts | 6 ++--- .../noTemplateVariableAssignmentRule.ts | 5 +++-- .../template-var-assignment/index.ts | 5 +++-- .../template_var_assignment_migration_spec.ts | 22 +++++++++++++++++++ .../schematics/utils/ng_component_template.ts | 6 ++--- 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/packages/core/schematics/migrations/template-var-assignment/analyze_template.ts b/packages/core/schematics/migrations/template-var-assignment/analyze_template.ts index f732c7b760..c140770232 100644 --- a/packages/core/schematics/migrations/template-var-assignment/analyze_template.ts +++ b/packages/core/schematics/migrations/template-var-assignment/analyze_template.ts @@ -24,9 +24,9 @@ export interface TemplateVariableAssignment { * Analyzes a given resolved template by looking for property assignments to local * template variables within bound events. */ -export function analyzeResolvedTemplate( - filePath: string, template: ResolvedTemplate): TemplateVariableAssignment[]|null { - const templateNodes = parseHtmlGracefully(template.content, filePath); +export function analyzeResolvedTemplate(template: ResolvedTemplate): TemplateVariableAssignment[]| + null { + const templateNodes = parseHtmlGracefully(template.content, template.filePath); if (!templateNodes) { return null; diff --git a/packages/core/schematics/migrations/template-var-assignment/google3/noTemplateVariableAssignmentRule.ts b/packages/core/schematics/migrations/template-var-assignment/google3/noTemplateVariableAssignmentRule.ts index 34adc22a0d..0bd7077ab5 100644 --- a/packages/core/schematics/migrations/template-var-assignment/google3/noTemplateVariableAssignmentRule.ts +++ b/packages/core/schematics/migrations/template-var-assignment/google3/noTemplateVariableAssignmentRule.ts @@ -33,8 +33,9 @@ export class Rule extends Rules.TypedRule { // Analyze each resolved template and print a warning for property writes to // template variables. - resolvedTemplates.forEach((template, filePath) => { - const nodes = analyzeResolvedTemplate(filePath, template); + resolvedTemplates.forEach(template => { + const filePath = template.filePath; + const nodes = analyzeResolvedTemplate(template); const templateFile = template.inline ? sourceFile : createHtmlSourceFile(filePath, template.content); diff --git a/packages/core/schematics/migrations/template-var-assignment/index.ts b/packages/core/schematics/migrations/template-var-assignment/index.ts index 43502a4c6f..f6d534cefe 100644 --- a/packages/core/schematics/migrations/template-var-assignment/index.ts +++ b/packages/core/schematics/migrations/template-var-assignment/index.ts @@ -71,8 +71,9 @@ function runTemplateVariableAssignmentCheck( // Analyze each resolved template and print a warning for property writes to // template variables. - resolvedTemplates.forEach((template, filePath) => { - const nodes = analyzeResolvedTemplate(filePath, template); + resolvedTemplates.forEach(template => { + const filePath = template.filePath; + const nodes = analyzeResolvedTemplate(template); if (!nodes) { return; diff --git a/packages/core/schematics/test/template_var_assignment_migration_spec.ts b/packages/core/schematics/test/template_var_assignment_migration_spec.ts index c3bac52433..87a3ba4f9e 100644 --- a/packages/core/schematics/test/template_var_assignment_migration_spec.ts +++ b/packages/core/schematics/test/template_var_assignment_migration_spec.ts @@ -197,4 +197,26 @@ describe('template variable assignment migration', () => { expect(warnOutput.length).toBe(0); }); + + it('should be able to report multiple templates within the same source file', () => { + writeFile('/index.ts', ` + import {Component} from '@angular/core'; + + @Component({ + template: '', + }) + export class MyComp {} + + @Component({ + template: '', + }) + export class MyComp2 {} + `); + + runMigration(); + + expect(warnOutput.length).toBe(2); + expect(warnOutput[0]).toMatch(/^⮑ {3}index.ts@5:56: Found assignment/); + expect(warnOutput[1]).toMatch(/^⮑ {3}index.ts@10:53: Found assignment/); + }); }); diff --git a/packages/core/schematics/utils/ng_component_template.ts b/packages/core/schematics/utils/ng_component_template.ts index aac6620fde..d905d0e8d5 100644 --- a/packages/core/schematics/utils/ng_component_template.ts +++ b/packages/core/schematics/utils/ng_component_template.ts @@ -39,7 +39,7 @@ export interface ResolvedTemplate { * TypeScript source files (inline templates or external referenced templates) */ export class NgComponentTemplateVisitor { - resolvedTemplates = new Map(); + resolvedTemplates: ResolvedTemplate[] = []; constructor(public typeChecker: ts.TypeChecker) {} @@ -95,7 +95,7 @@ export class NgComponentTemplateVisitor { // not part of the template content. const templateStartIdx = property.initializer.getStart() + 1; const filePath = resolve(sourceFileName); - this.resolvedTemplates.set(filePath, { + this.resolvedTemplates.push({ filePath: filePath, container: node, content: property.initializer.text, @@ -117,7 +117,7 @@ export class NgComponentTemplateVisitor { const fileContent = readFileSync(templatePath, 'utf8'); const lineStartsMap = computeLineStartsMap(fileContent); - this.resolvedTemplates.set(templatePath, { + this.resolvedTemplates.push({ filePath: templatePath, container: node, content: fileContent, From ee603a3b019c38572017aa3993a29e05a11a109a Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 15 Apr 2019 10:15:07 +0100 Subject: [PATCH 0746/1073] build(docs-infra): update to CLI 8 beta.13 (#29764) PR Close #29764 --- aio/angular.json | 2 +- aio/package.json | 4 +- aio/scripts/_payload-limits.json | 2 +- aio/src/styles/2-modules/_table.scss | 13 +- aio/yarn.lock | 1710 ++++++++++---------------- 5 files changed, 645 insertions(+), 1086 deletions(-) diff --git a/aio/angular.json b/aio/angular.json index 6355a4b314..56c2927740 100644 --- a/aio/angular.json +++ b/aio/angular.json @@ -1,5 +1,5 @@ { - "$schema": "./node_modules/@angular-devkit/core/src/workspace/workspace-schema.json", + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, "cli": { "packageManager": "yarn", diff --git a/aio/package.json b/aio/package.json index 93917d88e2..589b08df4d 100644 --- a/aio/package.json +++ b/aio/package.json @@ -96,8 +96,8 @@ "zone.js": "^0.9.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^0.12.1", - "@angular/cli": "7.2.1", + "@angular-devkit/build-angular": "0.800.0-beta.13", + "@angular/cli": "8.0.0-beta.13", "@angular/compiler": "^7.0.0", "@angular/compiler-cli": "^7.0.0", "@angular/language-service": "^7.0.0", diff --git a/aio/scripts/_payload-limits.json b/aio/scripts/_payload-limits.json index fbf5bf4630..db3c38cc54 100755 --- a/aio/scripts/_payload-limits.json +++ b/aio/scripts/_payload-limits.json @@ -3,7 +3,7 @@ "master": { "uncompressed": { "runtime": 2972, - "main": 503779, + "main": 479228, "polyfills": 59197 } } diff --git a/aio/src/styles/2-modules/_table.scss b/aio/src/styles/2-modules/_table.scss index 0d5436d632..a479c0be97 100644 --- a/aio/src/styles/2-modules/_table.scss +++ b/aio/src/styles/2-modules/_table.scss @@ -55,21 +55,22 @@ table { td { letter-spacing: 0.30px; - tr td:first-child { - @media (max-width: 480px) { - background-color: $lightgray; + tr td:first-child { + @media (max-width: 480px) { + background-color: $lightgray; + } } } - } - th { background: rgba($lightgray, 0.2); border-right: 1px solid $lightgray; font-weight: 600; max-width: 100px; } + } + tbody > tr { &:last-child td { border: none; @@ -111,4 +112,4 @@ table { } } } -} +} \ No newline at end of file diff --git a/aio/yarn.lock b/aio/yarn.lock index a4724b52e5..3483145425 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -2,124 +2,107 @@ # yarn lockfile v1 -"@angular-devkit/architect@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.12.1.tgz#397768d1ccd0cef76db96d6b39db8aebad68c031" - integrity sha512-1ozBP0ZAApkSfuPpZ7b9vShU8smNxb98jW+65S12cPOxv1bVVxCj5sTmC3sSfXapgq/pMzblbaVSKOG7Ajz0vQ== +"@angular-devkit/architect@0.800.0-beta.13": + version "0.800.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.800.0-beta.13.tgz#9b1d555027c3cf0c5f46fffc0a8c00cc2263e8dd" + integrity sha512-rIwlno0B4Fk0eJli3fT9ON73vWhtR1JmXfdEOqbvnl90S2ZHx8qDISAzNNj7gvUfYStd2SEsBKtHrBOIRYIOsw== dependencies: - "@angular-devkit/core" "7.2.1" - rxjs "6.3.3" + "@angular-devkit/core" "8.0.0-beta.13" + rxjs "6.4.0" -"@angular-devkit/architect@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.12.4.tgz#e43d00cb7f6c5cda8e11c10ae04beb34f3cbcc9a" - integrity sha512-19f3jbGyP+GzTSBgrHR4SWGK81SUgtTxhkAcyhmsIEDuXrMJM8kPu0HB9WivJ5p08+jzwz6xdF9mpNYSeD9uqw== +"@angular-devkit/build-angular@0.800.0-beta.13": + version "0.800.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.800.0-beta.13.tgz#2fbba893c52d6917c6b64fa0a52cba8c3722f22c" + integrity sha512-pe7SWXN05qRiO/2fkir07Z+13MtRsmhyJFqyAT1u4XhgBtzT12p0pn94dOwWeg9W56/t1TnE59xH7gj4jkyCOw== dependencies: - "@angular-devkit/core" "7.2.4" - rxjs "6.3.3" - -"@angular-devkit/build-angular@^0.12.1": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.12.4.tgz#b0885c70ff5c089450fe51bda3038625a82af6b2" - integrity sha512-zzjpM9GpCGEUtTPv/T04CALzFXkTgAAiNt1whY1Vmtu2YYUksXOm1ysA2RBLEhb81RodTEwVV2zFUj5v2xHYEw== - dependencies: - "@angular-devkit/architect" "0.12.4" - "@angular-devkit/build-optimizer" "0.12.4" - "@angular-devkit/build-webpack" "0.12.4" - "@angular-devkit/core" "7.2.4" - "@ngtools/webpack" "7.2.4" - ajv "6.6.2" - autoprefixer "9.4.3" + "@angular-devkit/architect" "0.800.0-beta.13" + "@angular-devkit/build-optimizer" "0.800.0-beta.13" + "@angular-devkit/build-webpack" "0.800.0-beta.13" + "@angular-devkit/core" "8.0.0-beta.13" + "@ngtools/webpack" "8.0.0-beta.13" + ajv "6.10.0" + autoprefixer "9.5.1" + browserslist "4.5.4" + caniuse-api "3.0.0" circular-dependency-plugin "5.0.2" clean-css "4.2.1" - copy-webpack-plugin "4.6.0" - file-loader "2.0.0" + copy-webpack-plugin "5.0.2" + core-js "3.0.1" + file-loader "3.0.1" glob "7.1.3" - istanbul "0.4.5" istanbul-instrumenter-loader "3.0.1" - karma-source-map-support "1.3.0" + karma-source-map-support "1.4.0" less "3.9.0" less-loader "4.1.0" - license-webpack-plugin "2.0.4" - loader-utils "1.1.0" - mini-css-extract-plugin "0.4.4" + license-webpack-plugin "2.1.1" + loader-utils "1.2.3" + mini-css-extract-plugin "0.6.0" minimatch "3.0.4" - opn "5.4.0" + open "6.1.0" parse5 "4.0.0" - portfinder "1.0.17" - postcss "7.0.13" + postcss "7.0.14" postcss-import "12.0.1" postcss-loader "3.0.0" - raw-loader "0.5.1" - rxjs "6.3.3" + raw-loader "1.0.0" + rxjs "6.4.0" + sass "1.18.0" sass-loader "7.1.0" - semver "5.5.1" + semver "6.0.0" source-map-loader "0.2.4" - source-map-support "0.5.9" - speed-measure-webpack-plugin "1.2.5" + source-map-support "0.5.12" + speed-measure-webpack-plugin "1.3.1" stats-webpack-plugin "0.7.0" style-loader "0.23.1" stylus "0.54.5" stylus-loader "3.0.2" - terser-webpack-plugin "1.2.1" - tree-kill "1.2.0" - webpack "4.28.4" - webpack-dev-middleware "3.4.0" - webpack-dev-server "3.1.14" - webpack-merge "4.1.4" + terser-webpack-plugin "1.2.3" + tree-kill "1.2.1" + webpack "4.29.6" + webpack-dev-middleware "3.6.2" + webpack-dev-server "3.3.1" + webpack-merge "4.2.1" webpack-sources "1.3.0" webpack-subresource-integrity "1.1.0-rc.6" - optionalDependencies: - node-sass "4.10.0" + worker-plugin "3.1.0" -"@angular-devkit/build-optimizer@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.12.4.tgz#a78b9084f379b41ce63c2ccd3c6f889a9b2bb6f1" - integrity sha512-KraU+ZARX7JMtttPjOku9wVF+dnjMsIbiIVsQrNXhpFiGT1fSJhQTPxc98ONgEmUiGROFXXq2mHLilvMr2WdwQ== +"@angular-devkit/build-optimizer@0.800.0-beta.13": + version "0.800.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.800.0-beta.13.tgz#01b66c4bd01135ca1efe6ee72f5f8fe034aefcb3" + integrity sha512-gqcSq49+571MJdxwjkKTHvY/ejhwhhKCLQZVu7TNSIXPoDLuEEsWRQp1ClxvQVRxL4YHI1bxXbNiXe1v+Rp9lA== dependencies: - loader-utils "1.1.0" + loader-utils "1.2.3" source-map "0.5.6" - typescript "3.2.4" - webpack-sources "1.2.0" + typescript "3.3.4000" + webpack-sources "1.3.0" -"@angular-devkit/build-webpack@0.12.4": - version "0.12.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.12.4.tgz#68479484bdd8c5b3468af8e509b26714fec424fd" - integrity sha512-1+t2MUB+dq+1LbfTnvzZwj2QTWiugyMywXqYjsyt0rrh7VcriD1lQ+P5yN8kgFz/R7Ut4LgvS05yDX1JHi20qw== +"@angular-devkit/build-webpack@0.800.0-beta.13": + version "0.800.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.800.0-beta.13.tgz#2de6183328648aa026b3376f4d276b3ef77fe556" + integrity sha512-L8jSsys83rrG+AtZvGvj5EWjDPUJD0PokR/WtD0/z5XlugcRe4g/IlYe9lxszoNEo+Vku8gMJgoG5vy41VK7CQ== dependencies: - "@angular-devkit/architect" "0.12.4" - "@angular-devkit/core" "7.2.4" - rxjs "6.3.3" + "@angular-devkit/architect" "0.800.0-beta.13" + "@angular-devkit/core" "8.0.0-beta.13" + rxjs "6.4.0" + webpack-merge "4.2.1" -"@angular-devkit/core@7.2.1": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.2.1.tgz#8c6df59eab77bcc98a348c8cdf9eb217c8b751a5" - integrity sha512-zOozPswSM1cTkltw5LeSPoZ/fJ2d3vN304IVgKgrM5/Fs54bd7nTaBcAK+HvjKS+5KmykYrXW47Q4CdFJikluQ== +"@angular-devkit/core@8.0.0-beta.13": + version "8.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.0.0-beta.13.tgz#5d2dd501e62ab05abc6aa24080343786af818d66" + integrity sha512-uSVzCgxdE0Ev80q3huw7o/JcPzLcSjsSDXIVndZwiZXJ2b4cWsOE/Yi4TPvi/7O9jpuUJJk4Q4z3GIxRnYL1OA== dependencies: - ajv "6.6.2" - chokidar "2.0.4" + ajv "6.10.0" fast-json-stable-stringify "2.0.0" - rxjs "6.3.3" + magic-string "0.25.2" + rxjs "6.4.0" source-map "0.7.3" -"@angular-devkit/core@7.2.4": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.2.4.tgz#4464d536f4838e5c61ab4bc1ff6b7f221fd43056" - integrity sha512-XHF59tIHg2qEM1Wd415xhykBLjjfOK6yMB7CjNk1bToUMX2QDT87izJF4y1Vwa0lIw9G0jdgP/4/M/OqXcbYmA== +"@angular-devkit/schematics@8.0.0-beta.13": + version "8.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.0.0-beta.13.tgz#6268b8b1d3b1d13ad22f11862b03a99cc3a900e3" + integrity sha512-GmqTYKls/wWHpvwPxtEJfhFHP7w6GVD0dnKrmYKEsTEBuNJPVNMvueGfZQCOMviye3EccJp5EWkgXT/ChNi/EQ== dependencies: - ajv "6.6.2" - chokidar "2.0.4" - fast-json-stable-stringify "2.0.0" - rxjs "6.3.3" - source-map "0.7.3" - -"@angular-devkit/schematics@7.2.1": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.2.1.tgz#9c1c784f4a81a3a840fa4a1435948c6203be6062" - integrity sha512-jEhwkeDn8exgJBfUwMc6rdtDkxHJkUmKPTn4M436bkMMMa9KFPFbPpzp9weKpB3SbRjM3Mu90JprO4C7qDtCcg== - dependencies: - "@angular-devkit/core" "7.2.1" - rxjs "6.3.3" + "@angular-devkit/core" "8.0.0-beta.13" + rxjs "6.4.0" "@angular/animations@^7.0.0": version "7.2.9" @@ -136,20 +119,27 @@ optionalDependencies: parse5 "^5.0.0" -"@angular/cli@7.2.1": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.2.1.tgz#cef405a6edc2747aa004f758c691496a81edc8d1" - integrity sha512-KA5HE+s2ZBV9T+3XAvLXZulvPzp2BQKEKCoj6aefZB+TZASeatXO8keDDm2+N/8zqoqSe/akf6hvB/u9x0xJ3w== +"@angular/cli@8.0.0-beta.13": + version "8.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-8.0.0-beta.13.tgz#18c1b989f8273514fb80805b8455146d38eb1151" + integrity sha512-2SQEUVSg9mFJklFfZauwWDDdD5wyf8X2c1+bmOsOTPVANfY3OEB6Fd/fPAxNJOCi7bsVsXvXLAdDc9XmdQWCMA== dependencies: - "@angular-devkit/architect" "0.12.1" - "@angular-devkit/core" "7.2.1" - "@angular-devkit/schematics" "7.2.1" - "@schematics/angular" "7.2.1" - "@schematics/update" "0.12.1" - inquirer "6.2.1" - opn "5.3.0" - semver "5.5.1" + "@angular-devkit/architect" "0.800.0-beta.13" + "@angular-devkit/core" "8.0.0-beta.13" + "@angular-devkit/schematics" "8.0.0-beta.13" + "@schematics/angular" "8.0.0-beta.13" + "@schematics/update" "0.800.0-beta.13" + "@yarnpkg/lockfile" "1.1.0" + debug "^4.1.1" + ini "1.3.5" + inquirer "6.2.2" + npm-package-arg "6.1.0" + open "6.1.0" + pacote "9.5.0" + semver "6.0.0" symbol-observable "1.2.0" + universal-analytics "^0.4.20" + uuid "^3.3.2" "@angular/common@^7.0.0": version "7.2.9" @@ -324,38 +314,37 @@ through2 "^2.0.0" xdg-basedir "^3.0.0" -"@ngtools/webpack@7.2.4": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-7.2.4.tgz#5645b0a3af6a37abd6c1b277d9e16c4c27cff11e" - integrity sha512-mXMDODmy53kk+Kb5jgLNQOsSrDBQQMf6C6KZNuGo8AdvUGdGaQeZDze4o7bcUz1KUjuaaP1Zh7pZtho8C4/T+Q== +"@ngtools/webpack@8.0.0-beta.13": + version "8.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-8.0.0-beta.13.tgz#2e40dc3d04fa5efbd76fcb6d2ec84cde8a56f4a6" + integrity sha512-7dqJB4LGTI4GwfnbVNJQs/6RTOdIxod6bI2wlcMBQXSPr7AcFUgsvclDaEIuUDFOIjH/4WZ5vSf63BkUwBslOw== dependencies: - "@angular-devkit/core" "7.2.4" + "@angular-devkit/core" "8.0.0-beta.13" enhanced-resolve "4.1.0" - rxjs "6.3.3" - tree-kill "1.2.0" - webpack-sources "1.2.0" + rxjs "6.4.0" + tree-kill "1.2.1" + webpack-sources "1.3.0" -"@schematics/angular@7.2.1": - version "7.2.1" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.2.1.tgz#9eeab1354ec8d970121cc067e9636098ab84e152" - integrity sha512-UdqU8udVr693BZ6uaZ7+el/VFlTjrmp56OS+6YaziyAko84e1Q1Fcx+fwdHugy4V3YmQhTVsyOPSEsphnwSwOA== +"@schematics/angular@8.0.0-beta.13": + version "8.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.0.0-beta.13.tgz#fecbb6822f01120b628eb67da04ed918224ad68b" + integrity sha512-P58ALYgi4elVCDHAS3yUNE5cMOg9Go4C+VrY2Viqe1BfWD8tXjvr80tI0hm0KdNvNmYUupsV7QEJ8j4ie2YtGA== dependencies: - "@angular-devkit/core" "7.2.1" - "@angular-devkit/schematics" "7.2.1" - typescript "3.2.2" + "@angular-devkit/core" "8.0.0-beta.13" + "@angular-devkit/schematics" "8.0.0-beta.13" -"@schematics/update@0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.12.1.tgz#44d853321ae8a56c43a579c0639d26d625001037" - integrity sha512-P92tDxy0AA1NPhaThiJ7fIFxIC4jzlGK7sJlpbnRREBImsI/O9gmGaV8Kjy+75vaEjqpWaU2oj1hnWqkmxSK1A== +"@schematics/update@0.800.0-beta.13": + version "0.800.0-beta.13" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.800.0-beta.13.tgz#96b59a4e0fc4b020f9abe21f48b91d80ccd55b38" + integrity sha512-fWc3Pfiou6eBcSxJTNqVmCvzAAtR9K8q1qtHU81BsVN+/7+UEV7sqdQJcYsIH50kvPKyIwps0OstDPwaOBwtRw== dependencies: - "@angular-devkit/core" "7.2.1" - "@angular-devkit/schematics" "7.2.1" + "@angular-devkit/core" "8.0.0-beta.13" + "@angular-devkit/schematics" "8.0.0-beta.13" "@yarnpkg/lockfile" "1.1.0" ini "1.3.5" - pacote "9.1.1" - rxjs "6.3.3" - semver "5.5.1" + pacote "9.5.0" + rxjs "6.4.0" + semver "6.0.0" semver-intersect "1.4.0" "@sindresorhus/is@^0.7.0": @@ -429,148 +418,151 @@ "@types/source-list-map" "*" source-map "^0.6.1" -"@webassemblyjs/ast@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" - integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== +"@webassemblyjs/ast@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" + integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== dependencies: - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" -"@webassemblyjs/floating-point-hex-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" - integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== +"@webassemblyjs/floating-point-hex-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" + integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== -"@webassemblyjs/helper-api-error@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" - integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== +"@webassemblyjs/helper-api-error@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" + integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== -"@webassemblyjs/helper-buffer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" - integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== +"@webassemblyjs/helper-buffer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" + integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== -"@webassemblyjs/helper-code-frame@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" - integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== +"@webassemblyjs/helper-code-frame@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" + integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== dependencies: - "@webassemblyjs/wast-printer" "1.7.11" + "@webassemblyjs/wast-printer" "1.8.5" -"@webassemblyjs/helper-fsm@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" - integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== +"@webassemblyjs/helper-fsm@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" + integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== -"@webassemblyjs/helper-module-context@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" - integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== - -"@webassemblyjs/helper-wasm-bytecode@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" - integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== - -"@webassemblyjs/helper-wasm-section@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" - integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== +"@webassemblyjs/helper-module-context@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" + integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + mamacro "^0.0.3" -"@webassemblyjs/ieee754@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" - integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== +"@webassemblyjs/helper-wasm-bytecode@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" + integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== + +"@webassemblyjs/helper-wasm-section@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" + integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== + dependencies: + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + +"@webassemblyjs/ieee754@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" + integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" - integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== +"@webassemblyjs/leb128@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" + integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== dependencies: - "@xtuc/long" "4.2.1" + "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" - integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== +"@webassemblyjs/utf8@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" + integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== -"@webassemblyjs/wasm-edit@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" - integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== +"@webassemblyjs/wasm-edit@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" + integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/helper-wasm-section" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-opt" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - "@webassemblyjs/wast-printer" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/helper-wasm-section" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-opt" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + "@webassemblyjs/wast-printer" "1.8.5" -"@webassemblyjs/wasm-gen@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" - integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== +"@webassemblyjs/wasm-gen@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" + integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -"@webassemblyjs/wasm-opt@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" - integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== +"@webassemblyjs/wasm-opt@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" + integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-buffer" "1.7.11" - "@webassemblyjs/wasm-gen" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-buffer" "1.8.5" + "@webassemblyjs/wasm-gen" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" -"@webassemblyjs/wasm-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" - integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== +"@webassemblyjs/wasm-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" + integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-wasm-bytecode" "1.7.11" - "@webassemblyjs/ieee754" "1.7.11" - "@webassemblyjs/leb128" "1.7.11" - "@webassemblyjs/utf8" "1.7.11" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-wasm-bytecode" "1.8.5" + "@webassemblyjs/ieee754" "1.8.5" + "@webassemblyjs/leb128" "1.8.5" + "@webassemblyjs/utf8" "1.8.5" -"@webassemblyjs/wast-parser@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" - integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== +"@webassemblyjs/wast-parser@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" + integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/floating-point-hex-parser" "1.7.11" - "@webassemblyjs/helper-api-error" "1.7.11" - "@webassemblyjs/helper-code-frame" "1.7.11" - "@webassemblyjs/helper-fsm" "1.7.11" - "@xtuc/long" "4.2.1" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/floating-point-hex-parser" "1.8.5" + "@webassemblyjs/helper-api-error" "1.8.5" + "@webassemblyjs/helper-code-frame" "1.8.5" + "@webassemblyjs/helper-fsm" "1.8.5" + "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.7.11": - version "1.7.11" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" - integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== +"@webassemblyjs/wast-printer@1.8.5": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" + integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/wast-parser" "1.7.11" - "@xtuc/long" "4.2.1" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/wast-parser" "1.8.5" + "@xtuc/long" "4.2.2" "@webcomponents/custom-elements@^1.2.0": version "1.2.1" @@ -582,10 +574,10 @@ resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== -"@xtuc/long@4.2.1": - version "4.2.1" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" - integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== "@yarnpkg/lockfile@1.1.0", "@yarnpkg/lockfile@^1.1.0": version "1.1.0" @@ -626,11 +618,6 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= - accepts@1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" @@ -646,12 +633,10 @@ accepts@~1.3.4, accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== - dependencies: - acorn "^5.0.0" +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== acorn-globals@^3.1.0: version "3.1.0" @@ -673,15 +658,15 @@ acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.0, acorn@^5.6.2: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== - acorn@^5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.2.tgz#911cb53e036807cf0fa778dc5d370fbd864246d7" +acorn@^6.0.5: + version "6.1.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.1.tgz#7d25ae05bb8ad1f9b699108e1094ecd7884adc1f" + integrity sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA== + adm-zip@^0.4.11: version "0.4.11" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.11.tgz#2aa54c84c4b01a9d0fb89bb11982a51f13e3d62a" @@ -723,10 +708,10 @@ ajv-keywords@^3.1.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.0.tgz#4b831e7b531415a7cc518cd404e73f6193c6349d" integrity sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw== -ajv@6.6.2: - version "6.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.2.tgz#caceccf474bf3fc3ce3b147443711a24063cc30d" - integrity sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g== +ajv@6.10.0, ajv@^6.1.0, ajv@^6.5.5: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -751,16 +736,6 @@ ajv@^5.0.0, ajv@^5.1.0: fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" -ajv@^6.1.0, ajv@^6.5.5: - version "6.10.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" - integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - ajv@^6.5.2: version "6.5.4" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" @@ -801,6 +776,11 @@ ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" +ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -954,11 +934,6 @@ array-filter@~0.0.0: version "0.0.1" resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= - array-flatten@1.1.1, array-flatten@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1074,11 +1049,6 @@ async-each@^1.0.0, async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.2.tgz#8b8a7ca2a658f927e9f307d6d1a42f4199f0f735" integrity sha512-6xrbvN0MOBKSJDdonmSSz2OwFSgxRaVtBDes26mj9KIGtDo+g9xosFRSC+i1gQh2oAN/tQ62AI/pGZGQjVOiRg== -async-foreach@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/async-foreach/-/async-foreach-0.1.3.tgz#36121f845c0578172de419a97dbeb1d16ec34542" - integrity sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI= - async-limiter@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" @@ -1087,16 +1057,16 @@ async@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7" -async@1.x, async@^1.3.0, async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - async@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" dependencies: lodash "^4.14.0" +async@^1.3.0, async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + async@^2.0.0, async@^2.0.1, async@^2.3.0, async@^2.4.0: version "2.5.0" resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" @@ -1129,16 +1099,16 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@9.4.3: - version "9.4.3" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.3.tgz#c97384a8fd80477b78049163a91bbc725d9c41d9" - integrity sha512-/XSnzDepRkAU//xLcXA/lUWxpsBuw0WiriAHOqnxkuCtzLhaz+fL4it4gp20BQ8n5SyLzK/FOc7A0+u/rti2FQ== +autoprefixer@9.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.5.1.tgz#243b1267b67e7e947f28919d786b50d3bb0fb357" + integrity sha512-KJSzkStUl3wP0D5sdMlP82Q52JLy5+atf2MHAre48+ckWkXgixmfHyWmA77wFDy6jTHU6mIgXv6hAQ2mf1PjJQ== dependencies: - browserslist "^4.3.6" - caniuse-lite "^1.0.30000921" + browserslist "^4.5.4" + caniuse-lite "^1.0.30000957" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.6" + postcss "^7.0.14" postcss-value-parser "^3.3.1" aws-sign2@~0.7.0: @@ -1312,11 +1282,6 @@ better-assert@~1.0.0: dependencies: callsite "1.0.0" -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -1337,13 +1302,6 @@ blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - integrity sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo= - dependencies: - inherits "~2.0.0" - blocking-proxy@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" @@ -1355,7 +1313,7 @@ bluebird@^3.3.0: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" -bluebird@^3.5.1, bluebird@^3.5.2, bluebird@^3.5.3: +bluebird@^3.5.1, bluebird@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== @@ -1457,7 +1415,7 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: +braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -1537,14 +1495,14 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.3.6: - version "4.4.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.2.tgz#6ea8a74d6464bb0bd549105f659b41197d8f0ba2" - integrity sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg== +browserslist@4.5.4, browserslist@^4.0.0, browserslist@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.5.4.tgz#166c4ecef3b51737a42436ea8002aeea466ea2c7" + integrity sha512-rAjx494LMjqKnMPhFkuLmLp8JWEX0o8ADTGeAbOqaF+XCvYLreZrG5uVjnPBlAQ8REZK4pzXGvp0bWgrFtKaag== dependencies: - caniuse-lite "^1.0.30000939" - electron-to-chromium "^1.3.113" - node-releases "^1.1.8" + caniuse-lite "^1.0.30000955" + electron-to-chromium "^1.3.122" + node-releases "^1.1.13" browserstack@^1.5.1: version "1.5.2" @@ -1604,26 +1562,7 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" - y18n "^4.0.0" - -cacache@^11.0.1, cacache@^11.2.0: +cacache@^11.0.1: version "11.3.1" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f" integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA== @@ -1643,7 +1582,7 @@ cacache@^11.0.1, cacache@^11.2.0: unique-filename "^1.1.0" y18n "^4.0.0" -cacache@^11.0.2: +cacache@^11.0.2, cacache@^11.3.1, cacache@^11.3.2: version "11.3.2" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== @@ -1712,15 +1651,7 @@ camel-case@^3.0.0: no-case "^2.2.0" upper-case "^1.1.1" -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0, camelcase@^2.0.1: +camelcase@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= @@ -1739,10 +1670,20 @@ camelcase@^5.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.2.0.tgz#e7522abda5ed94cc0489e1b8466610e88404cf45" integrity sha512-IXFsBS2pC+X0j0N/GE7Dm7j3bsEBp+oTpb7F50dwEVX7rf3IgwO9XatnegTsDtniKCUtEJH4fSU6Asw7uoVLfQ== -caniuse-lite@^1.0.30000921, caniuse-lite@^1.0.30000939: - version "1.0.30000947" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000947.tgz#c30305e9701449c22e97f4e9837cea3d76aa3273" - integrity sha512-ubgBUfufe5Oi3W1+EHyh2C3lfBIEcZ6bTuvl5wNOpIuRB978GF/Z+pQ7pGGUpeYRB0P+8C7i/3lt6xkeu2hwnA== +caniuse-api@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000955, caniuse-lite@^1.0.30000957: + version "1.0.30000957" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000957.tgz#fb1026bf184d7d62c685205358c3b24b9e29f7b3" + integrity sha512-8wxNrjAzyiHcLXN/iunskqQnJquQQ6VX8JHfW5kLgAPRSiSuKZiNfmIkP5j7jgyXqAQBSoXyJxfnbCFS0ThSiQ== canonical-path@1.0.0, canonical-path@^1.0.0: version "1.0.0" @@ -1877,26 +1818,6 @@ charenc@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" -chokidar@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" - optionalDependencies: - fsevents "^1.2.2" - chokidar@^1.4.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -1931,6 +1852,25 @@ chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.1.1: optionalDependencies: fsevents "^1.2.7" +chokidar@^2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.5.tgz#0ae8434d962281a5f56c72869e79cb6d9d86ad4d" + integrity sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + chownr@^1.0.1, chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" @@ -2244,26 +2184,13 @@ compressible@~2.0.11: dependencies: mime-db ">= 1.30.0 < 2" -compressible@~2.0.14: +compressible@~2.0.16: version "2.0.16" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.16.tgz#a49bf9858f3821b64ce1be0296afc7380466a77f" integrity sha512-JQfEOdnI7dASwCuSPWIeVYwc/zMsu/+tRhoUvEfXz2gxOA2DNjmG5vhtFdBlhWPPGo+RdT9S3tgc/uH5qgDiiA== dependencies: mime-db ">= 1.38.0 < 2" -compression@^1.5.2: - version "1.7.3" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" - integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.14" - debug "2.6.9" - on-headers "~1.0.1" - safe-buffer "5.1.2" - vary "~1.1.2" - compression@^1.7.0: version "1.7.1" resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" @@ -2276,6 +2203,19 @@ compression@^1.7.0: safe-buffer "5.1.1" vary "~1.1.2" +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2334,7 +2274,7 @@ configstore@^3.1.1, configstore@^3.1.2: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" -connect-history-api-fallback@^1.3.0: +connect-history-api-fallback@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz#8b32089359308d111115d81cad3fceab888f97bc" integrity sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg== @@ -2427,19 +2367,27 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -copy-webpack-plugin@4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae" - integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA== +copy-webpack-plugin@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.0.2.tgz#56186dfddbf9aa1b29c97fa4c796c1be98870da4" + integrity sha512-7nC7EynPrnBTtBwwbG1aTqrfNS1aTb9eEjSmQDqFtKAsJrR3uDb+pCDIFT2LzhW+SgGJxQcYzThrmXzzZ720uw== dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" + cacache "^11.3.1" + find-cache-dir "^2.0.0" + glob-parent "^3.1.0" globby "^7.1.1" is-glob "^4.0.0" loader-utils "^1.1.0" minimatch "^3.0.4" - p-limit "^1.0.0" + normalize-path "^3.0.0" + p-limit "^2.1.0" serialize-javascript "^1.4.0" + webpack-log "^2.0.0" + +core-js@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.0.1.tgz#1343182634298f7f38622f95e73f54e48ddf4738" + integrity sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew== core-js@^2.2.0: version "2.5.1" @@ -2524,14 +2472,6 @@ cross-env@^5.1.3: cross-spawn "^6.0.5" is-windows "^1.0.0" -cross-spawn@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" - integrity sha1-ElYDfsufDF9549bvE14wdwGEuYI= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - cross-spawn@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" @@ -2646,13 +2586,6 @@ csv-streamify@^3.0.4: dependencies: through2 "2.0.1" -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= - dependencies: - array-find-index "^1.0.1" - custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" @@ -2685,7 +2618,7 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@*, debug@^4.1.0: +debug@*, debug@^4.1.0, debug@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== @@ -2724,18 +2657,11 @@ debug@^3.0.0, debug@^3.1.0, debug@^3.2.5, debug@^3.2.6: dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decamelize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== - dependencies: - xregexp "4.0.0" - decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -2770,12 +2696,12 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -default-gateway@^2.6.0: - version "2.7.2" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" - integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== +default-gateway@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" + integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== dependencies: - execa "^0.10.0" + execa "^1.0.0" ip-regex "^2.1.0" default-require-extensions@^1.0.0: @@ -2826,17 +2752,17 @@ del@^2.0.2, del@^2.2.0: pinkie-promise "^2.0.0" rimraf "^2.2.8" -del@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" - integrity sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU= +del@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-4.1.0.tgz#049543b8290e1a9293e2bd150ab3a06f637322b8" + integrity sha512-C4kvKNlYrwXhKxz97BuohF8YoGgQ23Xm9lvoHmgT7JaPGprSEjk3+XFled74Yt/x0ZABUHg2D67covzAPUKx5Q== dependencies: globby "^6.1.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - p-map "^1.1.1" - pify "^3.0.0" - rimraf "^2.2.8" + is-path-cwd "^2.0.0" + is-path-in-cwd "^2.0.0" + p-map "^2.0.0" + pify "^4.0.1" + rimraf "^2.6.3" delayed-stream@~1.0.0: version "1.0.0" @@ -3144,10 +3070,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.113: - version "1.3.116" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz#1dbfee6a592a0c14ade77dbdfe54fef86387d702" - integrity sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA== +electron-to-chromium@^1.3.122: + version "1.3.124" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.124.tgz#861fc0148748a11b3e5ccebdf8b795ff513fa11f" + integrity sha512-glecGr/kFdfeXUHOHAWvGcXrxNU+1wSO/t5B23tT1dtlvYB26GY8aHzZSWD7HqhqC800Lr+w/hQul6C5AF542w== elliptic@^6.0.0: version "6.4.1" @@ -3371,18 +3297,6 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - escodegen@^1.6.1: version "1.9.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" @@ -3468,11 +3382,6 @@ espree@^3.4.0: acorn "^5.1.1" acorn-jsx "^3.0.0" -esprima@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" @@ -3495,11 +3404,6 @@ esrecurse@^4.1.0: dependencies: estraverse "^4.1.0" -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= - estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -3551,19 +3455,6 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.10.0.tgz#ff456a8f53f90f8eccc71a96d11bdfc7f082cb50" - integrity sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw== - dependencies: - cross-spawn "^6.0.0" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -3652,9 +3543,10 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -express@^4.16.2, express@^4.16.3: +express@^4.16.3, express@^4.16.4: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" + integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== dependencies: accepts "~1.3.5" array-flatten "1.1.1" @@ -3725,9 +3617,10 @@ external-editor@^2.0.4: iconv-lite "^0.4.17" tmp "^0.0.33" -external-editor@^3.0.0: +external-editor@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== dependencies: chardet "^0.7.0" iconv-lite "^0.4.24" @@ -3837,10 +3730,10 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" -file-loader@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" - integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== +file-loader@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa" + integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw== dependencies: loader-utils "^1.0.2" schema-utils "^1.0.0" @@ -3908,15 +3801,6 @@ finalhandler@1.1.1: statuses "~1.4.0" unpipe "~1.0.0" -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -4178,7 +4062,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0, fsevents@^1.2.2, fsevents@^1.2.7: +fsevents@^1.0.0, fsevents@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== @@ -4186,16 +4070,6 @@ fsevents@^1.0.0, fsevents@^1.2.2, fsevents@^1.2.7: nan "^2.9.2" node-pre-gyp "^0.10.0" -fstream@^1.0.0, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - integrity sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE= - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - function-bind@^1.0.2, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -4214,13 +4088,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-1.1.3.tgz#c441733e13b927ac8c0ff0b4c3b033f28812924a" - integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g== - dependencies: - globule "^1.0.0" - gcp-metadata@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-0.3.1.tgz#313814456e7c3d0eeb8f8b084b33579e886f829a" @@ -4266,11 +4133,6 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4= - get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" @@ -4348,7 +4210,7 @@ glob@7.0.x: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: +glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" dependencies: @@ -4359,17 +4221,6 @@ glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glo once "^1.3.0" path-is-absolute "^1.0.0" -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-dirs@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f" @@ -4434,15 +4285,6 @@ globby@^7.1.1: pify "^3.0.0" slash "^1.0.0" -globule@^1.0.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.1.tgz#5dffb1b191f22d20797a9369b49eab4e9839696d" - integrity sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ== - dependencies: - glob "~7.1.1" - lodash "~4.17.10" - minimatch "~3.0.2" - google-auth-library@0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-0.12.0.tgz#a3fc6c296d00bb54e4d877ef581a05947330d07f" @@ -4584,7 +4426,7 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== -handlebars@^4.0.1, handlebars@^4.0.3: +handlebars@^4.0.3: version "4.1.0" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.0.tgz#0d6a6f34ff1f63cecec8423aa4169827bf787c3a" integrity sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w== @@ -4860,7 +4702,7 @@ html-encoding-sniffer@^1.0.1: dependencies: whatwg-encoding "^1.0.1" -html-entities@^1.2.0: +html-entities@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= @@ -4932,15 +4774,15 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" -http-proxy-middleware@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" - integrity sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q== +http-proxy-middleware@^0.19.1: + version "0.19.1" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" + integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== dependencies: - http-proxy "^1.16.2" + http-proxy "^1.17.0" is-glob "^4.0.0" - lodash "^4.17.5" - micromatch "^3.1.9" + lodash "^4.17.11" + micromatch "^3.1.10" http-proxy@1.16.2, http-proxy@^1.13.0, http-proxy@^1.8.1: version "1.16.2" @@ -4949,7 +4791,7 @@ http-proxy@1.16.2, http-proxy@^1.13.0, http-proxy@^1.8.1: eventemitter3 "1.x.x" requires-port "1.x.x" -http-proxy@^1.16.2: +http-proxy@^1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" integrity sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g== @@ -5106,18 +4948,6 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -in-publish@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" - integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" - indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -5131,7 +4961,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= @@ -5146,21 +4976,21 @@ ini@1.3.5, ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== -inquirer@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52" - integrity sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg== +inquirer@6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" + ansi-escapes "^3.2.0" + chalk "^2.4.2" cli-cursor "^2.1.0" cli-width "^2.0.0" - external-editor "^3.0.0" + external-editor "^3.0.3" figures "^2.0.0" - lodash "^4.17.10" + lodash "^4.17.11" mute-stream "0.0.7" run-async "^2.2.0" - rxjs "^6.1.0" + rxjs "^6.4.0" string-width "^2.1.0" strip-ansi "^5.0.0" through "^2.3.6" @@ -5202,13 +5032,13 @@ inquirer@^3.3.0: strip-ansi "^4.0.0" through "^2.3.6" -internal-ip@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" - integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== +internal-ip@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" + integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== dependencies: - default-gateway "^2.6.0" - ipaddr.js "^1.5.2" + default-gateway "^4.2.0" + ipaddr.js "^1.9.0" interpret@^1.0.0, interpret@^1.1.0: version "1.2.0" @@ -5264,7 +5094,7 @@ ipaddr.js@1.8.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= -ipaddr.js@^1.5.2: +ipaddr.js@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== @@ -5526,6 +5356,11 @@ is-path-cwd@^1.0.0: resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= +is-path-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.0.0.tgz#d4777a8e227a00096a31f030db3770f84b116c02" + integrity sha512-m5dHHzpOXEiv18JEORttBO64UgTEypx99vCxQLjbBvGhOJxnTNglYoFXxwo6AbsQb79sqqycQEHv2hWkHZAijA== + is-path-in-cwd@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" @@ -5533,6 +5368,13 @@ is-path-in-cwd@^1.0.0: dependencies: is-path-inside "^1.0.0" +is-path-in-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.0.0.tgz#68e452a6eec260500cec21e029c0a44cc0dcd2ea" + integrity sha512-6Vz5Gc9s/sDA3JBVu0FzWufm8xaBsqy1zn8Q6gmvGP6nSDMw78aS4poBNeatWjaRpTpxxLn1WOndAiOlk+qY8A== + dependencies: + is-path-inside "^1.0.0" + is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" @@ -5759,26 +5601,6 @@ istanbul-reports@^1.5.1: dependencies: handlebars "^4.0.3" -istanbul@0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - isurl@^1.0.0-alpha5: version "1.0.0" resolved "https://registry.yarnpkg.com/isurl/-/isurl-1.0.0.tgz#b27f4f49f3cdaa3ea44a0a5b7f3462e6edc39d67" @@ -5856,11 +5678,6 @@ jpeg-js@0.1.2, jpeg-js@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.1.2.tgz#135b992c0575c985cfa0f494a3227ed238583ece" -js-base64@^2.1.8: - version "2.5.1" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.5.1.tgz#1efa39ef2c5f7980bb1784ade4a8af2de3291121" - integrity sha512-M7kLczedRMYX4L8Mdh4MzyAMM9O5osx+4FcOQuTvr3A9F2D9S5JXheN0ewNbrvK2UatkTRhL5ejGmGSjNMiZuw== - js-library-detector@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/js-library-detector/-/js-library-detector-5.1.0.tgz#1e2e88b119bb91e6581b28f4a90018ea1320de73" @@ -5875,17 +5692,17 @@ js-tokens@^3.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= -js-yaml@3.x, js-yaml@^3.7.0, js-yaml@^3.9.0: - version "3.12.2" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" - integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== +js-yaml@^3.5.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" dependencies: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^3.5.1: - version "3.10.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" +js-yaml@^3.7.0, js-yaml@^3.9.0: + version "3.12.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.2.tgz#ef1d067c5a9d9cb65bd72f285b5d8105c77f14fc" + integrity sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q== dependencies: argparse "^1.0.7" esprima "^4.0.0" @@ -5971,11 +5788,6 @@ json3@3.3.2, json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -6125,10 +5937,10 @@ karma-jasmine@^1.1.0: resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.2.tgz#394f2b25ffb4a644b9ada6f22d443e2fd08886c3" integrity sha1-OU8rJf+0pkS5rabyLUQ+L9CIhsM= -karma-source-map-support@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.3.0.tgz#36dd4d8ca154b62ace95696236fae37caf0a7dde" - integrity sha512-HcPqdAusNez/ywa+biN4EphGz62MmQyPggUsDfsHqa7tSe4jdsxgvTKuDfIazjL+IOxpVWyT7Pr4dhAV+sxX5Q== +karma-source-map-support@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz#58526ceccf7e8730e56effd97a4de8d712ac0d6b" + integrity sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A== dependencies: source-map-support "^0.5.5" @@ -6170,7 +5982,7 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" -killable@^1.0.0: +killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== @@ -6263,10 +6075,10 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -license-webpack-plugin@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.0.4.tgz#48532e7d7b45f6ceb21a68b6826ce7241d7ea6da" - integrity sha512-FQgOqrrIcD4C/VQo6ecWgXZULK5rs0kIDJtHcSVO6SBUrD63kEHZwmKOvBTquFQSgMQn/yeH68qooKDfqiBF2Q== +license-webpack-plugin@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.1.1.tgz#f0ab760f7f301c76f5af52e480f320656b5721bb" + integrity sha512-TiarZIg5vkQ2rGdYJn2+5YxO/zqlqjpK5IVglr7OfmrN1sBCakS+PQrsP2uC5gtve1ZDb9WMSUMlmHDQ0FoW4w== dependencies: "@types/webpack-sources" "^0.1.5" webpack-sources "^1.2.0" @@ -6362,16 +6174,7 @@ loader-runner@^2.3.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== -loader-utils@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: +loader-utils@1.2.3, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== @@ -6410,21 +6213,11 @@ lodash._shimkeys@~2.4.1: dependencies: lodash._objecttypes "~2.4.1" -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - -lodash.clonedeep@^4.3.2, lodash.clonedeep@^4.5.0: +lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -6479,15 +6272,15 @@ lodash.keys@~2.4.1: lodash._shimkeys "~2.4.1" lodash.isobject "~2.4.1" +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= + lodash.merge@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" -lodash.mergewith@^4.6.0: - version "4.6.1" - resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" - integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== - lodash.noop@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c" @@ -6501,6 +6294,11 @@ lodash.tail@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.tail/-/lodash.tail-4.1.1.tgz#d2333a36d9e7717c8ad2f7cacafec7c32b444664" integrity sha1-0jM6NtnncXyK0vfKyv7HwytERmQ= +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + lodash.values@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" @@ -6520,7 +6318,7 @@ lodash@^3.10.1, lodash@^3.8.0: resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" integrity sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y= -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@~4.17.10: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -6540,7 +6338,7 @@ log4js@^0.6.31: readable-stream "~1.0.2" semver "~4.3.3" -loglevel@^1.4.1: +loglevel@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa" integrity sha1-4PyVEztu8nbNyIh82vJKpvFW+Po= @@ -6560,14 +6358,6 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - lower-case-first@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" @@ -6588,7 +6378,7 @@ lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" -lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: +lru-cache@^4.0.1, lru-cache@^4.1.2, lru-cache@^4.1.3: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -6614,7 +6404,7 @@ lunr@^2.1.0: resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.6.tgz#f278beee7ffd56ad86e6e478ce02ab2b98c78dd5" integrity sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q== -magic-string@^0.25.0: +magic-string@0.25.2, magic-string@^0.25.0: version "0.25.2" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.2.tgz#139c3a729515ec55e96e69e82a11fe890a293ad9" integrity sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg== @@ -6657,6 +6447,11 @@ make-fetch-happen@^4.0.1: socks-proxy-agent "^4.0.0" ssri "^6.0.0" +mamacro@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" + integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== + map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -6669,11 +6464,6 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -6788,7 +6578,7 @@ memoizee@^0.4.14: next-tick "1" timers-ext "^0.1.5" -memory-fs@^0.4.0, memory-fs@~0.4.1: +memory-fs@^0.4.0, memory-fs@^0.4.1, memory-fs@~0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= @@ -6800,22 +6590,6 @@ memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" -meow@^3.7.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -6853,7 +6627,7 @@ micromatch@^2.1.5: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: +micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -6940,12 +6714,13 @@ mimic-response@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.0.tgz#df3d3652a73fded6b9b0b24146e6fd052353458e" -mini-css-extract-plugin@0.4.4: - version "0.4.4" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz#c10410a004951bd3cedac1da69053940fccb625d" - integrity sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ== +mini-css-extract-plugin@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz#a3f13372d6fcde912f3ee4cd039665704801e3b9" + integrity sha512-79q5P7YGI6rdnVyIAV4NXpBQJFWdkzJxCim3Kog4078fM0piAaFlwocqbejdWtLW1cEzCexPrh6EdyFsPgVdAw== dependencies: loader-utils "^1.1.0" + normalize-url "^2.0.1" schema-utils "^1.0.0" webpack-sources "^1.1.0" @@ -6959,7 +6734,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -6971,7 +6746,7 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@^1.1.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -6996,22 +6771,6 @@ minizlib@^1.1.0, minizlib@^1.1.1: dependencies: minipass "^2.2.1" -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^2.0.1" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - mississippi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" @@ -7051,7 +6810,7 @@ mkdirp-promise@^5.0.0: dependencies: mkdirp "*" -mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@*, mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= @@ -7122,7 +6881,7 @@ mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.10.0, nan@^2.9.2: +nan@^2.9.2: version "2.13.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.0.tgz#7bdfc27dd3c060c46e60b62c72b74012d1a4cd68" integrity sha512-5DDQvN0luhXdut8SCwzm/ZuAX2W+fwhqNzfq7CZ+OJzQ6NwpcqmIGyLD1R8MEt7BeErzcsI0JLr4pND2pNp2Cw== @@ -7223,24 +6982,6 @@ node-forge@^0.8.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.8.2.tgz#b4bcc59fb12ce77a8825fc6a783dfe3182499c5a" integrity sha512-mXQ9GBq1N3uDCyV1pdSzgIguwgtVpM7f5/5J4ipz12PKWElmPpVWLDuWl8iXmhysr21+WmX/OJ5UKx82wjomgg== -node-gyp@^3.8.0: - version "3.8.0" - resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.8.0.tgz#540304261c330e80d0d5edce253a68cb3964218c" - integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== - dependencies: - fstream "^1.0.0" - glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" - nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" - osenv "0" - request "^2.87.0" - rimraf "2" - semver "~5.3.0" - tar "^2.0.0" - which "1" - node-html-encoder@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/node-html-encoder/-/node-html-encoder-0.0.2.tgz#8973618d727da5526a830b47d07c0d803e0a15c6" @@ -7291,38 +7032,13 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.1.8: - version "1.1.10" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.10.tgz#5dbeb6bc7f4e9c85b899e2e7adcc0635c9b2adf7" - integrity sha512-KbUPCpfoBvb3oBkej9+nrU0/7xPlVhmhhUJ1PZqwIP5/1dJkRWKWD3OONjo6M2J7tSCBtDCumLwwqeI+DWWaLQ== +node-releases@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.13.tgz#8c03296b5ae60c08e2ff4f8f22ae45bd2f210083" + integrity sha512-fKZGviSXR6YvVPyc011NHuJDSD8gFQvLPmc2d2V3BS4gr52ycyQ1Xzs7a8B+Ax3Ni/W+5h1h4SqmzeoA8WZRmA== dependencies: semver "^5.3.0" -node-sass@4.10.0: - version "4.10.0" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.10.0.tgz#dcc2b364c0913630945ccbf7a2bbf1f926effca4" - integrity sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.3.2" - lodash.mergewith "^4.6.0" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.10.0" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "^2.88.0" - sass-graph "^2.2.4" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - "nomnom@>= 1.5.x": version "1.8.1" resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" @@ -7331,13 +7047,6 @@ node-sass@4.10.0: chalk "~0.4.0" underscore "~1.6.0" -"nopt@2 || 3", nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -7346,7 +7055,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -7382,9 +7091,10 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= -normalize-url@2.0.1: +normalize-url@2.0.1, normalize-url@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" + integrity sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw== dependencies: prepend-http "^2.0.0" query-string "^5.0.1" @@ -7395,7 +7105,7 @@ npm-bundled@^1.0.1: resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== -npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: +npm-package-arg@6.1.0, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== @@ -7420,7 +7130,7 @@ npm-packlist@^1.1.6: ignore-walk "^3.0.1" npm-bundled "^1.0.1" -npm-pick-manifest@^2.1.0: +npm-pick-manifest@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40" integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA== @@ -7463,7 +7173,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: +npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -7580,12 +7290,12 @@ on-headers@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -on-headers@~1.0.1: +on-headers@~1.0.1, on-headers@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -7602,6 +7312,13 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +open@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-6.1.0.tgz#0e7e671b883976a4e5251b5d1ca905ab6f4be78f" + integrity sha512-Vqch7NFb/WsMujhqfq+B3u0xkssRjZlxh+NSsBSphpcgaFD7gfB0SUBfR91E9ygBlyNGNogXR2cUB8rRfoo2kQ== + dependencies: + is-wsl "^1.1.0" + opener@~1.4.0: version "1.4.3" resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" @@ -7613,16 +7330,16 @@ opn@4.0.2: object-assign "^4.0.1" pinkie-promise "^2.0.0" -opn@5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c" - integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g== +opn@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" dependencies: is-wsl "^1.1.0" -opn@5.4.0, opn@^5.1.0, opn@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" +opn@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" + integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== dependencies: is-wsl "^1.1.0" @@ -7704,16 +7421,16 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@0, osenv@^0.1.4, osenv@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" +osenv@^0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -osenv@^0.1.0: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" +osenv@^0.1.4, osenv@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" @@ -7742,14 +7459,14 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.0.0.tgz#7554e3d572109a87e1f3f53f6a7d85d1b194f4c5" integrity sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg== -p-limit@^1.0.0, p-limit@^1.1.0: +p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== dependencies: p-try "^1.0.0" -p-limit@^2.0.0: +p-limit@^2.0.0, p-limit@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== @@ -7770,10 +7487,10 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" -p-map@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" - integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== p-timeout@^2.0.1: version "2.0.1" @@ -7800,17 +7517,17 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" -pacote@9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.1.1.tgz#25091f75a25021de8be8d34cc6408728fca3579b" - integrity sha512-f28Rq5ozzKAA9YwIKw61/ipwAatUZseYmVssDbHHaexF0wRIVotapVEZPAjOT7Eu3LYVqEp0NVpNizoAnYBUaA== +pacote@9.5.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.5.0.tgz#85f3013a3f6dd51c108b0ccabd3de8102ddfaeda" + integrity sha512-aUplXozRbzhaJO48FaaeClmN+2Mwt741MC6M3bevIGZwdCaP7frXzbUOfOWa91FPHoLITzG0hYaKY363lxO3bg== dependencies: - bluebird "^3.5.2" - cacache "^11.2.0" + bluebird "^3.5.3" + cacache "^11.3.2" figgy-pudding "^3.5.1" get-stream "^4.1.0" glob "^7.1.3" - lru-cache "^4.1.3" + lru-cache "^5.1.1" make-fetch-happen "^4.0.1" minimatch "^3.0.4" minipass "^2.3.5" @@ -7819,7 +7536,7 @@ pacote@9.1.1: normalize-package-data "^2.4.0" npm-package-arg "^6.1.0" npm-packlist "^1.1.12" - npm-pick-manifest "^2.1.0" + npm-pick-manifest "^2.2.3" npm-registry-fetch "^3.8.0" osenv "^0.1.5" promise-inflight "^1.0.1" @@ -7829,7 +7546,7 @@ pacote@9.1.1: safe-buffer "^5.1.2" semver "^5.6.0" ssri "^6.0.1" - tar "^4.4.6" + tar "^4.4.8" unique-filename "^1.1.1" which "^1.3.1" @@ -8101,13 +7818,6 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -8134,15 +7844,6 @@ portfinder@0.4.x: async "0.9.0" mkdirp "0.5.x" -portfinder@1.0.17: - version "1.0.17" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a" - integrity sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ== - dependencies: - async "^1.5.2" - debug "^2.2.0" - mkdirp "0.5.x" - portfinder@^1.0.13: version "1.0.19" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.19.tgz#07e87914a55242dcda5b833d42f018d6875b595f" @@ -8151,7 +7852,7 @@ portfinder@^1.0.13: debug "^2.2.0" mkdirp "0.5.x" -portfinder@^1.0.9: +portfinder@^1.0.20: version "1.0.20" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== @@ -8198,16 +7899,7 @@ postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.1: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss@7.0.13: - version "7.0.13" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.13.tgz#42bf716413e8f1c786ab71dc6e722b3671b16708" - integrity sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.6: +postcss@7.0.14, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14: version "7.0.14" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== @@ -8361,7 +8053,7 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" -pump@^2.0.0, pump@^2.0.1: +pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" dependencies: @@ -8512,10 +8204,13 @@ raw-body@2.3.3: iconv-lite "0.4.23" unpipe "1.0.0" -raw-loader@0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" - integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= +raw-loader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-1.0.0.tgz#3f9889e73dadbda9a424bce79809b4133ad46405" + integrity sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" rc@^1.0.1, rc@^1.1.6: version "1.2.2" @@ -8677,14 +8372,6 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - reflect-metadata@^0.1.2: version "0.1.13" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" @@ -9004,10 +8691,6 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.3.2: version "1.10.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" @@ -9059,19 +8742,19 @@ revalidator@0.1.x: version "0.1.8" resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - rimraf@2.6.2, rimraf@2.x.x, rimraf@^2.6.0: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" +rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3: + version "2.6.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -9133,13 +8816,7 @@ rx-lite@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" -rxjs@6.3.3, rxjs@^6.1.0: - version "6.3.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" - dependencies: - tslib "^1.9.0" - -rxjs@^6.3.0: +rxjs@6.4.0, rxjs@^6.3.0, rxjs@^6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== @@ -9181,16 +8858,6 @@ safefs@^4.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-graph@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/sass-graph/-/sass-graph-2.2.4.tgz#13fbd63cd1caf0908b9fd93476ad43a51d1e0b49" - integrity sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k= - dependencies: - glob "^7.0.0" - lodash "^4.0.0" - scss-tokenizer "^0.2.3" - yargs "^7.0.0" - sass-loader@7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-7.1.0.tgz#16fd5138cb8b424bf8a759528a1972d72aad069d" @@ -9203,6 +8870,13 @@ sass-loader@7.1.0: pify "^3.0.0" semver "^5.5.0" +sass@1.18.0: + version "1.18.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.18.0.tgz#f34371c31e268e555c2ac8e43d2b64d194e7d090" + integrity sha512-Mc579V+BhH693tqt+lvph+gmRqmC6BjtsEVsjkW1944DEA5a0wPuCi781hL3fY4EDuqZnEVPbu42CZRywwE97g== + dependencies: + chokidar "^2.0.0" + saucelabs@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d" @@ -9235,14 +8909,6 @@ schema-utils@^0.3.0: dependencies: ajv "^5.0.0" -schema-utils@^0.4.4: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - schema-utils@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" @@ -9252,14 +8918,6 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -scss-tokenizer@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz#8eb06db9a9723333824d3f5530641149847ce5d1" - integrity sha1-jrBtualyMzOCTT9VMGQRSYR85dE= - dependencies: - js-base64 "^2.1.8" - source-map "^0.4.2" - select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -9275,7 +8933,7 @@ selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: tmp "0.0.30" xml2js "^0.4.17" -selfsigned@^1.9.1: +selfsigned@^1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.4.tgz#cdd7eccfca4ed7635d47a08bf2d5d3074092e2cd" integrity sha512-9AukTiDmHXGXWtWjembZ5NDmVvP2695EtpgbCsxCa68w3c88B+alqbmZ4O3hZ4VWGXeGWzEVdvqgAJD8DQPCDw== @@ -9309,10 +8967,10 @@ semver@5.5.0, semver@^5.0.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -semver@5.5.1: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" - integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== +semver@6.0.0, semver@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.0.0.tgz#05e359ee571e5ad7ed641a6eec1e547ba52dea65" + integrity sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ== semver@^5.0.1, semver@^5.0.3, semver@^5.1.0: version "5.4.1" @@ -9322,11 +8980,6 @@ semver@~4.3.3: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - integrity sha1-myzl094C0XxgEq0yaqa00M9U+U8= - send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -9365,7 +9018,7 @@ serializerr@1.0.3: dependencies: protochain "^1.0.5" -serve-index@^1.7.2: +serve-index@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" integrity sha1-03aNabHn2C5c4FD/9bRTvqEqkjk= @@ -9673,10 +9326,10 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== +source-map-support@0.5.12: + version "0.5.12" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.12.tgz#b4f3b10d51857a5af0138d3ce8003b201613d599" + integrity sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -9717,13 +9370,6 @@ source-map@0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -source-map@^0.4.2, source-map@~0.4.1: - version "0.4.4" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" - integrity sha1-66T12pwNyZneaAMti092FzZSA2s= - dependencies: - amdefine ">=0.0.4" - source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -9734,10 +9380,10 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= +source-map@~0.4.1: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + integrity sha1-66T12pwNyZneaAMti092FzZSA2s= dependencies: amdefine ">=0.0.4" @@ -9806,10 +9452,10 @@ spdy@^4.0.0: select-hose "^2.0.0" spdy-transport "^3.0.0" -speed-measure-webpack-plugin@1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.5.tgz#8179936eb8c5e891f7481bd5075a9ea9a0f74823" - integrity sha512-S/guYjC4Izn5wY2d0+M4zowED/F77Lxh9yjkTZ+XAr244pr9c1MYNcXcRe9lx2hmAj0GPbOrBXgOF2YIp/CZ8A== +speed-measure-webpack-plugin@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz#69840a5cdc08b4638697dac7db037f595d7f36a0" + integrity sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ== dependencies: chalk "^2.0.1" @@ -9860,13 +9506,6 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== - dependencies: - safe-buffer "^5.1.1" - ssri@^6.0.0, ssri@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" @@ -9910,13 +9549,6 @@ statuses@~1.4.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== -stdout-stream@^1.4.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/stdout-stream/-/stdout-stream-1.4.1.tgz#5ac174cdd5cd726104aa0c0b2bd83815d8d535de" - integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA== - dependencies: - readable-stream "^2.0.1" - stream-browserify@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" @@ -10091,13 +9723,6 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -10176,7 +9801,7 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^3.1.0, supports-color@^3.1.2: +supports-color@^3.1.2: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= @@ -10190,7 +9815,7 @@ supports-color@^4.0.0: dependencies: has-flag "^2.0.0" -supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.3.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -10245,16 +9870,7 @@ tar-stream@^1.5.0: readable-stream "^2.0.0" xtend "^4.0.0" -tar@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - integrity sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE= - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -tar@^4, tar@^4.4.6: +tar@^4, tar@^4.4.8: version "4.4.8" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== @@ -10301,21 +9917,7 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -terser-webpack-plugin@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz#7545da9ae5f4f9ae6a0ac961eb46f5e7c845cc26" - integrity sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw== - dependencies: - cacache "^11.0.2" - find-cache-dir "^2.0.0" - schema-utils "^1.0.0" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - terser "^3.8.1" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -terser-webpack-plugin@^1.1.0: +terser-webpack-plugin@1.2.3, terser-webpack-plugin@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz#3f98bc902fac3e5d0de730869f50668561262ec8" integrity sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA== @@ -10329,7 +9931,7 @@ terser-webpack-plugin@^1.1.0: webpack-sources "^1.1.0" worker-farm "^1.5.2" -terser@^3.16.1, terser@^3.8.1: +terser@^3.16.1: version "3.17.0" resolved "https://registry.yarnpkg.com/terser/-/terser-3.17.0.tgz#f88ffbeda0deb5637f9d24b0da66f4e15ab10cb2" integrity sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ== @@ -10488,12 +10090,7 @@ tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" -tree-kill@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" - integrity sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg== - -tree-kill@^1.1.0: +tree-kill@1.2.1, tree-kill@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a" integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q== @@ -10502,11 +10099,6 @@ trim-lines@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.0.tgz#9926d03ede13ba18f7d42222631fb04c79ff26fe" -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= - trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -10524,13 +10116,6 @@ trough@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.1.tgz#a9fd8b0394b0ae8fff82e0633a0a36ccad5b5f86" -"true-case-path@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-1.0.3.tgz#f813b5a8c86b40da59606722b144e3225799f47d" - integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew== - dependencies: - glob "^7.1.2" - try-require@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/try-require/-/try-require-1.2.1.tgz#34489a2cac0c09c1cc10ed91ba011594d4333be2" @@ -10637,15 +10222,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.2.tgz#fe8101c46aa123f8353523ebdcf5730c2ae493e5" - integrity sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg== - -typescript@3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d" - integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg== +typescript@3.3.4000: + version "3.3.4000" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.4000.tgz#76b0f89cfdbf97827e1112d64f283f1151d6adf0" + integrity sha512-jjOcCZvpkl2+z7JFn0yBOoLQyLoIkNZAs/fYJkUG6VKy6zLPHJGfQJYFHzibB6GJaF/8QrcECtlQ5cpvRHSMEA== typescript@^2.4.1: version "2.6.2" @@ -10843,6 +10423,15 @@ universal-analytics@^0.4.16: request "2.86.0" uuid "^3.0.0" +universal-analytics@^0.4.20: + version "0.4.20" + resolved "https://registry.yarnpkg.com/universal-analytics/-/universal-analytics-0.4.20.tgz#d6b64e5312bf74f7c368e3024a922135dbf24b03" + integrity sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw== + dependencies: + debug "^3.0.0" + request "^2.88.0" + uuid "^3.0.0" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -10860,7 +10449,7 @@ unzip-response@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" -upath@^1.0.5, upath@^1.1.0: +upath@^1.1.0, upath@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068" integrity sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q== @@ -11207,51 +10796,51 @@ webpack-core@^0.6.8: source-list-map "~0.1.7" source-map "~0.4.1" -webpack-dev-middleware@3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" - integrity sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA== +webpack-dev-middleware@3.6.2, webpack-dev-middleware@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.6.2.tgz#f37a27ad7c09cd7dc67cd97655413abaa1f55942" + integrity sha512-A47I5SX60IkHrMmZUlB0ZKSWi29TZTcPz7cha1Z75yYOsgWh/1AcPmQEbC8ZIbU3A1ytSv1PMU0PyPz2Lmz2jg== dependencies: - memory-fs "~0.4.1" + memory-fs "^0.4.1" mime "^2.3.1" range-parser "^1.0.3" webpack-log "^2.0.0" -webpack-dev-server@3.1.14: - version "3.1.14" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz#60fb229b997fc5a0a1fc6237421030180959d469" - integrity sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ== +webpack-dev-server@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.3.1.tgz#7046e49ded5c1255a82c5d942bcdda552b72a62d" + integrity sha512-jY09LikOyGZrxVTXK0mgIq9y2IhCoJ05848dKZqX1gAGLU1YDqgpOT71+W53JH/wI4v6ky4hm+KvSyW14JEs5A== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" - chokidar "^2.0.0" - compression "^1.5.2" - connect-history-api-fallback "^1.3.0" - debug "^3.1.0" - del "^3.0.0" - express "^4.16.2" - html-entities "^1.2.0" - http-proxy-middleware "~0.18.0" + chokidar "^2.1.5" + compression "^1.7.4" + connect-history-api-fallback "^1.6.0" + debug "^4.1.1" + del "^4.1.0" + express "^4.16.4" + html-entities "^1.2.1" + http-proxy-middleware "^0.19.1" import-local "^2.0.0" - internal-ip "^3.0.1" + internal-ip "^4.2.0" ip "^1.1.5" - killable "^1.0.0" - loglevel "^1.4.1" - opn "^5.1.0" - portfinder "^1.0.9" + killable "^1.0.1" + loglevel "^1.6.1" + opn "^5.5.0" + portfinder "^1.0.20" schema-utils "^1.0.0" - selfsigned "^1.9.1" - semver "^5.6.0" - serve-index "^1.7.2" + selfsigned "^1.10.4" + semver "^6.0.0" + serve-index "^1.9.1" sockjs "0.3.19" sockjs-client "1.3.0" spdy "^4.0.0" - strip-ansi "^3.0.0" - supports-color "^5.1.0" + strip-ansi "^3.0.1" + supports-color "^6.1.0" url "^0.11.0" - webpack-dev-middleware "3.4.0" + webpack-dev-middleware "^3.6.2" webpack-log "^2.0.0" - yargs "12.0.2" + yargs "12.0.5" webpack-log@^2.0.0: version "2.0.0" @@ -11261,21 +10850,13 @@ webpack-log@^2.0.0: ansi-colors "^3.0.0" uuid "^3.3.2" -webpack-merge@4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" - integrity sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ== +webpack-merge@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4" + integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw== dependencies: lodash "^4.17.5" -webpack-sources@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2" - integrity sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - webpack-sources@1.3.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" @@ -11291,17 +10872,17 @@ webpack-subresource-integrity@1.1.0-rc.6: dependencies: webpack-core "^0.6.8" -webpack@4.28.4: - version "4.28.4" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.28.4.tgz#1ddae6c89887d7efb752adf0c3cd32b9b07eacd0" - integrity sha512-NxjD61WsK/a3JIdwWjtIpimmvE6UrRi3yG54/74Hk9rwNj5FPkA4DJCf1z4ByDWLkvZhTZE+P3C/eh6UD5lDcw== +webpack@4.29.6: + version "4.29.6" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.6.tgz#66bf0ec8beee4d469f8b598d3988ff9d8d90e955" + integrity sha512-MwBwpiE1BQpMDkbnUUaW6K8RFZjljJHArC6tWQJoFm0oQtfoSebtg4Y7/QHnJ/SddtjYLHaKGX64CFjG5rehJw== dependencies: - "@webassemblyjs/ast" "1.7.11" - "@webassemblyjs/helper-module-context" "1.7.11" - "@webassemblyjs/wasm-edit" "1.7.11" - "@webassemblyjs/wasm-parser" "1.7.11" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" + "@webassemblyjs/ast" "1.8.5" + "@webassemblyjs/helper-module-context" "1.8.5" + "@webassemblyjs/wasm-edit" "1.8.5" + "@webassemblyjs/wasm-parser" "1.8.5" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" chrome-trace-event "^1.0.0" @@ -11315,7 +10896,7 @@ webpack@4.28.4: mkdirp "~0.5.0" neo-async "^2.5.0" node-libs-browser "^2.0.0" - schema-utils "^0.4.4" + schema-utils "^1.0.0" tapable "^1.1.0" terser-webpack-plugin "^1.1.0" watchpack "^1.5.0" @@ -11362,19 +10943,19 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.1.1, which@^1.2.14, which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - which@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: isexe "^2.0.0" +which@^1.2.14, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + wide-align@^1.1.0: version "1.1.3" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" @@ -11440,16 +11021,16 @@ winston@^2.1.1: isstream "0.1.x" stack-trace "0.0.x" -wordwrap@^1.0.0, wordwrap@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + worker-farm@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" @@ -11457,6 +11038,13 @@ worker-farm@^1.5.2: dependencies: errno "~0.1.7" +worker-plugin@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/worker-plugin/-/worker-plugin-3.1.0.tgz#6311778f3514a87c273510ee3f809cc3fe161e6f" + integrity sha512-iQ9KTTmmN5fhfc2KMR7CcDblvcrg1QQ4pXymqZ3cRZF8L0890YLBcEqlIsGPdxoFwghyN8RA1pCEhCKuTF4Lkw== + dependencies: + loader-utils "^1.1.0" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -11555,11 +11143,6 @@ xmlhttprequest-ssl@1.5.3: version "1.5.3" resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" -xregexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== - xregexp@^4.0.0: version "4.2.4" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.2.4.tgz#02a4aea056d65a42632c02f0233eab8e4d7e57ed" @@ -11599,13 +11182,6 @@ yargs-parser@7.0.0, yargs-parser@^7.0.0: dependencies: camelcase "^4.1.0" -yargs-parser@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - yargs-parser@^11.1.1: version "11.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" @@ -11644,13 +11220,13 @@ yargs@11.0.0: y18n "^3.2.1" yargs-parser "^9.0.2" -yargs@12.0.2: - version "12.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" - integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== +yargs@12.0.5, yargs@^12.0.4: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== dependencies: cliui "^4.0.0" - decamelize "^2.0.0" + decamelize "^1.2.0" find-up "^3.0.0" get-caller-file "^1.0.1" os-locale "^3.0.0" @@ -11660,7 +11236,7 @@ yargs@12.0.2: string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1 || ^4.0.0" - yargs-parser "^10.1.0" + yargs-parser "^11.1.1" yargs@3.32.0, yargs@^3.32.0: version "3.32.0" @@ -11693,25 +11269,7 @@ yargs@9.0.1: y18n "^3.2.1" yargs-parser "^7.0.0" -yargs@^12.0.4: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== - dependencies: - cliui "^4.0.0" - decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" - -yargs@^7.0.0, yargs@^7.0.2: +yargs@^7.0.2: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" dependencies: From 3a836c362d33a6321f0e596fc161b1b91a8dd173 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Mon, 15 Apr 2019 10:15:43 +0100 Subject: [PATCH 0747/1073] build(docs-infra): convert `search-worker.js` to TypeScript (#29764) PR Close #29764 --- aio/angular.json | 4 +- aio/ngsw-config.json | 2 - aio/package.json | 6 +- aio/src/app/app.component.ts | 2 +- aio/src/app/search/search-worker.js | 106 ---------------------- aio/src/app/search/search-worker.ts | 104 +++++++++++++++++++++ aio/src/app/search/search.service.spec.ts | 6 +- aio/src/app/search/search.service.ts | 6 +- aio/src/app/shared/web-worker-message.ts | 5 + aio/src/app/shared/web-worker.ts | 11 +-- aio/src/tsconfig.app.json | 12 ++- aio/src/tsconfig.json | 11 +++ aio/src/tsconfig.worker.json | 14 +++ aio/yarn.lock | 5 + 14 files changed, 162 insertions(+), 132 deletions(-) delete mode 100644 aio/src/app/search/search-worker.js create mode 100644 aio/src/app/search/search-worker.ts create mode 100644 aio/src/app/shared/web-worker-message.ts create mode 100644 aio/src/tsconfig.json create mode 100644 aio/src/tsconfig.worker.json diff --git a/aio/angular.json b/aio/angular.json index 56c2927740..acb1c563c7 100644 --- a/aio/angular.json +++ b/aio/angular.json @@ -21,6 +21,7 @@ "index": "src/index.html", "main": "src/main.ts", "tsConfig": "src/tsconfig.app.json", + "webWorkerTsConfig": "src/tsconfig.worker.json", "aot": true, "optimization": true, "buildOptimizer": true, @@ -35,7 +36,6 @@ "assets": [ "src/assets", "src/generated", - "src/app/search/search-worker.js", "src/pwa-manifest.json", "src/google385281288605d160.html", { @@ -123,6 +123,7 @@ "karmaConfig": "src/karma.conf.js", "polyfills": "src/polyfills.ts", "tsConfig": "src/tsconfig.spec.json", + "webWorkerTsConfig": "src/tsconfig.worker.json", "scripts": [], "styles": [ "src/styles.scss" @@ -130,7 +131,6 @@ "assets": [ "src/assets", "src/generated", - "src/app/search/search-worker.js", "src/pwa-manifest.json", "src/google385281288605d160.html", { diff --git a/aio/ngsw-config.json b/aio/ngsw-config.json index 95386ea0a5..2178ba8815 100644 --- a/aio/ngsw-config.json +++ b/aio/ngsw-config.json @@ -9,10 +9,8 @@ "files": [ "/index.html", "/pwa-manifest.json", - "/app/search/search-worker.js", "/assets/images/favicons/favicon.ico", "/assets/js/*.js", - "/generated/lunr.min.js", "/*.css", "/*.js" ], diff --git a/aio/package.json b/aio/package.json index 589b08df4d..c6529a06b6 100644 --- a/aio/package.json +++ b/aio/package.json @@ -26,7 +26,7 @@ "e2e": "ng e2e --no-webdriver-update", "presetup": "yarn --cwd .. install && yarn install --frozen-lockfile && yarn ~~check-env && yarn ~~clean-generated && yarn boilerplate:remove", "setup": "yarn aio-use-npm && yarn example-use-npm", - "postsetup": "yarn ~~build-ie-polyfills && yarn ~~minify-lunr && yarn boilerplate:add && yarn extract-cli-command-docs && yarn docs", + "postsetup": "yarn ~~build-ie-polyfills && yarn boilerplate:add && yarn extract-cli-command-docs && yarn docs", "presetup-local": "yarn presetup", "setup-local": "yarn aio-use-local && yarn example-use-local", "postsetup-local": "yarn postsetup", @@ -69,8 +69,7 @@ "~~build": "ng build --configuration=stable", "post~~build": "yarn build-404-page", "~~build-ie-polyfills": "webpack-cli src/ie-polyfills.js -o src/generated/ie-polyfills.min.js --mode production", - "~~http-server": "http-server", - "~~minify-lunr": "uglifyjs node_modules/lunr/lunr.js -c -m -o src/generated/lunr.min.js --source-map" + "~~http-server": "http-server" }, "engines": { "node": ">=10.9.0 <11.0.0", @@ -89,6 +88,7 @@ "@angular/platform-browser-dynamic": "^7.0.0", "@angular/router": "^7.0.0", "@angular/service-worker": "^7.0.0", + "@types/lunr": "^2.3.2", "@webcomponents/custom-elements": "^1.2.0", "classlist.js": "^1.1.20150312", "core-js": "^2.4.1", diff --git a/aio/src/app/app.component.ts b/aio/src/app/app.component.ts index 1fad31d792..a7ccb03b0a 100644 --- a/aio/src/app/app.component.ts +++ b/aio/src/app/app.component.ts @@ -110,7 +110,7 @@ export class AppComponent implements OnInit { // Do not initialize the search on browsers that lack web worker support if ('Worker' in window) { // Delay initialization by up to 2 seconds - this.searchService.initWorker('app/search/search-worker.js', 2000); + this.searchService.initWorker(2000); } this.onResize(window.innerWidth); diff --git a/aio/src/app/search/search-worker.js b/aio/src/app/search/search-worker.js deleted file mode 100644 index c47dabd82d..0000000000 --- a/aio/src/app/search/search-worker.js +++ /dev/null @@ -1,106 +0,0 @@ -'use strict'; - -/* eslint-env worker */ -/* global importScripts, lunr */ - -var SEARCH_TERMS_URL = '/generated/docs/app/search-data.json'; - -// NOTE: This needs to be kept in sync with `ngsw-config.json`. -importScripts('/generated/lunr.min.js'); - -var index; -var pages /* : SearchInfo */ = {}; - -// interface SearchInfo { -// [key: string]: PageInfo; -// } - -// interface PageInfo { -// path: string; -// type: string, -// titleWords: string; -// keyWords: string; -// } - -self.onmessage = handleMessage; - -// Create the lunr index - the docs should be an array of objects, each object containing -// the path and search terms for a page -function createIndex(addFn) { - lunr.QueryLexer.termSeparator = lunr.tokenizer.separator = /\s+/; - return lunr(/** @this */function() { - this.ref('path'); - this.field('titleWords', {boost: 10}); - this.field('headingWords', {boost: 5}); - this.field('members', {boost: 4}); - this.field('keywords', {boost: 2}); - addFn(this); - }); -} - -// The worker receives a message to load the index and to query the index -function handleMessage(message) { - var type = message.data.type; - var id = message.data.id; - var payload = message.data.payload; - switch(type) { - case 'load-index': - makeRequest(SEARCH_TERMS_URL, function(searchInfo) { - index = createIndex(loadIndex(searchInfo)); - self.postMessage({type: type, id: id, payload: true}); - }); - break; - case 'query-index': - self.postMessage({type: type, id: id, payload: {query: payload, results: queryIndex(payload)}}); - break; - default: - self.postMessage({type: type, id: id, payload: {error: 'invalid message type'}}) - } -} - -// Use XHR to make a request to the server -function makeRequest(url, callback) { - - // The JSON file that is loaded should be an array of PageInfo: - var searchDataRequest = new XMLHttpRequest(); - searchDataRequest.onload = function() { - callback(JSON.parse(this.responseText)); - }; - searchDataRequest.open('GET', url); - searchDataRequest.send(); -} - - -// Create the search index from the searchInfo which contains the information about each page to be indexed -function loadIndex(searchInfo /*: SearchInfo */) { - return function(index) { - // Store the pages data to be used in mapping query results back to pages - // Add search terms from each page to the search index - searchInfo.forEach(function(page /*: PageInfo */) { - index.add(page); - pages[page.path] = page; - }); - }; -} - -// Query the index and return the processed results -function queryIndex(query) { - try { - if (query.length) { - var results = index.search(query); - if (results.length === 0) { - // Add a relaxed search in the title for the first word in the query - // E.g. if the search is "ngCont guide" then we search for "ngCont guide titleWords:ngCont*" - var titleQuery = 'titleWords:*' + query.split(' ', 1)[0] + '*'; - results = index.search(query + ' ' + titleQuery); - } - // Map the hits into info about each page to be returned as results - return results.map(function(hit) { return pages[hit.ref]; }); - } - } catch(e) { - // If the search query cannot be parsed the index throws an error - // Log it and recover - console.log(e); - } - return []; -} diff --git a/aio/src/app/search/search-worker.ts b/aio/src/app/search/search-worker.ts new file mode 100644 index 0000000000..655c435174 --- /dev/null +++ b/aio/src/app/search/search-worker.ts @@ -0,0 +1,104 @@ +import { WebWorkerMessage } from '../shared/web-worker-message'; +import * as lunr from 'lunr'; + +const SEARCH_TERMS_URL = '/generated/docs/app/search-data.json'; +let index: lunr.Index; +const pages: SearchInfo = {}; + +interface SearchInfo { + [key: string]: PageInfo; +} + +interface PageInfo { + path: string; + type: string; + titleWords: string; + keyWords: string; +} + +addEventListener('message', handleMessage); + +// Create the lunr index - the docs should be an array of objects, each object containing +// the path and search terms for a page +function createIndex(loadIndex: IndexLoader): lunr.Index { + // The lunr typings are missing QueryLexer so we have to add them here manually. + const queryLexer = (lunr as any as { QueryLexer: { termSeparator: RegExp } }).QueryLexer; + queryLexer.termSeparator = lunr.tokenizer.separator = /\s+/; + return lunr(/** @this */function () { + this.ref('path'); + this.field('titleWords', { boost: 10 }); + this.field('headingWords', { boost: 5 }); + this.field('members', { boost: 4 }); + this.field('keywords', { boost: 2 }); + loadIndex(this); + }); +} + +// The worker receives a message to load the index and to query the index +function handleMessage(message: { data: WebWorkerMessage }): void { + const type = message.data.type; + const id = message.data.id; + const payload = message.data.payload; + switch (type) { + case 'load-index': + makeRequest(SEARCH_TERMS_URL, function (searchInfo: PageInfo[]) { + index = createIndex(loadIndex(searchInfo)); + postMessage({ type: type, id: id, payload: true }); + }); + break; + case 'query-index': + postMessage({ type: type, id: id, payload: { query: payload, results: queryIndex(payload) } }); + break; + default: + postMessage({ type: type, id: id, payload: { error: 'invalid message type' } }) + } +} + +// Use XHR to make a request to the server +function makeRequest(url: string, callback: (response: any) => void): void { + + // The JSON file that is loaded should be an array of PageInfo: + const searchDataRequest = new XMLHttpRequest(); + searchDataRequest.onload = function () { + callback(JSON.parse(this.responseText)); + }; + searchDataRequest.open('GET', url); + searchDataRequest.send(); +} + + +// Create the search index from the searchInfo which contains the information about each page to be indexed +function loadIndex(pagesData: PageInfo[]): IndexLoader { + return (indexBuilder: lunr.Builder) => { + // Store the pages data to be used in mapping query results back to pages + // Add search terms from each page to the search index + pagesData.forEach(page => { + indexBuilder.add(page); + pages[page.path] = page; + }); + }; +} + +// Query the index and return the processed results +function queryIndex(query: string): PageInfo[] { + try { + if (query.length) { + let results = index.search(query); + if (results.length === 0) { + // Add a relaxed search in the title for the first word in the query + // E.g. if the search is "ngCont guide" then we search for "ngCont guide titleWords:ngCont*" + const titleQuery = 'titleWords:*' + query.split(' ', 1)[0] + '*'; + results = index.search(query + ' ' + titleQuery); + } + // Map the hits into info about each page to be returned as results + return results.map(function (hit) { return pages[hit.ref]; }); + } + } catch (e) { + // If the search query cannot be parsed the index throws an error + // Log it and recover + console.log(e); + } + return []; +} + +type IndexLoader = (indexBuilder: lunr.Builder) => void; diff --git a/aio/src/app/search/search.service.spec.ts b/aio/src/app/search/search.service.spec.ts index 27ededb7bf..4fad506ac0 100644 --- a/aio/src/app/search/search.service.spec.ts +++ b/aio/src/app/search/search.service.spec.ts @@ -25,11 +25,11 @@ describe('SearchService', () => { describe('initWorker', () => { it('should create the worker and load the index after the specified delay', fakeAsync(() => { - service.initWorker('some/url', 100); + service.initWorker(100); expect(WebWorkerClient.create).not.toHaveBeenCalled(); expect(mockWorker.sendMessage).not.toHaveBeenCalled(); tick(100); - expect(WebWorkerClient.create).toHaveBeenCalledWith('some/url', jasmine.any(NgZone)); + expect(WebWorkerClient.create).toHaveBeenCalledWith(jasmine.any(Worker), jasmine.any(NgZone)); expect(mockWorker.sendMessage).toHaveBeenCalledWith('load-index'); })); }); @@ -37,7 +37,7 @@ describe('SearchService', () => { describe('search', () => { beforeEach(() => { // We must initialize the service before calling connectSearches - service.initWorker('some/url', 1000); + service.initWorker(1000); // Simulate the index being ready so that searches get sent to the worker (service as any).ready = of(true); }); diff --git a/aio/src/app/search/search.service.ts b/aio/src/app/search/search.service.ts index 03a463eb5c..1c0d34f4df 100644 --- a/aio/src/app/search/search.service.ts +++ b/aio/src/app/search/search.service.ts @@ -16,10 +16,9 @@ export class SearchService { * initial rendering of the web page. Triggering a search will override this delay and cause the index to be * loaded immediately. * - * @param workerUrl the url of the WebWorker script that runs the searches * @param initDelay the number of milliseconds to wait before we load the WebWorker and generate the search index */ - initWorker(workerUrl: string, initDelay: number) { + initWorker(initDelay: number) { // Wait for the initDelay or the first search const ready = this.ready = race( timer(initDelay), @@ -28,7 +27,8 @@ export class SearchService { .pipe( concatMap(() => { // Create the worker and load the index - this.worker = WebWorkerClient.create(workerUrl, this.zone); + const worker = new Worker('./search-worker', { type: 'module' }); + this.worker = WebWorkerClient.create(worker, this.zone); return this.worker.sendMessage('load-index'); }), publishReplay(1), diff --git a/aio/src/app/shared/web-worker-message.ts b/aio/src/app/shared/web-worker-message.ts new file mode 100644 index 0000000000..36d2a69e36 --- /dev/null +++ b/aio/src/app/shared/web-worker-message.ts @@ -0,0 +1,5 @@ +export interface WebWorkerMessage { + type: string; + payload: any; + id?: number; +} diff --git a/aio/src/app/shared/web-worker.ts b/aio/src/app/shared/web-worker.ts index 07e545c5b6..9ed5e3e12f 100644 --- a/aio/src/app/shared/web-worker.ts +++ b/aio/src/app/shared/web-worker.ts @@ -1,17 +1,12 @@ import {NgZone} from '@angular/core'; import {Observable} from 'rxjs'; - -export interface WebWorkerMessage { - type: string; - payload: any; - id?: number; -} +import {WebWorkerMessage} from './web-worker-message'; export class WebWorkerClient { private nextId = 0; - static create(workerUrl: string, zone: NgZone) { - return new WebWorkerClient(new Worker(workerUrl), zone); + static create(worker: Worker, zone: NgZone) { + return new WebWorkerClient(worker, zone); } private constructor(private worker: Worker, private zone: NgZone) { diff --git a/aio/src/tsconfig.app.json b/aio/src/tsconfig.app.json index 64a2623a35..913911931a 100644 --- a/aio/src/tsconfig.app.json +++ b/aio/src/tsconfig.app.json @@ -1,19 +1,23 @@ { - "extends": "../tsconfig.json", + "extends": "./tsconfig.json", "compilerOptions": { "outDir": "../out-tsc/app", - "module": "es2015", "baseUrl": "", "types": [], + "lib": [ + "es2018", + "dom" + ], "importHelpers": true }, "exclude": [ "testing/**/*", "test.ts", "test-specs.ts", - "**/*.spec.ts" + "**/*.spec.ts", + "**/*-worker.ts" ], "angularCompilerOptions": { "disableTypeScriptVersionCheck": true } -} \ No newline at end of file +} diff --git a/aio/src/tsconfig.json b/aio/src/tsconfig.json new file mode 100644 index 0000000000..8f45d18442 --- /dev/null +++ b/aio/src/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "es2015", + "lib": [ + "es2018", + "dom", + "webworker" + ], + } +} diff --git a/aio/src/tsconfig.worker.json b/aio/src/tsconfig.worker.json new file mode 100644 index 0000000000..a8f4ca8fbc --- /dev/null +++ b/aio/src/tsconfig.worker.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/worker", + "lib": [ + "es2018", + "webworker" + ], + "types": [ + "lunr" + ], + }, + "include": ["**/*-worker.ts"] +} diff --git a/aio/yarn.lock b/aio/yarn.lock index 3483145425..610d1d05dd 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -372,6 +372,11 @@ dependencies: "@types/jasmine" "*" +"@types/lunr@^2.3.2": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/lunr/-/lunr-2.3.2.tgz#d4a51703315ed0e53c43257216f1014ce6491562" + integrity sha512-zcUZYquYDUEegRRPQtkZ068U9CoIjW6pJMYCVDRK25r76FEWvMm1oHqZQUfQh4ayIZ42lipXOpXEiAtGXc1XUg== + "@types/mkdirp@^0.3.29": version "0.3.29" resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.3.29.tgz#7f2ad7ec55f914482fc9b1ec4bb1ae6028d46066" From 8027b3e19b51cf91ffc4bbf9eee25392978319f7 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Mon, 15 Apr 2019 21:23:12 +0300 Subject: [PATCH 0748/1073] ci(docs-infra): temporarily lower the min required PWA score for localhost tests (#29911) The PWA score tests have been occasionally failing on CI recently (possibly due to CI VM/network issues). This commit temporarily disables them, until we investigate the root-cause and/or put a work-around in place. The PWA score tests are still run against the deployed versions (which don't suffer as much) or PRs with public previews (as part of the `test_aio_preview` job) and on upstream builds (as part of the `deploy_aio` job). Related to #29910. [1]: https://github.com/angular/angular/blob/3a836c362/.circleci/config.yml#L390 PR Close #29911 --- .circleci/config.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index dc1097322c..68d7ca043c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -249,7 +249,10 @@ jobs: - run: yarn --cwd aio lint # Run PWA-score tests # (Run before unit and e2e tests, which destroy the `dist/` directory.) - - run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE + # Temporarily lowering the min required PWA score to avoid flakes on CI. + # TODO(gkalpak): Re-enable once https://github.com/angular/angular/issues/29910 is resolved. + # - run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE + - run: yarn --cwd aio test-pwa-score-localhost 70 # Check the bundle sizes. # (Run before unit and e2e tests, which destroy the `dist/` directory.) - run: yarn --cwd aio payload-size @@ -284,7 +287,10 @@ jobs: - run: yarn --cwd aio build-local --progress=false # Run PWA-score tests # (Run before unit and e2e tests, which destroy the `dist/` directory.) - - run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE + # Temporarily lowering the min required PWA score to avoid flakes on CI. + # TODO(gkalpak): Re-enable once https://github.com/angular/angular/issues/29910 is resolved. + # - run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE + - run: yarn --cwd aio test-pwa-score-localhost 70 # Run unit tests - run: yarn --cwd aio test --progress=false --watch=false # Run e2e tests From 9147092a156203d46cd1c865e06fa72a1e2d4137 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Mon, 15 Apr 2019 15:26:57 -0700 Subject: [PATCH 0749/1073] Revert "feat(ivy): use i18n locale data to determine the plural form of ICU expressions (#29249)" (#29918) This reverts commit 6a8cca797536dc69e18266741d70790eccb2121d. PR Close #29918 --- packages/common/src/i18n/locale_data.ts | 31 +- packages/common/src/i18n/locale_data_api.ts | 51 ++- .../{core => common}/src/i18n/locale_en.ts | 0 .../common/test/i18n/locale_data_api_spec.ts | 3 +- .../src/ngtsc/annotations/src/ng_module.ts | 21 +- packages/compiler-cli/src/ngtsc/program.ts | 3 +- packages/core/src/application_ref.ts | 5 - packages/core/src/core_private_export.ts | 2 - .../core/src/core_render3_private_export.ts | 2 - packages/core/src/i18n/locale_data.ts | 38 -- packages/core/src/i18n/locale_data_api.ts | 53 --- packages/core/src/i18n/localization.ts | 31 -- packages/core/src/render3/component.ts | 2 +- packages/core/src/render3/definition.ts | 6 +- packages/core/src/render3/fields.ts | 1 - packages/core/src/render3/i18n.ts | 382 ++++++++++++++++-- packages/core/src/render3/index.ts | 3 - packages/core/src/render3/jit/module.ts | 1 + packages/core/src/render3/ng_module_ref.ts | 8 +- packages/core/test/BUILD.bazel | 1 - packages/core/test/application_ref_spec.ts | 21 +- packages/core/test/i18n_integration_spec.ts | 45 +-- packages/core/test/render3/BUILD.bazel | 1 - packages/core/test/render3/i18n_spec.ts | 60 +-- .../core/testing/src/r3_test_bed_compiler.ts | 9 +- tools/gulp-tasks/cldr/extract.js | 15 +- tools/public_api_guard/common/common.d.ts | 2 +- 27 files changed, 451 insertions(+), 346 deletions(-) rename packages/{core => common}/src/i18n/locale_en.ts (100%) delete mode 100644 packages/core/src/i18n/locale_data.ts delete mode 100644 packages/core/src/i18n/locale_data_api.ts delete mode 100644 packages/core/src/i18n/localization.ts diff --git a/packages/common/src/i18n/locale_data.ts b/packages/common/src/i18n/locale_data.ts index 975dcc0b69..1d3301999a 100644 --- a/packages/common/src/i18n/locale_data.ts +++ b/packages/common/src/i18n/locale_data.ts @@ -6,7 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {ɵLOCALE_DATA as LOCALE_DATA, ɵLocaleDataIndex as LocaleDataIndex} from '@angular/core'; +/** + * @publicApi + */ +export const LOCALE_DATA: {[localeId: string]: any} = {}; /** * Register global data to be used internally by Angular. See the @@ -30,6 +33,32 @@ export function registerLocaleData(data: any, localeId?: string | any, extraData } } +/** + * Index of each type of locale data from the locale data array + */ +export const enum LocaleDataIndex { + LocaleId = 0, + DayPeriodsFormat, + DayPeriodsStandalone, + DaysFormat, + DaysStandalone, + MonthsFormat, + MonthsStandalone, + Eras, + FirstDayOfWeek, + WeekendRange, + DateFormat, + TimeFormat, + DateTimeFormat, + NumberSymbols, + NumberFormats, + CurrencySymbol, + CurrencyName, + Currencies, + PluralCase, + ExtraData +} + /** * Index of each type of locale data from the extra locale data array */ diff --git a/packages/common/src/i18n/locale_data_api.ts b/packages/common/src/i18n/locale_data_api.ts index 072add5903..46d02421cc 100644 --- a/packages/common/src/i18n/locale_data_api.ts +++ b/packages/common/src/i18n/locale_data_api.ts @@ -6,9 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {ɵLocaleDataIndex as LocaleDataIndex, ɵfindLocaleData as findLocaleData, ɵgetLocalePluralCase} from '@angular/core'; +import localeEn from './locale_en'; +import {LOCALE_DATA, LocaleDataIndex, ExtraLocaleDataIndex, CurrencyIndex} from './locale_data'; import {CURRENCIES_EN, CurrenciesSymbols} from './currencies'; -import {CurrencyIndex, ExtraLocaleDataIndex} from './locale_data'; /** * Format styles that can be used to represent numbers. @@ -31,8 +31,7 @@ export enum NumberFormatStyle { * @see `NgPluralCase` * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) * - * @publicApi - */ + * @publicApi */ export enum Plural { Zero = 0, One = 1, @@ -486,11 +485,19 @@ function getLocaleCurrencies(locale: string): {[code: string]: CurrenciesSymbols } /** - * @alias core/ɵgetLocalePluralCase + * Retrieves the plural function used by ICU expressions to determine the plural case to use + * for a given locale. + * @param locale A locale code for the locale format rules to use. + * @returns The plural function for the locale. + * @see `NgPlural` + * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) + * * @publicApi */ -export const getLocalePluralCase: (locale: string) => ((value: number) => Plural) = - ɵgetLocalePluralCase; +export function getLocalePluralCase(locale: string): (value: number) => Plural { + const data = findLocaleData(locale); + return data[LocaleDataIndex.PluralCase]; +} function checkFullData(data: any) { if (!data[LocaleDataIndex.ExtraData]) { @@ -602,7 +609,37 @@ function extractTime(time: string): Time { return {hours: +h, minutes: +m}; } +/** + * Finds the locale data for a given locale. + * + * @param locale The locale code. + * @returns The locale data. + * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) + * + * @publicApi + */ +export function findLocaleData(locale: string): any { + const normalizedLocale = locale.toLowerCase().replace(/_/g, '-'); + let match = LOCALE_DATA[normalizedLocale]; + if (match) { + return match; + } + + // let's try to find a parent locale + const parentLocale = normalizedLocale.split('-')[0]; + match = LOCALE_DATA[parentLocale]; + + if (match) { + return match; + } + + if (parentLocale === 'en') { + return localeEn; + } + + throw new Error(`Missing locale data for the locale "${locale}".`); +} /** * Retrieves the currency symbol for a given currency code. diff --git a/packages/core/src/i18n/locale_en.ts b/packages/common/src/i18n/locale_en.ts similarity index 100% rename from packages/core/src/i18n/locale_en.ts rename to packages/common/src/i18n/locale_en.ts diff --git a/packages/common/test/i18n/locale_data_api_spec.ts b/packages/common/test/i18n/locale_data_api_spec.ts index 6babf0bd20..9fee387070 100644 --- a/packages/common/test/i18n/locale_data_api_spec.ts +++ b/packages/common/test/i18n/locale_data_api_spec.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -import {ɵfindLocaleData as findLocaleData} from '@angular/core'; import localeCaESVALENCIA from '@angular/common/locales/ca-ES-VALENCIA'; import localeEn from '@angular/common/locales/en'; import localeFr from '@angular/common/locales/fr'; @@ -14,7 +13,7 @@ import localeZh from '@angular/common/locales/zh'; import localeFrCA from '@angular/common/locales/fr-CA'; import localeEnAU from '@angular/common/locales/en-AU'; import {registerLocaleData} from '../../src/i18n/locale_data'; -import {getCurrencySymbol, getLocaleDateFormat, FormatWidth, getNumberOfCurrencyDigits} from '../../src/i18n/locale_data_api'; +import {findLocaleData, getCurrencySymbol, getLocaleDateFormat, FormatWidth, getNumberOfCurrencyDigits} from '../../src/i18n/locale_data_api'; { describe('locale data api', () => { diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts index de599637a3..f82c2db834 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/ng_module.ts @@ -6,8 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Expression, ExternalExpr, InvokeFunctionExpr, LiteralArrayExpr, LiteralExpr, R3Identifiers, R3InjectorMetadata, R3NgModuleMetadata, R3Reference, Statement, WrappedNodeExpr, compileInjector, compileNgModule} from '@angular/compiler'; -import {STRING_TYPE} from '@angular/compiler/src/output/output_ast'; +import {Expression, ExternalExpr, InvokeFunctionExpr, LiteralArrayExpr, R3Identifiers, R3InjectorMetadata, R3NgModuleMetadata, R3Reference, Statement, WrappedNodeExpr, compileInjector, compileNgModule} from '@angular/compiler'; import * as ts from 'typescript'; import {ErrorCode, FatalDiagnosticError} from '../../diagnostics'; @@ -18,6 +17,7 @@ import {NgModuleRouteAnalyzer} from '../../routing'; import {LocalModuleScopeRegistry, ScopeData} from '../../scope'; import {AnalysisOutput, CompileResult, DecoratorHandler, DetectResult, HandlerPrecedence, ResolveResult} from '../../transform'; import {getSourceFile} from '../../util/src/typescript'; + import {generateSetClassMetadataCall} from './metadata'; import {ReferencesRegistry} from './references_registry'; import {combineResolvers, findAngularDecorator, forwardRefResolver, getValidConstructorDependencies, isExpressionForwardReference, toR3Reference, unwrapExpression} from './util'; @@ -41,7 +41,7 @@ export class NgModuleDecoratorHandler implements DecoratorHandler remove(this._modules, moduleRef)); ngZone !.runOutsideAngular( () => ngZone !.onError.subscribe( diff --git a/packages/core/src/core_private_export.ts b/packages/core/src/core_private_export.ts index a97e2d467e..1a446cbee5 100644 --- a/packages/core/src/core_private_export.ts +++ b/packages/core/src/core_private_export.ts @@ -34,5 +34,3 @@ export {makeDecorator as ɵmakeDecorator} from './util/decorators'; export {isObservable as ɵisObservable, isPromise as ɵisPromise} from './util/lang'; export {clearOverrides as ɵclearOverrides, initServicesIfNeeded as ɵinitServicesIfNeeded, overrideComponentView as ɵoverrideComponentView, overrideProvider as ɵoverrideProvider} from './view/index'; export {NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR} from './view/provider'; -export {getLocalePluralCase as ɵgetLocalePluralCase, findLocaleData as ɵfindLocaleData} from './i18n/locale_data_api'; -export {LOCALE_DATA as ɵLOCALE_DATA, LocaleDataIndex as ɵLocaleDataIndex} from './i18n/locale_data'; diff --git a/packages/core/src/core_render3_private_export.ts b/packages/core/src/core_render3_private_export.ts index ec94366dc0..179735a15e 100644 --- a/packages/core/src/core_render3_private_export.ts +++ b/packages/core/src/core_render3_private_export.ts @@ -136,8 +136,6 @@ export { ɵɵi18nPostprocess, i18nConfigureLocalize as ɵi18nConfigureLocalize, ɵɵi18nLocalize, - setLocaleId as ɵsetLocaleId, - DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID, setClassMetadata as ɵsetClassMetadata, ɵɵresolveWindow, ɵɵresolveDocument, diff --git a/packages/core/src/i18n/locale_data.ts b/packages/core/src/i18n/locale_data.ts deleted file mode 100644 index 734cc16680..0000000000 --- a/packages/core/src/i18n/locale_data.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -/** - * This const is used to store the locale data registered with `registerLocaleData` - */ -export const LOCALE_DATA: {[localeId: string]: any} = {}; - -/** - * Index of each type of locale data from the locale data array - */ -export enum LocaleDataIndex { - LocaleId = 0, - DayPeriodsFormat, - DayPeriodsStandalone, - DaysFormat, - DaysStandalone, - MonthsFormat, - MonthsStandalone, - Eras, - FirstDayOfWeek, - WeekendRange, - DateFormat, - TimeFormat, - DateTimeFormat, - NumberSymbols, - NumberFormats, - CurrencySymbol, - CurrencyName, - Currencies, - PluralCase, - ExtraData -} diff --git a/packages/core/src/i18n/locale_data_api.ts b/packages/core/src/i18n/locale_data_api.ts deleted file mode 100644 index cc30c20348..0000000000 --- a/packages/core/src/i18n/locale_data_api.ts +++ /dev/null @@ -1,53 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {LOCALE_DATA, LocaleDataIndex} from './locale_data'; -import localeEn from './locale_en'; - -/** - * Retrieves the plural function used by ICU expressions to determine the plural case to use - * for a given locale. - * @param locale A locale code for the locale format rules to use. - * @returns The plural function for the locale. - * @see `NgPlural` - * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) - */ -export function getLocalePluralCase(locale: string): (value: number) => number { - const data = findLocaleData(locale); - return data[LocaleDataIndex.PluralCase]; -} - -/** - * Finds the locale data for a given locale. - * - * @param locale The locale code. - * @returns The locale data. - * @see [Internationalization (i18n) Guide](https://angular.io/guide/i18n) - */ -export function findLocaleData(locale: string): any { - const normalizedLocale = locale.toLowerCase().replace(/_/g, '-'); - - let match = LOCALE_DATA[normalizedLocale]; - if (match) { - return match; - } - - // let's try to find a parent locale - const parentLocale = normalizedLocale.split('-')[0]; - match = LOCALE_DATA[parentLocale]; - - if (match) { - return match; - } - - if (parentLocale === 'en') { - return localeEn; - } - - throw new Error(`Missing locale data for the locale "${locale}".`); -} diff --git a/packages/core/src/i18n/localization.ts b/packages/core/src/i18n/localization.ts deleted file mode 100644 index 0cb492f18b..0000000000 --- a/packages/core/src/i18n/localization.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -import {getLocalePluralCase} from './locale_data_api'; - -/** - * Returns the plural case based on the locale - */ -export function getPluralCase(value: any, locale: string): string { - const plural = getLocalePluralCase(locale)(value); - - switch (plural) { - case 0: - return 'zero'; - case 1: - return 'one'; - case 2: - return 'two'; - case 3: - return 'few'; - case 4: - return 'many'; - default: - return 'other'; - } -} diff --git a/packages/core/src/render3/component.ts b/packages/core/src/render3/component.ts index f03645f88f..c93d8a10b0 100644 --- a/packages/core/src/render3/component.ts +++ b/packages/core/src/render3/component.ts @@ -60,7 +60,7 @@ export interface CreateComponentOptions { * Typically, the features in this list are features that cannot be added to the * other features list in the component definition because they rely on other factors. * - * Example: `LifecycleHooksFeature` is a function that adds lifecycle hook capabilities + * Example: `RootLifecycleHooks` is a function that adds lifecycle hook capabilities * to root components in a tree-shakable way. It cannot be added to the component * features list because there's no way of knowing when the component will be used as * a root component. diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index a9a8f97299..5c1fe79af0 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -17,7 +17,7 @@ import {noSideEffects} from '../util/closure'; import {stringify} from '../util/stringify'; import {EMPTY_ARRAY, EMPTY_OBJ} from './empty'; -import {NG_COMPONENT_DEF, NG_DIRECTIVE_DEF, NG_LOCALE_ID_DEF, NG_MODULE_DEF, NG_PIPE_DEF} from './fields'; +import {NG_COMPONENT_DEF, NG_DIRECTIVE_DEF, NG_MODULE_DEF, NG_PIPE_DEF} from './fields'; import {ComponentDef, ComponentDefFeature, ComponentTemplate, ComponentType, ContentQueriesFunction, DirectiveDef, DirectiveDefFeature, DirectiveType, DirectiveTypesOrFactory, FactoryFn, HostBindingsFunction, PipeDef, PipeType, PipeTypesOrFactory, ViewQueriesFunction, ɵɵBaseDef} from './interfaces/definition'; // while SelectorFlags is unused here, it's required so that types don't get resolved lazily // see: https://github.com/Microsoft/web-build-tools/issues/1050 @@ -738,7 +738,3 @@ export function getNgModuleDef(type: any, throwNotFound?: boolean): NgModuleD } return ngModuleDef; } - -export function getNgLocaleIdDef(type: any): string|null { - return (type as any)[NG_LOCALE_ID_DEF] || null; -} diff --git a/packages/core/src/render3/fields.ts b/packages/core/src/render3/fields.ts index 92642b417f..26b29af9da 100644 --- a/packages/core/src/render3/fields.ts +++ b/packages/core/src/render3/fields.ts @@ -12,7 +12,6 @@ export const NG_COMPONENT_DEF = getClosureSafeProperty({ngComponentDef: getClosu export const NG_DIRECTIVE_DEF = getClosureSafeProperty({ngDirectiveDef: getClosureSafeProperty}); export const NG_PIPE_DEF = getClosureSafeProperty({ngPipeDef: getClosureSafeProperty}); export const NG_MODULE_DEF = getClosureSafeProperty({ngModuleDef: getClosureSafeProperty}); -export const NG_LOCALE_ID_DEF = getClosureSafeProperty({ngLocaleIdDef: getClosureSafeProperty}); export const NG_BASE_DEF = getClosureSafeProperty({ngBaseDef: getClosureSafeProperty}); /** diff --git a/packages/core/src/render3/i18n.ts b/packages/core/src/render3/i18n.ts index 9924e1904f..26e7eae042 100644 --- a/packages/core/src/render3/i18n.ts +++ b/packages/core/src/render3/i18n.ts @@ -7,12 +7,13 @@ */ import '../util/ng_i18n_closure_mode'; -import {getPluralCase} from '../i18n/localization'; + import {SRCSET_ATTRS, URI_ATTRS, VALID_ATTRS, VALID_ELEMENTS, getTemplateContent} from '../sanitization/html_sanitizer'; import {InertBodyHelper} from '../sanitization/inert_body'; import {_sanitizeUrl, sanitizeSrcset} from '../sanitization/url_sanitizer'; import {addAllToArray} from '../util/array_utils'; import {assertDefined, assertEqual, assertGreaterThan} from '../util/assert'; + import {attachPatchData} from './context_discovery'; import {attachI18nOpCodesDebug} from './debug'; import {ɵɵelementAttribute, ɵɵload, ɵɵtextBinding} from './instructions/all'; @@ -1025,6 +1026,351 @@ export function ɵɵi18nApply(index: number) { } } +enum Plural { + Zero = 0, + One = 1, + Two = 2, + Few = 3, + Many = 4, + Other = 5, +} + +/** + * Returns the plural case based on the locale. + * This is a copy of the deprecated function that we used in Angular v4. + * // TODO(ocombe): remove this once we can the real getPluralCase function + * + * @deprecated from v5 the plural case function is in locale data files common/locales/*.ts + */ +function getPluralCase(locale: string, nLike: number | string): Plural { + if (typeof nLike === 'string') { + nLike = parseInt(nLike, 10); + } + const n: number = nLike as number; + const nDecimal = n.toString().replace(/^[^.]*\.?/, ''); + const i = Math.floor(Math.abs(n)); + const v = nDecimal.length; + const f = parseInt(nDecimal, 10); + const t = parseInt(n.toString().replace(/^[^.]*\.?|0+$/g, ''), 10) || 0; + + const lang = locale.split('-')[0].toLowerCase(); + + switch (lang) { + case 'af': + case 'asa': + case 'az': + case 'bem': + case 'bez': + case 'bg': + case 'brx': + case 'ce': + case 'cgg': + case 'chr': + case 'ckb': + case 'ee': + case 'el': + case 'eo': + case 'es': + case 'eu': + case 'fo': + case 'fur': + case 'gsw': + case 'ha': + case 'haw': + case 'hu': + case 'jgo': + case 'jmc': + case 'ka': + case 'kk': + case 'kkj': + case 'kl': + case 'ks': + case 'ksb': + case 'ky': + case 'lb': + case 'lg': + case 'mas': + case 'mgo': + case 'ml': + case 'mn': + case 'nb': + case 'nd': + case 'ne': + case 'nn': + case 'nnh': + case 'nyn': + case 'om': + case 'or': + case 'os': + case 'ps': + case 'rm': + case 'rof': + case 'rwk': + case 'saq': + case 'seh': + case 'sn': + case 'so': + case 'sq': + case 'ta': + case 'te': + case 'teo': + case 'tk': + case 'tr': + case 'ug': + case 'uz': + case 'vo': + case 'vun': + case 'wae': + case 'xog': + if (n === 1) return Plural.One; + return Plural.Other; + case 'ak': + case 'ln': + case 'mg': + case 'pa': + case 'ti': + if (n === Math.floor(n) && n >= 0 && n <= 1) return Plural.One; + return Plural.Other; + case 'am': + case 'as': + case 'bn': + case 'fa': + case 'gu': + case 'hi': + case 'kn': + case 'mr': + case 'zu': + if (i === 0 || n === 1) return Plural.One; + return Plural.Other; + case 'ar': + if (n === 0) return Plural.Zero; + if (n === 1) return Plural.One; + if (n === 2) return Plural.Two; + if (n % 100 === Math.floor(n % 100) && n % 100 >= 3 && n % 100 <= 10) return Plural.Few; + if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 99) return Plural.Many; + return Plural.Other; + case 'ast': + case 'ca': + case 'de': + case 'en': + case 'et': + case 'fi': + case 'fy': + case 'gl': + case 'it': + case 'nl': + case 'sv': + case 'sw': + case 'ur': + case 'yi': + if (i === 1 && v === 0) return Plural.One; + return Plural.Other; + case 'be': + if (n % 10 === 1 && !(n % 100 === 11)) return Plural.One; + if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 4 && + !(n % 100 >= 12 && n % 100 <= 14)) + return Plural.Few; + if (n % 10 === 0 || n % 10 === Math.floor(n % 10) && n % 10 >= 5 && n % 10 <= 9 || + n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 14) + return Plural.Many; + return Plural.Other; + case 'br': + if (n % 10 === 1 && !(n % 100 === 11 || n % 100 === 71 || n % 100 === 91)) return Plural.One; + if (n % 10 === 2 && !(n % 100 === 12 || n % 100 === 72 || n % 100 === 92)) return Plural.Two; + if (n % 10 === Math.floor(n % 10) && (n % 10 >= 3 && n % 10 <= 4 || n % 10 === 9) && + !(n % 100 >= 10 && n % 100 <= 19 || n % 100 >= 70 && n % 100 <= 79 || + n % 100 >= 90 && n % 100 <= 99)) + return Plural.Few; + if (!(n === 0) && n % 1e6 === 0) return Plural.Many; + return Plural.Other; + case 'bs': + case 'hr': + case 'sr': + if (v === 0 && i % 10 === 1 && !(i % 100 === 11) || f % 10 === 1 && !(f % 100 === 11)) + return Plural.One; + if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 && + !(i % 100 >= 12 && i % 100 <= 14) || + f % 10 === Math.floor(f % 10) && f % 10 >= 2 && f % 10 <= 4 && + !(f % 100 >= 12 && f % 100 <= 14)) + return Plural.Few; + return Plural.Other; + case 'cs': + case 'sk': + if (i === 1 && v === 0) return Plural.One; + if (i === Math.floor(i) && i >= 2 && i <= 4 && v === 0) return Plural.Few; + if (!(v === 0)) return Plural.Many; + return Plural.Other; + case 'cy': + if (n === 0) return Plural.Zero; + if (n === 1) return Plural.One; + if (n === 2) return Plural.Two; + if (n === 3) return Plural.Few; + if (n === 6) return Plural.Many; + return Plural.Other; + case 'da': + if (n === 1 || !(t === 0) && (i === 0 || i === 1)) return Plural.One; + return Plural.Other; + case 'dsb': + case 'hsb': + if (v === 0 && i % 100 === 1 || f % 100 === 1) return Plural.One; + if (v === 0 && i % 100 === 2 || f % 100 === 2) return Plural.Two; + if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 || + f % 100 === Math.floor(f % 100) && f % 100 >= 3 && f % 100 <= 4) + return Plural.Few; + return Plural.Other; + case 'ff': + case 'fr': + case 'hy': + case 'kab': + if (i === 0 || i === 1) return Plural.One; + return Plural.Other; + case 'fil': + if (v === 0 && (i === 1 || i === 2 || i === 3) || + v === 0 && !(i % 10 === 4 || i % 10 === 6 || i % 10 === 9) || + !(v === 0) && !(f % 10 === 4 || f % 10 === 6 || f % 10 === 9)) + return Plural.One; + return Plural.Other; + case 'ga': + if (n === 1) return Plural.One; + if (n === 2) return Plural.Two; + if (n === Math.floor(n) && n >= 3 && n <= 6) return Plural.Few; + if (n === Math.floor(n) && n >= 7 && n <= 10) return Plural.Many; + return Plural.Other; + case 'gd': + if (n === 1 || n === 11) return Plural.One; + if (n === 2 || n === 12) return Plural.Two; + if (n === Math.floor(n) && (n >= 3 && n <= 10 || n >= 13 && n <= 19)) return Plural.Few; + return Plural.Other; + case 'gv': + if (v === 0 && i % 10 === 1) return Plural.One; + if (v === 0 && i % 10 === 2) return Plural.Two; + if (v === 0 && + (i % 100 === 0 || i % 100 === 20 || i % 100 === 40 || i % 100 === 60 || i % 100 === 80)) + return Plural.Few; + if (!(v === 0)) return Plural.Many; + return Plural.Other; + case 'he': + if (i === 1 && v === 0) return Plural.One; + if (i === 2 && v === 0) return Plural.Two; + if (v === 0 && !(n >= 0 && n <= 10) && n % 10 === 0) return Plural.Many; + return Plural.Other; + case 'is': + if (t === 0 && i % 10 === 1 && !(i % 100 === 11) || !(t === 0)) return Plural.One; + return Plural.Other; + case 'ksh': + if (n === 0) return Plural.Zero; + if (n === 1) return Plural.One; + return Plural.Other; + case 'kw': + case 'naq': + case 'se': + case 'smn': + if (n === 1) return Plural.One; + if (n === 2) return Plural.Two; + return Plural.Other; + case 'lag': + if (n === 0) return Plural.Zero; + if ((i === 0 || i === 1) && !(n === 0)) return Plural.One; + return Plural.Other; + case 'lt': + if (n % 10 === 1 && !(n % 100 >= 11 && n % 100 <= 19)) return Plural.One; + if (n % 10 === Math.floor(n % 10) && n % 10 >= 2 && n % 10 <= 9 && + !(n % 100 >= 11 && n % 100 <= 19)) + return Plural.Few; + if (!(f === 0)) return Plural.Many; + return Plural.Other; + case 'lv': + case 'prg': + if (n % 10 === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19 || + v === 2 && f % 100 === Math.floor(f % 100) && f % 100 >= 11 && f % 100 <= 19) + return Plural.Zero; + if (n % 10 === 1 && !(n % 100 === 11) || v === 2 && f % 10 === 1 && !(f % 100 === 11) || + !(v === 2) && f % 10 === 1) + return Plural.One; + return Plural.Other; + case 'mk': + if (v === 0 && i % 10 === 1 || f % 10 === 1) return Plural.One; + return Plural.Other; + case 'mt': + if (n === 1) return Plural.One; + if (n === 0 || n % 100 === Math.floor(n % 100) && n % 100 >= 2 && n % 100 <= 10) + return Plural.Few; + if (n % 100 === Math.floor(n % 100) && n % 100 >= 11 && n % 100 <= 19) return Plural.Many; + return Plural.Other; + case 'pl': + if (i === 1 && v === 0) return Plural.One; + if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 && + !(i % 100 >= 12 && i % 100 <= 14)) + return Plural.Few; + if (v === 0 && !(i === 1) && i % 10 === Math.floor(i % 10) && i % 10 >= 0 && i % 10 <= 1 || + v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 || + v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 12 && i % 100 <= 14) + return Plural.Many; + return Plural.Other; + case 'pt': + if (n === Math.floor(n) && n >= 0 && n <= 2 && !(n === 2)) return Plural.One; + return Plural.Other; + case 'ro': + if (i === 1 && v === 0) return Plural.One; + if (!(v === 0) || n === 0 || + !(n === 1) && n % 100 === Math.floor(n % 100) && n % 100 >= 1 && n % 100 <= 19) + return Plural.Few; + return Plural.Other; + case 'ru': + case 'uk': + if (v === 0 && i % 10 === 1 && !(i % 100 === 11)) return Plural.One; + if (v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 2 && i % 10 <= 4 && + !(i % 100 >= 12 && i % 100 <= 14)) + return Plural.Few; + if (v === 0 && i % 10 === 0 || + v === 0 && i % 10 === Math.floor(i % 10) && i % 10 >= 5 && i % 10 <= 9 || + v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 11 && i % 100 <= 14) + return Plural.Many; + return Plural.Other; + case 'shi': + if (i === 0 || n === 1) return Plural.One; + if (n === Math.floor(n) && n >= 2 && n <= 10) return Plural.Few; + return Plural.Other; + case 'si': + if (n === 0 || n === 1 || i === 0 && f === 1) return Plural.One; + return Plural.Other; + case 'sl': + if (v === 0 && i % 100 === 1) return Plural.One; + if (v === 0 && i % 100 === 2) return Plural.Two; + if (v === 0 && i % 100 === Math.floor(i % 100) && i % 100 >= 3 && i % 100 <= 4 || !(v === 0)) + return Plural.Few; + return Plural.Other; + case 'tzm': + if (n === Math.floor(n) && n >= 0 && n <= 1 || n === Math.floor(n) && n >= 11 && n <= 99) + return Plural.One; + return Plural.Other; + // When there is no specification, the default is always "other" + // Spec: http://cldr.unicode.org/index/cldr-spec/plural-rules + // > other (required—general plural form — also used if the language only has a single form) + default: + return Plural.Other; + } +} + +function getPluralCategory(value: any, locale: string): string { + const plural = getPluralCase(locale, value); + + switch (plural) { + case Plural.Zero: + return 'zero'; + case Plural.One: + return 'one'; + case Plural.Two: + return 'two'; + case Plural.Few: + return 'few'; + case Plural.Many: + return 'many'; + default: + return 'other'; + } +} + /** * Returns the index of the current case of an ICU expression depending on the main binding value * @@ -1036,7 +1382,9 @@ function getCaseIndex(icuExpression: TIcu, bindingValue: string): number { if (index === -1) { switch (icuExpression.type) { case IcuType.plural: { - const resolvedCase = getPluralCase(bindingValue, getLocaleId()); + // TODO(ocombe): replace this hard-coded value by the real LOCALE_ID value + const locale = 'en-US'; + const resolvedCase = getPluralCategory(bindingValue, locale); index = icuExpression.cases.indexOf(resolvedCase); if (index === -1 && resolvedCase !== 'other') { index = icuExpression.cases.indexOf('other'); @@ -1282,7 +1630,7 @@ const LOCALIZE_PH_REGEXP = /\{\$(.*?)\}/g; * running outside of Closure Compiler. This method will not be needed once runtime translation * service support is introduced. * - * @codeGenApi + * @publicApi * @deprecated this method is temporary & should not be used as it will be removed soon */ export function ɵɵi18nLocalize(input: string, placeholders: {[key: string]: string} = {}) { @@ -1293,31 +1641,3 @@ export function ɵɵi18nLocalize(input: string, placeholders: {[key: string]: st input.replace(LOCALIZE_PH_REGEXP, (match, key) => placeholders[key] || '') : input; } - -/** - * The locale id that the application is currently using (for translations and ICU expressions). - * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine - * but is now defined as a global value. - */ -export const DEFAULT_LOCALE_ID = 'en-US'; -let LOCALE_ID = DEFAULT_LOCALE_ID; - -/** - * Sets the locale id that will be used for translations and ICU expressions. - * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine - * but is now defined as a global value. - * - * @param localeId - */ -export function setLocaleId(localeId: string) { - LOCALE_ID = localeId.toLowerCase().replace(/_/g, '-'); -} - -/** - * Gets the locale id that will be used for translations and ICU expressions. - * This is the ivy version of `LOCALE_ID` that was defined as an injection token for the view engine - * but is now defined as a global value. - */ -export function getLocaleId(): string { - return LOCALE_ID; -} diff --git a/packages/core/src/render3/index.ts b/packages/core/src/render3/index.ts index 4d81e5a017..408f786824 100644 --- a/packages/core/src/render3/index.ts +++ b/packages/core/src/render3/index.ts @@ -100,7 +100,6 @@ export { } from './state'; export { - DEFAULT_LOCALE_ID, ɵɵi18n, ɵɵi18nAttributes, ɵɵi18nExp, @@ -110,8 +109,6 @@ export { ɵɵi18nPostprocess, i18nConfigureLocalize, ɵɵi18nLocalize, - getLocaleId, - setLocaleId, } from './i18n'; export {NgModuleFactory, NgModuleRef, NgModuleType} from './ng_module_ref'; diff --git a/packages/core/src/render3/jit/module.ts b/packages/core/src/render3/jit/module.ts index dc9b35f406..c7c758b489 100644 --- a/packages/core/src/render3/jit/module.ts +++ b/packages/core/src/render3/jit/module.ts @@ -99,6 +99,7 @@ export function compileNgModuleDefs(moduleType: NgModuleType, ngModule: NgModule ngDevMode && assertDefined(moduleType, 'Required value moduleType'); ngDevMode && assertDefined(ngModule, 'Required value ngModule'); const declarations: Type[] = flatten(ngModule.declarations || EMPTY_ARRAY); + let ngModuleDef: any = null; Object.defineProperty(moduleType, NG_MODULE_DEF, { configurable: true, diff --git a/packages/core/src/render3/ng_module_ref.ts b/packages/core/src/render3/ng_module_ref.ts index fce592b1d4..d445ded545 100644 --- a/packages/core/src/render3/ng_module_ref.ts +++ b/packages/core/src/render3/ng_module_ref.ts @@ -17,8 +17,7 @@ import {NgModuleDef} from '../metadata/ng_module'; import {assertDefined} from '../util/assert'; import {stringify} from '../util/stringify'; import {ComponentFactoryResolver} from './component_ref'; -import {getNgLocaleIdDef, getNgModuleDef} from './definition'; -import {setLocaleId} from './i18n'; +import {getNgModuleDef} from './definition'; import {maybeUnwrapFn} from './util/misc_utils'; export interface NgModuleType extends Type { ngModuleDef: NgModuleDef; } @@ -45,11 +44,6 @@ export class NgModuleRef extends viewEngine_NgModuleRef implements Interna ngModuleDef, `NgModule '${stringify(ngModuleType)}' is not a subtype of 'NgModuleType'.`); - const ngLocaleIdDef = getNgLocaleIdDef(ngModuleType); - if (ngLocaleIdDef) { - setLocaleId(ngLocaleIdDef); - } - this._bootstrapComponents = maybeUnwrapFn(ngModuleDef !.bootstrap); const additionalProviders: StaticProvider[] = [ { diff --git a/packages/core/test/BUILD.bazel b/packages/core/test/BUILD.bazel index bc1d670deb..99fa8a82cc 100644 --- a/packages/core/test/BUILD.bazel +++ b/packages/core/test/BUILD.bazel @@ -18,7 +18,6 @@ ts_library( "//packages/animations/browser", "//packages/animations/browser/testing", "//packages/common", - "//packages/common/locales", "//packages/compiler", "//packages/compiler/testing", "//packages/core", diff --git a/packages/core/test/application_ref_spec.ts b/packages/core/test/application_ref_spec.ts index 454b72afad..8a56680ec3 100644 --- a/packages/core/test/application_ref_spec.ts +++ b/packages/core/test/application_ref_spec.ts @@ -8,16 +8,15 @@ import {DOCUMENT} from '@angular/common'; import {ResourceLoader} from '@angular/compiler'; -import {APP_BOOTSTRAP_LISTENER, APP_INITIALIZER, Compiler, CompilerFactory, Component, InjectionToken, LOCALE_ID, NgModule, NgZone, PlatformRef, TemplateRef, Type, ViewChild, ViewContainerRef} from '@angular/core'; +import {APP_BOOTSTRAP_LISTENER, APP_INITIALIZER, Compiler, CompilerFactory, Component, InjectionToken, NgModule, NgZone, PlatformRef, TemplateRef, Type, ViewChild, ViewContainerRef} from '@angular/core'; import {ApplicationRef} from '@angular/core/src/application_ref'; import {ErrorHandler} from '@angular/core/src/error_handler'; import {ComponentRef} from '@angular/core/src/linker/component_factory'; -import {getLocaleId} from '@angular/core/src/render3'; import {BrowserModule} from '@angular/platform-browser'; import {getDOM} from '@angular/platform-browser/src/dom/dom_adapter'; import {dispatchEvent} from '@angular/platform-browser/testing/src/browser_util'; import {expect} from '@angular/platform-browser/testing/src/matchers'; -import {ivyEnabled, onlyInIvy} from '@angular/private/testing'; +import {ivyEnabled} from '@angular/private/testing'; import {NoopNgZone} from '../src/zone/ng_zone'; import {ComponentFixtureNoNgZone, TestBed, async, inject, withModule} from '../testing'; @@ -327,22 +326,6 @@ class SomeComponent { expect(loadResourceSpy).toHaveBeenCalledTimes(1); expect(loadResourceSpy).toHaveBeenCalledWith('/test-template.html'); }); - - onlyInIvy('We only need to define `LOCALE_ID` for runtime i18n') - .it('should define `LOCALE_ID`', async() => { - @Component({ - selector: 'i18n-app', - templateUrl: '', - }) - class I18nComponent { - } - - const testModule = createModule( - {component: I18nComponent, providers: [{provide: LOCALE_ID, useValue: 'ro'}]}); - await defaultPlatform.bootstrapModule(testModule); - - expect(getLocaleId()).toEqual('ro'); - }); }); describe('bootstrapModuleFactory', () => { diff --git a/packages/core/test/i18n_integration_spec.ts b/packages/core/test/i18n_integration_spec.ts index baa959e024..af09a356a7 100644 --- a/packages/core/test/i18n_integration_spec.ts +++ b/packages/core/test/i18n_integration_spec.ts @@ -6,9 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {registerLocaleData} from '@angular/common'; -import {Component, ContentChild, ContentChildren, Directive, LOCALE_ID, QueryList, TemplateRef, ViewChild, ViewContainerRef, ɵi18nConfigureLocalize} from '@angular/core'; -import localeRo from '@angular/common/locales/ro'; +import {Component, ContentChild, ContentChildren, Directive, QueryList, TemplateRef, ViewChild, ViewContainerRef, ɵi18nConfigureLocalize} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {expect} from '@angular/platform-browser/testing/src/matchers'; import {onlyInIvy} from '@angular/private/testing'; @@ -639,45 +637,4 @@ onlyInIvy('Ivy i18n logic').describe('i18n', function() { expect(child.innerHTML).toBe(`
  • Section 1
  • Section 2
  • Section 3
  • `); } }); - - it('should return the correct plural form for ICU expressions when using a specific locale', - () => { - registerLocaleData(localeRo); - TestBed.configureTestingModule({providers: [{provide: LOCALE_ID, useValue: 'ro'}]}); - // We could also use `TestBed.overrideProvider(LOCALE_ID, {useValue: 'ro'});` - const template = ` - {count, plural, - =0 {no email} - =one {one email} - =few {a few emails} - =other {lots of emails} - }`; - const fixture = getFixtureWithOverrides({template}); - - expect(fixture.nativeElement.innerHTML).toEqual('a few emails'); - - // Change detection cycle, no model changes - fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML).toEqual('a few emails'); - - fixture.componentInstance.count = 0; - fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML).toEqual('no email'); - - fixture.componentInstance.count = 1; - fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML).toEqual('one email'); - - fixture.componentInstance.count = 10; - fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML).toEqual('a few emails'); - - fixture.componentInstance.count = 20; - fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML).toEqual('lots of emails'); - - fixture.componentInstance.count = 0; - fixture.detectChanges(); - expect(fixture.nativeElement.innerHTML).toEqual('no email'); - }); }); diff --git a/packages/core/test/render3/BUILD.bazel b/packages/core/test/render3/BUILD.bazel index 63749d9109..2d769b430e 100644 --- a/packages/core/test/render3/BUILD.bazel +++ b/packages/core/test/render3/BUILD.bazel @@ -20,7 +20,6 @@ ts_library( "//packages/animations/browser", "//packages/animations/browser/testing", "//packages/common", - "//packages/common/locales", "//packages/compiler", "//packages/core", "//packages/core/src/di/interface", diff --git a/packages/core/test/render3/i18n_spec.ts b/packages/core/test/render3/i18n_spec.ts index 0a687a4d86..8f47b2509a 100644 --- a/packages/core/test/render3/i18n_spec.ts +++ b/packages/core/test/render3/i18n_spec.ts @@ -6,11 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ -import {NgForOfContext, registerLocaleData} from '@angular/common'; -import localeRo from '@angular/common/locales/ro'; +import {NgForOfContext} from '@angular/common'; import {noop} from '../../../compiler/src/render3/view/util'; -import {Component as _Component, ɵNgModuleDef as NgModuleDef, ɵɵdefineInjector} from '../../src/core'; +import {Component as _Component} from '../../src/core'; import {ɵɵdefineComponent, ɵɵdefineDirective} from '../../src/render3/definition'; import {getTranslationForTemplate, ɵɵi18n, ɵɵi18nApply, ɵɵi18nAttributes, ɵɵi18nEnd, ɵɵi18nExp, ɵɵi18nPostprocess, ɵɵi18nStart} from '../../src/render3/i18n'; import {ɵɵallocHostVars, ɵɵbind, ɵɵelement, ɵɵelementContainerEnd, ɵɵelementContainerStart, ɵɵelementEnd, ɵɵelementProperty, ɵɵelementStart, ɵɵnextContext, ɵɵprojection, ɵɵprojectionDef, ɵɵtemplate, ɵɵtext, ɵɵtextBinding} from '../../src/render3/instructions/all'; @@ -18,8 +17,8 @@ import {RenderFlags} from '../../src/render3/interfaces/definition'; import {COMMENT_MARKER, ELEMENT_MARKER, I18nMutateOpCode, I18nUpdateOpCode, I18nUpdateOpCodes, IcuType, TI18n} from '../../src/render3/interfaces/i18n'; import {AttributeMarker} from '../../src/render3/interfaces/node'; import {HEADER_OFFSET, LView, TVIEW} from '../../src/render3/interfaces/view'; -import {NgModuleFactory} from '../../src/render3/ng_module_ref'; import {getNativeByIndex, getTNode} from '../../src/render3/util/view_utils'; + import {NgForOf, NgIf} from './common_with_def'; import {ComponentFixture, TemplateFixture} from './render_util'; @@ -2260,57 +2259,4 @@ describe('Runtime i18n', () => { }); }); }); - - it('should return the correct plural form for ICU expressions when using a specific locale', - () => { - registerLocaleData(localeRo); - const MSG_DIV = `{�0�, plural, - =0 {no email} - =one {one email} - =few {a few emails} - =other {lots of emails} - }`; - const ctx = {value: 0}; - - class MyAppModule { - static ngLocaleIdDef = 'ro'; - static ngInjectorDef = ɵɵdefineInjector({factory: () => new MyAppModule()}); - static ngModuleDef: NgModuleDef = { bootstrap: [] } as any; - } - const myAppModuleFactory = new NgModuleFactory(MyAppModule); - const ngModuleRef = myAppModuleFactory.create(null); - - const fixture = prepareFixture( - () => { - ɵɵelementStart(0, 'div'); - ɵɵi18n(1, MSG_DIV); - ɵɵelementEnd(); - }, - () => { - ɵɵi18nExp(ɵɵbind(ctx.value)); - ɵɵi18nApply(1); - }, - 2, 1); - expect(fixture.html).toEqual('
    no email
    '); - - // Change detection cycle, no model changes - fixture.update(); - expect(fixture.html).toEqual('
    no email
    '); - - ctx.value = 1; - fixture.update(); - expect(fixture.html).toEqual('
    one email
    '); - - ctx.value = 10; - fixture.update(); - expect(fixture.html).toEqual('
    a few emails
    '); - - ctx.value = 20; - fixture.update(); - expect(fixture.html).toEqual('
    lots of emails
    '); - - ctx.value = 0; - fixture.update(); - expect(fixture.html).toEqual('
    no email
    '); - }); }); diff --git a/packages/core/testing/src/r3_test_bed_compiler.ts b/packages/core/testing/src/r3_test_bed_compiler.ts index 39aa31fb62..aac9429371 100644 --- a/packages/core/testing/src/r3_test_bed_compiler.ts +++ b/packages/core/testing/src/r3_test_bed_compiler.ts @@ -6,10 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ +import {ApplicationInitStatus, COMPILER_OPTIONS, Compiler, Component, Directive, ModuleWithComponentFactories, NgModule, NgModuleFactory, NgZone, Injector, Pipe, PlatformRef, Provider, Type, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, ɵNG_MODULE_DEF as NG_MODULE_DEF, ɵNG_PIPE_DEF as NG_PIPE_DEF, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ɵɵInjectableDef as InjectableDef, ɵNgModuleFactory as R3NgModuleFactory, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵDirectiveDef as DirectiveDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵtransitiveScopesFor as transitiveScopesFor,} from '@angular/core'; import {ResourceLoader} from '@angular/compiler'; -import {ApplicationInitStatus, COMPILER_OPTIONS, Compiler, Component, Directive, Injector, LOCALE_ID, ModuleWithComponentFactories, NgModule, NgModuleFactory, NgZone, Pipe, PlatformRef, Provider, Type, ɵDEFAULT_LOCALE_ID as DEFAULT_LOCALE_ID, ɵDirectiveDef as DirectiveDef, ɵNG_COMPONENT_DEF as NG_COMPONENT_DEF, ɵNG_DIRECTIVE_DEF as NG_DIRECTIVE_DEF, ɵNG_INJECTOR_DEF as NG_INJECTOR_DEF, ɵNG_MODULE_DEF as NG_MODULE_DEF, ɵNG_PIPE_DEF as NG_PIPE_DEF, ɵNgModuleFactory as R3NgModuleFactory, ɵNgModuleTransitiveScopes as NgModuleTransitiveScopes, ɵNgModuleType as NgModuleType, ɵRender3ComponentFactory as ComponentFactory, ɵRender3NgModuleRef as NgModuleRef, ɵcompileComponent as compileComponent, ɵcompileDirective as compileDirective, ɵcompileNgModuleDefs as compileNgModuleDefs, ɵcompilePipe as compilePipe, ɵgetInjectableDef as getInjectableDef, ɵpatchComponentDefWithScope as patchComponentDefWithScope, ɵsetLocaleId as setLocaleId, ɵtransitiveScopesFor as transitiveScopesFor, ɵɵInjectableDef as InjectableDef} from '@angular/core'; -import {clearResolutionOfComponentResourcesQueue, isComponentDefPendingResolution, resolveComponentResources, restoreComponentResolutionQueue} from '../../src/metadata/resource_loading'; +import {clearResolutionOfComponentResourcesQueue, restoreComponentResolutionQueue, resolveComponentResources, isComponentDefPendingResolution} from '../../src/metadata/resource_loading'; import {MetadataOverride} from './metadata_override'; import {ComponentResolver, DirectiveResolver, NgModuleResolver, PipeResolver, Resolver} from './resolvers'; @@ -227,9 +227,6 @@ export class R3TestBedCompiler { const parentInjector = this.platform.injector; this.testModuleRef = new NgModuleRef(this.testModuleType, parentInjector); - // Set the locale ID, it can be overridden for the tests - const localeId = this.testModuleRef.injector.get(LOCALE_ID, DEFAULT_LOCALE_ID); - setLocaleId(localeId); // ApplicationInitStatus.runInitializers() is marked @internal to core. // Cast it to any before accessing it. @@ -504,8 +501,6 @@ export class R3TestBedCompiler { this.initialNgDefs.clear(); this.moduleProvidersOverridden.clear(); this.restoreComponentResolutionQueue(); - // Restore the locale ID to the default value, this shouldn't be necessary but we never know - setLocaleId(DEFAULT_LOCALE_ID); } private compileTestModule(): void { diff --git a/tools/gulp-tasks/cldr/extract.js b/tools/gulp-tasks/cldr/extract.js index 1a92bc8fd2..3c0e0ce16c 100644 --- a/tools/gulp-tasks/cldr/extract.js +++ b/tools/gulp-tasks/cldr/extract.js @@ -14,14 +14,11 @@ const cldr = require('cldr'); // used to extract all other cldr data const cldrJs = require('cldrjs'); -const COMMON_PACKAGE = 'packages/common'; -const CORE_PACKAGE = 'packages/core'; -const I18N_FOLDER = `${COMMON_PACKAGE}/src/i18n`; -const I18N_CORE_FOLDER = `${CORE_PACKAGE}/src/i18n`; -const I18N_DATA_FOLDER = `${COMMON_PACKAGE}/locales`; +const PACKAGE_FOLDER = 'packages/common'; +const I18N_FOLDER = `${PACKAGE_FOLDER}/src/i18n`; +const I18N_DATA_FOLDER = `${PACKAGE_FOLDER}/locales`; const I18N_DATA_EXTRA_FOLDER = `${I18N_DATA_FOLDER}/extra`; const RELATIVE_I18N_FOLDER = path.resolve(__dirname, `../../../${I18N_FOLDER}`); -const RELATIVE_I18N_CORE_FOLDER = path.resolve(__dirname, `../../../${I18N_CORE_FOLDER}`); const RELATIVE_I18N_DATA_FOLDER = path.resolve(__dirname, `../../../${I18N_DATA_FOLDER}`); const RELATIVE_I18N_DATA_EXTRA_FOLDER = path.resolve(__dirname, `../../../${I18N_DATA_EXTRA_FOLDER}`); const DEFAULT_RULE = 'function anonymous(n\n/*``*/) {\nreturn"other"\n}'; @@ -63,9 +60,9 @@ module.exports = (gulp, done) => { const baseCurrencies = generateBaseCurrencies(new cldrJs('en')); // additional "en" file that will be included in common - console.log(`Writing file ${I18N_CORE_FOLDER}/locale_en.ts`); + console.log(`Writing file ${I18N_FOLDER}/locale_en.ts`); const localeEnFile = generateLocale('en', new cldrJs('en'), baseCurrencies); - fs.writeFileSync(`${RELATIVE_I18N_CORE_FOLDER}/locale_en.ts`, localeEnFile); + fs.writeFileSync(`${RELATIVE_I18N_FOLDER}/locale_en.ts`, localeEnFile); LOCALES.forEach((locale, index) => { const localeData = new cldrJs(locale); @@ -85,7 +82,7 @@ module.exports = (gulp, done) => { .src([ `${I18N_DATA_FOLDER}/**/*.ts`, `${I18N_FOLDER}/currencies.ts`, - `${I18N_CORE_FOLDER}/locale_en.ts` + `${I18N_FOLDER}/locale_en.ts` ], {base: '.'}) .pipe(format.format('file', clangFormat)) .pipe(gulp.dest('.')); diff --git a/tools/public_api_guard/common/common.d.ts b/tools/public_api_guard/common/common.d.ts index 9ee2ea35e3..6ca180685f 100644 --- a/tools/public_api_guard/common/common.d.ts +++ b/tools/public_api_guard/common/common.d.ts @@ -103,7 +103,7 @@ export declare function getLocaleNumberFormat(locale: string, type: NumberFormat export declare function getLocaleNumberSymbol(locale: string, symbol: NumberSymbol): string; -export declare const getLocalePluralCase: (locale: string) => ((value: number) => Plural); +export declare function getLocalePluralCase(locale: string): (value: number) => Plural; export declare function getLocaleTimeFormat(locale: string, width: FormatWidth): string; From 2deac0a41234180530986d698fd043114011f058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matias=20Niemel=C3=A4?= Date: Wed, 10 Apr 2019 11:54:59 -0700 Subject: [PATCH 0750/1073] perf(ivy): cache multiple reads to an element's stylingContext (#29818) Because the styling context may be stored in a different location and be apart of a sub array, reading the styling context each time a host binding is evaluated is costly. This patch ensures that the active styling context is cached so that multiple interactions with styling bindings can easily retrieve the styling context efficiently. PR Close #29818 --- packages/core/src/debug/debug_node.ts | 6 +-- .../core/src/render3/instructions/element.ts | 9 ++-- .../core/src/render3/instructions/styling.ts | 52 ++++++++++++------- packages/core/src/render3/players.ts | 4 +- packages/core/src/render3/state.ts | 6 +++ packages/core/src/render3/styling/state.ts | 30 +++++++++++ packages/core/src/render3/styling/util.ts | 4 +- .../cyclic_import/bundle.golden_symbols.json | 5 +- .../hello_world/bundle.golden_symbols.json | 3 ++ .../bundling/todo/bundle.golden_symbols.json | 12 +++++ 10 files changed, 102 insertions(+), 29 deletions(-) create mode 100644 packages/core/src/render3/styling/state.ts diff --git a/packages/core/src/debug/debug_node.ts b/packages/core/src/debug/debug_node.ts index 88b1ccebcb..722009eb21 100644 --- a/packages/core/src/debug/debug_node.ts +++ b/packages/core/src/debug/debug_node.ts @@ -13,7 +13,7 @@ import {TElementNode, TNode, TNodeFlags, TNodeType} from '../render3/interfaces/ import {StylingIndex} from '../render3/interfaces/styling'; import {LView, NEXT, PARENT, TData, TVIEW, T_HOST} from '../render3/interfaces/view'; import {getProp, getValue, isClassBasedValue} from '../render3/styling/class_and_style_bindings'; -import {getStylingContext} from '../render3/styling/util'; +import {getStylingContextFromLView} from '../render3/styling/util'; import {getComponent, getContext, getInjectionTokens, getInjector, getListeners, getLocalRefs, isBrowserEvents, loadLContext, loadLContextFromNode} from '../render3/util/discovery_utils'; import {INTERPOLATION_DELIMITER, isPropMetadataString, renderStringify} from '../render3/util/misc_utils'; import {findComponentView} from '../render3/util/view_traversal_utils'; @@ -288,7 +288,7 @@ class DebugElement__POST_R3__ extends DebugNode__POST_R3__ implements DebugEleme const element = this.nativeElement; if (element) { const lContext = loadLContextFromNode(element); - const stylingContext = getStylingContext(lContext.nodeIndex, lContext.lView); + const stylingContext = getStylingContextFromLView(lContext.nodeIndex, lContext.lView); if (stylingContext) { for (let i = StylingIndex.SingleStylesStartPosition; i < stylingContext.length; i += StylingIndex.Size) { @@ -317,7 +317,7 @@ class DebugElement__POST_R3__ extends DebugNode__POST_R3__ implements DebugEleme const element = this.nativeElement; if (element) { const lContext = loadLContextFromNode(element); - const stylingContext = getStylingContext(lContext.nodeIndex, lContext.lView); + const stylingContext = getStylingContextFromLView(lContext.nodeIndex, lContext.lView); if (stylingContext) { for (let i = StylingIndex.SingleStylesStartPosition; i < stylingContext.length; i += StylingIndex.Size) { diff --git a/packages/core/src/render3/instructions/element.ts b/packages/core/src/render3/instructions/element.ts index a250911ddd..bc2ce97089 100644 --- a/packages/core/src/render3/instructions/element.ts +++ b/packages/core/src/render3/instructions/element.ts @@ -13,13 +13,14 @@ import {registerPostOrderHooks} from '../hooks'; import {TAttributes, TNodeFlags, TNodeType} from '../interfaces/node'; import {RElement, isProceduralRenderer} from '../interfaces/renderer'; import {SanitizerFn} from '../interfaces/sanitization'; +import {StylingContext} from '../interfaces/styling'; import {BINDING_INDEX, QUERIES, RENDERER, TVIEW} from '../interfaces/view'; import {assertNodeType} from '../node_assert'; import {appendChild} from '../node_manipulation'; import {applyOnCreateInstructions} from '../node_util'; import {decreaseElementDepthCount, getActiveDirectiveId, getElementDepthCount, getIsParent, getLView, getNamespace, getPreviousOrParentTNode, getSelectedIndex, increaseElementDepthCount, setIsParent, setPreviousOrParentTNode} from '../state'; import {getInitialClassNameValue, getInitialStyleStringValue, initializeStaticContext, patchContextWithStaticAttrs, renderInitialClasses, renderInitialStyles} from '../styling/class_and_style_bindings'; -import {getStylingContext, hasClassInput, hasStyleInput} from '../styling/util'; +import {getStylingContextFromLView, hasClassInput, hasStyleInput} from '../styling/util'; import {NO_CHANGE} from '../tokens'; import {attrsStylingIndexOf, setUpAttributes} from '../util/attrs_utils'; import {renderStringify} from '../util/misc_utils'; @@ -156,13 +157,15 @@ export function ɵɵelementEnd(): void { // this is fired at the end of elementEnd because ALL of the stylingBindings code // (for directives and the template) have now executed which means the styling // context can be instantiated properly. + let stylingContext: StylingContext|null = null; if (hasClassInput(previousOrParentTNode)) { - const stylingContext = getStylingContext(previousOrParentTNode.index, lView); + stylingContext = getStylingContextFromLView(previousOrParentTNode.index, lView); setInputsForProperty( lView, previousOrParentTNode.inputs !['class'] !, getInitialClassNameValue(stylingContext)); } if (hasStyleInput(previousOrParentTNode)) { - const stylingContext = getStylingContext(previousOrParentTNode.index, lView); + stylingContext = + stylingContext || getStylingContextFromLView(previousOrParentTNode.index, lView); setInputsForProperty( lView, previousOrParentTNode.inputs !['style'] !, getInitialStyleStringValue(stylingContext)); diff --git a/packages/core/src/render3/instructions/styling.ts b/packages/core/src/render3/instructions/styling.ts index cb89610c14..5ca901decb 100644 --- a/packages/core/src/render3/instructions/styling.ts +++ b/packages/core/src/render3/instructions/styling.ts @@ -6,15 +6,17 @@ * found in the LICENSE file at https://angular.io/license */ import {StyleSanitizeFn} from '../../sanitization/style_sanitizer'; +import {assertEqual} from '../../util/assert'; import {TNode, TNodeType} from '../interfaces/node'; import {PlayerFactory} from '../interfaces/player'; -import {FLAGS, HEADER_OFFSET, LViewFlags, RENDERER, RootContextFlags} from '../interfaces/view'; +import {FLAGS, HEADER_OFFSET, LView, LViewFlags, RENDERER, RootContextFlags} from '../interfaces/view'; import {getActiveDirectiveId, getActiveDirectiveSuperClassDepth, getLView, getPreviousOrParentTNode, getSelectedIndex} from '../state'; import {getInitialClassNameValue, renderStyling, updateClassProp as updateElementClassProp, updateContextWithBindings, updateStyleProp as updateElementStyleProp, updateStylingMap} from '../styling/class_and_style_bindings'; import {ParamsOf, enqueueHostInstruction, registerHostDirective} from '../styling/host_instructions_queue'; import {BoundPlayerFactory} from '../styling/player_factory'; import {DEFAULT_TEMPLATE_DIRECTIVE_INDEX} from '../styling/shared'; -import {allocateOrUpdateDirectiveIntoContext, createEmptyStylingContext, forceClassesAsString, forceStylesAsString, getStylingContext, hasClassInput, hasStyleInput} from '../styling/util'; +import {getCachedStylingContext, setCachedStylingContext} from '../styling/state'; +import {allocateOrUpdateDirectiveIntoContext, createEmptyStylingContext, forceClassesAsString, forceStylesAsString, getStylingContextFromLView, hasClassInput, hasStyleInput} from '../styling/util'; import {NO_CHANGE} from '../tokens'; import {renderStringify} from '../util/misc_utils'; import {getRootContext} from '../util/view_traversal_utils'; @@ -170,9 +172,9 @@ export function ɵɵelementStyleProp( index: number, styleIndex: number, value: string | number | String | PlayerFactory | null, suffix?: string | null, forceOverride?: boolean): void { const valueToAdd = resolveStylePropValue(value, suffix); + const stylingContext = getStylingContext(index, getLView()); updateElementStyleProp( - getStylingContext(index + HEADER_OFFSET, getLView()), styleIndex, valueToAdd, - DEFAULT_TEMPLATE_DIRECTIVE_INDEX, forceOverride); + stylingContext, styleIndex, valueToAdd, DEFAULT_TEMPLATE_DIRECTIVE_INDEX, forceOverride); } /** @@ -206,9 +208,7 @@ export function ɵɵelementHostStyleProp( const directiveStylingIndex = getActiveDirectiveStylingIndex(); const hostElementIndex = getSelectedIndex(); - const lView = getLView(); - const stylingContext = getStylingContext(hostElementIndex + HEADER_OFFSET, lView); - + const stylingContext = getStylingContext(hostElementIndex, getLView()); const valueToAdd = resolveStylePropValue(value, suffix); const args: ParamsOf = [stylingContext, styleIndex, valueToAdd, directiveStylingIndex, forceOverride]; @@ -259,9 +259,9 @@ export function ɵɵelementClassProp( const input = (value instanceof BoundPlayerFactory) ? (value as BoundPlayerFactory) : booleanOrNull(value); + const stylingContext = getStylingContext(index, getLView()); updateElementClassProp( - getStylingContext(index + HEADER_OFFSET, getLView()), classIndex, input, - DEFAULT_TEMPLATE_DIRECTIVE_INDEX, forceOverride); + stylingContext, classIndex, input, DEFAULT_TEMPLATE_DIRECTIVE_INDEX, forceOverride); } @@ -287,9 +287,7 @@ export function ɵɵelementHostClassProp( classIndex: number, value: boolean | PlayerFactory, forceOverride?: boolean): void { const directiveStylingIndex = getActiveDirectiveStylingIndex(); const hostElementIndex = getSelectedIndex(); - - const lView = getLView(); - const stylingContext = getStylingContext(hostElementIndex + HEADER_OFFSET, lView); + const stylingContext = getStylingContext(hostElementIndex, getLView()); const input = (value instanceof BoundPlayerFactory) ? (value as BoundPlayerFactory) : @@ -330,8 +328,8 @@ export function ɵɵelementStylingMap( index: number, classes: {[key: string]: any} | string | NO_CHANGE | null, styles?: {[styleName: string]: any} | NO_CHANGE | null): void { const lView = getLView(); + const stylingContext = getStylingContext(index, lView); const tNode = getTNode(index, lView); - const stylingContext = getStylingContext(index + HEADER_OFFSET, lView); // inputs are only evaluated from a template binding into a directive, therefore, // there should not be a situation where a directive host bindings function @@ -384,10 +382,7 @@ export function ɵɵelementHostStylingMap( styles?: {[styleName: string]: any} | NO_CHANGE | null): void { const directiveStylingIndex = getActiveDirectiveStylingIndex(); const hostElementIndex = getSelectedIndex(); - - const lView = getLView(); - const stylingContext = getStylingContext(hostElementIndex + HEADER_OFFSET, lView); - + const stylingContext = getStylingContext(hostElementIndex, getLView()); const args: ParamsOf = [stylingContext, classes, styles, directiveStylingIndex]; enqueueHostInstruction(stylingContext, directiveStylingIndex, updateStylingMap, args); @@ -432,13 +427,22 @@ export function elementStylingApplyInternal(directiveStylingIndex: number, index // the styling apply code knows not to actually apply the values... const renderer = tNode.type === TNodeType.Element ? lView[RENDERER] : null; const isFirstRender = (lView[FLAGS] & LViewFlags.FirstLViewPass) !== 0; - const stylingContext = getStylingContext(index + HEADER_OFFSET, lView); + const stylingContext = getStylingContext(index, lView); const totalPlayersQueued = renderStyling( stylingContext, renderer, lView, isFirstRender, null, null, directiveStylingIndex); if (totalPlayersQueued > 0) { const rootContext = getRootContext(lView); scheduleTick(rootContext, RootContextFlags.FlushPlayers); } + + // because select(n) may not run between every instruction, the cached styling + // context may not get cleared between elements. The reason for this is because + // styling bindings (like `[style]` and `[class]`) are not recognized as property + // bindings by default so a select(n) instruction is not generated. To ensure the + // context is loaded correctly for the next element the cache below is pre-emptively + // cleared because there is no code in Angular that applies more styling code after a + // styling flush has occurred. Note that this will be fixed once FW-1254 lands. + setCachedStylingContext(null); } export function getActiveDirectiveStylingIndex() { @@ -450,3 +454,15 @@ export function getActiveDirectiveStylingIndex() { // sub-classed directive the inheritance depth is taken into account as well. return getActiveDirectiveId() + getActiveDirectiveSuperClassDepth(); } + +function getStylingContext(index: number, lView: LView) { + let context = getCachedStylingContext(); + if (!context) { + context = getStylingContextFromLView(index + HEADER_OFFSET, lView); + setCachedStylingContext(context); + } else if (ngDevMode) { + const actualContext = getStylingContextFromLView(index + HEADER_OFFSET, lView); + assertEqual(context, actualContext, 'The cached styling context is invalid'); + } + return context; +} diff --git a/packages/core/src/render3/players.ts b/packages/core/src/render3/players.ts index 50e2e07323..3c38289bd9 100644 --- a/packages/core/src/render3/players.ts +++ b/packages/core/src/render3/players.ts @@ -11,7 +11,7 @@ import {getLContext} from './context_discovery'; import {scheduleTick} from './instructions/shared'; import {ComponentInstance, DirectiveInstance, Player} from './interfaces/player'; import {RootContextFlags} from './interfaces/view'; -import {addPlayerInternal, getOrCreatePlayerContext, getPlayerContext, getPlayersInternal, getStylingContext, throwInvalidRefError} from './styling/util'; +import {addPlayerInternal, getOrCreatePlayerContext, getPlayerContext, getPlayersInternal, getStylingContextFromLView, throwInvalidRefError} from './styling/util'; import {getRootContext} from './util/view_traversal_utils'; @@ -61,7 +61,7 @@ export function getPlayers(ref: ComponentInstance | DirectiveInstance | HTMLElem return []; } - const stylingContext = getStylingContext(context.nodeIndex, context.lView); + const stylingContext = getStylingContextFromLView(context.nodeIndex, context.lView); const playerContext = stylingContext ? getPlayerContext(stylingContext) : null; return playerContext ? getPlayersInternal(playerContext) : []; } diff --git a/packages/core/src/render3/state.ts b/packages/core/src/render3/state.ts index 5bc7d315bc..8612cfa9d6 100644 --- a/packages/core/src/render3/state.ts +++ b/packages/core/src/render3/state.ts @@ -13,6 +13,7 @@ import {executeHooks} from './hooks'; import {ComponentDef, DirectiveDef} from './interfaces/definition'; import {TElementNode, TNode, TViewNode} from './interfaces/node'; import {BINDING_INDEX, CONTEXT, DECLARATION_VIEW, FLAGS, InitPhaseState, LView, LViewFlags, OpaqueViewState, TVIEW} from './interfaces/view'; +import {setCachedStylingContext} from './styling/state'; import {resetPreOrderHookFlags} from './util/view_utils'; @@ -456,6 +457,7 @@ export function leaveView(newView: LView): void { lView[BINDING_INDEX] = tView.bindingStartIndex; } } + setCachedStylingContext(null); enterView(newView, null); } @@ -482,6 +484,10 @@ export function getSelectedIndex() { */ export function setSelectedIndex(index: number) { _selectedIndex = index; + + // remove the styling context from the cache + // because we are now on a different element + setCachedStylingContext(null); } diff --git a/packages/core/src/render3/styling/state.ts b/packages/core/src/render3/styling/state.ts new file mode 100644 index 0000000000..c000295e37 --- /dev/null +++ b/packages/core/src/render3/styling/state.ts @@ -0,0 +1,30 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ +import {StylingContext} from '../interfaces/styling'; + +let stylingContext: StylingContext|null = null; + +/** + * Gets the most recent styling context value. + * + * Note that only one styling context is stored at a given time. + */ +export function getCachedStylingContext() { + return stylingContext; +} + +/** + * Sets the most recent styling context value. + * + * Note that only one styling context is stored at a given time. + * + * @param context The styling context value that will be stored + */ +export function setCachedStylingContext(context: StylingContext | null) { + stylingContext = context; +} diff --git a/packages/core/src/render3/styling/util.ts b/packages/core/src/render3/styling/util.ts index 50c52987eb..9ae4842a6d 100644 --- a/packages/core/src/render3/styling/util.ts +++ b/packages/core/src/render3/styling/util.ts @@ -124,7 +124,7 @@ export function allocStylingContext( * @param index Index of the style allocation. See: `elementStyling`. * @param viewData The view to search for the styling context */ -export function getStylingContext(index: number, viewData: LView): StylingContext { +export function getStylingContextFromLView(index: number, viewData: LView): StylingContext { let storageIndex = index; let slotValue: LContainer|LView|StylingContext|RElement = viewData[storageIndex]; let wrapper: LContainer|LView|StylingContext = viewData; @@ -252,7 +252,7 @@ export function getOrCreatePlayerContext(target: {}, context?: LContext | null): } const {lView, nodeIndex} = context; - const stylingContext = getStylingContext(nodeIndex, lView); + const stylingContext = getStylingContextFromLView(nodeIndex, lView); return getPlayerContext(stylingContext) || allocPlayerContext(stylingContext); } diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index 98c70fb680..acb85251e0 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -408,7 +408,7 @@ "name": "getRootView" }, { - "name": "getStylingContext" + "name": "getStylingContextFromLView" }, { "name": "getTNode" @@ -614,6 +614,9 @@ { "name": "setBindingRoot" }, + { + "name": "setCachedStylingContext" + }, { "name": "setClass" }, diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 98e4f7685f..99e9f7e146 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -440,6 +440,9 @@ { "name": "setBindingRoot" }, + { + "name": "setCachedStylingContext" + }, { "name": "setClass" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 2673be4132..8b4cd066a4 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -641,6 +641,9 @@ { "name": "getBindingsEnabled" }, + { + "name": "getCachedStylingContext" + }, { "name": "getCheckNoChangesMode" }, @@ -824,6 +827,9 @@ { "name": "getStylingContext" }, + { + "name": "getStylingContextFromLView" + }, { "name": "getSymbolIterator" }, @@ -1178,6 +1184,9 @@ { "name": "setBindingRoot" }, + { + "name": "setCachedStylingContext" + }, { "name": "setCheckNoChangesMode" }, @@ -1265,6 +1274,9 @@ { "name": "stringify" }, + { + "name": "stylingContext" + }, { "name": "syncViewWithBlueprint" }, From ca755a6b7281087be7c9546d9d195857f7f32571 Mon Sep 17 00:00:00 2001 From: Yun Peng Date: Tue, 9 Apr 2019 11:27:48 +0200 Subject: [PATCH 0751/1073] build: Fix label name (#29777) Fix the following error with future Bazel version: ``` Invalid label: invalid target name 'internal/npm_package:npm_package.bzl': target names may not contain ':' ``` PR Close #29777 --- packages/bazel/src/ng_package/ng_package.bzl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/bazel/src/ng_package/ng_package.bzl b/packages/bazel/src/ng_package/ng_package.bzl index 1171d008b2..f1a3c7a788 100644 --- a/packages/bazel/src/ng_package/ng_package.bzl +++ b/packages/bazel/src/ng_package/ng_package.bzl @@ -17,14 +17,14 @@ load("@build_bazel_rules_nodejs//internal/common:collect_es6_sources.bzl", "coll load("@build_bazel_rules_nodejs//internal/common:node_module_info.bzl", "NodeModuleInfo") load("@build_bazel_rules_nodejs//internal/common:sources_aspect.bzl", "sources_aspect") load( - "@build_bazel_rules_nodejs//:internal/rollup/rollup_bundle.bzl", + "@build_bazel_rules_nodejs//internal/rollup:rollup_bundle.bzl", "ROLLUP_ATTRS", "ROLLUP_DEPS_ASPECTS", "run_terser", "write_rollup_config", ) load( - "@build_bazel_rules_nodejs//:internal/npm_package/npm_package.bzl", + "@build_bazel_rules_nodejs//internal/npm_package:npm_package.bzl", "NPM_PACKAGE_ATTRS", "NPM_PACKAGE_OUTPUTS", "create_package", From 5d824c4153d6d9fcad7975cb226ac3d1e5ac8693 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Mon, 15 Apr 2019 21:59:51 +0200 Subject: [PATCH 0752/1073] fix(ivy): DebugNode.properties not preserving type of values (#29914) Fixes the `DebugNode.properties` casting all of the values to a string. This PR resolves FW-1253. PR Close #29914 --- packages/core/src/debug/debug_node.ts | 13 +++++++----- packages/core/test/debug/debug_node_spec.ts | 23 +++++++++++++++++++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/core/src/debug/debug_node.ts b/packages/core/src/debug/debug_node.ts index 722009eb21..7e2a3210ee 100644 --- a/packages/core/src/debug/debug_node.ts +++ b/packages/core/src/debug/debug_node.ts @@ -538,23 +538,26 @@ function collectPropertyBindings( let bindingIndex = getFirstBindingIndex(tNode.propertyMetadataStartIndex, tData); while (bindingIndex < tNode.propertyMetadataEndIndex) { - let value = ''; + let value: any; let propMetadata = tData[bindingIndex] as string; while (!isPropMetadataString(propMetadata)) { // This is the first value for an interpolation. We need to build up // the full interpolation by combining runtime values in LView with // the static interstitial values stored in TData. - value += renderStringify(lView[bindingIndex]) + tData[bindingIndex]; + value = (value || '') + renderStringify(lView[bindingIndex]) + tData[bindingIndex]; propMetadata = tData[++bindingIndex] as string; } - value += lView[bindingIndex]; + value = value === undefined ? lView[bindingIndex] : value += lView[bindingIndex]; // Property metadata string has 3 parts: property name, prefix, and suffix const metadataParts = propMetadata.split(INTERPOLATION_DELIMITER); const propertyName = metadataParts[0]; // Attr bindings don't have property names and should be skipped if (propertyName) { - // Wrap value with prefix and suffix (will be '' for normal bindings) - properties[propertyName] = metadataParts[1] + value + metadataParts[2]; + // Wrap value with prefix and suffix (will be '' for normal bindings), if they're defined. + // Avoid wrapping for normal bindings so that the value doesn't get cast to a string. + properties[propertyName] = (metadataParts[1] && metadataParts[2]) ? + metadataParts[1] + value + metadataParts[2] : + value; } bindingIndex++; } diff --git a/packages/core/test/debug/debug_node_spec.ts b/packages/core/test/debug/debug_node_spec.ts index 22acf260ba..150c20c60a 100644 --- a/packages/core/test/debug/debug_node_spec.ts +++ b/packages/core/test/debug/debug_node_spec.ts @@ -195,6 +195,20 @@ class TestCmptWithViewContainerRef { constructor(private vcref: ViewContainerRef) {} } +@Component({ + template: ` + +` +}) +class TestCmptWithPropBindings { + disabled = true; + tabIndex = 1337; + title = 'hello'; +} + { describe('debug element', () => { let fixture: ComponentFixture; @@ -218,6 +232,7 @@ class TestCmptWithViewContainerRef { HostClassBindingCmp, TestCmptWithViewContainerRef, SimpleContentComp, + TestCmptWithPropBindings, ], providers: [Logger], schemas: [NO_ERRORS_SCHEMA], @@ -566,6 +581,14 @@ class TestCmptWithViewContainerRef { expect(debugElement.properties.className).toBeFalsy(); }); + it('should preserve the type of the property values', () => { + const fixture = TestBed.createComponent(TestCmptWithPropBindings); + fixture.detectChanges(); + + const button = fixture.debugElement.query(By.css('button')); + expect(button.properties).toEqual({disabled: true, tabIndex: 1337, title: 'hello'}); + }); + describe('componentInstance on DebugNode', () => { it('should return component associated with a node if a node is a component host', () => { From 5f1b6372c70960b97cbb71cbc02f4c9513bbfb45 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Mon, 15 Apr 2019 17:15:40 -0700 Subject: [PATCH 0753/1073] fix(ivy): multi provider override support in TestBed (#29919) Overriding multi provider values (providers with `multi: true` flag) via TestBed require additional handling: all existing multi-provider values for the same token should be removed from the override list, so that they are not included into the final value of a given provider. This commit adds this logic to make sure we handle multi providers correctly. PR Close #29919 --- packages/core/test/test_bed_spec.ts | 21 ++++ .../core/testing/src/r3_test_bed_compiler.ts | 101 +++++++++++++----- 2 files changed, 98 insertions(+), 24 deletions(-) diff --git a/packages/core/test/test_bed_spec.ts b/packages/core/test/test_bed_spec.ts index d9da302e95..2e14c67da8 100644 --- a/packages/core/test/test_bed_spec.ts +++ b/packages/core/test/test_bed_spec.ts @@ -229,6 +229,27 @@ describe('TestBed', () => { expect(hello.nativeElement).toHaveText('Hello injected World !'); }); + it('allow to override multi provider', () => { + const MY_TOKEN = new InjectionToken('MyProvider'); + class MyProvider {} + + @Component({selector: 'my-comp', template: ``}) + class MyComp { + constructor(@Inject(MY_TOKEN) public myProviders: MyProvider[]) {} + } + + TestBed.configureTestingModule({ + declarations: [MyComp], + providers: [{provide: MY_TOKEN, useValue: {value: 'old provider'}, multi: true}] + }); + + const multiOverride = {useValue: [{value: 'new provider'}], multi: true}; + TestBed.overrideProvider(MY_TOKEN, multiOverride as any); + + const fixture = TestBed.createComponent(MyComp); + expect(fixture.componentInstance.myProviders).toEqual([{value: 'new provider'}]); + }); + it('should resolve components that are extended by other components', () => { // SimpleApp uses SimpleCmp in its template, which is extended by InheritedCmp const simpleApp = TestBed.createComponent(SimpleApp); diff --git a/packages/core/testing/src/r3_test_bed_compiler.ts b/packages/core/testing/src/r3_test_bed_compiler.ts index aac9429371..3b518e2095 100644 --- a/packages/core/testing/src/r3_test_bed_compiler.ts +++ b/packages/core/testing/src/r3_test_bed_compiler.ts @@ -73,7 +73,7 @@ export class R3TestBedCompiler { private providerOverrides: Provider[] = []; private rootProviderOverrides: Provider[] = []; - private providerOverridesByToken = new Map(); + private providerOverridesByToken = new Map(); private moduleProvidersOverridden = new Set>(); private testModuleType: NgModuleType; @@ -142,11 +142,17 @@ export class R3TestBedCompiler { this.pendingPipes.add(pipe); } - overrideProvider(token: any, provider: {useFactory?: Function, useValue?: any, deps?: any[]}): - void { + overrideProvider( + token: any, + provider: {useFactory?: Function, useValue?: any, deps?: any[], multi?: boolean}): void { const providerDef = provider.useFactory ? - {provide: token, useFactory: provider.useFactory, deps: provider.deps || []} : - {provide: token, useValue: provider.useValue}; + { + provide: token, + useFactory: provider.useFactory, + deps: provider.deps || [], + multi: provider.multi, + } : + {provide: token, useValue: provider.useValue, multi: provider.multi}; let injectableDef: InjectableDef|null; const isRoot = @@ -155,10 +161,8 @@ export class R3TestBedCompiler { const overridesBucket = isRoot ? this.rootProviderOverrides : this.providerOverrides; overridesBucket.push(providerDef); - // Keep all overrides grouped by token as well for fast lookups using token - const overridesForToken = this.providerOverridesByToken.get(token) || []; - overridesForToken.push(providerDef); - this.providerOverridesByToken.set(token, overridesForToken); + // Keep overrides grouped by token as well for fast lookups using token + this.providerOverridesByToken.set(token, providerDef); } overrideTemplateUsingTestingModule(type: Type, template: string): void { @@ -349,10 +353,7 @@ export class R3TestBedCompiler { this.maybeStoreNgDef(NG_INJECTOR_DEF, moduleType); this.storeFieldOfDefOnType(moduleType, NG_INJECTOR_DEF, 'providers'); - injectorDef.providers = [ - ...injectorDef.providers, // - ...this.getProviderOverrides(injectorDef.providers) - ]; + injectorDef.providers = this.getOverriddenProviders(injectorDef.providers); } // Apply provider overrides to imported modules recursively @@ -561,11 +562,9 @@ export class R3TestBedCompiler { } // get overrides for a specific provider (if any) - private getSingleProviderOverrides(provider: Provider&{provide?: any}): Provider[] { - const token = provider && typeof provider === 'object' && provider.hasOwnProperty('provide') ? - provider.provide : - provider; - return this.providerOverridesByToken.get(token) || []; + private getSingleProviderOverrides(provider: Provider): Provider|null { + const token = getProviderToken(provider); + return this.providerOverridesByToken.get(token) || null; } private getProviderOverrides(providers?: Provider[]): Provider[] { @@ -575,8 +574,47 @@ export class R3TestBedCompiler { // provider. The outer flatten() then flattens the produced overrides array. If this is not // done, the array can contain other empty arrays (e.g. `[[], []]`) which leak into the // providers array and contaminate any error messages that might be generated. - return flatten( - flatten(providers, (provider: Provider) => this.getSingleProviderOverrides(provider))); + return flatten(flatten( + providers, (provider: Provider) => this.getSingleProviderOverrides(provider) || [])); + } + + private getOverriddenProviders(providers?: Provider[]): Provider[] { + if (!providers || !providers.length || this.providerOverridesByToken.size === 0) return []; + + const overrides = this.getProviderOverrides(providers); + const hasMultiProviderOverrides = overrides.some(isMultiProvider); + const overriddenProviders = [...providers, ...overrides]; + + // No additional processing is required in case we have no multi providers to override + if (!hasMultiProviderOverrides) { + return overriddenProviders; + } + + const final: Provider[] = []; + const seenMultiProviders = new Set(); + + // We iterate through the list of providers in reverse order to make sure multi provider + // overrides take precedence over the values defined in provider list. We also fiter out all + // multi providers that have overrides, keeping overridden values only. + forEachRight(overriddenProviders, (provider: any) => { + const token: any = getProviderToken(provider); + if (isMultiProvider(provider) && this.providerOverridesByToken.has(token)) { + if (!seenMultiProviders.has(token)) { + seenMultiProviders.add(token); + if (provider && provider.useValue && Array.isArray(provider.useValue)) { + forEachRight(provider.useValue, (value: any) => { + // Unwrap provider override array into individual providers in final set. + final.unshift({provide: token, useValue: value, multi: true}); + }); + } else { + final.unshift(provider); + } + } + } else { + final.unshift(provider); + } + }); + return final; } private hasProviderOverrides(providers?: Provider[]): boolean { @@ -589,10 +627,7 @@ export class R3TestBedCompiler { this.maybeStoreNgDef(field, declaration); const resolver = def.providersResolver; - const processProvidersFn = (providers: Provider[]) => { - const overrides = this.getProviderOverrides(providers); - return [...providers, ...overrides]; - }; + const processProvidersFn = (providers: Provider[]) => this.getOverriddenProviders(providers); this.storeFieldOfDefOnType(declaration, field, 'providersResolver'); def.providersResolver = (ngDef: DirectiveDef) => resolver(ngDef, processProvidersFn); } @@ -628,6 +663,24 @@ function flatten(values: any[], mapFn?: (value: T) => any): T[] { return out; } +function getProviderField(provider: Provider, field: string) { + return provider && typeof provider === 'object' && (provider as any)[field]; +} + +function getProviderToken(provider: Provider) { + return getProviderField(provider, 'provide') || provider; +} + +function isMultiProvider(provider: Provider) { + return !!getProviderField(provider, 'multi'); +} + +function forEachRight(values: T[], fn: (value: T, idx: number) => void): void { + for (let idx = values.length - 1; idx >= 0; idx--) { + fn(values[idx], idx); + } +} + class R3TestCompiler implements Compiler { constructor(private testBed: R3TestBedCompiler) {} From b3edf494a492e39c1b40e67e75b24802d19fdba5 Mon Sep 17 00:00:00 2001 From: Jurgen Van de Moere Date: Fri, 12 Apr 2019 12:43:01 +0200 Subject: [PATCH 0754/1073] docs(service-worker): fix small typo in devops guide (#29866) PR Close #29866 --- aio/content/guide/service-worker-devops.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/content/guide/service-worker-devops.md b/aio/content/guide/service-worker-devops.md index 97caa3a4fa..3a6885fcf7 100644 --- a/aio/content/guide/service-worker-devops.md +++ b/aio/content/guide/service-worker-devops.md @@ -1,6 +1,6 @@ # Service worker in production -This page is a reference for deploying and supporting production apps that use the Angular service worker. It explains how the Angular service worker fits into the larger production environment, the service worker's behavior under various conditions, and available recourses and fail-safes. +This page is a reference for deploying and supporting production apps that use the Angular service worker. It explains how the Angular service worker fits into the larger production environment, the service worker's behavior under various conditions, and available resources and fail-safes. #### Prerequisites From bd3164f88a1f13f55618eb74de86dc4d7eb9eaec Mon Sep 17 00:00:00 2001 From: hpawe01 Date: Tue, 16 Apr 2019 10:47:55 +0200 Subject: [PATCH 0755/1073] docs: use correct values from `code-example` in i18n (#29920) PR Close #29920 --- aio/content/guide/i18n.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/content/guide/i18n.md b/aio/content/guide/i18n.md index 6d95ca3e67..7e2c38f9bb 100644 --- a/aio/content/guide/i18n.md +++ b/aio/content/guide/i18n.md @@ -369,7 +369,7 @@ except that you choose among alternative translations based on a string value in and you define those string values. The following format message in the component template binds to the component's `gender` property, -which outputs one of the following string values: "m", "f" or "o". +which outputs one of the following string values: "male", "female" or "other". The message maps those values to the appropriate translations: From 2bfb6a02e28ceacccea3502491624586f55d4fdf Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Thu, 11 Apr 2019 14:23:17 +0100 Subject: [PATCH 0756/1073] fix(router): support non-NgFactory promise in loadChildren typings (#29832) PR Close #29832 --- packages/router/src/config.ts | 4 ++-- tools/public_api_guard/router/router.d.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/router/src/config.ts b/packages/router/src/config.ts index cc0be4687c..e49dc3d04f 100644 --- a/packages/router/src/config.ts +++ b/packages/router/src/config.ts @@ -97,8 +97,8 @@ export type ResolveData = { * @see `Route#loadChildren`. * @publicApi */ -export type LoadChildrenCallback = () => Type| NgModuleFactory| - Promise>| Promise>| Observable>; +export type LoadChildrenCallback = () => Type| NgModuleFactory| Observable>| + Promise|Type|any>; /** * diff --git a/tools/public_api_guard/router/router.d.ts b/tools/public_api_guard/router/router.d.ts index a9130c64b7..43e640ffdb 100644 --- a/tools/public_api_guard/router/router.d.ts +++ b/tools/public_api_guard/router/router.d.ts @@ -147,7 +147,7 @@ export declare class GuardsCheckStart extends RouterEvent { export declare type LoadChildren = string | LoadChildrenCallback; -export declare type LoadChildrenCallback = () => Type | NgModuleFactory | Promise> | Promise> | Observable>; +export declare type LoadChildrenCallback = () => Type | NgModuleFactory | Observable> | Promise | Type | any>; export declare type Navigation = { id: number; From 86a3f90954121c1d26797bde6820bfe7cc47b1a1 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Fri, 12 Apr 2019 16:14:35 +0100 Subject: [PATCH 0757/1073] fix(compiler-cli): pass config path to ts.parseJsonConfigFileContent (#29872) The config path is an optional argument to `ts.parseJsonConfigFileContent`. When passed, it is added to the returned object as `options.configFilePath`, and `tsc` itself passes it in. The new TS 3.4 [incremental](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html) build functionality relies on this property being present: https://github.com/Microsoft/TypeScript/blob/025d82633915b67003ea38ba40b9239a19721c13/src/compiler/emitter.ts#L56-L57 When using The compiler-cli `readConfiguration` the config path option isn't passed, preventing consumers (like @ngtools/webpack) from obtaining a complete config object. This PR fixes this omission and should allow JIT users of @ngtools/webpack to set the `incremental` option in their tsconfig and have it be used by the TS program. I tested this in JIT and saw a small decrease in build times in a small project. In AOT the incremental option didn't seem to be used at all, due to how `ngc` uses the TS APIs. Related to https://github.com/angular/angular-cli/issues/13941. PR Close #29872 --- packages/compiler-cli/src/perform_compile.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/compiler-cli/src/perform_compile.ts b/packages/compiler-cli/src/perform_compile.ts index a7371c4039..2ae082e010 100644 --- a/packages/compiler-cli/src/perform_compile.ts +++ b/packages/compiler-cli/src/perform_compile.ts @@ -179,8 +179,9 @@ export function readConfiguration( readDirectory: ts.sys.readDirectory, readFile: ts.sys.readFile }; - const parsed = - ts.parseJsonConfigFileContent(config, parseConfigHost, basePath, existingOptions); + const configFileName = path.resolve(process.cwd(), projectFile); + const parsed = ts.parseJsonConfigFileContent( + config, parseConfigHost, basePath, existingOptions, configFileName); const rootNames = parsed.fileNames.map(f => path.normalize(f)); const options = createNgCompilerOptions(basePath, config, parsed.options); From 1794a8e42a9b77efe3204c3bcf3f0dc563f58460 Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Tue, 16 Apr 2019 12:02:42 -0700 Subject: [PATCH 0758/1073] fix(ivy): coalesced listeners should preventDefault if any returns false (#29934) We had a bug where event.preventDefault() was not always called if listeners were coalesced. This is because we were overwriting the previous listener's result every time we called the next listener, so listeners early in the chain that returned false would be ignored and preventDefault would not be called. This commit fixes that issue, so now preventDefault() is called if any listener in a coalesced chain returns false. This brings us in line with View Engine behavior. PR Close #29934 --- .../core/src/render3/instructions/listener.ts | 9 ++- .../core/test/acceptance/listener_spec.ts | 57 ++++++++++++++++++- 2 files changed, 62 insertions(+), 4 deletions(-) diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index 3cb77b92c8..fb02629b04 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -202,9 +202,11 @@ function listenerInternal( } } -function executeListenerWithErrorHandling(lView: LView, listenerFn: (e?: any) => any, e: any): any { +function executeListenerWithErrorHandling( + lView: LView, listenerFn: (e?: any) => any, e: any): boolean { try { - return listenerFn(e); + // Only explicitly returning false from a listener should preventDefault + return listenerFn(e) !== false; } catch (error) { handleError(lView, error); return false; @@ -242,7 +244,8 @@ function wrapListener( // their presence and invoke as needed. let nextListenerFn = (wrapListenerIn_markDirtyAndPreventDefault).__ngNextListenerFn__; while (nextListenerFn) { - result = executeListenerWithErrorHandling(lView, nextListenerFn, e); + // We should prevent default if any of the listeners explicitly return false + result = executeListenerWithErrorHandling(lView, nextListenerFn, e) && result; nextListenerFn = (nextListenerFn).__ngNextListenerFn__; } diff --git a/packages/core/test/acceptance/listener_spec.ts b/packages/core/test/acceptance/listener_spec.ts index 4ba782fcb2..b241a26383 100644 --- a/packages/core/test/acceptance/listener_spec.ts +++ b/packages/core/test/acceptance/listener_spec.ts @@ -42,6 +42,26 @@ describe('event listeners', () => { count() { this.counter++; } } + @Directive({selector: '[returns-false]'}) + class ReturnsFalse { + counter = 0; + event !: Event; + handlerShouldReturn: boolean|undefined = undefined; + + @HostListener('click', ['$event']) + count(e: Event) { + this.counter++; + this.event = e; + + // stub preventDefault() to check whether it's called + Object.defineProperty( + this.event, 'preventDefault', + {value: jasmine.createSpy('preventDefault'), writable: true}); + + return this.handlerShouldReturn; + } + } + onlyInIvy('ngDevMode.rendererAddEventListener counters are only available in ivy') .it('should coalesce multiple event listeners for the same event on the same element', () => { @@ -119,5 +139,40 @@ describe('event listeners', () => { expect(noOfErrors).toBe(1); expect(buttonDebugEl.injector.get(LikesClicks).counter).toBe(1); }); + + it('should prevent default if any of the listeners returns false', () => { + @Component({ + selector: 'test-cmpt', + template: ` + + ` + }) + class TestCmpt { + } + + TestBed.configureTestingModule({declarations: [TestCmpt, ReturnsFalse, LikesClicks]}); + const fixture = TestBed.createComponent(TestCmpt); + fixture.detectChanges(); + + const buttonDebugEl = fixture.debugElement.query(By.css('button')); + const likesClicksDir = buttonDebugEl.injector.get(LikesClicks); + const returnsFalseDir = buttonDebugEl.injector.get(ReturnsFalse); + expect(likesClicksDir.counter).toBe(0); + expect(returnsFalseDir.counter).toBe(0); + + buttonDebugEl.nativeElement.click(); + expect(likesClicksDir.counter).toBe(1); + expect(returnsFalseDir.counter).toBe(1); + expect(returnsFalseDir.event.preventDefault).not.toHaveBeenCalled(); + + returnsFalseDir.handlerShouldReturn = true; + buttonDebugEl.nativeElement.click(); + expect(returnsFalseDir.event.preventDefault).not.toHaveBeenCalled(); + + returnsFalseDir.handlerShouldReturn = false; + buttonDebugEl.nativeElement.click(); + expect(returnsFalseDir.event.preventDefault).toHaveBeenCalled(); + }); + }); -}); \ No newline at end of file +}); From ab6036272c5f47cf5b268864471295d67b83ac3a Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Tue, 16 Apr 2019 15:18:42 -0700 Subject: [PATCH 0759/1073] release: cut the v8.0.0-beta.13 release --- CHANGELOG.md | 12 ++++++++++++ package.json | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e5cb5986f9..9ac5a71012 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ + +# [8.0.0-beta.13](https://github.com/angular/angular/compare/8.0.0-beta.12...8.0.0-beta.13) (2019-04-16) + + +### Bug Fixes + +* **bazel:** Install packages after `ng add` when invoked independently ([#29852](https://github.com/angular/angular/issues/29852)) ([bd2ce9c](https://github.com/angular/angular/commit/bd2ce9c)) +* **compiler-cli:** pass config path to ts.parseJsonConfigFileContent ([#29872](https://github.com/angular/angular/issues/29872)) ([86a3f90](https://github.com/angular/angular/commit/86a3f90)), closes [/github.com/Microsoft/TypeScript/blob/025d82633915b67003ea38ba40b9239a19721c13/src/compiler/emitter.ts#L56-L57](https://github.com//github.com/Microsoft/TypeScript/blob/025d82633915b67003ea38ba40b9239a19721c13/src/compiler/emitter.ts/issues/L56-L57) +* **router:** support non-NgFactory promise in loadChildren typings ([#29832](https://github.com/angular/angular/issues/29832)) ([2bfb6a0](https://github.com/angular/angular/commit/2bfb6a0)) + + + # [8.0.0-beta.12](https://github.com/angular/angular/compare/8.0.0-beta.11...8.0.0-beta.12) (2019-04-13) diff --git a/package.json b/package.json index 65a22cb0ef..ba6d03a55e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "8.0.0-beta.12", + "version": "8.0.0-beta.13", "private": true, "branchPattern": "2.0.*", "description": "Angular - a web framework for modern web apps", From ca2462cff726ce334fa1d14eb1e7a35737b9e69d Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Tue, 16 Apr 2019 16:58:44 -0700 Subject: [PATCH 0760/1073] fix(ivy): support providing components and dirs in tests (#29945) Previous to this commit, providing a component or directive in a test module without @Injectable() would throw because the injectable factory would not be found. Providing components in tests in addition to declaring or importing them is not necessary, but it should not throw an error. This commit ensures factory data is saved when component defs and directive defs are created, which allows them to be processed by the module injector. Note that bootstrapping is still required for this setup to work because directiveInject() does not support cases where the view has not been created. This case will be handled in a future commit. PR Close #29945 --- integration/_payload-limits.json | 2 +- packages/core/src/render3/definition.ts | 11 +++ packages/core/src/render3/jit/directive.ts | 12 +++ .../core/test/acceptance/providers_spec.ts | 95 ++++++++++++++++++- .../cyclic_import/bundle.golden_symbols.json | 6 ++ .../hello_world/bundle.golden_symbols.json | 6 ++ .../inherit_definition_feature_spec.ts | 50 ---------- 7 files changed, 129 insertions(+), 53 deletions(-) diff --git a/integration/_payload-limits.json b/integration/_payload-limits.json index 2d9ba4c9b0..c35f27442b 100644 --- a/integration/_payload-limits.json +++ b/integration/_payload-limits.json @@ -12,7 +12,7 @@ "master": { "uncompressed": { "runtime": 1440, - "main": 14287, + "main": 14487, "polyfills": 43567 } } diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 5c1fe79af0..8bc33fd507 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -9,6 +9,7 @@ import '../util/ng_dev_mode'; import {ChangeDetectionStrategy} from '../change_detection/constants'; +import {NG_INJECTABLE_DEF, ɵɵdefineInjectable} from '../di/interface/defs'; import {Mutable, Type} from '../interface/type'; import {NgModuleDef} from '../metadata/ng_module'; import {SchemaMetadata} from '../metadata/schema'; @@ -300,7 +301,17 @@ export function ɵɵdefineComponent(componentDefinition: { def.pipeDefs = pipeTypes ? () => (typeof pipeTypes === 'function' ? pipeTypes() : pipeTypes).map(extractPipeDef) : null; + + // Add ngInjectableDef so components are reachable through the module injector by default + // (unless it has already been set by the @Injectable decorator). This is mostly to + // support injecting components in tests. In real application code, components should + // be retrieved through the node injector, so this isn't a problem. + if (!type.hasOwnProperty(NG_INJECTABLE_DEF)) { + (type as any)[NG_INJECTABLE_DEF] = + ɵɵdefineInjectable({factory: componentDefinition.factory as() => T}); + } }) as never; + return def as never; } diff --git a/packages/core/src/render3/jit/directive.ts b/packages/core/src/render3/jit/directive.ts index e59f8017ef..6306a5bc94 100644 --- a/packages/core/src/render3/jit/directive.ts +++ b/packages/core/src/render3/jit/directive.ts @@ -9,6 +9,7 @@ import {R3DirectiveMetadataFacade, getCompilerFacade} from '../../compiler/compiler_facade'; import {R3ComponentMetadataFacade, R3QueryMetadataFacade} from '../../compiler/compiler_facade_interface'; import {resolveForwardRef} from '../../di/forward_ref'; +import {compileInjectable} from '../../di/jit/injectable'; import {getReflect, reflectDependencies} from '../../di/jit/util'; import {Type} from '../../interface/type'; import {Query} from '../../metadata/di'; @@ -93,6 +94,12 @@ export function compileComponent(type: Type, metadata: Component): void { // Make the property configurable in dev mode to allow overriding in tests configurable: !!ngDevMode, }); + + + // Add ngInjectableDef so components are reachable through the module injector by default + // This is mostly to support injecting components in tests. In real application code, + // components should be retrieved through the node injector, so this isn't a problem. + compileInjectable(type); } function hasSelectorScope(component: Type): component is Type& @@ -125,6 +132,11 @@ export function compileDirective(type: Type, directive: Directive): void { // Make the property configurable in dev mode to allow overriding in tests configurable: !!ngDevMode, }); + + // Add ngInjectableDef so directives are reachable through the module injector by default + // This is mostly to support injecting directives in tests. In real application code, + // directives should be retrieved through the node injector, so this isn't a problem. + compileInjectable(type); } export function extendsDirectlyFromObject(type: Type): boolean { diff --git a/packages/core/test/acceptance/providers_spec.ts b/packages/core/test/acceptance/providers_spec.ts index e5c6d0bd4b..9f91576bb8 100644 --- a/packages/core/test/acceptance/providers_spec.ts +++ b/packages/core/test/acceptance/providers_spec.ts @@ -6,12 +6,54 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, Injectable} from '@angular/core'; +import {Component, Directive, Inject, Injectable, InjectionToken} from '@angular/core'; import {TestBed} from '@angular/core/testing'; +import {By} from '@angular/platform-browser'; import {onlyInIvy} from '@angular/private/testing'; - describe('providers', () => { + + describe('inheritance', () => { + + it('should NOT inherit providers', () => { + const SOME_DIRS = new InjectionToken('someDirs'); + + @Directive({ + selector: '[super-dir]', + providers: [{provide: SOME_DIRS, useClass: SuperDirective, multi: true}] + }) + class SuperDirective { + } + + @Directive({ + selector: '[sub-dir]', + providers: [{provide: SOME_DIRS, useClass: SubDirective, multi: true}] + }) + class SubDirective extends SuperDirective { + } + + @Directive({selector: '[other-dir]'}) + class OtherDirective { + constructor(@Inject(SOME_DIRS) public dirs: any) {} + } + + @Component({selector: 'app-comp', template: `
    `}) + class App { + } + + TestBed.configureTestingModule( + {declarations: [SuperDirective, SubDirective, OtherDirective, App]}); + + const fixture = TestBed.createComponent(App); + fixture.detectChanges(); + + const otherDir = fixture.debugElement.query(By.css('div')).injector.get(OtherDirective); + expect(otherDir.dirs.length).toEqual(1); + expect(otherDir.dirs[0] instanceof SubDirective).toBe(true); + }); + + }); + describe('lifecycles', () => { it('should inherit ngOnDestroy hooks on providers', () => { const logs: string[] = []; @@ -181,4 +223,53 @@ describe('providers', () => { }); }); + + describe('components and directives', () => { + + class MyService { + value = 'some value'; + } + + @Component({selector: 'my-comp', template: ``}) + class MyComp { + constructor(public svc: MyService) {} + } + + @Directive({selector: '[some-dir]'}) + class MyDir { + constructor(public svc: MyService) {} + } + + it('should support providing components in tests without @Injectable', () => { + @Component({selector: 'test-comp', template: ''}) + class TestComp { + } + + TestBed.configureTestingModule({ + declarations: [TestComp, MyComp], + // providing MyComp is unnecessary but it shouldn't throw + providers: [MyComp, MyService], + }); + + const fixture = TestBed.createComponent(TestComp); + const myCompInstance = fixture.debugElement.query(By.css('my-comp')).injector.get(MyComp); + expect(myCompInstance.svc.value).toEqual('some value'); + }); + + it('should support providing directives in tests without @Injectable', () => { + @Component({selector: 'test-comp', template: '
    '}) + class TestComp { + } + + TestBed.configureTestingModule({ + declarations: [TestComp, MyDir], + // providing MyDir is unnecessary but it shouldn't throw + providers: [MyDir, MyService], + }); + + const fixture = TestBed.createComponent(TestComp); + const myCompInstance = fixture.debugElement.query(By.css('div')).injector.get(MyDir); + expect(myCompInstance.svc.value).toEqual('some value'); + }); + }); }); diff --git a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json index acb85251e0..77cd3d5d65 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -83,6 +83,9 @@ { "name": "NG_ELEMENT_ID" }, + { + "name": "NG_INJECTABLE_DEF" + }, { "name": "NG_PIPE_DEF" }, @@ -680,6 +683,9 @@ { "name": "ɵɵdefineComponent" }, + { + "name": "ɵɵdefineInjectable" + }, { "name": "ɵɵdefineInjector" }, diff --git a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json index 99e9f7e146..0f92586a4d 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -71,6 +71,9 @@ { "name": "NG_ELEMENT_ID" }, + { + "name": "NG_INJECTABLE_DEF" + }, { "name": "NG_PIPE_DEF" }, @@ -491,6 +494,9 @@ { "name": "ɵɵdefineComponent" }, + { + "name": "ɵɵdefineInjectable" + }, { "name": "ɵɵnamespaceHTML" }, diff --git a/packages/core/test/render3/inherit_definition_feature_spec.ts b/packages/core/test/render3/inherit_definition_feature_spec.ts index 910878d2ff..b9155bea2d 100644 --- a/packages/core/test/render3/inherit_definition_feature_spec.ts +++ b/packages/core/test/render3/inherit_definition_feature_spec.ts @@ -636,54 +636,4 @@ describe('InheritDefinitionFeature', () => { }).toThrowError('Directives cannot inherit Components'); }); - it('should NOT inherit providers', () => { - let otherDir !: OtherDirective; - - const SOME_DIRS = new InjectionToken('someDirs'); - - // providers: [{ provide: SOME_DIRS, useClass: SuperDirective, multi: true }] - class SuperDirective { - static ngDirectiveDef = ɵɵdefineDirective({ - type: SuperDirective, - selectors: [['', 'superDir', '']], - factory: () => new SuperDirective(), - features: - [ɵɵProvidersFeature([{provide: SOME_DIRS, useClass: SuperDirective, multi: true}])], - }); - } - - // providers: [{ provide: SOME_DIRS, useClass: SubDirective, multi: true }] - class SubDirective extends SuperDirective { - static ngDirectiveDef = ɵɵdefineDirective({ - type: SubDirective, - selectors: [['', 'subDir', '']], - factory: () => new SubDirective(), - features: [ - ɵɵProvidersFeature([{provide: SOME_DIRS, useClass: SubDirective, multi: true}]), - ɵɵInheritDefinitionFeature - ], - }); - } - - class OtherDirective { - constructor(@Inject(SOME_DIRS) public dirs: any) {} - - static ngDirectiveDef = ɵɵdefineDirective({ - type: OtherDirective, - selectors: [['', 'otherDir', '']], - factory: () => otherDir = new OtherDirective(ɵɵdirectiveInject(SOME_DIRS)), - }); - } - - /**
    */ - const App = createComponent('app', (rf: RenderFlags, ctx: any) => { - if (rf & RenderFlags.Create) { - ɵɵelement(0, 'div', ['otherDir', '', 'subDir', '']); - } - }, 1, 0, [OtherDirective, SubDirective, SuperDirective]); - - const fixture = new ComponentFixture(App); - expect(otherDir.dirs.length).toEqual(1); - expect(otherDir.dirs[0] instanceof SubDirective).toBe(true); - }); }); From d9c39dcab0beae8ae0617e025d4331b294e8f8df Mon Sep 17 00:00:00 2001 From: Kara Erickson Date: Tue, 16 Apr 2019 19:03:40 -0700 Subject: [PATCH 0761/1073] fix(ivy): directiveInject should fall back to inject (#29948) If a component has its definition set by defineComponent (as opposed to JIT getter), then it will generate a factory that uses directiveInject() to retrieve its dependencies. This can be problematic in test code because tests could use the injection utility before bootstrapping the component, and directiveInject() relies on the view having been created. This commit tweaks directiveInject() to fall back to inject() if the view has not been created. This will allow injection to work in tests even if it is called before the component is bootstrapped. PR Close #29948 --- packages/core/src/render3/instructions/di.ts | 10 ++++++++-- packages/core/test/acceptance/providers_spec.ts | 13 ++++++++++++- .../test/bundling/todo/bundle.golden_symbols.json | 9 +++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/packages/core/src/render3/instructions/di.ts b/packages/core/src/render3/instructions/di.ts index 49f60e7a1f..7bb92341a7 100644 --- a/packages/core/src/render3/instructions/di.ts +++ b/packages/core/src/render3/instructions/di.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ import {InjectFlags, InjectionToken, resolveForwardRef} from '../../di'; +import {ɵɵinject} from '../../di/injector_compatibility'; import {Type} from '../../interface/type'; import {getOrCreateInjectable, injectAttributeImpl} from '../di'; import {TContainerNode, TElementContainerNode, TElementNode} from '../interfaces/node'; @@ -40,9 +41,14 @@ export function ɵɵdirectiveInject(token: Type| InjectionToken, flags: export function ɵɵdirectiveInject( token: Type| InjectionToken, flags = InjectFlags.Default): T|null { token = resolveForwardRef(token); + const lView = getLView(); + // Fall back to inject() if view hasn't been created. This situation can happen in tests + // if inject utilities are used before bootstrapping. + if (lView == null) return ɵɵinject(token, flags); + return getOrCreateInjectable( - getPreviousOrParentTNode() as TElementNode | TContainerNode | TElementContainerNode, - getLView(), token, flags); + getPreviousOrParentTNode() as TElementNode | TContainerNode | TElementContainerNode, lView, + token, flags); } /** diff --git a/packages/core/test/acceptance/providers_spec.ts b/packages/core/test/acceptance/providers_spec.ts index 9f91576bb8..41060ea77f 100644 --- a/packages/core/test/acceptance/providers_spec.ts +++ b/packages/core/test/acceptance/providers_spec.ts @@ -7,7 +7,7 @@ */ import {Component, Directive, Inject, Injectable, InjectionToken} from '@angular/core'; -import {TestBed} from '@angular/core/testing'; +import {TestBed, async, inject} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; import {onlyInIvy} from '@angular/private/testing'; @@ -271,5 +271,16 @@ describe('providers', () => { const myCompInstance = fixture.debugElement.query(By.css('div')).injector.get(MyDir); expect(myCompInstance.svc.value).toEqual('some value'); }); + + describe('injection without bootstrapping', () => { + beforeEach(() => { + TestBed.configureTestingModule({declarations: [MyComp], providers: [MyComp, MyService]}); + }); + + it('should support injecting without bootstrapping', + async(inject([MyComp, MyService], (comp: MyComp, service: MyService) => { + expect(comp.svc.value).toEqual('some value'); + }))); + }); }); }); diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 8b4cd066a4..5aa942157e 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -359,6 +359,9 @@ { "name": "_c9" }, + { + "name": "_currentInjector" + }, { "name": "_currentNamespace" }, @@ -902,6 +905,9 @@ { "name": "injectElementRef" }, + { + "name": "injectInjectorOnly" + }, { "name": "injectRootLimpMode" }, @@ -1355,6 +1361,9 @@ { "name": "ɵɵgetCurrentView" }, + { + "name": "ɵɵinject" + }, { "name": "ɵɵinterpolation1" }, From a48d288ff8d12166f23446d485da66016c15b783 Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Tue, 16 Apr 2019 13:16:46 -0700 Subject: [PATCH 0762/1073] build(language-service): no need to bootstrap init_node_spec.js (#29937) PR Close #29937 --- packages/language-service/test/BUILD.bazel | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/language-service/test/BUILD.bazel b/packages/language-service/test/BUILD.bazel index 52501d9b0d..0348a26aac 100644 --- a/packages/language-service/test/BUILD.bazel +++ b/packages/language-service/test/BUILD.bazel @@ -15,7 +15,6 @@ ts_library( jasmine_node_test( name = "test", - bootstrap = ["angular/tools/testing/init_node_spec.js"], data = [ "//packages/common:npm_package", "//packages/compiler:npm_package", @@ -27,6 +26,5 @@ jasmine_node_test( ], deps = [ ":test_lib", - "//tools/testing:node", ], ) From ca9b3eed9e91c186a5d1c7bb059cc4aa404e3437 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Wed, 17 Apr 2019 09:36:49 +0300 Subject: [PATCH 0763/1073] refactor(docs-infra): switch `test-pwa-score.js` to async/await (#29953) PR Close #29953 --- aio/scripts/test-pwa-score.js | 73 +++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/aio/scripts/test-pwa-score.js b/aio/scripts/test-pwa-score.js index abc466d888..b95d4eba6a 100644 --- a/aio/scripts/test-pwa-score.js +++ b/aio/scripts/test-pwa-score.js @@ -2,7 +2,9 @@ /** * Usage: - * node scripts/test-pwa-score [] + * ```sh + * node scripts/test-pwa-score [] + * ``` * * Fails if the score is below ``. * If `` is defined, the full results will be logged there. @@ -32,7 +34,7 @@ if (process.env.CI) { _main(process.argv.slice(2)); // Functions - Definitions -function _main(args) { +async function _main(args) { const {url, minScore, logFile} = parseInput(args); const isOnHttp = /^http:/.test(url); @@ -44,10 +46,13 @@ function _main(args) { logger.setLevel(LIGHTHOUSE_FLAGS.logLevel); - launchChromeAndRunLighthouse(url, LIGHTHOUSE_FLAGS, config). - then(results => processResults(results, logFile)). - then(score => evaluateScore(minScore, score)). - catch(onError); + try { + const results = await launchChromeAndRunLighthouse(url, LIGHTHOUSE_FLAGS, config); + const score = await processResults(results, logFile); + evaluateScore(minScore, score); + } catch (err) { + onError(err); + } } function evaluateScore(expectedScore, actualScore) { @@ -60,13 +65,15 @@ function evaluateScore(expectedScore, actualScore) { } } -function launchChromeAndRunLighthouse(url, flags, config) { - return chromeLauncher.launch(CHROME_LAUNCH_OPTS).then(chrome => { - flags.port = chrome.port; - return lighthouse(url, flags, config). - then(results => chrome.kill().then(() => results)). - catch(err => chrome.kill().then(() => { throw err; }, () => { throw err; })); - }); +async function launchChromeAndRunLighthouse(url, flags, config) { + const chrome = await chromeLauncher.launch(CHROME_LAUNCH_OPTS); + flags.port = chrome.port; + + try { + return await lighthouse(url, flags, config); + } finally { + await chrome.kill(); + } } function onError(err) { @@ -88,33 +95,31 @@ function parseInput(args) { return {url, minScore, logFile}; } -function processResults(results, logFile) { +async function processResults(results, logFile) { + const lhVersion = results.lhr.lighthouseVersion; const categories = results.lhr.categories; const report = results.report; - return Promise.resolve(). - then(() => { - if (logFile) { - console.log(`Saving results in '${logFile}'...`); - console.log(`(LightHouse viewer: ${VIEWER_URL})`); + if (logFile) { + console.log(`\nSaving results in '${logFile}'...`); + console.log(`(LightHouse viewer: ${VIEWER_URL})`); - return printer.write(report, printer.OutputMode.json, logFile); - } - }). - then(() => { - const categoryData = Object.keys(categories).map(name => categories[name]); - const maxTitleLen = Math.max(...categoryData.map(({title}) => title.length)); + await printer.write(report, printer.OutputMode.json, logFile); + } - console.log('\nLighthouse version:', results.lhr.lighthouseVersion); + const categoryData = Object.keys(categories).map(name => categories[name]); + const maxTitleLen = Math.max(...categoryData.map(({title}) => title.length)); - console.log('\nAudit scores:'); - categoryData.forEach(({title, score}) => { - const paddedTitle = `${title}:`.padEnd(maxTitleLen + 1); - const paddedScore = (score * 100).toFixed(0).padStart(3); - console.log(` - ${paddedTitle} ${paddedScore} / 100`); - }); - }). - then(() => categories.pwa.score * 100); + console.log(`\nLighthouse version: ${lhVersion}`); + + console.log('\nAudit scores:'); + categoryData.forEach(({title, score}) => { + const paddedTitle = `${title}:`.padEnd(maxTitleLen + 1); + const paddedScore = (score * 100).toFixed(0).padStart(3); + console.log(` - ${paddedTitle} ${paddedScore} / 100`); + }); + + return categories.pwa.score * 100; } function skipHttpsAudits(config) { From 60e9d2da4f3a204161897d04d5363deb81f20f11 Mon Sep 17 00:00:00 2001 From: George Kalpakas Date: Wed, 17 Apr 2019 09:36:50 +0300 Subject: [PATCH 0764/1073] ci(docs-infra): increase wait for SW on localhost to avoid CI flakes (#29953) The server used for testing on localhost has less optimizations (e.g. serves uncompressed files), so we need to wait longer the ServiceWorker to be loaded and registered to allow Lighthouse to reliably detect it, especially on slower environments (e.g. CI). Related: https://github.com/GoogleChrome/lighthouse/issues/5527#issuecomment-483710849 Fixes #29910 PR Close #29953 --- .circleci/config.yml | 10 ++-------- aio/scripts/test-pwa-score.js | 23 ++++++++++++++++++----- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 68d7ca043c..dc1097322c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -249,10 +249,7 @@ jobs: - run: yarn --cwd aio lint # Run PWA-score tests # (Run before unit and e2e tests, which destroy the `dist/` directory.) - # Temporarily lowering the min required PWA score to avoid flakes on CI. - # TODO(gkalpak): Re-enable once https://github.com/angular/angular/issues/29910 is resolved. - # - run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE - - run: yarn --cwd aio test-pwa-score-localhost 70 + - run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE # Check the bundle sizes. # (Run before unit and e2e tests, which destroy the `dist/` directory.) - run: yarn --cwd aio payload-size @@ -287,10 +284,7 @@ jobs: - run: yarn --cwd aio build-local --progress=false # Run PWA-score tests # (Run before unit and e2e tests, which destroy the `dist/` directory.) - # Temporarily lowering the min required PWA score to avoid flakes on CI. - # TODO(gkalpak): Re-enable once https://github.com/angular/angular/issues/29910 is resolved. - # - run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE - - run: yarn --cwd aio test-pwa-score-localhost 70 + - run: yarn --cwd aio test-pwa-score-localhost $CI_AIO_MIN_PWA_SCORE # Run unit tests - run: yarn --cwd aio test --progress=false --watch=false # Run e2e tests diff --git a/aio/scripts/test-pwa-score.js b/aio/scripts/test-pwa-score.js index b95d4eba6a..2b1bff2bfd 100644 --- a/aio/scripts/test-pwa-score.js +++ b/aio/scripts/test-pwa-score.js @@ -16,12 +16,12 @@ const chromeLauncher = require('chrome-launcher'); const lighthouse = require('lighthouse'); const printer = require('lighthouse/lighthouse-cli/printer'); -const config = require('lighthouse/lighthouse-core/config/default-config.js'); const logger = require('lighthouse-logger'); // Constants const CHROME_LAUNCH_OPTS = {}; const LIGHTHOUSE_FLAGS = {logLevel: 'info'}; +const LONG_WAIT_FOR_SW_DELAY = 5000; const SKIPPED_HTTPS_AUDITS = ['redirects-http']; const VIEWER_URL = 'https://googlechrome.github.io/lighthouse/viewer/'; @@ -37,12 +37,18 @@ _main(process.argv.slice(2)); async function _main(args) { const {url, minScore, logFile} = parseInput(args); const isOnHttp = /^http:/.test(url); + const isOnLocalhost = /\/\/localhost\b/.test(url); + const config = {extends: 'lighthouse:default'}; console.log(`Running PWA audit for '${url}'...`); - if (isOnHttp) { - skipHttpsAudits(config); - } + // If testing on HTTP, skip HTTPS-specific tests. + // (Note: Browsers special-case localhost and run ServiceWorker even on HTTP.) + if (isOnHttp) skipHttpsAudits(config); + + // If testing on localhost, where the server has less optimizations (e.g. no file compression), + // wait longer for the ServiceWorker to be registered, so Lighthouse can reliably detect it. + if (isOnLocalhost) waitLongerForSw(config); logger.setLevel(LIGHTHOUSE_FLAGS.logLevel); @@ -124,5 +130,12 @@ async function processResults(results, logFile) { function skipHttpsAudits(config) { console.info(`Skipping HTTPS-related audits (${SKIPPED_HTTPS_AUDITS.join(', ')})...`); - config.settings.skipAudits = SKIPPED_HTTPS_AUDITS; + const settings = config.settings || (config.settings = {}); + settings.skipAudits = SKIPPED_HTTPS_AUDITS; +} + +function waitLongerForSw(config) { + console.info(`Will wait longer for ServiceWorker (${LONG_WAIT_FOR_SW_DELAY}ms)...`); + const passes = config.passes || (config.passes = []); + passes.push({passName: 'defaultPass', pauseAfterLoadMs: LONG_WAIT_FOR_SW_DELAY}); } From 1a56cd5c0b55fc4ed889d934c7ba0c8e5fcd2323 Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Tue, 16 Apr 2019 16:36:47 -0700 Subject: [PATCH 0765/1073] fix(language-service): Use proper types instead of any (#29942) PR Close #29942 --- packages/language-service/bundles/BUILD.bazel | 1 + packages/language-service/src/ts_plugin.ts | 13 +++++++------ packages/language-service/test/ts_plugin_spec.ts | 9 +++++++-- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/packages/language-service/bundles/BUILD.bazel b/packages/language-service/bundles/BUILD.bazel index 7206dcc92b..20501ae5c9 100644 --- a/packages/language-service/bundles/BUILD.bazel +++ b/packages/language-service/bundles/BUILD.bazel @@ -7,6 +7,7 @@ ls_rollup_bundle( "fs": "fs", "path": "path", "typescript": "ts", + "typescript/lib/tsserverlibrary": "tsserverlibrary", }, license_banner = "banner.js.txt", visibility = ["//packages/language-service:__pkg__"], diff --git a/packages/language-service/src/ts_plugin.ts b/packages/language-service/src/ts_plugin.ts index 4bd0f83c60..ac39c726ba 100644 --- a/packages/language-service/src/ts_plugin.ts +++ b/packages/language-service/src/ts_plugin.ts @@ -6,18 +6,19 @@ * found in the LICENSE file at https://angular.io/license */ -import * as ts from 'typescript'; +import * as ts from 'typescript/lib/tsserverlibrary'; import {createLanguageService} from './language_service'; import {Completion, Diagnostic, DiagnosticMessageChain} from './types'; import {TypeScriptServiceHost} from './typescript_host'; -const projectHostMap = new WeakMap(); +const projectHostMap = new WeakMap(); -export function getExternalFiles(project: any): string[]|undefined { +export function getExternalFiles(project: ts.server.Project): string[]|undefined { const host = projectHostMap.get(project); if (host) { - return host.getTemplateReferences(); + const externalFiles = host.getTemplateReferences(); + return externalFiles; } } @@ -62,7 +63,7 @@ function diagnosticToDiagnostic(d: Diagnostic, file: ts.SourceFile): ts.Diagnost return result; } -export function create(info: any /* ts.server.PluginCreateInfo */): ts.LanguageService { +export function create(info: ts.server.PluginCreateInfo): ts.LanguageService { const oldLS: ts.LanguageService = info.languageService; const proxy: ts.LanguageService = Object.assign({}, oldLS); const logger = info.project.projectService.logger; @@ -78,7 +79,7 @@ export function create(info: any /* ts.server.PluginCreateInfo */): ts.LanguageS } const serviceHost = new TypeScriptServiceHost(info.languageServiceHost, oldLS); - const ls = createLanguageService(serviceHost as any); + const ls = createLanguageService(serviceHost); serviceHost.setSite(ls); projectHostMap.set(info.project, serviceHost); diff --git a/packages/language-service/test/ts_plugin_spec.ts b/packages/language-service/test/ts_plugin_spec.ts index e792a8d439..5948391008 100644 --- a/packages/language-service/test/ts_plugin_spec.ts +++ b/packages/language-service/test/ts_plugin_spec.ts @@ -32,8 +32,13 @@ describe('plugin', () => { }); - let plugin = create( - {ts: ts, languageService: service, project: mockProject, languageServiceHost: mockHost}); + let plugin = create({ + languageService: service, + project: mockProject as any, + languageServiceHost: mockHost, + serverHost: {} as any, + config: {}, + }); it('should not report template errors on tour of heroes', () => { for (let source of program !.getSourceFiles()) { From 5fee9daa5bcdb889f001adab576105edd9c0ae31 Mon Sep 17 00:00:00 2001 From: Pawel Kozlowski Date: Wed, 17 Apr 2019 15:28:54 +0200 Subject: [PATCH 0766/1073] fix(ivy): properly coalesce event handler in presence of queries (#29957) The `TNode.cleanup` data structure can contain sequences of 4-element sequence of entries (event handlers, directive outputs) mixed with 2-element sequence of entries (QueryList cleanup). Before this fix we would always skip 4 elements in the `TNode.cleanup` while looking up event handler cleanups. 4-element skips are not correct in case of query cleanup presence and this commit corrects the algorithm to jump 4 or 2 elements depending on a type of cleanup encountered. PR Close #29957 --- .../core/src/render3/instructions/listener.ts | 7 +++-- .../core/test/acceptance/listener_spec.ts | 31 ++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/packages/core/src/render3/instructions/listener.ts b/packages/core/src/render3/instructions/listener.ts index fb02629b04..265765498e 100644 --- a/packages/core/src/render3/instructions/listener.ts +++ b/packages/core/src/render3/instructions/listener.ts @@ -75,7 +75,8 @@ function findExistingListener( const tCleanup = tView.cleanup; if (tCleanup != null) { for (let i = 0; i < tCleanup.length - 1; i += 2) { - if (tCleanup[i] === eventName && tCleanup[i + 1] === tNodeIdx) { + const cleanupEventName = tCleanup[i]; + if (cleanupEventName === eventName && tCleanup[i + 1] === tNodeIdx) { // We have found a matching event name on the same node but it might not have been // registered yet, so we must explicitly verify entries in the LView cleanup data // structures. @@ -88,7 +89,9 @@ function findExistingListener( // blocks of 4 or 2 items in the tView.cleanup and this is why we iterate over 2 elements // first and jump another 2 elements if we detect listeners cleanup (4 elements). Also check // documentation of TView.cleanup for more details of this data structure layout. - i += 2; + if (typeof cleanupEventName === 'string') { + i += 2; + } } } return null; diff --git a/packages/core/test/acceptance/listener_spec.ts b/packages/core/test/acceptance/listener_spec.ts index b241a26383..08eec4c573 100644 --- a/packages/core/test/acceptance/listener_spec.ts +++ b/packages/core/test/acceptance/listener_spec.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {Component, Directive, ErrorHandler, HostListener} from '@angular/core'; +import {Component, Directive, ErrorHandler, HostListener, QueryList, ViewChildren} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; import {onlyInIvy} from '@angular/private/testing'; @@ -105,6 +105,35 @@ describe('event listeners', () => { expect(buttonDebugEls[1].injector.get(MdButton).counter).toBe(1); }); + onlyInIvy('ngDevMode.rendererAddEventListener counters are only available in ivy') + .it('should coalesce multiple event listeners in presence of queries', () => { + + @Component({ + selector: 'test-cmpt', + template: `` + }) + class TestCmpt { + counter = 0; + + @ViewChildren('nothing') nothing !: QueryList; + } + + TestBed.configureTestingModule({declarations: [TestCmpt, LikesClicks]}); + const noOfEventListenersRegisteredSoFar = getNoOfNativeListeners(); + const fixture = TestBed.createComponent(TestCmpt); + fixture.detectChanges(); + const buttonDebugEl = fixture.debugElement.query(By.css('button')); + + // We want to assert that only one native event handler was registered but still all + // directives are notified when an event fires. This assertion can only be verified in + // the ngDevMode (but the coalescing always happens!). + ngDevMode && expect(getNoOfNativeListeners()).toBe(noOfEventListenersRegisteredSoFar + 1); + + buttonDebugEl.nativeElement.click(); + expect(buttonDebugEl.injector.get(LikesClicks).counter).toBe(1); + expect(fixture.componentInstance.counter).toBe(1); + }); + it('should try to execute remaining coalesced listeners if one of the listeners throws', () => { From 696e520842c3d2d2d9f5454875714becc72df114 Mon Sep 17 00:00:00 2001 From: Andrew Kushnir Date: Tue, 16 Apr 2019 18:11:28 -0700 Subject: [PATCH 0767/1073] fix(ivy): make metadata calls side-effect free in Closure (#29947) When compiling Angular classes, the compiler may decide to append statements with specific metadata that's only required for JIT. This includes things like decorator metadata as well as NgModule scope data. When the compiler generates such calls, the call sites are marked with Uglify's PURE annotation, so the optimizer will remove them in production builds. However, Closure does not have the PURE (or similar) annotation. We have a utility function `noSideEffects` in the runtime for this purpose. This commit wraps `setClassMetadata` and `setNgModuleScope` function bodies in `noSideEffect` closures to allow Closure remove them. PR Close #29947 --- packages/core/src/render3/definition.ts | 10 ++-- packages/core/src/render3/metadata.ts | 65 +++++++++++++------------ 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/packages/core/src/render3/definition.ts b/packages/core/src/render3/definition.ts index 8bc33fd507..1293409123 100644 --- a/packages/core/src/render3/definition.ts +++ b/packages/core/src/render3/definition.ts @@ -402,10 +402,12 @@ export function ɵɵsetNgModuleScope(type: any, scope: { */ exports?: Type[] | (() => Type[]); }): void { - const ngModuleDef = getNgModuleDef(type, true); - ngModuleDef.declarations = scope.declarations || EMPTY_ARRAY; - ngModuleDef.imports = scope.imports || EMPTY_ARRAY; - ngModuleDef.exports = scope.exports || EMPTY_ARRAY; + return noSideEffects(() => { + const ngModuleDef = getNgModuleDef(type, true); + ngModuleDef.declarations = scope.declarations || EMPTY_ARRAY; + ngModuleDef.imports = scope.imports || EMPTY_ARRAY; + ngModuleDef.exports = scope.exports || EMPTY_ARRAY; + }) as never; } /** diff --git a/packages/core/src/render3/metadata.ts b/packages/core/src/render3/metadata.ts index e1e1974588..4927c671e0 100644 --- a/packages/core/src/render3/metadata.ts +++ b/packages/core/src/render3/metadata.ts @@ -7,6 +7,7 @@ */ import {Type} from '../interface/type'; +import {noSideEffects} from '../util/closure'; interface TypeWithMetadata extends Type { decorators?: any[]; @@ -26,39 +27,41 @@ interface TypeWithMetadata extends Type { export function setClassMetadata( type: Type, decorators: any[] | null, ctorParameters: (() => any[]) | null, propDecorators: {[field: string]: any} | null): void { - const clazz = type as TypeWithMetadata; + return noSideEffects(() => { + const clazz = type as TypeWithMetadata; - // We determine whether a class has its own metadata by taking the metadata from the parent - // constructor and checking whether it's the same as the subclass metadata below. We can't use - // `hasOwnProperty` here because it doesn't work correctly in IE10 for static fields that are - // defined by TS. See https://github.com/angular/angular/pull/28439#issuecomment-459349218. - const parentPrototype = clazz.prototype ? Object.getPrototypeOf(clazz.prototype) : null; - const parentConstructor: TypeWithMetadata|null = parentPrototype && parentPrototype.constructor; + // We determine whether a class has its own metadata by taking the metadata from the parent + // constructor and checking whether it's the same as the subclass metadata below. We can't use + // `hasOwnProperty` here because it doesn't work correctly in IE10 for static fields that are + // defined by TS. See https://github.com/angular/angular/pull/28439#issuecomment-459349218. + const parentPrototype = clazz.prototype ? Object.getPrototypeOf(clazz.prototype) : null; + const parentConstructor: TypeWithMetadata|null = parentPrototype && parentPrototype.constructor; - if (decorators !== null) { - if (clazz.decorators !== undefined && - (!parentConstructor || parentConstructor.decorators !== clazz.decorators)) { - clazz.decorators.push(...decorators); - } else { - clazz.decorators = decorators; + if (decorators !== null) { + if (clazz.decorators !== undefined && + (!parentConstructor || parentConstructor.decorators !== clazz.decorators)) { + clazz.decorators.push(...decorators); + } else { + clazz.decorators = decorators; + } } - } - if (ctorParameters !== null) { - // Rather than merging, clobber the existing parameters. If other projects exist which use - // tsickle-style annotations and reflect over them in the same way, this could cause issues, - // but that is vanishingly unlikely. - clazz.ctorParameters = ctorParameters; - } - if (propDecorators !== null) { - // The property decorator objects are merged as it is possible different fields have different - // decorator types. Decorators on individual fields are not merged, as it's also incredibly - // unlikely that a field will be decorated both with an Angular decorator and a non-Angular - // decorator that's also been downleveled. - if (clazz.propDecorators !== undefined && - (!parentConstructor || parentConstructor.propDecorators !== clazz.propDecorators)) { - clazz.propDecorators = {...clazz.propDecorators, ...propDecorators}; - } else { - clazz.propDecorators = propDecorators; + if (ctorParameters !== null) { + // Rather than merging, clobber the existing parameters. If other projects exist which use + // tsickle-style annotations and reflect over them in the same way, this could cause issues, + // but that is vanishingly unlikely. + clazz.ctorParameters = ctorParameters; } - } + if (propDecorators !== null) { + // The property decorator objects are merged as it is possible different fields have different + // decorator types. Decorators on individual fields are not merged, as it's also incredibly + // unlikely that a field will be decorated both with an Angular decorator and a non-Angular + // decorator that's also been downleveled. + if (clazz.propDecorators !== undefined && + (!parentConstructor || parentConstructor.propDecorators !== clazz.propDecorators)) { + clazz.propDecorators = {...clazz.propDecorators, ...propDecorators}; + } else { + clazz.propDecorators = propDecorators; + } + } + }) as never; } From 725148a44db896f919fc0b6d7e256dbc35af3ec6 Mon Sep 17 00:00:00 2001 From: JoostK Date: Sat, 13 Apr 2019 19:06:21 +0200 Subject: [PATCH 0768/1073] feat(ivy): let ngtsc statically evaluate `Array.concat` calls (#29887) Previously, only static evaluation of `Array.slice` was implemented in ngtsc's static evaluator. This commit adds support for `Array.concat`. Closes #29835 PR Close #29887 --- .../src/ngtsc/partial_evaluator/src/builtin.ts | 18 ++++++++++++++++++ .../ngtsc/partial_evaluator/src/interpreter.ts | 4 +++- .../partial_evaluator/test/evaluator_spec.ts | 8 ++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/builtin.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/builtin.ts index 51373de9ba..6e40825840 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/builtin.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/builtin.ts @@ -22,3 +22,21 @@ export class ArraySliceBuiltinFn extends BuiltinFn { } } } + +export class ArrayConcatBuiltinFn extends BuiltinFn { + constructor(private node: ts.Node, private lhs: ResolvedValueArray) { super(); } + + evaluate(args: ResolvedValueArray): ResolvedValue { + const result: ResolvedValueArray = [...this.lhs]; + for (const arg of args) { + if (arg instanceof DynamicValue) { + result.push(DynamicValue.fromDynamicInput(this.node, arg)); + } else if (Array.isArray(arg)) { + result.push(...arg); + } else { + result.push(arg); + } + } + return result; + } +} diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts index 5b4cb6afc9..3e34af4bc6 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/src/interpreter.ts @@ -12,7 +12,7 @@ import {Reference} from '../../imports'; import {OwningModule} from '../../imports/src/references'; import {Declaration, ReflectionHost} from '../../reflection'; -import {ArraySliceBuiltinFn} from './builtin'; +import {ArrayConcatBuiltinFn, ArraySliceBuiltinFn} from './builtin'; import {DynamicValue} from './dynamic'; import {ForeignFunctionResolver, VisitedFilesCallback} from './interface'; import {BuiltinFn, EnumValue, ResolvedValue, ResolvedValueArray, ResolvedValueMap} from './result'; @@ -340,6 +340,8 @@ export class StaticInterpreter { return lhs.length; } else if (rhs === 'slice') { return new ArraySliceBuiltinFn(node, lhs); + } else if (rhs === 'concat') { + return new ArrayConcatBuiltinFn(node, lhs); } if (typeof rhs !== 'number' || !Number.isInteger(rhs)) { return DynamicValue.fromUnknown(node); diff --git a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts index da3b76b563..bdd0b2b089 100644 --- a/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts +++ b/packages/compiler-cli/src/ngtsc/partial_evaluator/test/evaluator_spec.ts @@ -130,6 +130,14 @@ describe('ngtsc metadata', () => { expect(evaluate(`const a = [1, 2, 3];`, 'a[\'slice\']()')).toEqual([1, 2, 3]); }); + it('array `concat` function works', () => { + expect(evaluate(`const a = [1, 2], b = [3, 4];`, 'a[\'concat\'](b)')).toEqual([1, 2, 3, 4]); + expect(evaluate(`const a = [1, 2], b = 3;`, 'a[\'concat\'](b)')).toEqual([1, 2, 3]); + expect(evaluate(`const a = [1, 2], b = 3, c = [4, 5];`, 'a[\'concat\'](b, c)')).toEqual([ + 1, 2, 3, 4, 5 + ]); + }); + it('negation works', () => { expect(evaluate(`const x = 3;`, '!x')).toEqual(false); expect(evaluate(`const x = 3;`, '!!x')).toEqual(true); From 83291f01b084b834d8375ff5ac2366fb47ca15c0 Mon Sep 17 00:00:00 2001 From: JoostK Date: Sat, 13 Apr 2019 18:28:27 +0200 Subject: [PATCH 0769/1073] fix(ivy): let ngtsc unwrap expressions when resolving `forwardRef` (#29886) Previously, ngtsc would fail to resolve `forwardRef` calls if they contained additional parenthesis or casts. This commit changes the behavior to first unwrap the AST nodes to see past such insignificant nodes, resolving the issue. Fixes #29639 PR Close #29886 --- packages/compiler-cli/src/ngtsc/annotations/src/util.ts | 2 ++ packages/compiler-cli/test/ngtsc/ngtsc_spec.ts | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/packages/compiler-cli/src/ngtsc/annotations/src/util.ts b/packages/compiler-cli/src/ngtsc/annotations/src/util.ts index de364a789c..74aa6bfb28 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/src/util.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/src/util.ts @@ -197,6 +197,7 @@ export function unwrapExpression(node: ts.Expression): ts.Expression { } function expandForwardRef(arg: ts.Expression): ts.Expression|null { + arg = unwrapExpression(arg); if (!ts.isArrowFunction(arg) && !ts.isFunctionExpression(arg)) { return null; } @@ -228,6 +229,7 @@ function expandForwardRef(arg: ts.Expression): ts.Expression|null { * expression otherwise */ export function unwrapForwardRef(node: ts.Expression, reflector: ReflectionHost): ts.Expression { + node = unwrapExpression(node); if (!ts.isCallExpression(node) || !ts.isIdentifier(node.expression) || node.arguments.length !== 1) { return node; diff --git a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts index e4a4be0fdf..e1bd81d02b 100644 --- a/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts +++ b/packages/compiler-cli/test/ngtsc/ngtsc_spec.ts @@ -1570,6 +1570,8 @@ describe('ngtsc behavioral tests', () => { @ContentChild(forwardRef(() => TemplateRef)) child: any; @ContentChild(forwardRef(function() { return ViewContainerRef; })) child2: any; + + @ContentChild((forwardRef((function() { return 'parens'; }) as any))) childInParens: any; } `); @@ -1579,6 +1581,9 @@ describe('ngtsc behavioral tests', () => { expect(jsContents).toMatch(contentQueryRegExp('TemplateRef', true)); // match `i0.ɵɵcontentQuery(dirIndex, ViewContainerRef, true, null)` expect(jsContents).toMatch(contentQueryRegExp('ViewContainerRef', true)); + // match `i0.ɵɵcontentQuery(dirIndex, _c0, true, null)` + expect(jsContents).toContain('_c0 = ["parens"];'); + expect(jsContents).toMatch(contentQueryRegExp('_c0', true)); }); it('should compile expressions that write keys', () => { From 7edfcf948faf35bcd62dbeafcfae23b0859248e3 Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Tue, 9 Apr 2019 17:30:35 -0700 Subject: [PATCH 0770/1073] build(bazel): update to nodejs rules 0.27.12 and pin versions in @angular/bazel peer deps and for @bazel/schematics (#29799) PR Close #29799 --- WORKSPACE | 4 +- integration/bazel/WORKSPACE | 4 +- integration/bazel/src/package.json | 4 +- integration/bazel/src/yarn.lock | 136 ++++++------------ package.json | 6 +- packages/bazel/package.json | 2 +- .../src/builders/files/WORKSPACE.template | 4 +- packages/bazel/src/schematics/ng-add/index.ts | 4 +- yarn.lock | 24 ++-- 9 files changed, 67 insertions(+), 121 deletions(-) diff --git a/WORKSPACE b/WORKSPACE index f7690a675c..edc016f060 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -15,8 +15,8 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") # Fetch rules_nodejs so we can install our npm dependencies http_archive( name = "build_bazel_rules_nodejs", - sha256 = "1fbea5f33a8cbf8fd798f4cf7973a9b09e53bda872c75b5665a92a6d28fbbb13", - urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.27.10/rules_nodejs-0.27.10.tar.gz"], + sha256 = "3a3efbf223f6de733475602844ad3a8faa02abda25ab8cfe1d1ed0db134887cf", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.27.12/rules_nodejs-0.27.12.tar.gz"], ) # Check the bazel version and download npm dependencies diff --git a/integration/bazel/WORKSPACE b/integration/bazel/WORKSPACE index 605e5ef048..53f174a705 100644 --- a/integration/bazel/WORKSPACE +++ b/integration/bazel/WORKSPACE @@ -5,8 +5,8 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") # Fetch rules_nodejs so we can install our npm dependencies http_archive( name = "build_bazel_rules_nodejs", - sha256 = "1fbea5f33a8cbf8fd798f4cf7973a9b09e53bda872c75b5665a92a6d28fbbb13", - urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.27.10/rules_nodejs-0.27.10.tar.gz"], + sha256 = "3a3efbf223f6de733475602844ad3a8faa02abda25ab8cfe1d1ed0db134887cf", + urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/0.27.12/rules_nodejs-0.27.12.tar.gz"], ) # Fetch sass rules for compiling sass files diff --git a/integration/bazel/src/package.json b/integration/bazel/src/package.json index 4877883502..ec2e70c655 100644 --- a/integration/bazel/src/package.json +++ b/integration/bazel/src/package.json @@ -19,8 +19,8 @@ "@angular/bazel": "packages-dist:bazel", "@angular/compiler": "packages-dist:compiler", "@angular/compiler-cli": "packages-dist:compiler-cli", - "@bazel/karma": "0.27.10", - "@bazel/typescript": "0.27.10", + "@bazel/karma": "0.27.12", + "@bazel/typescript": "0.27.12", "@types/jasmine": "2.8.8", "@types/source-map": "0.5.1", "protractor": "5.1.2", diff --git a/integration/bazel/src/yarn.lock b/integration/bazel/src/yarn.lock index 608b5af2aa..c596d0387c 100644 --- a/integration/bazel/src/yarn.lock +++ b/integration/bazel/src/yarn.lock @@ -2,62 +2,31 @@ # yarn lockfile v1 -"@angular-devkit/architect@^0.13.4": - version "0.13.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.13.6.tgz#7758ab9f288cfd4f64d8b88b0700bac5c4961d06" - integrity sha512-Cg9z4lmCvjt5uD00E/0tBRz3ESjYicmqT3NL/BIsNVNb+s1GwCCoPSOIM8Ss4nyGDtrdono1XKSOmkJnlzF3Cw== +"@angular-devkit/architect@^0.800.0-beta.11": + version "0.800.0-beta.11" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.800.0-beta.11.tgz#1b011623438e28cc0fd0000aa6c5ab6fb1f67e6d" + integrity sha512-ly40Tz6zJ83DQCZsjC8FLvkezIf4EULpaFCGsij8mR6DOtW3kYJ25lFwn3ISdrHDrLHNSiCqqCGzhCsm4VYJwA== dependencies: - "@angular-devkit/core" "7.3.6" - rxjs "6.3.3" + "@angular-devkit/core" "8.0.0-beta.11" + rxjs "6.4.0" -"@angular-devkit/core@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.3.tgz#cd6d5a8eca25ef07b6394bc2b08133d90d08d39f" - integrity sha512-fosULDtMoDWrOyUzTmBkJccOy7zodo02kENyKai7vOv9EWfv9jytkVdNc+jl0ys9OE2QadvSYBo49jhnZxFXfQ== +"@angular-devkit/core@8.0.0-beta.11", "@angular-devkit/core@^8.0.0-beta.11": + version "8.0.0-beta.11" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-8.0.0-beta.11.tgz#b16109c4d783abf1bba1113abbeae2e4c4651c20" + integrity sha512-oEyQKzKPzSl0AmQST/BTHIDELtiz4/ALhdog1iJqc4eaBxuGs8Y/HWLX1l4pgb+6X+WLsYOw/TNQmLdfzztwWA== dependencies: - ajv "6.9.1" - chokidar "2.0.4" + ajv "6.10.0" fast-json-stable-stringify "2.0.0" - rxjs "6.3.3" + rxjs "6.4.0" source-map "0.7.3" -"@angular-devkit/core@7.3.6": - version "7.3.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.6.tgz#bc11ca571187f0f0ce9df012332794907e0b8133" - integrity sha512-aoarMK0DJIdwjVA0OuQIN7b8nKPcF9n5vSMF7MFmhKpTw5/uV3SynQZbm3YCgylu/2CMuiTzKuAunnWWdli//g== +"@angular-devkit/schematics@8.0.0-beta.11", "@angular-devkit/schematics@^8.0.0-beta.11": + version "8.0.0-beta.11" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-8.0.0-beta.11.tgz#1ff032696b07acdcc40796ffaa1be47f2a96d005" + integrity sha512-0OfhXfmLLLGeB1YEYdJSmCmfCzVTcLlJU8o9pAeDcbs4NKIchhV3k26Zpj8xDeZb1x3y/Ek55P+BqBeMxHuP6g== dependencies: - ajv "6.9.1" - chokidar "2.0.4" - fast-json-stable-stringify "2.0.0" - rxjs "6.3.3" - source-map "0.7.3" - -"@angular-devkit/core@^7.0.4": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.1.2.tgz#86b0e5a4cdeaa3198f6b1b50e7e114fac403e57c" - integrity sha512-LyjHGuLnLWrgX7SYDkKmc3eW4H5uuaoC+CXYjRfgx3qundrLfvTCRgNGC6FPjhQNnVXH9qar+j9P1aMmKFb4Lw== - dependencies: - ajv "6.5.3" - chokidar "2.0.4" - fast-json-stable-stringify "2.0.0" - rxjs "6.3.3" - source-map "0.7.3" - -"@angular-devkit/schematics@7.3.6": - version "7.3.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.6.tgz#5580b730b1bae5397f5860cfb0d7270fec6e6deb" - integrity sha512-YXF7QusmMy3D9H0vNczc1n5BkuEHLwt7cW33euNeGNgTIsD0n6DrUhgClurXicnr2GNPSDYE5+3115lmJkhyrg== - dependencies: - "@angular-devkit/core" "7.3.6" - rxjs "6.3.3" - -"@angular-devkit/schematics@^7.3.0-rc.0": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.3.tgz#80e9dc3197a3181f32edfb5c07e7ac016eace7d3" - integrity sha512-SdDq9eKwceb6WLwci1fywtZ/kARR5CYyzi5dZIR1lOxrz00682uUBqH/X39mKdqc6eVqR7rtPceqNm6nQpOIMg== - dependencies: - "@angular-devkit/core" "7.3.3" - rxjs "6.3.3" + "@angular-devkit/core" "8.0.0-beta.11" + rxjs "6.4.0" "@angular/animations@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/animations": version "8.0.0-beta.11" @@ -67,11 +36,11 @@ "@angular/bazel@file:../../../../../../../Users/greg/google/gregmagolan/angular/dist/packages-dist/bazel": version "8.0.0-beta.11" dependencies: - "@angular-devkit/architect" "^0.13.4" - "@angular-devkit/core" "^7.0.4" - "@angular-devkit/schematics" "^7.3.0-rc.0" + "@angular-devkit/architect" "^0.800.0-beta.11" + "@angular-devkit/core" "^8.0.0-beta.11" + "@angular-devkit/schematics" "^8.0.0-beta.11" "@microsoft/api-extractor" "^7.0.21" - "@schematics/angular" "^7.3.5" + "@schematics/angular" "^8.0.0-beta.11" "@types/node" "6.0.84" semver "^5.6.0" shelljs "0.8.2" @@ -122,10 +91,10 @@ dependencies: tslib "^1.9.0" -"@bazel/karma@0.27.10": - version "0.27.10" - resolved "https://registry.yarnpkg.com/@bazel/karma/-/karma-0.27.10.tgz#7d686d3f785c654a3d966e1891d39a1a8ba8557b" - integrity sha512-CLbezRi5rXG0sjDwoDvaEhlpitAdMNxHmsNtY8ZxkxpajHEPBSxU8lCVKvuy2KB4AOyEGI5ECKqFtLc8RvDlVA== +"@bazel/karma@0.27.12": + version "0.27.12" + resolved "https://registry.yarnpkg.com/@bazel/karma/-/karma-0.27.12.tgz#a7c1648af93b4d376e4e3b6fc1c7006b4d79c092" + integrity sha512-LJAbNe8bR1vRLb8GqIbKzCpf8VMaTnM9jizxmsjkgdGjy9OgsseYbk6+70z1yx7s3QHPjj7JBqcx+d2yeXPo7g== dependencies: jasmine-core "2.8.0" karma "^4.0.0" @@ -139,10 +108,10 @@ semver "5.6.0" tmp "0.0.33" -"@bazel/typescript@0.27.10": - version "0.27.10" - resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.27.10.tgz#52d160dd13aba29f2c26851677f25c717afd2194" - integrity sha512-TeWlpalkAh0xfH9Jiirv5R54oWJTdyilj72HukUBdNUttJOT/cMqUsSqYTm+iArLiZrzaglMT70TKYizm8zaIg== +"@bazel/typescript@0.27.12": + version "0.27.12" + resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.27.12.tgz#79a6468cd8da096c4da151fac658f7f801a59948" + integrity sha512-5cH+x7rvO8P9MCrd8YwJrTyzkET6MLajzngoV5yLDWwcokzs+b3yD9yoa5Vw3Dth2MdKRp+lyGMO7PwyAM3ebw== dependencies: protobufjs "6.8.8" semver "5.6.0" @@ -255,14 +224,13 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA= -"@schematics/angular@^7.3.5": - version "7.3.6" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.6.tgz#e827111e7d3cdf950efcca504389cbade3c9c59a" - integrity sha512-Q4VXAjVaCDb2zXFXoIdOfNPsn+EQjqDBHK4a97omytnSNAmu1erl3l2FkEMi6x/VuzK2mQSzBbmHJIgauMmOAA== +"@schematics/angular@^8.0.0-beta.11": + version "8.0.0-beta.11" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-8.0.0-beta.11.tgz#12bea5fe299e0fe93222a69c06c6de130db2da85" + integrity sha512-qmqewhwXjbMQ47IMghbaGwAzHo25jNtPyfr+DnSdLwOtKfd1nA2WQD7OGeiG1b+DZ7G+TZvXLg58xnXR3RFhmg== dependencies: - "@angular-devkit/core" "7.3.6" - "@angular-devkit/schematics" "7.3.6" - typescript "3.2.4" + "@angular-devkit/core" "8.0.0-beta.11" + "@angular-devkit/schematics" "8.0.0-beta.11" "@types/argparse@1.0.33": version "1.0.33" @@ -379,20 +347,10 @@ agent-base@^4.1.0: dependencies: es6-promisify "^5.0.0" -ajv@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" - integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@6.9.1: - version "6.9.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.9.1.tgz#a4d3683d74abc5670e75f0b16520f70a20ea8dc1" - integrity sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA== +ajv@6.10.0: + version "6.10.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.0.tgz#90d0d54439da587cd7e843bfb7045f50bd22bdf1" + integrity sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -753,7 +711,7 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chokidar@2.0.4, chokidar@^2.0.3: +chokidar@^2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== @@ -2873,13 +2831,6 @@ rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.0, rimraf@^2.6.1: dependencies: glob "^7.0.5" -rxjs@6.3.3: - version "6.3.3" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" - integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== - dependencies: - tslib "^1.9.0" - rxjs@6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" @@ -3424,11 +3375,6 @@ type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" -typescript@3.2.4: - version "3.2.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d" - integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg== - typescript@3.3.3333: version "3.3.3333" resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3333.tgz#171b2c5af66c59e9431199117a3bcadc66fdcfd6" diff --git a/package.json b/package.json index ba6d03a55e..7ea5b8d97c 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,9 @@ "@angular-devkit/core": "^8.0.0-beta.11", "@angular-devkit/schematics": "^8.0.0-beta.11", "@angular/bazel": "file:./tools/npm/@angular_bazel", - "@bazel/jasmine": "0.27.10", - "@bazel/karma": "0.27.10", - "@bazel/typescript": "0.27.10", + "@bazel/jasmine": "0.27.12", + "@bazel/karma": "0.27.12", + "@bazel/typescript": "0.27.12", "@microsoft/api-extractor": "^7.0.21", "@schematics/angular": "^8.0.0-beta.11", "@types/angular": "^1.6.47", diff --git a/packages/bazel/package.json b/packages/bazel/package.json index b6a2280205..e53db6d486 100644 --- a/packages/bazel/package.json +++ b/packages/bazel/package.json @@ -38,7 +38,7 @@ }, "peerDependencies": { "@angular/compiler-cli": "0.0.0-PLACEHOLDER", - "@bazel/typescript": "0.27.10", + "@bazel/typescript": "0.27.12", "typescript": ">=3.4 <3.5" }, "repository": { diff --git a/packages/bazel/src/builders/files/WORKSPACE.template b/packages/bazel/src/builders/files/WORKSPACE.template index 0a521720eb..d87aa93005 100644 --- a/packages/bazel/src/builders/files/WORKSPACE.template +++ b/packages/bazel/src/builders/files/WORKSPACE.template @@ -12,8 +12,8 @@ workspace(name = "project") load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") -RULES_NODEJS_VERSION = "0.27.10" -RULES_NODEJS_SHA256 = "1fbea5f33a8cbf8fd798f4cf7973a9b09e53bda872c75b5665a92a6d28fbbb13" +RULES_NODEJS_VERSION = "0.27.12" +RULES_NODEJS_SHA256 = "3a3efbf223f6de733475602844ad3a8faa02abda25ab8cfe1d1ed0db134887cf" http_archive( name = "build_bazel_rules_nodejs", sha256 = RULES_NODEJS_SHA256, diff --git a/packages/bazel/src/schematics/ng-add/index.ts b/packages/bazel/src/schematics/ng-add/index.ts index 2cd8a38034..098a7c2073 100755 --- a/packages/bazel/src/schematics/ng-add/index.ts +++ b/packages/bazel/src/schematics/ng-add/index.ts @@ -50,8 +50,8 @@ function addDevDependenciesToPackageJson(options: Schema) { '@angular/bazel': angularCoreVersion, '@bazel/bazel': '^0.24.0', '@bazel/ibazel': '^0.9.0', - '@bazel/karma': '0.27.10', - '@bazel/typescript': '0.27.10', + '@bazel/karma': '0.27.12', + '@bazel/typescript': '0.27.12', }; const recorder = host.beginUpdate(packageJson); diff --git a/yarn.lock b/yarn.lock index 2478a8794a..98cf74da63 100644 --- a/yarn.lock +++ b/yarn.lock @@ -137,18 +137,18 @@ resolved "https://registry.yarnpkg.com/@bazel/ibazel/-/ibazel-0.9.0.tgz#fd60023acd36313d304cc2f8c2e181b88b5445cd" integrity sha512-E31cefDcdJsx/oii6p/gqKZXSVw0kEg1O73DD2McFcSvnf/p1GYWcQtVgdRQmlviBEytJkJgdX8rtThitRvcow== -"@bazel/jasmine@0.27.10": - version "0.27.10" - resolved "https://registry.yarnpkg.com/@bazel/jasmine/-/jasmine-0.27.10.tgz#29e51f752077d82663114fefca5bfa2c1c271466" - integrity sha512-DmCFlpYcmXtSOtakfU8vrnu/eWUELScbnsbLodNowbGuxHcr2V7aIqwKxBuXwH/Ox/Sk2Yb2KwpmJTAJDD6tIw== +"@bazel/jasmine@0.27.12": + version "0.27.12" + resolved "https://registry.yarnpkg.com/@bazel/jasmine/-/jasmine-0.27.12.tgz#9319d1fb52723da8ec23d4ce507dc9eb202d4e31" + integrity sha512-olsKMLsfqA6F025EPn0glJal4DB0v4E2ISL+0Hu2piewAtjv8DARU0dxzyizgH1X20BooIlgq+ZL2cKdlXfMHg== dependencies: jasmine "~3.3.1" v8-coverage "1.0.8" -"@bazel/karma@0.27.10": - version "0.27.10" - resolved "https://registry.yarnpkg.com/@bazel/karma/-/karma-0.27.10.tgz#7d686d3f785c654a3d966e1891d39a1a8ba8557b" - integrity sha512-CLbezRi5rXG0sjDwoDvaEhlpitAdMNxHmsNtY8ZxkxpajHEPBSxU8lCVKvuy2KB4AOyEGI5ECKqFtLc8RvDlVA== +"@bazel/karma@0.27.12": + version "0.27.12" + resolved "https://registry.yarnpkg.com/@bazel/karma/-/karma-0.27.12.tgz#a7c1648af93b4d376e4e3b6fc1c7006b4d79c092" + integrity sha512-LJAbNe8bR1vRLb8GqIbKzCpf8VMaTnM9jizxmsjkgdGjy9OgsseYbk6+70z1yx7s3QHPjj7JBqcx+d2yeXPo7g== dependencies: jasmine-core "2.8.0" karma "^4.0.0" @@ -162,10 +162,10 @@ semver "5.6.0" tmp "0.0.33" -"@bazel/typescript@0.27.10": - version "0.27.10" - resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.27.10.tgz#52d160dd13aba29f2c26851677f25c717afd2194" - integrity sha512-TeWlpalkAh0xfH9Jiirv5R54oWJTdyilj72HukUBdNUttJOT/cMqUsSqYTm+iArLiZrzaglMT70TKYizm8zaIg== +"@bazel/typescript@0.27.12": + version "0.27.12" + resolved "https://registry.yarnpkg.com/@bazel/typescript/-/typescript-0.27.12.tgz#79a6468cd8da096c4da151fac658f7f801a59948" + integrity sha512-5cH+x7rvO8P9MCrd8YwJrTyzkET6MLajzngoV5yLDWwcokzs+b3yD9yoa5Vw3Dth2MdKRp+lyGMO7PwyAM3ebw== dependencies: protobufjs "6.8.8" semver "5.6.0" From ce2713f5b19679caa53453dd1c59bc56cc8d1b40 Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Tue, 9 Apr 2019 18:08:13 -0700 Subject: [PATCH 0771/1073] build(bazel): remove @ts-api-guardian_deps yarn_install (#29799) PR Close #29799 --- WORKSPACE | 6 - package.json | 6 +- tools/ts-api-guardian/BUILD.bazel | 29 ++-- tools/ts-api-guardian/index.bzl | 4 +- tools/ts-api-guardian/package.json | 4 +- tools/ts-api-guardian/yarn.lock | 235 ----------------------------- yarn.lock | 59 +++++++- 7 files changed, 76 insertions(+), 267 deletions(-) delete mode 100644 tools/ts-api-guardian/yarn.lock diff --git a/WORKSPACE b/WORKSPACE index edc016f060..0ad52f9b32 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -73,12 +73,6 @@ yarn_install( yarn_lock = "//:yarn.lock", ) -yarn_install( - name = "ts-api-guardian_deps", - package_json = "@angular//tools/ts-api-guardian:package.json", - yarn_lock = "@angular//tools/ts-api-guardian:yarn.lock", -) - # Install all bazel dependencies of the @npm npm packages load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies") diff --git a/package.json b/package.json index 7ea5b8d97c..02505ee90e 100644 --- a/package.json +++ b/package.json @@ -43,13 +43,15 @@ "@schematics/angular": "^8.0.0-beta.11", "@types/angular": "^1.6.47", "@types/base64-js": "1.2.5", + "@types/chai": "^4.1.2", "@types/chokidar": "^1.7.5", "@types/convert-source-map": "^1.5.1", - "@types/diff": "^3.2.2", + "@types/diff": "^3.5.1", "@types/fs-extra": "4.0.2", "@types/hammerjs": "2.0.35", "@types/jasmine": "^2.8.8", "@types/jasminewd2": "^2.0.6", + "@types/minimist": "^1.2.0", "@types/mock-fs": "^3.6.30", "@types/node": "^10.9.4", "@types/selenium-webdriver": "3.0.7", @@ -65,6 +67,8 @@ "angular-mocks-1.6": "npm:angular-mocks@1.6", "base64-js": "1.2.1", "canonical-path": "1.0.0", + "chai": "^4.1.2", + "chalk": "^2.3.1", "chokidar": "^2.1.1", "convert-source-map": "^1.5.1", "dependency-graph": "^0.7.2", diff --git a/tools/ts-api-guardian/BUILD.bazel b/tools/ts-api-guardian/BUILD.bazel index 80e976a93e..80ca997627 100644 --- a/tools/ts-api-guardian/BUILD.bazel +++ b/tools/ts-api-guardian/BUILD.bazel @@ -11,16 +11,15 @@ ts_library( name = "lib", srcs = glob(["lib/*.ts"]), module_name = "ts-api-guardian", - node_modules = "@ts-api-guardian_deps//typescript:typescript__typings", tsconfig = "//tools:tsconfig.json", visibility = ["//visibility:public"], deps = [ - "@ts-api-guardian_deps//@types/diff", - "@ts-api-guardian_deps//@types/minimist", - "@ts-api-guardian_deps//@types/node", - "@ts-api-guardian_deps//diff", - "@ts-api-guardian_deps//minimist", - "@ts-api-guardian_deps//typescript", + "@npm//@types/diff", + "@npm//@types/minimist", + "@npm//@types/node", + "@npm//diff", + "@npm//minimist", + "@npm//typescript", ], ) @@ -53,16 +52,15 @@ ts_library( name = "test_lib", testonly = True, srcs = glob(["test/*.ts"]), - node_modules = "@ts-api-guardian_deps//typescript:typescript__typings", tsconfig = "//tools:tsconfig-test", deps = [ ":lib", - "@ts-api-guardian_deps//@types/chai", - "@ts-api-guardian_deps//@types/jasmine", - "@ts-api-guardian_deps//@types/node", - "@ts-api-guardian_deps//chai", - "@ts-api-guardian_deps//jasmine", - "@ts-api-guardian_deps//typescript", + "@npm//@types/chai", + "@npm//@types/jasmine", + "@npm//@types/node", + "@npm//chai", + "@npm//jasmine", + "@npm//typescript", ], ) @@ -75,10 +73,9 @@ jasmine_node_test( "test/fixtures/*.patch", ]) + [ ":ts-api-guardian", - "@ts-api-guardian_deps//chalk", + "@npm//chalk", # TODO: remove this once the boostrap.js workaround has been removed. ":package.json", ], - node_modules = "@ts-api-guardian_deps//typescript:typescript__typings", tags = ["local"], ) diff --git a/tools/ts-api-guardian/index.bzl b/tools/ts-api-guardian/index.bzl index 6cd399d249..538607ecd3 100644 --- a/tools/ts-api-guardian/index.bzl +++ b/tools/ts-api-guardian/index.bzl @@ -55,7 +55,7 @@ def ts_api_guardian_test( nodejs_test( name = name, data = data, - node_modules = "@ts-api-guardian_deps//:node_modules", + node_modules = "@npm//:node_modules", entry_point = "angular/tools/ts-api-guardian/bin/ts-api-guardian", templated_args = args + ["--verify", golden, actual], **kwargs @@ -65,7 +65,7 @@ def ts_api_guardian_test( name = name + ".accept", testonly = True, data = data, - node_modules = "@ts-api-guardian_deps//:node_modules", + node_modules = "@npm//:node_modules", entry_point = "angular/tools/ts-api-guardian/bin/ts-api-guardian", templated_args = args + ["--out", golden, actual], **kwargs diff --git a/tools/ts-api-guardian/package.json b/tools/ts-api-guardian/package.json index 2ebf6cab82..b4d371e694 100644 --- a/tools/ts-api-guardian/package.json +++ b/tools/ts-api-guardian/package.json @@ -15,7 +15,7 @@ }, "dependencies": { "chalk": "^2.3.1", - "diff": "^3.4.0", + "diff": "^3.5.0", "minimist": "^1.2.0" }, "devDependencies": { @@ -23,7 +23,7 @@ "@types/diff": "^3.5.1", "@types/jasmine": "^2.8.8", "@types/minimist": "^1.2.0", - "@types/node": "^10.9.2", + "@types/node": "^10.9.4", "chai": "^4.1.2", "jasmine": "^3.1.0", "source-map-support": "^0.5.9", diff --git a/tools/ts-api-guardian/yarn.lock b/tools/ts-api-guardian/yarn.lock deleted file mode 100644 index 1393229774..0000000000 --- a/tools/ts-api-guardian/yarn.lock +++ /dev/null @@ -1,235 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/chai@^4.1.2": - version "4.1.6" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.6.tgz#1eb26c040e3a84205b1008ad55c800e5e8a94e34" - integrity sha512-CBk7KTZt3FhPsEkYioG6kuCIpWISw+YI8o+3op4+NXwTpvAPxE1ES8+PY8zfaK2L98b1z5oq03UHa4VYpeUxnw== - -"@types/diff@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-3.5.1.tgz#30253f6e177564ad7da707b1ebe46d3eade71706" - integrity sha512-nkT7bd/YM6QRDQjww8PYf0kOj1MvwxQ/WaCinj2Hm1HlL+JqGTm4cDoQeROfiWX/B3SNI1nyLLhLAQpp5sE3hw== - -"@types/jasmine@^2.8.8": - version "2.8.9" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.9.tgz#e028c891e8551fdf6de905d959581fc4fa0b5509" - integrity sha512-8dPZwjosElZOGGYw1nwTvOEMof4gjwAWNFS93nBI091BoEfd5drnHOLRMiRF/LOPuMTn5LgEdv0bTUO8QFVuHQ== - -"@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= - -"@types/node@^10.9.2": - version "10.9.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.2.tgz#f0ab8dced5cd6c56b26765e1c0d9e4fdcc9f2a00" - integrity sha512-pwZnkVyCGJ3LsQ0/3flQK5lCFao4esIzwUVzzk5NvL9vnkEyDhNf4fhHzUMHvyr56gNZywWTS2MR0euabMSz4A== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -assertion-error@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -chai@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" - integrity sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw= - dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^3.0.0" - get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" - -chalk@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" - integrity sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -check-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -color-convert@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" - integrity sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ== - dependencies: - color-name "^1.1.1" - -color-name@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -deep-eql@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - -diff@^3.4.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= - -glob@^7.0.6: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -jasmine-core@~3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.1.0.tgz#a4785e135d5df65024dfc9224953df585bd2766c" - integrity sha1-pHheE11d9lAk38kiSVPfWFvSdmw= - -jasmine@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jasmine/-/jasmine-3.1.0.tgz#2bd59fd7ec6ec0e8acb64e09f45a68ed2ad1952a" - integrity sha1-K9Wf1+xuwOistk4J9Fpo7SrRlSo= - dependencies: - glob "^7.0.6" - jasmine-core "~3.1.0" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -pathval@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= - -source-map-support@^0.5.9: - version "0.5.9" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" - integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -supports-color@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" - integrity sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg== - dependencies: - has-flag "^3.0.0" - -type-detect@^4.0.0: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -typescript@~3.2.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.2.tgz#fe8101c46aa123f8353523ebdcf5730c2ae493e5" - integrity sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg== - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= diff --git a/yarn.lock b/yarn.lock index 98cf74da63..cfe742e5e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -428,6 +428,11 @@ resolved "https://registry.yarnpkg.com/@types/base64-js/-/base64-js-1.2.5.tgz#582b2476169a6cba460a214d476c744441d873d5" integrity sha1-WCskdhaabLpGCiFNR2x0REHYc9U= +"@types/chai@^4.1.2": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.7.tgz#1b8e33b61a8c09cbe1f85133071baa0dbf9fa71a" + integrity sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA== + "@types/chokidar@^1.7.5": version "1.7.5" resolved "https://registry.yarnpkg.com/@types/chokidar/-/chokidar-1.7.5.tgz#1fa78c8803e035bed6d98e6949e514b133b0c9b6" @@ -441,10 +446,10 @@ resolved "https://registry.yarnpkg.com/@types/convert-source-map/-/convert-source-map-1.5.1.tgz#d4d180dd6adc5cb68ad99bd56e03d637881f4616" integrity sha512-laiDIXqqthjJlyAMYAXOtN3N8+UlbM+KvZi4BaY5ZOekmVkBs/UxfK5O0HWeJVG2eW8F+Mu2ww13fTX+kY1FlQ== -"@types/diff@^3.2.2": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@types/diff/-/diff-3.5.1.tgz#30253f6e177564ad7da707b1ebe46d3eade71706" - integrity sha512-nkT7bd/YM6QRDQjww8PYf0kOj1MvwxQ/WaCinj2Hm1HlL+JqGTm4cDoQeROfiWX/B3SNI1nyLLhLAQpp5sE3hw== +"@types/diff@^3.5.1": + version "3.5.3" + resolved "https://registry.yarnpkg.com/@types/diff/-/diff-3.5.3.tgz#7c6c3721ba454d838790100faf7957116ee7deab" + integrity sha512-YrLagYnL+tfrgM7bQ5yW34pi5cg9pmh5Gbq2Lmuuh+zh0ZjmK2fU3896PtlpJT3IDG2rdkoG30biHJepgIsMnw== "@types/estree@0.0.39": version "0.0.39" @@ -1151,6 +1156,11 @@ assert@^1.1.1: dependencies: util "0.10.3" +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" @@ -1780,6 +1790,18 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +chai@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" + integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.0" + type-detect "^4.0.5" + "chainsaw@>=0.0.7 <0.1": version "0.0.9" resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.0.9.tgz#11a05102d1c4c785b6d0415d336d5a3a1612913e" @@ -1805,7 +1827,7 @@ chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.1, chalk@^2.4.2: +chalk@^2.0.1, chalk@^2.3.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1824,6 +1846,11 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + chokidar@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -2918,6 +2945,13 @@ decompress-zip@0.3.0: readable-stream "^1.1.8" touch "0.0.3" +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + deep-equal@~0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.2.2.tgz#84b745896f34c684e98f2ce0e42abaf43bba017d" @@ -4376,6 +4410,11 @@ get-caller-file@^1.0.1: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" integrity sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U= +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + get-pkg-repo@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz#c73b489c06d80cc5536c2c853f9e05232056972d" @@ -8190,6 +8229,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +pathval@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA= + pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -10652,6 +10696,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-is@~1.6.10, type-is@~1.6.16, type-is@~1.6.6: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" From 8a3a556c0ca646305c90851dc98a9442ca375b28 Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Tue, 9 Apr 2019 20:53:38 -0700 Subject: [PATCH 0772/1073] build(bazel): fix failure in http_server target due to transitive npm deps (#29799) PR Close #29799 --- packages/bazel/test/protractor-2/BUILD.bazel | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/bazel/test/protractor-2/BUILD.bazel b/packages/bazel/test/protractor-2/BUILD.bazel index c1952f0241..a5aaa678b4 100644 --- a/packages/bazel/test/protractor-2/BUILD.bazel +++ b/packages/bazel/test/protractor-2/BUILD.bazel @@ -32,7 +32,7 @@ http_server( name = "prodserver", data = [ "index.html", - ":bundle", + ":bundle.min.js", ], ) From 506f478f08abcd99385a63ecebf2a4d533dcfd97 Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Tue, 9 Apr 2019 21:13:14 -0700 Subject: [PATCH 0773/1073] build(bazel): fix deps of test (#29799) PR Close #29799 --- packages/core/schematics/test/BUILD.bazel | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/core/schematics/test/BUILD.bazel b/packages/core/schematics/test/BUILD.bazel index b1dd0643d4..ccd5c67379 100644 --- a/packages/core/schematics/test/BUILD.bazel +++ b/packages/core/schematics/test/BUILD.bazel @@ -6,7 +6,6 @@ ts_library( srcs = glob(["**/*.ts"]), data = [ "//packages/core/schematics:migrations.json", - "@npm//shelljs", ], deps = [ "//packages/core/schematics/migrations/static-queries", @@ -22,5 +21,8 @@ ts_library( jasmine_node_test( name = "test", - deps = [":test_lib"], + deps = [ + ":test_lib", + "@npm//shelljs", + ], ) From 4271d35dc4510bc1adaed6200de4af2cf7bfaa9f Mon Sep 17 00:00:00 2001 From: Greg Magolan Date: Wed, 10 Apr 2019 17:15:35 -0700 Subject: [PATCH 0774/1073] build(bazel): fix missing deps in ts_devserver targets under /modules/playground/src/web_workers (#29799) PR Close #29799 --- modules/playground/src/web_workers/input/BUILD.bazel | 7 ++++++- .../playground/src/web_workers/kitchen_sink/BUILD.bazel | 7 ++++++- .../playground/src/web_workers/message_broker/BUILD.bazel | 7 ++++++- modules/playground/src/web_workers/router/BUILD.bazel | 7 ++++++- modules/playground/src/web_workers/todo/BUILD.bazel | 7 ++++++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/modules/playground/src/web_workers/input/BUILD.bazel b/modules/playground/src/web_workers/input/BUILD.bazel index 484ecd337c..e03cb7d7db 100644 --- a/modules/playground/src/web_workers/input/BUILD.bazel +++ b/modules/playground/src/web_workers/input/BUILD.bazel @@ -31,6 +31,11 @@ ts_devserver( "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@npm//node_modules/zone.js:dist/zone.js"], + static_files = [ + "@npm//node_modules/systemjs:dist/system.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/long-stack-trace-zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", + ], deps = [":input"], ) diff --git a/modules/playground/src/web_workers/kitchen_sink/BUILD.bazel b/modules/playground/src/web_workers/kitchen_sink/BUILD.bazel index 034e2cb206..9583c966e1 100644 --- a/modules/playground/src/web_workers/kitchen_sink/BUILD.bazel +++ b/modules/playground/src/web_workers/kitchen_sink/BUILD.bazel @@ -31,6 +31,11 @@ ts_devserver( "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@npm//node_modules/zone.js:dist/zone.js"], + static_files = [ + "@npm//node_modules/systemjs:dist/system.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/long-stack-trace-zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", + ], deps = [":kitchen_sink"], ) diff --git a/modules/playground/src/web_workers/message_broker/BUILD.bazel b/modules/playground/src/web_workers/message_broker/BUILD.bazel index 78354b7e4e..6a437903f8 100644 --- a/modules/playground/src/web_workers/message_broker/BUILD.bazel +++ b/modules/playground/src/web_workers/message_broker/BUILD.bazel @@ -31,6 +31,11 @@ ts_devserver( "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@npm//node_modules/zone.js:dist/zone.js"], + static_files = [ + "@npm//node_modules/systemjs:dist/system.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/long-stack-trace-zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", + ], deps = [":message_broker"], ) diff --git a/modules/playground/src/web_workers/router/BUILD.bazel b/modules/playground/src/web_workers/router/BUILD.bazel index c1ad9fedf7..6cfc59853a 100644 --- a/modules/playground/src/web_workers/router/BUILD.bazel +++ b/modules/playground/src/web_workers/router/BUILD.bazel @@ -34,6 +34,11 @@ ts_devserver( "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@npm//node_modules/zone.js:dist/zone.js"], + static_files = [ + "@npm//node_modules/systemjs:dist/system.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/long-stack-trace-zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", + ], deps = [":router"], ) diff --git a/modules/playground/src/web_workers/todo/BUILD.bazel b/modules/playground/src/web_workers/todo/BUILD.bazel index d8e2b35ebb..2eda38a422 100644 --- a/modules/playground/src/web_workers/todo/BUILD.bazel +++ b/modules/playground/src/web_workers/todo/BUILD.bazel @@ -34,6 +34,11 @@ ts_devserver( "@npm//node_modules/tslib:tslib.js", "//tools/rxjs:rxjs_umd_modules", ], - static_files = ["@npm//node_modules/zone.js:dist/zone.js"], + static_files = [ + "@npm//node_modules/systemjs:dist/system.js", + "@npm//node_modules/zone.js:dist/zone.js", + "@npm//node_modules/zone.js:dist/long-stack-trace-zone.js", + "@npm//node_modules/reflect-metadata:Reflect.js", + ], deps = [":todo"], ) From 4bde40f7c21615e5619aee2b09a7fa44bdb90287 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Wed, 10 Apr 2019 13:27:17 +0200 Subject: [PATCH 0775/1073] fix(core): don't include a local `EventListener` in typings (#29809) With dts bundles, `core.d.ts` will include an `EventListener` class as it's used in https://github.com/angular/angular/blob/303eae918d997070a36b523ddc97e018f622c258/packages/core/src/debug/debug_node.ts#L32 This will conflict with the DOM EventListener, as anything in `core.d.ts` which is using the DOM EventListener will fallback in using the one defined in the same module and hence build will fail because their implementation is different. With this change, we rename the local `EventListener` to `DebugEventListener`, the later one is non exported. Fixes #29806 PR Close #29809 --- packages/core/src/core.ts | 2 +- packages/core/src/debug/debug_node.ts | 11 +++++++---- packages/core/src/view/services.ts | 4 ++-- tools/public_api_guard/core/core.d.ts | 8 +++++++- 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/core/src/core.ts b/packages/core/src/core.ts index e49543bd34..a21cfa7bfc 100644 --- a/packages/core/src/core.ts +++ b/packages/core/src/core.ts @@ -22,7 +22,7 @@ export {APP_INITIALIZER, ApplicationInitStatus} from './application_init'; export * from './zone'; export * from './render'; export * from './linker'; -export {DebugElement, DebugNode, asNativeElements, getDebugNode, Predicate} from './debug/debug_node'; +export {DebugElement, DebugEventListener, DebugNode, asNativeElements, getDebugNode, Predicate} from './debug/debug_node'; export {GetTestability, Testability, TestabilityRegistry, setTestabilityGetter} from './testability/testability'; export * from './change_detection'; export * from './platform_core_providers'; diff --git a/packages/core/src/debug/debug_node.ts b/packages/core/src/debug/debug_node.ts index 7e2a3210ee..12f4c1c245 100644 --- a/packages/core/src/debug/debug_node.ts +++ b/packages/core/src/debug/debug_node.ts @@ -21,7 +21,10 @@ import {getComponentViewByIndex, getNativeByTNode, isComponent, isLContainer} fr import {assertDomNode} from '../util/assert'; import {DebugContext} from '../view/index'; -export class EventListener { +/** + * @publicApi + */ +export class DebugEventListener { constructor(public name: string, public callback: Function) {} } @@ -29,7 +32,7 @@ export class EventListener { * @publicApi */ export interface DebugNode { - readonly listeners: EventListener[]; + readonly listeners: DebugEventListener[]; readonly parent: DebugElement|null; readonly nativeNode: any; readonly injector: Injector; @@ -39,7 +42,7 @@ export interface DebugNode { readonly providerTokens: any[]; } export class DebugNode__PRE_R3__ { - readonly listeners: EventListener[] = []; + readonly listeners: DebugEventListener[] = []; readonly parent: DebugElement|null = null; readonly nativeNode: any; private readonly _debugContext: DebugContext; @@ -219,7 +222,7 @@ class DebugNode__POST_R3__ implements DebugNode { } get context(): any { return getContext(this.nativeNode as Element); } - get listeners(): EventListener[] { + get listeners(): DebugEventListener[] { return getListeners(this.nativeNode as Element).filter(isBrowserEvents); } diff --git a/packages/core/src/view/services.ts b/packages/core/src/view/services.ts index 02302ba35e..8c705f378e 100644 --- a/packages/core/src/view/services.ts +++ b/packages/core/src/view/services.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {DebugElement__PRE_R3__, DebugNode__PRE_R3__, EventListener, getDebugNode, indexDebugNode, removeDebugNodeFromIndex} from '../debug/debug_node'; +import {DebugElement__PRE_R3__, DebugEventListener, DebugNode__PRE_R3__, getDebugNode, indexDebugNode, removeDebugNodeFromIndex} from '../debug/debug_node'; import {Injector} from '../di'; import {InjectableType} from '../di/injectable'; import {getInjectableDef, ɵɵInjectableDef} from '../di/interface/defs'; @@ -827,7 +827,7 @@ export class DebugRenderer2 implements Renderer2 { if (typeof target !== 'string') { const debugEl = getDebugNode(target); if (debugEl) { - debugEl.listeners.push(new EventListener(eventName, callback)); + debugEl.listeners.push(new DebugEventListener(eventName, callback)); } } diff --git a/tools/public_api_guard/core/core.d.ts b/tools/public_api_guard/core/core.d.ts index 74f2fd5e9b..cb31ced994 100644 --- a/tools/public_api_guard/core/core.d.ts +++ b/tools/public_api_guard/core/core.d.ts @@ -224,11 +224,17 @@ export declare const DebugElement: { new (...args: any[]): DebugElement; }; +export declare class DebugEventListener { + callback: Function; + name: string; + constructor(name: string, callback: Function); +} + export interface DebugNode { readonly componentInstance: any; readonly context: any; readonly injector: Injector; - readonly listeners: EventListener[]; + readonly listeners: DebugEventListener[]; readonly nativeNode: any; readonly parent: DebugElement | null; readonly providerTokens: any[]; From c0ec1d63ffad5d142448853ca8a2df4be0da321b Mon Sep 17 00:00:00 2001 From: Brad Green Date: Mon, 15 Apr 2019 15:14:23 -0700 Subject: [PATCH 0776/1073] docs: update product-alerts.component.1.ts (#29917) Make the example match the generated output seen in StackBlitz as shown https://next.angular.io/getting-started#input step 2 "Open product-alerts.component.ts." PR Close #29917 --- .../src/app/product-alerts/product-alerts.component.1.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/aio/content/examples/getting-started/src/app/product-alerts/product-alerts.component.1.ts b/aio/content/examples/getting-started/src/app/product-alerts/product-alerts.component.1.ts index 166a32daad..a92b624261 100644 --- a/aio/content/examples/getting-started/src/app/product-alerts/product-alerts.component.1.ts +++ b/aio/content/examples/getting-started/src/app/product-alerts/product-alerts.component.1.ts @@ -1,6 +1,6 @@ // #docplaster // #docregion as-generated, imports -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; // #enddocregion as-generated import { Input } from '@angular/core'; // #enddocregion imports @@ -12,8 +12,13 @@ import { Input } from '@angular/core'; styleUrls: ['./product-alerts.component.css'] }) // #docregion input-decorator -export class ProductAlertsComponent { +export class ProductAlertsComponent implements OnInit { // #enddocregion as-generated @Input() product; // #docregion as-generated + constructor() { } + + ngOnInit() { + } + } From b9251fd707023b4448292584b6e191cfc1c8ef66 Mon Sep 17 00:00:00 2001 From: Alex Eagle Date: Mon, 15 Apr 2019 11:57:36 -0700 Subject: [PATCH 0777/1073] build: Remove cc_binary dependency on brotli (#29912) Just use the JavaScript port instead. We don't care about speed since we compress once as a build step. PR Close #29912 --- BUILD.bazel | 2 -- package.json | 1 + packages/bazel/package.bzl | 7 ------- packages/bazel/src/ng_rollup_bundle.bzl | 2 +- tools/brotli-cli/BUILD.bazel | 11 +++++++++++ tools/brotli-cli/cli.js | 21 +++++++++++++++++++++ yarn.lock | 9 ++++++++- 7 files changed, 42 insertions(+), 11 deletions(-) create mode 100644 tools/brotli-cli/BUILD.bazel create mode 100644 tools/brotli-cli/cli.js diff --git a/BUILD.bazel b/BUILD.bazel index 0ade4f4beb..58ce9abd32 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -1,5 +1,3 @@ -load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") - package(default_visibility = ["//visibility:public"]) load("//tools:defaults.bzl", "karma_web_test") diff --git a/package.json b/package.json index 02505ee90e..fa9d196c7a 100644 --- a/package.json +++ b/package.json @@ -66,6 +66,7 @@ "angular-mocks-1.5": "npm:angular-mocks@1.5", "angular-mocks-1.6": "npm:angular-mocks@1.6", "base64-js": "1.2.1", + "brotli": "^1.3.2", "canonical-path": "1.0.0", "chai": "^4.1.2", "chalk": "^2.3.1", diff --git a/packages/bazel/package.bzl b/packages/bazel/package.bzl index 043a56f5e4..a8a3812a0f 100644 --- a/packages/bazel/package.bzl +++ b/packages/bazel/package.bzl @@ -24,13 +24,6 @@ def rules_angular_dev_dependencies(): shorter. """ - http_archive( - name = "org_brotli", - sha256 = "774b893a0700b0692a76e2e5b7e7610dbbe330ffbe3fe864b4b52ca718061d5a", - strip_prefix = "brotli-1.0.5", - url = "https://github.com/google/brotli/archive/v1.0.5.zip", - ) - # Needed for Remote Execution _maybe( http_archive, diff --git a/packages/bazel/src/ng_rollup_bundle.bzl b/packages/bazel/src/ng_rollup_bundle.bzl index 0aadf42a6b..d1100520e6 100644 --- a/packages/bazel/src/ng_rollup_bundle.bzl +++ b/packages/bazel/src/ng_rollup_bundle.bzl @@ -194,7 +194,7 @@ ng_rollup_bundle = rule( "_brotli": attr.label( executable = True, cfg = "host", - default = Label("@org_brotli//:brotli"), + default = Label("//tools/brotli-cli"), ), "_rollup": attr.label( executable = True, diff --git a/tools/brotli-cli/BUILD.bazel b/tools/brotli-cli/BUILD.bazel new file mode 100644 index 0000000000..7a60027f8b --- /dev/null +++ b/tools/brotli-cli/BUILD.bazel @@ -0,0 +1,11 @@ +load("@build_bazel_rules_nodejs//:defs.bzl", "nodejs_binary") + +nodejs_binary( + name = "brotli-cli", + data = [ + "cli.js", + "@npm//brotli", + ], + entry_point = "angular/tools/brotli-cli/cli.js", + visibility = ["//:__subpackages__"], +) diff --git a/tools/brotli-cli/cli.js b/tools/brotli-cli/cli.js new file mode 100644 index 0000000000..e38a4a5c43 --- /dev/null +++ b/tools/brotli-cli/cli.js @@ -0,0 +1,21 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +const fs = require('fs'); +const compress = require('brotli/compress'); + +function main(args) { + const output = args[0].substring('--output='.length); + const input = args[1]; + const buffer = fs.readFileSync(input); + fs.writeFileSync(output, compress(buffer, {mode: 0, quality: 11})); +} + +if (require.main === module) { + main(process.argv.slice(2)); +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index cfe742e5e9..0afe364313 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1321,7 +1321,7 @@ base64-js@1.2.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" integrity sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw== -base64-js@^1.0.2: +base64-js@^1.0.2, base64-js@^1.1.2: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== @@ -1558,6 +1558,13 @@ braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" +brotli@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/brotli/-/brotli-1.3.2.tgz#525a9cad4fcba96475d7d388f6aecb13eed52f46" + integrity sha1-UlqcrU/LqWR119OI9q7LE+7VL0Y= + dependencies: + base64-js "^1.1.2" + browserify-zlib@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" From e5905bb035d0e1f2eb9af2c5c6f09eb51fb0bff0 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Tue, 16 Apr 2019 16:52:44 +0100 Subject: [PATCH 0778/1073] fix(core): use shakeable global definitions (#29929) The `ngDevMode` and `ngI18nClosureMode` are special in that they should be set to `false` on production builds in order to shake out code associated with it. Angular CLI does this in https://github.com/angular/angular-cli/blob/5fc1f2499cbe57f9a95e4b0dfced130eb3a8046d/packages/angular_devkit/build_angular/src/angular-cli-files/models/webpack-configs/common.ts#L279-L282. But in https://github.com/angular/angular/pull/28689 the toplevel usage was changed from `ngDevMode` to `global['ngDevMode']` (and the same for `ngI18nClosureMode`). This indirection prevents the static analysis in Terser from effecting the replacement. PR Close #29929 --- packages/core/src/util/ng_dev_mode.ts | 5 ++++- packages/core/src/util/ng_i18n_closure_mode.ts | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/core/src/util/ng_dev_mode.ts b/packages/core/src/util/ng_dev_mode.ts index 3b5c9308be..10bc750635 100644 --- a/packages/core/src/util/ng_dev_mode.ts +++ b/packages/core/src/util/ng_dev_mode.ts @@ -82,7 +82,10 @@ export function ngDevModeResetPerfCounters(): NgDevModePerfCounters { * The idea is that unless we are doing production build where we explicitly * set `ngDevMode == false` we should be helping the developer by providing * as much early warning and errors as possible. + * + * NOTE: changes to the `ngDevMode` name must be synced with the CLI and + * possibly other third party tooling. Check with them before altering it. */ -if (typeof global['ngDevMode'] === 'undefined' || global['ngDevMode']) { +if (typeof ngDevMode === 'undefined' || ngDevMode) { ngDevModeResetPerfCounters(); } diff --git a/packages/core/src/util/ng_i18n_closure_mode.ts b/packages/core/src/util/ng_i18n_closure_mode.ts index 7ee5abc919..752e4f24bf 100644 --- a/packages/core/src/util/ng_i18n_closure_mode.ts +++ b/packages/core/src/util/ng_i18n_closure_mode.ts @@ -12,7 +12,11 @@ declare global { const ngI18nClosureMode: boolean; } -if (typeof global['ngI18nClosureMode'] === 'undefined') { +/** + * NOTE: changes to the `ngI18nClosureMode` name must be synced with the CLI and + * possibly other third party tooling. Check with them before altering it. + */ +if (typeof ngI18nClosureMode === 'undefined') { // Make sure to refer to ngI18nClosureMode as ['ngI18nClosureMode'] for closure. global['ngI18nClosureMode'] = // TODO(FW-1250): validate that this actually, you know, works. From e1f51eaa55e5f0b2c95cff4ea51e8ae05e15c276 Mon Sep 17 00:00:00 2001 From: Filipe Silva Date: Wed, 17 Apr 2019 11:43:31 +0100 Subject: [PATCH 0779/1073] feat(compiler-cli): export tooling definitions (#29929) PR Close #29929 --- integration/terser/.gitignore | 1 + integration/terser/package.json | 16 ++++++++++++ integration/terser/test.js | 25 +++++++++++++++++++ packages/compiler-cli/index.ts | 1 + packages/compiler-cli/src/tooling.ts | 22 ++++++++++++++++ packages/core/src/util/ng_dev_mode.ts | 3 +-- .../core/src/util/ng_i18n_closure_mode.ts | 3 +-- 7 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 integration/terser/.gitignore create mode 100644 integration/terser/package.json create mode 100644 integration/terser/test.js create mode 100644 packages/compiler-cli/src/tooling.ts diff --git a/integration/terser/.gitignore b/integration/terser/.gitignore new file mode 100644 index 0000000000..8d10b0cb9a --- /dev/null +++ b/integration/terser/.gitignore @@ -0,0 +1 @@ +core.min.js diff --git a/integration/terser/package.json b/integration/terser/package.json new file mode 100644 index 0000000000..955bea9ca4 --- /dev/null +++ b/integration/terser/package.json @@ -0,0 +1,16 @@ +{ + "name": "terser", + "version": "0.0.0", + "scripts": { + "test": "node test.js" + }, + "private": true, + "dependencies": { + "@angular/core": "file:../../dist/packages-dist/core", + "@angular/compiler": "file:../../dist/packages-dist/compiler", + "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", + "rxjs": "file:../../node_modules/rxjs", + "terser": "3.17.0", + "zone.js": "file:../../node_modules/zone.js" + } +} diff --git a/integration/terser/test.js b/integration/terser/test.js new file mode 100644 index 0000000000..f45ffd83ea --- /dev/null +++ b/integration/terser/test.js @@ -0,0 +1,25 @@ +const readFileSync = require('fs').readFileSync; +const writeFileSync = require('fs').writeFileSync; +const resolve = require('path').resolve; +const Terser = require('terser'); +const GLOBAL_DEFS_FOR_TERSER = require('@angular/compiler-cli').GLOBAL_DEFS_FOR_TERSER; + +const outputPath = resolve(__dirname, './core.min.js'); +const pathToCoreFesm5 = resolve(__dirname, './node_modules/@angular/core/fesm5/core.js'); +const coreFesm5Content = readFileSync(pathToCoreFesm5, 'utf8'); +// Ensure that Terser global_defs exported by compiler-cli work. +const terserOpts = { + compress: { + module: true, + global_defs: GLOBAL_DEFS_FOR_TERSER + } +}; +const result = Terser.minify(coreFesm5Content, terserOpts); +writeFileSync(outputPath, result.code); + +for (const def of Object.keys(GLOBAL_DEFS_FOR_TERSER)) { + if (result.code.includes(def)) { + throw `'${def}' should have been removed from core bundle, but was still there.\n` + + `See output at ${outputPath}.`; + } +} \ No newline at end of file diff --git a/packages/compiler-cli/index.ts b/packages/compiler-cli/index.ts index 444b421eb3..990747d90c 100644 --- a/packages/compiler-cli/index.ts +++ b/packages/compiler-cli/index.ts @@ -17,6 +17,7 @@ export * from './src/transformers/api'; export * from './src/transformers/entry_points'; export * from './src/perform_compile'; +export * from './src/tooling'; // TODO(tbosch): remove this once cli 1.5 is fully released, // and usages in G3 are changed to `CompilerOptions`. diff --git a/packages/compiler-cli/src/tooling.ts b/packages/compiler-cli/src/tooling.ts new file mode 100644 index 0000000000..0bad1cab1a --- /dev/null +++ b/packages/compiler-cli/src/tooling.ts @@ -0,0 +1,22 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + +/** + * @module + * @description + * Tooling support helpers. + */ + +/** + * Known values for global variables in `@angular/core` that Terser should set using + * https://github.com/terser-js/terser#conditional-compilation + */ +export const GLOBAL_DEFS_FOR_TERSER = { + ngDevMode: false, + ngI18nClosureMode: false, +}; diff --git a/packages/core/src/util/ng_dev_mode.ts b/packages/core/src/util/ng_dev_mode.ts index 10bc750635..cde6949f0f 100644 --- a/packages/core/src/util/ng_dev_mode.ts +++ b/packages/core/src/util/ng_dev_mode.ts @@ -83,8 +83,7 @@ export function ngDevModeResetPerfCounters(): NgDevModePerfCounters { * set `ngDevMode == false` we should be helping the developer by providing * as much early warning and errors as possible. * - * NOTE: changes to the `ngDevMode` name must be synced with the CLI and - * possibly other third party tooling. Check with them before altering it. + * NOTE: changes to the `ngDevMode` name must be synced with `compiler-cli/src/tooling.ts`. */ if (typeof ngDevMode === 'undefined' || ngDevMode) { ngDevModeResetPerfCounters(); diff --git a/packages/core/src/util/ng_i18n_closure_mode.ts b/packages/core/src/util/ng_i18n_closure_mode.ts index 752e4f24bf..be1231060d 100644 --- a/packages/core/src/util/ng_i18n_closure_mode.ts +++ b/packages/core/src/util/ng_i18n_closure_mode.ts @@ -13,8 +13,7 @@ declare global { } /** - * NOTE: changes to the `ngI18nClosureMode` name must be synced with the CLI and - * possibly other third party tooling. Check with them before altering it. + * NOTE: changes to the `ngI18nClosureMode` name must be synced with `compiler-cli/src/tooling.ts`. */ if (typeof ngI18nClosureMode === 'undefined') { // Make sure to refer to ngI18nClosureMode as ['ngI18nClosureMode'] for closure. From 78146c1890b472621acf33d778477db8df816043 Mon Sep 17 00:00:00 2001 From: Brandon Date: Thu, 11 Apr 2019 12:58:44 -0500 Subject: [PATCH 0780/1073] docs: update extra options available for RouterModule.forRoot() method (#29846) PR Close #29846 --- packages/router/src/router_module.ts | 36 +++++++++++++++++++--------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/packages/router/src/router_module.ts b/packages/router/src/router_module.ts index 148cb9a170..27c607fc0e 100644 --- a/packages/router/src/router_module.ts +++ b/packages/router/src/router_module.ts @@ -143,18 +143,32 @@ export class RouterModule { * Creates a module with all the router providers and directives. It also optionally sets up an * application listener to perform an initial navigation. * - * Options (see `ExtraOptions`): - * * `enableTracing` makes the router log all its internal events to the console. - * * `useHash` enables the location strategy that uses the URL fragment instead of the history + * Configuration Options: + * + * * `enableTracing` Toggles whether the router should log all navigation events to the console. + * * `useHash` Enables the location strategy that uses the URL fragment instead of the history * API. - * * `initialNavigation` disables the initial navigation. - * * `errorHandler` provides a custom error handler. - * * `preloadingStrategy` configures a preloading strategy (see `PreloadAllModules`). - * * `onSameUrlNavigation` configures how the router handles navigation to the current URL. See - * `ExtraOptions` for more details. - * * `paramsInheritanceStrategy` defines how the router merges params, data and resolved data - * from parent to child routes. - */ + * * `initialNavigation` Disables the initial navigation. + * * `errorHandler` Defines a custom error handler for failed navigations. + * * `preloadingStrategy` Configures a preloading strategy. See `PreloadAllModules`. + * * `onSameUrlNavigation` Define what the router should do if it receives a navigation request to + * the current URL. + * * `scrollPositionRestoration` Configures if the scroll position needs to be restored when + * navigating back. + * * `anchorScrolling` Configures if the router should scroll to the element when the url has a + * fragment. + * * `scrollOffset` Configures the scroll offset the router will use when scrolling to an element. + * * `paramsInheritanceStrategy` Defines how the router merges params, data and resolved data from + * parent to child routes. + * * `malformedUriErrorHandler` Defines a custom malformed uri error handler function. This + * handler is invoked when encodedURI contains invalid character sequences. + * * `urlUpdateStrategy` Defines when the router updates the browser URL. The default behavior is + * to update after successful navigation. + * * `relativeLinkResolution` Enables the correct relative link resolution in components with + * empty paths. + * + * See `ExtraOptions` for more details about the above options. + */ static forRoot(routes: Routes, config?: ExtraOptions): ModuleWithProviders { return { ngModule: RouterModule, From 45c2429d308b35c2cc39ab65bc42e726f5dce767 Mon Sep 17 00:00:00 2001 From: jenniferfell Date: Thu, 18 Apr 2019 12:57:20 -0600 Subject: [PATCH 0781/1073] docs: create skeleton deprecation summary to land so other writers can contribute in parallel (#29979) PR Close #29979 --- aio/content/guide/deprecation.md | 506 +++++++++++++++++++++++++++++++ aio/content/navigation.json | 7 +- 2 files changed, 512 insertions(+), 1 deletion(-) create mode 100644 aio/content/guide/deprecation.md diff --git a/aio/content/guide/deprecation.md b/aio/content/guide/deprecation.md new file mode 100644 index 0000000000..b43b30c4fc --- /dev/null +++ b/aio/content/guide/deprecation.md @@ -0,0 +1,506 @@ +# Deprecation Summary + + + +Angular strives to balance innovation and stability. +Sometimes, APIs and features become obsolete and need to be removed or replaced so that Angular can stay current with new best practices, changing dependencies, or changes in the (web) platform itself. + +To make these transitions as easy as possible, we deprecate APIs and features for a period of time before removing them. This gives you time to update your apps to the latest APIs and best practices. + +This guide contains a summary of all Angular APIs and features that are currently deprecated. + + +
    + +For information about Angular's deprecation and removal practices, see [Angular versioning and releases](guide/releases#deprecation-practices "Angular versioning and releases: Deprecation practices"). + +For step-by-step instructions on how to update to the latest Angular release, use the interactive update guide at [update.angular.io](https://update.angular.io). + +
    + + +{@a removed} +## Removed in v8 + +The following APIs and features were previously announced as deprecated and have been removed starting with version 8.0.0: + +| Package | API or feature | Replacement | Notes | +| ------- | -------------- | ----------- | ----- | +| [@angular/http](https://v7.angular.io/api/http) | All | [@angular/common/http](https://v7.api/common/http) | The entire package has been removed. See [below](#http). | +[@angular/http/testing](https://v7.api/http/testing) | All | [@angular/common/http/testing](https://v7.api/common/http/testing) | See [below](#http). | +| @angular/platform-browser | [DOCUMENT](https://v7.angular.io/api/platform-browser/DOCUMENT) | [`@angular/common`](https://v7.angular.io/api/common/DOCUMENT) | | + + + +{@a http} +### @angular/http + + + + +The entire [@angular/http](http://v7.angular.io/api/http) package has been removed. Use [@angular/common/http](api/common/http) instead. + +The new API simplifies the default ergonomics (You don't need to map to `json` anymore.) and supports typed return values and interceptors. + +To update your apps: +* Replace `HttpModule` with `HttpClientModule` +* Replace the `Http` service with the `HttpClient` service +* Remove any map(`res => res.json()`) calls + +For more information about using the replacement APIs, see the [HttpClient](guide/http "HTTP Client guide") guide. + + +| Removed API | Replacement API | +| ----------- | --------------- | +| BaseRequestOptions | tbd | +| BaseResponseOptions | tbd | +| BrowserXhr | tbd | +| Connection | tbd | +| ConnectionBackend | tbd | +| CookieXSRFStrategy | tbd | +| Headers | tbd | +| HttpModule | tbd | +| Jsonp | tbd | +| JSONPBackend | tbd | +| JSONPConnection | tbd | +| JsonpModule | tbd | +| QueryEncoder | tbd | +| ReadyState | tbd | +| Request | tbd | +| RequestMethod | tbd | +| RequestOptions | tbd | +| RequestOptionsArgs | tbd | +| Response | tbd | +| ResponseContentType | tbd | +| ResponseOptions | tbd | +| ResponseOptionsArgs | tbd | +| ResponseType | tbd | +| URLSearchParams | tbd | +| XHRBackend | tbd | +| XHRConnection | tbd | +| XSRFStrategy | tbd | +| @http/testing/MockBackend | tbd | +| @http/testing/MockConnection | tbd | + + +## Deprecated APIs + +The following table lists all of the deprecated APIs, with details to help you plan your migration to a replacement. + +
    + +To see a quick summary of all APIs that are deprecated, filter the API list by [**Status: deprecated**](https://angular.io/api?status=deprecated). Deprecated APIs are indicated by ~~strikethrough~~ in the API reference pages. + +
    + +{@a common} +### @angular/common + +| API | Replacement | Deprecation announced | Notes | +| --- | ----------- | --------------------- | ----- | +| [DeprecatedI18NPipesModule](api/common/DeprecatedI18NPipesModule) | [`CommonModule`](https://angular.io/api?query=pipe) | v5 | Pipes that rely the JS Intl API use the deprecated module, while the new `CommonModule` extracts and uses data from CLDR instead. For mappings to assist your update, see [Date Formats](https://docs.google.com/spreadsheets/d/12iygt-_cakNP1VO7MV9g4lq9NsxVWG4tSfc98HpHb0k/edit#gid=0 "Date formats Google sheet"). | +| [DeprecatedCurrencyPipe](https://angular.io/api/common/DeprecatedCurrencyPipe) | [CurrencyPipe](https://angular.io/api/common/CurrencyPipe) | v5 | none | +| [DeprecatedDatePipe](https://angular.io/api/common/DeprecatedDatePipe) | [DatePipe](https://angular.io/api/common/DatePipe) | v5 | none | +| [DeprecatedDecimalPipe](https://angular.io/api/common/DeprecatedDecimalPipe) | [DecimalPipe](https://angular.io/api/common/DecimalPipe) | v5 | none | +| [DeprecatedPercentPipe](https://angular.io/api/common/DeprecatedPercentPipe) | [PercentPipe](https://angular.io/api/common/PercentPipe) v5 | | none | + + + + + + + +### @angular/core + + +The following exports from `@angular/care` are deprecated: + +Package | API | Deprecation announced | Removed in | Details | Replacement +------- | --- | --------------------- | ---------- | ------- | ----------- +core | animate | v5 or earlier | ? | none | tbd +core | AnimationAnimateMetadata | v5 or earlier | ? | none | tbd +core | AnimationEntryMetadata | v5 or earlier | ? | none | tbd +core | AnimationGroupMetadata | v5 or earlier | ? | none | tbd +core | AnimationKeyframe | v5 or earlier | ? | none | tbd +core | AnimationKeyframesSequenceMetadata | v5 or earlier | ? | none | tbd +core | AnimationMetadata | v5 or earlier | ? | none | tbd +core | AnimationPlayer | v5 or earlier | ? | none | tbd +core | AnimationSequenceMetadata | v5 or earlier | ? | none | tbd +core | AnimationStateMetadata | v5 or earlier | ? | none | tbd +core | AnimationStateTransitionMetadata | v5 or earlier | ? | none | tbd +core | AnimationStyleMetadata | v5 or earlier | ? | none | tbd +core | AnimationStyles | v5 or earlier | ? | none | tbd +core | AnimationTransitionEvent | v5 or earlier | ? | none | tbd +core | AnimationTransitionMetadata | v5 or earlier | ? | none | tbd +core | AnimationTriggerMetadata | v5 or earlier | ? | none | tbd +core | AUTO_STYLE | v5 or earlier | ? | none | tbd +core | [CollectionChangeRecord](https://angular.io/api/core/CollectionChangeRecord) | v4.0.0 | in v7 docs | none | [IterableChangeRecord](https://angular.io/api/core/IterableChangeRecord) +core | [DefaultIterableDiffer](https://angular.io/api/core/DefaultIterableDiffer) | v4.0.0 | in v7 docs | Should not be part of public API. | not applicable +core | group | v5 or earlier | ? | none | tbd +core | keyframes | v5 or earlier | ? | none | tbd +core | [ReflectiveInjector](https://angular.io/api/core/ReflectiveInjector) | v5 | in v7 docs | Slow and brings in a lot of code. | [Injector.create](https://angular.io/api/core/Injector#create) +core | [ReflectiveKey](https://angular.io/api/core/ReflectiveKey) | marked in v6, can't check v5 | in v7 docs | No replacement +core | [RenderComponentType](https://angular.io/api/core/RenderComponentType) | marked in v4 docs | in v7 docs | none | [`RendererType2`](https://angular.io/api/core/RendererType2) and [`Renderer2`](https://angular.io/api/core/Renderer2) +core | [Renderer](https://angular.io/api/core/Renderer) | marked in v4 docs | in v7 docs | none | [`Renderer2`](https://angular.io/api/core/Renderer2) +core | [RootRenderer](https://angular.io/api/core/RootRenderer) | marked in v4 docs | in v7 docs | none | [`RendererFactory2`](https://angular.io/api/core/RendererFactory2) +core | sequence | v5 or earlier | ? | none | tbd +core | state | v5 or earlier | ? | none | tbd +core | style | v5 or earlier | ? | none | tbd +core | transition | v5 or earlier | ? | none | tbd +core | trigger| v5 or earlier | ? | none | tbd + + + + +### @angular/forms + + +The following exports from `@angular/forms` are deprecated: + + +Package | API | Deprecation announced | Removed in | Details | Replacement +------- | --- | --------------------- | ---------- | ------- | ----------- +forms | [NgForm](https://angular.io/api/forms/NgForm) | v6 | will be removed in v9 | This has been deprecated to keep selectors consistent with other core Angular selectors, as element selectors are typically written in kebab-case. | See description in [NgForm](https://angular.io/api/forms/NgForm). Now deprecated: ``. Replacement: ``. +forms | [NgFormSelectorWarning](https://angular.io/api/forms/NgFormSelectorWarning) | v6 (page added to API ref in v7 docs) | will be removed in v9 | This directive is solely used to display warnings when the deprecated ngForm selector is used. | not applicable + +Support for using ngForm element selector has been deprecated in Angular v6 and will be removed in Angular v9. + +This has been deprecated to keep selectors consistent with other core Angular selectors, as element selectors are typically written in kebab-case. + +For details, see https://angular.io/api/forms/NgForm#description + + + +### @angular/platform-browser + + +The following exports from `@angular/platform-browser` are deprecated: + + +Package | API | Deprecation announced | Removed in | Details | Replacement +------- | --- | --------------------- | ---------- | ------- | ----------- +platform-browser | [platform-browser/DOCUMENT](https://angular.io/api/platform-browser/DOCUMENT) | marked deprecated as far back as v4 docs | in v7 docs | none | Import from [`@angular/common`](https://angular.io/api/common/DOCUMENT) +platform-browser | [NgProbeToken](https://v4.angular.io/api/platform-browser/NgProbeToken) | marked deprecated as far back as API Reference (v2.4.10) docs | not in docs v5+ | none | [Use the one from `@angular/core`](https://angular.io/api/core/NgProbeToken) + +### @angular/router + +The following exports from `@angular/router` are deprecated: + +Package | API | Deprecation announced | Removed in | Details | Replacement +------- | --- | --------------------- | ---------- | ------- | ----------- +router | [RouterLink](https://angular.io/api/router/RouterLink) | v4 | candidate v7 | none | `queryParamsHandling` + + +Two older properties are still available. They are less capable than their replacements, discouraged, and may be deprecated in a future Angular version. + +* params—An Observable that contains the required and optional parameters specific to the route. Use paramMap instead. + +* queryParams—An Observable that contains the query parameters available to all routes. Use queryParamMap instead. + +See https://angular.io/guide/router#activated-route + + +### @angular/upgrade + + +The following exports from `@angular/upgrade` are deprecated: + + +Package | API | Deprecation announced | Removed in | Details | Replacement +------- | --- | --------------------- | ---------- | ------- | ----------- +upgrade | entire [`@angular/upgrade`](https://angular.io/api/upgrade) package | v5? | in nv7 docs | All exports of this entry point are deprecated. Supports the upgrade path from AngularJS to Angular, allowing components from both systems to be used in the same application. All exports of this entry point are deprecated. Use [@angular/upgrade/static](https://angular.io/api/upgrade/static). For more information about upgrading from AngularJS to Angular, see [Upgrading from AngularJS](https://angular.io/guide/upgrade). | none +upgrade | [UpgradeAdapter](https://angular.io/api/upgrade/UpgradeAdapter) | v5 | in v7 docs | none | Use [`upgrade/static`](https://angular.io/api/upgrade/static) instead, which also supports [Ahead-of-Time compilation](guide/aot-compiler) +upgrade | [UpgradeAdapterRef](https://angular.io/api/upgrade/UpgradeAdapterRef) | v5 | in v7 docs | none | Use [`upgrade/static`](https://angular.io/api/upgrade/static) instead, which also supports [Ahead-of-Time compilation](guide/aot-compiler) +upgrade/static | [getAngularLib](https://angular.io/api/upgrade/static/getAngularLib) | marked in v5 docs | in v7 docs | none | Use [`getAngularJSGlobal`](https://angular.io/api/upgrade/static/getAngularJSGlobal) instead +upgrade/static | [setAngularLib](https://angular.io/api/upgrade/static/setAngularLib) | marked in v5 docs | in v7 docs | none | Use [`setAngularJSGlobal`](https://angular.io/api/upgrade/static/setAngularJSGlobal) instead + + + +{@a features} +## Deprecated features + + +### Component styles + +The shadow-piercing descendant combinator is deprecated and support is being removed from major browsers and tools. As such, we plan to drop support in Angular for all 3 of `/deep/`, `>>>` and `::ng-deep`). Until then `::ng-deep` is preferred for broader compatibility with the tools. + +For more information, see [/deep/, >>>, and ::ng-deep](guide/component-styles#deprecated-deep--and-ng-deep "Component Styles guide, Deprecated deep and ngdeep") + in the Component Styles guide]. + + +### ngModel with reactive forms + +Support for using the `ngModel` input property and `ngModelChange` event with reactive form directives was deprecated in version 6.0.0. + +For more information, see the [usage notes of FormControlDirective](api/forms/FormControlDirective#use-with-ngmodel) and [FormControlName](api/forms/FormControlName#use-with-ngmodel). + + + + +### Service worker versionedFiles + +6.1.0 (2018-07-25) and 6.0.2 (2018-05-15) +service-worker: deprecate versionedFiles in asset-group resources (#23584) (1d378e2) +As of v6 `versionedFiles` and `files` options have the same behavior. Use `files` instead. + +https://angular.io/guide/service-worker-config + +As of v6 `versionedFiles` and `files` options have the same behavior. Use `files` instead. + +From update.angular.io 6.1 to 7.0: f you use the Angular Service worker, migrate any `versionedFiles` to the `files` array. The behavior is the same. + + + + +### ReflectiveInjector replaced with StaticInjector (From blog) +In order to remove even more polyfills, we’ve replaced the ReflectiveInjector with the StaticInjector. This injector no longer requires the Reflect polyfill, reducing application size for most developers. + +Before +ReflectiveInjector.resolveAndCreate(providers); + +After +Injector.create(providers); + +Note: This is marked v4 in the API reference docs. + + +{@a i18n-pipes} +### Pipes that use the JS Intl API + + + + +Angular used to rely on the browser to provide number, date, and currency formatting using browser i18n APIs. This practice meant that most apps needed to use a polyfill, users were seeing inconsistent results across browsers, and common formats (such as the currency pipe) didn’t match developer expectations out of the box. + +In version 4.3, Angular introduced new number, date, and currency pipes that increase standardization across browsers and eliminate the need for i18n polyfills. These pipes use the CLDR (instead of the JS Intl API) to provide extensive locale support. + +In 5.0.0, Angular updated its pipes to use the CLRD implementation. +At the same time, it introduced `DeprecatedI18NPipesModule` to provide access to the old behavior. +[DeprecatedCurrencyPipe](https://angular.io/api/common/DeprecatedCurrencyPipe) +[DeprecatedDatePipe](https://angular.io/api/common/DeprecatedDatePipe) +[DeprecatedDecimalPipe](https://angular.io/api/common/DeprecatedDecimalPipe) +[DeprecatedPercentPipe](https://angular.io/api/common/DeprecatedPercentPipe) + +All `Deprecated` pipes are deprecated and candidates for removal beginning in version 8.0.0 + + + +For more information about the mapping of pipe behavior between v4 and v5, see [Date Formats](https://docs.google.com/spreadsheets/d/12iygt-_cakNP1VO7MV9g4lq9NsxVWG4tSfc98HpHb0k/edit#gid=0 "Date Formats Google sheet"). + +Read more about the changes to our i18n pipes in the changelog. https://github.com/angular/angular/blob/master/CHANGELOG.md#i18n-pipes + +If you aren’t ready for the new pipes, you can import `DeprecatedI18NPipesModule` to get access to the old behavior. + + + +If you use the following deprecated i18n pipes: +* date, +* currency, +* decimal, +* percent + +You need the Intl API on all browsers except Chrome, Firefox, Edge, IE11 and Safari 10. + + + +## Removed in v6 + +The following APIs were removed in v6.0.0. + +* Animations APIs were moved from [`@angular/core/animations`](https://v5.angular.io/api/animations) to [`@angular/animations`](api/animations). +In v6.0.0, [`@angular/core/animations`](https://v5.angular.io/api/animations) was removed. +Imports from `@angular/core` were [announced as deprecated in v4](https://blog.angularjs.org/2017/03/angular-400-now-available.html). +Use imports from the new package import { trigger, state, style, transition, animate } from `@angular/animations`. +If you import any animations services or tools from `@angular/core`, you should import them from `@angular/animations`. + +* The `