From e2de0242fd74d6fc8276ea17c5b9842eec5276cb Mon Sep 17 00:00:00 2001 From: Alexander Harding Date: Mon, 13 Apr 2026 23:09:47 -0600 Subject: [PATCH] Removed all top level module side effects. This allows users to set sideEffects to false in their package.json and still take full advantage of library logic. --- behavior-subject/deno.json | 2 +- behavior-subject/mod.ts | 8 +++++--- broadcast-subject/deno.json | 2 +- broadcast-subject/mod.ts | 8 +++++--- core/deno.json | 2 +- core/observable.ts | 8 +++++--- core/observer.ts | 8 +++++--- core/subject.ts | 8 +++++--- replay-subject/deno.json | 2 +- replay-subject/mod.ts | 8 +++++--- 10 files changed, 34 insertions(+), 22 deletions(-) diff --git a/behavior-subject/deno.json b/behavior-subject/deno.json index 98586fe..bca4e9a 100644 --- a/behavior-subject/deno.json +++ b/behavior-subject/deno.json @@ -1,6 +1,6 @@ { "name": "@observable/behavior-subject", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "exports": "./mod.ts", "publish": { "exclude": ["*.test.ts"] } diff --git a/behavior-subject/mod.ts b/behavior-subject/mod.ts index 4c9879a..21a3aa1 100644 --- a/behavior-subject/mod.ts +++ b/behavior-subject/mod.ts @@ -63,6 +63,11 @@ export interface BehaviorSubjectConstructor { const stringTag = "BehaviorSubject"; export const BehaviorSubject: BehaviorSubjectConstructor = class { + static { + Object.freeze(this); + Object.freeze(this.prototype); + } + readonly [Symbol.toStringTag] = stringTag; readonly #subject = new ReplaySubject(1); readonly signal = this.#subject.signal; @@ -104,6 +109,3 @@ export const BehaviorSubject: BehaviorSubjectConstructor = class { this.#subject.subscribe(observer); } }; - -Object.freeze(BehaviorSubject); -Object.freeze(BehaviorSubject.prototype); diff --git a/broadcast-subject/deno.json b/broadcast-subject/deno.json index 975c790..ec6140f 100644 --- a/broadcast-subject/deno.json +++ b/broadcast-subject/deno.json @@ -1,6 +1,6 @@ { "name": "@observable/broadcast-subject", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "exports": "./mod.ts", "publish": { "exclude": ["*.test.ts"] } diff --git a/broadcast-subject/mod.ts b/broadcast-subject/mod.ts index 57852bf..d04ebd5 100644 --- a/broadcast-subject/mod.ts +++ b/broadcast-subject/mod.ts @@ -98,6 +98,11 @@ const namespace = "394068c9-9d2c-45cb-81d2-a09197594a9d"; const stringTag = "BroadcastSubject"; export const BroadcastSubject: BroadcastSubjectConstructor = class { + static { + Object.freeze(this); + Object.freeze(this.prototype); + } + readonly [Symbol.toStringTag] = stringTag; readonly #subject = new Subject(); readonly signal = this.#subject.signal; @@ -148,6 +153,3 @@ export const BroadcastSubject: BroadcastSubjectConstructor = class { this.#subject.subscribe(observer); } }; - -Object.freeze(BroadcastSubject); -Object.freeze(BroadcastSubject.prototype); diff --git a/core/deno.json b/core/deno.json index bf490e1..477192b 100644 --- a/core/deno.json +++ b/core/deno.json @@ -1,6 +1,6 @@ { "name": "@observable/core", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "exports": "./mod.ts", "publish": { "exclude": ["*.test.ts"] } diff --git a/core/observable.ts b/core/observable.ts index cc645cf..8a24c04 100644 --- a/core/observable.ts +++ b/core/observable.ts @@ -122,6 +122,11 @@ export interface ObservableConstructor { const stringTag = "Observable"; export const Observable: ObservableConstructor = class { + static { + Object.freeze(this); + Object.freeze(this.prototype); + } + readonly [Symbol.toStringTag] = stringTag; readonly #subscribe: (observer: Observer) => void; @@ -159,9 +164,6 @@ export const Observable: ObservableConstructor = class { } }; -Object.freeze(Observable); -Object.freeze(Observable.prototype); - /** * Checks if a {@linkcode value} is an object that implements the {@linkcode Observable} interface. * @example diff --git a/core/observer.ts b/core/observer.ts index 0e09a41..48c0a1b 100644 --- a/core/observer.ts +++ b/core/observer.ts @@ -74,6 +74,11 @@ export interface ObserverConstructor { const stringTag = "Observer"; export const Observer: ObserverConstructor = class { + static { + Object.freeze(this); + Object.freeze(this.prototype); + } + readonly [Symbol.toStringTag] = stringTag; readonly #observer?: Partial> | null; readonly #controller = new AbortController(); @@ -155,9 +160,6 @@ export const Observer: ObserverConstructor = class { } }; -Object.freeze(Observer); -Object.freeze(Observer.prototype); - /** * Checks if a {@linkcode value} is an object that implements the {@linkcode Observer} interface. * @example diff --git a/core/subject.ts b/core/subject.ts index a4094e9..18dbe19 100644 --- a/core/subject.ts +++ b/core/subject.ts @@ -107,6 +107,11 @@ const notThrown = Symbol("Flag indicating that a value is not thrown."); const stringTag = "Subject"; export const Subject: SubjectConstructor = class { + static { + Object.freeze(this); + Object.freeze(this.prototype); + } + readonly [Symbol.toStringTag] = stringTag; /** * Tracking the value that was thrown by the [producer](https://jsr.io/@observable/core#producer), if any. @@ -205,9 +210,6 @@ export const Subject: SubjectConstructor = class { } }; -Object.freeze(Subject); -Object.freeze(Subject.prototype); - /** * Checks if a {@linkcode value} is an object that implements the {@linkcode Subject} interface. * @example diff --git a/replay-subject/deno.json b/replay-subject/deno.json index 6875b99..c1c92a4 100644 --- a/replay-subject/deno.json +++ b/replay-subject/deno.json @@ -1,6 +1,6 @@ { "name": "@observable/replay-subject", - "version": "0.15.0", + "version": "0.16.0", "license": "MIT", "exports": "./mod.ts", "publish": { "exclude": ["*.test.ts"] } diff --git a/replay-subject/mod.ts b/replay-subject/mod.ts index 1331277..36aefdb 100644 --- a/replay-subject/mod.ts +++ b/replay-subject/mod.ts @@ -358,6 +358,11 @@ export interface ReplaySubjectConstructor { const stringTag = "ReplaySubject"; export const ReplaySubject: ReplaySubjectConstructor = class { + static { + Object.freeze(this); + Object.freeze(this.prototype); + } + readonly [Symbol.toStringTag] = stringTag; readonly #count: number; /** @@ -421,6 +426,3 @@ export const ReplaySubject: ReplaySubjectConstructor = class { this.#observable.subscribe(observer); } }; - -Object.freeze(ReplaySubject); -Object.freeze(ReplaySubject.prototype);