react-better-model 0.2.2 → 1.0.0-beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +43 -0
- package/LICENSE +21 -4
- package/lib/ModelBase.d.ts +15 -0
- package/lib/ModelBase.d.ts.map +1 -0
- package/lib/ModelBase.js +91 -0
- package/lib/ModelBase.js.map +1 -0
- package/lib/ModelWithHooks.d.ts +9 -0
- package/lib/ModelWithHooks.d.ts.map +1 -0
- package/lib/ModelWithHooks.js +108 -0
- package/lib/ModelWithHooks.js.map +1 -0
- package/lib/common-types.d.ts +9 -0
- package/lib/common-types.d.ts.map +1 -0
- package/lib/{types.js → common-types.js} +1 -1
- package/lib/common-types.js.map +1 -0
- package/lib/create-model.d.ts +18 -0
- package/lib/create-model.d.ts.map +1 -0
- package/lib/create-model.js +78 -0
- package/lib/create-model.js.map +1 -0
- package/lib/create-model.test.d.ts +2 -0
- package/lib/create-model.test.d.ts.map +1 -0
- package/lib/create-model.test.js +80 -0
- package/lib/create-model.test.js.map +1 -0
- package/lib/index.d.ts +4 -8
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +22 -9
- package/lib/index.js.map +1 -1
- package/lib/src/ModelBase.d.ts +16 -0
- package/lib/src/ModelBase.d.ts.map +1 -0
- package/lib/src/ModelBase.js +97 -0
- package/lib/src/ModelBase.js.map +1 -0
- package/lib/src/ModelWithHooks.d.ts +8 -0
- package/lib/src/ModelWithHooks.d.ts.map +1 -0
- package/lib/src/ModelWithHooks.js +57 -0
- package/lib/src/ModelWithHooks.js.map +1 -0
- package/lib/src/common-types.d.ts +9 -0
- package/lib/src/common-types.d.ts.map +1 -0
- package/lib/src/common-types.js +3 -0
- package/lib/src/common-types.js.map +1 -0
- package/lib/src/create-model.d.ts +18 -0
- package/lib/src/create-model.d.ts.map +1 -0
- package/lib/src/create-model.js +78 -0
- package/lib/src/create-model.js.map +1 -0
- package/lib/src/index.d.ts +5 -0
- package/lib/src/index.d.ts.map +1 -0
- package/lib/src/index.js +34 -0
- package/lib/src/index.js.map +1 -0
- package/lib/src/utils.d.ts +4 -0
- package/lib/src/utils.d.ts.map +1 -0
- package/lib/src/utils.js +36 -0
- package/lib/src/utils.js.map +1 -0
- package/lib/tests/ModelBase.test.d.ts +2 -0
- package/lib/tests/ModelBase.test.d.ts.map +1 -0
- package/lib/tests/ModelBase.test.js +73 -0
- package/lib/tests/ModelBase.test.js.map +1 -0
- package/lib/tests/ModelWithHooks.test.d.ts +2 -0
- package/lib/tests/ModelWithHooks.test.d.ts.map +1 -0
- package/lib/tests/ModelWithHooks.test.js +108 -0
- package/lib/tests/ModelWithHooks.test.js.map +1 -0
- package/lib/tests/create-model.test.d.ts +2 -0
- package/lib/tests/create-model.test.d.ts.map +1 -0
- package/lib/tests/create-model.test.js +104 -0
- package/lib/tests/create-model.test.js.map +1 -0
- package/lib/tests/utils.test.d.ts +2 -0
- package/lib/tests/utils.test.d.ts.map +1 -0
- package/lib/tests/utils.test.js +30 -0
- package/lib/tests/utils.test.js.map +1 -0
- package/package.json +13 -11
- package/readme.md +212 -105
- package/lib/Model.d.ts +0 -23
- package/lib/Model.d.ts.map +0 -1
- package/lib/Model.js +0 -108
- package/lib/Model.js.map +0 -1
- package/lib/hooks/event-hooks.d.ts +0 -6
- package/lib/hooks/event-hooks.d.ts.map +0 -1
- package/lib/hooks/event-hooks.js +0 -19
- package/lib/hooks/event-hooks.js.map +0 -1
- package/lib/hooks/model-hooks.d.ts +0 -4
- package/lib/hooks/model-hooks.d.ts.map +0 -1
- package/lib/hooks/model-hooks.js +0 -9
- package/lib/hooks/model-hooks.js.map +0 -1
- package/lib/hooks/state-hooks.d.ts +0 -5
- package/lib/hooks/state-hooks.d.ts.map +0 -1
- package/lib/hooks/state-hooks.js +0 -19
- package/lib/hooks/state-hooks.js.map +0 -1
- package/lib/types.d.ts +0 -13
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js.map +0 -1
- package/lib/utils/compose-providers.d.ts +0 -3
- package/lib/utils/compose-providers.d.ts.map +0 -1
- package/lib/utils/compose-providers.js +0 -19
- package/lib/utils/compose-providers.js.map +0 -1
- package/lib/utils/create-model.d.ts +0 -21
- package/lib/utils/create-model.d.ts.map +0 -1
- package/lib/utils/create-model.js +0 -84
- package/lib/utils/create-model.js.map +0 -1
- package/lib/utils/js-event-types.d.ts +0 -6
- package/lib/utils/js-event-types.d.ts.map +0 -1
- package/lib/utils/js-event-types.js +0 -9
- package/lib/utils/js-event-types.js.map +0 -1
package/AGENTS.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Repository Guidelines
|
|
2
|
+
|
|
3
|
+
## Project Structure & Module Organization
|
|
4
|
+
- Source: `src/` — core classes and helpers (`ModelBase`, `Model`, `create-model`).
|
|
5
|
+
- Entry: `src/index.ts` re-exports the public API.
|
|
6
|
+
- Build output: `lib/` (generated by TypeScript; never edit).
|
|
7
|
+
- Docs: root `*.md` and `Docs/*.MD` contain API notes and guides.
|
|
8
|
+
|
|
9
|
+
## Build, Test, and Development Commands
|
|
10
|
+
- `yarn build` or `npm run build`: Compile to `lib/` via `tsc`.
|
|
11
|
+
- `npx tsc -w`: Rebuild on change for local development.
|
|
12
|
+
- `yarn prepare`: Runs on install/publish to ensure artifacts are fresh.
|
|
13
|
+
|
|
14
|
+
## Architecture & Usage
|
|
15
|
+
- Create a model by extending `Model<Events>` and pass initial state into `super` (ModelBase constructor now requires state).
|
|
16
|
+
```ts
|
|
17
|
+
type Events = { 'clear-todos': undefined }
|
|
18
|
+
class TodoModel extends Model<Events> {
|
|
19
|
+
state = { todos: [], showDone: true }
|
|
20
|
+
constructor() { super({ todos: [], showDone: true }) }
|
|
21
|
+
addTodo = (title: string) => this.setState({ todos: [...this.state.todos, { title, done: false, id: Date.now() }] })
|
|
22
|
+
}
|
|
23
|
+
export const { Provider: TodoProvider, useModel: useTodo } = createModel(TodoModel)
|
|
24
|
+
```
|
|
25
|
+
- In components, access the instance via `useModel()` inside the corresponding Provider.
|
|
26
|
+
- State: `const [show, setShow] = model.useState('showDone')`
|
|
27
|
+
- Selector: `const visible = model.useMapper(s => s.todos.filter(t => show ? true : !t.done))`
|
|
28
|
+
- Events: `const clear = model.useEvent('clear-todos')` and `model.useEvent('clear-todos', cb)` to subscribe.
|
|
29
|
+
- Provider may accept a `value` (prebuilt instance) for external control.
|
|
30
|
+
|
|
31
|
+
## Coding Style & Naming Conventions
|
|
32
|
+
- Indentation: 2 spaces. TypeScript-first; avoid `any` in public types.
|
|
33
|
+
- Components: PascalCase; hooks start with `use*`; React files `*.tsx`.
|
|
34
|
+
- Exports: prefer named exports; expose public API via `src/index.ts`.
|
|
35
|
+
- Event keys: typed string literals (e.g., `'clear-todos'`).
|
|
36
|
+
|
|
37
|
+
## Testing Guidelines
|
|
38
|
+
- Suggested stack: Jest + `ts-jest`. Place tests next to sources (`*.test.ts(x)`) or under `__tests__/`.
|
|
39
|
+
- Cover model behavior (state transitions, reducers, events) and hook usage.
|
|
40
|
+
|
|
41
|
+
## Commit & Pull Request Guidelines
|
|
42
|
+
- Commits: small, imperative, and typed (Conventional Commits recommended).
|
|
43
|
+
- PRs: include summary, rationale, usage snippet, and note any API changes; update affected docs.
|
package/LICENSE
CHANGED
|
@@ -1,7 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
This is free and unencumbered software released into the public domain.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
4
|
+
distribute this software, either in source code form or as a compiled
|
|
5
|
+
binary, for any purpose, commercial or non-commercial, and by any
|
|
6
|
+
means.
|
|
4
7
|
|
|
5
|
-
|
|
8
|
+
In jurisdictions that recognize copyright laws, the author or authors
|
|
9
|
+
of this software dedicate any and all copyright interest in the
|
|
10
|
+
software to the public domain. We make this dedication for the benefit
|
|
11
|
+
of the public at large and to the detriment of our heirs and
|
|
12
|
+
successors. We intend this dedication to be an overt act of
|
|
13
|
+
relinquishment in perpetuity of all present and future rights to this
|
|
14
|
+
software under copyright law.
|
|
6
15
|
|
|
7
|
-
THE SOFTWARE IS PROVIDED
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
19
|
+
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
20
|
+
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
21
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
22
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
+
|
|
24
|
+
For more information, please refer to <http://unlicense.org/>
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EventSubscription, EventSubscriptions, EventsScheme, StatePlaceholder, StateSubscription, StateSubscriptions, ValueSubscription, ValueSubscriptions } from "./common-types";
|
|
2
|
+
export declare abstract class ModelBase<TEvents extends EventsScheme = EventsScheme> {
|
|
3
|
+
protected valueSubscriptions: ValueSubscriptions<StatePlaceholder>;
|
|
4
|
+
protected stateSubscriptions: StateSubscriptions<StatePlaceholder>;
|
|
5
|
+
protected eventListeners: EventSubscriptions<EventsScheme>;
|
|
6
|
+
onStateChange: (subscription: StateSubscription<typeof this['state']>) => () => void;
|
|
7
|
+
onValueChange: <K extends keyof this["state"]>(key: K, subscription: ValueSubscription<typeof this['state']>) => () => void;
|
|
8
|
+
onValuesChange: <K extends keyof this["state"]>(keys: readonly K[], subscription: StateSubscription<typeof this['state']>) => () => void;
|
|
9
|
+
setState: (delta: Partial<StatePlaceholder<typeof this['state']>>) => void;
|
|
10
|
+
reduce: (reducer: (state: typeof this['state']) => Partial<typeof this['state']>) => void;
|
|
11
|
+
onEvent: <K extends keyof TEvents>(key: K, subscription: EventSubscription<TEvents, K>) => () => void;
|
|
12
|
+
dispatch: <K extends keyof TEvents>(key: K, data?: (TEvents[K] extends undefined ? never : TEvents[K]) | undefined) => void;
|
|
13
|
+
abstract state: StatePlaceholder;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=ModelBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelBase.d.ts","sourceRoot":"","sources":["../src/ModelBase.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,iBAAiB,EACjB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,gBAAgB,CAAA;AAyDvB,8BAAsB,SAAS,CAAC,OAAO,SAAS,YAAY,GAAG,YAAY;IAC1E,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAY;IAC9E,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,gBAAgB,CAAC,CAAY;IAC9E,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAY;IAEtE,aAAa,iBAAkB,kBAAkB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,gBAMrE;IAED,aAAa,wDAEE,kBAAkB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,gBAcrD;IAED,cAAc,oEAEC,kBAAkB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,gBAUrD;IAED,QAAQ,UAAW,QAAQ,iBAAiB,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAMjE;IAED,MAAM,oBAAqB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,UAIhF;IAED,OAAO,+FAaN;IAED,QAAQ,oHAEP;IAED,QAAQ,CAAC,KAAK,EAAE,gBAAgB,CAAA;CAChC"}
|
package/lib/ModelBase.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ModelBase = void 0;
|
|
4
|
+
//#region utils
|
|
5
|
+
function updateSingleKeySubscriber(subs, key, currentVal, prevVal, uniqueSubsSet) {
|
|
6
|
+
var _a;
|
|
7
|
+
(_a = subs.get(key)) === null || _a === void 0 ? void 0 : _a.forEach((subscription) => {
|
|
8
|
+
if (!(uniqueSubsSet === null || uniqueSubsSet === void 0 ? void 0 : uniqueSubsSet.has(subscription))) {
|
|
9
|
+
uniqueSubsSet === null || uniqueSubsSet === void 0 ? void 0 : uniqueSubsSet.add(subscription);
|
|
10
|
+
subscription(currentVal, prevVal);
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function updateKeySubscribers(subs, delta, prevState) {
|
|
15
|
+
const keyVals = Object.entries(delta);
|
|
16
|
+
const subscribersSetRef = new WeakSet();
|
|
17
|
+
for (const [key, val] of keyVals) {
|
|
18
|
+
const prevVal = prevState[key];
|
|
19
|
+
if (subs.has(key) && !Object.is(val, prevVal)) {
|
|
20
|
+
updateSingleKeySubscriber(subs, key, val, prevVal, subscribersSetRef);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function updateStateChangeSubscribers(subs, currentState, prevState) {
|
|
25
|
+
subs.forEach(subscription => subscription(currentState, prevState));
|
|
26
|
+
}
|
|
27
|
+
function updateEventListeners(eventListeners, key, data) {
|
|
28
|
+
var _a;
|
|
29
|
+
(_a = eventListeners.get(key)) === null || _a === void 0 ? void 0 : _a.forEach((subscription) => subscription(data));
|
|
30
|
+
}
|
|
31
|
+
//#endregion utils
|
|
32
|
+
class ModelBase {
|
|
33
|
+
constructor() {
|
|
34
|
+
this.valueSubscriptions = new Map();
|
|
35
|
+
this.stateSubscriptions = new Set();
|
|
36
|
+
this.eventListeners = new Map();
|
|
37
|
+
this.onStateChange = (subscription) => {
|
|
38
|
+
this.stateSubscriptions.add(subscription);
|
|
39
|
+
return () => {
|
|
40
|
+
this.stateSubscriptions.delete(subscription);
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
this.onValueChange = (key, subscription) => {
|
|
44
|
+
let subscriptions = this.valueSubscriptions.get(key);
|
|
45
|
+
if (!subscriptions) {
|
|
46
|
+
subscriptions = new Set();
|
|
47
|
+
this.valueSubscriptions.set(key, subscriptions);
|
|
48
|
+
}
|
|
49
|
+
subscriptions.add(subscription);
|
|
50
|
+
return () => {
|
|
51
|
+
subscriptions === null || subscriptions === void 0 ? void 0 : subscriptions.delete(subscription);
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
this.onValuesChange = (keys, subscription) => {
|
|
55
|
+
return this.onStateChange((currentState, prevState) => {
|
|
56
|
+
for (const key of keys) {
|
|
57
|
+
if (!Object.is(prevState[key], currentState[key])) {
|
|
58
|
+
subscription(currentState, prevState);
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
this.setState = (delta) => {
|
|
65
|
+
const prevState = Object.assign({}, this.state);
|
|
66
|
+
this.state = Object.assign(Object.assign({}, this.state), delta);
|
|
67
|
+
updateStateChangeSubscribers(this.stateSubscriptions, this.state, prevState);
|
|
68
|
+
updateKeySubscribers(this.valueSubscriptions, delta, prevState);
|
|
69
|
+
};
|
|
70
|
+
this.reduce = (reducer) => {
|
|
71
|
+
const nextState = reducer(Object.assign({}, this.state));
|
|
72
|
+
this.setState(nextState);
|
|
73
|
+
};
|
|
74
|
+
this.onEvent = (key, subscription) => {
|
|
75
|
+
let nsListeners = this.eventListeners.get(key);
|
|
76
|
+
if (!nsListeners) {
|
|
77
|
+
nsListeners = new Set();
|
|
78
|
+
this.eventListeners.set(key, nsListeners);
|
|
79
|
+
}
|
|
80
|
+
nsListeners.add(subscription);
|
|
81
|
+
return () => {
|
|
82
|
+
nsListeners.delete(subscription);
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
this.dispatch = (key, data) => {
|
|
86
|
+
updateEventListeners(this.eventListeners, key, data);
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.ModelBase = ModelBase;
|
|
91
|
+
//# sourceMappingURL=ModelBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelBase.js","sourceRoot":"","sources":["../src/ModelBase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ModelBase } from './ModelBase';
|
|
2
|
+
import { EventSubscription, EventsScheme } from './common-types';
|
|
3
|
+
export declare abstract class Model<E extends EventsScheme = {}> extends ModelBase<E> {
|
|
4
|
+
useState: <K extends keyof this["state"]>(key: K) => [this["state"][K], (v: this["state"][K]) => void];
|
|
5
|
+
useMapper: <T>(mapper: (state: typeof this['state'], prevState: typeof this['state']) => T) => T;
|
|
6
|
+
useStateEffect: (effect: (state: typeof this['state'], prevState: typeof this['state']) => unknown) => void;
|
|
7
|
+
useEvent: <K extends keyof E>(ns: K, cb?: EventSubscription<E, K> | undefined) => (data?: (E[K] extends undefined ? never : E[K]) | undefined) => void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=ModelWithHooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelWithHooks.d.ts","sourceRoot":"","sources":["../src/ModelWithHooks.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EACN,iBAAiB,EACjB,YAAY,EAEZ,MAAM,gBAAgB,CAAA;AAuBvB,8BAAsB,KAAK,CAAC,CAAC,SAAS,YAAY,GAAG,EAAE,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAC5E,QAAQ,yFAA6G,IAAI,EAuBxH;IAED,SAAS,sBAAuB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,OAAO,IAAI,CAAC,OAAO,CAAC,aAgDpF;IAED,cAAc,mBAAoB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,OAAO,UAiClG;IAED,QAAQ,+IAYP;CACD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Model = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const ModelBase_1 = require("./ModelBase");
|
|
6
|
+
// Create a shallow proxy to record which state keys a consumer reads.
|
|
7
|
+
function makeProxy(state, recordDependency) {
|
|
8
|
+
const proxy = {};
|
|
9
|
+
for (const [key, value] of Object.entries(state)) {
|
|
10
|
+
Object.defineProperty(proxy, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: false,
|
|
13
|
+
get() {
|
|
14
|
+
recordDependency(key);
|
|
15
|
+
return value;
|
|
16
|
+
},
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return proxy;
|
|
20
|
+
}
|
|
21
|
+
class Model extends ModelBase_1.ModelBase {
|
|
22
|
+
constructor() {
|
|
23
|
+
super(...arguments);
|
|
24
|
+
this.useState = (key) => {
|
|
25
|
+
const setValue = (0, react_1.useCallback)((v) => {
|
|
26
|
+
const previousValue = this.state[key];
|
|
27
|
+
// Avoid useless updates when value is unchanged.
|
|
28
|
+
if (Object.is(previousValue, v))
|
|
29
|
+
return;
|
|
30
|
+
const nextStatePatch = {};
|
|
31
|
+
nextStatePatch[key] = v;
|
|
32
|
+
this.setState(nextStatePatch);
|
|
33
|
+
}, [key]);
|
|
34
|
+
const getSnapshot = (0, react_1.useCallback)(() => this.state[key], [key]);
|
|
35
|
+
const val = (0, react_1.useSyncExternalStore)((cb) => this.onValueChange(key, () => cb()), getSnapshot, getSnapshot);
|
|
36
|
+
return [val, setValue];
|
|
37
|
+
};
|
|
38
|
+
this.useMapper = (mapper) => {
|
|
39
|
+
const latestMapperRef = (0, react_1.useRef)(mapper);
|
|
40
|
+
const previousStateRef = (0, react_1.useRef)(this.state);
|
|
41
|
+
const derivedValueRef = (0, react_1.useRef)(mapper(this.state, this.state));
|
|
42
|
+
// Keep mapper ref fresh without re-subscribing.
|
|
43
|
+
(0, react_1.useEffect)(() => {
|
|
44
|
+
latestMapperRef.current = mapper;
|
|
45
|
+
}, [mapper]);
|
|
46
|
+
const dependencyKeysRef = (0, react_1.useRef)(new Set());
|
|
47
|
+
const dependencyProxy = (0, react_1.useMemo)(() => {
|
|
48
|
+
return makeProxy(this.state, k => {
|
|
49
|
+
dependencyKeysRef.current.add(k);
|
|
50
|
+
});
|
|
51
|
+
}, []);
|
|
52
|
+
const dependencyKeys = (0, react_1.useMemo)(() => {
|
|
53
|
+
dependencyKeysRef.current = new Set();
|
|
54
|
+
// Execute mapper on the proxy to collect touched keys.
|
|
55
|
+
mapper(dependencyProxy, previousStateRef.current);
|
|
56
|
+
return Array.from(dependencyKeysRef.current);
|
|
57
|
+
}, [mapper]);
|
|
58
|
+
const getSnapshot = (0, react_1.useCallback)(() => {
|
|
59
|
+
if (previousStateRef.current !== this.state) {
|
|
60
|
+
derivedValueRef.current = latestMapperRef.current(this.state, previousStateRef.current);
|
|
61
|
+
previousStateRef.current = this.state;
|
|
62
|
+
return derivedValueRef.current;
|
|
63
|
+
}
|
|
64
|
+
return derivedValueRef.current;
|
|
65
|
+
}, []);
|
|
66
|
+
const subscribe = (0, react_1.useCallback)((onChange) => {
|
|
67
|
+
return this.onValuesChange(dependencyKeys, onChange);
|
|
68
|
+
}, [dependencyKeys]);
|
|
69
|
+
return (0, react_1.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
|
|
70
|
+
};
|
|
71
|
+
this.useStateEffect = (effect) => {
|
|
72
|
+
const latestEffectRef = (0, react_1.useRef)(effect);
|
|
73
|
+
const previousStateRef = (0, react_1.useRef)(Object.assign({}, this.state));
|
|
74
|
+
const dependencyKeysRef = (0, react_1.useRef)(new Set());
|
|
75
|
+
const dependencyProxy = (0, react_1.useMemo)(() => {
|
|
76
|
+
return makeProxy(this.state, k => {
|
|
77
|
+
dependencyKeysRef.current.add(k);
|
|
78
|
+
});
|
|
79
|
+
}, []);
|
|
80
|
+
// Keep effect ref current; subscription uses the ref.
|
|
81
|
+
(0, react_1.useEffect)(() => {
|
|
82
|
+
latestEffectRef.current = effect;
|
|
83
|
+
}, [effect]);
|
|
84
|
+
const dependencyKeys = (0, react_1.useMemo)(() => {
|
|
85
|
+
dependencyKeysRef.current = new Set();
|
|
86
|
+
// Execute effect once to discover which keys it reads.
|
|
87
|
+
effect(dependencyProxy, previousStateRef.current);
|
|
88
|
+
return Array.from(dependencyKeysRef.current);
|
|
89
|
+
}, [effect]);
|
|
90
|
+
(0, react_1.useEffect)(() => this.onValuesChange(dependencyKeys, () => {
|
|
91
|
+
latestEffectRef.current(this.state, previousStateRef.current);
|
|
92
|
+
previousStateRef.current = Object.assign({}, this.state);
|
|
93
|
+
}), [dependencyKeys]);
|
|
94
|
+
};
|
|
95
|
+
this.useEvent = (ns, cb) => {
|
|
96
|
+
(0, react_1.useEffect)(() => {
|
|
97
|
+
let removeListener = () => { };
|
|
98
|
+
if (!!cb) {
|
|
99
|
+
removeListener = this.onEvent(ns, cb);
|
|
100
|
+
}
|
|
101
|
+
return removeListener;
|
|
102
|
+
}, [ns, cb]);
|
|
103
|
+
return (data) => this.dispatch(ns, data);
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
exports.Model = Model;
|
|
108
|
+
//# sourceMappingURL=ModelWithHooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelWithHooks.js","sourceRoot":"","sources":["../src/ModelWithHooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type ValueSubscription<S, K extends keyof S = keyof S> = (currentValue: S[K], prevValue: S[K]) => void;
|
|
2
|
+
export type ValueSubscriptions<S> = Map<keyof S, Set<ValueSubscription<S, keyof S>>>;
|
|
3
|
+
export type StateSubscription<S> = (currentState: S, prevState: S) => unknown;
|
|
4
|
+
export type StateSubscriptions<S> = Set<StateSubscription<S>>;
|
|
5
|
+
export type EventSubscription<E, K extends keyof E = keyof E> = (eventData: E[K]) => void;
|
|
6
|
+
export type EventSubscriptions<E> = Map<keyof E, Set<EventSubscription<E, keyof E>>>;
|
|
7
|
+
export type EventsScheme = Record<string, unknown>;
|
|
8
|
+
export type StatePlaceholder<T extends Record<PropertyKey, unknown> = Record<PropertyKey, unknown>> = T | Record<PropertyKey, unknown>;
|
|
9
|
+
//# sourceMappingURL=common-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common-types.d.ts","sourceRoot":"","sources":["../src/common-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;AAC7G,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACpF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,OAAO,CAAA;AAC7E,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAA;AAC7D,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;AACzF,MAAM,MAAM,kBAAkB,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;AACpF,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAClD,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common-types.js","sourceRoot":"","sources":["../src/common-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React, { ProviderProps } from 'react';
|
|
2
|
+
import { Model } from './ModelWithHooks';
|
|
3
|
+
import { ModelBase } from './ModelBase';
|
|
4
|
+
import { EventsScheme } from './common-types';
|
|
5
|
+
type Ctor<TEvents extends {}, TModel extends ModelBase<TEvents>> = new (...args: any[]) => TModel;
|
|
6
|
+
export type ModelProviderProps<TEvents extends EventsScheme, TModel extends ModelBase<TEvents>> = Omit<ProviderProps<TModel>, 'value'> & {
|
|
7
|
+
value?: TModel;
|
|
8
|
+
state?: TModel['state'];
|
|
9
|
+
onChange?: (state: TModel['state'], prevState: TModel['state']) => void;
|
|
10
|
+
};
|
|
11
|
+
export declare function createModel<TEvents extends {} = {}, TModel extends Model<TEvents> = Model<TEvents>>(CName: Ctor<TEvents, TModel>): {
|
|
12
|
+
Ctx: React.Context<TModel>;
|
|
13
|
+
create: (state?: TModel["state"]) => TModel;
|
|
14
|
+
Provider: ({ value, state, onChange, ...props }: ModelProviderProps<TEvents, TModel>) => React.JSX.Element;
|
|
15
|
+
useModel: () => TModel;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=create-model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-model.d.ts","sourceRoot":"","sources":["../src/create-model.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAEb,aAAa,EAIb,MAAM,OAAO,CAAA;AAEd,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAE7C,KAAK,IAAI,CAAC,OAAO,SAAS,EAAE,EAAE,MAAM,SAAS,SAAS,CAAC,OAAO,CAAC,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAA;AAEjG,MAAM,MAAM,kBAAkB,CAAC,OAAO,SAAS,YAAY,EAAE,MAAM,SAAS,SAAS,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,GAAG;IACxI,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IACvB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;CACvE,CAAA;AAED,wBAAgB,WAAW,CAAC,OAAO,SAAS,EAAE,GAAG,EAAE,EAAE,MAAM,SAAS,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;;qBA0CxG,MAAM,CAAC,OAAO,CAAC;qDAlCpC,mBAAmB,OAAO,EAAE,MAAM,CAAC;;EA4CtC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
26
|
+
var t = {};
|
|
27
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
28
|
+
t[p] = s[p];
|
|
29
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
30
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
31
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
32
|
+
t[p[i]] = s[p[i]];
|
|
33
|
+
}
|
|
34
|
+
return t;
|
|
35
|
+
};
|
|
36
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
37
|
+
exports.createModel = void 0;
|
|
38
|
+
const react_1 = __importStar(require("react"));
|
|
39
|
+
function createModel(CName) {
|
|
40
|
+
const Ctx = (0, react_1.createContext)({});
|
|
41
|
+
function Provider(_a) {
|
|
42
|
+
var { value, state, onChange } = _a, props = __rest(_a, ["value", "state", "onChange"]);
|
|
43
|
+
const model = (0, react_1.useMemo)(() => value || new CName(), []);
|
|
44
|
+
(0, react_1.useEffect)(() => {
|
|
45
|
+
if (state) {
|
|
46
|
+
model.setState(state);
|
|
47
|
+
}
|
|
48
|
+
}, [state]);
|
|
49
|
+
(0, react_1.useEffect)(() => {
|
|
50
|
+
let listener = () => { };
|
|
51
|
+
if (onChange) {
|
|
52
|
+
listener = model.onStateChange(onChange);
|
|
53
|
+
}
|
|
54
|
+
return () => {
|
|
55
|
+
listener();
|
|
56
|
+
};
|
|
57
|
+
}, [onChange]);
|
|
58
|
+
return react_1.default.createElement(Ctx.Provider, Object.assign({}, props, { value: model }));
|
|
59
|
+
}
|
|
60
|
+
function useModel() {
|
|
61
|
+
const model = (0, react_1.useContext)(Ctx);
|
|
62
|
+
if (!model) {
|
|
63
|
+
throw new Error(`[useModel]: Could not find model\n${JSON.stringify(Ctx, null, 2)}`);
|
|
64
|
+
}
|
|
65
|
+
return model;
|
|
66
|
+
}
|
|
67
|
+
function create(state) {
|
|
68
|
+
return new CName(state);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
Ctx,
|
|
72
|
+
create,
|
|
73
|
+
Provider,
|
|
74
|
+
useModel,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
exports.createModel = createModel;
|
|
78
|
+
//# sourceMappingURL=create-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-model.js","sourceRoot":"","sources":["../src/create-model.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAMc;AAcd,SAAgB,WAAW,CAA0E,KAA4B;IAChI,MAAM,GAAG,GAAG,IAAA,qBAAa,EAAS,EAAY,CAAC,CAAA;IAE/C,SAAS,QAAQ,CAAC,EAKoB;YALpB,EACjB,KAAK,EACL,KAAK,EACL,QAAQ,OAE6B,EADlC,KAAK,cAJS,8BAKjB,CADQ;QAER,MAAM,KAAK,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,KAAK,IAAI,IAAI,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QAErD,IAAA,iBAAS,EAAC,GAAG,EAAE;YACd,IAAI,KAAK,EAAE;gBACV,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;aACrB;QACF,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAA;QAEX,IAAA,iBAAS,EAAC,GAAG,EAAE;YACd,IAAI,QAAQ,GAAG,GAAG,EAAE,GAAG,CAAC,CAAA;YAExB,IAAI,QAAQ,EAAE;gBACb,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;aACxC;YAED,OAAO,GAAG,EAAE;gBACX,QAAQ,EAAE,CAAA;YACX,CAAC,CAAA;QACF,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;QAEd,OAAO,8BAAC,GAAG,CAAC,QAAQ,oBAAK,KAAK,IAAE,KAAK,EAAE,KAAK,IAAI,CAAA;IACjD,CAAC;IAED,SAAS,QAAQ;QAChB,MAAM,KAAK,GAAG,IAAA,kBAAU,EAAC,GAAG,CAAC,CAAA;QAE7B,IAAI,CAAC,KAAK,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;SACpF;QAED,OAAO,KAAK,CAAA;IACb,CAAC;IAED,SAAS,MAAM,CAAC,KAAuB;QACtC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA;IACxB,CAAC;IAED,OAAO;QACN,GAAG;QACH,MAAM;QACN,QAAQ;QACR,QAAQ;KACR,CAAA;AACF,CAAC;AApDD,kCAoDC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-model.test.d.ts","sourceRoot":"","sources":["../src/create-model.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const react_1 = __importDefault(require("react"));
|
|
16
|
+
const react_2 = require("@testing-library/react");
|
|
17
|
+
const create_model_1 = require("./create-model");
|
|
18
|
+
const ModelWithHooks_1 = require("./ModelWithHooks");
|
|
19
|
+
class CounterModel extends ModelWithHooks_1.Model {
|
|
20
|
+
constructor(initialState) {
|
|
21
|
+
super();
|
|
22
|
+
this.state = { count: 0 };
|
|
23
|
+
this.increment = () => this.setState({ count: this.state.count + 1 });
|
|
24
|
+
if (initialState) {
|
|
25
|
+
this.state = initialState;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const { Provider: CounterProvider, useModel: useCounter, create: createCounter, } = (0, create_model_1.createModel)(CounterModel);
|
|
30
|
+
afterEach(() => {
|
|
31
|
+
(0, react_2.cleanup)();
|
|
32
|
+
});
|
|
33
|
+
function CounterConsumer({ onModelReady, }) {
|
|
34
|
+
const model = useCounter();
|
|
35
|
+
const [count, setCount] = model.useState('count');
|
|
36
|
+
react_1.default.useEffect(() => {
|
|
37
|
+
onModelReady === null || onModelReady === void 0 ? void 0 : onModelReady(model);
|
|
38
|
+
}, [model, onModelReady]);
|
|
39
|
+
return (react_1.default.createElement("div", null,
|
|
40
|
+
react_1.default.createElement("span", { "data-testid": "count" }, count),
|
|
41
|
+
react_1.default.createElement("button", { onClick: () => setCount(count + 1) }, "inc")));
|
|
42
|
+
}
|
|
43
|
+
describe('createModel', () => {
|
|
44
|
+
test('provides a lazily-created model instance via Provider and useModel', () => {
|
|
45
|
+
let providedModel;
|
|
46
|
+
(0, react_2.render)(react_1.default.createElement(CounterProvider, null,
|
|
47
|
+
react_1.default.createElement(CounterConsumer, { onModelReady: (model) => { providedModel = model; } })));
|
|
48
|
+
expect(providedModel).toBeInstanceOf(CounterModel);
|
|
49
|
+
expect(react_2.screen.getByTestId('count').textContent).toBe('0');
|
|
50
|
+
react_2.fireEvent.click(react_2.screen.getByText('inc'));
|
|
51
|
+
expect(react_2.screen.getByTestId('count').textContent).toBe('1');
|
|
52
|
+
expect(providedModel === null || providedModel === void 0 ? void 0 : providedModel.state.count).toBe(1);
|
|
53
|
+
});
|
|
54
|
+
test('reuses an externally provided model instance', () => {
|
|
55
|
+
const existingModel = new CounterModel({ count: 5 });
|
|
56
|
+
let seenModel;
|
|
57
|
+
(0, react_2.render)(react_1.default.createElement(CounterProvider, { value: existingModel },
|
|
58
|
+
react_1.default.createElement(CounterConsumer, { onModelReady: (model) => { seenModel = model; } })));
|
|
59
|
+
expect(seenModel).toBe(existingModel);
|
|
60
|
+
expect(react_2.screen.getByTestId('count').textContent).toBe('5');
|
|
61
|
+
});
|
|
62
|
+
test('applies incoming state prop and notifies onChange listeners', () => __awaiter(void 0, void 0, void 0, function* () {
|
|
63
|
+
const onChange = jest.fn();
|
|
64
|
+
(0, react_2.render)(react_1.default.createElement(CounterProvider, { state: { count: 2 }, onChange: onChange },
|
|
65
|
+
react_1.default.createElement(CounterConsumer, null)));
|
|
66
|
+
yield (0, react_2.waitFor)(() => expect(react_2.screen.getByTestId('count').textContent).toBe('2'));
|
|
67
|
+
expect(onChange).toHaveBeenCalledTimes(1);
|
|
68
|
+
expect(onChange).toHaveBeenCalledWith({ count: 2 }, { count: 0 });
|
|
69
|
+
}));
|
|
70
|
+
test('create helper returns a fresh model with optional initial state', () => {
|
|
71
|
+
const seededModel = createCounter({ count: 10 });
|
|
72
|
+
const defaultModel = createCounter();
|
|
73
|
+
expect(seededModel).toBeInstanceOf(CounterModel);
|
|
74
|
+
expect(defaultModel).toBeInstanceOf(CounterModel);
|
|
75
|
+
expect(seededModel.state.count).toBe(10);
|
|
76
|
+
expect(defaultModel.state.count).toBe(0);
|
|
77
|
+
expect(seededModel).not.toBe(defaultModel);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=create-model.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-model.test.js","sourceRoot":"","sources":["../src/create-model.test.tsx"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './Model';
|
|
6
|
-
export * from './utils/compose-providers';
|
|
7
|
-
export * from './utils/js-event-types';
|
|
8
|
-
export * from './utils/create-model';
|
|
1
|
+
export * from './ModelWithHooks';
|
|
2
|
+
export * from './ModelBase';
|
|
3
|
+
export * from './create-model';
|
|
4
|
+
export * as ModelTypes from './common-types';
|
|
9
5
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,OAAO,KAAK,UAAU,MAAM,gBAAgB,CAAA"}
|
package/lib/index.js
CHANGED
|
@@ -1,21 +1,34 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
8
12
|
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
9
18
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
19
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
20
|
};
|
|
21
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
22
|
+
if (mod && mod.__esModule) return mod;
|
|
23
|
+
var result = {};
|
|
24
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
25
|
+
__setModuleDefault(result, mod);
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
12
28
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
|
|
14
|
-
__exportStar(require("./
|
|
15
|
-
__exportStar(require("./
|
|
16
|
-
__exportStar(require("./
|
|
17
|
-
|
|
18
|
-
__exportStar(require("./utils/compose-providers"), exports);
|
|
19
|
-
__exportStar(require("./utils/js-event-types"), exports);
|
|
20
|
-
__exportStar(require("./utils/create-model"), exports);
|
|
29
|
+
exports.ModelTypes = void 0;
|
|
30
|
+
__exportStar(require("./ModelWithHooks"), exports);
|
|
31
|
+
__exportStar(require("./ModelBase"), exports);
|
|
32
|
+
__exportStar(require("./create-model"), exports);
|
|
33
|
+
exports.ModelTypes = __importStar(require("./common-types"));
|
|
21
34
|
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mDAAgC;AAChC,8CAA2B;AAC3B,iDAA8B;AAC9B,6DAA4C"}
|