From 25e859a3582bcdd3c5a71aa52510adfd924a1a60 Mon Sep 17 00:00:00 2001 From: Gorbachev Egor <7gorbachevm@gmail.com> Date: Thu, 7 May 2026 15:20:02 +0700 Subject: [PATCH 1/3] Support flow() as decorator 2022.3 --- .changeset/fresh-flow-decorators.md | 5 ++ .../decorators_20223/stage3-decorators.ts | 56 +++++++++++++++++++ packages/mobx/src/api/flow.ts | 8 ++- 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 .changeset/fresh-flow-decorators.md diff --git a/.changeset/fresh-flow-decorators.md b/.changeset/fresh-flow-decorators.md new file mode 100644 index 000000000..28be557ba --- /dev/null +++ b/.changeset/fresh-flow-decorators.md @@ -0,0 +1,5 @@ +--- +"mobx": patch +--- + +Fix TypeScript errors when using `flow` as a standard decorator. diff --git a/packages/mobx/__tests__/decorators_20223/stage3-decorators.ts b/packages/mobx/__tests__/decorators_20223/stage3-decorators.ts index 7b788ca68..db1eb120b 100644 --- a/packages/mobx/__tests__/decorators_20223/stage3-decorators.ts +++ b/packages/mobx/__tests__/decorators_20223/stage3-decorators.ts @@ -1052,6 +1052,62 @@ test("it should support asyncAction as decorator (2022.3)", async () => { expect(await x.f(3)).toBe(16) }) +test("it should support flow as decorator (2022.3)", async () => { + class DecoratorInferred { + @mobx.flow + *f() { + return true + } + } + + class DecoratorExplicit { + @mobx.flow + *f(): Generator { + return true + } + } + + class AutoObservable { + constructor() { + mobx.makeAutoObservable(this) + } + + *f() { + return true + } + } + + class ExplicitObservable { + constructor() { + mobx.makeObservable(this, { + f: mobx.flow + }) + } + + *f() { + return true + } + } + + class FlowField { + f = mobx.flow(function* () { + return true + }) + } + + const decoratorInferredResult: boolean = await mobx.flowResult(new DecoratorInferred().f()) + const decoratorExplicitResult: boolean = await mobx.flowResult(new DecoratorExplicit().f()) + const autoObservableResult: boolean = await mobx.flowResult(new AutoObservable().f()) + const explicitObservableResult: boolean = await mobx.flowResult(new ExplicitObservable().f()) + const flowFieldResult: boolean = await new FlowField().f() + + expect(decoratorInferredResult).toBe(true) + expect(decoratorExplicitResult).toBe(true) + expect(autoObservableResult).toBe(true) + expect(explicitObservableResult).toBe(true) + expect(flowFieldResult).toBe(true) +}) + test("toJS bug #1413 (2022.3)", () => { class X { @observable diff --git a/packages/mobx/src/api/flow.ts b/packages/mobx/src/api/flow.ts index 43b00715c..cb8d819b8 100644 --- a/packages/mobx/src/api/flow.ts +++ b/packages/mobx/src/api/flow.ts @@ -35,7 +35,13 @@ export function isFlowCancellationError(error: Error) { export type CancellablePromise = Promise & { cancel(): void } -interface Flow extends Annotation, PropertyDecorator, ClassMethodDecorator { +type FlowGenerator = (...args: any[]) => Generator | AsyncGenerator + +interface Flow extends Annotation, PropertyDecorator { + ( + value: Value, + context: ClassMethodDecoratorContext + ): Value | void ( generator: (...args: Args) => Generator | AsyncGenerator ): (...args: Args) => CancellablePromise From fe659f40f5f64fbcea4ca0db70ac329042a51a5c Mon Sep 17 00:00:00 2001 From: Gorbachev Egor <7gorbachevm@gmail.com> Date: Thu, 7 May 2026 15:58:18 +0700 Subject: [PATCH 2/3] comment about legacy decorators --- packages/mobx/src/api/flow.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/mobx/src/api/flow.ts b/packages/mobx/src/api/flow.ts index cb8d819b8..9a635858d 100644 --- a/packages/mobx/src/api/flow.ts +++ b/packages/mobx/src/api/flow.ts @@ -37,6 +37,7 @@ export type CancellablePromise = Promise & { cancel(): void } type FlowGenerator = (...args: any[]) => Generator | AsyncGenerator +// PropertyDecorator is only for legacy decorators interface Flow extends Annotation, PropertyDecorator { ( value: Value, From 81d00b7db6fa9c3f433ba83998a29704e32f1deb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 09:06:14 +0000 Subject: [PATCH 3/3] Version Packages --- .changeset/fresh-flow-decorators.md | 5 ----- packages/mobx/CHANGELOG.md | 6 ++++++ packages/mobx/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/fresh-flow-decorators.md diff --git a/.changeset/fresh-flow-decorators.md b/.changeset/fresh-flow-decorators.md deleted file mode 100644 index 28be557ba..000000000 --- a/.changeset/fresh-flow-decorators.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"mobx": patch ---- - -Fix TypeScript errors when using `flow` as a standard decorator. diff --git a/packages/mobx/CHANGELOG.md b/packages/mobx/CHANGELOG.md index be5778622..d39a31053 100644 --- a/packages/mobx/CHANGELOG.md +++ b/packages/mobx/CHANGELOG.md @@ -1,5 +1,11 @@ # mobx +## 6.15.3 + +### Patch Changes + +- [`25e859a3582bcdd3c5a71aa52510adfd924a1a60`](https://github.com/mobxjs/mobx/commit/25e859a3582bcdd3c5a71aa52510adfd924a1a60) [#4644](https://github.com/mobxjs/mobx/pull/4644) Thanks [@kubk](https://github.com/kubk)! - Fix TypeScript errors when using `flow` as a standard decorator. + ## 6.15.2 ### Patch Changes diff --git a/packages/mobx/package.json b/packages/mobx/package.json index d4d606b80..0821cb65f 100644 --- a/packages/mobx/package.json +++ b/packages/mobx/package.json @@ -1,6 +1,6 @@ { "name": "mobx", - "version": "6.15.2", + "version": "6.15.3", "description": "Simple, scalable state management.", "source": "src/mobx.ts", "main": "dist/index.js",