From 4eb5fafaa264ddfc3efdb6183cc46dca76720631 Mon Sep 17 00:00:00 2001 From: sisisin Date: Sat, 18 Jul 2020 11:38:46 +0900 Subject: [PATCH 1/4] feat: enable Epic#onMany with many args --- packages/typeless/__tests__/type/Epic.test.ts | 42 +++++++++++++++++++ packages/typeless/src/Epic.ts | 24 +---------- 2 files changed, 43 insertions(+), 23 deletions(-) create mode 100644 packages/typeless/__tests__/type/Epic.test.ts diff --git a/packages/typeless/__tests__/type/Epic.test.ts b/packages/typeless/__tests__/type/Epic.test.ts new file mode 100644 index 0000000..8e4ca61 --- /dev/null +++ b/packages/typeless/__tests__/type/Epic.test.ts @@ -0,0 +1,42 @@ +import { createModule, ActionMap } from '../../src/createModule'; +import { Epic } from '../../src/Epic'; +import { TT } from './TypeTester'; + +function createAction(acts: T) { + return createModule(Symbol('test')).withActions(acts)[1]; +} +TT.describe('onMany', () => { + const m1 = createAction({ foo: () => ({ payload: 1 }) }); + const m2 = createAction({ foo: () => ({ payload: true }) }); + const m3 = createAction({ foo: () => ({ payload: 'bar' }) }); + const m4 = createAction({ foo: () => ({ payload: Symbol('baz') }) }); + const m5 = createAction({ foo: () => ({ payload: { obj: 'foo' } }) }); + const m6 = createAction({ foo: () => ({ payload: ['array'] }) }); + + TT.describe('should error called with', () => { + TT.it('empty array', () => { + // @ts-expect-error + new Epic().onMany([], () => null); + }); + TT.it('has 1 item array', () => { + // @ts-expect-error + new Epic().onMany([m1.foo], () => null); + }); + }); + TT.describe("should infer callback's arguments", () => { + TT.it('called with many arguments', () => { + new Epic().onMany([m1.foo, m2.foo, m3.foo, m4.foo, m5.foo, m6.foo], p => { + type Expected = + | number + | boolean + | string + | symbol + | { obj: string } + | string[]; + TT.assert>(); + + return null; + }); + }); + }); +}); diff --git a/packages/typeless/src/Epic.ts b/packages/typeless/src/Epic.ts index 6d56a84..ff64e90 100644 --- a/packages/typeless/src/Epic.ts +++ b/packages/typeless/src/Epic.ts @@ -43,29 +43,7 @@ export class Epic { on(ac: TAC, handler: EpicHandler) { return this.add(ac, handler); } - onMany( - ac: [TAC, TAC2], - handler: EpicHandler - ): this; - onMany( - ac: [TAC, TAC2, TAC3], - handler: EpicHandler - ): this; - onMany( - ac: [TAC, TAC2, TAC3, TAC4], - handler: EpicHandler - ): this; - onMany< - TAC extends AC, - TAC2 extends AC, - TAC3 extends AC, - TAC4 extends AC, - TAC5 extends AC - >( - ac: [TAC, TAC2, TAC3, TAC4, TAC5], - handler: EpicHandler - ): this; - onMany(ac: AC[], handler: EpicHandler) { + onMany(ac: T, handler: EpicHandler) { return this.add(ac, handler); } From 340adeeaec5103a4ecc56edc36d3cffc0bcdbb05 Mon Sep 17 00:00:00 2001 From: sisisin Date: Sat, 18 Jul 2020 11:43:19 +0900 Subject: [PATCH 2/4] fix: avoid useMappedState called with empty array --- packages/typeless/__tests__/type/useMappedState.test.ts | 4 ++++ packages/typeless/src/types.ts | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/typeless/__tests__/type/useMappedState.test.ts b/packages/typeless/__tests__/type/useMappedState.test.ts index 76578e4..41a95a8 100644 --- a/packages/typeless/__tests__/type/useMappedState.test.ts +++ b/packages/typeless/__tests__/type/useMappedState.test.ts @@ -10,6 +10,10 @@ TT.describe('useMappedState', () => { const getCountState = createTestModule<{ count: number }>(); const getTextState = createTestModule<{ text: string }>(); + TT.it('should error with empty array', () => { + // @ts-expect-error + useMappedState([], () => null); + }); TT.it("should infer callback's arguments type", () => { useMappedState([getCountState, getTextState], (c, t) => { TT.assert>(); diff --git a/packages/typeless/src/types.ts b/packages/typeless/src/types.ts index fefd1c6..e1de918 100644 --- a/packages/typeless/src/types.ts +++ b/packages/typeless/src/types.ts @@ -31,6 +31,6 @@ export interface StateGetter { useState(): T; } -export type TupleOfStateGetter = [] | [StateGetter, ...StateGetter[]]; +export type TupleOfStateGetter = [StateGetter, ...StateGetter[]]; export type EqualityFn = (a: T, b: T) => boolean; From 4aef00049535aac4fe1a85afa1f3646c5a9c6e37 Mon Sep 17 00:00:00 2001 From: sisisin Date: Sat, 11 Jul 2020 19:20:42 +0900 Subject: [PATCH 3/4] bump typescript --- packages/typeless-form/package.json | 2 +- packages/typeless-router/package.json | 2 +- packages/typeless/package.json | 2 +- yarn.lock | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/typeless-form/package.json b/packages/typeless-form/package.json index 87c6f81..120aaf3 100644 --- a/packages/typeless-form/package.json +++ b/packages/typeless-form/package.json @@ -67,7 +67,7 @@ "rimraf": "^3.0.2", "rxjs": "^6.3.3", "tslint": "6.0.0", - "typescript": "3.8.2" + "typescript": "^3.9.6" }, "resolutions": { "@types/react": "^16.8.12" diff --git a/packages/typeless-router/package.json b/packages/typeless-router/package.json index 05be25c..3c2fc9f 100644 --- a/packages/typeless-router/package.json +++ b/packages/typeless-router/package.json @@ -67,7 +67,7 @@ "rimraf": "^3.0.2", "rxjs": "^6.3.3", "tslint": "6.0.0", - "typescript": "3.8.2" + "typescript": "^3.9.6" }, "resolutions": { "@types/react": "^16.8.12" diff --git a/packages/typeless/package.json b/packages/typeless/package.json index 88f7014..d6364dc 100644 --- a/packages/typeless/package.json +++ b/packages/typeless/package.json @@ -69,7 +69,7 @@ "shallow-equal": "^1.2.1", "ts-jest": "^25.5.0", "tslint": "6.0.0", - "typescript": "3.8.2" + "typescript": "^3.9.6" }, "peerDependencies": { "react": "^16.8.2", diff --git a/yarn.lock b/yarn.lock index 52f48de..b8e80f9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7570,10 +7570,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.2.tgz#91d6868aaead7da74f493c553aeff76c0c0b1d5a" - integrity sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ== +typescript@^3.9.6: + version "3.9.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.6.tgz#8f3e0198a34c3ae17091b35571d3afd31999365a" + integrity sha512-Pspx3oKAPJtjNwE92YS05HQoY7z2SFyOpHo9MqJor3BXAGNaPUs83CuVp9VISFkSjyRfiTpmKuAYGJB7S7hOxw== uglify-js@^3.1.4: version "3.8.0" From c9ba041093e02be11ab3351039c13d5d02ed15fd Mon Sep 17 00:00:00 2001 From: sisisin Date: Sat, 8 Aug 2020 16:45:13 +0900 Subject: [PATCH 4/4] test: cover test case of actions with different signatures --- packages/typeless/__tests__/type/Epic.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/typeless/__tests__/type/Epic.test.ts b/packages/typeless/__tests__/type/Epic.test.ts index 8e4ca61..edc33a3 100644 --- a/packages/typeless/__tests__/type/Epic.test.ts +++ b/packages/typeless/__tests__/type/Epic.test.ts @@ -6,11 +6,11 @@ function createAction(acts: T) { return createModule(Symbol('test')).withActions(acts)[1]; } TT.describe('onMany', () => { - const m1 = createAction({ foo: () => ({ payload: 1 }) }); - const m2 = createAction({ foo: () => ({ payload: true }) }); + const m1 = createAction({ foo: (num: number) => ({ payload: { num } }) }); + const m2 = createAction({ foo: (boo: boolean) => ({ payload: { boo } }) }); const m3 = createAction({ foo: () => ({ payload: 'bar' }) }); const m4 = createAction({ foo: () => ({ payload: Symbol('baz') }) }); - const m5 = createAction({ foo: () => ({ payload: { obj: 'foo' } }) }); + const m5 = createAction({ foo: (str: string) => ({ payload: { str } }) }); const m6 = createAction({ foo: () => ({ payload: ['array'] }) }); TT.describe('should error called with', () => { @@ -27,11 +27,11 @@ TT.describe('onMany', () => { TT.it('called with many arguments', () => { new Epic().onMany([m1.foo, m2.foo, m3.foo, m4.foo, m5.foo, m6.foo], p => { type Expected = - | number - | boolean + | { num: number } + | { boo: boolean } | string | symbol - | { obj: string } + | { str: string } | string[]; TT.assert>();