From 9dd6d9103a9e9031edd0771ec7579c77a4401199 Mon Sep 17 00:00:00 2001 From: Tigran Kirakosov Date: Wed, 12 Oct 2022 14:29:38 +0300 Subject: [PATCH 1/7] Attempt to provide some types --- src/multipleObserver.js | 10 +++++ src/observable.js | 5 +++ src/observer.js | 6 +++ src/types.js | 86 +++++++++++++++++++++++++++++++++++++++++ src/useStore.js | 5 +++ 5 files changed, 112 insertions(+) create mode 100644 src/types.js diff --git a/src/multipleObserver.js b/src/multipleObserver.js index 4d9475b..4a4cb17 100644 --- a/src/multipleObserver.js +++ b/src/multipleObserver.js @@ -1,6 +1,16 @@ import React from "react" +import { MultipleObserver, StoreConfig } from "./types" + +/** + * @template T1, T2, T3, T4, T5 + * @type {MultipleObserver} + */ const multipleObserver = stores => WrappedComponent => { + /** + * @template T1, T2, T3, T4, T5 + * @param {StoreConfig[]} stores + */ const reduceStates = stores => { return stores.reduce((acc, { key, store }) => ({ ...acc, [key]: { ...store.getState() } }), {}) } diff --git a/src/observable.js b/src/observable.js index f654d6a..e3208e5 100644 --- a/src/observable.js +++ b/src/observable.js @@ -1,5 +1,10 @@ import observer from "./observer" +import { Observable } from "./types" +/** + * @template T + * @type {Observable { let store = { ...initial } diff --git a/src/observer.js b/src/observer.js index 4fdefc7..4f28d50 100644 --- a/src/observer.js +++ b/src/observer.js @@ -1,5 +1,11 @@ import React from "react" +import { Observer } from "./types" + +/** + * @template T + * @type {Observer} + */ const observer = (store, { key, map }) => WrappedComponent => { return class extends React.Component { static displayName = `${key} State Observer` diff --git a/src/types.js b/src/types.js new file mode 100644 index 0000000..e94ee1c --- /dev/null +++ b/src/types.js @@ -0,0 +1,86 @@ +/** + * @template T + * @typedef {object} Store + * @property {function(): T} getState + * @property {function(Partial): void} set + * @property {function(ObserverOptions): Observer} observer + * @property {function(SubscribeFn): UnsubscribeFn} subscribe + * @property {function(): void} reset + */ + +/** + * @template T + * @callback Observer + * @param {Store} store + * @param {ObserverOptions} options + * @returns {ComponentWrapper} + */ + +/** + * @template T1, T2, T3, T4, T5 + * @callback MultipleObserver + * @param {Array>} configs + * @returns {ComponentWrapper} + */ + +/** + * @template T1, T2, T3, T4, T5 + * @typedef StoreConfig + * @property {Store} store + * @property {string} key + */ + +/** + * @template T + * @typedef {object} ObserverOptions + * @property {string} key + * @property {MapFn} map + */ + +/** + * @callback ComponentWrapper + * @param {React.Component | React.PureComponent | React.FC} component + * @returns {React.Component} + */ + +/** + * @template T + * @callback Observable + * @param {T} initial + * @returns {Store} + */ + +/** + * @template T + * @callback StoreReactHook + * @param {Store} store + * @param {StoreReactHookOptions} options + * @returns {T | any} + */ + +/** + * @template T + * @typedef {object} StoreReactHookOptions + * @property {MapFn} map + */ + +/** + * @callback UnsubscribeFn + * @returns {void} + */ + +/** + * @template T + * @callback SubscribeFn + * @param {T} + * @returns {void} + */ + +/** + * @template T + * @callback MapFn + * @param {T} + * @returns {any} + */ + +export {} diff --git a/src/useStore.js b/src/useStore.js index 35bb5fb..38307a6 100644 --- a/src/useStore.js +++ b/src/useStore.js @@ -1,5 +1,10 @@ import { useState, useEffect } from "react" +import { StoreReactHook } from "./types" +/** + * @template T + * @type {StoreReactHook} + */ const useStore = (store, { map } = {}) => { const [state, setState] = useState(store.getState()) From 3bfb2e89f1a9f198a1f9eaff6bcdcdfeff049697 Mon Sep 17 00:00:00 2001 From: Tigran Kirakosov Date: Wed, 12 Oct 2022 14:43:24 +0300 Subject: [PATCH 2/7] Fix lint --- src/multipleObserver.js | 1 + src/observable.js | 2 ++ src/observer.js | 1 + src/types.js | 2 +- src/useStore.js | 2 ++ 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/multipleObserver.js b/src/multipleObserver.js index 4a4cb17..47ee071 100644 --- a/src/multipleObserver.js +++ b/src/multipleObserver.js @@ -1,5 +1,6 @@ import React from "react" +// eslint-disable-next-line no-unused-vars import { MultipleObserver, StoreConfig } from "./types" /** diff --git a/src/observable.js b/src/observable.js index e3208e5..a7f1368 100644 --- a/src/observable.js +++ b/src/observable.js @@ -1,4 +1,6 @@ import observer from "./observer" + +// eslint-disable-next-line no-unused-vars import { Observable } from "./types" /** diff --git a/src/observer.js b/src/observer.js index 4f28d50..c55654b 100644 --- a/src/observer.js +++ b/src/observer.js @@ -1,5 +1,6 @@ import React from "react" +// eslint-disable-next-line no-unused-vars import { Observer } from "./types" /** diff --git a/src/types.js b/src/types.js index e94ee1c..748fc39 100644 --- a/src/types.js +++ b/src/types.js @@ -11,7 +11,7 @@ /** * @template T * @callback Observer - * @param {Store} store + * @param {Store} store * @param {ObserverOptions} options * @returns {ComponentWrapper} */ diff --git a/src/useStore.js b/src/useStore.js index 38307a6..10d13d2 100644 --- a/src/useStore.js +++ b/src/useStore.js @@ -1,4 +1,6 @@ import { useState, useEffect } from "react" + +// eslint-disable-next-line no-unused-vars import { StoreReactHook } from "./types" /** From 3be8e5b10656b621f0fc26cc48976f683b0bce1b Mon Sep 17 00:00:00 2001 From: Tigran Kirakosov Date: Wed, 12 Oct 2022 19:36:32 +0300 Subject: [PATCH 3/7] Fix type infer --- src/multipleObserver.js | 10 +++------- src/observable.js | 5 +++-- src/observer.js | 6 ++++-- src/types.js | 37 ++++--------------------------------- src/useStore.js | 6 ++++-- 5 files changed, 18 insertions(+), 46 deletions(-) diff --git a/src/multipleObserver.js b/src/multipleObserver.js index 47ee071..66751b8 100644 --- a/src/multipleObserver.js +++ b/src/multipleObserver.js @@ -1,17 +1,13 @@ import React from "react" // eslint-disable-next-line no-unused-vars -import { MultipleObserver, StoreConfig } from "./types" +import { ComponentWrapper, StoreConfig } from "./types" /** - * @template T1, T2, T3, T4, T5 - * @type {MultipleObserver} + * @param {StoreConfig[]} stores + * @returns {ComponentWrapper} */ const multipleObserver = stores => WrappedComponent => { - /** - * @template T1, T2, T3, T4, T5 - * @param {StoreConfig[]} stores - */ const reduceStates = stores => { return stores.reduce((acc, { key, store }) => ({ ...acc, [key]: { ...store.getState() } }), {}) } diff --git a/src/observable.js b/src/observable.js index a7f1368..8d66ffc 100644 --- a/src/observable.js +++ b/src/observable.js @@ -1,11 +1,12 @@ import observer from "./observer" // eslint-disable-next-line no-unused-vars -import { Observable } from "./types" +import { Store } from "./types" /** * @template T - * @type {Observable} */ const observable = initial => { let store = { ...initial } diff --git a/src/observer.js b/src/observer.js index c55654b..c434b6b 100644 --- a/src/observer.js +++ b/src/observer.js @@ -1,11 +1,13 @@ import React from "react" // eslint-disable-next-line no-unused-vars -import { Observer } from "./types" +import { Store, ObserverOptions, ComponentWrapper } from "./types" /** * @template T - * @type {Observer} + * @param {Store} store + * @param {ObserverOptions} options + * @returns {ComponentWrapper} */ const observer = (store, { key, map }) => WrappedComponent => { return class extends React.Component { diff --git a/src/types.js b/src/types.js index 748fc39..8ef4402 100644 --- a/src/types.js +++ b/src/types.js @@ -10,23 +10,8 @@ /** * @template T - * @callback Observer - * @param {Store} store - * @param {ObserverOptions} options - * @returns {ComponentWrapper} - */ - -/** - * @template T1, T2, T3, T4, T5 - * @callback MultipleObserver - * @param {Array>} configs - * @returns {ComponentWrapper} - */ - -/** - * @template T1, T2, T3, T4, T5 * @typedef StoreConfig - * @property {Store} store + * @property {Store} store * @property {string} key */ @@ -37,25 +22,11 @@ * @property {MapFn} map */ -/** - * @callback ComponentWrapper - * @param {React.Component | React.PureComponent | React.FC} component - * @returns {React.Component} - */ - /** * @template T - * @callback Observable - * @param {T} initial - * @returns {Store} - */ - -/** - * @template T - * @callback StoreReactHook - * @param {Store} store - * @param {StoreReactHookOptions} options - * @returns {T | any} + * @callback ComponentWrapper + * @param {React.Component | React.PureComponent | React.FC} component + * @returns {React.Component} */ /** diff --git a/src/useStore.js b/src/useStore.js index 10d13d2..97c7db1 100644 --- a/src/useStore.js +++ b/src/useStore.js @@ -1,11 +1,13 @@ import { useState, useEffect } from "react" // eslint-disable-next-line no-unused-vars -import { StoreReactHook } from "./types" +import { Store, StoreReactHookOptions } from "./types" /** * @template T - * @type {StoreReactHook} + * @param {Store} store + * @param {StoreReactHookOptions} options + * @returns {T | any} */ const useStore = (store, { map } = {}) => { const [state, setState] = useState(store.getState()) From 82ca018004d31bebfa0e69522e787da28687e6a2 Mon Sep 17 00:00:00 2001 From: Tigran Kirakosov Date: Thu, 13 Oct 2022 22:45:00 +0300 Subject: [PATCH 4/7] Use TypeScript type declarations; Replace jsx syntax to js --- package.json | 5 +++- rollup.config.js | 9 +++++++ src/common.d.ts | 32 ++++++++++++++++++++++ src/multipleObserver.d.ts | 34 +++++++++++++++++++++++ src/multipleObserver.js | 9 +------ src/observable.d.ts | 5 ++++ src/observable.js | 8 ------ src/observer.d.ts | 5 ++++ src/observer.js | 11 +------- src/types.js | 57 --------------------------------------- src/useStore.d.ts | 9 +++++++ src/useStore.js | 9 ------- yarn.lock | 47 ++++++++++++++++++++++++++++++++ 13 files changed, 147 insertions(+), 93 deletions(-) create mode 100644 src/common.d.ts create mode 100644 src/multipleObserver.d.ts create mode 100644 src/observable.d.ts create mode 100644 src/observer.d.ts delete mode 100644 src/types.js create mode 100644 src/useStore.d.ts diff --git a/package.json b/package.json index df2bf68..cc4d725 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "main": "dist/observable.cjs.js", "module": "dist/observable.es.js", "unpkg": "dist/observable.iife.js", + "types": "dist/observable.d.ts", "scripts": { "build": "rollup -c", "lint": "eslint .", @@ -41,7 +42,9 @@ "jest-environment-jsdom": "^28.1.1", "react": "^17.0.2", "react-dom": "^17.0.2", - "rollup": "^2.75.6" + "rollup": "^2.75.6", + "rollup-plugin-dts": "^4.2.3", + "typescript": "^4.8.4" }, "peerDependencies": { "react": "^16.13.1 || ^17" diff --git a/rollup.config.js b/rollup.config.js index 985b74b..458a168 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -1,5 +1,6 @@ import { babel } from "@rollup/plugin-babel" import { nodeResolve } from "@rollup/plugin-node-resolve" +import dts from "rollup-plugin-dts" const shared = { input: "src/index.js", @@ -46,6 +47,14 @@ const config = [ name: "T", }, } }), + { + input: "src/index.js", + plugins: [dts()], + output: { + file: "dist/observable.d.ts", + format: "es", + }, + }, ] export default config diff --git a/src/common.d.ts b/src/common.d.ts new file mode 100644 index 0000000..fdb5fbe --- /dev/null +++ b/src/common.d.ts @@ -0,0 +1,32 @@ +import { Component, PureComponent, FC } from "react" + +export declare type SubscribeFn = (data: T) => void + +export declare type UnsubscribeFn = () => void + +export declare type MapFn = (data: T) => T | any + +export declare type GenericReactComponent = ( + Component | PureComponent | FC +) + +export declare type ComponentWrapper = ( + (component: GenericReactComponent) => Component +) + +export declare interface Store { + getState(): T + set(data: Partial): void + observer(options: ObserverOptions): Observer + subscribe(sub: SubscribeFn): UnsubscribeFn + reset(): void +} + +export declare interface ObserverOptions { + key: string + map: MapFn +} + +export declare interface Observer { + (store: Store, options?: ObserverOptions): ComponentWrapper +} diff --git a/src/multipleObserver.d.ts b/src/multipleObserver.d.ts new file mode 100644 index 0000000..cf9391e --- /dev/null +++ b/src/multipleObserver.d.ts @@ -0,0 +1,34 @@ +import { Component } from "react" + +import { Store, GenericReactComponent } from "./common" + +declare interface StoreConfig { + store: Store + key: string +} + +declare type Wrapper = ( + (component: GenericReactComponent) => Component +) + +declare function multipleObserver (stores: [StoreConfig]): Wrapper + +declare function multipleObserver + (stores: [StoreConfig, StoreConfig]): Wrapper + +declare function multipleObserver + (stores: [StoreConfig, StoreConfig, StoreConfig]): Wrapper + +declare function multipleObserver + (stores: [StoreConfig, StoreConfig, StoreConfig, StoreConfig]): Wrapper + +declare function multipleObserver + (stores: [StoreConfig, StoreConfig, StoreConfig, StoreConfig, StoreConfig]): Wrapper + +declare function multipleObserver + (stores: [StoreConfig, StoreConfig, StoreConfig, StoreConfig, StoreConfig, StoreConfig]): Wrapper + +declare function multipleObserver + (stores: [StoreConfig, StoreConfig, StoreConfig, StoreConfig, StoreConfig, StoreConfig, StoreConfig]): Wrapper + +export default multipleObserver diff --git a/src/multipleObserver.js b/src/multipleObserver.js index 66751b8..f76aedb 100644 --- a/src/multipleObserver.js +++ b/src/multipleObserver.js @@ -1,12 +1,5 @@ import React from "react" -// eslint-disable-next-line no-unused-vars -import { ComponentWrapper, StoreConfig } from "./types" - -/** - * @param {StoreConfig[]} stores - * @returns {ComponentWrapper} - */ const multipleObserver = stores => WrappedComponent => { const reduceStates = stores => { return stores.reduce((acc, { key, store }) => ({ ...acc, [key]: { ...store.getState() } }), {}) @@ -40,7 +33,7 @@ const multipleObserver = stores => WrappedComponent => { } }, {}) - return + return WrappedComponent({ ...this.props, ...state }) } } } diff --git a/src/observable.d.ts b/src/observable.d.ts new file mode 100644 index 0000000..f71d8f6 --- /dev/null +++ b/src/observable.d.ts @@ -0,0 +1,5 @@ +import { Store } from "./common" + +declare function observable (initialData: T): Store + +export default observable diff --git a/src/observable.js b/src/observable.js index 8d66ffc..f654d6a 100644 --- a/src/observable.js +++ b/src/observable.js @@ -1,13 +1,5 @@ import observer from "./observer" -// eslint-disable-next-line no-unused-vars -import { Store } from "./types" - -/** - * @template T - * @param {T} initial - * @returns {Store} - */ const observable = initial => { let store = { ...initial } diff --git a/src/observer.d.ts b/src/observer.d.ts new file mode 100644 index 0000000..48848f0 --- /dev/null +++ b/src/observer.d.ts @@ -0,0 +1,5 @@ +import { ComponentWrapper, ObserverOptions, Store } from "./common" + +declare function observer (store: Store, options?: ObserverOptions): ComponentWrapper + +export default observer diff --git a/src/observer.js b/src/observer.js index c434b6b..4a50df6 100644 --- a/src/observer.js +++ b/src/observer.js @@ -1,14 +1,5 @@ import React from "react" -// eslint-disable-next-line no-unused-vars -import { Store, ObserverOptions, ComponentWrapper } from "./types" - -/** - * @template T - * @param {Store} store - * @param {ObserverOptions} options - * @returns {ComponentWrapper} - */ const observer = (store, { key, map }) => WrappedComponent => { return class extends React.Component { static displayName = `${key} State Observer` @@ -32,7 +23,7 @@ const observer = (store, { key, map }) => WrappedComponent => { render () { const state = { [key]: map ? map(this.state) : this.state } - return + return WrappedComponent({ ...this.props, ...state }) } } } diff --git a/src/types.js b/src/types.js deleted file mode 100644 index 8ef4402..0000000 --- a/src/types.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * @template T - * @typedef {object} Store - * @property {function(): T} getState - * @property {function(Partial): void} set - * @property {function(ObserverOptions): Observer} observer - * @property {function(SubscribeFn): UnsubscribeFn} subscribe - * @property {function(): void} reset - */ - -/** - * @template T - * @typedef StoreConfig - * @property {Store} store - * @property {string} key - */ - -/** - * @template T - * @typedef {object} ObserverOptions - * @property {string} key - * @property {MapFn} map - */ - -/** - * @template T - * @callback ComponentWrapper - * @param {React.Component | React.PureComponent | React.FC} component - * @returns {React.Component} - */ - -/** - * @template T - * @typedef {object} StoreReactHookOptions - * @property {MapFn} map - */ - -/** - * @callback UnsubscribeFn - * @returns {void} - */ - -/** - * @template T - * @callback SubscribeFn - * @param {T} - * @returns {void} - */ - -/** - * @template T - * @callback MapFn - * @param {T} - * @returns {any} - */ - -export {} diff --git a/src/useStore.d.ts b/src/useStore.d.ts new file mode 100644 index 0000000..bc5a8e3 --- /dev/null +++ b/src/useStore.d.ts @@ -0,0 +1,9 @@ +import { Store, MapFn } from "./common" + +declare interface Options { + map: MapFn +} + +declare function useStore (store: Store, options?: Options): T + +export default useStore diff --git a/src/useStore.js b/src/useStore.js index 97c7db1..35bb5fb 100644 --- a/src/useStore.js +++ b/src/useStore.js @@ -1,14 +1,5 @@ import { useState, useEffect } from "react" -// eslint-disable-next-line no-unused-vars -import { Store, StoreReactHookOptions } from "./types" - -/** - * @template T - * @param {Store} store - * @param {StoreReactHookOptions} options - * @returns {T | any} - */ const useStore = (store, { map } = {}) => { const [state, setState] = useState(store.getState()) diff --git a/yarn.lock b/yarn.lock index d1ddfc2..a88d40a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -47,6 +47,13 @@ dependencies: "@babel/highlight" "^7.16.7" +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== + dependencies: + "@babel/highlight" "^7.18.6" + "@babel/compat-data@^7.13.11": version "7.14.0" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" @@ -397,6 +404,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== +"@babel/helper-validator-identifier@^7.18.6": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" @@ -453,6 +465,15 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.13": version "7.13.13" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.13.tgz#42f03862f4aed50461e543270916b47dd501f0df" @@ -4396,6 +4417,13 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +magic-string@^0.26.6: + version "0.26.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" + integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== + dependencies: + sourcemap-codec "^1.4.8" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -5172,6 +5200,15 @@ rimraf@^3.0.0, rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup-plugin-dts@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-4.2.3.tgz#04c3615df1ffab4228aa9d540697eaca61e01f47" + integrity sha512-jlcpItqM2efqfIiKzDB/IKOS9E9fDvbkJSGw5GtK/PqPGS9eC3R3JKyw2VvpTktZA+TNgJRMu1NTv244aTUzzQ== + dependencies: + magic-string "^0.26.6" + optionalDependencies: + "@babel/code-frame" "^7.18.6" + rollup@^2.75.6: version "2.75.6" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.75.6.tgz#ac4dc8600f95942a0180f61c7c9d6200e374b439" @@ -5310,6 +5347,11 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -5624,6 +5666,11 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== +typescript@^4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + unbox-primitive@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" From 2ad0ce640d2259781e7236fd30ca149db4fcf07a Mon Sep 17 00:00:00 2001 From: Tigran Kirakosov Date: Thu, 13 Oct 2022 22:57:15 +0300 Subject: [PATCH 5/7] Add forgotten prop --- src/multipleObserver.d.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/multipleObserver.d.ts b/src/multipleObserver.d.ts index cf9391e..b7c89c6 100644 --- a/src/multipleObserver.d.ts +++ b/src/multipleObserver.d.ts @@ -1,10 +1,11 @@ import { Component } from "react" -import { Store, GenericReactComponent } from "./common" +import { Store, GenericReactComponent, MapFn } from "./common" declare interface StoreConfig { store: Store key: string + map: MapFn } declare type Wrapper = ( From ae4ffeb7496792967934bb644d076e781ce3e712 Mon Sep 17 00:00:00 2001 From: Tigran Kirakosov Date: Fri, 14 Oct 2022 11:50:23 +0300 Subject: [PATCH 6/7] Improve semantics --- src/common.d.ts | 24 +++++++++++++----------- src/multipleObserver.d.ts | 11 ++++++----- src/observer.d.ts | 4 +++- 3 files changed, 22 insertions(+), 17 deletions(-) diff --git a/src/common.d.ts b/src/common.d.ts index fdb5fbe..fc92b26 100644 --- a/src/common.d.ts +++ b/src/common.d.ts @@ -6,19 +6,20 @@ export declare type UnsubscribeFn = () => void export declare type MapFn = (data: T) => T | any -export declare type GenericReactComponent = ( - Component | PureComponent | FC +export declare type ReactComponent = ( + Component | PureComponent | FC ) -export declare type ComponentWrapper = ( - (component: GenericReactComponent) => Component +export declare type ComponentWrapper = ( + (component: ReactComponent) => Component ) -export declare interface Store { - getState(): T - set(data: Partial): void - observer(options: ObserverOptions): Observer - subscribe(sub: SubscribeFn): UnsubscribeFn +export declare interface Store { + getState(): State + set(data: Partial): void + observer + (options: ObserverOptions): Observer + subscribe(sub: SubscribeFn): UnsubscribeFn reset(): void } @@ -27,6 +28,7 @@ export declare interface ObserverOptions { map: MapFn } -export declare interface Observer { - (store: Store, options?: ObserverOptions): ComponentWrapper +export declare interface Observer { + (store: Store, options?: ObserverOptions): + ComponentWrapper } diff --git a/src/multipleObserver.d.ts b/src/multipleObserver.d.ts index b7c89c6..36ac767 100644 --- a/src/multipleObserver.d.ts +++ b/src/multipleObserver.d.ts @@ -1,18 +1,19 @@ import { Component } from "react" -import { Store, GenericReactComponent, MapFn } from "./common" +import { Store, ReactComponent, MapFn } from "./common" declare interface StoreConfig { store: Store key: string - map: MapFn + map?: MapFn } -declare type Wrapper = ( - (component: GenericReactComponent) => Component +declare type Wrapper = ( + (component: ReactComponent) => Component ) -declare function multipleObserver (stores: [StoreConfig]): Wrapper +declare function multipleObserver + (stores: [StoreConfig]): Wrapper declare function multipleObserver (stores: [StoreConfig, StoreConfig]): Wrapper diff --git a/src/observer.d.ts b/src/observer.d.ts index 48848f0..af793c1 100644 --- a/src/observer.d.ts +++ b/src/observer.d.ts @@ -1,5 +1,7 @@ import { ComponentWrapper, ObserverOptions, Store } from "./common" -declare function observer (store: Store, options?: ObserverOptions): ComponentWrapper +declare function observer + (store: Store, options?: ObserverOptions): + ComponentWrapper export default observer From 9f73b6f73bc84a7e9ed1e113bf7237a000e3a066 Mon Sep 17 00:00:00 2001 From: Tigran Kirakosov Date: Sat, 15 Oct 2022 19:40:24 +0300 Subject: [PATCH 7/7] Up packange version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cc4d725..82885d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@umbrellio/observable", - "version": "1.4.1", + "version": "1.4.2", "description": "Observable library", "repository": "git@github.com:umbrellio/observable.git", "author": "Aleksei Bespalov ",