-
-
Notifications
You must be signed in to change notification settings - Fork 140
feat: add observable naming, creation hook, and babel auto-naming transform #645
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,40 @@ | ||
| import type { NodeInfo, NodeListener } from './observableInterfaces'; | ||
|
|
||
| // Global observable creation tracking | ||
| type ObservableCreatedHandler = (node: NodeInfo) => void; | ||
| const creationHandlers = new Set<ObservableCreatedHandler>(); | ||
|
|
||
| /** | ||
| * Register a global handler that fires whenever an observable is created. | ||
| * Useful for devtools that need to auto-discover every observable. | ||
| * Returns an unsubscribe function. | ||
| * | ||
| */ | ||
| export function onObservableCreated(handler: ObservableCreatedHandler): () => void { | ||
| creationHandlers.add(handler); | ||
| return () => { | ||
| creationHandlers.delete(handler); | ||
| }; | ||
| } | ||
|
|
||
| /** | ||
| * Notify all registered creation handlers about a new observable. | ||
| * Called internally from createObservable. Skipped when no handlers exist. | ||
| * @internal | ||
| */ | ||
| export function notifyObservableCreated(node: NodeInfo): void { | ||
| if (creationHandlers.size === 0) { | ||
| return; | ||
| } | ||
| for (const handler of creationHandlers) { | ||
| try { | ||
| handler(node); | ||
| } catch (error) { | ||
| console.error('Error in onObservableCreated handler:', error); | ||
| } | ||
| } | ||
|
Comment on lines
+29
to
+35
|
||
| } | ||
|
|
||
| // Types for middleware events and handlers | ||
| export type MiddlewareEventType = 'listener-added' | 'listener-removed' | 'listeners-cleared'; | ||
|
|
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,19 +1,21 @@ | ||
| import { extractPromise, getProxy } from './ObservableObject'; | ||
| import { ObservablePrimitiveClass } from './ObservablePrimitive'; | ||
| import { createObservable } from './createObservable'; | ||
| import type { ObservableOptions } from './observableInterfaces'; | ||
| import type { Observable, ObservablePrimitive, RecursiveValueOrFunction } from './observableTypes'; | ||
|
|
||
| export function observable<T>(): Observable<T | undefined>; | ||
| export function observable<T>( | ||
| value: Promise<RecursiveValueOrFunction<T>> | (() => RecursiveValueOrFunction<T>) | RecursiveValueOrFunction<T>, | ||
| options?: ObservableOptions, | ||
| ): Observable<T>; | ||
| export function observable<T>(value: T): Observable<T>; | ||
| export function observable<T>(value?: T): Observable<any> { | ||
| return createObservable(value, false, extractPromise, getProxy, ObservablePrimitiveClass) as any; | ||
| export function observable<T>(value: T, options?: ObservableOptions): Observable<T>; | ||
| export function observable<T>(value?: T, options?: ObservableOptions): Observable<any> { | ||
| return createObservable(value, false, extractPromise, getProxy, ObservablePrimitiveClass, options) as any; | ||
| } | ||
|
|
||
| export function observablePrimitive<T>(value: Promise<T>): ObservablePrimitive<T>; | ||
| export function observablePrimitive<T>(value?: T): ObservablePrimitive<T>; | ||
| export function observablePrimitive<T>(value?: T | Promise<T>): ObservablePrimitive<T> { | ||
| return createObservable(value, true, extractPromise, getProxy, ObservablePrimitiveClass) as any; | ||
| export function observablePrimitive<T>(value: Promise<T>, options?: ObservableOptions): ObservablePrimitive<T>; | ||
| export function observablePrimitive<T>(value?: T, options?: ObservableOptions): ObservablePrimitive<T>; | ||
| export function observablePrimitive<T>(value?: T | Promise<T>, options?: ObservableOptions): ObservablePrimitive<T> { | ||
| return createObservable(value, true, extractPromise, getProxy, ObservablePrimitiveClass, options) as any; | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For the zero-arg call case, the transform injects an Identifier named
undefined. Sinceundefinedcan be shadowed by a local binding, this can change runtime semantics in some files. Prefer generating an unshadowable undefined value (e.g.,void 0) instead ofidentifier('undefined').