diff --git a/goldens/circular-deps/packages.json b/goldens/circular-deps/packages.json index 5ed3cb5a827..c103b418d66 100644 --- a/goldens/circular-deps/packages.json +++ b/goldens/circular-deps/packages.json @@ -20,11 +20,6 @@ "packages/core/src/change_detection/change_detector_ref.ts", "packages/core/src/render3/view_ref.ts" ], - [ - "packages/core/src/change_detection/change_detector_ref.ts", - "packages/core/src/render3/view_ref.ts", - "packages/core/src/linker/view_ref.ts" - ], [ "packages/core/src/change_detection/differs/default_iterable_differ.ts", "packages/core/src/change_detection/differs/iterable_differs.ts" diff --git a/goldens/public-api/core/index.md b/goldens/public-api/core/index.md index a1bb9e3569c..e96a742a76f 100644 --- a/goldens/public-api/core/index.md +++ b/goldens/public-api/core/index.md @@ -322,6 +322,9 @@ export type ContentChild = Query; // @public export const ContentChild: ContentChildDecorator; +// @public +export const contentChild: ContentChildFunction; + // @public export interface ContentChildDecorator { (selector: ProviderToken | Function | string, opts?: { @@ -337,12 +340,44 @@ export interface ContentChildDecorator { }): ContentChild; } +// @public +export interface ContentChildFunction { + (locator: ProviderToken | string, opts?: { + descendants?: boolean; + }): Signal; + // (undocumented) + (locator: ProviderToken | string, opts: { + descendants?: boolean; + read: ProviderToken; + }): Signal; + required: { + (locator: ProviderToken | string, opts?: { + descendants?: boolean; + }): Signal; + (locator: ProviderToken | string, opts: { + descendants?: boolean; + read: ProviderToken; + }): Signal; + }; +} + // @public export type ContentChildren = Query; // @public export const ContentChildren: ContentChildrenDecorator; +// @public (undocumented) +export function contentChildren(locator: ProviderToken | string, opts?: { + descendants?: boolean; +}): Signal>; + +// @public (undocumented) +export function contentChildren(locator: ProviderToken | string, opts: { + descendants?: boolean; + read: ProviderToken; +}): Signal>; + // @public export interface ContentChildrenDecorator { (selector: ProviderToken | Function | string, opts?: { @@ -1598,6 +1633,9 @@ export type ViewChild = Query; // @public export const ViewChild: ViewChildDecorator; +// @public +export const viewChild: ViewChildFunction; + // @public export interface ViewChildDecorator { (selector: ProviderToken | Function | string, opts?: { @@ -1611,12 +1649,35 @@ export interface ViewChildDecorator { }): ViewChild; } +// @public +export interface ViewChildFunction { + (locator: ProviderToken | string): Signal; + // (undocumented) + (locator: ProviderToken | string, opts: { + read: ProviderToken; + }): Signal; + required: { + (locator: ProviderToken | string): Signal; + (locator: ProviderToken | string, opts: { + read: ProviderToken; + }): Signal; + }; +} + // @public export type ViewChildren = Query; // @public export const ViewChildren: ViewChildrenDecorator; +// @public (undocumented) +export function viewChildren(locator: ProviderToken | string): Signal>; + +// @public (undocumented) +export function viewChildren(locator: ProviderToken | string, opts: { + read: ProviderToken; +}): Signal>; + // @public export interface ViewChildrenDecorator { (selector: ProviderToken | Function | string, opts?: { diff --git a/packages/core/src/authoring.ts b/packages/core/src/authoring.ts index 9568d781838..2cd4a6c4e1a 100644 --- a/packages/core/src/authoring.ts +++ b/packages/core/src/authoring.ts @@ -13,3 +13,4 @@ export {InputFunction} from './authoring/input/input'; export {InputOptions, InputOptionsWithoutTransform, InputOptionsWithTransform, InputSignal, InputSignalWithTransform, ɵINPUT_SIGNAL_BRAND_WRITE_TYPE} from './authoring/input/input_signal'; export {ɵUnwrapDirectiveSignalInputs} from './authoring/input/input_type_checking'; export {output as ɵoutput, OutputEmitter as ɵOutputEmitter, OutputOptions as ɵOutputOptions} from './authoring/output'; +export {ContentChildFunction, ViewChildFunction} from './authoring/queries'; diff --git a/packages/core/src/authoring/queries.ts b/packages/core/src/authoring/queries.ts index 58c76351c4e..83724939e76 100644 --- a/packages/core/src/authoring/queries.ts +++ b/packages/core/src/authoring/queries.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {ProviderToken} from '../di'; +import {ProviderToken} from '../di/provider_token'; import {createMultiResultQuerySignalFn, createSingleResultOptionalQuerySignalFn, createSingleResultRequiredQuerySignalFn} from '../render3/query_reactive'; import {Signal} from '../render3/reactivity/api'; @@ -34,18 +34,6 @@ export interface ViewChildFunction { * Initializes a view child query. Consider using `viewChild.required` for queries that should * always match. * - * @usageNotes - * Create a child query in your component by declaring a - * class field and initializing it with the `viewChild()` function. - * - * ```ts - * @Component({template: '
'}) - * export class TestComponent { - * divEl = viewChild('el'); // Signal - * cmp = viewChild(MyComponent); // Signal - * } - * ``` - * * @developerPreview */ (locator: ProviderToken|string): Signal; @@ -55,18 +43,6 @@ export interface ViewChildFunction { /** * Initializes a view child query that is expected to always match an element. * - * @usageNotes - * Create a required child query in your component by declaring a - * class field and initializing it with the `viewChild()` function. - * - * ```ts - * @Component({template: '
'}) - * export class TestComponent { - * divElRequired = viewChild.required('el'); // Signal - * cmpRequired = viewChild.required(MyComponent); // Signal - * } - * ``` - * * @developerPreview */ required: { @@ -160,18 +136,6 @@ export interface ContentChildFunction { * Initializes a content child query. * * Consider using `contentChild.required` for queries that should always match. - * - * @usageNotes - * Create a child query in your component by declaring a - * class field and initializing it with the `contentChild()` function. - * - * ```ts - * @Component({...}) - * export class TestComponent { - * headerEl = contentChild('h'); // Signal - * header = contentChild(MyHeader); // Signal - * } - * ``` * @developerPreview */ (locator: ProviderToken|string, opts?: {descendants?: boolean}): @@ -183,17 +147,6 @@ export interface ContentChildFunction { /** * Initializes a content child query that is always expected to match. * - * @usageNotes - * Create a child query in your component by declaring a - * class field and initializing it with the `contentChild()` function. - * - * ```ts - * @Component({...}) - * export class TestComponent { - * headerElElRequired = contentChild.required('h'); // Signal - * headerRequired = contentChild.required(MyHeader); // Signal - * } - * ``` * @developerPreview */ required: { diff --git a/packages/core/src/core.ts b/packages/core/src/core.ts index 28a4180eb34..4a3462edca3 100644 --- a/packages/core/src/core.ts +++ b/packages/core/src/core.ts @@ -13,10 +13,11 @@ */ export * from './authoring'; -// Input is exported separately as this file is exempted from JSCompiler's -// conformance requirement for inferred const exports. -// See: https://docs.google.com/document/d/1RXb1wYwsbJotO1KBgSDsAtKpduGmIHod9ADxuXcAvV4/edit?tab=t.0 +// Input and query authoring functions are exported separately as this file is exempted from +// JSCompiler's conformance requirement for inferred const exports. See: +// https://docs.google.com/document/d/1RXb1wYwsbJotO1KBgSDsAtKpduGmIHod9ADxuXcAvV4/edit?tab=t.0 export {input} from './authoring/input/input'; +export {contentChild, contentChildren, viewChild, viewChildren} from './authoring/queries'; export * from './metadata'; export * from './version'; diff --git a/packages/core/src/render3/instructions/queries_signals.ts b/packages/core/src/render3/instructions/queries_signals.ts index 32e4b236cd5..92473528213 100644 --- a/packages/core/src/render3/instructions/queries_signals.ts +++ b/packages/core/src/render3/instructions/queries_signals.ts @@ -7,7 +7,7 @@ */ -import {ProviderToken} from '../../di'; +import {ProviderToken} from '../../di/provider_token'; import {QueryFlags} from '../interfaces/query'; import {createContentQuery, createViewQuery} from '../query'; import {bindQueryToSignal} from '../query_reactive'; diff --git a/packages/core/test/acceptance/authoring/signal_queries_spec.ts b/packages/core/test/acceptance/authoring/signal_queries_spec.ts index 511a7ac9e06..b820aef1aff 100644 --- a/packages/core/test/acceptance/authoring/signal_queries_spec.ts +++ b/packages/core/test/acceptance/authoring/signal_queries_spec.ts @@ -6,17 +6,12 @@ * found in the LICENSE file at https://angular.io/license */ -// TODO: update imports -import {Component, computed} from '@angular/core'; -import {viewChild} from '@angular/core/src/authoring/queries'; -import {getComponentDef} from '@angular/core/src/render3/definition'; +import {Component, computed, viewChild} from '@angular/core'; import {TestBed} from '@angular/core/testing'; describe('queries as signals', () => { describe('view', () => { - // TODO: Enable when `viewChild` is exposed publicly. Right now, compiler will - // not detect `viewChild` as it does not originate from a `@angular/core` import. - xit('view child', () => { + it('view child', () => { @Component({ selector: 'test-cmp', standalone: true, diff --git a/packages/core/test/acceptance/query_signal_spec.ts b/packages/core/test/acceptance/query_signal_spec.ts index ba078f85c8f..6bb5100d4b7 100644 --- a/packages/core/test/acceptance/query_signal_spec.ts +++ b/packages/core/test/acceptance/query_signal_spec.ts @@ -7,9 +7,7 @@ */ -import {Component, computed, ContentChild, ContentChildren, Directive, ElementRef, ViewChild, ViewChildren} from '@angular/core'; -// TODO: update imports to the exported authoring functions when those are public -import {contentChild, contentChildren, viewChild, viewChildren} from '@angular/core/src/authoring/queries'; +import {Component, computed, ContentChild, contentChild, ContentChildren, contentChildren, Directive, ElementRef, ViewChild, viewChild, ViewChildren, viewChildren} from '@angular/core'; import {TestBed} from '@angular/core/testing'; import {By} from '@angular/platform-browser'; 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 5c700f95c8e..e9b650aaa0e 100644 --- a/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations-standalone/bundle.golden_symbols.json @@ -240,7 +240,7 @@ "name": "GenericBrowserDomAdapter" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" diff --git a/packages/core/test/bundling/animations/bundle.golden_symbols.json b/packages/core/test/bundling/animations/bundle.golden_symbols.json index 11032f793e6..9ed95ad0228 100644 --- a/packages/core/test/bundling/animations/bundle.golden_symbols.json +++ b/packages/core/test/bundling/animations/bundle.golden_symbols.json @@ -264,7 +264,7 @@ "name": "GenericBrowserDomAdapter" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" 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 7a06e2561be..d8961260037 100644 --- a/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json +++ b/packages/core/test/bundling/cyclic_import/bundle.golden_symbols.json @@ -168,7 +168,7 @@ "name": "GenericBrowserDomAdapter" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" diff --git a/packages/core/test/bundling/defer/bundle.golden_symbols.json b/packages/core/test/bundling/defer/bundle.golden_symbols.json index 7f62da22b46..6bd1274d546 100644 --- a/packages/core/test/bundling/defer/bundle.golden_symbols.json +++ b/packages/core/test/bundling/defer/bundle.golden_symbols.json @@ -198,7 +198,7 @@ "name": "GenericBrowserDomAdapter" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" @@ -1709,6 +1709,9 @@ { "name": "init_queries" }, + { + "name": "init_queries2" + }, { "name": "init_queries_signals" }, 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 62c242dad84..3d78d474006 100644 --- a/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json +++ b/packages/core/test/bundling/forms_reactive/bundle.golden_symbols.json @@ -246,7 +246,7 @@ "name": "GenericBrowserDomAdapter" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" 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 6f8ae661ea9..a3e0622dac2 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 @@ -231,7 +231,7 @@ "name": "GenericBrowserDomAdapter" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" 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 4a18f874c4f..cf34a4e995c 100644 --- a/packages/core/test/bundling/hello_world/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hello_world/bundle.golden_symbols.json @@ -111,7 +111,7 @@ "name": "HelloWorldModule" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" diff --git a/packages/core/test/bundling/hydration/bundle.golden_symbols.json b/packages/core/test/bundling/hydration/bundle.golden_symbols.json index e79edf9c0c9..27576dd6512 100644 --- a/packages/core/test/bundling/hydration/bundle.golden_symbols.json +++ b/packages/core/test/bundling/hydration/bundle.golden_symbols.json @@ -195,7 +195,7 @@ "name": "HydrationFeatureKind" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" diff --git a/packages/core/test/bundling/injection/bundle.golden_symbols.json b/packages/core/test/bundling/injection/bundle.golden_symbols.json index 9b64279c935..f3e27347041 100644 --- a/packages/core/test/bundling/injection/bundle.golden_symbols.json +++ b/packages/core/test/bundling/injection/bundle.golden_symbols.json @@ -12,7 +12,7 @@ "name": "EnvironmentInjector" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" diff --git a/packages/core/test/bundling/router/bundle.golden_symbols.json b/packages/core/test/bundling/router/bundle.golden_symbols.json index a479f7f90e4..c8b2c1b4ff3 100644 --- a/packages/core/test/bundling/router/bundle.golden_symbols.json +++ b/packages/core/test/bundling/router/bundle.golden_symbols.json @@ -255,7 +255,7 @@ "name": "INITIAL_VALUE" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" 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 25822105429..fdc336b7106 100644 --- a/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json +++ b/packages/core/test/bundling/standalone_bootstrap/bundle.golden_symbols.json @@ -150,7 +150,7 @@ "name": "GenericBrowserDomAdapter" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES" diff --git a/packages/core/test/bundling/todo/bundle.golden_symbols.json b/packages/core/test/bundling/todo/bundle.golden_symbols.json index c796f3674f9..260b1826fee 100644 --- a/packages/core/test/bundling/todo/bundle.golden_symbols.json +++ b/packages/core/test/bundling/todo/bundle.golden_symbols.json @@ -171,7 +171,7 @@ "name": "GenericBrowserDomAdapter" }, { - "name": "INJECTOR2" + "name": "INJECTOR" }, { "name": "INJECTOR_DEF_TYPES"