From 1de742095b1fa4002f7de899f30e56c1ad4ff1e7 Mon Sep 17 00:00:00 2001 From: Chellappan Date: Fri, 19 May 2023 23:56:36 +0530 Subject: [PATCH 01/32] refactor(core): Remove unused import from the graph.ts (#50372) This commit updates the code to remove unused import of the `throwInvalidWriteToSignalError` symbol. PR Close #50372 --- packages/core/src/signals/src/graph.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/src/signals/src/graph.ts b/packages/core/src/signals/src/graph.ts index a822877e3fb9..1666fef6d8d2 100644 --- a/packages/core/src/signals/src/graph.ts +++ b/packages/core/src/signals/src/graph.ts @@ -10,7 +10,6 @@ // global `ngDevMode` type is defined. import '../../util/ng_dev_mode'; -import {throwInvalidWriteToSignalError} from './errors'; import {newWeakRef, WeakRef} from './weak_ref'; /** From 92cc178fc2cd014411dc8daf015f6b8a9d92622c Mon Sep 17 00:00:00 2001 From: alkavats1 Date: Tue, 23 May 2023 18:47:02 +0530 Subject: [PATCH 02/32] docs: remove unused imports and improved the code (#50424) PR Close #50424 --- .../src/lib/directive-forest/render-tree.ts | 3 +-- .../property-tab/property-tab-header.component.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/devtools/projects/ng-devtools-backend/src/lib/directive-forest/render-tree.ts b/devtools/projects/ng-devtools-backend/src/lib/directive-forest/render-tree.ts index 174a182a9feb..a2d3801e9a96 100644 --- a/devtools/projects/ng-devtools-backend/src/lib/directive-forest/render-tree.ts +++ b/devtools/projects/ng-devtools-backend/src/lib/directive-forest/render-tree.ts @@ -68,7 +68,6 @@ export class RTreeStrategy { } const getComponent = (window as any).ng.getComponent as (element: Element) => {}; const getDirectives = (window as any).ng.getDirectives as (node: Node) => {}[]; - const result = extractViewTree(element, [], getComponent, getDirectives); - return result; + return extractViewTree(element, [], getComponent, getDirectives); } } diff --git a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.ts b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.ts index abc5e7cf5cd5..4d8228cefddb 100644 --- a/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.ts +++ b/devtools/projects/ng-devtools/src/lib/devtools-tabs/directive-explorer/property-tab/property-tab-header.component.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core'; +import {ChangeDetectionStrategy, Component, Input} from '@angular/core'; import {IndexedNode} from '../directive-forest/index-forest'; From fc6b10cb159f18963550d4e1ede94fd1b6e51fae Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 25 May 2023 01:32:57 +0000 Subject: [PATCH 03/32] build: update dependency https-proxy-agent to v7 (#50456) See associated pull request for more information. PR Close #50456 --- package.json | 2 +- yarn.lock | 19 ++++++++++--------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index e370f07dfa5e..3833cd750586 100644 --- a/package.json +++ b/package.json @@ -194,7 +194,7 @@ "// 6": "Ensure that a single instance of the `saucelabs` package is used. Protractor and the Karma sauce launcher pull this package as dependency. A single instance allows for e.g. easier patching in the Karma config.", "resolutions": { "**/graceful-fs": "4.2.11", - "**/https-proxy-agent": "6.1.0", + "**/https-proxy-agent": "7.0.0", "**/saucelabs": "7.2.1" } } diff --git a/yarn.lock b/yarn.lock index c913c75316cf..9531bbd89db2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3603,6 +3603,7 @@ "@types/node" "*" "@types/selenium-webdriver4@npm:@types/selenium-webdriver@4.1.14", "@types/selenium-webdriver@^4.0.18": + name "@types/selenium-webdriver4" version "4.1.14" resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.14.tgz#4ce2839c35f751f5d497ae4e25989734a16dd555" integrity sha512-3vy3tbKfMWLhKMoZSnFAMZRf4Z1e8/zgpxIqXG7G2Coc8Rvf1QBvgpJDxxdnTuDFL6ZfymiGUHd8itwTmuEpeA== @@ -4153,10 +4154,10 @@ agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: dependencies: debug "4" -agent-base@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.0.1.tgz#ec4df4e6406bdf71490ade302ea45f86bf365ea9" - integrity sha512-V9to8gr2GK7eA+xskWGAFUX/TLSQKuH2TI06c/jGLL6yLp3oEjtnqM7a5tPV9fC1rabLeAgThZeBwsYX+WWHpw== +agent-base@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== dependencies: debug "^4.3.4" @@ -9453,12 +9454,12 @@ http2-wrapper@^1.0.0-beta.5.2: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-proxy-agent@5, https-proxy-agent@5.0.1, https-proxy-agent@6.1.0, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-6.1.0.tgz#e00f1efb849171ea349721481d3bcbef03ab4d13" - integrity sha512-rvGRAlc3y+iS7AC9Os2joN91mX8wHpJ4TEklmHHxr7Gz2Juqa7fJmJ8wWxXNpTaRt56MQTwojxV5d82UW/+jwg== +https-proxy-agent@5, https-proxy-agent@5.0.1, https-proxy-agent@7.0.0, https-proxy-agent@^2.2.1, https-proxy-agent@^4.0.0, https-proxy-agent@^5.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz#75cb70d04811685667183b31ab158d006750418a" + integrity sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw== dependencies: - agent-base "^7.0.1" + agent-base "^7.0.2" debug "4" human-signals@^2.1.0: From df65c4fc8f71ab9bf59ec4e5e820d136b12fb570 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Tue, 16 May 2023 12:38:47 +0200 Subject: [PATCH 04/32] fix(animations): Trigger leave animation when ViewContainerRef is injected (#48705) Injecting `ViewContainerRef` into a component makes it effectively a container. The leave animation wasn't triggered on containers before this fix. fixes angular#48667 PR Close #48705 --- .../src/render/animation_engine_next.ts | 4 +- .../src/render/transition_animation_engine.ts | 10 ++-- .../transition_animation_engine_spec.ts | 4 +- .../animation/animation_integration_spec.ts | 52 ++++++++++++++++++- .../animations/src/animation_renderer.ts | 2 +- 5 files changed, 60 insertions(+), 12 deletions(-) diff --git a/packages/animations/browser/src/render/animation_engine_next.ts b/packages/animations/browser/src/render/animation_engine_next.ts index f34f17273d4a..080c7c04a1f7 100644 --- a/packages/animations/browser/src/render/animation_engine_next.ts +++ b/packages/animations/browser/src/render/animation_engine_next.ts @@ -72,8 +72,8 @@ export class AnimationEngine { this._transitionEngine.insertNode(namespaceId, element, parent, insertBefore); } - onRemove(namespaceId: string, element: any, context: any, isHostElement?: boolean): void { - this._transitionEngine.removeNode(namespaceId, element, isHostElement || false, context); + onRemove(namespaceId: string, element: any, context: any): void { + this._transitionEngine.removeNode(namespaceId, element, context); } disableAnimations(element: any, disable: boolean) { diff --git a/packages/animations/browser/src/render/transition_animation_engine.ts b/packages/animations/browser/src/render/transition_animation_engine.ts index 6b861945f2d4..e30b43277f6c 100644 --- a/packages/animations/browser/src/render/transition_animation_engine.ts +++ b/packages/animations/browser/src/render/transition_animation_engine.ts @@ -744,7 +744,7 @@ export class TransitionAnimationEngine { } } - removeNode(namespaceId: string, element: any, isHostElement: boolean, context: any): void { + removeNode(namespaceId: string, element: any, context: any): void { if (isElementNode(element)) { const ns = namespaceId ? this._fetchNamespace(namespaceId) : null; if (ns) { @@ -753,11 +753,9 @@ export class TransitionAnimationEngine { this.markElementAsRemoved(namespaceId, element, false, context); } - if (isHostElement) { - const hostNS = this.namespacesByHostElement.get(element); - if (hostNS && hostNS.id !== namespaceId) { - hostNS.removeNode(element, context); - } + const hostNS = this.namespacesByHostElement.get(element); + if (hostNS && hostNS.id !== namespaceId) { + hostNS.removeNode(element, context); } } else { this._onRemovalComplete(element, context); diff --git a/packages/animations/browser/test/render/transition_animation_engine_spec.ts b/packages/animations/browser/test/render/transition_animation_engine_spec.ts index 3e92b0ae34a8..cbe5817c18d8 100644 --- a/packages/animations/browser/test/render/transition_animation_engine_spec.ts +++ b/packages/animations/browser/test/render/transition_animation_engine_spec.ts @@ -116,7 +116,7 @@ describe('TransitionAnimationEngine', () => { expect(engine.elementContainsData(DEFAULT_NAMESPACE_ID, element)).toBeTruthy(); - engine.removeNode(DEFAULT_NAMESPACE_ID, element, true, true); + engine.removeNode(DEFAULT_NAMESPACE_ID, element, true); engine.flush(); expect(engine.elementContainsData(DEFAULT_NAMESPACE_ID, element)).toBeTruthy(); @@ -171,7 +171,7 @@ describe('TransitionAnimationEngine', () => { expect(engine.statesByElement.has(element)).toBe(true, 'Expected parent data to be defined.'); expect(engine.statesByElement.has(child)).toBe(true, 'Expected child data to be defined.'); - engine.removeNode(DEFAULT_NAMESPACE_ID, element, true, true); + engine.removeNode(DEFAULT_NAMESPACE_ID, element, true); engine.flush(); engine.players[0].finish(); diff --git a/packages/core/test/animation/animation_integration_spec.ts b/packages/core/test/animation/animation_integration_spec.ts index 4f31a10c04f3..a55712c207a9 100644 --- a/packages/core/test/animation/animation_integration_spec.ts +++ b/packages/core/test/animation/animation_integration_spec.ts @@ -8,7 +8,7 @@ import {animate, animateChild, animation, AnimationEvent, AnimationMetadata, AnimationOptions, AUTO_STYLE, group, keyframes, query, sequence, state, style, transition, trigger, useAnimation, ɵPRE_STYLE as PRE_STYLE} from '@angular/animations'; import {AnimationDriver, ɵAnimationEngine, ɵNoopAnimationDriver as NoopAnimationDriver} from '@angular/animations/browser'; import {MockAnimationDriver, MockAnimationPlayer} from '@angular/animations/browser/testing'; -import {ChangeDetectorRef, Component, HostBinding, HostListener, Inject, RendererFactory2, ViewChild} from '@angular/core'; +import {ChangeDetectorRef, Component, HostBinding, HostListener, Inject, RendererFactory2, ViewChild, ViewContainerRef} from '@angular/core'; import {fakeAsync, flushMicrotasks, TestBed} from '@angular/core/testing'; import {ɵDomRendererFactory2} from '@angular/platform-browser'; import {ANIMATION_MODULE_TYPE, BrowserAnimationsModule, NoopAnimationsModule} from '@angular/platform-browser/animations'; @@ -909,6 +909,56 @@ describe('animation tests', function() { ]); })); + it('should trigger a leave animation when the inner has ViewContainerRef injected', + fakeAsync(() => { + @Component({ + selector: 'parent-cmp', + template: ` + + ` + }) + class ParentCmp { + public exp = true; + } + + @Component({ + selector: 'child-cmp', + template: '...', + animations: [trigger( + 'host', + [transition(':leave', [style({opacity: 1}), animate(1000, style({opacity: 0}))])])] + }) + class ChildCmp { + @HostBinding('@host') public hostAnimation = true; + constructor(private vcr: ViewContainerRef) {} + } + + TestBed.configureTestingModule({declarations: [ParentCmp, ChildCmp]}); + + const engine = TestBed.inject(ɵAnimationEngine); + const fixture = TestBed.createComponent(ParentCmp); + const cmp = fixture.componentInstance; + fixture.detectChanges(); + engine.flush(); + expect(getLog().length).toEqual(0); + + cmp.exp = false; + fixture.detectChanges(); + expect(fixture.debugElement.nativeElement.children.length).toBe(1); + + engine.flush(); + expect(getLog().length).toEqual(1); + + const [player] = getLog(); + expect(player.keyframes).toEqual([ + new Map([['opacity', '1'], ['offset', 0]]), + new Map([['opacity', '0'], ['offset', 1]]), + ]); + + player.finish(); + expect(fixture.debugElement.nativeElement.children.length).toBe(0); + })); + it('should trigger a leave animation when the inner components host binding updates', fakeAsync(() => { @Component({ diff --git a/packages/platform-browser/animations/src/animation_renderer.ts b/packages/platform-browser/animations/src/animation_renderer.ts index 8f4166f7bcbc..0a34bdd219cd 100644 --- a/packages/platform-browser/animations/src/animation_renderer.ts +++ b/packages/platform-browser/animations/src/animation_renderer.ts @@ -180,7 +180,7 @@ export class BaseAnimationRenderer implements Renderer2 { } removeChild(parent: any, oldChild: any, isHostElement: boolean): void { - this.engine.onRemove(this.namespaceId, oldChild, this.delegate, isHostElement); + this.engine.onRemove(this.namespaceId, oldChild, this.delegate); } selectRootElement(selectorOrNode: any, preserveContent?: boolean) { From 1c37a83e1b1df4b2fce7755b00dae30f92f6abc8 Mon Sep 17 00:00:00 2001 From: Dylan Hunn Date: Thu, 25 May 2023 16:02:01 -0400 Subject: [PATCH 05/32] Revert "fix(http): create macrotask during request handling instead of load start (#50406)" (#50475) This reverts commit 2cdb4c5911965aa273f11432e04502e52b5e1b9b. PR Close #50475 --- packages/common/http/src/xhr.ts | 47 +++++++++++++-------------------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/packages/common/http/src/xhr.ts b/packages/common/http/src/xhr.ts index ce24a2201313..8a6e2300f893 100644 --- a/packages/common/http/src/xhr.ts +++ b/packages/common/http/src/xhr.ts @@ -60,10 +60,6 @@ export class HttpXhrBackend implements HttpBackend { `Cannot make a JSONP request without JSONP support. To fix the problem, either add the \`withJsonpSupport()\` call (if \`provideHttpClient()\` is used) or import the \`HttpClientJsonpModule\` in the root NgModule.`); } - // Schedule a macrotask. This will cause NgZone.isStable to be set to false, - // Which delays server rendering until the request is completed. - const macroTaskCanceller = createBackgroundMacroTask(); - // Check whether this factory has a special function to load an XHR implementation // for various non-browser environments. We currently limit it to only `ServerXhr` // class, which needs to load an XHR implementation. @@ -235,11 +231,7 @@ export class HttpXhrBackend implements HttpBackend { statusText: xhr.statusText || 'Unknown Error', url: url || undefined, }); - observer.error(res); - - // Cancel the background macrotask. - macroTaskCanceller(); }; // The sentHeaders flag tracks whether the HttpResponseHeaders event @@ -317,31 +309,35 @@ export class HttpXhrBackend implements HttpBackend { } } + let macroTaskCanceller: VoidFunction|undefined; + /** Tear down logic to cancel the backround macrotask. */ - const onLoadEnd = () => macroTaskCanceller(); + const onLoadStart = () => { + macroTaskCanceller ??= createBackgroundMacroTask(); + }; + const onLoadEnd = () => { + macroTaskCanceller?.(); + }; + xhr.addEventListener('loadstart', onLoadStart); xhr.addEventListener('loadend', onLoadEnd); // Fire the request, and notify the event stream that it was fired. - try { - xhr.send(reqBody!); - } catch (e: any) { - onError(e); - } - + xhr.send(reqBody!); observer.next({type: HttpEventType.Sent}); // This is the return from the Observable function, which is the // request cancellation handler. return () => { // On a cancellation, remove all registered event listeners. + xhr.removeEventListener('loadstart', onLoadStart); xhr.removeEventListener('loadend', onLoadEnd); xhr.removeEventListener('error', onError); xhr.removeEventListener('abort', onError); xhr.removeEventListener('load', onLoad); xhr.removeEventListener('timeout', onError); - // Cancel the background macrotask. - macroTaskCanceller(); + // Cancel the background macrotask. + macroTaskCanceller?.(); if (req.reportProgress) { xhr.removeEventListener('progress', onDownProgress); @@ -361,8 +357,11 @@ export class HttpXhrBackend implements HttpBackend { } } +// Cannot use `Number.MAX_VALUE` as it does not fit into a 32-bit signed integer. +const MAX_INT = 2147483647; + /** - * A method that creates a background macrotask using Zone.js. + * A method that creates a background macrotask of up to Number.MAX_VALUE. * * This is so that Zone.js can intercept HTTP calls, this is important for server rendering, * as the application is only rendered once the application is stabilized, meaning there are pending @@ -371,15 +370,7 @@ export class HttpXhrBackend implements HttpBackend { * @returns a callback method to cancel the macrotask. */ function createBackgroundMacroTask(): VoidFunction { - // We use Zone.js when it's defined as otherwise a `setTimeout` will leave open timers which - // causes `fakeAsync` tests to fail. - const noop = () => {}; - if (typeof Zone !== 'undefined') { - const zoneCurrent = Zone.current; - const task = zoneCurrent.scheduleMacroTask('httpMacroTask', noop, undefined, noop, noop); - - return () => zoneCurrent.cancelTask(task); - } + const timeout = setTimeout(() => void 0, MAX_INT); - return noop; + return () => clearTimeout(timeout); } From a37218d316278eb8f6469b9d3328652a59fad3b2 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Tue, 30 May 2023 10:24:57 +0000 Subject: [PATCH 06/32] docs: remove outdated command to run Angular CLI when using `ng-dev misc build-and-link` (#50512) Setting `BAZEL_TARGET="1"` is no longer needed as NGCC has been removed. PR Close #50512 --- docs/DEVELOPER.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/DEVELOPER.md b/docs/DEVELOPER.md index a7cc7dd1bc8f..486c31114c63 100644 --- a/docs/DEVELOPER.md +++ b/docs/DEVELOPER.md @@ -110,13 +110,9 @@ When making changes to Angular packages and testing in a local library/project y The Angular CLI needs to be invoked using Node.js [`--preserve-symlinks`](https://nodejs.org/api/cli.html#--preserve-symlinks) flag. Otherwise the symbolic links will be resolved using their real path which causes node module resolution to fail. -##### Windows - -`set BAZEL_TARGET="1" && node --preserve-symlinks node_modules/@angular/cli/lib/init.js serve` - -##### Unix Systems - -`BAZEL_TARGET="1" node --preserve-symlinks node_modules/.bin/ng serve` +```sh +node --preserve-symlinks node_modules/@angular/cli/lib/init.js serve +``` ## Formatting your source code From 684928a2adb7d0b56c9b44840113b55485476b2e Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Tue, 30 May 2023 12:10:10 +0000 Subject: [PATCH 07/32] docs: update CLI command to include `--preserve-symlinks-main` (#50512) This is needed to instructs the module loader to preserve symbolic links when resolving and caching the main module. More information about this flag can be found: https://nodejs.org/api/cli.html#--preserve-symlinks-main Closes: #50515 PR Close #50512 --- docs/DEVELOPER.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DEVELOPER.md b/docs/DEVELOPER.md index 486c31114c63..773009b66ccf 100644 --- a/docs/DEVELOPER.md +++ b/docs/DEVELOPER.md @@ -111,7 +111,7 @@ When making changes to Angular packages and testing in a local library/project y The Angular CLI needs to be invoked using Node.js [`--preserve-symlinks`](https://nodejs.org/api/cli.html#--preserve-symlinks) flag. Otherwise the symbolic links will be resolved using their real path which causes node module resolution to fail. ```sh -node --preserve-symlinks node_modules/@angular/cli/lib/init.js serve +node --preserve-symlinks --preserve-symlinks-main node_modules/@angular/cli/lib/init.js serve ``` ## Formatting your source code From f6db406f25e87a95df92a9f109448b7abb0d5d3c Mon Sep 17 00:00:00 2001 From: alkavats1 Date: Fri, 26 May 2023 21:11:32 +0530 Subject: [PATCH 08/32] docs: updated the deprecated tag of width in table tag (#50487) PR Close #50487 --- .../examples/ngcontainer/src/app/app.component.html | 4 ++-- aio/tools/transforms/templates/cli/lib/cli.html | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/aio/content/examples/ngcontainer/src/app/app.component.html b/aio/content/examples/ngcontainer/src/app/app.component.html index 3104603ec03b..20fd65bceebb 100644 --- a/aio/content/examples/ngcontainer/src/app/app.component.html +++ b/aio/content/examples/ngcontainer/src/app/app.component.html @@ -186,8 +186,8 @@

<ng-container> and <table>

- - + + diff --git a/aio/tools/transforms/templates/cli/lib/cli.html b/aio/tools/transforms/templates/cli/lib/cli.html index 90594ef1e68a..a05c09b4b39b 100644 --- a/aio/tools/transforms/templates/cli/lib/cli.html +++ b/aio/tools/transforms/templates/cli/lib/cli.html @@ -12,8 +12,8 @@
DirectiveTypeDirectiveType Description
- - + + @@ -38,8 +38,8 @@
ArgumentDescriptionArgumentDescription Value Type
- - + + From dabf24dd021fa0b8085096e14a2984fe62cb2510 Mon Sep 17 00:00:00 2001 From: alkavats1 Date: Fri, 26 May 2023 16:28:54 +0530 Subject: [PATCH 09/32] docs: refactored the markup tags (#50481) PR Close #50481 --- .../app/package-search/package-search.component.html | 6 +++--- .../examples/ngcontainer/src/app/app.component.html | 4 ++-- .../property-binding/src/app/app.component.html | 12 ++++++------ 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/aio/content/examples/http/src/app/package-search/package-search.component.html b/aio/content/examples/http/src/app/package-search/package-search.component.html index 85c3402fcf99..6ad932342075 100644 --- a/aio/content/examples/http/src/app/package-search/package-search.component.html +++ b/aio/content/examples/http/src/app/package-search/package-search.component.html @@ -1,6 +1,6 @@

Search Npm Packages

-

Searches when typing stops. Caches for 30 seconds.

+

Searches when typing stops. Caches for 30 seconds.

@@ -10,8 +10,8 @@

Search Npm Packages

  • - {{package.name}} v.{{package.version}} - - {{package.description}} + {{package.name}} v.{{package.version}} - + {{package.description}}
diff --git a/aio/content/examples/ngcontainer/src/app/app.component.html b/aio/content/examples/ngcontainer/src/app/app.component.html index 20fd65bceebb..523a55df5ffd 100644 --- a/aio/content/examples/ngcontainer/src/app/app.component.html +++ b/aio/content/examples/ngcontainer/src/app/app.component.html @@ -110,7 +110,7 @@

<ng-container> and layout-sensitive elements

#1 <ng-container> and <options>

-

<select> with <span>

+

<select> with <span>

Pick your favorite hero () @@ -123,7 +123,7 @@

#1 <ng-container> and <options>

-

<select> with <ng-container>

+

<select> with <ng-container>

Pick your favorite hero () diff --git a/aio/content/examples/property-binding/src/app/app.component.html b/aio/content/examples/property-binding/src/app/app.component.html index 0c50825400ef..69af966d7467 100644 --- a/aio/content/examples/property-binding/src/app/app.component.html +++ b/aio/content/examples/property-binding/src/app/app.component.html @@ -46,21 +46,21 @@

Pass objects:


Property binding and interpolation

-

Interpolated item is the interpolated image.

-

Property Bound item is the property bound image.

+

Interpolated item is the interpolated image.

+

Property Bound item is the property bound image.

-

"{{interpolationTitle}}" is the interpolated title.

-

"" is the property bound title.

+

"{{interpolationTitle}}" is the interpolated title.

+

"" is the property bound title.


Malicious content

-

"{{evilTitle}}" is the interpolated evil title.

+

"{{evilTitle}}" is the interpolated evil title.

-

"" is the property bound evil title.

+

"" is the property bound evil title.

From 04a020a77a66257b328f066723af929fec407b03 Mon Sep 17 00:00:00 2001 From: Asheer Rizvi Date: Fri, 26 May 2023 14:33:34 +0530 Subject: [PATCH 10/32] docs: corrected method name for "Tap into the Observable" section (#50479) At this point in the tutorial we are still talking about the `getHeroes()` method. Corrected the method name to reflect that since the final piece of code within this section is for `getHeroes()` PR Close #50479 --- aio/content/tutorial/tour-of-heroes/toh-pt6.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/content/tutorial/tour-of-heroes/toh-pt6.md b/aio/content/tutorial/tour-of-heroes/toh-pt6.md index c7285bb8ee82..24d22697ed5a 100644 --- a/aio/content/tutorial/tour-of-heroes/toh-pt6.md +++ b/aio/content/tutorial/tour-of-heroes/toh-pt6.md @@ -179,7 +179,7 @@ Because each service method returns a different kind of `Observable` result, `ha ### Tap into the Observable -The `getHero()` method taps into the flow of observable values and sends a message, using the `log()` method, to the message area at the bottom of the page. +The `getHeros()` method taps into the flow of observable values and sends a message, using the `log()` method, to the message area at the bottom of the page. The RxJS `tap()` operator enables this ability by looking at the observable values, doing something with those values, and passing them along. The `tap()` callback doesn't access the values themselves. From f517d18dd1afb626549269eb21df42f65192d586 Mon Sep 17 00:00:00 2001 From: alkavats1 Date: Fri, 26 May 2023 15:44:29 +0530 Subject: [PATCH 11/32] docs: removed the unused import and update the obsolete tag of width in table tag (#50474) PR Close #50474 --- packages/benchpress/src/sample_description.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/benchpress/src/sample_description.ts b/packages/benchpress/src/sample_description.ts index d1537e8e0347..de7dea35084f 100644 --- a/packages/benchpress/src/sample_description.ts +++ b/packages/benchpress/src/sample_description.ts @@ -6,7 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -import {InjectionToken} from '@angular/core'; import {Options} from './common_options'; import {Metric} from './metric'; From 5b148219fadc08f820b9c0e265eda28ea759042f Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Thu, 25 May 2023 15:44:17 +0000 Subject: [PATCH 12/32] fix(zone.js): enable monkey patching of the `queueMicrotask()` API in node.js (#50467) Similar to the browser, now we also monkey patch `queueMicrotask` in Node.js. This API was added in Node.js 11. PR Close #50467 --- packages/zone.js/karma-build.conf.js | 1 + packages/zone.js/lib/browser/browser.ts | 9 --------- packages/zone.js/lib/browser/rollup-common.ts | 1 + .../zone.js/lib/common/queue-microtask.ts | 19 +++++++++++++++++++ packages/zone.js/lib/node/node.ts | 1 + .../zone.js/lib/zone.configurations.api.ts | 4 ++-- packages/zone.js/test/browser-zone-setup.ts | 1 + packages/zone.js/test/browser_entry_point.ts | 1 - .../queue-microtask.spec.ts | 0 packages/zone.js/test/common_tests.ts | 1 + .../test/node_error_entry_point.init.ts | 1 + 11 files changed, 27 insertions(+), 12 deletions(-) create mode 100644 packages/zone.js/lib/common/queue-microtask.ts rename packages/zone.js/test/{browser => common}/queue-microtask.spec.ts (100%) diff --git a/packages/zone.js/karma-build.conf.js b/packages/zone.js/karma-build.conf.js index 943a610509fd..8d754070c7ea 100644 --- a/packages/zone.js/karma-build.conf.js +++ b/packages/zone.js/karma-build.conf.js @@ -13,5 +13,6 @@ module.exports = function(config) { config.files.push('build/test/test_fake_polyfill.js'); config.files.push('build/lib/zone.js'); config.files.push('build/lib/common/promise.js'); + config.files.push('build/lib/common/queue-microtask.js'); config.files.push('build/test/main.js'); }; diff --git a/packages/zone.js/lib/browser/browser.ts b/packages/zone.js/lib/browser/browser.ts index 88521a71f664..cd0c5150a318 100644 --- a/packages/zone.js/lib/browser/browser.ts +++ b/packages/zone.js/lib/browser/browser.ts @@ -25,15 +25,6 @@ Zone.__load_patch('legacy', (global: any) => { } }); -Zone.__load_patch('queueMicrotask', (global: any, Zone: ZoneType, api: _ZonePrivate) => { - api.patchMethod(global, 'queueMicrotask', delegate => { - return function(self: any, args: any[]) { - Zone.current.scheduleMicroTask('queueMicrotask', args[0]); - } - }); -}); - - Zone.__load_patch('timers', (global: any) => { const set = 'set'; const clear = 'clear'; diff --git a/packages/zone.js/lib/browser/rollup-common.ts b/packages/zone.js/lib/browser/rollup-common.ts index 7658b7da7c83..f8b9d48abbcc 100644 --- a/packages/zone.js/lib/browser/rollup-common.ts +++ b/packages/zone.js/lib/browser/rollup-common.ts @@ -10,3 +10,4 @@ import '../zone'; import '../common/promise'; import '../common/to-string'; import './api-util'; +import '../common/queue-microtask'; diff --git a/packages/zone.js/lib/common/queue-microtask.ts b/packages/zone.js/lib/common/queue-microtask.ts new file mode 100644 index 000000000000..253dd8f435f9 --- /dev/null +++ b/packages/zone.js/lib/common/queue-microtask.ts @@ -0,0 +1,19 @@ +/** + * @license + * Copyright Google LLC 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 + * @suppress {missingRequire} + */ + +Zone.__load_patch('queueMicrotask', (global: any, Zone: ZoneType, api: _ZonePrivate) => { + api.patchMethod(global, 'queueMicrotask', delegate => { + return function(self: any, args: any[]) { + Zone.current.scheduleMicroTask('queueMicrotask', args[0]); + } + }); +}); diff --git a/packages/zone.js/lib/node/node.ts b/packages/zone.js/lib/node/node.ts index 993138bf38fd..bf85413e1255 100644 --- a/packages/zone.js/lib/node/node.ts +++ b/packages/zone.js/lib/node/node.ts @@ -9,6 +9,7 @@ import './node_util'; import './events'; import './fs'; +import '../common/queue-microtask'; import {findEventTasks} from '../common/events'; import {patchTimer} from '../common/timers'; diff --git a/packages/zone.js/lib/zone.configurations.api.ts b/packages/zone.js/lib/zone.configurations.api.ts index c45ae9bb2a94..6a602b8cfff5 100644 --- a/packages/zone.js/lib/zone.configurations.api.ts +++ b/packages/zone.js/lib/zone.configurations.api.ts @@ -296,9 +296,9 @@ interface ZoneGlobalConfigurations { /** * - * Disable the monkey patching of the browser's `queueMicrotask()` API. + * Disable the monkey patching of the `queueMicrotask()` API. * - * By default, `zone.js` monkey patches the browser's `queueMicrotask()` API + * By default, `zone.js` monkey patches the `queueMicrotask()` API * to ensure that `queueMicrotask()` callback is invoked in the same zone as zone used to invoke * `queueMicrotask()`. And also the callback is running as `microTask` like * `Promise.prototype.then()`. diff --git a/packages/zone.js/test/browser-zone-setup.ts b/packages/zone.js/test/browser-zone-setup.ts index 264d797b7ac9..cfff6d9eaf43 100644 --- a/packages/zone.js/test/browser-zone-setup.ts +++ b/packages/zone.js/test/browser-zone-setup.ts @@ -11,6 +11,7 @@ if (typeof window !== 'undefined') { (window as any)[zoneSymbol('fakeAsyncAutoFakeAsyncWhenClockPatched')] = true; } import '../lib/common/to-string'; +import '../lib/common/queue-microtask'; import '../lib/browser/api-util'; import '../lib/browser/browser-legacy'; import '../lib/browser/browser'; diff --git a/packages/zone.js/test/browser_entry_point.ts b/packages/zone.js/test/browser_entry_point.ts index d3cf4518efaf..4bd23a30f0f0 100644 --- a/packages/zone.js/test/browser_entry_point.ts +++ b/packages/zone.js/test/browser_entry_point.ts @@ -28,4 +28,3 @@ import './mocha-patch.spec'; import './jasmine-patch.spec'; import './browser/messageport.spec'; import './extra/cordova.spec'; -import './browser/queue-microtask.spec'; diff --git a/packages/zone.js/test/browser/queue-microtask.spec.ts b/packages/zone.js/test/common/queue-microtask.spec.ts similarity index 100% rename from packages/zone.js/test/browser/queue-microtask.spec.ts rename to packages/zone.js/test/common/queue-microtask.spec.ts diff --git a/packages/zone.js/test/common_tests.ts b/packages/zone.js/test/common_tests.ts index 5539bae4ce6b..52c384fe7795 100644 --- a/packages/zone.js/test/common_tests.ts +++ b/packages/zone.js/test/common_tests.ts @@ -11,6 +11,7 @@ import './common/zone.spec'; import './common/task.spec'; import './common/util.spec'; import './common/Promise.spec'; +import './common/queue-microtask.spec'; import './common/fetch.spec'; import './common/Error.spec'; import './common/setInterval.spec'; diff --git a/packages/zone.js/test/node_error_entry_point.init.ts b/packages/zone.js/test/node_error_entry_point.init.ts index 651ec727c20f..1937170d07b2 100644 --- a/packages/zone.js/test/node_error_entry_point.init.ts +++ b/packages/zone.js/test/node_error_entry_point.init.ts @@ -11,6 +11,7 @@ import './test_fake_polyfill'; // Setup tests for Zone without microtask support import '../lib/zone'; import '../lib/common/promise'; +import '../lib/common/queue-microtask'; import '../lib/common/to-string'; import './test-env-setup-jasmine'; import './wtf_mock'; From 9970b29acef11f1dfedd2640520b4bca4b996f81 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Fri, 26 May 2023 12:00:59 +0000 Subject: [PATCH 13/32] fix(core): update `ApplicationRef.isStable` to account for rendering pending tasks (#50425) This commit updates the `ApplicationRef.isStable` API to account for pending rendering task. This is needed as once a pending rendering task is done, new macrotask and microtask could be created which previously caused these not to be intercepted and thus ignored when doing SSR. PR Close #50425 --- .../size-tracking/integration-payloads.json | 2 +- packages/common/http/src/transfer_cache.ts | 9 +-- packages/core/src/application_ref.ts | 15 ++++- packages/core/src/hydration/api.ts | 11 +--- .../core/src/initial_render_pending_tasks.ts | 60 ++++--------------- .../initial_render_pending_tasks_spec.ts | 37 ++++++------ .../bundle.golden_symbols.json | 18 ++++++ .../animations/bundle.golden_symbols.json | 18 ++++++ .../cyclic_import/bundle.golden_symbols.json | 18 ++++++ .../forms_reactive/bundle.golden_symbols.json | 21 ++++++- .../bundle.golden_symbols.json | 21 ++++++- .../hello_world/bundle.golden_symbols.json | 18 ++++++ .../hydration/bundle.golden_symbols.json | 12 ++++ .../router/bundle.golden_symbols.json | 6 ++ .../bundle.golden_symbols.json | 18 ++++++ .../bundling/todo/bundle.golden_symbols.json | 18 ++++++ packages/platform-server/src/utils.ts | 6 +- .../platform-server/test/hydration_spec.ts | 6 +- 18 files changed, 214 insertions(+), 100 deletions(-) diff --git a/goldens/size-tracking/integration-payloads.json b/goldens/size-tracking/integration-payloads.json index 51b6a6e1cda1..609e1a374ff2 100644 --- a/goldens/size-tracking/integration-payloads.json +++ b/goldens/size-tracking/integration-payloads.json @@ -52,7 +52,7 @@ "standalone-bootstrap": { "uncompressed": { "runtime": 918, - "main": 87081, + "main": 91485, "polyfills": 33802 } } diff --git a/packages/common/http/src/transfer_cache.ts b/packages/common/http/src/transfer_cache.ts index 8d1e9130b7fd..a488ca5f7675 100644 --- a/packages/common/http/src/transfer_cache.ts +++ b/packages/common/http/src/transfer_cache.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {APP_BOOTSTRAP_LISTENER, ApplicationRef, inject, InjectionToken, makeStateKey, Provider, StateKey, TransferState, ɵENABLED_SSR_FEATURES as ENABLED_SSR_FEATURES, ɵInitialRenderPendingTasks as InitialRenderPendingTasks} from '@angular/core'; +import {APP_BOOTSTRAP_LISTENER, ApplicationRef, inject, InjectionToken, makeStateKey, Provider, StateKey, TransferState, ɵENABLED_SSR_FEATURES as ENABLED_SSR_FEATURES} from '@angular/core'; import {Observable, of} from 'rxjs'; import {first, tap} from 'rxjs/operators'; @@ -165,16 +165,13 @@ export function withHttpTransferCache(): Provider[] { useFactory: () => { const appRef = inject(ApplicationRef); const cacheState = inject(CACHE_STATE); - const pendingTasks = inject(InitialRenderPendingTasks); return () => { - const isStablePromise = appRef.isStable.pipe(first((isStable) => isStable)).toPromise(); - isStablePromise.then(() => pendingTasks.whenAllTasksComplete).then(() => { + appRef.isStable.pipe(first((isStable) => isStable)).toPromise().then(() => { cacheState.isCacheActive = false; }); }; - }, - deps: [ApplicationRef, CACHE_STATE, InitialRenderPendingTasks] + } } ]; } diff --git a/packages/core/src/application_ref.ts b/packages/core/src/application_ref.ts index 7c916deca9de..ec9b181f648c 100644 --- a/packages/core/src/application_ref.ts +++ b/packages/core/src/application_ref.ts @@ -8,7 +8,8 @@ import './util/ng_jit_mode'; -import {Subscription} from 'rxjs'; +import {Observable, of, Subscription} from 'rxjs'; +import {distinctUntilChanged, mergeMap, share} from 'rxjs/operators'; import {ApplicationInitStatus} from './application_init'; import {PLATFORM_INITIALIZER} from './application_tokens'; @@ -25,6 +26,7 @@ import {ErrorHandler} from './error_handler'; import {formatRuntimeError, RuntimeError, RuntimeErrorCode} from './errors'; import {DEFAULT_LOCALE_ID} from './i18n/localization'; import {LOCALE_ID} from './i18n/tokens'; +import {InitialRenderPendingTasks} from './initial_render_pending_tasks'; import {Type} from './interface/type'; import {COMPILER_OPTIONS, CompilerOptions} from './linker/compiler'; import {ComponentFactory, ComponentRef} from './linker/component_factory'; @@ -38,7 +40,7 @@ import {isStandalone} from './render3/definition'; import {assertStandaloneComponentType} from './render3/errors'; import {setLocaleId} from './render3/i18n/i18n_locale_id'; import {setJitOptions} from './render3/jit/jit_options'; -import {createEnvironmentInjector, createNgModuleRefWithProviders, EnvironmentNgModuleRefAdapter, NgModuleFactory as R3NgModuleFactory} from './render3/ng_module_ref'; +import {createNgModuleRefWithProviders, EnvironmentNgModuleRefAdapter, NgModuleFactory as R3NgModuleFactory} from './render3/ng_module_ref'; import {publishDefaultGlobalUtils as _publishDefaultGlobalUtils} from './render3/util/global_utils'; import {setThrowInvalidWriteToSignalError} from './signals'; import {TESTABILITY} from './testability/testability'; @@ -819,6 +821,7 @@ export class ApplicationRef { /** @internal */ _views: InternalViewRef[] = []; private readonly internalErrorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER); + private readonly zoneIsStable = inject(ZONE_IS_STABLE_OBSERVABLE); /** * Indicates whether this instance was destroyed. @@ -841,7 +844,13 @@ export class ApplicationRef { /** * Returns an Observable that indicates when the application is stable or unstable. */ - public readonly isStable = inject(ZONE_IS_STABLE_OBSERVABLE); + public readonly isStable: Observable = + inject(InitialRenderPendingTasks) + .hasPendingTasks.pipe( + mergeMap(hasPendingTasks => hasPendingTasks ? of(false) : this.zoneIsStable), + distinctUntilChanged(), + share(), + ); private readonly _injector = inject(EnvironmentInjector); /** diff --git a/packages/core/src/hydration/api.ts b/packages/core/src/hydration/api.ts index 20f463fc7750..1ea53959fc69 100644 --- a/packages/core/src/hydration/api.ts +++ b/packages/core/src/hydration/api.ts @@ -14,7 +14,6 @@ import {Console} from '../console'; import {ENVIRONMENT_INITIALIZER, EnvironmentProviders, Injector, makeEnvironmentProviders} from '../di'; import {inject} from '../di/injector_compatibility'; import {formatRuntimeError, RuntimeErrorCode} from '../errors'; -import {InitialRenderPendingTasks} from '../initial_render_pending_tasks'; import {enableLocateOrCreateContainerRefImpl} from '../linker/view_container_ref'; import {enableLocateOrCreateElementNodeImpl} from '../render3/instructions/element'; import {enableLocateOrCreateElementContainerNodeImpl} from '../render3/instructions/element_container'; @@ -94,9 +93,7 @@ function printHydrationStats(injector: Injector) { /** * Returns a Promise that is resolved when an application becomes stable. */ -function whenStable( - appRef: ApplicationRef, pendingTasks: InitialRenderPendingTasks, - injector: Injector): Promise { +function whenStable(appRef: ApplicationRef, injector: Injector): Promise { const isStablePromise = appRef.isStable.pipe(first((isStable: boolean) => isStable)).toPromise(); if (typeof ngDevMode !== 'undefined' && ngDevMode) { const timeoutTime = APPLICATION_IS_STABLE_TIMEOUT; @@ -113,8 +110,7 @@ function whenStable( isStablePromise.finally(() => clearTimeout(timeoutId)); } - const pendingTasksPromise = pendingTasks.whenAllTasksComplete; - return Promise.allSettled([isStablePromise, pendingTasksPromise]); + return isStablePromise.then(() => {}); } /** @@ -186,10 +182,9 @@ export function withDomHydration(): EnvironmentProviders { useFactory: () => { if (isBrowser() && inject(IS_HYDRATION_DOM_REUSE_ENABLED)) { const appRef = inject(ApplicationRef); - const pendingTasks = inject(InitialRenderPendingTasks); const injector = inject(Injector); return () => { - whenStable(appRef, pendingTasks, injector).then(() => { + whenStable(appRef, injector).then(() => { // Wait until an app becomes stable and cleanup all views that // were not claimed during the application bootstrap process. // The timing is similar to when we start the serialization process diff --git a/packages/core/src/initial_render_pending_tasks.ts b/packages/core/src/initial_render_pending_tasks.ts index 6a79aa19ac2a..65223aeca772 100644 --- a/packages/core/src/initial_render_pending_tasks.ts +++ b/packages/core/src/initial_render_pending_tasks.ts @@ -6,10 +6,10 @@ * found in the LICENSE file at https://angular.io/license */ +import {BehaviorSubject} from 'rxjs'; + import {Injectable} from './di'; -import {inject} from './di/injector_compatibility'; import {OnDestroy} from './interface/lifecycle_hooks'; -import {NgZone} from './zone/ng_zone'; /** * *Internal* service that keeps track of pending tasks happening in the system @@ -23,59 +23,25 @@ import {NgZone} from './zone/ng_zone'; @Injectable({providedIn: 'root'}) export class InitialRenderPendingTasks implements OnDestroy { private taskId = 0; - private collection = new Set(); - private ngZone = inject(NgZone); - - private resolve!: VoidFunction; - private promise!: Promise; - - get whenAllTasksComplete(): Promise { - if (this.collection.size === 0) { - this.complete(); - } - - return this.promise; - } - - completed = false; - - constructor() { - // Run outside of the Angular zone to avoid triggering - // extra change detection cycles. - this.ngZone.runOutsideAngular(() => { - this.promise = new Promise((resolve) => { - this.resolve = resolve; - }); - }); - } + private pendingTasks = new Set(); + hasPendingTasks = new BehaviorSubject(false); add(): number { - if (this.completed) { - // Indicates that the task was added after - // the task queue completion, so it's a noop. - return -1; - } + this.hasPendingTasks.next(true); const taskId = this.taskId++; - this.collection.add(taskId); + this.pendingTasks.add(taskId); return taskId; } - remove(taskId: number) { - if (this.completed) return; - - this.collection.delete(taskId); - if (this.collection.size === 0) { - this.complete(); + remove(taskId: number): void { + this.pendingTasks.delete(taskId); + if (this.pendingTasks.size === 0) { + this.hasPendingTasks.next(false); } } - ngOnDestroy() { - this.complete(); - this.collection.clear(); - } - - private complete(): void { - this.completed = true; - this.resolve(); + ngOnDestroy(): void { + this.pendingTasks.clear(); + this.hasPendingTasks.next(false); } } diff --git a/packages/core/test/acceptance/initial_render_pending_tasks_spec.ts b/packages/core/test/acceptance/initial_render_pending_tasks_spec.ts index 5089b6a04a9c..32e8b2da71b6 100644 --- a/packages/core/test/acceptance/initial_render_pending_tasks_spec.ts +++ b/packages/core/test/acceptance/initial_render_pending_tasks_spec.ts @@ -7,58 +7,55 @@ */ import {TestBed} from '@angular/core/testing'; +import {EMPTY, of} from 'rxjs'; +import {map, withLatestFrom} from 'rxjs/operators'; import {InitialRenderPendingTasks} from '../../src/initial_render_pending_tasks'; describe('InitialRenderPendingTasks', () => { - it('should resolve a promise even if there are no tasks', async () => { - const pendingTasks = TestBed.inject(InitialRenderPendingTasks); - expect(pendingTasks.completed).toBe(false); - await pendingTasks.whenAllTasksComplete; - expect(pendingTasks.completed).toBe(true); - }); - it('should wait until all tasks are completed', async () => { const pendingTasks = TestBed.inject(InitialRenderPendingTasks); - expect(pendingTasks.completed).toBe(false); - const taskA = pendingTasks.add(); const taskB = pendingTasks.add(); const taskC = pendingTasks.add(); - expect(pendingTasks.completed).toBe(false); pendingTasks.remove(taskA); pendingTasks.remove(taskB); pendingTasks.remove(taskC); - await pendingTasks.whenAllTasksComplete; - expect(pendingTasks.completed).toBe(true); + expect(await hasPendingTasks(pendingTasks)).toBeFalse(); }); it('should allow calls to remove the same task multiple times', async () => { const pendingTasks = TestBed.inject(InitialRenderPendingTasks); - expect(pendingTasks.completed).toBe(false); + expect(await hasPendingTasks(pendingTasks)).toBeFalse(); const taskA = pendingTasks.add(); - - expect(pendingTasks.completed).toBe(false); + expect(await hasPendingTasks(pendingTasks)).toBeTrue(); pendingTasks.remove(taskA); pendingTasks.remove(taskA); pendingTasks.remove(taskA); - await pendingTasks.whenAllTasksComplete; - expect(pendingTasks.completed).toBe(true); + expect(await hasPendingTasks(pendingTasks)).toBeFalse(); }); it('should be tolerant to removal of non-existent ids', async () => { const pendingTasks = TestBed.inject(InitialRenderPendingTasks); - expect(pendingTasks.completed).toBe(false); + expect(await hasPendingTasks(pendingTasks)).toBeFalse(); pendingTasks.remove(Math.random()); pendingTasks.remove(Math.random()); pendingTasks.remove(Math.random()); - await pendingTasks.whenAllTasksComplete; - expect(pendingTasks.completed).toBe(true); + expect(await hasPendingTasks(pendingTasks)).toBeFalse(); }); }); + +function hasPendingTasks(pendingTasks: InitialRenderPendingTasks): Promise { + return of(EMPTY) + .pipe( + withLatestFrom(pendingTasks.hasPendingTasks), + map(([_, hasPendingTasks]) => hasPendingTasks), + ) + .toPromise(); +} diff --git a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json index d24ebe70485e..806146da2920 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -80,6 +80,9 @@ { "name": "BaseAnimationRenderer" }, + { + "name": "BehaviorSubject" + }, { "name": "BrowserAnimationBuilder" }, @@ -155,6 +158,9 @@ { "name": "DefaultDomRenderer2" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DomAdapter" }, @@ -242,6 +248,9 @@ { "name": "INTERNAL_BROWSER_PLATFORM_PROVIDERS" }, + { + "name": "InitialRenderPendingTasks" + }, { "name": "InjectFlags" }, @@ -842,6 +851,9 @@ { "name": "forwardRef" }, + { + "name": "fromArray" + }, { "name": "generateInitialInputs" }, @@ -1109,6 +1121,9 @@ { "name": "isPromise2" }, + { + "name": "isScheduler" + }, { "name": "isStableFactory" }, @@ -1373,6 +1388,9 @@ { "name": "setupStaticAttributes" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index e65b27883323..11f9c76ae7d5 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -95,6 +95,9 @@ { "name": "BaseAnimationRenderer" }, + { + "name": "BehaviorSubject" + }, { "name": "BrowserAnimationBuilder" }, @@ -179,6 +182,9 @@ { "name": "DefaultDomRenderer2" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DomAdapter" }, @@ -263,6 +269,9 @@ { "name": "INTERNAL_APPLICATION_ERROR_HANDLER" }, + { + "name": "InitialRenderPendingTasks" + }, { "name": "InjectFlags" }, @@ -905,6 +914,9 @@ { "name": "forwardRef" }, + { + "name": "fromArray" + }, { "name": "generateInitialInputs" }, @@ -1175,6 +1187,9 @@ { "name": "isPromise2" }, + { + "name": "isScheduler" + }, { "name": "isStableFactory" }, @@ -1448,6 +1463,9 @@ { "name": "setupStaticAttributes" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, 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 02c11b47a4cf..3fe3ae56328e 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -35,6 +35,9 @@ { "name": "BROWSER_MODULE_PROVIDERS_MARKER" }, + { + "name": "BehaviorSubject" + }, { "name": "BrowserDomAdapter" }, @@ -101,6 +104,9 @@ { "name": "DepComponent" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DomAdapter" }, @@ -167,6 +173,9 @@ { "name": "INTERNAL_APPLICATION_ERROR_HANDLER" }, + { + "name": "InitialRenderPendingTasks" + }, { "name": "InjectFlags" }, @@ -680,6 +689,9 @@ { "name": "forwardRef" }, + { + "name": "fromArray" + }, { "name": "generateInitialInputs" }, @@ -929,6 +941,9 @@ { "name": "isPromise2" }, + { + "name": "isScheduler" + }, { "name": "isStableFactory" }, @@ -1142,6 +1157,9 @@ { "name": "setupStaticAttributes" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, diff --git a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json index f15c622b3873..2230f1ecee78 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -50,6 +50,9 @@ { "name": "BaseControlValueAccessor" }, + { + "name": "BehaviorSubject" + }, { "name": "BrowserDomAdapter" }, @@ -146,6 +149,9 @@ { "name": "DefaultValueAccessor" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DomAdapter" }, @@ -245,6 +251,9 @@ { "name": "INTERNAL_APPLICATION_ERROR_HANDLER" }, + { + "name": "InitialRenderPendingTasks" + }, { "name": "InjectFlags" }, @@ -941,6 +950,9 @@ { "name": "from" }, + { + "name": "fromArray" + }, { "name": "generateInitialInputs" }, @@ -1286,6 +1298,9 @@ { "name": "isPromise2" }, + { + "name": "isScheduler" + }, { "name": "isStableFactory" }, @@ -1364,9 +1379,6 @@ { "name": "maybeWrapInNotSelector" }, - { - "name": "mergeAll" - }, { "name": "mergeErrors" }, @@ -1610,6 +1622,9 @@ { "name": "setupStaticAttributes" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, diff --git a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json index 76bb3130a0f1..749d251eb7f8 100644 --- a/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_template_driven/bundle.golden_symbols.json @@ -53,6 +53,9 @@ { "name": "BaseControlValueAccessor" }, + { + "name": "BehaviorSubject" + }, { "name": "BrowserDomAdapter" }, @@ -152,6 +155,9 @@ { "name": "DefaultValueAccessor" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DomAdapter" }, @@ -230,6 +236,9 @@ { "name": "INTERNAL_APPLICATION_ERROR_HANDLER" }, + { + "name": "InitialRenderPendingTasks" + }, { "name": "InjectFlags" }, @@ -908,6 +917,9 @@ { "name": "from" }, + { + "name": "fromArray" + }, { "name": "generateInitialInputs" }, @@ -1244,6 +1256,9 @@ { "name": "isPromise2" }, + { + "name": "isScheduler" + }, { "name": "isStableFactory" }, @@ -1322,9 +1337,6 @@ { "name": "maybeWrapInNotSelector" }, - { - "name": "mergeAll" - }, { "name": "mergeErrors" }, @@ -1586,6 +1598,9 @@ { "name": "setupStaticAttributes" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, 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 7a2dd76be615..ed1d8f45fb93 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -23,6 +23,9 @@ { "name": "BLOOM_MASK" }, + { + "name": "BehaviorSubject" + }, { "name": "BrowserDomAdapter" }, @@ -59,6 +62,9 @@ { "name": "DOCUMENT2" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DomAdapter" }, @@ -110,6 +116,9 @@ { "name": "INTERNAL_APPLICATION_ERROR_HANDLER" }, + { + "name": "InitialRenderPendingTasks" + }, { "name": "InjectFlags" }, @@ -527,6 +536,9 @@ { "name": "forwardRef" }, + { + "name": "fromArray" + }, { "name": "generateInitialInputs" }, @@ -722,6 +734,9 @@ { "name": "isPromise2" }, + { + "name": "isScheduler" + }, { "name": "isStableFactory" }, @@ -893,6 +908,9 @@ { "name": "setUpAttributes" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index 34613494ed8d..6cede02c989b 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -32,6 +32,9 @@ { "name": "BROWSER_MODULE_PROVIDERS" }, + { + "name": "BehaviorSubject" + }, { "name": "BrowserDomAdapter" }, @@ -107,6 +110,9 @@ { "name": "DefaultIfEmptySubscriber" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DomAdapter" }, @@ -1097,6 +1103,9 @@ { "name": "observable" }, + { + "name": "of" + }, { "name": "onEnter" }, @@ -1205,6 +1214,9 @@ { "name": "setUpAttributes" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index ef56eddaaa85..a86fefdb2c64 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -161,6 +161,9 @@ { "name": "DefaultUrlSerializer" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DoOperator" }, @@ -1892,6 +1895,9 @@ { "name": "shallowEqual" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, diff --git a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json index c974b4699161..03dd4c908697 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -26,6 +26,9 @@ { "name": "BROWSER_MODULE_PROVIDERS" }, + { + "name": "BehaviorSubject" + }, { "name": "BrowserDomAdapter" }, @@ -83,6 +86,9 @@ { "name": "DefaultDomRenderer2" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DomAdapter" }, @@ -152,6 +158,9 @@ { "name": "INTERNAL_BROWSER_PLATFORM_PROVIDERS" }, + { + "name": "InitialRenderPendingTasks" + }, { "name": "InjectFlags" }, @@ -605,6 +614,9 @@ { "name": "forwardRef" }, + { + "name": "fromArray" + }, { "name": "generateInitialInputs" }, @@ -812,6 +824,9 @@ { "name": "isPromise2" }, + { + "name": "isScheduler" + }, { "name": "isStableFactory" }, @@ -992,6 +1007,9 @@ { "name": "setUpAttributes" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index 98fb23127f37..e290dc334587 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -35,6 +35,9 @@ { "name": "BROWSER_MODULE_PROVIDERS_MARKER" }, + { + "name": "BehaviorSubject" + }, { "name": "BrowserDomAdapter" }, @@ -104,6 +107,9 @@ { "name": "DefaultIterableDifferFactory" }, + { + "name": "DistinctUntilChangedSubscriber" + }, { "name": "DomAdapter" }, @@ -170,6 +176,9 @@ { "name": "INTERNAL_APPLICATION_ERROR_HANDLER" }, + { + "name": "InitialRenderPendingTasks" + }, { "name": "InjectFlags" }, @@ -803,6 +812,9 @@ { "name": "forwardRef" }, + { + "name": "fromArray" + }, { "name": "generateInitialInputs" }, @@ -1106,6 +1118,9 @@ { "name": "isPromise2" }, + { + "name": "isScheduler" + }, { "name": "isStableFactory" }, @@ -1367,6 +1382,9 @@ { "name": "setupStaticAttributes" }, + { + "name": "share" + }, { "name": "shareSubjectFactory" }, diff --git a/packages/platform-server/src/utils.ts b/packages/platform-server/src/utils.ts index 12177666e57d..807b983317c7 100644 --- a/packages/platform-server/src/utils.ts +++ b/packages/platform-server/src/utils.ts @@ -54,13 +54,9 @@ function appendServerContextInfo(applicationRef: ApplicationRef) { async function _render(platformRef: PlatformRef, applicationRef: ApplicationRef): Promise { const environmentInjector = applicationRef.injector; - const isStablePromise = - applicationRef.isStable.pipe((first((isStable: boolean) => isStable))).toPromise(); - const pendingTasks = environmentInjector.get(InitialRenderPendingTasks); - const pendingTasksPromise = pendingTasks.whenAllTasksComplete; // Block until application is stable. - await Promise.allSettled([isStablePromise, pendingTasksPromise]); + await applicationRef.isStable.pipe((first((isStable: boolean) => isStable))).toPromise(); const platformState = platformRef.injector.get(PlatformState); if (applicationRef.injector.get(IS_HYDRATION_DOM_REUSE_ENABLED, false)) { diff --git a/packages/platform-server/test/hydration_spec.ts b/packages/platform-server/test/hydration_spec.ts index 75db97fdb0f2..26a3b8a07031 100644 --- a/packages/platform-server/test/hydration_spec.ts +++ b/packages/platform-server/test/hydration_spec.ts @@ -99,10 +99,8 @@ function stripExcessiveSpaces(html: string): string { } /** Returns a Promise that resolves when the ApplicationRef becomes stable. */ -function whenStable(appRef: ApplicationRef): Promise { - const isStablePromise = appRef.isStable.pipe(first((isStable: boolean) => isStable)).toPromise(); - const pendingTasksPromise = appRef.injector.get(InitialRenderPendingTasks).whenAllTasksComplete; - return Promise.allSettled([isStablePromise, pendingTasksPromise]); +function whenStable(appRef: ApplicationRef): Promise { + return appRef.isStable.pipe(first((isStable: boolean) => isStable)).toPromise().then(() => {}); } function verifyClientAndSSRContentsMatch(ssrContents: string, clientAppRootElement: HTMLElement) { From 9ef305b70e3864c5e95f3966ee3ce889b2953ab3 Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Fri, 26 May 2023 12:04:15 +0000 Subject: [PATCH 14/32] refactor(http): replace zone.js macrotask creation with `InitialRenderPendingTasks` (#50425) This commits refactors the HTTP client to use `InitialRenderPendingTasks` instead of Zone.js macrotask. This is another approach to https://github.com/angular/angular/pull/50406 which was revert due to a failure in G3. PR Close #50425 --- packages/common/http/src/interceptor.ts | 13 ++++++--- packages/common/http/src/xhr.ts | 36 ------------------------- 2 files changed, 10 insertions(+), 39 deletions(-) diff --git a/packages/common/http/src/interceptor.ts b/packages/common/http/src/interceptor.ts index 753530a768ac..6b0f03e88aa8 100644 --- a/packages/common/http/src/interceptor.ts +++ b/packages/common/http/src/interceptor.ts @@ -6,8 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ -import {EnvironmentInjector, inject, Injectable, InjectionToken} from '@angular/core'; +import {EnvironmentInjector, inject, Injectable, InjectionToken, ɵInitialRenderPendingTasks as InitialRenderPendingTasks} from '@angular/core'; import {Observable} from 'rxjs'; +import {finalize} from 'rxjs/operators'; import {HttpBackend, HttpHandler} from './backend'; import {HttpRequest} from './request'; @@ -178,13 +179,16 @@ export function legacyInterceptorFnFactory(): HttpInterceptorFn { adaptLegacyInterceptorToChain, interceptorChainEndFn as ChainedInterceptorFn); } - return chain(req, handler); + const pendingTasks = inject(InitialRenderPendingTasks); + const taskId = pendingTasks.add(); + return chain(req, handler).pipe(finalize(() => pendingTasks.remove(taskId))); }; } @Injectable() export class HttpInterceptorHandler extends HttpHandler { private chain: ChainedInterceptorFn|null = null; + private readonly pendingTasks = inject(InitialRenderPendingTasks); constructor(private backend: HttpBackend, private injector: EnvironmentInjector) { super(); @@ -206,6 +210,9 @@ export class HttpInterceptorHandler extends HttpHandler { chainedInterceptorFn(nextSequencedFn, interceptorFn, this.injector), interceptorChainEndFn as ChainedInterceptorFn); } - return this.chain(initialRequest, downstreamRequest => this.backend.handle(downstreamRequest)); + + const taskId = this.pendingTasks.add(); + return this.chain(initialRequest, downstreamRequest => this.backend.handle(downstreamRequest)) + .pipe(finalize(() => this.pendingTasks.remove(taskId))); } } diff --git a/packages/common/http/src/xhr.ts b/packages/common/http/src/xhr.ts index 8a6e2300f893..583a74a0a703 100644 --- a/packages/common/http/src/xhr.ts +++ b/packages/common/http/src/xhr.ts @@ -309,19 +309,6 @@ export class HttpXhrBackend implements HttpBackend { } } - let macroTaskCanceller: VoidFunction|undefined; - - /** Tear down logic to cancel the backround macrotask. */ - const onLoadStart = () => { - macroTaskCanceller ??= createBackgroundMacroTask(); - }; - const onLoadEnd = () => { - macroTaskCanceller?.(); - }; - - xhr.addEventListener('loadstart', onLoadStart); - xhr.addEventListener('loadend', onLoadEnd); - // Fire the request, and notify the event stream that it was fired. xhr.send(reqBody!); observer.next({type: HttpEventType.Sent}); @@ -329,16 +316,11 @@ export class HttpXhrBackend implements HttpBackend { // request cancellation handler. return () => { // On a cancellation, remove all registered event listeners. - xhr.removeEventListener('loadstart', onLoadStart); - xhr.removeEventListener('loadend', onLoadEnd); xhr.removeEventListener('error', onError); xhr.removeEventListener('abort', onError); xhr.removeEventListener('load', onLoad); xhr.removeEventListener('timeout', onError); - // Cancel the background macrotask. - macroTaskCanceller?.(); - if (req.reportProgress) { xhr.removeEventListener('progress', onDownProgress); if (reqBody !== null && xhr.upload) { @@ -356,21 +338,3 @@ export class HttpXhrBackend implements HttpBackend { ); } } - -// Cannot use `Number.MAX_VALUE` as it does not fit into a 32-bit signed integer. -const MAX_INT = 2147483647; - -/** - * A method that creates a background macrotask of up to Number.MAX_VALUE. - * - * This is so that Zone.js can intercept HTTP calls, this is important for server rendering, - * as the application is only rendered once the application is stabilized, meaning there are pending - * macro and micro tasks. - * - * @returns a callback method to cancel the macrotask. - */ -function createBackgroundMacroTask(): VoidFunction { - const timeout = setTimeout(() => void 0, MAX_INT); - - return () => clearTimeout(timeout); -} From ad9adb3a77b1e7b10e55695c90ecace3cef6cfb7 Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Sat, 27 May 2023 15:48:25 +0200 Subject: [PATCH 15/32] docs(docs-infra): rimraf requires the globflag. (#50493) On windows rimraf requires since v4 the glob flag to support wildcards in path. fixes #49806 PR Close #50493 --- .../angular.io-package/processors/cleanGeneratedFiles.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aio/tools/transforms/angular.io-package/processors/cleanGeneratedFiles.js b/aio/tools/transforms/angular.io-package/processors/cleanGeneratedFiles.js index e3992f974f12..79daeb898590 100644 --- a/aio/tools/transforms/angular.io-package/processors/cleanGeneratedFiles.js +++ b/aio/tools/transforms/angular.io-package/processors/cleanGeneratedFiles.js @@ -1,10 +1,10 @@ -const rimraf = require('rimraf'); +const {rimrafSync} = require('rimraf'); module.exports = function cleanGeneratedFiles() { return { $runAfter: ['writing-files'], $runBefore: ['writeFilesProcessor'], $process: function() { - rimraf.sync('src/generated/{docs,*.json}'); + rimrafSync('src/generated/{docs,*.json}', {glob: true}); } }; }; From f3a965ba14f589a5213cf4320011d9e41c808034 Mon Sep 17 00:00:00 2001 From: alkavats1 Date: Fri, 26 May 2023 15:41:55 +0530 Subject: [PATCH 16/32] docs: removed the obsolete frameborder Tag and updated the files with using css (#50480) PR Close #50480 --- .../app/custom-elements/live-example/live-example.component.ts | 2 +- aio/tools/transforms/templates/error/error.template.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aio/src/app/custom-elements/live-example/live-example.component.ts b/aio/src/app/custom-elements/live-example/live-example.component.ts index d8390c560d20..2c775b078059 100644 --- a/aio/src/app/custom-elements/live-example/live-example.component.ts +++ b/aio/src/app/custom-elements/live-example/live-example.component.ts @@ -136,7 +136,7 @@ export class LiveExampleComponent implements AfterContentInit { */ @Component({ selector: 'aio-embedded-stackblitz', - template: '', + template: '', styles: [ 'iframe { min-height: 400px; }' ] }) export class EmbeddedStackblitzComponent implements AfterViewInit { diff --git a/aio/tools/transforms/templates/error/error.template.html b/aio/tools/transforms/templates/error/error.template.html index 29fc85edd2c5..6aae48b0ff0e 100644 --- a/aio/tools/transforms/templates/error/error.template.html +++ b/aio/tools/transforms/templates/error/error.template.html @@ -12,7 +12,7 @@

{$ doc.code $}: {$ doc.shortDescription $}

From 27beaa6329661fbea9328c02c0c4bfb188b075f0 Mon Sep 17 00:00:00 2001 From: alkavats1 Date: Wed, 24 May 2023 12:43:20 +0530 Subject: [PATCH 17/32] docs: improved code quality (#50443) PR Close #50443 --- integration/cli-elements-universal/src/app/app.module.ts | 2 +- integration/dynamic-compiler/src/lazy.module.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/integration/cli-elements-universal/src/app/app.module.ts b/integration/cli-elements-universal/src/app/app.module.ts index 5edaa8fe9b55..6cda804e30c0 100644 --- a/integration/cli-elements-universal/src/app/app.module.ts +++ b/integration/cli-elements-universal/src/app/app.module.ts @@ -1,5 +1,5 @@ import { isPlatformBrowser } from '@angular/common'; -import { APP_ID, CUSTOM_ELEMENTS_SCHEMA, Inject, Injector, NgModule, PLATFORM_ID } from '@angular/core'; +import { CUSTOM_ELEMENTS_SCHEMA, Inject, Injector, NgModule, PLATFORM_ID } from '@angular/core'; import { createCustomElement } from '@angular/elements'; import { BrowserModule } from '@angular/platform-browser'; import { RouterModule } from '@angular/router'; diff --git a/integration/dynamic-compiler/src/lazy.module.ts b/integration/dynamic-compiler/src/lazy.module.ts index 27a0aa025ac9..2d6c04aa3bc8 100644 --- a/integration/dynamic-compiler/src/lazy.module.ts +++ b/integration/dynamic-compiler/src/lazy.module.ts @@ -1,5 +1,4 @@ -import {NgModule} from "@angular/core"; -import {Component} from '@angular/core'; +import {NgModule, Component} from '@angular/core'; @Component({ selector: 'lazy-component', From b118b7545f37a604787b8a988329f43282c93fd5 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Thu, 25 May 2023 21:06:11 +0000 Subject: [PATCH 18/32] build: update all non-major dependencies (#50417) See associated pull request for more information. PR Close #50417 --- aio/package.json | 2 +- aio/yarn.lock | 179 +++++++++++++++++++++++++++++++++++++++-------- package.json | 4 +- yarn.lock | 25 ++++--- 4 files changed, 168 insertions(+), 42 deletions(-) diff --git a/aio/package.json b/aio/package.json index d7759523a023..e63869ec0e87 100644 --- a/aio/package.json +++ b/aio/package.json @@ -144,7 +144,7 @@ "lunr": "^2.3.9", "npm-run-all": "^4.1.5", "protractor": "~7.0.0", - "puppeteer-core": "20.2.1", + "puppeteer-core": "20.4.0", "rehype-slug": "^4.0.1", "remark": "^12.0.0", "remark-html": "^13.0.0", diff --git a/aio/yarn.lock b/aio/yarn.lock index 0eff2ab71760..3d53f99b21a9 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -2978,17 +2978,15 @@ resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== -"@puppeteer/browsers@1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.3.0.tgz#5ad26540ff54e8b8fca8ab50d2da9c60360a21b9" - integrity sha512-an3QdbNPkuU6qpxpbssxAbjRLJcF+eP4L8UqIY3+6n0sbaVxw5pz7PiCLy9g32XEZuoamUlV5ZQPnA6FxvkIHA== +"@puppeteer/browsers@1.4.0": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-1.4.0.tgz#da760aeb13f09441ed9c7c386e01b1061537c6c2" + integrity sha512-HiRpoc15NhFwoR1IjN3MkMsqeAfRQKNzbhWVV+0BfvybEhjWSyRNQMC0ohMhkFhzoGnFoS59WlrJCGLPky/89g== dependencies: debug "4.3.4" extract-zip "2.0.1" - http-proxy-agent "5.0.0" - https-proxy-agent "5.0.1" progress "2.0.3" - proxy-from-env "1.1.0" + proxy-agent "6.2.0" tar-fs "2.1.1" unbzip2-stream "1.4.3" yargs "17.7.1" @@ -4002,6 +4000,13 @@ agent-base@^4.3.0: dependencies: es6-promisify "^5.0.0" +agent-base@^7.0.1, agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + agentkeepalive@^4.2.1: version "4.3.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" @@ -4496,6 +4501,11 @@ basic-auth@~2.0.1: dependencies: safe-buffer "5.1.2" +basic-ftp@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.3.tgz#b14c0fe8111ce001ec913686434fe0c2fb461228" + integrity sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g== + batch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" @@ -5066,10 +5076,10 @@ chrome-trace-event@^1.0.2: resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== -chromium-bidi@0.4.9: - version "0.4.9" - resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.9.tgz#a1c6d7497e2b8ae3d639fd69dacb25025fa0a696" - integrity sha512-u3DC6XwgLCA9QJ5ak1voPslCmacQdulZNCPsI3qNXxSnEcZS7DFIbww+5RM2bznMEje7cc0oydavRLRvOIZtHw== +chromium-bidi@0.4.10: + version "0.4.10" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.4.10.tgz#e5e13c22dab30969fe56c95d505956bc3a805df6" + integrity sha512-ngdRIq/f5G3nIOz1M0MtCABCTezr79MBCrJ09K2xRk+hTZQGTH8JIeFbgQmVvNPBMQblh7ROfJnSzsE07YpFfg== dependencies: mitt "3.0.0" @@ -5573,6 +5583,13 @@ cross-fetch@3.1.5: dependencies: node-fetch "2.6.7" +cross-fetch@3.1.6: + version "3.1.6" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.6.tgz#bae05aa31a4da760969756318feeee6e70f15d6c" + integrity sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g== + dependencies: + node-fetch "^2.6.11" + cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -5694,6 +5711,11 @@ data-uri-to-buffer@3: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +data-uri-to-buffer@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz#db89a9e279c2ffe74f50637a59a32fb23b3e4d7c" + integrity sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg== + data-urls@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-4.0.0.tgz#333a454eca6f9a5b7b0f1013ff89074c3f522dd4" @@ -5829,6 +5851,16 @@ degenerator@^3.0.2: esprima "^4.0.0" vm2 "^3.9.17" +degenerator@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-4.0.2.tgz#55b7fb41239ee0ea7644fa3f2aba84e0adfaa40c" + integrity sha512-HKwIFvZROUMfH3qI3gBpD61BYh7q3c3GXD5UGZzoVNJwVSYgZKvYl1fRMXc9ozoTxl/VZxKJ5v/bA+19tywFiw== + dependencies: + ast-types "^0.13.2" + escodegen "^1.8.1" + esprima "^4.0.0" + vm2 "^3.9.17" + del@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" @@ -7413,6 +7445,16 @@ get-uri@3: fs-extra "^8.1.0" ftp "^0.3.10" +get-uri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.1.tgz#cff2ba8d456c3513a04b70c45de4dbcca5b1527c" + integrity sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^5.0.1" + debug "^4.3.4" + fs-extra "^8.1.0" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -8012,7 +8054,16 @@ http-parser-js@>=0.5.1: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== -http-proxy-agent@5.0.0, http-proxy-agent@^5.0.0: +http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== @@ -8021,14 +8072,21 @@ http-proxy-agent@5.0.0, http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== +http-proxy-agent@^6.0.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-6.1.1.tgz#dc04f1a84e09511740cfbd984a56f86cc42e4277" + integrity sha512-JRCz+4Whs6yrrIoIlrH+ZTmhrRwtMnmOHsHn8GFEn9O2sVfSE+DAZ3oyyGIKF8tjJEeSJmP89j7aTjVsSqsU0g== dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" + agent-base "^7.1.0" + debug "^4.3.4" + +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" http-proxy-middleware@^2.0.3: version "2.0.6" @@ -8075,6 +8133,22 @@ https-proxy-agent@^2.2.1: agent-base "^4.3.0" debug "^3.1.0" +https-proxy-agent@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-6.2.1.tgz#0965ab47371b3e531cf6794d1eb148710a992ba7" + integrity sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA== + dependencies: + agent-base "^7.0.2" + debug "4" + +https-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz#75cb70d04811685667183b31ab158d006750418a" + integrity sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" @@ -9667,7 +9741,7 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: +lru-cache@^7.14.1, lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: version "7.18.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== @@ -10223,7 +10297,7 @@ node-fetch@2.6.7: dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@^2.6.1, node-fetch@^2.6.11, node-fetch@^2.6.7: version "2.6.11" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== @@ -10664,6 +10738,19 @@ pac-proxy-agent@^5.0.0: raw-body "^2.2.0" socks-proxy-agent "5" +pac-proxy-agent@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-6.0.3.tgz#61042187093b67aa7dd05b41e4ec7c241a27c428" + integrity sha512-5Hr1KgPDoc21Vn3rsXBirwwDnF/iac1jN/zkpsOYruyT+ZgsUhUOgVwq3v9+ukjZd/yGm/0nzO1fDfl7rkGoHQ== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + pac-resolver "^6.0.1" + socks-proxy-agent "^8.0.1" + pac-resolver@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-5.0.1.tgz#c91efa3a9af9f669104fa2f51102839d01cde8e7" @@ -10673,6 +10760,15 @@ pac-resolver@^5.0.0: ip "^1.1.5" netmask "^2.0.2" +pac-resolver@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-6.0.1.tgz#319c182d3db4e6782e79519cb4dd1dda46579292" + integrity sha512-dg497MhVT7jZegPRuOScQ/z0aV/5WR0gTdRu1md+Irs9J9o+ls5jIuxjo1WfaTG+eQQkxyn5HMGvWK+w7EIBkQ== + dependencies: + degenerator "^4.0.1" + ip "^1.1.5" + netmask "^2.0.2" + pacote@15.1.3: version "15.1.3" resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.1.3.tgz#4c0e7fb5e7ab3b27fb3f86514b451ad4c4f64e9d" @@ -11188,6 +11284,20 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-agent@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.2.0.tgz#03c9d5fb85c6c80f1b27d101f11f4f364b7838ed" + integrity sha512-g3rBHXPhEa0Z1nxZkirj0+US1SCcA67SnjpxbdZf7BloLdULEUCzbQozsq+wFwhmMeZegeZISDZjPFN/Ct9DaQ== + dependencies: + agent-base "^7.0.1" + debug "^4.3.4" + http-proxy-agent "^6.0.1" + https-proxy-agent "^6.1.0" + lru-cache "^7.14.1" + pac-proxy-agent "^6.0.2" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.1" + proxy-agent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-5.0.0.tgz#d31405c10d6e8431fde96cba7a0c027ce01d633b" @@ -11202,7 +11312,7 @@ proxy-agent@^5.0.0: proxy-from-env "^1.0.0" socks-proxy-agent "^5.0.0" -proxy-from-env@1.1.0, proxy-from-env@^1.0.0: +proxy-from-env@1.1.0, proxy-from-env@^1.0.0, proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -11247,14 +11357,14 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -puppeteer-core@20.2.1: - version "20.2.1" - resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-20.2.1.tgz#e920e06e76ef2d1a1d98ea847611a8d662d3cd97" - integrity sha512-HmNMcL+g9ght0nCzS5BmEvom2IVhp1/xhlQ9O+fmihQx0EYwYUqgCQhs8Hbv7IapiqKhahKCC8PKfCNTXXsKbQ== +puppeteer-core@20.4.0: + version "20.4.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-20.4.0.tgz#39a411db6860ad5a9b93cb94e5e16f1c13babbd8" + integrity sha512-fcL2fYQLFZEuIIDbMhvf6WF5rAcKXetsrjOxu6Br6FEAet7kEtJlCcrKmnz3pfqkwAIlihjuzwT5ys7jMWEx8A== dependencies: - "@puppeteer/browsers" "1.3.0" - chromium-bidi "0.4.9" - cross-fetch "3.1.5" + "@puppeteer/browsers" "1.4.0" + chromium-bidi "0.4.10" + cross-fetch "3.1.6" debug "4.3.4" devtools-protocol "0.0.1120988" ws "8.13.0" @@ -12384,7 +12494,16 @@ socks-proxy-agent@^7.0.0: debug "^4.3.3" socks "^2.6.2" -socks@^2.3.3, socks@^2.6.2: +socks-proxy-agent@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz#ffc5859a66dac89b0c4dab90253b96705f3e7120" + integrity sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ== + dependencies: + agent-base "^7.0.1" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.3.3, socks@^2.6.2, socks@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== diff --git a/package.json b/package.json index 3833cd750586..e9bfffaa71d0 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@types/babel__template": "7.4.1", "@types/babel__traverse": "7.18.5", "@types/bluebird": "^3.5.27", - "@types/chrome": "^0.0.236", + "@types/chrome": "^0.0.237", "@types/convert-source-map": "^1.5.1", "@types/diff": "^5.0.0", "@types/hammerjs": "2.0.41", @@ -88,7 +88,7 @@ "@types/jasminewd2": "^2.0.8", "@types/node": "^16.11.7", "@types/selenium-webdriver": "3.0.7", - "@types/selenium-webdriver4": "npm:@types/selenium-webdriver@4.1.14", + "@types/selenium-webdriver4": "npm:@types/selenium-webdriver@4.1.15", "@types/semver": "^7.3.4", "@types/shelljs": "^0.8.6", "@types/systemjs": "0.19.32", diff --git a/yarn.lock b/yarn.lock index 9531bbd89db2..cd3166d5833c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3245,10 +3245,10 @@ "@types/node" "*" "@types/responselike" "^1.0.0" -"@types/chrome@^0.0.236": - version "0.0.236" - resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.236.tgz#f967769015c458718d4328a54682fa24f0c62c92" - integrity sha512-ArQoxO9WtDY6GWcT2cpo+D+hyASPeFt7PHQEUDXwQhRS00Rbop07rnEOA046yws0HkM83Tcew/hW6Dgvnj4iMQ== +"@types/chrome@^0.0.237": + version "0.0.237" + resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.237.tgz#20a38e1d1134e2725fc7eb43c881e55e1b24ddd7" + integrity sha512-krsRmyfMlck5r+H1EapsrrucDRq6iRm0NAi5fapr93CgnpVMDdK+h2+z4x79GegdW7BNH9Vb//gkptORwwwVIQ== dependencies: "@types/filesystem" "*" "@types/har-format" "*" @@ -3602,11 +3602,10 @@ "@types/glob" "*" "@types/node" "*" -"@types/selenium-webdriver4@npm:@types/selenium-webdriver@4.1.14", "@types/selenium-webdriver@^4.0.18": - name "@types/selenium-webdriver4" - version "4.1.14" - resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.14.tgz#4ce2839c35f751f5d497ae4e25989734a16dd555" - integrity sha512-3vy3tbKfMWLhKMoZSnFAMZRf4Z1e8/zgpxIqXG7G2Coc8Rvf1QBvgpJDxxdnTuDFL6ZfymiGUHd8itwTmuEpeA== +"@types/selenium-webdriver4@npm:@types/selenium-webdriver@4.1.15": + version "4.1.15" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.15.tgz#d346b674b96f5ba43f1ad5343f997030559e5b23" + integrity sha512-oQ15G3q3EZ0dS049SB/5zx2tQkIS2kmDQWC/TSfAHJYKvXLZoUiLaPXnfSwbLP8Q5lcJeu5oYjKVSEV0t3H6Bg== dependencies: "@types/ws" "*" @@ -3620,6 +3619,14 @@ resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-3.0.21.tgz#af7a272e7f92a89cd432005dd1cb80956ebe4d9b" integrity sha512-DRHyGEr25ra2C4+eU7eiCSto2j9eUa9pR4z5uiLRBXWFlmfMCAeXwecZnAhuB3eOOCA8OkwcNlb6QUkVZFlKTA== +"@types/selenium-webdriver@^4.0.18": + name "@types/selenium-webdriver4" + version "4.1.14" + resolved "https://registry.yarnpkg.com/@types/selenium-webdriver/-/selenium-webdriver-4.1.14.tgz#4ce2839c35f751f5d497ae4e25989734a16dd555" + integrity sha512-3vy3tbKfMWLhKMoZSnFAMZRf4Z1e8/zgpxIqXG7G2Coc8Rvf1QBvgpJDxxdnTuDFL6ZfymiGUHd8itwTmuEpeA== + dependencies: + "@types/ws" "*" + "@types/semver@^7.3.4": version "7.5.0" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.0.tgz#591c1ce3a702c45ee15f47a42ade72c2fd78978a" From 2a6daea884e93ff32847d88071f9a15a6ce21c82 Mon Sep 17 00:00:00 2001 From: Ady Ngom Date: Mon, 10 Apr 2023 01:58:19 -0400 Subject: [PATCH 19/32] docs: add Ady Ngom to GDE resources (#49759) [x] The commit message follows our guidelines: https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit [] Tests for the changes have been added (for bug fixes / features) [] Docs have been added / updated (for bug fixes / features) What kind of change does this PR introduce? [] Bugfix [] Feature [] Code style update (formatting, local variables) [] Refactoring (no functional changes, no api changes) [] Build related changes [] CI related changes [] Documentation content changes [x] angular.io application / infrastructure changes [] Other... Please describe: [] Yes [x] No Based on information provided [here](https://github.com/WebGDEProgram/main/tree/master/Angular) PR Close #49759 --- aio/content/images/bios/angom.jpg | Bin 0 -> 154540 bytes aio/content/marketing/contributors.json | 8 ++++++++ 2 files changed, 8 insertions(+) create mode 100644 aio/content/images/bios/angom.jpg diff --git a/aio/content/images/bios/angom.jpg b/aio/content/images/bios/angom.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b852daf732fa160fa34b266aebf0bcc7d47a7c29 GIT binary patch literal 154540 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

)Bi=L3C3o82cz|d+GLxXCyUt;Zv195dzi2fb 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 Tu#16R4D4dyzXJpCZ=e4S!N}5^ literal 0 HcmV?d00001 diff --git a/aio/content/marketing/contributors.json b/aio/content/marketing/contributors.json index 739757de1530..0a7c6c7146ee 100644 --- a/aio/content/marketing/contributors.json +++ b/aio/content/marketing/contributors.json @@ -7,6 +7,14 @@ "bio": "Alain Chautard is a Google Developer Expert in Web Technologies / Angular. He started working with Angular JS in 2011. Since then he has worked with all Angular versions on a daily basis, both as a developer and as a technical trainer. He is the organizer of the Sacramento Angular Meetup group, co-organizer of the Google Developer Group chapter in Sacramento, California, and published author of the Packt video course 'Getting Started with Angular'", "groups": ["GDE"] }, + "adyngom": { + "name": "Ady Ngom", + "picture": "angom.jpg", + "twitter": "adyngom", + "website": "https://adyngom.com", + "bio": "Ady is a Google Developer Expert in Angular. His first interaction with a computer was playing PacMan but he was more interested in knowing how it was built than how much fun it was to play it. For the past 20 years, Ady has strived in building simple, engaging and very intuitive consumer facing products. As a JavaScript Teach Lead and UI Architect, he spends a bulk of his time producing intuitive systems that are easy to scale and maintain. When away from the keyboard, he enjoys the Georgia outdoors with his wife and three children. To him, the unpredictable weather is a known issue that simply adds to the overall charm and he would not have it otherwise.", + "groups": ["GDE"] + }, "ahasall": { "name": "Amadou Sall", "picture": "ahasall.jpg", From 6546747d9dc086fe0f6bec0043cb8d88a28014c0 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Tue, 30 May 2023 05:05:15 +0000 Subject: [PATCH 20/32] build: update github/codeql-action action to v2.3.5 (#50508) See associated pull request for more information. PR Close #50508 --- .github/workflows/scorecard.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index 316bf13255bb..8ebbd72bd6ee 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -47,6 +47,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: 'Upload to code-scanning' - uses: github/codeql-action/upload-sarif@29b1f65c5e92e24fe6b6647da1eaabe529cec70f # v2.3.3 + uses: github/codeql-action/upload-sarif@0225834cc549ee0ca93cb085b92954821a145866 # v2.3.5 with: sarif_file: results.sarif From ad73aefd9c5be0c40bf45bef5d09e6c373f559df Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 23 May 2023 14:25:06 +0000 Subject: [PATCH 21/32] build: speed up locale file generation to improve DX (#50426) Before this commit, building everything to run `@angular/core` tests: ``` INFO: Elapsed time: 76.496s, Critical Path: 72.92s INFO: 225 processes: 125 internal, 5 linux-sandbox, 2 local, 93 worker. INFO: Build completed successfully, 225 total actions ``` After: ``` Use --sandbox_debug to see verbose messages from the sandbox INFO: Elapsed time: 15.952s, Critical Path: 10.75s INFO: 200 processes: 128 internal, 4 linux-sandbox, 2 local, 66 worker. ``` This being on a specialist Cloudtop. PR Close #50426 --- .../bin/write-locale-files-to-dist.ts | 21 ++++++++++++------- .../generate-locales-tool/plural-function.ts | 4 +++- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/packages/common/locales/generate-locales-tool/bin/write-locale-files-to-dist.ts b/packages/common/locales/generate-locales-tool/bin/write-locale-files-to-dist.ts index 40c014bb8914..a78573820356 100644 --- a/packages/common/locales/generate-locales-tool/bin/write-locale-files-to-dist.ts +++ b/packages/common/locales/generate-locales-tool/bin/write-locale-files-to-dist.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {writeFileSync} from 'fs'; +import fs from 'fs'; import {join} from 'path'; import {CldrData} from '../cldr-data'; @@ -21,7 +21,7 @@ import {BASE_LOCALE} from './base-locale'; * Generates locale files for each available CLDR locale and writes it to the * specified directory. */ -function main(outputDir: string|undefined) { +async function main(outputDir: string|undefined) { if (outputDir === undefined) { throw Error('No output directory specified.'); } @@ -35,16 +35,21 @@ function main(outputDir: string|undefined) { console.info(`Writing locales to: ${outputDir}`); // Generate locale files for all locales we have data for. - cldrData.availableLocales.forEach((localeData) => { + await Promise.all(cldrData.availableLocales.map(async (localeData) => { const locale = localeData.locale; const localeFile = generateLocale(locale, localeData, baseCurrencies); const localeExtraFile = generateLocaleExtra(locale, localeData); const localeGlobalFile = generateLocaleGlobalFile(locale, localeData, baseCurrencies); - writeFileSync(join(outputDir, `${locale}.ts`), localeFile); - writeFileSync(join(extraLocaleDir, `${locale}.ts`), localeExtraFile); - writeFileSync(join(globalLocaleDir, `${locale}.js`), localeGlobalFile); - }); + await Promise.all([ + fs.promises.writeFile(join(outputDir, `${locale}.ts`), localeFile), + fs.promises.writeFile(join(extraLocaleDir, `${locale}.ts`), localeExtraFile), + fs.promises.writeFile(join(globalLocaleDir, `${locale}.js`), localeGlobalFile), + ]); + })); } -main(process.argv[2]); +main(process.argv[2]).catch(err => { + console.error(err); + process.exitCode = 1; +}) diff --git a/packages/common/locales/generate-locales-tool/plural-function.ts b/packages/common/locales/generate-locales-tool/plural-function.ts index 46f99ed63b74..ed75feccebb5 100644 --- a/packages/common/locales/generate-locales-tool/plural-function.ts +++ b/packages/common/locales/generate-locales-tool/plural-function.ts @@ -12,6 +12,9 @@ import {CldrLocaleData} from './cldr-data'; // There are no types available for `cldr`. const {load: createCldr} = await import('cldr' as any); +// Load once to avoid re-parsing CLDR XML data on every invocation. +const cldr = createCldr(runfiles.resolve('cldr_xml_data')); + /** * Returns the plural function for a locale. */ @@ -21,7 +24,6 @@ export function getPluralFunction(localeData: CldrLocaleData, withTypes = true) // we follow the CLDR-specified bundle lookup algorithm. A language does not necessarily // resolve directly to a bundle CLDR provides data for. const bundleName = localeData.attributes.bundle; - const cldr = createCldr(runfiles.resolve('cldr_xml_data')); let fn = cldr.extractPluralRuleFunction(bundleName).toString(); const numberType = withTypes ? ': number' : ''; From c33879171050057e1e1d1f7b05d3c94ce33153d4 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Tue, 23 May 2023 14:42:08 +0000 Subject: [PATCH 22/32] build: remove console output from locale build action (#50426) Bazel build actions should never print something to the console on success as this would pollute the overall action output. PR Close #50426 --- .../bin/write-locale-files-to-dist.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/common/locales/generate-locales-tool/bin/write-locale-files-to-dist.ts b/packages/common/locales/generate-locales-tool/bin/write-locale-files-to-dist.ts index a78573820356..ccfd3a5031aa 100644 --- a/packages/common/locales/generate-locales-tool/bin/write-locale-files-to-dist.ts +++ b/packages/common/locales/generate-locales-tool/bin/write-locale-files-to-dist.ts @@ -32,24 +32,22 @@ async function main(outputDir: string|undefined) { const extraLocaleDir = join(outputDir, 'extra'); const globalLocaleDir = join(outputDir, 'global'); - console.info(`Writing locales to: ${outputDir}`); - // Generate locale files for all locales we have data for. - await Promise.all(cldrData.availableLocales.map(async (localeData) => { + await Promise.all(cldrData.availableLocales.flatMap(async (localeData) => { const locale = localeData.locale; const localeFile = generateLocale(locale, localeData, baseCurrencies); const localeExtraFile = generateLocaleExtra(locale, localeData); const localeGlobalFile = generateLocaleGlobalFile(locale, localeData, baseCurrencies); - await Promise.all([ + return [ fs.promises.writeFile(join(outputDir, `${locale}.ts`), localeFile), fs.promises.writeFile(join(extraLocaleDir, `${locale}.ts`), localeExtraFile), fs.promises.writeFile(join(globalLocaleDir, `${locale}.js`), localeGlobalFile), - ]); + ]; })); } main(process.argv[2]).catch(err => { console.error(err); process.exitCode = 1; -}) +}); From 1c94ed47b13934ddbb93835bf7b5e7d43f8d7a6e Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Sat, 27 May 2023 16:55:19 +0200 Subject: [PATCH 23/32] docs: Adding myself to the collaborators (#50494) Let's continue building Angular ! =) PR Close #50494 --- aio/content/images/bios/jeanmeche.jpg | Bin 0 -> 18719 bytes aio/content/marketing/contributors.json | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 aio/content/images/bios/jeanmeche.jpg diff --git a/aio/content/images/bios/jeanmeche.jpg b/aio/content/images/bios/jeanmeche.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2fdd03a5bd0a6b7af891ca3df1ef6b062a135d00 GIT binary patch literal 18719 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%0A{cw6m(fujKxf++7A`cm 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 Qe!r-+Q!;3-v&gak*{qr64gdfE literal 0 HcmV?d00001 diff --git a/aio/content/marketing/contributors.json b/aio/content/marketing/contributors.json index 0a7c6c7146ee..18c3f996dc5e 100644 --- a/aio/content/marketing/contributors.json +++ b/aio/content/marketing/contributors.json @@ -419,6 +419,13 @@ "mentor": "dgp1130", "picture": "jbedard.jpg" }, + "jeanmeche": { + "name": "Matthieu Riegler", + "picture":"jeanmeche.jpg", + "twitter": "jean__meche", + "bio": "Software engineer from the french Alps. Matthieu was born and raised with the web and now he love's building it! He currently works for Viseo.", + "groups": ["Collaborators"] + }, "jecelynyeen": { "name": "Jecelyn Yeen", "picture": "jecelynyeen.jpg", From f26c9a225191e480ffdfc6dbf276f4463ca709fe Mon Sep 17 00:00:00 2001 From: Matthieu Riegler Date: Mon, 22 May 2023 20:38:54 +0200 Subject: [PATCH 24/32] refactor(platform-browser): Remove BrowserDetection (#50411) Our tests should rely on the running browser. PR Close #50411 --- .../web_animations_driver_spec.ts | 2 - packages/compiler/test/integration_spec.ts | 31 ++-- .../dom_element_schema_registry_spec.ts | 3 +- ...ns_with_web_animations_integration_spec.ts | 23 +-- .../linker/projection_integration_spec.ts | 3 +- .../test/sanitization/html_sanitizer_spec.ts | 14 +- packages/core/test/zone/ng_zone_spec.ts | 4 +- .../test/browser_util_spec.ts | 175 ------------------ .../test/dom/shadow_dom_spec.ts | 135 +++++++------- .../platform-browser/testing/src/browser.ts | 3 - .../testing/src/browser_util.ts | 68 +------ 11 files changed, 100 insertions(+), 361 deletions(-) delete mode 100644 packages/platform-browser/test/browser_util_spec.ts diff --git a/packages/animations/browser/test/render/web_animations/web_animations_driver_spec.ts b/packages/animations/browser/test/render/web_animations/web_animations_driver_spec.ts index 86426507adc3..aeef781a4c68 100644 --- a/packages/animations/browser/test/render/web_animations/web_animations_driver_spec.ts +++ b/packages/animations/browser/test/render/web_animations/web_animations_driver_spec.ts @@ -5,8 +5,6 @@ * 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 {browserDetection} from '@angular/platform-browser/testing/src/browser_util'; - import {WebAnimationsDriver} from '../../../src/render/web_animations/web_animations_driver'; import {WebAnimationsPlayer} from '../../../src/render/web_animations/web_animations_player'; diff --git a/packages/compiler/test/integration_spec.ts b/packages/compiler/test/integration_spec.ts index 12252796b3c8..9e773f3c8d51 100644 --- a/packages/compiler/test/integration_spec.ts +++ b/packages/compiler/test/integration_spec.ts @@ -9,7 +9,6 @@ import {Component, Directive, Input} from '@angular/core'; import {ComponentFixture, TestBed, waitForAsync} from '@angular/core/testing'; import {By} from '@angular/platform-browser/src/dom/debug/by'; -import {browserDetection} from '@angular/platform-browser/testing/src/browser_util'; import {expect} from '@angular/platform-browser/testing/src/matchers'; { @@ -39,26 +38,20 @@ import {expect} from '@angular/platform-browser/testing/src/matchers'; }); describe('ng-container', () => { - if (browserDetection.isChromeDesktop) { - it('should work regardless the namespace', waitForAsync(() => { - @Component({ - selector: 'comp', - template: - '', - }) - class MyCmp { - } + it('should work regardless the namespace', waitForAsync(() => { + @Component({ + selector: 'comp', + template: + '', + }) + class MyCmp { + } - const f = - TestBed.configureTestingModule({declarations: [MyCmp]}).createComponent(MyCmp); - f.detectChanges(); + const f = TestBed.configureTestingModule({declarations: [MyCmp]}).createComponent(MyCmp); + f.detectChanges(); - expect(f.nativeElement.children[0].children[0].tagName).toEqual('rect'); - })); - } else { - // Jasmine will throw if there are no tests. - it('should pass', () => {}); - } + expect(f.nativeElement.children[0].children[0].tagName).toEqual('rect'); + })); }); }); } diff --git a/packages/compiler/test/schema/dom_element_schema_registry_spec.ts b/packages/compiler/test/schema/dom_element_schema_registry_spec.ts index c4812c7b2474..1f24406d033b 100644 --- a/packages/compiler/test/schema/dom_element_schema_registry_spec.ts +++ b/packages/compiler/test/schema/dom_element_schema_registry_spec.ts @@ -8,7 +8,6 @@ import {DomElementSchemaRegistry} from '@angular/compiler/src/schema/dom_element_schema_registry'; import {CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, SecurityContext} from '@angular/core'; -import {browserDetection} from '@angular/platform-browser/testing/src/browser_util'; import {Element} from '../../src/ml_parser/ast'; import {HtmlParser} from '../../src/ml_parser/html_parser'; @@ -185,7 +184,7 @@ If 'onAnything' is a directive input, make sure the directive is imported by the }); }); - if (browserDetection.isChromeDesktop) { + if (!isNode) { it('generate a new schema', () => { let schema = '\n'; extractSchema()!.forEach((props, name) => { diff --git a/packages/core/test/animation/animations_with_web_animations_integration_spec.ts b/packages/core/test/animation/animations_with_web_animations_integration_spec.ts index d39dc7beb473..f5265d959476 100644 --- a/packages/core/test/animation/animations_with_web_animations_integration_spec.ts +++ b/packages/core/test/animation/animations_with_web_animations_integration_spec.ts @@ -12,7 +12,6 @@ import {AnimationGroupPlayer} from '@angular/animations/src/players/animation_gr import {Component, ViewChild} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {BrowserAnimationsModule} from '@angular/platform-browser/animations'; -import {browserDetection} from '@angular/platform-browser/testing/src/browser_util'; (function() { // these tests are only meant to be run within the DOM (for now) @@ -70,20 +69,18 @@ describe('animation integration tests using web animations', function() { webPlayer.finish(); - if (!browserDetection.isOldChrome) { - cmp.exp = false; - fixture.detectChanges(); - engine.flush(); + cmp.exp = false; + fixture.detectChanges(); + engine.flush(); - expect(engine.players.length).toEqual(1); - webPlayer = - (engine.players[0] as TransitionAnimationPlayer).getRealPlayer() as ɵWebAnimationsPlayer; + expect(engine.players.length).toEqual(1); + webPlayer = + (engine.players[0] as TransitionAnimationPlayer).getRealPlayer() as ɵWebAnimationsPlayer; - expect(webPlayer.keyframes).toEqual([ - new Map([['height', '100px'], ['offset', 0]]), - new Map([['height', '0px'], ['offset', 1]]) - ]); - } + expect(webPlayer.keyframes).toEqual([ + new Map([['height', '100px'], ['offset', 0]]), + new Map([['height', '0px'], ['offset', 1]]) + ]); }); it('should compute (!) animation styles for a container that is being inserted', () => { diff --git a/packages/core/test/linker/projection_integration_spec.ts b/packages/core/test/linker/projection_integration_spec.ts index c6b2d5d7d170..fcb64b1d21d2 100644 --- a/packages/core/test/linker/projection_integration_spec.ts +++ b/packages/core/test/linker/projection_integration_spec.ts @@ -10,7 +10,6 @@ import {ɵgetDOM as getDOM} from '@angular/common'; import {Component, ComponentRef, createComponent, Directive, ElementRef, EnvironmentInjector, Injector, Input, NgModule, NO_ERRORS_SCHEMA, OnInit, reflectComponentType, 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 {browserDetection} from '@angular/platform-browser/testing/src/browser_util'; import {expect} from '@angular/platform-browser/testing/src/matchers'; describe('projection', () => { @@ -442,7 +441,7 @@ describe('projection', () => { expect(main.nativeElement).toHaveText('TREE(0:TREE2(1:TREE(2:)))'); }); - if (browserDetection.supportsShadowDom) { + if (!isNode) { it('should support shadow dom content projection and isolate styles per component', () => { TestBed.configureTestingModule({declarations: [SimpleShadowDom1, SimpleShadowDom2]}); TestBed.overrideComponent(MainComp, { diff --git a/packages/core/test/sanitization/html_sanitizer_spec.ts b/packages/core/test/sanitization/html_sanitizer_spec.ts index d66953f9a3be..0e900ea20af7 100644 --- a/packages/core/test/sanitization/html_sanitizer_spec.ts +++ b/packages/core/test/sanitization/html_sanitizer_spec.ts @@ -6,8 +6,6 @@ * found in the LICENSE file at https://angular.io/license */ -import {browserDetection} from '@angular/platform-browser/testing/src/browser_util'; - import {_sanitizeHtml} from '../../src/sanitization/html_sanitizer'; import {isDOMParserAvailable} from '../../src/sanitization/inert_body'; @@ -251,13 +249,11 @@ function sanitizeHtml(defaultDoc: any, unsafeHtmlInput: string): string { '

    '); }); - if (browserDetection.isWebkit) { - it('should prevent mXSS attacks', function() { - // In Chrome Canary 62, the ideographic space character is kept as a stringified HTML entity - expect(sanitizeHtml(defaultDoc, '
    CLICKME')) - .toMatch(/CLICKME<\/a>/); - }); - } + it('should prevent mXSS attacks', function() { + // In Chrome Canary 62, the ideographic space character is kept as a stringified HTML entity + expect(sanitizeHtml(defaultDoc, 'CLICKME')) + .toMatch(/CLICKME<\/a>/); + }); if (isDOMParserAvailable()) { it('should work even if DOMParser returns a null body', () => { diff --git a/packages/core/test/zone/ng_zone_spec.ts b/packages/core/test/zone/ng_zone_spec.ts index da018bbe86e2..6105190ae286 100644 --- a/packages/core/test/zone/ng_zone_spec.ts +++ b/packages/core/test/zone/ng_zone_spec.ts @@ -9,19 +9,17 @@ import {EventEmitter, NgZone} from '@angular/core'; import {fakeAsync, flushMicrotasks, inject, waitForAsync} from '@angular/core/testing'; import {Log} from '@angular/core/testing/src/testing_internal'; -import {browserDetection} from '@angular/platform-browser/testing/src/browser_util'; import {global} from '../../src/util/global'; import {scheduleMicroTask} from '../../src/util/microtask'; import {getNativeRequestAnimationFrame} from '../../src/util/raf'; import {NoopNgZone} from '../../src/zone/ng_zone'; -const needsLongerTimers = browserDetection.isSlow || browserDetection.isEdge; const resultTimer = 1000; // Schedules a macrotask (using a timer) function macroTask(fn: (...args: any[]) => void, timer = 1): void { // adds longer timers for passing tests in IE and Edge - setTimeout(fn, needsLongerTimers ? timer : 1); + setTimeout(fn, 1); } let _log: Log; diff --git a/packages/platform-browser/test/browser_util_spec.ts b/packages/platform-browser/test/browser_util_spec.ts deleted file mode 100644 index 26dde092bd72..000000000000 --- a/packages/platform-browser/test/browser_util_spec.ts +++ /dev/null @@ -1,175 +0,0 @@ -/** - * @license - * Copyright Google LLC 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 {BrowserDetection} from '../testing/src/browser_util'; - -{ - describe('BrowserDetection', () => { - const browsers = [ - { - name: 'Chrome', - ua: 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.125 Safari/537.36', - isFirefox: false, - isAndroid: false, - isEdge: false, - isWebkit: true, - isIOS7: false, - isSlow: false, - isChromeDesktop: true, - isOldChrome: false - }, - { - name: 'Chrome mobile', - ua: 'Mozilla/5.0 (Linux; Android 5.1.1; D5803 Build/23.4.A.0.546) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.133 Mobile Safari/537.36', - isFirefox: false, - isAndroid: false, - isEdge: false, - isWebkit: true, - isIOS7: false, - isSlow: false, - isChromeDesktop: false, - isOldChrome: false - }, - { - name: 'Firefox', - ua: 'Mozilla/5.0 (X11; Linux i686; rv:40.0) Gecko/20100101 Firefox/40.0', - isFirefox: true, - isAndroid: false, - isEdge: false, - isWebkit: false, - isIOS7: false, - isSlow: false, - isChromeDesktop: false, - isOldChrome: false - }, - { - name: 'Edge', - ua: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10136', - isFirefox: false, - isAndroid: false, - isEdge: true, - isWebkit: false, - isIOS7: false, - isSlow: false, - isChromeDesktop: false, - isOldChrome: false - }, - { - name: 'Android4.1', - ua: 'Mozilla/5.0 (Linux; U; Android 4.1.1; en-us; Android SDK built for x86 Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - isFirefox: false, - isAndroid: true, - isEdge: false, - isWebkit: true, - isIOS7: false, - isSlow: true, - isChromeDesktop: false, - isOldChrome: false - }, - { - name: 'Android4.2', - ua: 'Mozilla/5.0 (Linux; U; Android 4.2; en-us; Android SDK built for x86 Build/JOP40C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - isFirefox: false, - isAndroid: true, - isEdge: false, - isWebkit: true, - isIOS7: false, - isSlow: true, - isChromeDesktop: false, - isOldChrome: false - }, - { - name: 'Android4.3', - ua: 'Mozilla/5.0 (Linux; U; Android 4.3; en-us; Android SDK built for x86 Build/JSS15J) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30', - isFirefox: false, - isAndroid: true, - isEdge: false, - isWebkit: true, - isIOS7: false, - isSlow: true, - isChromeDesktop: false, - isOldChrome: false - }, - { - name: 'Android4.4', - ua: 'Mozilla/5.0 (Linux; Android 4.4.2; Android SDK built for x86 Build/KK) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36', - isFirefox: false, - isAndroid: false, - isEdge: false, - isWebkit: true, - isIOS7: false, - isSlow: false, - isChromeDesktop: false, - isOldChrome: true - }, - { - name: 'Safari7', - ua: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/7.1.7 Safari/537.85.16', - isFirefox: false, - isAndroid: false, - isEdge: false, - isWebkit: true, - isIOS7: false, - isSlow: false, - isChromeDesktop: false, - isOldChrome: false - }, - { - name: 'Safari8', - ua: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/600.7.12 (KHTML, like Gecko) Version/8.0.7 Safari/600.7.12', - isFirefox: false, - isAndroid: false, - isEdge: false, - isWebkit: true, - isIOS7: false, - isSlow: false, - isChromeDesktop: false, - isOldChrome: false - }, - { - name: 'iOS7', - ua: 'Mozilla/5.0 (iPhone; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D167 Safari/9537.53', - isFirefox: false, - isAndroid: false, - isEdge: false, - isWebkit: true, - isIOS7: true, - isSlow: true, - isChromeDesktop: false, - isOldChrome: false - }, - { - name: 'iOS8', - ua: 'Mozilla/5.0 (iPhone; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H141 Safari/600.1.4', - isFirefox: false, - isAndroid: false, - isEdge: false, - isWebkit: true, - isIOS7: false, - isSlow: false, - isChromeDesktop: false, - isOldChrome: false - } - ]; - - browsers.forEach((browser: {[key: string]: any}) => { - it(`should detect ${browser['name']}`, () => { - const bd = new BrowserDetection(browser['ua']); - expect(bd.isFirefox).toBe(browser['isFirefox']); - expect(bd.isAndroid).toBe(browser['isAndroid']); - expect(bd.isEdge).toBe(browser['isEdge']); - expect(bd.isWebkit).toBe(browser['isWebkit']); - expect(bd.isIOS7).toBe(browser['isIOS7']); - expect(bd.isSlow).toBe(browser['isSlow']); - expect(bd.isChromeDesktop).toBe(browser['isChromeDesktop']); - expect(bd.isOldChrome).toBe(browser['isOldChrome']); - }); - }); - }); -} diff --git a/packages/platform-browser/test/dom/shadow_dom_spec.ts b/packages/platform-browser/test/dom/shadow_dom_spec.ts index 771806ffee88..36063110bc71 100644 --- a/packages/platform-browser/test/dom/shadow_dom_spec.ts +++ b/packages/platform-browser/test/dom/shadow_dom_spec.ts @@ -9,76 +9,79 @@ import {Component, NgModule, ViewEncapsulation} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {BrowserModule} from '@angular/platform-browser'; -import {browserDetection} from '@angular/platform-browser/testing/src/browser_util'; import {expect} from '@angular/platform-browser/testing/src/matchers'; -if (browserDetection.supportsShadowDom) { - describe('ShadowDOM Support', () => { - beforeEach(() => { - TestBed.configureTestingModule({imports: [TestModule]}); - }); - - it('should attach and use a shadowRoot when ViewEncapsulation.ShadowDom is set', () => { - const compEl = TestBed.createComponent(ShadowComponent).nativeElement; - expect(compEl.shadowRoot!.textContent).toEqual('Hello World'); - }); - - it('should use the shadow root to encapsulate styles', () => { - const compEl = TestBed.createComponent(StyledShadowComponent).nativeElement; - // Firefox and Chrome return different computed styles. Chrome supports CSS property - // shorthands in the computed style object while Firefox expects explicit CSS properties. - // e.g. we can't use the "border" CSS property for this test as "border" is a shorthand - // property and therefore would not work within Firefox. - expect(window.getComputedStyle(compEl).backgroundColor).toEqual('rgb(0, 0, 0)'); - const redDiv = compEl.shadowRoot.querySelector('div.red'); - expect(window.getComputedStyle(redDiv).backgroundColor).toEqual('rgb(255, 0, 0)'); - }); - - it('should allow the usage of elements', () => { - const el = TestBed.createComponent(ShadowSlotComponent).nativeElement; - const projectedContent = document.createTextNode('Hello Slot!'); - el.appendChild(projectedContent); - const slot = el.shadowRoot!.querySelector('slot'); - - expect(slot!.assignedNodes().length).toBe(1); - expect(slot!.assignedNodes()[0].textContent).toBe('Hello Slot!'); - }); - - it('should allow the usage of named elements', () => { - const el = TestBed.createComponent(ShadowSlotsComponent).nativeElement; - - const headerContent = document.createElement('h1'); - headerContent.setAttribute('slot', 'header'); - headerContent.textContent = 'Header Text!'; - - const articleContent = document.createElement('span'); - articleContent.setAttribute('slot', 'article'); - articleContent.textContent = 'Article Text!'; - - const articleSubcontent = document.createElement('span'); - articleSubcontent.setAttribute('slot', 'article'); - articleSubcontent.textContent = 'Article Subtext!'; - - el.appendChild(headerContent); - el.appendChild(articleContent); - el.appendChild(articleSubcontent); - - const headerSlot = el.shadowRoot!.querySelector('slot[name=header]') as HTMLSlotElement; - const articleSlot = el.shadowRoot!.querySelector('slot[name=article]') as HTMLSlotElement; - - expect(headerSlot!.assignedNodes().length).toBe(1); - expect(headerSlot!.assignedNodes()[0].textContent).toBe('Header Text!'); - expect(headerContent.assignedSlot).toBe(headerSlot); - - expect(articleSlot!.assignedNodes().length).toBe(2); - expect(articleSlot!.assignedNodes()[0].textContent).toBe('Article Text!'); - expect(articleSlot!.assignedNodes()[1].textContent).toBe('Article Subtext!'); - expect(articleContent.assignedSlot).toBe(articleSlot); - expect(articleSubcontent.assignedSlot).toBe(articleSlot); - }); +describe('ShadowDOM Support', () => { + if (isNode) { + // Jasmine will throw if there are no tests. + it('should pass', () => {}); + return; + } + + beforeEach(() => { + TestBed.configureTestingModule({imports: [TestModule]}); }); -} + + it('should attach and use a shadowRoot when ViewEncapsulation.ShadowDom is set', () => { + const compEl = TestBed.createComponent(ShadowComponent).nativeElement; + expect(compEl.shadowRoot!.textContent).toEqual('Hello World'); + }); + + it('should use the shadow root to encapsulate styles', () => { + const compEl = TestBed.createComponent(StyledShadowComponent).nativeElement; + // Firefox and Chrome return different computed styles. Chrome supports CSS property + // shorthands in the computed style object while Firefox expects explicit CSS properties. + // e.g. we can't use the "border" CSS property for this test as "border" is a shorthand + // property and therefore would not work within Firefox. + expect(window.getComputedStyle(compEl).backgroundColor).toEqual('rgb(0, 0, 0)'); + const redDiv = compEl.shadowRoot.querySelector('div.red'); + expect(window.getComputedStyle(redDiv).backgroundColor).toEqual('rgb(255, 0, 0)'); + }); + + it('should allow the usage of elements', () => { + const el = TestBed.createComponent(ShadowSlotComponent).nativeElement; + const projectedContent = document.createTextNode('Hello Slot!'); + el.appendChild(projectedContent); + const slot = el.shadowRoot!.querySelector('slot'); + + expect(slot!.assignedNodes().length).toBe(1); + expect(slot!.assignedNodes()[0].textContent).toBe('Hello Slot!'); + }); + + it('should allow the usage of named elements', () => { + const el = TestBed.createComponent(ShadowSlotsComponent).nativeElement; + + const headerContent = document.createElement('h1'); + headerContent.setAttribute('slot', 'header'); + headerContent.textContent = 'Header Text!'; + + const articleContent = document.createElement('span'); + articleContent.setAttribute('slot', 'article'); + articleContent.textContent = 'Article Text!'; + + const articleSubcontent = document.createElement('span'); + articleSubcontent.setAttribute('slot', 'article'); + articleSubcontent.textContent = 'Article Subtext!'; + + el.appendChild(headerContent); + el.appendChild(articleContent); + el.appendChild(articleSubcontent); + + const headerSlot = el.shadowRoot!.querySelector('slot[name=header]') as HTMLSlotElement; + const articleSlot = el.shadowRoot!.querySelector('slot[name=article]') as HTMLSlotElement; + + expect(headerSlot!.assignedNodes().length).toBe(1); + expect(headerSlot!.assignedNodes()[0].textContent).toBe('Header Text!'); + expect(headerContent.assignedSlot).toBe(headerSlot); + + expect(articleSlot!.assignedNodes().length).toBe(2); + expect(articleSlot!.assignedNodes()[0].textContent).toBe('Article Text!'); + expect(articleSlot!.assignedNodes()[1].textContent).toBe('Article Subtext!'); + expect(articleContent.assignedSlot).toBe(articleSlot); + expect(articleSubcontent.assignedSlot).toBe(articleSlot); + }); +}); @Component( {selector: 'shadow-comp', template: 'Hello World', encapsulation: ViewEncapsulation.ShadowDom}) diff --git a/packages/platform-browser/testing/src/browser.ts b/packages/platform-browser/testing/src/browser.ts index 6f6fc68f7703..f086081aa9ba 100644 --- a/packages/platform-browser/testing/src/browser.ts +++ b/packages/platform-browser/testing/src/browser.ts @@ -10,11 +10,8 @@ import {MockPlatformLocation} from '@angular/common/testing'; import {APP_ID, createPlatformFactory, NgModule, PLATFORM_INITIALIZER, platformCore, provideZoneChangeDetection, StaticProvider} from '@angular/core'; import {BrowserModule, ɵBrowserDomAdapter as BrowserDomAdapter} from '@angular/platform-browser'; -import {BrowserDetection, createNgZone} from './browser_util'; - function initBrowserTests() { BrowserDomAdapter.makeCurrent(); - BrowserDetection.setup(); } const _TEST_BROWSER_PLATFORM_PROVIDERS: StaticProvider[] = diff --git a/packages/platform-browser/testing/src/browser_util.ts b/packages/platform-browser/testing/src/browser_util.ts index f17aa246479d..02f3f385f511 100644 --- a/packages/platform-browser/testing/src/browser_util.ts +++ b/packages/platform-browser/testing/src/browser_util.ts @@ -7,73 +7,7 @@ */ import {ɵgetDOM as getDOM} from '@angular/common'; -import {NgZone, ɵglobal as global} from '@angular/core'; - -export class BrowserDetection { - private _overrideUa: string|null; - private get _ua(): string { - if (typeof this._overrideUa === 'string') { - return this._overrideUa; - } - - return getDOM() ? getDOM().getUserAgent() : ''; - } - - static setup() { - return new BrowserDetection(null); - } - - constructor(ua: string|null) { - this._overrideUa = ua; - } - - get isFirefox(): boolean { - return this._ua.indexOf('Firefox') > -1; - } - - get isAndroid(): boolean { - return this._ua.indexOf('Mozilla/5.0') > -1 && this._ua.indexOf('Android') > -1 && - this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Chrome') == -1 && - this._ua.indexOf('IEMobile') == -1; - } - - get isEdge(): boolean { - return this._ua.indexOf('Edge') > -1; - } - - get isWebkit(): boolean { - return this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Edge') == -1 && - this._ua.indexOf('IEMobile') == -1; - } - - get isIOS7(): boolean { - return (this._ua.indexOf('iPhone OS 7') > -1 || this._ua.indexOf('iPad OS 7') > -1) && - this._ua.indexOf('IEMobile') == -1; - } - - get isSlow(): boolean { - return this.isAndroid || this.isIOS7; - } - - get isChromeDesktop(): boolean { - return this._ua.indexOf('Chrome') > -1 && this._ua.indexOf('Mobile Safari') == -1 && - this._ua.indexOf('Edge') == -1; - } - - // "Old Chrome" means Chrome 3X, where there are some discrepancies in the Intl API. - // Android 4.4 and 5.X have such browsers by default (respectively 30 and 39). - get isOldChrome(): boolean { - return this._ua.indexOf('Chrome') > -1 && this._ua.indexOf('Chrome/3') > -1 && - this._ua.indexOf('Edge') == -1; - } - - get supportsShadowDom() { - const testEl = document.createElement('div'); - return (typeof testEl.attachShadow !== 'undefined'); - } -} - -export const browserDetection: BrowserDetection = BrowserDetection.setup(); +import {NgZone} from '@angular/core'; export function dispatchEvent(element: any, eventType: any): Event { const evt: Event = getDOM().getDefaultDocument().createEvent('Event'); From 277a473e537ffb89ac76c3c02adc0e92e0054060 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Wed, 31 May 2023 10:21:34 -0400 Subject: [PATCH 25/32] build: Fix size tracking test (#50531) One of our goldens needed to be bumped. PR Close #50531 --- goldens/size-tracking/integration-payloads.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/goldens/size-tracking/integration-payloads.json b/goldens/size-tracking/integration-payloads.json index 609e1a374ff2..6f517e3ba56d 100644 --- a/goldens/size-tracking/integration-payloads.json +++ b/goldens/size-tracking/integration-payloads.json @@ -9,7 +9,7 @@ "cli-hello-world-ivy-i18n": { "uncompressed": { "runtime": 926, - "main": 126740, + "main": 131777, "polyfills": 34676 } }, @@ -56,4 +56,4 @@ "polyfills": 33802 } } -} +} \ No newline at end of file From 55244e67597838eaa519c5917b3705d1041f0dd7 Mon Sep 17 00:00:00 2001 From: Jessica Janiuk Date: Wed, 31 May 2023 10:09:27 -0400 Subject: [PATCH 26/32] Revert "fix(zone.js): enable monkey patching of the `queueMicrotask()` API in node.js (#50467)" (#50529) This reverts commit 381cb982264d30e8c79e77e9186acd6da006e718. PR Close #50529 --- packages/zone.js/karma-build.conf.js | 1 - packages/zone.js/lib/browser/browser.ts | 9 +++++++++ packages/zone.js/lib/browser/rollup-common.ts | 1 - .../zone.js/lib/common/queue-microtask.ts | 19 ------------------- packages/zone.js/lib/node/node.ts | 1 - .../zone.js/lib/zone.configurations.api.ts | 4 ++-- packages/zone.js/test/browser-zone-setup.ts | 1 - .../queue-microtask.spec.ts | 0 packages/zone.js/test/browser_entry_point.ts | 1 + packages/zone.js/test/common_tests.ts | 1 - .../test/node_error_entry_point.init.ts | 1 - 11 files changed, 12 insertions(+), 27 deletions(-) delete mode 100644 packages/zone.js/lib/common/queue-microtask.ts rename packages/zone.js/test/{common => browser}/queue-microtask.spec.ts (100%) diff --git a/packages/zone.js/karma-build.conf.js b/packages/zone.js/karma-build.conf.js index 8d754070c7ea..943a610509fd 100644 --- a/packages/zone.js/karma-build.conf.js +++ b/packages/zone.js/karma-build.conf.js @@ -13,6 +13,5 @@ module.exports = function(config) { config.files.push('build/test/test_fake_polyfill.js'); config.files.push('build/lib/zone.js'); config.files.push('build/lib/common/promise.js'); - config.files.push('build/lib/common/queue-microtask.js'); config.files.push('build/test/main.js'); }; diff --git a/packages/zone.js/lib/browser/browser.ts b/packages/zone.js/lib/browser/browser.ts index cd0c5150a318..88521a71f664 100644 --- a/packages/zone.js/lib/browser/browser.ts +++ b/packages/zone.js/lib/browser/browser.ts @@ -25,6 +25,15 @@ Zone.__load_patch('legacy', (global: any) => { } }); +Zone.__load_patch('queueMicrotask', (global: any, Zone: ZoneType, api: _ZonePrivate) => { + api.patchMethod(global, 'queueMicrotask', delegate => { + return function(self: any, args: any[]) { + Zone.current.scheduleMicroTask('queueMicrotask', args[0]); + } + }); +}); + + Zone.__load_patch('timers', (global: any) => { const set = 'set'; const clear = 'clear'; diff --git a/packages/zone.js/lib/browser/rollup-common.ts b/packages/zone.js/lib/browser/rollup-common.ts index f8b9d48abbcc..7658b7da7c83 100644 --- a/packages/zone.js/lib/browser/rollup-common.ts +++ b/packages/zone.js/lib/browser/rollup-common.ts @@ -10,4 +10,3 @@ import '../zone'; import '../common/promise'; import '../common/to-string'; import './api-util'; -import '../common/queue-microtask'; diff --git a/packages/zone.js/lib/common/queue-microtask.ts b/packages/zone.js/lib/common/queue-microtask.ts deleted file mode 100644 index 253dd8f435f9..000000000000 --- a/packages/zone.js/lib/common/queue-microtask.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @license - * Copyright Google LLC 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 - * @suppress {missingRequire} - */ - -Zone.__load_patch('queueMicrotask', (global: any, Zone: ZoneType, api: _ZonePrivate) => { - api.patchMethod(global, 'queueMicrotask', delegate => { - return function(self: any, args: any[]) { - Zone.current.scheduleMicroTask('queueMicrotask', args[0]); - } - }); -}); diff --git a/packages/zone.js/lib/node/node.ts b/packages/zone.js/lib/node/node.ts index bf85413e1255..993138bf38fd 100644 --- a/packages/zone.js/lib/node/node.ts +++ b/packages/zone.js/lib/node/node.ts @@ -9,7 +9,6 @@ import './node_util'; import './events'; import './fs'; -import '../common/queue-microtask'; import {findEventTasks} from '../common/events'; import {patchTimer} from '../common/timers'; diff --git a/packages/zone.js/lib/zone.configurations.api.ts b/packages/zone.js/lib/zone.configurations.api.ts index 6a602b8cfff5..c45ae9bb2a94 100644 --- a/packages/zone.js/lib/zone.configurations.api.ts +++ b/packages/zone.js/lib/zone.configurations.api.ts @@ -296,9 +296,9 @@ interface ZoneGlobalConfigurations { /** * - * Disable the monkey patching of the `queueMicrotask()` API. + * Disable the monkey patching of the browser's `queueMicrotask()` API. * - * By default, `zone.js` monkey patches the `queueMicrotask()` API + * By default, `zone.js` monkey patches the browser's `queueMicrotask()` API * to ensure that `queueMicrotask()` callback is invoked in the same zone as zone used to invoke * `queueMicrotask()`. And also the callback is running as `microTask` like * `Promise.prototype.then()`. diff --git a/packages/zone.js/test/browser-zone-setup.ts b/packages/zone.js/test/browser-zone-setup.ts index cfff6d9eaf43..264d797b7ac9 100644 --- a/packages/zone.js/test/browser-zone-setup.ts +++ b/packages/zone.js/test/browser-zone-setup.ts @@ -11,7 +11,6 @@ if (typeof window !== 'undefined') { (window as any)[zoneSymbol('fakeAsyncAutoFakeAsyncWhenClockPatched')] = true; } import '../lib/common/to-string'; -import '../lib/common/queue-microtask'; import '../lib/browser/api-util'; import '../lib/browser/browser-legacy'; import '../lib/browser/browser'; diff --git a/packages/zone.js/test/common/queue-microtask.spec.ts b/packages/zone.js/test/browser/queue-microtask.spec.ts similarity index 100% rename from packages/zone.js/test/common/queue-microtask.spec.ts rename to packages/zone.js/test/browser/queue-microtask.spec.ts diff --git a/packages/zone.js/test/browser_entry_point.ts b/packages/zone.js/test/browser_entry_point.ts index 4bd23a30f0f0..d3cf4518efaf 100644 --- a/packages/zone.js/test/browser_entry_point.ts +++ b/packages/zone.js/test/browser_entry_point.ts @@ -28,3 +28,4 @@ import './mocha-patch.spec'; import './jasmine-patch.spec'; import './browser/messageport.spec'; import './extra/cordova.spec'; +import './browser/queue-microtask.spec'; diff --git a/packages/zone.js/test/common_tests.ts b/packages/zone.js/test/common_tests.ts index 52c384fe7795..5539bae4ce6b 100644 --- a/packages/zone.js/test/common_tests.ts +++ b/packages/zone.js/test/common_tests.ts @@ -11,7 +11,6 @@ import './common/zone.spec'; import './common/task.spec'; import './common/util.spec'; import './common/Promise.spec'; -import './common/queue-microtask.spec'; import './common/fetch.spec'; import './common/Error.spec'; import './common/setInterval.spec'; diff --git a/packages/zone.js/test/node_error_entry_point.init.ts b/packages/zone.js/test/node_error_entry_point.init.ts index 1937170d07b2..651ec727c20f 100644 --- a/packages/zone.js/test/node_error_entry_point.init.ts +++ b/packages/zone.js/test/node_error_entry_point.init.ts @@ -11,7 +11,6 @@ import './test_fake_polyfill'; // Setup tests for Zone without microtask support import '../lib/zone'; import '../lib/common/promise'; -import '../lib/common/queue-microtask'; import '../lib/common/to-string'; import './test-env-setup-jasmine'; import './wtf_mock'; From 223c3536859aab9bb5365a736eff1af03107cd96 Mon Sep 17 00:00:00 2001 From: Angular Robot Date: Sun, 28 May 2023 16:06:31 +0000 Subject: [PATCH 27/32] build: update dependency eslint-plugin-jsdoc to v45 (#50523) See associated pull request for more information. PR Close #50523 --- aio/.eslintrc.json | 11 +- aio/content/examples/.eslintrc.json | 168 ++++- .../src/app/app.component.html | 4 +- aio/package.json | 24 +- aio/yarn.lock | 636 ++++++++++++------ 5 files changed, 609 insertions(+), 234 deletions(-) diff --git a/aio/.eslintrc.json b/aio/.eslintrc.json index 19dd7ae31680..7b4c0ac53df1 100644 --- a/aio/.eslintrc.json +++ b/aio/.eslintrc.json @@ -143,7 +143,6 @@ "import/no-deprecated": "warn", "indent": "off", "jsdoc/check-alignment": "error", - "jsdoc/newline-after-description": "error", "jsdoc/no-types": "error", "max-classes-per-file": "off", "max-len": [ @@ -231,11 +230,11 @@ "plugin:@angular-eslint/template/recommended" ], "rules": { - "@angular-eslint/template/accessibility-alt-text": "error", - "@angular-eslint/template/accessibility-elements-content": "error", - "@angular-eslint/template/accessibility-label-has-associated-control": "error", - "@angular-eslint/template/accessibility-table-scope": "error", - "@angular-eslint/template/accessibility-valid-aria": "error", + "@angular-eslint/template/alt-text": "error", + "@angular-eslint/template/elements-content": "error", + "@angular-eslint/template/label-has-associated-control": "error", + "@angular-eslint/template/table-scope": "error", + "@angular-eslint/template/valid-aria": "error", "@angular-eslint/template/click-events-have-key-events": "error", "@angular-eslint/template/eqeqeq": "off", "@angular-eslint/template/mouse-events-have-key-events": "error", diff --git a/aio/content/examples/.eslintrc.json b/aio/content/examples/.eslintrc.json index bba01e83fbbe..3a94305ee735 100644 --- a/aio/content/examples/.eslintrc.json +++ b/aio/content/examples/.eslintrc.json @@ -1,23 +1,16 @@ { "root": true, - "ignorePatterns": [ - "*.js", - "styleguide/**/*.avoid.ts" - ], + "ignorePatterns": ["*.js", "styleguide/**/*.avoid.ts"], "overrides": [ { - "files": [ - "*.html" - ], - "extends": [ - "plugin:@angular-eslint/template/recommended" - ], + "files": ["*.html"], + "extends": ["plugin:@angular-eslint/template/recommended"], "rules": { - "@angular-eslint/template/accessibility-alt-text": "error", - "@angular-eslint/template/accessibility-elements-content": "error", - "@angular-eslint/template/accessibility-label-has-associated-control": "error", - "@angular-eslint/template/accessibility-table-scope": "error", - "@angular-eslint/template/accessibility-valid-aria": "error", + "@angular-eslint/template/alt-text": "error", + "@angular-eslint/template/elements-content": "error", + "@angular-eslint/template/label-has-associated-control": "error", + "@angular-eslint/template/table-scope": "error", + "@angular-eslint/template/valid-aria": "error", "@angular-eslint/template/click-events-have-key-events": "error", "@angular-eslint/template/eqeqeq": "off", "@angular-eslint/template/mouse-events-have-key-events": "error", @@ -27,19 +20,135 @@ } }, { - "files": [ - "*.ts" - ], + "files": ["*.ts"], "extends": [ - "plugin:@angular-eslint/ng-cli-compat", - "plugin:@angular-eslint/ng-cli-compat--formatting-add-on", "plugin:@angular-eslint/template/process-inline-templates" ], "parserOptions": { "createDefaultProgram": false, "project": "content/examples/tsconfig.eslint.json" }, + "plugins": [ + "@typescript-eslint", + "@angular-eslint", "eslint-plugin-import", "eslint-plugin-jsdoc", "eslint-plugin-prefer-arrow"], "rules": { + "@typescript-eslint/interface-name-prefix": "off", + "@typescript-eslint/explicit-member-accessibility": "off", + "sort-keys": "off", + "@angular-eslint/component-class-suffix": "error", + + "@angular-eslint/contextual-lifecycle": "error", + "@angular-eslint/directive-class-suffix": "error", + + "@angular-eslint/no-conflicting-lifecycle": "error", + "@angular-eslint/no-host-metadata-property": "error", + "@angular-eslint/no-input-rename": "error", + "@angular-eslint/no-inputs-metadata-property": "error", + "@angular-eslint/no-output-native": "error", + "@angular-eslint/no-output-on-prefix": "error", + "@angular-eslint/no-output-rename": "error", + "@angular-eslint/no-outputs-metadata-property": "error", + "@angular-eslint/use-lifecycle-interface": "error", + "@angular-eslint/use-pipe-transform-interface": "error", + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/array-type": "off", + + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-interface": "error", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-inferrable-types": [ + "error", + { + "ignoreParameters": true + } + ], + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-parameter-properties": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/triple-slash-reference": [ + "error", + { + "path": "always", + "types": "prefer-import", + "lib": "always" + } + ], + "@typescript-eslint/unified-signatures": "error", + "complexity": "off", + "constructor-super": "error", + "eqeqeq": ["error", "smart"], + "guard-for-in": "error", + "id-blacklist": [ + "error", + "any", + "Number", + "number", + "String", + "string", + "Boolean", + "boolean", + "Undefined", + "undefined" + ], + "id-match": "error", + "import/no-deprecated": "warn", + "jsdoc/no-types": "error", + "max-classes-per-file": "off", + "no-bitwise": "error", + "no-caller": "error", + "no-cond-assign": "error", + + "no-debugger": "error", + "no-empty": "off", + "no-eval": "error", + "no-fallthrough": "error", + "no-invalid-this": "off", + "no-new-wrappers": "error", + "no-restricted-imports": [ + "error", + { + "name": "rxjs/Rx", + "message": "Please import directly from 'rxjs' instead" + } + ], + "no-throw-literal": "error", + "no-undef-init": "error", + "no-unsafe-finally": "error", + "no-unused-labels": "error", + "no-var": "error", + "object-shorthand": "error", + "one-var": ["error", "never"], + "prefer-const": "error", + "radix": "error", + "use-isnan": "error", + "valid-typeof": "off", + "arrow-body-style": "error", + "arrow-parens": "off", + "comma-dangle": "off", + "curly": "error", + "eol-last": "error", + "jsdoc/check-alignment": "error", + "new-parens": "error", + "no-multiple-empty-lines": "off", + "no-trailing-spaces": "error", + "quote-props": ["error", "as-needed"], + "space-before-function-paren": [ + "error", + { + "anonymous": "never", + "asyncArrow": "always", + "named": "never" + } + ], + "@typescript-eslint/semi": ["error", "always"], + "@typescript-eslint/type-annotation-spacing": "error", + "@typescript-eslint/ban-types": "error", "@angular-eslint/component-selector": [ "error", @@ -61,12 +170,15 @@ "@typescript-eslint/dot-notation": ["error", {"allowIndexSignaturePropertyAccess": true}], "indent": "off", "max-len": ["error", {"code": 120, "ignoreUrls": true}], - "@typescript-eslint/member-delimiter-style": ["error", { - "singleline": { - "delimiter": "comma", - "requireLast": false + "@typescript-eslint/member-delimiter-style": [ + "error", + { + "singleline": { + "delimiter": "comma", + "requireLast": false + } } - }], + ], "@typescript-eslint/member-ordering": "off", "@typescript-eslint/naming-convention": "off", "no-console": ["error", {"allow": ["log", "warn", "error"]}], @@ -88,7 +200,11 @@ "no-use-before-define": "off", "prefer-arrow/prefer-arrow-functions": "off", "quotes": "off", - "@typescript-eslint/quotes": ["error", "single", {"avoidEscape": true, "allowTemplateLiterals": true }], + "@typescript-eslint/quotes": [ + "error", + "single", + {"avoidEscape": true, "allowTemplateLiterals": true} + ], "semi": "error" } } diff --git a/aio/content/examples/template-syntax/src/app/app.component.html b/aio/content/examples/template-syntax/src/app/app.component.html index 13348d1e1705..e9e8a6dec48a 100644 --- a/aio/content/examples/template-syntax/src/app/app.component.html +++ b/aio/content/examples/template-syntax/src/app/app.component.html @@ -180,7 +180,7 @@

    top - +

    Property vs. Attribute (img examples)

    @@ -191,7 +191,7 @@

    - + top diff --git a/aio/package.json b/aio/package.json index e63869ec0e87..5ce92a0358f2 100644 --- a/aio/package.json +++ b/aio/package.json @@ -81,10 +81,10 @@ "devDependencies": { "@angular-devkit/architect-cli": "0.1600.0", "@angular-devkit/build-angular": "16.0.0", - "@angular-eslint/builder": "^15.0.0", - "@angular-eslint/eslint-plugin": "^15.0.0", - "@angular-eslint/eslint-plugin-template": "^15.0.0", - "@angular-eslint/template-parser": "^15.0.0", + "@angular-eslint/builder": "16.0.3", + "@angular-eslint/eslint-plugin": "16.0.3", + "@angular-eslint/eslint-plugin-template": "16.0.3", + "@angular-eslint/template-parser": "^16.0.3", "@angular/build-tooling": "https://github.com/angular/dev-infra-private-build-tooling-builds.git#7dad055464ea9847e4870b9e3baad1f0c417bdf7", "@angular/cli": "16.0.0", "@angular/compiler-cli": "16.0.0", @@ -98,8 +98,8 @@ "@types/lunr": "^2.3.3", "@types/node": "^12.7.9", "@types/trusted-types": "^2.0.2", - "@typescript-eslint/eslint-plugin": "5.59.2", - "@typescript-eslint/parser": "5.59.2", + "@typescript-eslint/eslint-plugin": "5.59.8", + "@typescript-eslint/parser": "5.59.8", "archiver": "^5.3.0", "assert": "^2.0.0", "canonical-path": "1.0.0", @@ -110,11 +110,11 @@ "dgeni": "^0.4.14", "dgeni-packages": "^0.30.0", "entities": "^4.0.0", - "eslint": "^8.0.0", - "eslint-plugin-import": "^2.23.4", - "eslint-plugin-jasmine": "^4.1.2", - "eslint-plugin-jsdoc": "^41.0.0", - "eslint-plugin-prefer-arrow": "^1.2.3", + "eslint": "8.41.0", + "eslint-plugin-import": "2.27.5", + "eslint-plugin-jasmine": "4.1.3", + "eslint-plugin-jsdoc": "45.0.0", + "eslint-plugin-prefer-arrow": "1.2.3", "find-free-port": "^2.0.0", "firebase-tools": "^12.0.0", "fs-extra": "^11.0.0", @@ -156,7 +156,7 @@ "tree-kill": "^1.1.0", "ts-node": "^10.8.1", "tsec": "^0.2.2", - "tslint": "~6.1.3", + "tslint": "6.1.3", "typescript": "~5.0.2", "uglify-js": "^3.13.3", "unist-util-filter": "^2.0.3", diff --git a/aio/yarn.lock b/aio/yarn.lock index 3d53f99b21a9..f4a5e49e8c82 100644 --- a/aio/yarn.lock +++ b/aio/yarn.lock @@ -229,51 +229,54 @@ ora "5.4.1" rxjs "7.8.1" -"@angular-eslint/builder@^15.0.0": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/builder/-/builder-15.2.1.tgz#ce8c65e3b671897db75ad90b41ef4cd6efe626f0" - integrity sha512-7x2DANebLRl997Mj4DhZrnz5+vnSjavGGveJ0mBuU7CEsL0ZYLftdRqL0e0HtU3ksseS7xpchD6OM08nkNgySw== - -"@angular-eslint/bundled-angular-compiler@15.2.1": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-15.2.1.tgz#7c77a4a19942868d844372b5b3b562c0d630de1e" - integrity sha512-LO7Am8eVCr7oh6a0VmKSL7K03CnQEQhFO7Wt/YtbfYOxVjrbwmYLwJn+wZPOT7A02t/BttOD/WXuDrOWtSMQ/Q== - -"@angular-eslint/eslint-plugin-template@^15.0.0": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-15.2.1.tgz#af39f66e9d971d7f7635add9cf1a396f1766fd64" - integrity sha512-IeiSLk6YxapFdH2z5o/O3R7VwtBd2T6fWmhLFPwDYMDknrwegnOjwswCdBplOccpUp0wqlCeGUx7LTsuzwaz7w== - dependencies: - "@angular-eslint/bundled-angular-compiler" "15.2.1" - "@angular-eslint/utils" "15.2.1" - "@typescript-eslint/type-utils" "5.48.2" - "@typescript-eslint/utils" "5.48.2" +"@angular-eslint/builder@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@angular-eslint/builder/-/builder-16.0.3.tgz#61846d7975b8248c7b7a1d7b251eed006c8666a3" + integrity sha512-pv/CrnOHHOnBqhyBmqUPsIHKXOHYMJztxYJ83tjxeXL5Moyu5e6CBMIQ58UtqmgWfEIA3n7owYy9KvHTJcemyQ== + dependencies: + "@nx/devkit" "16.2.2" + nx "16.2.2" + +"@angular-eslint/bundled-angular-compiler@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.0.3.tgz#52db355eb2794e5407bfd045c64e102a0c078fbe" + integrity sha512-8zwY6ustiPXBEF3+jELKVwGk6j2HJn7GHbqAhDFR02YiE27iRMSGTHIAWGs6ZI7F1JgfrIsOHrUgzC1x95K6rg== + +"@angular-eslint/eslint-plugin-template@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.0.3.tgz#513c6b675f0feb5c77d3de1f7daa5484ca1b62a3" + integrity sha512-OKTMWOjC7F5tdv7gm2tlmgyr/uVyS1RWJZn4X/6D6p0kOpiDXmajtbYHD5tzbshX2Ep62Nt+rg8+1XGHrU0ScA== + dependencies: + "@angular-eslint/bundled-angular-compiler" "16.0.3" + "@angular-eslint/utils" "16.0.3" + "@typescript-eslint/type-utils" "5.59.7" + "@typescript-eslint/utils" "5.59.7" aria-query "5.1.3" axobject-query "3.1.1" -"@angular-eslint/eslint-plugin@^15.0.0": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-15.2.1.tgz#616e7aa1f3aea6203e887c20749b87d08bb95d3e" - integrity sha512-OM7b1kS4E4CkXjkaWN+lEzawh4VxY6l7FO1Cuk4s7iv3/YpZG3rJxIZBqnFLTixwrBuqw8y4FNBzF3eDgmFAUw== +"@angular-eslint/eslint-plugin@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@angular-eslint/eslint-plugin/-/eslint-plugin-16.0.3.tgz#ecd95c7efccf164c23b5fb3a5c49b8d3b708a1d6" + integrity sha512-1c+dFytcQDOA2wJ8/rtydMV6UYq1BgVfOcBXOr0WJxC9g8Cad9czcUOkW41WGrTp5kICMliV0ypH5eEaCM2WDQ== dependencies: - "@angular-eslint/utils" "15.2.1" - "@typescript-eslint/utils" "5.48.2" + "@angular-eslint/utils" "16.0.3" + "@typescript-eslint/utils" "5.59.7" -"@angular-eslint/template-parser@^15.0.0": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-15.2.1.tgz#dbe4978afdcea81b9d5cac3d672c20de5821dc54" - integrity sha512-ViCi79gC2aKJecmYLkOT+QlT5WMRNXeYz0Dr9Pr8qXzIbY0oAWE7nOT5jkXwQ9oUk+ybtGCWHma5JVJWVJsIog== +"@angular-eslint/template-parser@^16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@angular-eslint/template-parser/-/template-parser-16.0.3.tgz#20bd165964545c5fa01b7b756d272f77cef828fc" + integrity sha512-IAWdwp/S9QC3EMiVxSS0E3ABy9PSidN3PW0Ll2EtM3mzXMYlpZXmxqd+B1xV/xKWzhk1Mp04QX8hHfG6Vq+qaQ== dependencies: - "@angular-eslint/bundled-angular-compiler" "15.2.1" + "@angular-eslint/bundled-angular-compiler" "16.0.3" eslint-scope "^7.0.0" -"@angular-eslint/utils@15.2.1": - version "15.2.1" - resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-15.2.1.tgz#b286fddb1b8b43d96b91009237da7f74d9e64dda" - integrity sha512-++FneAJHxJqcSu0igVN6uOkSoHxlzgLoMBswuovYJy3UKwm33/T6WFku8++753Ca/JucIoR1gdUfO7SoSspMDg== +"@angular-eslint/utils@16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@angular-eslint/utils/-/utils-16.0.3.tgz#a464f32a3df15d5e9f72cd47ffd123480c58c76e" + integrity sha512-QsbUVHJLk+fE08/D4y3wOyGk1iX2LVSygw+uzilbaAXfjD5/c0Ei5FbVx2mMYPk+aOl4yrvGQW3dmetMiAR0MQ== dependencies: - "@angular-eslint/bundled-angular-compiler" "15.2.1" - "@typescript-eslint/utils" "5.48.2" + "@angular-eslint/bundled-angular-compiler" "16.0.3" + "@typescript-eslint/utils" "5.59.7" "@angular/animations@16.0.0": version "16.0.0" @@ -292,7 +295,6 @@ "@angular/build-tooling@https://github.com/angular/dev-infra-private-build-tooling-builds.git#7dad055464ea9847e4870b9e3baad1f0c417bdf7": version "0.0.0-5f06c4774df908ed69e1441f4ec63b898acf0c68" - uid "7dad055464ea9847e4870b9e3baad1f0c417bdf7" resolved "https://github.com/angular/dev-infra-private-build-tooling-builds.git#7dad055464ea9847e4870b9e3baad1f0c417bdf7" dependencies: "@angular-devkit/build-angular" "16.0.0-rc.0" @@ -1594,10 +1596,10 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@es-joy/jsdoccomment@~0.37.0": - version "0.37.1" - resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.37.1.tgz#fa32a41ba12097452693343e09ad4d26d157aedd" - integrity sha512-5vxWJ1gEkEF0yRd0O+uK6dHJf7adrxwQSX8PuRiPfFSAbNLnY0ZJfXaZucoz14Jj2N11xn2DnlEPwWRpYpvRjg== +"@es-joy/jsdoccomment@~0.39.4": + version "0.39.4" + resolved "https://registry.yarnpkg.com/@es-joy/jsdoccomment/-/jsdoccomment-0.39.4.tgz#6b8a62e9b3077027837728818d3c4389a898b392" + integrity sha512-Jvw915fjqQct445+yron7Dufix9A+m9j1fCJYlCo1FWlRvTxa3pjJelxdSTdaLWcTwRU6vbL+NYjO4YuNIS5Qg== dependencies: comment-parser "1.3.1" esquery "^1.5.0" @@ -1850,10 +1852,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.40.0": - version "8.40.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.40.0.tgz#3ba73359e11f5a7bd3e407f70b3528abfae69cec" - integrity sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA== +"@eslint/js@8.41.0": + version "8.41.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.41.0.tgz#080321c3b68253522f7646b55b577dd99d2950b3" + integrity sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA== "@gar/promisify@^1.1.3": version "1.1.3" @@ -2889,6 +2891,77 @@ read-package-json-fast "^3.0.0" which "^3.0.0" +"@nrwl/devkit@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-16.2.2.tgz#fd7d0a19b4be3ba35cc0d3dd9e4154f9812f432f" + integrity sha512-R8OSh33HtGycSuu0KshpH/tsTdi6j4w7DuIb+Sa59UDIkchpvMeNAz8tj/05Z2tTntDZnYqPkmCs6rkZ4PvY4Q== + dependencies: + "@nx/devkit" "16.2.2" + +"@nrwl/tao@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-16.2.2.tgz#ace8d96c0ffa9ff45accf077d3c8d94a6cfe03a4" + integrity sha512-cPj6b+wSWs2WNFQ0p1fMyrvSLjkKJo7vXQTtd7MXNJT2NWEZdCtRy+nidZzjs7gKvVXGdZ8zDBXmCHWorOieXw== + dependencies: + nx "16.2.2" + +"@nx/devkit@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-16.2.2.tgz#5035d7e3dc5e113ce29f243a912955fa7d93e95c" + integrity sha512-MTYzetk4AQ9u2syEb9z+drDsu6U6NRAXVuUDMNg0tpZcbtE9bCSLH2ngfvTCqmLrAMBsJZRdv0twS1iepMhlAg== + dependencies: + "@nrwl/devkit" "16.2.2" + ejs "^3.1.7" + ignore "^5.0.4" + semver "7.3.4" + tmp "~0.2.1" + tslib "^2.3.0" + +"@nx/nx-darwin-arm64@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.2.2.tgz#7fb43fe8976a12b58f008d336d4898164254b740" + integrity sha512-CKfyLl92mhWqpv1hRTj3WgjVBY6yj3Et5T31m1N0assNWdTfuSB4ycdWzdlxXHx3yptnTOD/FCymTpUQI0GZRQ== + +"@nx/nx-darwin-x64@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-16.2.2.tgz#74b20875e1bcd450291a58026df9728f0b70f681" + integrity sha512-++uDfp/Oo8DDVU53DiJVkRNjNbOLzahDH6dINeA/3yTCU/IS0wXoaoclNZBReMWlDKTVvWgLF/eSbGINMqUHRg== + +"@nx/nx-linux-arm-gnueabihf@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.2.2.tgz#5afa251361b609ed966d31cac6a789174bd6b3a5" + integrity sha512-A4XFk63Q7fxgZaHnigIeofp/xOT2ZGDoNUyzld+UTlyJyNcClcOcqrro74aKOCG7PH0D56oE06JW3g7GKszgsA== + +"@nx/nx-linux-arm64-gnu@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.2.2.tgz#5d2c4f75ba582844d139729f4b194d39b8fc81d1" + integrity sha512-aQpTLVSawFVr33pBWjj8elqvjA5uWvzDW7hGaFQPgWgmjxrtJikIAkcLjfNOz8XYjRAP4OZkTVh4/E3GUch0kQ== + +"@nx/nx-linux-arm64-musl@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.2.2.tgz#5346829cddd27223c1c1b79c93eb195442b86907" + integrity sha512-20vyNYQ2SYSaWdxORj9HdOyGxiqE8SauaFiBjjid6/e5mSyaSKu+HHGsvhDUqzlWn3OaABKBqx0iYa9Kmf3BOQ== + +"@nx/nx-linux-x64-gnu@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.2.2.tgz#702922f71076a041325add15b145f0e33726ec4a" + integrity sha512-0G8kYpEmGHD+tT7RvUEvVXvPbvQD9GfEjeWEzZAdNAAMJu7JFjIo/oZDJYV7cMvXnC+tbpI9Gba5xfv8Al95eA== + +"@nx/nx-linux-x64-musl@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.2.2.tgz#ca2b0b1c98f16dfe66b7cffbec1e7b4c877058b4" + integrity sha512-Incv7DbKLfh6kakzMBuy6GYRgI+jEdZBRiFw0GoN9EsknmrPT/URn+w6uuicGGEXOLYpO3HUO3E374+b5Wz2zg== + +"@nx/nx-win32-arm64-msvc@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.2.2.tgz#4ad8f7bf300dac63227e51c393345cc2306368d3" + integrity sha512-8m+Usj9faCl0pdQLFeBGhbYUObT3/tno5oGMPtJLyRjITNvTZAaIS4FFctp/rwJPehDBRQsUxwMJ2JRaU4jQdA== + +"@nx/nx-win32-x64-msvc@16.2.2": + version "16.2.2" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.2.2.tgz#0afbeb2133613a5a3b0083e18a250472ccf45932" + integrity sha512-liHtyVVOttcqHIV3Xrg/1AJzEgfiOCeqJsleHXHGgPr1fxPx7SIZaa3/QnDY1lNMN+t6Gvj0/r2Ba3iuptYD3Q== + "@opentelemetry/api@^1.0.0": version "1.4.1" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.4.1.tgz#ff22eb2e5d476fbc2450a196e40dd243cc20c28f" @@ -2899,6 +2972,14 @@ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.3.1.tgz#ba07b864a3c955f061aa30ea3ef7f4ae4449794a" integrity sha512-wU5J8rUoo32oSef/rFpOT1HIjLjAv3qIDHkw1QIhODV3OpAVHi5oVzlouozg9obUmZKtbZ0qUe/m7FP0y0yBzA== +"@parcel/watcher@2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" + integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== + dependencies: + node-addon-api "^3.2.1" + node-gyp-build "^4.3.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -3509,15 +3590,15 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@5.59.2": - version "5.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.2.tgz#684a2ce7182f3b4dac342eef7caa1c2bae476abd" - integrity sha512-yVrXupeHjRxLDcPKL10sGQ/QlVrA8J5IYOEWVqk0lJaSZP7X5DfnP7Ns3cc74/blmbipQ1htFNVGsHX6wsYm0A== +"@typescript-eslint/eslint-plugin@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz#1e7a3e5318ece22251dfbc5c9c6feeb4793cc509" + integrity sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ== dependencies: "@eslint-community/regexpp" "^4.4.0" - "@typescript-eslint/scope-manager" "5.59.2" - "@typescript-eslint/type-utils" "5.59.2" - "@typescript-eslint/utils" "5.59.2" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/type-utils" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" @@ -3525,130 +3606,130 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@5.59.2": - version "5.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.2.tgz#c2c443247901d95865b9f77332d9eee7c55655e8" - integrity sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ== +"@typescript-eslint/parser@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.59.8.tgz#60cbb00671d86cf746044ab797900b1448188567" + integrity sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw== dependencies: - "@typescript-eslint/scope-manager" "5.59.2" - "@typescript-eslint/types" "5.59.2" - "@typescript-eslint/typescript-estree" "5.59.2" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz#bb7676cb78f1e94921eaab637a4b5d596f838abc" - integrity sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw== +"@typescript-eslint/scope-manager@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz#0243f41f9066f3339d2f06d7f72d6c16a16769e2" + integrity sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ== dependencies: - "@typescript-eslint/types" "5.48.2" - "@typescript-eslint/visitor-keys" "5.48.2" + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/visitor-keys" "5.59.7" -"@typescript-eslint/scope-manager@5.59.2": - version "5.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz#f699fe936ee4e2c996d14f0fdd3a7da5ba7b9a4c" - integrity sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA== +"@typescript-eslint/scope-manager@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz#ff4ad4fec6433647b817c4a7d4b4165d18ea2fa8" + integrity sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig== dependencies: - "@typescript-eslint/types" "5.59.2" - "@typescript-eslint/visitor-keys" "5.59.2" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" -"@typescript-eslint/type-utils@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.48.2.tgz#7d3aeca9fa37a7ab7e3d9056a99b42f342c48ad7" - integrity sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew== +"@typescript-eslint/type-utils@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz#89c97291371b59eb18a68039857c829776f1426d" + integrity sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ== dependencies: - "@typescript-eslint/typescript-estree" "5.48.2" - "@typescript-eslint/utils" "5.48.2" + "@typescript-eslint/typescript-estree" "5.59.7" + "@typescript-eslint/utils" "5.59.7" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/type-utils@5.59.2": - version "5.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.2.tgz#0729c237503604cd9a7084b5af04c496c9a4cdcf" - integrity sha512-b1LS2phBOsEy/T381bxkkywfQXkV1dWda/z0PhnIy3bC5+rQWQDS7fk9CSpcXBccPY27Z6vBEuaPBCKCgYezyQ== +"@typescript-eslint/type-utils@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz#aa6c029a9d7706d26bbd25eb4666398781df6ea2" + integrity sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA== dependencies: - "@typescript-eslint/typescript-estree" "5.59.2" - "@typescript-eslint/utils" "5.59.2" + "@typescript-eslint/typescript-estree" "5.59.8" + "@typescript-eslint/utils" "5.59.8" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.48.2.tgz#635706abb1ec164137f92148f06f794438c97b8e" - integrity sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA== +"@typescript-eslint/types@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.7.tgz#6f4857203fceee91d0034ccc30512d2939000742" + integrity sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A== -"@typescript-eslint/types@5.59.2": - version "5.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.2.tgz#b511d2b9847fe277c5cb002a2318bd329ef4f655" - integrity sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w== +"@typescript-eslint/types@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.59.8.tgz#212e54414733618f5d0fd50b2da2717f630aebf8" + integrity sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w== -"@typescript-eslint/typescript-estree@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz#6e206b462942b32383582a6c9251c05021cc21b0" - integrity sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg== +"@typescript-eslint/typescript-estree@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz#b887acbd4b58e654829c94860dbff4ac55c5cff8" + integrity sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ== dependencies: - "@typescript-eslint/types" "5.48.2" - "@typescript-eslint/visitor-keys" "5.48.2" + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/visitor-keys" "5.59.7" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@5.59.2": - version "5.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz#6e2fabd3ba01db5d69df44e0b654c0b051fe9936" - integrity sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q== +"@typescript-eslint/typescript-estree@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz#801a7b1766481629481b3b0878148bd7a1f345d7" + integrity sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg== dependencies: - "@typescript-eslint/types" "5.59.2" - "@typescript-eslint/visitor-keys" "5.59.2" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/visitor-keys" "5.59.8" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.48.2.tgz#3777a91dcb22b8499a25519e06eef2e9569295a3" - integrity sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow== +"@typescript-eslint/utils@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.7.tgz#7adf068b136deae54abd9a66ba5a8780d2d0f898" + integrity sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ== dependencies: + "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.48.2" - "@typescript-eslint/types" "5.48.2" - "@typescript-eslint/typescript-estree" "5.48.2" + "@typescript-eslint/scope-manager" "5.59.7" + "@typescript-eslint/types" "5.59.7" + "@typescript-eslint/typescript-estree" "5.59.7" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/utils@5.59.2": - version "5.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.2.tgz#0c45178124d10cc986115885688db6abc37939f4" - integrity sha512-kSuF6/77TZzyGPhGO4uVp+f0SBoYxCDf+lW3GKhtKru/L8k/Hd7NFQxyWUeY7Z/KGB2C6Fe3yf2vVi4V9TsCSQ== +"@typescript-eslint/utils@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.59.8.tgz#34d129f35a2134c67fdaf024941e8f96050dca2b" + integrity sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.59.2" - "@typescript-eslint/types" "5.59.2" - "@typescript-eslint/typescript-estree" "5.59.2" + "@typescript-eslint/scope-manager" "5.59.8" + "@typescript-eslint/types" "5.59.8" + "@typescript-eslint/typescript-estree" "5.59.8" eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.48.2": - version "5.48.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz#c247582a0bcce467461d7b696513bf9455000060" - integrity sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ== +"@typescript-eslint/visitor-keys@5.59.7": + version "5.59.7" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz#09c36eaf268086b4fbb5eb9dc5199391b6485fc5" + integrity sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ== dependencies: - "@typescript-eslint/types" "5.48.2" + "@typescript-eslint/types" "5.59.7" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@5.59.2": - version "5.59.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz#37a419dc2723a3eacbf722512b86d6caf7d3b750" - integrity sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig== +"@typescript-eslint/visitor-keys@5.59.8": + version "5.59.8" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz#aa6a7ef862add919401470c09e1609392ef3cc40" + integrity sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ== dependencies: - "@typescript-eslint/types" "5.59.2" + "@typescript-eslint/types" "5.59.8" eslint-visitor-keys "^3.3.0" "@vitejs/plugin-basic-ssl@1.0.1": @@ -3913,11 +3994,26 @@ 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", "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== +"@yarnpkg/parsers@^3.0.0-rc.18": + version "3.0.0-rc.44" + resolved "https://registry.yarnpkg.com/@yarnpkg/parsers/-/parsers-3.0.0-rc.44.tgz#43bf7943c039681da8f343cc6d73c2ab3184978b" + integrity sha512-UVAt9Icc8zfGXioeYJ8XMoSTxOYVmlal2TRNxy9Uh91taS72kQFalK7LpIslcvEBKy4XtarmfIwcFIU3ZY64lw== + dependencies: + js-yaml "^3.10.0" + tslib "^2.4.0" + +"@zkochan/js-yaml@0.0.6": + version "0.0.6" + resolved "https://registry.yarnpkg.com/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" + integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== + dependencies: + argparse "^2.0.1" + 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" @@ -4419,6 +4515,15 @@ axios@0.21.4: dependencies: follow-redirects "^1.14.0" +axios@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axobject-query@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.1.1.tgz#3b6e5c6d4e43ca7ba51c5babf99d22a9c68485e1" @@ -4954,7 +5059,7 @@ ccount@^1.0.0, ccount@^1.0.3: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== -chalk@4.1.2, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -5121,13 +5226,18 @@ cli-boxes@^2.2.1: resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== -cli-cursor@^3.1.0: +cli-cursor@3.1.0, cli-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== dependencies: restore-cursor "^3.1.0" +cli-spinners@2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + cli-spinners@^2.5.0: version "2.9.0" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" @@ -6101,6 +6211,16 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" +dotenv@~10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +duplexer@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + duplexify@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-4.1.2.tgz#18b4f8d28289132fa0b9573c898d9f903f81c7b0" @@ -6142,9 +6262,6 @@ ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: version "1.0.11" @@ -6171,6 +6288,13 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== +ejs@^3.1.7: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + electron-to-chromium@^1.4.284: version "1.4.391" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.391.tgz#197994210792e29e39baf3ce807df42f66e9b5f8" @@ -6255,7 +6379,7 @@ enhanced-resolve@^5.10.0, enhanced-resolve@^5.13.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6: +enquirer@^2.3.6, enquirer@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -6542,7 +6666,7 @@ eslint-module-utils@^2.7.4: dependencies: debug "^3.2.7" -eslint-plugin-import@^2.23.4: +eslint-plugin-import@2.27.5: version "2.27.5" resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== @@ -6563,26 +6687,26 @@ eslint-plugin-import@^2.23.4: semver "^6.3.0" tsconfig-paths "^3.14.1" -eslint-plugin-jasmine@^4.1.2: +eslint-plugin-jasmine@4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/eslint-plugin-jasmine/-/eslint-plugin-jasmine-4.1.3.tgz#c4ced986a61dd5b180982bafe6da1cbac0941c52" integrity sha512-q8j8KnLH/4uwmPELFZvEyfEcuCuGxXScJaRdqHjOjz064GcfX6aoFbzy5VohZ5QYk2+WvoqMoqDSb9nRLf89GQ== -eslint-plugin-jsdoc@^41.0.0: - version "41.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-41.1.2.tgz#41d758a603aa59ae7bc34da88da2ca526466890e" - integrity sha512-MePJXdGiPW7AG06CU5GbKzYtKpoHwTq1lKijjq+RwL/cQkZtBZ59Zbv5Ep0RVxSMnq6242249/n+w4XrTZ1Afg== +eslint-plugin-jsdoc@45.0.0: + version "45.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-45.0.0.tgz#6be84e4842a7138cc571a907ea9c31c42eaac5c0" + integrity sha512-l2+Jcs/Ps7oFA+SWY+0sweU/e5LgricnEl6EsDlyRTF5y0+NWL1y9Qwz9PHwHAxtdJq6lxPjEQWmYLMkvhzD4g== dependencies: - "@es-joy/jsdoccomment" "~0.37.0" + "@es-joy/jsdoccomment" "~0.39.4" are-docs-informative "^0.0.2" comment-parser "1.3.1" debug "^4.3.4" escape-string-regexp "^4.0.0" esquery "^1.5.0" - semver "^7.3.8" + semver "^7.5.1" spdx-expression-parse "^3.0.1" -eslint-plugin-prefer-arrow@^1.2.3: +eslint-plugin-prefer-arrow@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/eslint-plugin-prefer-arrow/-/eslint-plugin-prefer-arrow-1.2.3.tgz#e7fbb3fa4cd84ff1015b9c51ad86550e55041041" integrity sha512-J9I5PKCOJretVuiZRGvPQxCbllxGAV/viI20JO3LYblAodofBxyMnZAJ+WGeClHgANnSJberTNoFWWjrWKBuXQ== @@ -6603,37 +6727,25 @@ eslint-scope@^7.0.0, eslint-scope@^7.2.0: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - eslint-visitor-keys@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz#c22c48f48942d08ca824cc526211ae400478a994" integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== -eslint@^8.0.0: - version "8.40.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.40.0.tgz#a564cd0099f38542c4e9a2f630fa45bf33bc42a4" - integrity sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ== +eslint@8.41.0: + version "8.41.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.41.0.tgz#3062ca73363b4714b16dbc1e60f035e6134b6f1c" + integrity sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.4.0" "@eslint/eslintrc" "^2.0.3" - "@eslint/js" "8.40.0" + "@eslint/js" "8.41.0" "@humanwhocodes/config-array" "^0.11.8" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" @@ -6653,13 +6765,12 @@ eslint@^8.0.0: find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" @@ -6902,6 +7013,17 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== +fast-glob@3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-glob@^3.2.11, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -6961,7 +7083,7 @@ fecha@^4.2.0: resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== -figures@^3.0.0: +figures@3.2.0, figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -6980,6 +7102,13 @@ file-uri-to-path@2: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + filesize@^6.1.0: version "6.4.0" resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" @@ -7135,6 +7264,11 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + flatted@^3.1.0, flatted@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" @@ -7145,7 +7279,7 @@ fn.name@1.x.x: resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== -follow-redirects@^1.0.0, follow-redirects@^1.14.0: +follow-redirects@^1.0.0, follow-redirects@^1.14.0, follow-redirects@^1.15.0: version "1.15.2" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== @@ -7234,7 +7368,7 @@ fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-extra@^11.0.0: +fs-extra@^11.0.0, fs-extra@^11.1.0: version "11.1.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== @@ -7500,6 +7634,18 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== +glob@7.1.4: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + 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" + glob@8.1.0, glob@^8.0.0, glob@^8.0.1: version "8.1.0" resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" @@ -7718,6 +7864,11 @@ grapheme-splitter@^1.0.4: resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + gtoken@^5.0.4: version "5.3.2" resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-5.3.2.tgz#deb7dc876abe002178e0515e383382ea9446d58f" @@ -8192,7 +8343,7 @@ ignore-walk@^6.0.0: dependencies: minimatch "^9.0.0" -ignore@^5.1.8, ignore@^5.2.0: +ignore@^5.0.4, ignore@^5.1.8, ignore@^5.2.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== @@ -8905,6 +9056,16 @@ jackspeak@^2.0.3: optionalDependencies: "@pkgjs/parseargs" "^0.11.0" +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.7.tgz#63a32821177940c33f356e0ba44ff9d34e1c7d8f" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + jasmine-core@^4.1.0, jasmine-core@^4.6.0, jasmine-core@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-4.6.0.tgz#6884fc3d5b66bf293e422751eed6d6da217c38f5" @@ -8985,17 +9146,19 @@ js-library-detector@^6.5.0: resolved "https://registry.yarnpkg.com/js-library-detector/-/js-library-detector-6.6.0.tgz#b531a4784f8242d87f68f6f3eafc771a0650fb9d" integrity sha512-z8OkDmXALZ22bIzBtIW8cpJ39MV93/Zu1rWrFdhsNw+sity2rOLaGT2kfWWQ6mnRTWs4ddONY5kiroA8e98Gvg== -js-sdsl@^4.1.4: - version "4.4.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.4.0.tgz#8b437dbe642daa95760400b602378ed8ffea8430" - integrity sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg== - 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.13.1: +js-yaml@4.1.0, js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.10.0, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -9003,13 +9166,6 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - js2xmlparser@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/js2xmlparser/-/js2xmlparser-4.0.2.tgz#2a1fdf01e90585ef2ae872a01bc169c6a8d5e60a" @@ -9507,6 +9663,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lines-and-columns@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" + integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== + linkify-it@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.3.tgz#a98baf44ce45a550efb4d49c769d07524cc2fa2e" @@ -10013,6 +10174,13 @@ minimalistic-assert@^1.0.0: resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== +minimatch@3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" + integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== + dependencies: + brace-expansion "^1.1.7" + minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -10278,7 +10446,7 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" -node-addon-api@^3.0.0: +node-addon-api@^3.0.0, node-addon-api@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== @@ -10309,7 +10477,7 @@ node-forge@^1, node-forge@^1.3.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== -node-gyp-build@^4.2.2: +node-gyp-build@^4.2.2, node-gyp-build@^4.3.0: version "4.6.0" resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== @@ -10484,6 +10652,56 @@ nwsapi@^2.2.4: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.4.tgz#fd59d5e904e8e1f03c25a7d5a15cfa16c714a1e5" integrity sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g== +nx@16.2.2: + version "16.2.2" + resolved "https://registry.yarnpkg.com/nx/-/nx-16.2.2.tgz#8792e4dcc6522daf7bccc52e6ffd65d7162264a6" + integrity sha512-gOcpqs6wf8YdFIq6P0IlMxBGr2c27pM55zpqO7epSlN6NqW6SOFKnZa+6z4NV9qmifMqzWPx2VF0BY54ARuqYg== + dependencies: + "@nrwl/tao" "16.2.2" + "@parcel/watcher" "2.0.4" + "@yarnpkg/lockfile" "^1.1.0" + "@yarnpkg/parsers" "^3.0.0-rc.18" + "@zkochan/js-yaml" "0.0.6" + axios "^1.0.0" + chalk "^4.1.0" + cli-cursor "3.1.0" + cli-spinners "2.6.1" + cliui "^7.0.2" + dotenv "~10.0.0" + enquirer "~2.3.6" + fast-glob "3.2.7" + figures "3.2.0" + flat "^5.0.2" + fs-extra "^11.1.0" + glob "7.1.4" + ignore "^5.0.4" + js-yaml "4.1.0" + jsonc-parser "3.2.0" + lines-and-columns "~2.0.3" + minimatch "3.0.5" + npm-run-path "^4.0.1" + open "^8.4.0" + semver "7.3.4" + string-width "^4.2.3" + strong-log-transformer "^2.1.0" + tar-stream "~2.2.0" + tmp "~0.2.1" + tsconfig-paths "^4.1.2" + tslib "^2.3.0" + v8-compile-cache "2.3.0" + yargs "^17.6.2" + yargs-parser "21.1.1" + optionalDependencies: + "@nx/nx-darwin-arm64" "16.2.2" + "@nx/nx-darwin-x64" "16.2.2" + "@nx/nx-linux-arm-gnueabihf" "16.2.2" + "@nx/nx-linux-arm64-gnu" "16.2.2" + "@nx/nx-linux-arm64-musl" "16.2.2" + "@nx/nx-linux-x64-gnu" "16.2.2" + "@nx/nx-linux-x64-musl" "16.2.2" + "@nx/nx-win32-arm64-msvc" "16.2.2" + "@nx/nx-win32-x64-msvc" "16.2.2" + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -12026,7 +12244,7 @@ safeps@7.0.1: taskgroup "^5.0.0" typechecker "^4.3.0" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, 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== @@ -12162,6 +12380,13 @@ semver@5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@7.3.4: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + semver@7.4.0: version "7.4.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.4.0.tgz#8481c92feffc531ab1e012a8ffc15bdd3a0f4318" @@ -12181,6 +12406,13 @@ semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.5, semver@^7.3.7, semve dependencies: lru-cache "^6.0.0" +semver@^7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" + semver@~7.3.0: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" @@ -12885,6 +13117,15 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== +strong-log-transformer@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" + integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== + dependencies: + duplexer "^0.1.1" + minimist "^1.2.0" + through "^2.3.4" + superstatic@^9.0.3: version "9.0.3" resolved "https://registry.yarnpkg.com/superstatic/-/superstatic-9.0.3.tgz#eb271841e971d9c3760f6d4b3adca5db00f29f18" @@ -12983,7 +13224,7 @@ tar-fs@2.1.1: pump "^3.0.0" tar-stream "^2.1.4" -tar-stream@^2.1.4, tar-stream@^2.2.0: +tar-stream@^2.1.4, tar-stream@^2.2.0, tar-stream@~2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== @@ -13099,7 +13340,7 @@ third-party-web@^0.17.1: resolved "https://registry.yarnpkg.com/third-party-web/-/third-party-web-0.17.1.tgz#22e03f1ff519a6380bae4594b704b9bb28e15158" integrity sha512-X9Mha8cVeBwakunlZXkXL6xRzw8VCcDGWqT59EzeTYAJIi8ien3CuufnEGEx4ZUFahumNQdoOwf4H2T9Ca6lBg== -through@^2.3.6, through@^2.3.8: +through@^2.3.4, through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -13131,7 +13372,7 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@^0.2.1: +tmp@^0.2.1, tmp@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== @@ -13251,6 +13492,15 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" +tsconfig-paths@^4.1.2: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + tsec@^0.2.2: version "0.2.7" resolved "https://registry.yarnpkg.com/tsec/-/tsec-0.2.7.tgz#be530025907037ed57f37fc7625b6a7e3658fe43" @@ -13269,7 +13519,12 @@ tslib@^1.13.0, tslib@^1.8.1, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslint@~6.1.3: +tslib@^2.4.0: + version "2.5.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.2.tgz#1b6f07185c881557b0ffa84b111a0106989e8338" + integrity sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA== + +tslint@6.1.3: version "6.1.3" resolved "https://registry.yarnpkg.com/tslint/-/tslint-6.1.3.tgz#5c23b2eccc32487d5523bd3a470e9aa31789d904" integrity sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg== @@ -13780,6 +14035,11 @@ v8-compile-cache-lib@^3.0.1: resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== +v8-compile-cache@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + v8-to-istanbul@^7.1.0: version "7.1.2" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" @@ -14496,7 +14756,7 @@ yargs@17.7.1: y18n "^5.0.5" yargs-parser "^21.1.1" -yargs@17.7.2, yargs@^17.0.0, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.7.2: +yargs@17.7.2, yargs@^17.0.0, yargs@^17.2.1, yargs@^17.3.1, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 9750f59fd4e20a3574fad4d12abc0dc3b5b40ae9 Mon Sep 17 00:00:00 2001 From: gdarnell <12160067+garrettld@users.noreply.github.com> Date: Tue, 30 May 2023 15:09:53 -0400 Subject: [PATCH 28/32] refactor(common): fix variable name (#50521) The PreloadLinkCreator instance was assigned to a variable named preloadLinkChecker, which is confusing because PreloadLinkChecker is also a thing. PR Close #50521 --- .../src/directives/ng_optimized_image/ng_optimized_image.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts index 6bace8857807..03c226fad0bd 100644 --- a/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts +++ b/packages/common/src/directives/ng_optimized_image/ng_optimized_image.ts @@ -229,7 +229,7 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { private imgElement: HTMLImageElement = inject(ElementRef).nativeElement; private injector = inject(Injector); private readonly isServer = isPlatformServer(inject(PLATFORM_ID)); - private readonly preloadLinkChecker = inject(PreloadLinkCreator); + private readonly preloadLinkCreator = inject(PreloadLinkCreator); // a LCP image observer - should be injected only in the dev mode private lcpObserver = ngDevMode ? this.injector.get(LCPImageObserver) : null; @@ -451,7 +451,7 @@ export class NgOptimizedImage implements OnInit, OnChanges, OnDestroy { } if (this.isServer && this.priority) { - this.preloadLinkChecker.createPreloadLinkTag( + this.preloadLinkCreator.createPreloadLinkTag( this.renderer, rewrittenSrc, rewrittenSrcset, this.sizes); } } From 8ce28dbafa6ba73bb6e3280cb905016a86e39abe Mon Sep 17 00:00:00 2001 From: Arno Chauveau Date: Tue, 30 May 2023 13:19:01 +0200 Subject: [PATCH 29/32] docs(router): correct references to guard services (#50514) PR Close #50514 --- aio/content/guide/router.md | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/aio/content/guide/router.md b/aio/content/guide/router.md index 26e4e89b7686..92d97bf95288 100644 --- a/aio/content/guide/router.md +++ b/aio/content/guide/router.md @@ -349,7 +349,7 @@ The following route guards are available in Angular: To use route guards, consider using [component-less routes](api/router/Route#componentless-routes) as this facilitates guarding child routes. -Create a service for your guard: +Create a file for your guard: @@ -357,28 +357,24 @@ ng generate guard your-guard -In your guard function, implement the guard you want to use. -The following example uses `canActivate` to guard the route. +In your guard file, add the guard functions you want to use. +The following example uses `canActivateFn` to guard the route. -export const yourGuard: CanActivateFn = ( +export const yourGuardFunction: CanActivateFn = ( next: ActivatedRouteSnapshot, state: RouterStateSnapshot) => { // your logic goes here } - - In your routing module, use the appropriate property in your `routes` configuration. Here, `canActivate` tells the router to mediate navigation to this particular route. - - { path: '/your-path', component: YourComponent, - canActivate: [yourGuard], + canActivate: [yourGuardFunction], } From 7e1bc513dead7d809f5ba2e6edc45b85af12f828 Mon Sep 17 00:00:00 2001 From: Alex Rickabaugh Date: Tue, 30 May 2023 12:45:05 -0700 Subject: [PATCH 30/32] fix(common): untrack subscription and unsubscription in async pipe (#50522) This commit wraps the actual subscription/unsubscription in the `async` pipe with `untracked`, to ensure that any signal reads/writes which might take place in `Observable` side effects are not attributed to the template. Fixes #50382 PR Close #50522 --- packages/common/src/pipes/async_pipe.ts | 16 ++++++++--- packages/common/test/pipes/async_pipe_spec.ts | 27 +++++++++++++++++-- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/packages/common/src/pipes/async_pipe.ts b/packages/common/src/pipes/async_pipe.ts index 31c21eb41677..6778b3ec5b94 100644 --- a/packages/common/src/pipes/async_pipe.ts +++ b/packages/common/src/pipes/async_pipe.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ChangeDetectorRef, EventEmitter, OnDestroy, Pipe, PipeTransform, ɵisPromise, ɵisSubscribable} from '@angular/core'; +import {ChangeDetectorRef, EventEmitter, OnDestroy, Pipe, PipeTransform, untracked, ɵisPromise, ɵisSubscribable} from '@angular/core'; import {Observable, Subscribable, Unsubscribable} from 'rxjs'; import {invalidPipeArgumentError} from './invalid_pipe_argument_error'; @@ -19,16 +19,24 @@ interface SubscriptionStrategy { class SubscribableStrategy implements SubscriptionStrategy { createSubscription(async: Subscribable, updateLatestValue: any): Unsubscribable { - return async.subscribe({ + // Subscription can be side-effectful, and we don't want any signal reads which happen in the + // side effect of the subscription to be tracked by a component's template when that + // subscription is triggered via the async pipe. So we wrap the subscription in `untracked` to + // decouple from the current reactive context. + // + // `untracked` also prevents signal _writes_ which happen in the subscription side effect from + // being treated as signal writes during the template evaluation (which throws errors). + return untracked(() => async.subscribe({ next: updateLatestValue, error: (e: any) => { throw e; } - }); + })); } dispose(subscription: Unsubscribable): void { - subscription.unsubscribe(); + // See the comment in `createSubscription` above on the use of `untracked`. + untracked(() => subscription.unsubscribe()); } } diff --git a/packages/common/test/pipes/async_pipe_spec.ts b/packages/common/test/pipes/async_pipe_spec.ts index 1266e9b5fdf5..f8e7415a03c0 100644 --- a/packages/common/test/pipes/async_pipe_spec.ts +++ b/packages/common/test/pipes/async_pipe_spec.ts @@ -7,9 +7,9 @@ */ import {AsyncPipe} from '@angular/common'; -import {ChangeDetectorRef, Component, EventEmitter} from '@angular/core'; +import {ChangeDetectorRef, Component, computed, EventEmitter, signal} from '@angular/core'; import {TestBed} from '@angular/core/testing'; -import {of, Subscribable, Unsubscribable} from 'rxjs'; +import {Observable, of, Subscribable, Unsubscribable} from 'rxjs'; { describe('AsyncPipe', () => { @@ -114,6 +114,29 @@ import {of, Subscribable, Unsubscribable} from 'rxjs'; expect(firstResult).toBeNaN(); expect(secondResult).toBeNaN(); }); + + it('should not track signal reads in subscriptions', () => { + const trigger = signal(false); + + const obs = new Observable(() => { + // Whenever `obs` is subscribed, synchronously read `trigger`. + trigger(); + }); + + let trackCount = 0; + const tracker = computed(() => { + // Subscribe to `obs` within this `computed`. If the subscription side effect runs + // within the computed, then changes to `trigger` will invalidate this computed. + pipe.transform(obs); + + // The computed returns how many times it's run. + return ++trackCount; + }); + + expect(tracker()).toBe(1); + trigger.set(true); + expect(tracker()).toBe(1); + }); }); describe('ngOnDestroy', () => { From 9e68a62512f5a76f0fc6a09fb1fd386d2306ee9a Mon Sep 17 00:00:00 2001 From: Julian Andres Gomez Gomez Date: Tue, 30 May 2023 09:40:36 -0500 Subject: [PATCH 31/32] docs: correct Signals documentation (#50518) Remove "only" word from "Reading without tracking dependencies" effect explanation PR Close #50518 --- aio/content/guide/signals.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aio/content/guide/signals.md b/aio/content/guide/signals.md index 7d4aa7a5a48a..afac47ca4bc7 100644 --- a/aio/content/guide/signals.md +++ b/aio/content/guide/signals.md @@ -223,7 +223,7 @@ effect(() => { }); ``` -This example logs a message when _either_ `currentUser` or `counter` changes. However, if the effect should only run only when `currentUser` changes, then the read of `counter` is only incidental and changes to `counter` shouldn't log a new message. +This example logs a message when _either_ `currentUser` or `counter` changes. However, if the effect should only run when `currentUser` changes, then the read of `counter` is only incidental and changes to `counter` shouldn't log a new message. You can prevent a signal read from being tracked by calling its getter with `untracked`: From bb05225dcd973647d41ad83790bd350ad53d3ca2 Mon Sep 17 00:00:00 2001 From: Dylan Hunn Date: Thu, 1 Jun 2023 08:25:22 -0700 Subject: [PATCH 32/32] release: cut the v16.0.4 release --- CHANGELOG.md | 17 +++++++++++++++++ package.json | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32d72ad6ffe8..ef3b4e939ce8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,20 @@ + +# 16.0.4 (2023-06-01) +### animations +| Commit | Type | Description | +| -- | -- | -- | +| [df65c4fc8f](https://github.com/angular/angular/commit/df65c4fc8f71ab9bf59ec4e5e820d136b12fb570) | fix | Trigger leave animation when ViewContainerRef is injected ([#48705](https://github.com/angular/angular/pull/48705)) | +### common +| Commit | Type | Description | +| -- | -- | -- | +| [7e1bc513de](https://github.com/angular/angular/commit/7e1bc513dead7d809f5ba2e6edc45b85af12f828) | fix | untrack subscription and unsubscription in async pipe ([#50522](https://github.com/angular/angular/pull/50522)) | +### core +| Commit | Type | Description | +| -- | -- | -- | +| [9970b29ace](https://github.com/angular/angular/commit/9970b29acef11f1dfedd2640520b4bca4b996f81) | fix | update `ApplicationRef.isStable` to account for rendering pending tasks ([#50425](https://github.com/angular/angular/pull/50425)) | + + + # 16.0.3 (2023-05-24) ### core diff --git a/package.json b/package.json index e9bfffaa71d0..62879035af16 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "angular-srcs", - "version": "16.0.3", + "version": "16.0.4", "private": true, "description": "Angular - a web framework for modern web apps", "homepage": "https://github.com/angular/angular",

OptionDescriptionOptionDescription Value Type Default Value