diff --git a/docs/PUBLIC_API.md b/docs/PUBLIC_API.md index e16def2178957..af1a99a983fa3 100644 --- a/docs/PUBLIC_API.md +++ b/docs/PUBLIC_API.md @@ -35,7 +35,7 @@ We explicitly don't consider the following to be our public API surface: - any class members or symbols marked as `private`, or prefixed with underscore (`_`), [barred latin o](https://en.wikipedia.org/wiki/%C6%9F) (`ɵ`), and double barred latin o (`ɵɵ`). - extending any of our classes unless the support for this is specifically documented in the API docs - the contents and API surface of the code generated by Angular's compiler (with one notable exception: the existence and name of `NgModuleFactory` instances exported from generated code is guaranteed) - +- the `@angular/core/primitives` package, including its child entrypoints Our peer dependencies (such as TypeScript, Zone.js, or RxJS) are not considered part of our API surface, but they are included in our SemVer policies. We might update the required version of any of these dependencies in minor releases if the update doesn't cause breaking changes for Angular applications. Peer dependency updates that result in non-trivial breaking changes must be deferred to major Angular releases. diff --git a/goldens/public-api/core/index.md b/goldens/public-api/core/index.md index 82a8a330f614c..30a077804b6fa 100644 --- a/goldens/public-api/core/index.md +++ b/goldens/public-api/core/index.md @@ -5,6 +5,7 @@ ```ts import { Observable } from 'rxjs'; +import { SIGNAL } from '@angular/core/primitives/signals'; import { Subject } from 'rxjs'; import { Subscription } from 'rxjs'; diff --git a/goldens/public-api/core/primitives/signals/index.md b/goldens/public-api/core/primitives/signals/index.md new file mode 100644 index 0000000000000..616410dd9c6ed --- /dev/null +++ b/goldens/public-api/core/primitives/signals/index.md @@ -0,0 +1,140 @@ +## API Report File for "@angular/core_primitives_signals" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +// @public +export function consumerAfterComputation(node: ReactiveNode | null, prevConsumer: ReactiveNode | null): void; + +// @public +export function consumerBeforeComputation(node: ReactiveNode | null): ReactiveNode | null; + +// @public +export function consumerDestroy(node: ReactiveNode): void; + +// @public +export function createComputed(computation: () => T): ComputedGetter; + +// @public +export function createSignal(initialValue: T): SignalGetter; + +// @public (undocumented) +export function createWatch(fn: (onCleanup: WatchCleanupRegisterFn) => void, schedule: (watch: Watch) => void, allowSignalWrites: boolean): Watch; + +// @public +export function defaultEquals(a: T, b: T): boolean; + +// @public (undocumented) +export function isInNotificationPhase(): boolean; + +// @public (undocumented) +export function isReactive(value: unknown): value is Reactive; + +// @public +export function producerAccessed(node: ReactiveNode): void; + +// @public +export function producerNotifyConsumers(node: ReactiveNode): void; + +// @public +export function producerUpdatesAllowed(): boolean; + +// @public +export function producerUpdateValueVersion(node: ReactiveNode): void; + +// @public (undocumented) +export interface Reactive { + // (undocumented) + [SIGNAL]: ReactiveNode; +} + +// @public (undocumented) +export const REACTIVE_NODE: ReactiveNode; + +// @public +export interface ReactiveNode { + consumerAllowSignalWrites: boolean; + // (undocumented) + readonly consumerIsAlwaysLive: boolean; + // (undocumented) + consumerMarkedDirty(node: unknown): void; + dirty: boolean; + liveConsumerIndexOfThis: number[] | undefined; + liveConsumerNode: ReactiveNode[] | undefined; + nextProducerIndex: number; + producerIndexOfThis: number[] | undefined; + producerLastReadVersion: Version[] | undefined; + producerMustRecompute(node: unknown): boolean; + producerNode: ReactiveNode[] | undefined; + // (undocumented) + producerRecomputeValue(node: unknown): void; + version: Version; +} + +// @public (undocumented) +export function setActiveConsumer(consumer: ReactiveNode | null): ReactiveNode | null; + +// @public (undocumented) +export function setAlternateWeakRefImpl(impl: unknown): void; + +// @public (undocumented) +export function setPostSignalSetFn(fn: (() => void) | null): (() => void) | null; + +// @public (undocumented) +export function setThrowInvalidWriteToSignalError(fn: () => never): void; + +// @public +export const SIGNAL: unique symbol; + +// @public (undocumented) +export type SignalGetter = (() => T) & { + [SIGNAL]: SignalNode; +}; + +// @public (undocumented) +export type SignalGetterOrNode = SignalGetter | SignalNode; + +// @public (undocumented) +export function signalMutateFn(this: SignalGetterOrNode, mutator: (value: T) => void): void; + +// @public (undocumented) +export interface SignalNode extends ReactiveNode { + // (undocumented) + [SIGNAL]: this; + // (undocumented) + equal: ValueEqualityFn; + // (undocumented) + value: T; +} + +// @public (undocumented) +export function signalSetFn(this: SignalGetterOrNode, newValue: T): void; + +// @public (undocumented) +export function signalUpdateFn(this: SignalGetterOrNode, updater: (value: T) => T): void; + +// @public +export type ValueEqualityFn = (a: T, b: T) => boolean; + +// @public (undocumented) +export interface Watch { + // (undocumented) + [SIGNAL]: WatchNode; + // (undocumented) + cleanup(): void; + destroy(): void; + // (undocumented) + notify(): void; + run(): void; +} + +// @public +export type WatchCleanupFn = () => void; + +// @public +export type WatchCleanupRegisterFn = (cleanupFn: WatchCleanupFn) => void; + +// (No @packageDocumentation comment for this package) + +``` diff --git a/packages.bzl b/packages.bzl index 652becf3dd8bb..3c8f41298b269 100644 --- a/packages.bzl +++ b/packages.bzl @@ -63,7 +63,6 @@ DOCS_ENTRYPOINTS = [ "core/src/di/interface", "core/src/interface", "core/src/reflection", - "core/src/signals", "core/src/util", "core/testing", "elements", diff --git a/packages/bazel/test/ng_package/core_package.spec.ts b/packages/bazel/test/ng_package/core_package.spec.ts index d76a309396a5e..f5bc4a58937f5 100644 --- a/packages/bazel/test/ng_package/core_package.spec.ts +++ b/packages/bazel/test/ng_package/core_package.spec.ts @@ -65,6 +65,12 @@ describe('@angular/core ng_package', () => { esm: './esm2022/core.mjs', default: './fesm2022/core.mjs' }, + './primitives/signals': { + types: './primitives/signals/index.d.ts', + esm2022: './esm2022/primitives/signals/index.mjs', + esm: './esm2022/primitives/signals/index.mjs', + default: './fesm2022/primitives/signals.mjs', + }, './rxjs-interop': { types: './rxjs-interop/index.d.ts', esm2022: './esm2022/rxjs-interop/rxjs-interop.mjs', diff --git a/packages/core/BUILD.bazel b/packages/core/BUILD.bazel index 6c68002254d2a..fc2d28e231ffe 100644 --- a/packages/core/BUILD.bazel +++ b/packages/core/BUILD.bazel @@ -29,11 +29,11 @@ ng_module( ), deps = [ "//packages:types", + "//packages/core/primitives/signals", "//packages/core/src/compiler", "//packages/core/src/di/interface", "//packages/core/src/interface", "//packages/core/src/reflection", - "//packages/core/src/signals", "//packages/core/src/util", "//packages/zone.js/lib:zone_d_ts", "@npm//rxjs", @@ -75,6 +75,7 @@ ng_package( ], deps = [ ":core", + "//packages/core/primitives/signals", "//packages/core/rxjs-interop", "//packages/core/testing", ], @@ -102,7 +103,6 @@ api_golden_test( "//packages/core/src/di/interface", "//packages/core/src/interface", "//packages/core/src/reflection", - "//packages/core/src/signals", "//packages/core/src/util", ], entry_point = "angular/packages/core/src/render3/global_utils_api.d.ts", @@ -126,7 +126,7 @@ filegroup( "src/**/*.ts", ]) + [ "PACKAGE.md", - "global/index.ts", "global/PACKAGE.md", + "global/index.ts", ], ) diff --git a/packages/core/src/signals/BUILD.bazel b/packages/core/primitives/signals/BUILD.bazel similarity index 90% rename from packages/core/src/signals/BUILD.bazel rename to packages/core/primitives/signals/BUILD.bazel index 7b8989109b24e..431698c01ecc8 100644 --- a/packages/core/src/signals/BUILD.bazel +++ b/packages/core/primitives/signals/BUILD.bazel @@ -14,9 +14,6 @@ ts_library( "**/*.ts", ], ), - deps = [ - "//packages/core/src/util", - ], ) tsec_test( diff --git a/packages/core/src/signals/README.md b/packages/core/primitives/signals/README.md similarity index 100% rename from packages/core/src/signals/README.md rename to packages/core/primitives/signals/README.md diff --git a/packages/core/src/signals/index.ts b/packages/core/primitives/signals/index.ts similarity index 100% rename from packages/core/src/signals/index.ts rename to packages/core/primitives/signals/index.ts diff --git a/packages/core/src/signals/src/computed.ts b/packages/core/primitives/signals/src/computed.ts similarity index 100% rename from packages/core/src/signals/src/computed.ts rename to packages/core/primitives/signals/src/computed.ts diff --git a/packages/core/src/signals/src/equality.ts b/packages/core/primitives/signals/src/equality.ts similarity index 100% rename from packages/core/src/signals/src/equality.ts rename to packages/core/primitives/signals/src/equality.ts diff --git a/packages/core/src/signals/src/errors.ts b/packages/core/primitives/signals/src/errors.ts similarity index 100% rename from packages/core/src/signals/src/errors.ts rename to packages/core/primitives/signals/src/errors.ts diff --git a/packages/core/src/signals/src/graph.ts b/packages/core/primitives/signals/src/graph.ts similarity index 99% rename from packages/core/src/signals/src/graph.ts rename to packages/core/primitives/signals/src/graph.ts index f8c81a2bceb28..de12b63dfdd2e 100644 --- a/packages/core/src/signals/src/graph.ts +++ b/packages/core/primitives/signals/src/graph.ts @@ -8,7 +8,7 @@ // Required as the signals library is in a separate package, so we need to explicitly ensure the // global `ngDevMode` type is defined. -import '../../util/ng_dev_mode'; +declare const ngDevMode: boolean|undefined; /** diff --git a/packages/core/src/signals/src/signal.ts b/packages/core/primitives/signals/src/signal.ts similarity index 100% rename from packages/core/src/signals/src/signal.ts rename to packages/core/primitives/signals/src/signal.ts diff --git a/packages/core/src/signals/src/watch.ts b/packages/core/primitives/signals/src/watch.ts similarity index 100% rename from packages/core/src/signals/src/watch.ts rename to packages/core/primitives/signals/src/watch.ts diff --git a/packages/core/src/signals/src/weak_ref.ts b/packages/core/primitives/signals/src/weak_ref.ts similarity index 100% rename from packages/core/src/signals/src/weak_ref.ts rename to packages/core/primitives/signals/src/weak_ref.ts diff --git a/packages/core/rxjs-interop/test/BUILD.bazel b/packages/core/rxjs-interop/test/BUILD.bazel index cd6fa0a56b08a..53ed5f7bf1f37 100644 --- a/packages/core/rxjs-interop/test/BUILD.bazel +++ b/packages/core/rxjs-interop/test/BUILD.bazel @@ -15,7 +15,6 @@ ts_library( "//packages:types", "//packages/core", "//packages/core/rxjs-interop", - "//packages/core/src/signals", "//packages/core/testing", "//packages/private/testing", "@npm//rxjs", diff --git a/packages/core/src/application_ref.ts b/packages/core/src/application_ref.ts index 8d99f841b868c..e151eb0aa6940 100644 --- a/packages/core/src/application_ref.ts +++ b/packages/core/src/application_ref.ts @@ -8,6 +8,7 @@ import './util/ng_jit_mode'; +import {setThrowInvalidWriteToSignalError} from '@angular/core/primitives/signals'; import {Observable, of, Subscription} from 'rxjs'; import {distinctUntilChanged, first, share, switchMap} from 'rxjs/operators'; @@ -42,7 +43,6 @@ import {setLocaleId} from './render3/i18n/i18n_locale_id'; import {setJitOptions} from './render3/jit/jit_options'; 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'; import {isPromise} from './util/lang'; import {stringify} from './util/stringify'; diff --git a/packages/core/src/core_private_export.ts b/packages/core/src/core_private_export.ts index 49ef2179a7618..290d86a744f54 100644 --- a/packages/core/src/core_private_export.ts +++ b/packages/core/src/core_private_export.ts @@ -6,6 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ +export {setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl} from '../primitives/signals'; export {ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS, internalCreateApplication as ɵinternalCreateApplication, whenStable as ɵwhenStable} from './application_ref'; export {ENABLED_SSR_FEATURES as ɵENABLED_SSR_FEATURES} from './application_tokens'; export {defaultIterableDiffers as ɵdefaultIterableDiffers, defaultKeyValueDiffers as ɵdefaultKeyValueDiffers} from './change_detection/change_detection'; @@ -33,7 +34,6 @@ export {DeferBlockBehavior as ɵDeferBlockBehavior, DeferBlockConfig as ɵDeferB export {allowSanitizationBypassAndThrow as ɵallowSanitizationBypassAndThrow, BypassType as ɵBypassType, getSanitizationBypassType as ɵgetSanitizationBypassType, SafeHtml as ɵSafeHtml, SafeResourceUrl as ɵSafeResourceUrl, SafeScript as ɵSafeScript, SafeStyle as ɵSafeStyle, SafeUrl as ɵSafeUrl, SafeValue as ɵSafeValue, unwrapSafeValue as ɵunwrapSafeValue} from './sanitization/bypass'; export {_sanitizeHtml as ɵ_sanitizeHtml} from './sanitization/html_sanitizer'; export {_sanitizeUrl as ɵ_sanitizeUrl} from './sanitization/url_sanitizer'; -export {setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl} from './signals'; export {TESTABILITY as ɵTESTABILITY, TESTABILITY_GETTER as ɵTESTABILITY_GETTER} from './testability/testability'; export {booleanAttribute, numberAttribute} from './util/coercion'; export {devModeEqual as ɵdevModeEqual} from './util/comparison'; diff --git a/packages/core/src/render3/hooks.ts b/packages/core/src/render3/hooks.ts index 3806fb66083ca..adaf25757ab47 100644 --- a/packages/core/src/render3/hooks.ts +++ b/packages/core/src/render3/hooks.ts @@ -6,8 +6,9 @@ * found in the LICENSE file at https://angular.io/license */ +import {setActiveConsumer} from '@angular/core/primitives/signals'; + import {AfterContentChecked, AfterContentInit, AfterViewChecked, AfterViewInit, DoCheck, OnChanges, OnDestroy, OnInit} from '../interface/lifecycle_hooks'; -import {setActiveConsumer} from '../signals'; import {assertDefined, assertEqual, assertNotEqual} from '../util/assert'; import {assertFirstCreatePass} from './assert'; diff --git a/packages/core/src/render3/instructions/shared.ts b/packages/core/src/render3/instructions/shared.ts index 169bac7934688..145ec6fd51425 100644 --- a/packages/core/src/render3/instructions/shared.ts +++ b/packages/core/src/render3/instructions/shared.ts @@ -6,6 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ +import {consumerAfterComputation, consumerBeforeComputation, setActiveConsumer} from '@angular/core/primitives/signals'; + import {Injector} from '../../di/injector'; import {ErrorHandler} from '../../error_handler'; import {RuntimeError, RuntimeErrorCode} from '../../errors'; @@ -18,7 +20,6 @@ import {Writable} from '../../interface/type'; import {SchemaMetadata} from '../../metadata/schema'; import {ViewEncapsulation} from '../../metadata/view'; import {validateAgainstEventAttributes, validateAgainstEventProperties} from '../../sanitization/sanitization'; -import {consumerAfterComputation, consumerBeforeComputation, setActiveConsumer} from '../../signals'; import {assertDefined, assertEqual, assertGreaterThan, assertGreaterThanOrEqual, assertIndexInRange, assertNotEqual, assertNotSame, assertSame, assertString} from '../../util/assert'; import {escapeCommentText} from '../../util/dom'; import {normalizeDebugBindingName, normalizeDebugBindingValue} from '../../util/ng_reflect'; diff --git a/packages/core/src/render3/node_manipulation.ts b/packages/core/src/render3/node_manipulation.ts index 4e536f4dab149..bcd35f06b72bd 100644 --- a/packages/core/src/render3/node_manipulation.ts +++ b/packages/core/src/render3/node_manipulation.ts @@ -6,10 +6,11 @@ * found in the LICENSE file at https://angular.io/license */ +import {consumerDestroy} from '@angular/core/primitives/signals'; + import {hasInSkipHydrationBlockFlag} from '../hydration/skip_hydration'; import {ViewEncapsulation} from '../metadata/view'; import {RendererStyleFlags2} from '../render/api_flags'; -import {consumerDestroy} from '../signals'; import {addToArray, removeFromArray} from '../util/array_utils'; import {assertDefined, assertEqual, assertFunction, assertNumber, assertString} from '../util/assert'; import {escapeCommentText} from '../util/dom'; diff --git a/packages/core/src/render3/reactive_lview_consumer.ts b/packages/core/src/render3/reactive_lview_consumer.ts index 84f8170848bca..1aac93f6f5263 100644 --- a/packages/core/src/render3/reactive_lview_consumer.ts +++ b/packages/core/src/render3/reactive_lview_consumer.ts @@ -6,7 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ -import {REACTIVE_NODE, ReactiveNode} from '../signals'; +import {REACTIVE_NODE, ReactiveNode} from '@angular/core/primitives/signals'; + import {assertDefined, assertEqual} from '../util/assert'; import {markViewDirty} from './instructions/mark_view_dirty'; diff --git a/packages/core/src/render3/reactivity/api.ts b/packages/core/src/render3/reactivity/api.ts index ff7b9f4d61059..ccf10c5c21be2 100644 --- a/packages/core/src/render3/reactivity/api.ts +++ b/packages/core/src/render3/reactivity/api.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {SIGNAL} from '../../signals'; +import {SIGNAL} from '@angular/core/primitives/signals'; /** * A reactive value which notifies consumers of any changes. diff --git a/packages/core/src/render3/reactivity/computed.ts b/packages/core/src/render3/reactivity/computed.ts index f49944d0f49e2..6cfe172fdb514 100644 --- a/packages/core/src/render3/reactivity/computed.ts +++ b/packages/core/src/render3/reactivity/computed.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {createComputed, SIGNAL} from '../../signals'; +import {createComputed, SIGNAL} from '@angular/core/primitives/signals'; import {Signal, ValueEqualityFn} from './api'; diff --git a/packages/core/src/render3/reactivity/effect.ts b/packages/core/src/render3/reactivity/effect.ts index c0028f2ef2f91..a8d7bd76e22a7 100644 --- a/packages/core/src/render3/reactivity/effect.ts +++ b/packages/core/src/render3/reactivity/effect.ts @@ -6,6 +6,8 @@ * found in the LICENSE file at https://angular.io/license */ +import {createWatch, Watch, WatchCleanupRegisterFn} from '@angular/core/primitives/signals'; + import {assertInInjectionContext} from '../../di/contextual'; import {InjectionToken} from '../../di/injection_token'; import {Injector} from '../../di/injector'; @@ -13,7 +15,6 @@ import {inject} from '../../di/injector_compatibility'; import {ɵɵdefineInjectable} from '../../di/interface/defs'; import {ErrorHandler} from '../../error_handler'; import {DestroyRef} from '../../linker/destroy_ref'; -import {createWatch, Watch, WatchCleanupRegisterFn} from '../../signals'; /** diff --git a/packages/core/src/render3/reactivity/signal.ts b/packages/core/src/render3/reactivity/signal.ts index 23d3c1d719cf1..2279a06625857 100644 --- a/packages/core/src/render3/reactivity/signal.ts +++ b/packages/core/src/render3/reactivity/signal.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {createSignal, SIGNAL, SignalGetter, signalMutateFn, SignalNode, signalSetFn, signalUpdateFn} from '../../signals'; +import {createSignal, SIGNAL, SignalGetter, signalMutateFn, SignalNode, signalSetFn, signalUpdateFn} from '@angular/core/primitives/signals'; import {Signal, ValueEqualityFn} from './api'; diff --git a/packages/core/src/render3/reactivity/untracked.ts b/packages/core/src/render3/reactivity/untracked.ts index cd52f01855c82..1fc27909b48fb 100644 --- a/packages/core/src/render3/reactivity/untracked.ts +++ b/packages/core/src/render3/reactivity/untracked.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {setActiveConsumer} from '../../signals'; +import {setActiveConsumer} from '@angular/core/primitives/signals'; /** * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function diff --git a/packages/core/test/acceptance/BUILD.bazel b/packages/core/test/acceptance/BUILD.bazel index a616ec8b51514..109fc1a760e8b 100644 --- a/packages/core/test/acceptance/BUILD.bazel +++ b/packages/core/test/acceptance/BUILD.bazel @@ -23,7 +23,6 @@ ts_library( "//packages/common/locales", "//packages/compiler", "//packages/core", - "//packages/core/src/signals", "//packages/core/src/util", "//packages/core/test/render3:matchers", "//packages/core/testing", diff --git a/packages/core/test/signals/BUILD.bazel b/packages/core/test/signals/BUILD.bazel index ffd5aea9f4e59..e878d7cf39dbf 100644 --- a/packages/core/test/signals/BUILD.bazel +++ b/packages/core/test/signals/BUILD.bazel @@ -10,7 +10,7 @@ ts_library( ), deps = [ "//packages/core", - "//packages/core/src/signals", + "//packages/core/primitives/signals", "//packages/core/src/util", ], ) diff --git a/packages/core/test/signals/computed_spec.ts b/packages/core/test/signals/computed_spec.ts index b5846b5e0387f..6d64c9c7f8099 100644 --- a/packages/core/test/signals/computed_spec.ts +++ b/packages/core/test/signals/computed_spec.ts @@ -7,7 +7,7 @@ */ import {computed, signal} from '@angular/core'; -import {createWatch} from '@angular/core/src/signals'; +import {createWatch} from '@angular/core/primitives/signals'; describe('computed', () => { it('should create computed', () => { diff --git a/packages/core/test/signals/effect_util.ts b/packages/core/test/signals/effect_util.ts index 4b17940b7b067..5412dbe5384dc 100644 --- a/packages/core/test/signals/effect_util.ts +++ b/packages/core/test/signals/effect_util.ts @@ -6,7 +6,7 @@ * found in the LICENSE file at https://angular.io/license */ -import {createWatch, Watch, WatchCleanupFn} from '@angular/core/src/signals'; +import {createWatch, Watch, WatchCleanupFn} from '@angular/core/primitives/signals'; let queue = new Set(); diff --git a/packages/core/test/signals/signal_spec.ts b/packages/core/test/signals/signal_spec.ts index e49d93a5b8737..98e4907b2b7f9 100644 --- a/packages/core/test/signals/signal_spec.ts +++ b/packages/core/test/signals/signal_spec.ts @@ -7,7 +7,7 @@ */ import {computed, signal} from '@angular/core'; -import {setPostSignalSetFn} from '@angular/core/src/signals'; +import {setPostSignalSetFn} from '@angular/core/primitives/signals'; describe('signals', () => { it('should be a getter which reflects the set value', () => { diff --git a/packages/core/test/signals/watch_spec.ts b/packages/core/test/signals/watch_spec.ts index cf9036eda39ad..7e119c7767ef8 100644 --- a/packages/core/test/signals/watch_spec.ts +++ b/packages/core/test/signals/watch_spec.ts @@ -7,7 +7,7 @@ */ import {computed, signal} from '@angular/core'; -import {createWatch} from '@angular/core/src/signals'; +import {createWatch} from '@angular/core/primitives/signals'; import {flushEffects, resetEffects, testingEffect} from './effect_util';